From d27bc1fe014f99303699c2de27d1b8d6a2baf7c9 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Mon, 5 Jun 2023 20:29:54 +0000 Subject: [PATCH 001/145] Added sonic-device-healh as new submodule --- .gitmodules | 3 +++ src/sonic-device-health | 1 + 2 files changed, 4 insertions(+) create mode 160000 src/sonic-device-health diff --git a/.gitmodules b/.gitmodules index 2715540c1f90..6a64b75fc1d4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -115,3 +115,6 @@ [submodule "src/dhcpmon"] path = src/dhcpmon url = https://github.com/sonic-net/sonic-dhcpmon.git +[submodule "src/sonic-device-health"] + path = src/sonic-device-health + url = https://github.com/renukamanavalan/sonic-device-health.git diff --git a/src/sonic-device-health b/src/sonic-device-health new file mode 160000 index 000000000000..c24e2c24e8a9 --- /dev/null +++ b/src/sonic-device-health @@ -0,0 +1 @@ +Subproject commit c24e2c24e8a927c00517e0a6511e2019bb9e893e From 8fdd5270a420b95175a5bc0a61815f4978e6b644 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Tue, 6 Jun 2023 23:08:13 +0000 Subject: [PATCH 002/145] Added dockers files --- dockers/docker-device-health/Dockerfile.j2 | 38 +++++++++++ .../LoMSupervisord.conf.j2 | 68 +++++++++++++++++++ .../docker-device-health/critical_processes | 2 + dockers/docker-device-health/docker_init.sh | 16 +++++ dockers/docker-device-health/start.sh | 12 ++++ 5 files changed, 136 insertions(+) create mode 100644 dockers/docker-device-health/Dockerfile.j2 create mode 100644 dockers/docker-device-health/LoMSupervisord.conf.j2 create mode 100644 dockers/docker-device-health/critical_processes create mode 100755 dockers/docker-device-health/docker_init.sh create mode 100755 dockers/docker-device-health/start.sh diff --git a/dockers/docker-device-health/Dockerfile.j2 b/dockers/docker-device-health/Dockerfile.j2 new file mode 100644 index 000000000000..6ffb1ce8f8c2 --- /dev/null +++ b/dockers/docker-device-health/Dockerfile.j2 @@ -0,0 +1,38 @@ +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +ARG docker_container_name +ARG image_version + +# Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +# Pass the Config location to procs in container +ENV LOM_CONF_LOCATION=/usr/share/lom/ + +# Update apt's cache of available packages +RUN apt-get update + +{% if docker_device_health_debs.strip() -%} +# Copy built Debian packages +{{ copy_files("debs/", docker_device_health_debs.split(' '), "/debs/") }} + +# Install built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_device_health_debs.split(' ')) }} +{%- endif %} + +# Clean up +RUN apt-get clean -y && \ + apt-get autoclean -y && \ + apt-get autoremove -y && \ + rm -rf /debs + +COPY ["docker_init.sh", "start.sh", "/usr/bin/"] +COPY ["lom.supervisord.conf.j2", "/usr/share/sonic/templates/"] +COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] +COPY ["critical_processes", "/etc/supervisor"] + +ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-device-health/LoMSupervisord.conf.j2 b/dockers/docker-device-health/LoMSupervisord.conf.j2 new file mode 100644 index 000000000000..24e30e954765 --- /dev/null +++ b/dockers/docker-device-health/LoMSupervisord.conf.j2 @@ -0,0 +1,68 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[eventlistener:dependent-startup] +command=python3 -m supervisord_dependent_startup +autostart=true +autorestart=unexpected +startretries=0 +exitcodes=0,3 +events=PROCESS_STATE +buffer_size=1024 + +[eventlistener:supervisor-proc-exit-listener] +command=/usr/bin/supervisor-proc-exit-listener --container-name device_health +events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING +autostart=true +autorestart=unexpected +buffer_size=1024 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true + +[program:start] +command=/usr/bin/start.sh +priority=2 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running + + +[program:LoMEngine] +command=/usr/bin/LoMEngine +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + +[group:LoMPluginMgr] +programs={% for key in procs %}{{ key }}{% if not loop.last %},{% endif %}{% endfor %} + +{% for proc in procs %} +[program:LoMPluginMgr-{{ proc }}] +command=/usr/bin/LoMPluginMgr {{ proc }} +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited +{% endfor %} + + diff --git a/dockers/docker-device-health/critical_processes b/dockers/docker-device-health/critical_processes new file mode 100644 index 000000000000..cce0bb4f4a07 --- /dev/null +++ b/dockers/docker-device-health/critical_processes @@ -0,0 +1,2 @@ +program:LoMEngine +group:LoMPluginMgr diff --git a/dockers/docker-device-health/docker_init.sh b/dockers/docker-device-health/docker_init.sh new file mode 100755 index 000000000000..55f397e2bef8 --- /dev/null +++ b/dockers/docker-device-health/docker_init.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +# Generate supervisord config file +mkdir -p /etc/supervisor/conf.d/ + +# Generate supervisord configuration template. +TEMPLATE_FILE="/usr/share/sonic/templates/LoMSupervisord.conf.j2" +PROCS_JSON_FILE="/usr/share/lom/procs.conf.json" +SUPERVISORD_FILE="/etc/supervisor/conf.d/LoMSupervisord.conf" + +j2 -f json -o ${SUPERVISORD_FILE} ${TEMPLATE_FILE} ${PROCS_JSON_FILE} + +# The docker container should start this script as PID 1, so now that supervisord is +# properly configured, we exec /usr/local/bin/supervisord so that it runs as PID 1 for the +# duration of the container's lifetime +exec /usr/local/bin/supervisord diff --git a/dockers/docker-device-health/start.sh b/dockers/docker-device-health/start.sh new file mode 100755 index 000000000000..afe38aeb6fef --- /dev/null +++ b/dockers/docker-device-health/start.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +if [ "${RUNTIME_OWNER}" == "" ]; then + RUNTIME_OWNER="kube" +fi + +CTR_SCRIPT="/usr/share/sonic/scripts/container_startup.py" +if test -f ${CTR_SCRIPT} +then + ${CTR_SCRIPT} -f device_health -o ${RUNTIME_OWNER} -v ${IMAGE_VERSION} +fi + From bb1d0de160251941a055793e99131d0307eaf99f Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Wed, 7 Jun 2023 00:25:46 +0000 Subject: [PATCH 003/145] more integration --- Makefile.work | 2 ++ build_debian.sh | 8 +++++++ rules/config | 3 +++ rules/device-health.dep | 13 ++++++++++++ rules/device-health.mk | 20 +++++++++++++++++ rules/docker-device-health.dep | 11 ++++++++++ rules/docker-device-health.mk | 39 ++++++++++++++++++++++++++++++++++ src/sonic-device-health | 2 +- 8 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 rules/device-health.dep create mode 100644 rules/device-health.mk create mode 100644 rules/docker-device-health.dep create mode 100644 rules/docker-device-health.mk diff --git a/Makefile.work b/Makefile.work index 7c561e545011..e6deee0cd715 100644 --- a/Makefile.work +++ b/Makefile.work @@ -9,6 +9,7 @@ # through http. # * ENABLE_ZTP: Enables zero touch provisioning. # * SHUTDOWN_BGP_ON_START: Sets admin-down state for all bgp peerings after restart. +# * INCLUDE_DEVICE_HEALTH: Allows including device-health feature # * INCLUDE_KUBERNETES: Allows including Kubernetes # * INCLUDE_KUBERNETES_MASTER: Allows including Kubernetes master # * INCLUDE_MUX: Include MUX feature/services for TOR switch. @@ -508,6 +509,7 @@ SONIC_BUILD_INSTRUCTION := $(MAKE) \ ENABLE_ZTP=$(ENABLE_ZTP) \ INCLUDE_PDE=$(INCLUDE_PDE) \ SHUTDOWN_BGP_ON_START=$(SHUTDOWN_BGP_ON_START) \ + INCLUDE_DEVICE_HEALTH=$(INCLUDE_DEVICE_HEALTH) \ INCLUDE_KUBERNETES=$(INCLUDE_KUBERNETES) \ KUBERNETES_VERSION=$(KUBERNETES_VERSION) \ KUBERNETES_CNI_VERSION=$(KUBERNETES_CNI_VERSION) \ diff --git a/build_debian.sh b/build_debian.sh index 9462e4a54fba..61ac9a0d8f28 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -289,6 +289,14 @@ else echo '[INFO] Skipping Install kubernetes' fi +if [ "$INCLUDE_DEVICE_HEALTH" == "y" ] +then + sudo mkdir -p $FILESYSTEM_ROOT/usr/share/device_health/ +else + echo '[INFO] Skipping Install of device-health' +fi + + if [ "$INCLUDE_KUBERNETES_MASTER" == "y" ] then ## Install Kubernetes master diff --git a/rules/config b/rules/config index 8f3354eb2d2a..58b2de077921 100644 --- a/rules/config +++ b/rules/config @@ -176,6 +176,9 @@ INCLUDE_TEAMD ?= y # INCLUDE_ROUTER_ADVERTISER - build docker-router-advertiser for router advertisements support INCLUDE_ROUTER_ADVERTISER ?= y +# INCLUDE_DEVICE_HEALTH - if set to y installs Device health +INCLUDE_DEVICE_HEALTH ?= y + # INCLUDE_KUBERNETES - if set to y kubernetes packages are installed to be able to # run as worker node in kubernetes cluster. INCLUDE_KUBERNETES ?= n diff --git a/rules/device-health.dep b/rules/device-health.dep new file mode 100644 index 000000000000..8c5f6144d075 --- /dev/null +++ b/rules/device-health.dep @@ -0,0 +1,13 @@ +#DPKG FRK +SPATH := $($(SONIC_DEVICE_HEALTH)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/device-health.mk rules/device-health.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) + + +$(SONIC_DEVICE_HEALTH)_CACHE_MODE := GIT_CONTENT_SHA +$(SONIC_DEVICE_HEALTH)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(SONIC_DEVICE_HEALTH)_DEP_FILES := $(DEP_FILES) +$(SONIC_DEVICE_HEALTH)_SMDEP_FILES := $(SMDEP_FILES) +$(SONIC_DEVICE_HEALTH)_SMDEP_PATHS := $(SPATH) + diff --git a/rules/device-health.mk b/rules/device-health.mk new file mode 100644 index 000000000000..eeaf053f02f6 --- /dev/null +++ b/rules/device-health.mk @@ -0,0 +1,20 @@ +# SONiC device-health package + +SONIC_DEVICE_HEALTH_VERSION = 1.0.0-0 +SONIC_DEVICE_HEALTH_PKG_NAME = device_health + +SONIC_DEVICE_HEALTH = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb +$(SONIC_DEVICE_HEALTH)_SRC_PATH = $(SRC_PATH)/sonic-device-health +$(SONIC_DEVICE_HEALTH)_DEPENDS = $(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON) +$(SONIC_DEVICE_HEALTH)_RDEPENDS = $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DEV) + +SONIC_DEVICE_HEALTH_DBG = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)-dbgsym_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(SONIC_DEVICE_HEALTH),$(SONIC_DEVICE_HEALTH_DBG))) + +SONIC_DPKG_DEBS += $(SONIC_DEVICE_HEALTH) + +# The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} +# are archived into debug one image to facilitate debugging. +# +DBG_SRC_ARCHIVE += sonic-device-health + diff --git a/rules/docker-device-health.dep b/rules/docker-device-health.dep new file mode 100644 index 000000000000..0880f3410e1c --- /dev/null +++ b/rules/docker-device-health.dep @@ -0,0 +1,11 @@ + +DPATH := $($(DOCKER_DEVICE_HEALTH)_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/docker-device-health.mk rules/docker-device-health.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(DPATH)) + +$(DOCKER_DEVICE_HEALTH)_CACHE_MODE := GIT_CONTENT_SHA +$(DOCKER_DEVICE_HEALTH)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_DEVICE_HEALTH)_DEP_FILES := $(DEP_FILES) + +$(eval $(call add_dbg_docker,$(DOCKER_DEVICE_HEALTH),$(DOCKER_DEVICE_HEALTH_DBG))) diff --git a/rules/docker-device-health.mk b/rules/docker-device-health.mk new file mode 100644 index 000000000000..4ebbfd0ac73d --- /dev/null +++ b/rules/docker-device-health.mk @@ -0,0 +1,39 @@ +# docker image for device-health agent + +DOCKER_DEVICE_HEALTH_STEM = docker-sonic-device-health +DOCKER_DEVICE_HEALTH = $(DOCKER_DEVICE_HEALTH_STEM).gz +DOCKER_DEVICE_HEALTH_DBG = $(DOCKER_DEVICE_HEALTH_STEM)-$(DBG_IMAGE_MARK).gz + +$(DOCKER_DEVICE_HEALTH)_PATH = $(DOCKERS_PATH)/$(DOCKER_DEVICE_HEALTH_STEM) + +$(DOCKER_DEVICE_HEALTH)_DEPENDS += $(SONIC_MGMT_COMMON) +$(DOCKER_DEVICE_HEALTH)_DEPENDS += $(SONIC_DEVICE_HEALTH) +$(DOCKER_DEVICE_HEALTH)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) + +$(DOCKER_DEVICE_HEALTH)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) + +$(DOCKER_DEVICE_HEALTH)_VERSION = 1.0.0 +$(DOCKER_DEVICE_HEALTH)_PACKAGE_NAME = device-health + +$(DOCKER_DEVICE_HEALTH)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) + +SONIC_DOCKER_IMAGES += $(DOCKER_DEVICE_HEALTH) +ifeq ($(INCLUDE_SYSTEM_DEVICE_HEALTH), y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DEVICE_HEALTH) +endif + +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) +ifeq ($(INCLUDE_SYSTEM_DEVICE_HEALTH), y) +SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) +endif + +$(DOCKER_DEVICE_HEALTH)_CONTAINER_NAME = device-health +$(DOCKER_DEVICE_HEALTH)_RUN_OPT += --privileged -t +$(DOCKER_DEVICE_HEALTH)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_DEVICE_HEALTH)_RUN_OPT += -v /usr/share/sonic/scripts:/usr/share/sonic/scripts:ro +$(DOCKER_DEVICE_HEALTH)_RUN_OPT += -v /usr/share/device_health:/usr/share/device_health:rw +$(DOCKER_DEVICE_HEALTH)_RUN_OPT += -v /var/run/dbus:/var/run/dbus:rw + +SONIC_BULLSEYE_DOCKERS += $(DOCKER_DEVICE_HEALTH) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_DEVICE_HEALTH_DBG) +$(DOCKER_DEVICE_HEALTH)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) diff --git a/src/sonic-device-health b/src/sonic-device-health index c24e2c24e8a9..faa1f4265d5e 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit c24e2c24e8a927c00517e0a6511e2019bb9e893e +Subproject commit faa1f4265d5e998d0ecbb7248d26816b5c93a401 From e0cb84ba2bafc1861b8c2ea0877b715ce4d73033 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Wed, 7 Jun 2023 03:42:20 +0000 Subject: [PATCH 004/145] more integrate --- files/build_templates/device_health.service.j2 | 17 +++++++++++++++++ files/build_templates/init_cfg.json.j2 | 1 + files/build_templates/rsyslog_plugin.conf.j2 | 3 +++ slave.mk | 6 ++++++ 4 files changed, 27 insertions(+) create mode 100644 files/build_templates/device_health.service.j2 diff --git a/files/build_templates/device_health.service.j2 b/files/build_templates/device_health.service.j2 new file mode 100644 index 000000000000..4ff6ca34b392 --- /dev/null +++ b/files/build_templates/device_health.service.j2 @@ -0,0 +1,17 @@ +[Unit] +Description=Device-health container +Requires=eventd.service +After=eventd.service +BindsTo=sonic.target +After=sonic.target +StartLimitIntervalSec=1200 +StartLimitBurst=3 + +[Service] +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh wait +ExecStop=/usr/bin/{{docker_container_name}}.sh stop +RestartSec=30 + +[Install] +WantedBy=sonic.target diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index d7a898dd4497..e3333701e98c 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -54,6 +54,7 @@ {%- if include_sflow == "y" %}{% do features.append(("sflow", "disabled", false, "enabled")) %}{% endif %} {%- if include_macsec == "y" %}{% do features.append(("macsec", "{% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'SpineRouter' and DEVICE_RUNTIME_METADATA['MACSEC_SUPPORTED'] %}enabled{% else %}disabled{% endif %}", false, "enabled")) %}{% endif %} {%- if include_system_telemetry == "y" %}{% do features.append(("telemetry", "enabled", true, "enabled")) %}{% endif %} +{%- if include_device_health == "y" %}{% do features.append(("device-health", "enabled", true, "enabled")) %}{% endif %} "FEATURE": { {# delayed field if set, will start the feature systemd .timer unit instead of .service unit #} {%- for feature, state, delayed, autorestart in features %} diff --git a/files/build_templates/rsyslog_plugin.conf.j2 b/files/build_templates/rsyslog_plugin.conf.j2 index fdf661fc2d65..aae77fb478a5 100644 --- a/files/build_templates/rsyslog_plugin.conf.j2 +++ b/files/build_templates/rsyslog_plugin.conf.j2 @@ -17,3 +17,6 @@ if re_match($programname, "{{ proc.name }}") then { template="prog_msg") } {% endfor %} + + +$IncludeConfig /usr/share/device_health/*.conf diff --git a/slave.mk b/slave.mk index a592bc5b43a8..913d5e71ecbd 100644 --- a/slave.mk +++ b/slave.mk @@ -157,6 +157,10 @@ ifeq ($(SONIC_INCLUDE_SYSTEM_TELEMETRY),y) INCLUDE_SYSTEM_TELEMETRY = y endif +ifeq ($(INCLUDE_DEVICE_HEALTH),y) +INCLUDE_DEVICE_HEALTH = y +endif + ifeq ($(SONIC_INCLUDE_RESTAPI),y) INCLUDE_RESTAPI = y endif @@ -413,6 +417,7 @@ $(info "VS_PREPARE_MEM" : "$(VS_PREPARE_MEM)") $(info "INCLUDE_MGMT_FRAMEWORK" : "$(INCLUDE_MGMT_FRAMEWORK)") $(info "INCLUDE_ICCPD" : "$(INCLUDE_ICCPD)") $(info "INCLUDE_SYSTEM_TELEMETRY" : "$(INCLUDE_SYSTEM_TELEMETRY)") +$(info "INCLUDE_DEVICE_HEALTH" : "$(INCLUDE_DEVICE_HEALTH)") $(info "ENABLE_HOST_SERVICE_ON_START" : "$(ENABLE_HOST_SERVICE_ON_START)") $(info "INCLUDE_RESTAPI" : "$(INCLUDE_RESTAPI)") $(info "INCLUDE_SFLOW" : "$(INCLUDE_SFLOW)") @@ -1287,6 +1292,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export sonic_su_mode="$(SECURE_UPGRADE_MODE)" export sonic_su_prod_signing_tool="/sonic/scripts/$(shell basename -- $(SECURE_UPGRADE_PROD_SIGNING_TOOL))" export include_system_telemetry="$(INCLUDE_SYSTEM_TELEMETRY)" + export include_device_health="$(INCLUDE_DEVICE_HEALTH)" export include_restapi="$(INCLUDE_RESTAPI)" export include_nat="$(INCLUDE_NAT)" export include_p4rt="$(INCLUDE_P4RT)" From 445add902db1eba364e0e76f7f66965ae3ced8f0 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Fri, 9 Jun 2023 22:48:32 +0000 Subject: [PATCH 005/145] adapting to v1.15.5 of golang --- .../Dockerfile.j2 | 0 .../LoMSupervisord.conf.j2 | 0 .../critical_processes | 0 .../docker_init.sh | 0 .../start.sh | 0 rules/device-health.dep | 4 +--- rules/docker-device-health.mk | 2 +- src/sonic-device-health | 2 +- 8 files changed, 3 insertions(+), 5 deletions(-) rename dockers/{docker-device-health => docker-sonic-device-health}/Dockerfile.j2 (100%) rename dockers/{docker-device-health => docker-sonic-device-health}/LoMSupervisord.conf.j2 (100%) rename dockers/{docker-device-health => docker-sonic-device-health}/critical_processes (100%) rename dockers/{docker-device-health => docker-sonic-device-health}/docker_init.sh (100%) rename dockers/{docker-device-health => docker-sonic-device-health}/start.sh (100%) diff --git a/dockers/docker-device-health/Dockerfile.j2 b/dockers/docker-sonic-device-health/Dockerfile.j2 similarity index 100% rename from dockers/docker-device-health/Dockerfile.j2 rename to dockers/docker-sonic-device-health/Dockerfile.j2 diff --git a/dockers/docker-device-health/LoMSupervisord.conf.j2 b/dockers/docker-sonic-device-health/LoMSupervisord.conf.j2 similarity index 100% rename from dockers/docker-device-health/LoMSupervisord.conf.j2 rename to dockers/docker-sonic-device-health/LoMSupervisord.conf.j2 diff --git a/dockers/docker-device-health/critical_processes b/dockers/docker-sonic-device-health/critical_processes similarity index 100% rename from dockers/docker-device-health/critical_processes rename to dockers/docker-sonic-device-health/critical_processes diff --git a/dockers/docker-device-health/docker_init.sh b/dockers/docker-sonic-device-health/docker_init.sh similarity index 100% rename from dockers/docker-device-health/docker_init.sh rename to dockers/docker-sonic-device-health/docker_init.sh diff --git a/dockers/docker-device-health/start.sh b/dockers/docker-sonic-device-health/start.sh similarity index 100% rename from dockers/docker-device-health/start.sh rename to dockers/docker-sonic-device-health/start.sh diff --git a/rules/device-health.dep b/rules/device-health.dep index 8c5f6144d075..dc3bf0036d85 100644 --- a/rules/device-health.dep +++ b/rules/device-health.dep @@ -2,12 +2,10 @@ SPATH := $($(SONIC_DEVICE_HEALTH)_SRC_PATH) DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/device-health.mk rules/device-health.dep DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) -SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) +DEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) $(SONIC_DEVICE_HEALTH)_CACHE_MODE := GIT_CONTENT_SHA $(SONIC_DEVICE_HEALTH)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(SONIC_DEVICE_HEALTH)_DEP_FILES := $(DEP_FILES) -$(SONIC_DEVICE_HEALTH)_SMDEP_FILES := $(SMDEP_FILES) -$(SONIC_DEVICE_HEALTH)_SMDEP_PATHS := $(SPATH) diff --git a/rules/docker-device-health.mk b/rules/docker-device-health.mk index 4ebbfd0ac73d..67cc6931c0fc 100644 --- a/rules/docker-device-health.mk +++ b/rules/docker-device-health.mk @@ -1,6 +1,6 @@ # docker image for device-health agent -DOCKER_DEVICE_HEALTH_STEM = docker-sonic-device-health +DOCKER_DEVICE_HEALTH_STEM = docker-device-health DOCKER_DEVICE_HEALTH = $(DOCKER_DEVICE_HEALTH_STEM).gz DOCKER_DEVICE_HEALTH_DBG = $(DOCKER_DEVICE_HEALTH_STEM)-$(DBG_IMAGE_MARK).gz diff --git a/src/sonic-device-health b/src/sonic-device-health index faa1f4265d5e..751a749f5218 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit faa1f4265d5e998d0ecbb7248d26816b5c93a401 +Subproject commit 751a749f5218b4e349698c336a248b610fc967da From 63a904d21d6ce4aa543dea3dd3306f7b572a0e25 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Sun, 11 Jun 2023 17:50:53 +0000 Subject: [PATCH 006/145] some --- rules/device-health.mk | 1 - rules/docker-device-health.mk | 20 ++++++++++++-------- slave.mk | 1 + src/sonic-device-health | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/rules/device-health.mk b/rules/device-health.mk index eeaf053f02f6..94d49470b3df 100644 --- a/rules/device-health.mk +++ b/rules/device-health.mk @@ -6,7 +6,6 @@ SONIC_DEVICE_HEALTH_PKG_NAME = device_health SONIC_DEVICE_HEALTH = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb $(SONIC_DEVICE_HEALTH)_SRC_PATH = $(SRC_PATH)/sonic-device-health $(SONIC_DEVICE_HEALTH)_DEPENDS = $(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON) -$(SONIC_DEVICE_HEALTH)_RDEPENDS = $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DEV) SONIC_DEVICE_HEALTH_DBG = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)-dbgsym_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SONIC_DEVICE_HEALTH),$(SONIC_DEVICE_HEALTH_DBG))) diff --git a/rules/docker-device-health.mk b/rules/docker-device-health.mk index 67cc6931c0fc..6ba676a870f2 100644 --- a/rules/docker-device-health.mk +++ b/rules/docker-device-health.mk @@ -4,26 +4,30 @@ DOCKER_DEVICE_HEALTH_STEM = docker-device-health DOCKER_DEVICE_HEALTH = $(DOCKER_DEVICE_HEALTH_STEM).gz DOCKER_DEVICE_HEALTH_DBG = $(DOCKER_DEVICE_HEALTH_STEM)-$(DBG_IMAGE_MARK).gz -$(DOCKER_DEVICE_HEALTH)_PATH = $(DOCKERS_PATH)/$(DOCKER_DEVICE_HEALTH_STEM) - -$(DOCKER_DEVICE_HEALTH)_DEPENDS += $(SONIC_MGMT_COMMON) $(DOCKER_DEVICE_HEALTH)_DEPENDS += $(SONIC_DEVICE_HEALTH) + $(DOCKER_DEVICE_HEALTH)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) +$(DOCKER_DEVICE_HEALTH)_DBG_DEPENDS += $(SONIC_DEVICE_HEALTH_DBG) $(LIBSWSSCOMMON_DBG) + +$(DOCKER_DEVICE_HEALTH)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) $(DOCKER_DEVICE_HEALTH)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) +$(DOCKER_DEVICE_HEALTH)_PATH = $(DOCKERS_PATH)/$(DOCKER_DEVICE_HEALTH_STEM) + +$(DOCKER_DEVICE_HEALTH)_INSTALL_PYTHON_WHEELS = $(SONIC_UTILITIES_PY3) +$(DOCKER_DEVICE_HEALTH)_INSTALL_DEBS = $(PYTHON3_SWSSCOMMON) + $(DOCKER_DEVICE_HEALTH)_VERSION = 1.0.0 $(DOCKER_DEVICE_HEALTH)_PACKAGE_NAME = device-health -$(DOCKER_DEVICE_HEALTH)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) - SONIC_DOCKER_IMAGES += $(DOCKER_DEVICE_HEALTH) -ifeq ($(INCLUDE_SYSTEM_DEVICE_HEALTH), y) +ifeq ($(INCLUDE_DEVICE_HEALTH), y) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DEVICE_HEALTH) endif SONIC_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) -ifeq ($(INCLUDE_SYSTEM_DEVICE_HEALTH), y) +ifeq ($(INCLUDE_DEVICE_HEALTH), y) SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) endif @@ -36,4 +40,4 @@ $(DOCKER_DEVICE_HEALTH)_RUN_OPT += -v /var/run/dbus:/var/run/dbus:rw SONIC_BULLSEYE_DOCKERS += $(DOCKER_DEVICE_HEALTH) SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_DEVICE_HEALTH_DBG) -$(DOCKER_DEVICE_HEALTH)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) +$(DOCKER_DEVICE_HEALTH)_FILES = $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) diff --git a/slave.mk b/slave.mk index 913d5e71ecbd..2d73c2c25948 100644 --- a/slave.mk +++ b/slave.mk @@ -1357,6 +1357,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(eval $(docker:-dbg.gz=.gz)_RUN_OPT += $($(docker:-dbg.gz=.gz)_$($*_IMAGE_TYPE)_RUN_OPT)) export docker_image_run_opt="$($(docker:-dbg.gz=.gz)_RUN_OPT)" + $(info "XXX docker yyy" : "$(docker)") if [ -f files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 ]; then j2 files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service diff --git a/src/sonic-device-health b/src/sonic-device-health index 751a749f5218..2048d82a8607 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit 751a749f5218b4e349698c336a248b610fc967da +Subproject commit 2048d82a8607d0d26d572c3fa2d7069c85938127 From e8ce1f6342da17b4f26b2b6954012328123662cd Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Wed, 14 Jun 2023 23:29:16 +0000 Subject: [PATCH 007/145] Built target/debs/bullseye/sonic-device-health_1.0.0-0_amd64.deb --- rules/device-health.mk | 8 ++++---- sonic-slave-bullseye/Dockerfile.j2 | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/rules/device-health.mk b/rules/device-health.mk index 94d49470b3df..e3bf9158083b 100644 --- a/rules/device-health.mk +++ b/rules/device-health.mk @@ -1,17 +1,17 @@ # SONiC device-health package SONIC_DEVICE_HEALTH_VERSION = 1.0.0-0 -SONIC_DEVICE_HEALTH_PKG_NAME = device_health +SONIC_DEVICE_HEALTH_PKG_NAME = device-health SONIC_DEVICE_HEALTH = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb $(SONIC_DEVICE_HEALTH)_SRC_PATH = $(SRC_PATH)/sonic-device-health $(SONIC_DEVICE_HEALTH)_DEPENDS = $(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON) -SONIC_DEVICE_HEALTH_DBG = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)-dbgsym_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb -$(eval $(call add_derived_package,$(SONIC_DEVICE_HEALTH),$(SONIC_DEVICE_HEALTH_DBG))) - SONIC_DPKG_DEBS += $(SONIC_DEVICE_HEALTH) +# SONIC_DEVICE_HEALTH_DBG = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)-dbgsym_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb +# $(eval $(call add_derived_package,$(SONIC_DEVICE_HEALTH),$(SONIC_DEVICE_HEALTH_DBG))) + # The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} # are archived into debug one image to facilitate debugging. # diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 89b1240bb1b4..bff8930a94f9 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -114,6 +114,7 @@ RUN apt-get update && apt-get install -y \ libzmq5 \ libzmq3-dev \ uuid-dev \ + uuid-runtime \ jq \ cron \ # For quagga build @@ -472,6 +473,11 @@ RUN wget -O golang-go.deb 'https://sonicstorage.blob.core.windows.net/public/fip && rm golang-go.deb golang-src.deb {%- endif %} +RUN wget -O golang-go.tar.gz https://go.dev/dl/go1.20.3.linux-amd64.tar.gz +RUN mkdir -p /usr/local/go1.20.3 +RUN tar -C /usr/local/go1.20.3 -xzf golang-go.tar.gz +RUN rm -f golang-go.tar.gz + RUN pip3 install --upgrade pip RUN apt-get purge -y python3-pip python3-yaml From ac877f5aa3a7777444b28c4910d5b8b3a928a744 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Fri, 16 Jun 2023 22:02:12 +0000 Subject: [PATCH 008/145] more ... --- .../Dockerfile.j2 | 0 .../critical_processes | 0 .../docker_init.sh | 0 .../lom.supervisord.conf.j2} | 0 .../start.sh | 0 rules/device-health.mk | 3 --- scripts/dbg_files.sh | 2 +- 7 files changed, 1 insertion(+), 4 deletions(-) rename dockers/{docker-sonic-device-health => docker-device-health}/Dockerfile.j2 (100%) rename dockers/{docker-sonic-device-health => docker-device-health}/critical_processes (100%) rename dockers/{docker-sonic-device-health => docker-device-health}/docker_init.sh (100%) rename dockers/{docker-sonic-device-health/LoMSupervisord.conf.j2 => docker-device-health/lom.supervisord.conf.j2} (100%) rename dockers/{docker-sonic-device-health => docker-device-health}/start.sh (100%) diff --git a/dockers/docker-sonic-device-health/Dockerfile.j2 b/dockers/docker-device-health/Dockerfile.j2 similarity index 100% rename from dockers/docker-sonic-device-health/Dockerfile.j2 rename to dockers/docker-device-health/Dockerfile.j2 diff --git a/dockers/docker-sonic-device-health/critical_processes b/dockers/docker-device-health/critical_processes similarity index 100% rename from dockers/docker-sonic-device-health/critical_processes rename to dockers/docker-device-health/critical_processes diff --git a/dockers/docker-sonic-device-health/docker_init.sh b/dockers/docker-device-health/docker_init.sh similarity index 100% rename from dockers/docker-sonic-device-health/docker_init.sh rename to dockers/docker-device-health/docker_init.sh diff --git a/dockers/docker-sonic-device-health/LoMSupervisord.conf.j2 b/dockers/docker-device-health/lom.supervisord.conf.j2 similarity index 100% rename from dockers/docker-sonic-device-health/LoMSupervisord.conf.j2 rename to dockers/docker-device-health/lom.supervisord.conf.j2 diff --git a/dockers/docker-sonic-device-health/start.sh b/dockers/docker-device-health/start.sh similarity index 100% rename from dockers/docker-sonic-device-health/start.sh rename to dockers/docker-device-health/start.sh diff --git a/rules/device-health.mk b/rules/device-health.mk index e3bf9158083b..b918478ed65e 100644 --- a/rules/device-health.mk +++ b/rules/device-health.mk @@ -9,9 +9,6 @@ $(SONIC_DEVICE_HEALTH)_DEPENDS = $(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON) SONIC_DPKG_DEBS += $(SONIC_DEVICE_HEALTH) -# SONIC_DEVICE_HEALTH_DBG = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)-dbgsym_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb -# $(eval $(call add_derived_package,$(SONIC_DEVICE_HEALTH),$(SONIC_DEVICE_HEALTH_DBG))) - # The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} # are archived into debug one image to facilitate debugging. # diff --git a/scripts/dbg_files.sh b/scripts/dbg_files.sh index 6624fca83f34..bf6426866f27 100755 --- a/scripts/dbg_files.sh +++ b/scripts/dbg_files.sh @@ -6,7 +6,7 @@ if [ "$DEBUG_IMG" == "y" ] then for i in $DEBUG_SRC_ARCHIVE_DIRS do - find src/$i/ -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" -type f + find src/$i/ -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" -o -name "*.go" -o -name "*.json" -type f done | tar -czf $DEBUG_SRC_ARCHIVE_FILE -T - fi From 62ee92d6b1bb332098f12d50e82684c7e36923fb Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Fri, 16 Jun 2023 22:05:19 +0000 Subject: [PATCH 009/145] submod update --- src/sonic-device-health | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-device-health b/src/sonic-device-health index 2048d82a8607..12b630c94797 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit 2048d82a8607d0d26d572c3fa2d7069c85938127 +Subproject commit 12b630c94797cfda8fe100507862ab6cfcc828f6 From 41dd5fceb838be81a2e019b683c06aef9bfc9add Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Sun, 18 Jun 2023 00:33:40 +0000 Subject: [PATCH 010/145] misc --- dockers/docker-device-health/docker_init.sh | 2 +- files/build_templates/init_cfg.json.j2 | 2 +- files/build_templates/sonic_debian_extension.j2 | 4 ++++ slave.mk | 1 - 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dockers/docker-device-health/docker_init.sh b/dockers/docker-device-health/docker_init.sh index 55f397e2bef8..afe585050308 100755 --- a/dockers/docker-device-health/docker_init.sh +++ b/dockers/docker-device-health/docker_init.sh @@ -4,7 +4,7 @@ mkdir -p /etc/supervisor/conf.d/ # Generate supervisord configuration template. -TEMPLATE_FILE="/usr/share/sonic/templates/LoMSupervisord.conf.j2" +TEMPLATE_FILE="/usr/share/sonic/templates/lom.supervisord.conf.j2" PROCS_JSON_FILE="/usr/share/lom/procs.conf.json" SUPERVISORD_FILE="/etc/supervisor/conf.d/LoMSupervisord.conf" diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index e3333701e98c..230db9f69050 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -76,7 +76,7 @@ "check_up_status" : "false", {%- endif %} {%- if include_kubernetes == "y" %} -{%- if feature in ["lldp", "pmon", "radv", "eventd", "snmp", "telemetry"] %} +{%- if feature in ["lldp", "pmon", "radv", "eventd", "snmp", "telemetry", "device-health"] %} "set_owner": "kube", {% else %} "set_owner": "local", {% endif %} {% endif %} "high_mem_alert": "disabled" diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 0dc60b2b605f..89600dd45651 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -952,3 +952,7 @@ sudo rm -rf $FILESYSTEM_ROOT/tmp/mask_disabled_services.py sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install python3-dbus + +{% if include_device_health == 'y' %} +sudo mkdir -p /usr/share/device_health +{%- endif %} diff --git a/slave.mk b/slave.mk index 2d73c2c25948..913d5e71ecbd 100644 --- a/slave.mk +++ b/slave.mk @@ -1357,7 +1357,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(eval $(docker:-dbg.gz=.gz)_RUN_OPT += $($(docker:-dbg.gz=.gz)_$($*_IMAGE_TYPE)_RUN_OPT)) export docker_image_run_opt="$($(docker:-dbg.gz=.gz)_RUN_OPT)" - $(info "XXX docker yyy" : "$(docker)") if [ -f files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 ]; then j2 files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service From 38c78f70e24ddd5b03d8725ae4008648fa88ac0b Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Tue, 20 Jun 2023 00:17:40 +0000 Subject: [PATCH 011/145] Integration is good --- dockers/docker-device-health/critical_processes | 1 - dockers/docker-device-health/lom.supervisord.conf.j2 | 5 +---- .../{device_health.service.j2 => device-health.service.j2} | 0 src/sonic-device-health | 2 +- 4 files changed, 2 insertions(+), 6 deletions(-) rename files/build_templates/{device_health.service.j2 => device-health.service.j2} (100%) diff --git a/dockers/docker-device-health/critical_processes b/dockers/docker-device-health/critical_processes index cce0bb4f4a07..dd8bbe85eef2 100644 --- a/dockers/docker-device-health/critical_processes +++ b/dockers/docker-device-health/critical_processes @@ -1,2 +1 @@ program:LoMEngine -group:LoMPluginMgr diff --git a/dockers/docker-device-health/lom.supervisord.conf.j2 b/dockers/docker-device-health/lom.supervisord.conf.j2 index 24e30e954765..89a24918f73f 100644 --- a/dockers/docker-device-health/lom.supervisord.conf.j2 +++ b/dockers/docker-device-health/lom.supervisord.conf.j2 @@ -50,9 +50,6 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=start:exited -[group:LoMPluginMgr] -programs={% for key in procs %}{{ key }}{% if not loop.last %},{% endif %}{% endfor %} - {% for proc in procs %} [program:LoMPluginMgr-{{ proc }}] command=/usr/bin/LoMPluginMgr {{ proc }} @@ -62,7 +59,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog dependent_startup=true -dependent_startup_wait_for=start:exited +dependent_startup_wait_for=LoMEngine:running {% endfor %} diff --git a/files/build_templates/device_health.service.j2 b/files/build_templates/device-health.service.j2 similarity index 100% rename from files/build_templates/device_health.service.j2 rename to files/build_templates/device-health.service.j2 diff --git a/src/sonic-device-health b/src/sonic-device-health index 12b630c94797..4394f186df6a 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit 12b630c94797cfda8fe100507862ab6cfcc828f6 +Subproject commit 4394f186df6a2755f27ec9c634b00294d502b99e From 9334725d9831a55f02b672a4fb3d8fe1fa505029 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Thu, 22 Jun 2023 20:51:19 +0000 Subject: [PATCH 012/145] minor updates --- dockers/docker-device-health/Dockerfile.j2 | 6 ++++++ dockers/docker-device-health/lom.supervisord.conf.j2 | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dockers/docker-device-health/Dockerfile.j2 b/dockers/docker-device-health/Dockerfile.j2 index 6ffb1ce8f8c2..0d0410ef0213 100644 --- a/dockers/docker-device-health/Dockerfile.j2 +++ b/dockers/docker-device-health/Dockerfile.j2 @@ -13,6 +13,12 @@ ENV IMAGE_VERSION=$image_version # Pass the Config location to procs in container ENV LOM_CONF_LOCATION=/usr/share/lom/ +# Set the binaries to run in Prod mode +ENV LOM_RUN_MODE=PROD + +# Enable core dump +ENV GOTRACEBACK=crash + # Update apt's cache of available packages RUN apt-get update diff --git a/dockers/docker-device-health/lom.supervisord.conf.j2 b/dockers/docker-device-health/lom.supervisord.conf.j2 index 89a24918f73f..897dca942f89 100644 --- a/dockers/docker-device-health/lom.supervisord.conf.j2 +++ b/dockers/docker-device-health/lom.supervisord.conf.j2 @@ -52,7 +52,7 @@ dependent_startup_wait_for=start:exited {% for proc in procs %} [program:LoMPluginMgr-{{ proc }}] -command=/usr/bin/LoMPluginMgr {{ proc }} +command=/usr/bin/LoMPluginMgr -proc_id={{ proc }} priority=3 autostart=false autorestart=false From ae3d2c84b5826fb4c623f2cfb41751c0202a2192 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Fri, 23 Jun 2023 03:25:14 +0000 Subject: [PATCH 013/145] Updated submod to remanava fork's LoM-Prod branch --- src/sonic-device-health | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-device-health b/src/sonic-device-health index 4394f186df6a..73b5fcaea38f 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit 4394f186df6a2755f27ec9c634b00294d502b99e +Subproject commit 73b5fcaea38fbfbbed8f8e5cacf47d4597008ab4 From c18bbe2ac5e6f19caf7d0cfbf95847244e1fbf39 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Mon, 26 Jun 2023 19:25:25 +0000 Subject: [PATCH 014/145] install uuid runtime --- dockers/docker-device-health/Dockerfile.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-device-health/Dockerfile.j2 b/dockers/docker-device-health/Dockerfile.j2 index 0d0410ef0213..d6372fc3691b 100644 --- a/dockers/docker-device-health/Dockerfile.j2 +++ b/dockers/docker-device-health/Dockerfile.j2 @@ -22,6 +22,8 @@ ENV GOTRACEBACK=crash # Update apt's cache of available packages RUN apt-get update +RUN apt-get -y install uuid-runtime + {% if docker_device_health_debs.strip() -%} # Copy built Debian packages {{ copy_files("debs/", docker_device_health_debs.split(' '), "/debs/") }} From 5b1941f5a295966a3bca63616b03c6024306697f Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Fri, 30 Jun 2023 16:13:42 +0000 Subject: [PATCH 015/145] submod update --- src/sonic-device-health | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-device-health b/src/sonic-device-health index 73b5fcaea38f..222fd8ebd670 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit 73b5fcaea38fbfbbed8f8e5cacf47d4597008ab4 +Subproject commit 222fd8ebd6707e8cf0d9296fbcbc43590c8f0176 From 6f9c632250d3375724b5c71c47e0be2a67f1650d Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Fri, 30 Jun 2023 20:23:37 +0000 Subject: [PATCH 016/145] Added debug docker --- rules/device-health.mk | 3 +++ rules/docker-device-health.mk | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rules/device-health.mk b/rules/device-health.mk index b918478ed65e..d7ba78f61dff 100644 --- a/rules/device-health.mk +++ b/rules/device-health.mk @@ -9,6 +9,9 @@ $(SONIC_DEVICE_HEALTH)_DEPENDS = $(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON) SONIC_DPKG_DEBS += $(SONIC_DEVICE_HEALTH) +SONIC_DEVICE_HEALTH_DBG = sonic-$(SONIC_DEVICE_HEALTH_PKG_NAME)-dbgsym_$(SONIC_DEVICE_HEALTH_VERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(SONIC_DEVICE_HEALTH),$(SONIC_DEVICE_HEALTH_DBG))) + # The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} # are archived into debug one image to facilitate debugging. # diff --git a/rules/docker-device-health.mk b/rules/docker-device-health.mk index 6ba676a870f2..ba22784731eb 100644 --- a/rules/docker-device-health.mk +++ b/rules/docker-device-health.mk @@ -28,7 +28,7 @@ endif SONIC_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) ifeq ($(INCLUDE_DEVICE_HEALTH), y) -SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) + SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) endif $(DOCKER_DEVICE_HEALTH)_CONTAINER_NAME = device-health @@ -40,4 +40,3 @@ $(DOCKER_DEVICE_HEALTH)_RUN_OPT += -v /var/run/dbus:/var/run/dbus:rw SONIC_BULLSEYE_DOCKERS += $(DOCKER_DEVICE_HEALTH) SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_DEVICE_HEALTH_DBG) -$(DOCKER_DEVICE_HEALTH)_FILES = $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) From fcf6b6b4eee48b99008d5c0915d3a6a32c5b7e4b Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Fri, 30 Jun 2023 20:27:08 +0000 Subject: [PATCH 017/145] Added space --- rules/docker-device-health.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/docker-device-health.mk b/rules/docker-device-health.mk index ba22784731eb..f45a79e029a4 100644 --- a/rules/docker-device-health.mk +++ b/rules/docker-device-health.mk @@ -23,7 +23,7 @@ $(DOCKER_DEVICE_HEALTH)_PACKAGE_NAME = device-health SONIC_DOCKER_IMAGES += $(DOCKER_DEVICE_HEALTH) ifeq ($(INCLUDE_DEVICE_HEALTH), y) -SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DEVICE_HEALTH) + SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DEVICE_HEALTH) endif SONIC_DOCKER_DBG_IMAGES += $(DOCKER_DEVICE_HEALTH_DBG) From a24845997d5cf299c975af6e09473e1a510b7d24 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sat, 15 Jul 2023 02:23:25 +0800 Subject: [PATCH 018/145] Add protobuf and dashapi to sonic-mgmt (#15743) #### Why I did it The testcases in sonic-mgmt need the packages of protobuf and dashapi ##### Work item tracking - Microsoft ADO **(number only)**: #### How I did it Because the docker of sonic-mgmt is based on ubuntu20.04, it cannot directly install the packages compiled by slave due to dependency issues. Download related packaged directly from Azp. #### How to verify it Check azp stats. --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 21 +++++++++++++++++++++ rules/sonic-dash-api.mk | 2 +- slave.mk | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 0a5e31eac415..f110d8baa82f 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -210,6 +210,27 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} +# Install protobuf 3.21.12 +RUN mkdir -p /tmp/protobuf \ + cd /tmp/protobuf \ + && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotobuf-dev_3.21.12-3_amd64.deb \ + && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotobuf-lite32_3.21.12-3_amd64.deb \ + && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotobuf32_3.21.12-3_amd64.deb \ + && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotoc-dev_3.21.12-3_amd64.deb \ + && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotoc32_3.21.12-3_amd64.deb \ + && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/protobuf-compiler_3.21.12-3_amd64.deb \ + && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/python3-protobuf_3.21.12-3_amd64.deb \ + && dpkg -i *.deb \ + && rm -rf /tmp/protobuf + +# Install dash-api +RUN cd /tmp \ + && mkdir -p /usr/lib/python3/dist-packages/dash_api \ + && wget https://raw.githubusercontent.com/sonic-net/sonic-buildimage/master/src/sonic-dash-api/pypkg/__init__.py -O /usr/lib/python3/dist-packages/dash_api/__init__.py \ + && git clone https://github.com/sonic-net/sonic-dash-api.git \ + && protoc -I=sonic-dash-api/proto --python_out=/usr/lib/python3/dist-packages/dash_api sonic-dash-api/proto/*.proto \ + && rm -rf /tmp/sonic-dash-api + RUN mkdir /var/run/sshd EXPOSE 22 diff --git a/rules/sonic-dash-api.mk b/rules/sonic-dash-api.mk index eeea7271d8cc..e6d9e34c0395 100644 --- a/rules/sonic-dash-api.mk +++ b/rules/sonic-dash-api.mk @@ -6,7 +6,7 @@ LIB_SONIC_DASH_API = libdashapi_$(LIB_SONIC_DASH_API_VERSION)_$(CONFIGURED_ARCH) $(LIB_SONIC_DASH_API)_SRC_PATH = $(SRC_PATH)/sonic-dash-api $(LIB_SONIC_DASH_API)_DEPENDS += $(PROTOBUF) $(PROTOBUF_LITE) $(PROTOBUF_DEV) $(PROTOBUF_COMPILER) -$(LIB_SONIC_DASH_API)_RDEPENDS += $(LIBSWSSCOMMON) $(LIBNL3) $(LIBNL_GENL3) $(LIBNL_ROUTE3) $(PROTOBUF) $(PROTOBUF_LITE) +$(LIB_SONIC_DASH_API)_RDEPENDS += $(PROTOBUF) $(PROTOBUF_LITE) $(PYTHON3_PROTOBUF) SONIC_DPKG_DEBS += $(LIB_SONIC_DASH_API) diff --git a/slave.mk b/slave.mk index 73e9131ecd8d..4b49234c7c18 100644 --- a/slave.mk +++ b/slave.mk @@ -1560,4 +1560,4 @@ jessie : $$(addprefix $(TARGET_PATH)/,$$(JESSIE_DOCKER_IMAGES)) \ ## To build some commonly used libs. Some submodules depend on these libs. ## It is used in component pipelines. For example: swss needs libnl, libyang -lib-packages: $(addprefix $(DEBS_PATH)/,$(LIBNL3) $(LIBYANG)) +lib-packages: $(addprefix $(DEBS_PATH)/,$(LIBNL3) $(LIBYANG) $(PROTOBUF) $(LIB_SONIC_DASH_API)) From b06a856fba6e06c773829f81750fb6394fb58a55 Mon Sep 17 00:00:00 2001 From: DavidZagury <32644413+DavidZagury@users.noreply.github.com> Date: Sat, 15 Jul 2023 00:59:55 +0300 Subject: [PATCH 019/145] [Mellanox] Add support for BIOS update on Spectrum-4 (#15795) - Why I did it BIOS on new generation switch can come with a file type of cap or cab. Needs to add support to these file type. Also ONIE version on new devices can have a suffix of 'dev'. - How I did it Added cap & cab as possible component extensions for ComponentBIOS. Update the ONIE version regex to include dev signed versions. - How to verify it Update BIOS. --- .../sonic_platform/component.py | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py index 4befc7998425..db184567ca29 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -130,7 +130,7 @@ class ONIEUpdater(object): ONIE_FW_UPDATE_CMD_INSTALL = ['/usr/bin/mlnx-onie-fw-update.sh', 'update', '--no-reboot'] ONIE_FW_UPDATE_CMD_SHOW_PENDING = ['/usr/bin/mlnx-onie-fw-update.sh', 'show-pending'] - ONIE_VERSION_PARSE_PATTERN = '([0-9]{4})\.([0-9]{2})-([0-9]+)\.([0-9]+)\.([0-9]+)-([0-9]+)' + ONIE_VERSION_PARSE_PATTERN = '([0-9]{4})\.([0-9]{2})-([0-9]+)\.([0-9]+)\.([0-9]+)-?(dev)?-([0-9]+)' ONIE_VERSION_BASE_PARSE_PATTERN = '([0-9]+)\.([0-9]+)\.([0-9]+)' ONIE_VERSION_REQUIRED = '5.2.0016' @@ -145,14 +145,16 @@ class ONIEUpdater(object): # For SN2201, upgrading fireware from ONIE is supported from day one so we do not need to check it. PLATFORM_ALWAYS_SUPPORT_UPGRADE = ['x86_64-nvidia_sn2201-r0'] - BIOS_UPDATE_FILE_EXT = '.rom' - + BIOS_UPDATE_FILE_EXT_ROM = '.rom' + BIOS_UPDATE_FILE_EXT_CAB = '.cab' def __init__(self): self.platform = device_info.get_platform() def __add_prefix(self, image_path): - if self.BIOS_UPDATE_FILE_EXT not in image_path: + if image_path.endswith(self.BIOS_UPDATE_FILE_EXT_CAB): + return image_path; + elif self.BIOS_UPDATE_FILE_EXT_ROM not in image_path: rename_path = "/tmp/00-{}".format(os.path.basename(image_path)) else: rename_path = "/tmp/99-{}".format(os.path.basename(image_path)) @@ -279,7 +281,8 @@ def parse_onie_version(self, version, is_base=False): onie_major = m.group(3) onie_minor = m.group(4) onie_release = m.group(5) - onie_baudrate = m.group(6) + onie_signtype = m.group(6) + onie_baudrate = m.group(7) return onie_year, onie_month, onie_major, onie_minor, onie_release, onie_baudrate @@ -422,7 +425,7 @@ def _check_file_validity(self, image_path): name_list = os.path.splitext(image_path) if self.image_ext_name is not None: - if name_list[1] != self.image_ext_name: + if name_list[1] not in self.image_ext_name: print("ERROR: Extend name of file {} is wrong. Image for {} should have extend name {}".format(image_path, self.name, self.image_ext_name)) return False @@ -478,7 +481,7 @@ def update_firmware(self, image_path): class ComponentSSD(Component): COMPONENT_NAME = 'SSD' COMPONENT_DESCRIPTION = 'SSD - Solid-State Drive' - COMPONENT_FIRMWARE_EXTENSION = '.pkg' + COMPONENT_FIRMWARE_EXTENSION = ['.pkg'] FIRMWARE_VERSION_ATTR = 'Firmware Version' AVAILABLE_FIRMWARE_VERSION_ATTR = 'Available Firmware Version' @@ -641,7 +644,7 @@ def update_firmware(self, image_path): class ComponentBIOS(Component): COMPONENT_NAME = 'BIOS' COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' - COMPONENT_FIRMWARE_EXTENSION = '.rom' + COMPONENT_FIRMWARE_EXTENSION = ['.rom', '.cab'] BIOS_VERSION_COMMAND = ['dmidecode', '--oem-string', '1'] @@ -725,7 +728,7 @@ def get_firmware_version(self): class ComponentCPLD(Component): COMPONENT_NAME = 'CPLD{}' COMPONENT_DESCRIPTION = 'CPLD - Complex Programmable Logic Device' - COMPONENT_FIRMWARE_EXTENSION = '.vme' + COMPONENT_FIRMWARE_EXTENSION = ['.vme'] MST_DEVICE_PATH = '/dev/mst' MST_DEVICE_PATTERN = 'mt[0-9]*_pci_cr0' From ed21266ff47aa474cc2f8fa0ee9f9bad2db02e09 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Sat, 15 Jul 2023 06:02:46 +0800 Subject: [PATCH 020/145] [Mellanox] Remove reset_from_comex from reboot cause mapping (#15793) - Why I did it The reset cause "reset_from_comex" has been removed by hw-management, hence removing it from platform API code - How I did it Remove reset_from_comex from reboot cause mapping - How to verify it Manual test --- platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index 5a2aaa59a769..e911c9617e1a 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -765,7 +765,6 @@ def initialize_reboot_cause(self): 'reset_hotswap_or_halt' : self.REBOOT_CAUSE_HARDWARE_OTHER, 'reset_voltmon_upgrade_fail': self.REBOOT_CAUSE_HARDWARE_OTHER, 'reset_reload_bios' : self.REBOOT_CAUSE_HARDWARE_BIOS, - 'reset_from_comex' : self.REBOOT_CAUSE_HARDWARE_CPU, 'reset_fw_reset' : self.REBOOT_CAUSE_HARDWARE_RESET_FROM_ASIC, 'reset_from_asic' : self.REBOOT_CAUSE_HARDWARE_RESET_FROM_ASIC, 'reset_long_pb' : self.REBOOT_CAUSE_HARDWARE_BUTTON, From b6986ffd68ad93a5e51e9b83f7921c615a7f4a94 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Sat, 15 Jul 2023 06:03:33 +0800 Subject: [PATCH 021/145] [Mellanox] Update SAI build procedure (#15728) = Why I did it To optimize Mellanox platform SAI build - How I did it SAI debs are now downloaded as Spectrum-SDK-Drivers-SONiC-Bins release. - How to verify it Configure/build for Mellanox platform, check the image and ensure that correct SAI debs are included. --- .gitmodules | 3 --- platform/mellanox/.gitignore | 2 -- platform/mellanox/mlnx-sai.mk | 27 ++++++++++++++++++- platform/mellanox/mlnx-sai/.gitignore | 6 +++++ platform/mellanox/mlnx-sai/Makefile | 4 +-- platform/mellanox/mlnx-sai/SAI-Implementation | 1 - 6 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 platform/mellanox/mlnx-sai/.gitignore delete mode 160000 platform/mellanox/mlnx-sai/SAI-Implementation diff --git a/.gitmodules b/.gitmodules index 5455f6d7754e..56fcd2eb0865 100644 --- a/.gitmodules +++ b/.gitmodules @@ -65,9 +65,6 @@ [submodule "src/scapy"] path = src/scapy url = https://github.com/secdev/scapy.git -[submodule "platform/mellanox/mlnx-sai/SAI-Implementation"] - path = platform/mellanox/mlnx-sai/SAI-Implementation - url = https://github.com/Mellanox/SAI-Implementation [submodule "src/sonic-mgmt-framework"] path = src/sonic-mgmt-framework url = https://github.com/sonic-net/sonic-mgmt-framework diff --git a/platform/mellanox/.gitignore b/platform/mellanox/.gitignore index 1f3d15d640d4..9fc0ece98e1a 100644 --- a/platform/mellanox/.gitignore +++ b/platform/mellanox/.gitignore @@ -1,6 +1,4 @@ # Subdirectories -mlnx-sai/* -!mlnx-sai/Makefile hw-management/* !hw-management/Makefile !hw-management/*.patch diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 2714d473943b..1c07186161d4 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,8 +1,21 @@ # Mellanox SAI MLNX_SAI_VERSION = SAIBuild2305.24.0.1 +MLNX_SAI_ASSETS_GITHUB_URL = https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins +MLNX_SAI_ASSETS_RELEASE_TAG = sai-$(MLNX_SAI_VERSION)-$(BLDENV)-$(CONFIGURED_ARCH) +MLNX_SAI_ASSETS_URL = $(MLNX_ASSETS_GITHUB_URL)/releases/download/$(MLNX_SAI_ASSETS_RELEASE_TAG) +MLNX_SAI_DEB_VERSION = $(subst -,.,$(subst _,.,$(MLNX_SAI_VERSION))) -export MLNX_SAI_VERSION +# Place here URL where SAI sources exist +MLNX_SAI_SOURCE_BASE_URL = + +ifneq ($(MLNX_SAI_SOURCE_BASE_URL), ) +SAI_FROM_SRC = y +else +SAI_FROM_SRC = n +endif + +export MLNX_SAI_VERSION MLNX_SAI_SOURCE_BASE_URL MLNX_SAI = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb $(MLNX_SAI)_SRC_PATH = $(PLATFORM_PATH)/mlnx-sai @@ -11,4 +24,16 @@ $(MLNX_SAI)_RDEPENDS += $(MLNX_SDK_RDEBS) $(MLNX_SDK_DEBS) $(eval $(call add_conflict_package,$(MLNX_SAI),$(LIBSAIVS_DEV))) MLNX_SAI_DBGSYM = mlnx-sai-dbgsym_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(MLNX_SAI),$(MLNX_SAI_DBGSYM))) + +define make_url + $(1)_URL = $(MLNX_SAI_ASSETS_URL)/$(1) + +endef + +$(eval $(foreach deb,$(MLNX_SAI) $(MLNX_SAI_DBGSYM),$(call make_url,$(deb)))) + +ifeq ($(SAI_FROM_SRC), y) SONIC_MAKE_DEBS += $(MLNX_SAI) +else +SONIC_ONLINE_DEBS += $(MLNX_SAI) +endif diff --git a/platform/mellanox/mlnx-sai/.gitignore b/platform/mellanox/mlnx-sai/.gitignore new file mode 100644 index 000000000000..7e5cb7d266aa --- /dev/null +++ b/platform/mellanox/mlnx-sai/.gitignore @@ -0,0 +1,6 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore +!Makefile + diff --git a/platform/mellanox/mlnx-sai/Makefile b/platform/mellanox/mlnx-sai/Makefile index 55c453e77e6d..6731bd83688d 100644 --- a/platform/mellanox/mlnx-sai/Makefile +++ b/platform/mellanox/mlnx-sai/Makefile @@ -6,7 +6,8 @@ MAIN_TARGET = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb DERIVED_TARGETS = mlnx-sai-dbgsym_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : - pushd SAI-Implementation + rm -rf mlnx_sai + wget -c $(MLNX_SAI_SOURCE_BASE_URL)/$(MLNX_SAI_VERSION).tar.gz -O - | tar -xz pushd mlnx_sai chmod a+x autogen.sh @@ -14,4 +15,3 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : popd mv $(DERIVED_TARGETS) $* $(DEST)/ - popd diff --git a/platform/mellanox/mlnx-sai/SAI-Implementation b/platform/mellanox/mlnx-sai/SAI-Implementation deleted file mode 160000 index ec7fa674f143..000000000000 --- a/platform/mellanox/mlnx-sai/SAI-Implementation +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ec7fa674f143809e602a56b6ef5d279ade8b77d2 From 2a55e8b359c7d1b9f7e74546c0e38c550fcf3714 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sat, 15 Jul 2023 06:10:29 +0800 Subject: [PATCH 022/145] Update the description message of PSU power threshold checking in system health (#15289) - Why I did it Adjust PSU power threshold logic in system health. - How I did it Update the description message in PSU power threshold checking power of PSU x (xx w) exceeds threshold (xx w) => System power exceeds xx threshold (xx w) - How to verify it Manual test and unit test --- src/system-health/health_checker/hardware_checker.py | 5 +++-- src/system-health/tests/test_system_health.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/system-health/health_checker/hardware_checker.py b/src/system-health/health_checker/hardware_checker.py index 992bdbab545c..8f7a11f55c2e 100644 --- a/src/system-health/health_checker/hardware_checker.py +++ b/src/system-health/health_checker/hardware_checker.py @@ -257,12 +257,13 @@ def _check_psu_status(self, config): if not self._ignore_check(config.ignore_devices, 'psu', name, 'power_threshold'): power_overload = data_dict.get('power_overload', None) if power_overload == 'True': + try: power = data_dict['power'] power_critical_threshold = data_dict['power_critical_threshold'] - self.set_object_not_ok('PSU', name, 'power of {} ({}w) exceeds threshold ({}w)'.format(name, power, power_critical_threshold)) + self.set_object_not_ok('PSU', name, 'System power exceeds threshold ({}w)'.format(power_critical_threshold)) except KeyError: - self.set_object_not_ok('PSU', name, 'power of {} exceeds threshold but power or power_critical_threshold is invalid'.format(name)) + self.set_object_not_ok('PSU', name, 'System power exceeds threshold but power_critical_threshold is invalid') continue self.set_object_ok('PSU', name) diff --git a/src/system-health/tests/test_system_health.py b/src/system-health/tests/test_system_health.py index 10bdf3d7d9f8..2d46140e2ff6 100644 --- a/src/system-health/tests/test_system_health.py +++ b/src/system-health/tests/test_system_health.py @@ -444,12 +444,12 @@ def test_hardware_checker(): assert checker._info['PSU 5'][HealthChecker.INFO_FIELD_OBJECT_STATUS] == HealthChecker.STATUS_NOT_OK assert 'PSU 6' in checker._info - assert checker._info['PSU 6'][HealthChecker.INFO_FIELD_OBJECT_MSG] == 'power of PSU 6 (101.0w) exceeds threshold (100.0w)' + assert checker._info['PSU 6'][HealthChecker.INFO_FIELD_OBJECT_MSG] == 'System power exceeds threshold (100.0w)' assert checker._info['PSU 6'][HealthChecker.INFO_FIELD_OBJECT_STATUS] == HealthChecker.STATUS_NOT_OK assert 'PSU 7' in checker._info assert checker._info['PSU 7'][HealthChecker.INFO_FIELD_OBJECT_STATUS] == HealthChecker.STATUS_NOT_OK - assert checker._info['PSU 7'][HealthChecker.INFO_FIELD_OBJECT_MSG] == 'power of PSU 7 exceeds threshold but power or power_critical_threshold is invalid' + assert checker._info['PSU 7'][HealthChecker.INFO_FIELD_OBJECT_MSG] == 'System power exceeds threshold but power_critical_threshold is invalid' def test_config(): From 3e9ae4fc7ad6f862b133169e1bc881e419224d59 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 15 Jul 2023 16:34:27 +0800 Subject: [PATCH 023/145] [submodule] Update submodule sonic-platform-daemons to the latest HEAD automatically (#15852) #### Why I did it src/sonic-platform-daemons ``` * 94242c2 - (HEAD -> master, origin/master, origin/HEAD) Use vendor customizable fan speed threshold checks (#378) (3 hours ago) [spilkey-cisco] * db6e340 - Fix index out of range in the error log of invalid media lane mask received (#386) (8 hours ago) [MichaelWangSmci] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index d73808cead2a..94242c2465d5 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit d73808cead2aaf386ae033d9d571882c92f0377c +Subproject commit 94242c2465d521238535704347f0d01dfd0293c9 From 273cb46af9bc00b9ac0d18c99547fa2b621ff960 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:23:42 +0800 Subject: [PATCH 024/145] [ci/build]: Upgrade SONiC package versions (#15854) --- .../versions-deb-bullseye | 2 +- .../versions-py3-all-arm64 | 1 + .../versions-deb-buster | 2 ++ files/build/versions/default/versions-git | 6 +++--- files/build/versions/default/versions-mirror | 20 +++++++++---------- files/build/versions/default/versions-web | 2 ++ .../dockers/docker-ptf-sai/versions-py3 | 3 +++ .../versions/dockers/docker-ptf/versions-py2 | 2 +- .../docker-sonic-mgmt-framework/versions-py3 | 2 +- .../dockers/sonic-slave-bullseye/versions-py3 | 4 ++-- .../sonic-slave-buster/versions-deb-buster | 2 +- .../dockers/sonic-slave-buster/versions-py3 | 2 +- 12 files changed, 28 insertions(+), 20 deletions(-) diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye index 55ab22200759..3798fe82e437 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye @@ -24,6 +24,7 @@ libsairedis==1.0.0 libsairedis-dev==1.0.0 libsaithrift-dev==0.9.4 libsaivs==1.0.0 +libsaivs-dev==1.0.0 libswsscommon==1.0.0 libswsscommon-dev==1.0.0 libtac-dev==1.4.1-1 @@ -43,7 +44,6 @@ linux-headers-5.10.0-18-2-common==5.10.140-1 lldpd==1.0.4-1 lm-sensors==1:3.6.0-7 mft==4.22.1-15 -mlnx-sai==1.mlnx.SAIBuild2305.24.0.1 net-tools==1.60+git20181103.0eebece-1 protobuf-compiler==3.21.12-3 python-thrift==0.11.0-4 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 index cd01abdaf741..46df813bf748 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 @@ -2,3 +2,4 @@ bcrypt==3.2.2 bitarray==1.5.3 click==7.0 requests==2.31.0 +zipp==1.2.0 diff --git a/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster b/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster index 850c2bfc402e..49b0aeaa5c9a 100644 --- a/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster +++ b/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster @@ -17,6 +17,8 @@ libthrift0==0.14.1 libyang==1.0.73 libyang-cpp==1.0.73 libyang-dev==1.0.73 +libyang2==2.0.112-6 +libyang2-dev==2.0.112-6 python-swsscommon==1.0.0 python-thrift==0.11.0-4 python3-swsscommon==1.0.0 diff --git a/files/build/versions/default/versions-git b/files/build/versions/default/versions-git index ae358adf44e1..ec0a6c6e8c58 100644 --- a/files/build/versions/default/versions-git +++ b/files/build/versions/default/versions-git @@ -1,11 +1,11 @@ -https://chromium.googlesource.com/chromium/tools/depot_tools.git==247429efd9e04d492ff5fe756818661d7feb7889 +https://chromium.googlesource.com/chromium/tools/depot_tools.git==b389d031a263181c816b6609333a30bdecf4194b https://github.com/aristanetworks/swi-tools.git==b5f087e4774168bf536360d43c9c509c8f14ad9f https://github.com/CESNET/libyang.git==ea94c8b9f513f8a6ddc6ce1540fa41eaf4c8922a https://github.com/daveolson53/audisp-tacplus.git==559c9f22edd4f2dea0ecedffb3ad9502b12a75b6 https://github.com/daveolson53/libnss-tacplus.git==19008ab68d9d504aa58eb34d5f564755a1613b8b https://github.com/dyninc/OpenBFDD.git==e35f43ad8d2b3f084e96a84c392528a90d05a287 -https://github.com/flashrom/flashrom.git==b66f4766b5d7dc614ad609f27dd2794e06b5e2a4 -https://github.com/FreeRADIUS/freeradius-server.git==02df5b27df68396150c6424d2a16618f361329af +https://github.com/flashrom/flashrom.git==ea54723cf86b8c2f670371e93d66593acea0749e +https://github.com/FreeRADIUS/freeradius-server.git==7c35cc0ca4b75c571d4cc9129edccdfb41913c46 https://github.com/FreeRADIUS/pam_radius.git==8d373539bb9f13b0abfe8bcae0095a930a00fad0 https://github.com/jeroennijhof/pam_tacplus.git==4284d9016e64def2bb81d5f50f96dc3b59bfdc39 https://github.com/jpirko/libteam.git==7cb5de8b01be132bd4150eff460bfd83296414b6 diff --git a/files/build/versions/default/versions-mirror b/files/build/versions/default/versions-mirror index 70254c9d8fdc..2aa5af66f5c7 100644 --- a/files/build/versions/default/versions-mirror +++ b/files/build/versions/default/versions-mirror @@ -1,15 +1,15 @@ deb.nodesource.com_node%5f14.x_dists_bullseye==2023-02-17T00:35:28Z deb.nodesource.com_node%5f14.x_dists_buster==2023-02-17T00:35:28Z -debian==20230707T000210Z -debian-security==20230707T000202Z +debian==20230714T000211Z +debian-security==20230714T000215Z download.docker.com_linux_debian_dists_bullseye==2023-07-07T20:10:57Z download.docker.com_linux_debian_dists_buster==2023-07-07T20:10:57Z packages.microsoft.com_repos_sonic-dev_dists_jessie==2022-10-31T19:34:29Z -packages.trafficmanager.net_snapshot_debian-security_20230707T000202Z_dists_bullseye-security==2023-07-06T20:09:13Z -packages.trafficmanager.net_snapshot_debian-security_20230707T000202Z_dists_buster_updates==2023-07-06T20:09:13Z -packages.trafficmanager.net_snapshot_debian_20230707T000210Z_dists_bullseye==2023-06-10T08:52:21Z -packages.trafficmanager.net_snapshot_debian_20230707T000210Z_dists_bullseye-backports==2023-07-06T20:09:27Z -packages.trafficmanager.net_snapshot_debian_20230707T000210Z_dists_bullseye-updates==2023-07-06T20:09:28Z -packages.trafficmanager.net_snapshot_debian_20230707T000210Z_dists_buster==2023-06-10T08:53:33Z -packages.trafficmanager.net_snapshot_debian_20230707T000210Z_dists_buster-backports==2023-07-06T20:09:27Z -packages.trafficmanager.net_snapshot_debian_20230707T000210Z_dists_buster-updates==2023-06-10T08:55:10Z +packages.trafficmanager.net_snapshot_debian-security_20230714T000215Z_dists_bullseye-security==2023-07-13T20:22:36Z +packages.trafficmanager.net_snapshot_debian-security_20230714T000215Z_dists_buster_updates==2023-07-13T20:22:36Z +packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_bullseye==2023-06-10T08:52:21Z +packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_bullseye-backports==2023-07-13T20:25:18Z +packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_bullseye-updates==2023-07-13T20:25:18Z +packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_buster==2023-06-10T08:53:33Z +packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_buster-backports==2023-07-13T20:25:18Z +packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_buster-updates==2023-06-10T08:55:10Z diff --git a/files/build/versions/default/versions-web b/files/build/versions/default/versions-web index a569f211b972..60567c6a9c2f 100644 --- a/files/build/versions/default/versions-web +++ b/files/build/versions/default/versions-web @@ -49,6 +49,8 @@ https://github.com/Marvell-switching/sonic-marvell-binaries/raw/master/armhf/sai https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/fw-2010.5144/fw-SPC-rel-13_2010_5144-EVB.mfa==49de2652fc105ce1d8624d15cb02033d https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/fw-2010.5144/fw-SPC2-rel-29_2010_5144-EVB.mfa==0415936df3dfbbed9015d30b8244d110 https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/fw-2010.5144/fw-SPC3-rel-30_2010_5144-EVB.mfa==c0b6b9d92320341da004c22ce14c2e52 +https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/sai-SAIBuild2305.24.0.1-bullseye-amd64/mlnx-sai-dbgsym_1.mlnx.SAIBuild2305.24.0.1_amd64.deb==796605c9b759059c2b3ee099d924d76c +https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/sai-SAIBuild2305.24.0.1-bullseye-amd64/mlnx-sai_1.mlnx.SAIBuild2305.24.0.1_amd64.deb==865bbb442e7db0f67eb48e957d10738c https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/sdk-4.5.5142-bullseye-amd64/applibs-dev_1.mlnx.4.5.5142_amd64.deb==ddbee8ca24473dac9109b11ecafbc2ff https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/sdk-4.5.5142-bullseye-amd64/applibs_1.mlnx.4.5.5142_amd64.deb==3c0925b00e1844291f0c1bff00f7192d https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins/releases/download/sdk-4.5.5142-bullseye-amd64/python-sdk-api_1.mlnx.4.5.5142_amd64.deb==0deb403e4cd293f5b4f94fda120e9441 diff --git a/files/build/versions/dockers/docker-ptf-sai/versions-py3 b/files/build/versions/dockers/docker-ptf-sai/versions-py3 index 4454071cb0f1..6eb06bd6a9e4 100644 --- a/files/build/versions/dockers/docker-ptf-sai/versions-py3 +++ b/files/build/versions/dockers/docker-ptf-sai/versions-py3 @@ -1,5 +1,6 @@ crc16==0.1.1 getmac==0.9.4 +importlib-metadata==6.7.0 netifaces==0.11.0 packet-helper==0.0.1 psutil==5.9.5 @@ -9,4 +10,6 @@ pysubnettree==0.35 scapy-helper==0.14.8 tabulate==0.8.10 thrift==0.14.1 +typing-extensions==4.7.1 xmlrunner==1.7.7 +zipp==3.15.0 diff --git a/files/build/versions/dockers/docker-ptf/versions-py2 b/files/build/versions/dockers/docker-ptf/versions-py2 index ab45c6a42cce..a135ecbc2739 100644 --- a/files/build/versions/dockers/docker-ptf/versions-py2 +++ b/files/build/versions/dockers/docker-ptf/versions-py2 @@ -1,4 +1,4 @@ -backports.functools-lru-cache==1.6.5 +backports.functools-lru-cache==1.6.6 backports.shutil-get-terminal-size==1.0.0 bcrypt==3.1.7 cffi==1.15.1 diff --git a/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 b/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 index e36571edbf43..b4530a1240e7 100644 --- a/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 +++ b/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 @@ -1,7 +1,7 @@ attrs==23.1.0 certifi==2017.4.17 charset-normalizer==3.2.0 -click==8.1.4 +click==8.1.5 clickclick==20.10.2 connexion==2.7.0 flask==2.2.5 diff --git a/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 b/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 index fefafa377ca5..def2d7cbfd51 100644 --- a/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 +++ b/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 @@ -46,7 +46,7 @@ markdown==3.3.4 markupsafe==1.1.1 mccabe==0.6.1 mmh3==2.5.1 -mock==5.0.2 +mock==5.1.0 mockredispy==2.9.3 more-itertools==4.2.0 mypy-extensions==0.4.3 @@ -67,7 +67,7 @@ pyangbind==0.8.1 pyasn1==0.4.8 pyasn1-modules==0.2.1 pycurl==7.43.0.6 -pyfakefs==5.2.2 +pyfakefs==5.2.3 pygments==2.7.1 pygobject==3.38.0 pyhamcrest==1.9.0 diff --git a/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster b/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster index ae07b4e673b3..9b57c5d405db 100644 --- a/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster +++ b/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster @@ -1341,7 +1341,7 @@ libxxf86vm-dev==1:1.1.4-1+b2 libxxf86vm1==1:1.1.4-1+b2 libxxhash0==0.6.5-2 libxz-java==1.8-2 -libyajl2==2.1.0-3+deb10u1 +libyajl2==2.1.0-3+deb10u2 libyaml-0-2==0.2.1-1 libyaml-dev==0.2.1-1 libyaml-libyaml-perl==0.76+repack-1 diff --git a/files/build/versions/dockers/sonic-slave-buster/versions-py3 b/files/build/versions/dockers/sonic-slave-buster/versions-py3 index 88949d47b256..881cff646d55 100644 --- a/files/build/versions/dockers/sonic-slave-buster/versions-py3 +++ b/files/build/versions/dockers/sonic-slave-buster/versions-py3 @@ -49,7 +49,7 @@ pyang==2.4.0 pyangbind==0.8.1 pycrypto==2.6.1 pycurl==7.43.0.2 -pyfakefs==5.2.2 +pyfakefs==5.2.3 pygments==2.3.1 pygobject==3.30.4 pympler==0.8 From c970ee0f420b6f4b5ef9ccd11c0b1f2ff07b62f3 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sun, 16 Jul 2023 15:30:08 +0800 Subject: [PATCH 025/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#15853) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 51c7a43cc04b..b617d97dfd8e 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 51c7a43cc04bfd4feef354689f47e12ee9c404c1 +Subproject commit b617d97dfd8e8b9dac2819a0d895909fbfbcf543 From 05bbf72c86a45a5acf7d1b36ea11e8fde4fa7e66 Mon Sep 17 00:00:00 2001 From: ycoheNvidia <99744138+ycoheNvidia@users.noreply.github.com> Date: Sun, 16 Jul 2023 21:06:29 +0300 Subject: [PATCH 026/145] Reduced root directory privileges (#15147) #### Why I did it Reduced root directory privileges #### How I did it During build_debian - called chroot to reduce root directory and its subdirectories privileges to 744 #### How to verify it After image build and upgrade - check /root privileges by calling "ls -a /root" #### Description for the changelog reduced /root directory privileges --- build_debian.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 83d9a687cd4c..13e39ac73619 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -786,6 +786,9 @@ sudo cp files/image_config/resolv-config/resolv.conf.head $FILESYSTEM_ROOT/etc/r sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -comp zstd -b 1M -e boot -e var/lib/docker -e $PLATFORM_DIR +## Reduce /boot permission +sudo chmod -R go-wx $FILESYSTEM_ROOT/boot + # Ensure admin gid is 1000 gid_user=$(sudo LANG=C chroot $FILESYSTEM_ROOT id -g $USERNAME) || gid_user="none" if [ "${gid_user}" != "1000" ]; then From 1ec3b1dc6bd4fb546a0df4ac7139ad94df3cd5e6 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Mon, 17 Jul 2023 16:37:57 +0800 Subject: [PATCH 027/145] [submodule] Update submodule sonic-swss to the latest HEAD automatically (#15860) #### Why I did it src/sonic-swss ``` * 5b27c209 - (HEAD -> master, origin/master, origin/HEAD) Refactor Orch class to separate recorder implementation (#2837) (8 hours ago) [Vivek] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index c7e1308ec6e0..5b27c209ed95 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit c7e1308ec6e00035136da09f6cb0f43bf5f82b46 +Subproject commit 5b27c209ed952bb6d2324fd9834e6ce3d49b8ee3 From 39f3e1f97a33070a853faab146441448fda5cf30 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Mon, 17 Jul 2023 19:08:24 +0800 Subject: [PATCH 028/145] [ci/build]: Upgrade SONiC package versions (#15862) --- .../versions-deb-bullseye-arm64 | 2 -- .../versions-py3-all-arm64 | 5 ----- .../versions-py3-all-armhf | 1 - .../versions-deb-buster | 2 -- files/build/versions/default/versions-git | 2 +- files/build/versions/default/versions-mirror | 20 +++++++++---------- .../dockers/docker-base-bullseye/versions-py3 | 2 +- .../dockers/docker-base-buster/versions-py3 | 2 +- .../dockers/sonic-slave-bullseye/versions-py3 | 2 +- .../dockers/sonic-slave-buster/versions-py3 | 2 +- files/build/versions/host-image/versions-py3 | 2 +- 11 files changed, 16 insertions(+), 26 deletions(-) delete mode 100644 files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 index 90f712515be3..3bad5a5352bd 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 @@ -1,3 +1 @@ -libnl-3-200==3.5.0-1 -libnl-route-3-200==3.5.0-1 linux-headers-5.10.0-18-2-arm64==5.10.140-1 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 deleted file mode 100644 index 46df813bf748..000000000000 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 +++ /dev/null @@ -1,5 +0,0 @@ -bcrypt==3.2.2 -bitarray==1.5.3 -click==7.0 -requests==2.31.0 -zipp==1.2.0 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf index 46df813bf748..cd01abdaf741 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf @@ -2,4 +2,3 @@ bcrypt==3.2.2 bitarray==1.5.3 click==7.0 requests==2.31.0 -zipp==1.2.0 diff --git a/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster b/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster index 49b0aeaa5c9a..850c2bfc402e 100644 --- a/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster +++ b/files/build/versions/build/build-sonic-slave-buster/versions-deb-buster @@ -17,8 +17,6 @@ libthrift0==0.14.1 libyang==1.0.73 libyang-cpp==1.0.73 libyang-dev==1.0.73 -libyang2==2.0.112-6 -libyang2-dev==2.0.112-6 python-swsscommon==1.0.0 python-thrift==0.11.0-4 python3-swsscommon==1.0.0 diff --git a/files/build/versions/default/versions-git b/files/build/versions/default/versions-git index ec0a6c6e8c58..ed4a8affbee3 100644 --- a/files/build/versions/default/versions-git +++ b/files/build/versions/default/versions-git @@ -5,7 +5,7 @@ https://github.com/daveolson53/audisp-tacplus.git==559c9f22edd4f2dea0ecedffb3ad9 https://github.com/daveolson53/libnss-tacplus.git==19008ab68d9d504aa58eb34d5f564755a1613b8b https://github.com/dyninc/OpenBFDD.git==e35f43ad8d2b3f084e96a84c392528a90d05a287 https://github.com/flashrom/flashrom.git==ea54723cf86b8c2f670371e93d66593acea0749e -https://github.com/FreeRADIUS/freeradius-server.git==7c35cc0ca4b75c571d4cc9129edccdfb41913c46 +https://github.com/FreeRADIUS/freeradius-server.git==661f794ec70f39825ad354276e399c51c382220d https://github.com/FreeRADIUS/pam_radius.git==8d373539bb9f13b0abfe8bcae0095a930a00fad0 https://github.com/jeroennijhof/pam_tacplus.git==4284d9016e64def2bb81d5f50f96dc3b59bfdc39 https://github.com/jpirko/libteam.git==7cb5de8b01be132bd4150eff460bfd83296414b6 diff --git a/files/build/versions/default/versions-mirror b/files/build/versions/default/versions-mirror index 2aa5af66f5c7..27925017b56d 100644 --- a/files/build/versions/default/versions-mirror +++ b/files/build/versions/default/versions-mirror @@ -1,15 +1,15 @@ deb.nodesource.com_node%5f14.x_dists_bullseye==2023-02-17T00:35:28Z deb.nodesource.com_node%5f14.x_dists_buster==2023-02-17T00:35:28Z -debian==20230714T000211Z -debian-security==20230714T000215Z +debian==20230716T000128Z +debian-security==20230716T000215Z download.docker.com_linux_debian_dists_bullseye==2023-07-07T20:10:57Z download.docker.com_linux_debian_dists_buster==2023-07-07T20:10:57Z packages.microsoft.com_repos_sonic-dev_dists_jessie==2022-10-31T19:34:29Z -packages.trafficmanager.net_snapshot_debian-security_20230714T000215Z_dists_bullseye-security==2023-07-13T20:22:36Z -packages.trafficmanager.net_snapshot_debian-security_20230714T000215Z_dists_buster_updates==2023-07-13T20:22:36Z -packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_bullseye==2023-06-10T08:52:21Z -packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_bullseye-backports==2023-07-13T20:25:18Z -packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_bullseye-updates==2023-07-13T20:25:18Z -packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_buster==2023-06-10T08:53:33Z -packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_buster-backports==2023-07-13T20:25:18Z -packages.trafficmanager.net_snapshot_debian_20230714T000211Z_dists_buster-updates==2023-06-10T08:55:10Z +packages.trafficmanager.net_snapshot_debian-security_20230716T000215Z_dists_bullseye-security==2023-07-14T23:42:45Z +packages.trafficmanager.net_snapshot_debian-security_20230716T000215Z_dists_buster_updates==2023-07-14T23:42:45Z +packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_bullseye==2023-06-10T08:52:21Z +packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_bullseye-backports==2023-07-15T20:35:32Z +packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_bullseye-updates==2023-07-15T20:35:32Z +packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_buster==2023-06-10T08:53:33Z +packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_buster-backports==2023-07-15T20:35:32Z +packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_buster-updates==2023-06-10T08:55:10Z diff --git a/files/build/versions/dockers/docker-base-bullseye/versions-py3 b/files/build/versions/dockers/docker-base-bullseye/versions-py3 index 19d10a4bd0ba..23c54de5fc2e 100644 --- a/files/build/versions/dockers/docker-base-bullseye/versions-py3 +++ b/files/build/versions/dockers/docker-base-bullseye/versions-py3 @@ -1,7 +1,7 @@ j2cli==0.3.10 jinja2==3.1.2 markupsafe==2.1.3 -pip==23.1.2 +pip==23.2 setuptools==49.6.0 supervisor==4.2.1 supervisord-dependent-startup==1.4.0 diff --git a/files/build/versions/dockers/docker-base-buster/versions-py3 b/files/build/versions/dockers/docker-base-buster/versions-py3 index 19d10a4bd0ba..23c54de5fc2e 100644 --- a/files/build/versions/dockers/docker-base-buster/versions-py3 +++ b/files/build/versions/dockers/docker-base-buster/versions-py3 @@ -1,7 +1,7 @@ j2cli==0.3.10 jinja2==3.1.2 markupsafe==2.1.3 -pip==23.1.2 +pip==23.2 setuptools==49.6.0 supervisor==4.2.1 supervisord-dependent-startup==1.4.0 diff --git a/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 b/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 index def2d7cbfd51..b045fa955642 100644 --- a/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 +++ b/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 @@ -58,7 +58,7 @@ parameterized==0.8.1 parse==1.6.6 pexpect==4.8.0 pillow==9.4.0 -pip==23.1.2 +pip==23.2 pluggy==0.13.0 ptyprocess==0.7.0 py==1.10.0 diff --git a/files/build/versions/dockers/sonic-slave-buster/versions-py3 b/files/build/versions/dockers/sonic-slave-buster/versions-py3 index 881cff646d55..e5ea5676b658 100644 --- a/files/build/versions/dockers/sonic-slave-buster/versions-py3 +++ b/files/build/versions/dockers/sonic-slave-buster/versions-py3 @@ -41,7 +41,7 @@ parameterized==0.8.1 pbr==4.2.0 pexpect==4.8.0 pillow==9.4.0 -pip==23.1.2 +pip==23.2 pluggy==0.8.0 ptyprocess==0.7.0 py==1.7.0 diff --git a/files/build/versions/host-image/versions-py3 b/files/build/versions/host-image/versions-py3 index e90730ed21a6..18267c124c8d 100644 --- a/files/build/versions/host-image/versions-py3 +++ b/files/build/versions/host-image/versions-py3 @@ -40,7 +40,7 @@ paramiko==2.11.0 pathtools==0.1.2 pddf-platform==1.0 pexpect==4.8.0 -pip==23.1.2 +pip==23.2 prefixed==0.7.0 prettyprinter==0.18.0 protobuf==3.20.3 From bd413d20d2e264e2580e73867cd4cf3f097868b9 Mon Sep 17 00:00:00 2001 From: jcaiMR <111116206+jcaiMR@users.noreply.github.com> Date: Tue, 18 Jul 2023 06:28:10 +0800 Subject: [PATCH 029/145] advance dhcprelay to 6a6ce24, add default dhcpv6 dualtor source interface (#15864) sonic-build image side change to fix source interface selection in dual tor scenario. dhcprelay related PR: [master]fix dhcpv6 relay dual tor source interface selection issue sonic-dhcp-relay#42 Announce dhcprelay submodule to 6a6ce24([to invoke #40 PR]([master]fix dhcpv6 relay dual tor source interface selection issue sonic-dhcp-relay#42)) --- dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 | 2 +- src/dhcprelay | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 b/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 index 8f83e05efc7c..e392711f5326 100644 --- a/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 +++ b/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 @@ -13,7 +13,7 @@ [program:dhcp6relay] command=/usr/sbin/dhcp6relay {#- Dual ToR Option #} -{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %} -d{% endif %} +{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %} -u Loopback0 {% endif %} priority=3 autostart=false diff --git a/src/dhcprelay b/src/dhcprelay index c36b8e3d2113..6a6ce245125d 160000 --- a/src/dhcprelay +++ b/src/dhcprelay @@ -1 +1 @@ -Subproject commit c36b8e3d2113976f319fb02db94971e9b27e6416 +Subproject commit 6a6ce245125d600ad07fc02638e96ba6c18d1b4b From e2a58acf61bca41a43daf2d9243d1f1ce4bdf06f Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Tue, 18 Jul 2023 10:28:39 -0700 Subject: [PATCH 030/145] Update usage leaf in sonic-events-host yang models (#15805) #### Why I did it event yang models for usage currently use int as type for usage leaf, needs to be of type decimal64 ##### Work item tracking - Microsoft ADO **(number only)**:17747466 #### How I did it Update yang models and UT #### How to verify it UT --- .../tests_config/sonic-events-host.json | 42 +++++++++---------- .../yang-models/sonic-events-common.yang | 12 ++---- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/sonic-events-host.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/sonic-events-host.json index 98ee755b510a..886863698392 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/sonic-events-host.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/sonic-events-host.json @@ -3,8 +3,8 @@ "sonic-events-host:sonic-events-host": { "sonic-events-host:disk-usage": { "fs": "FILESYSTEM", - "usage": -30, - "limit": 99, + "usage": "INCORRECT_USAGE", + "limit": "2.0", "timestamp": "1985-04-12T23:20:50.52Z" } } @@ -13,7 +13,7 @@ "sonic-events-host:sonic-events-host": { "sonic-events-host:disk-usage": { "fs": "FILESYSTEM", - "usage": 32, + "usage": "2.0", "limit": "INCORRECT_LIMIT", "timestamp": "1985-04-12T23:20:50.52Z" } @@ -23,8 +23,8 @@ "sonic-events-host:sonic-events-host": { "sonic-events-host:disk-usage": { "fs": "FILESYSTEM", - "usage": 32, - "limit": 99, + "usage": "2.0", + "limit": "2.0", "timestamp": "INCORRECT_TIMESTAMP" } } @@ -33,8 +33,8 @@ "sonic-events-host:sonic-events-host": { "sonic-events-host:disk-usage": { "fs": "FILESYSTEM", - "usage": 32, - "limit": 99, + "usage": "2.0", + "limit": "2.0", "timestamp": "1985-04-12T23:20:50.52Z" } } @@ -42,8 +42,8 @@ "SONIC_EVENTS_HOST_MEMORY_USAGE_INCORRECT_USAGE": { "sonic-events-host:sonic-events-host": { "sonic-events-host:memory-usage": { - "usage": -30, - "limit": 99, + "usage": "INCORRECT_USAGE", + "limit": "2.0", "timestamp": "1985-04-12T23:20:50.52Z" } } @@ -51,7 +51,7 @@ "SONIC_EVENTS_HOST_MEMORY_USAGE_INCORRECT_LIMIT": { "sonic-events-host:sonic-events-host": { "sonic-events-host:memory-usage": { - "usage": 32, + "usage": "2.0", "limit": "INCORRECT_LIMIT", "timestamp": "1985-04-12T23:20:50.52Z" } @@ -60,8 +60,8 @@ "SONIC_EVENTS_HOST_MEMORY_USAGE_INCORRECT_TIMESTAMP": { "sonic-events-host:sonic-events-host": { "sonic-events-host:memory-usage": { - "usage": 32, - "limit": 99, + "usage": "2.0", + "limit": "2.0", "timestamp": "INCORRECT_TIMESTAMP" } } @@ -69,8 +69,8 @@ "SONIC_EVENTS_HOST_MEMORY_USAGE_VALID": { "sonic-events-host:sonic-events-host": { "sonic-events-host:memory-usage": { - "usage": 32, - "limit": 99, + "usage": "2.0", + "limit": "2.0", "timestamp": "1985-04-12T23:20:50.52Z" } } @@ -78,8 +78,8 @@ "SONIC_EVENTS_HOST_CPU_USAGE_INCORRECT_USAGE": { "sonic-events-host:sonic-events-host": { "sonic-events-host:cpu-usage": { - "usage": -30, - "limit": 99, + "usage": "INCORRECT_USAGE", + "limit": "2.0", "timestamp": "1985-04-12T23:20:50.52Z" } } @@ -87,7 +87,7 @@ "SONIC_EVENTS_HOST_CPU_USAGE_INCORRECT_LIMIT": { "sonic-events-host:sonic-events-host": { "sonic-events-host:cpu-usage": { - "usage": 32, + "usage": "2.0", "limit": "INCORRECT_LIMIT", "timestamp": "1985-04-12T23:20:50.52Z" } @@ -96,8 +96,8 @@ "SONIC_EVENTS_HOST_CPU_USAGE_INCORRECT_TIMESTAMP": { "sonic-events-host:sonic-events-host": { "sonic-events-host:cpu-usage": { - "usage": 32, - "limit": 99, + "usage": "2.0", + "limit": "2.0", "timestamp": "INCORRECT_TIMESTAMP" } } @@ -105,8 +105,8 @@ "SONIC_EVENTS_HOST_CPU_USAGE_VALID": { "sonic-events-host:sonic-events-host": { "sonic-events-host:cpu-usage": { - "usage": 32, - "limit": 99, + "usage": "2.0", + "limit": "2.0", "timestamp": "1985-04-12T23:20:50.52Z" } } diff --git a/src/sonic-yang-models/yang-models/sonic-events-common.yang b/src/sonic-yang-models/yang-models/sonic-events-common.yang index 778f2ecbda95..ed6c81a7b908 100644 --- a/src/sonic-yang-models/yang-models/sonic-events-common.yang +++ b/src/sonic-yang-models/yang-models/sonic-events-common.yang @@ -30,19 +30,15 @@ module sonic-events-common { grouping sonic-events-usage { leaf usage { - type uint8 { - range "0..100" { - error-message "Incorrect val for %"; - } + type decimal64 { + fraction-digits 1; } description "Percentage in use"; } leaf limit { - type uint8 { - range "0..100" { - error-message "Incorrect val for %"; - } + type decimal64 { + fraction-digits 1; } description "Percentage limit set"; } From bdef73ea963064cdc9fbebb63ac381440c0fafd6 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 19 Jul 2023 06:33:49 +0800 Subject: [PATCH 031/145] [Build] Fix the PyYang python package installation issue (#15890) Why I did it Fix the armhf build failure. How to reproduce the issue: docker run -it debain:bullseye bash apt-get update && apt-get install -y python3-pip pip3 install PyYAML==5.4.1 Error message: Collecting PyYAML==5.4.1 Installing build dependencies ... done Getting requirements to build wheel ... error ERROR: Command errored out with exit status 1: command: /usr/bin/python3 /tmp/tmp6xabslgb_in_process.py get_requires_for_build_wheel /tmp/tmp_er01ztl .... raise AttributeError(attr) AttributeError: cython_sources ---------------------------------------- WARNING: Discarding https://files.pythonhosted.org/packages/a0/a4/d63f2d7597e1a4b55aa3b4d6c5b029991d3b824b5bd331af8d4ab1ed687d/PyYAML-5.4.1.tar.gz#sha256=607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e (from https://pypi.org/simple/pyyaml/) (requires-python:>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*). Command errored out with exit status 1: /usr/bin/python3 /tmp/tmp6xabslgb_in_process.py get_requires_for_build_wheel /tmp/tmp_er01ztl Check the logs for full command output. ERROR: Could not find a version that satisfies the requirement PyYAML==5.4.1 ERROR: No matching distribution found for PyYAML==5.4.1 root@fa2fa92edcfd:/# But if adding the option --no-build-isolation, then it is good, see fix. install "PyYAML==5.4.1" --no-build-isolation The same error can be found in the multiple builds. Work item tracking Microsoft ADO (number only): 24567457 How I did it Add a build option --no-build-isolation. --- build_debian.sh | 3 +++ dockers/docker-config-engine-bullseye/Dockerfile.j2 | 4 ++++ dockers/docker-config-engine-buster/Dockerfile.j2 | 4 ++++ sonic-slave-bullseye/Dockerfile.j2 | 3 ++- sonic-slave-buster/Dockerfile.j2 | 5 +++-- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 13e39ac73619..f71bdd9fd0fb 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -546,6 +546,9 @@ sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'docke # Install scapy sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'scapy==2.4.4' +# The option --no-build-isolation can be removed when upgrading PyYAML to 6.0.1 +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'PyYAML==5.4.1' --no-build-isolation + ## Note: keep pip installed for maintainance purpose # Install GCC, needed for building/installing some Python packages diff --git a/dockers/docker-config-engine-bullseye/Dockerfile.j2 b/dockers/docker-config-engine-bullseye/Dockerfile.j2 index f6804de903be..700af660a91d 100644 --- a/dockers/docker-config-engine-bullseye/Dockerfile.j2 +++ b/dockers/docker-config-engine-bullseye/Dockerfile.j2 @@ -23,6 +23,10 @@ RUN apt-get install -y \ RUN pip3 install pyangbind==0.8.1 RUN pip3 uninstall -y enum34 +# Fix armhf build failure +# The option --no-build-isolation can be removed when upgrading PyYAML to 6.0.1 +RUN pip3 install PyYAML==5.4.1 --no-build-isolation + # Install python-redis RUN pip3 install redis==4.5.4 diff --git a/dockers/docker-config-engine-buster/Dockerfile.j2 b/dockers/docker-config-engine-buster/Dockerfile.j2 index 084956eed5f5..cfa61bc0ba8c 100644 --- a/dockers/docker-config-engine-buster/Dockerfile.j2 +++ b/dockers/docker-config-engine-buster/Dockerfile.j2 @@ -23,6 +23,10 @@ RUN apt-get install -y \ RUN pip3 install pyangbind==0.8.1 RUN pip3 uninstall -y enum34 +# Fix armhf build failure +# The option --no-build-isolation can be removed when upgrading PyYAML to 6.0.1 +RUN pip3 install PyYAML==5.4.1 --no-build-isolation + # Install python-redis RUN pip3 install redis==4.5.4 diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index dacff484536b..72783f3e6da6 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -530,7 +530,8 @@ RUN pip3 uninstall -y enum34 RUN pip3 install j2cli==0.3.10 # For sonic-mgmt-framework -RUN pip3 install "PyYAML==5.4.1" +# The option --no-build-isolation can be removed when upgrading PyYAML to 6.0.1 +RUN pip3 install "PyYAML==5.4.1" --no-build-isolation {%- if CROSS_BUILD_ENVIRON != "y" %} RUN pip3 install "lxml==4.9.1" {%- endif %} diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 7e0bf6d06bcf..637ac02f857e 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -541,8 +541,9 @@ RUN pip3 install MarkupSafe==2.0.1 RUN pip3 install Jinja2==3.0.3 # For sonic-mgmt-framework -RUN pip2 install "PyYAML==5.4.1" -RUN pip3 install "PyYAML==5.4.1" +# The option --no-build-isolation can be removed when upgrading PyYAML to 6.0.1 +RUN pip2 install "PyYAML==5.4.1" --no-build-isolation +RUN pip3 install "PyYAML==5.4.1" --no-build-isolation {%- if CROSS_BUILD_ENVIRON != "y" %} RUN pip2 install "lxml==4.9.1" From 0b067bfb2a5e362431119aec0eee70fcd42f24e1 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan <93744978+assrinivasan@users.noreply.github.com> Date: Tue, 18 Jul 2023 21:14:00 -0700 Subject: [PATCH 032/145] [master] Mellanox: 2700, 4600c - Quoted device IDs to prevent false flags in pcied (#15896) Why I did it Certain all-numeric device IDs of PCI devices in the pcie.yaml file are left unquoted, leading to false mismatch flags in the pcie daemon and subsequently leads to log flooding. This PR fixes that issue. Work item tracking Microsoft ADO (number only): 24578930 How I did it Added quotes around numeric PCI devices in the pcie.yaml files of the following platforms: x86_64-mlnx_msn2700-r0 x86_64-mlnx_msn4600c-r0 How to verify it Install latest image after the merge and verify that syslogs are not flooded with PCI device mismatch errors --- device/mellanox/x86_64-mlnx_msn2700-r0/pcie.yaml | 2 +- device/mellanox/x86_64-mlnx_msn4600c-r0/pcie.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/pcie.yaml b/device/mellanox/x86_64-mlnx_msn2700-r0/pcie.yaml index 440afffc3256..74c796f94383 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/pcie.yaml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/pcie.yaml @@ -35,7 +35,7 @@ - bus: '00' dev: '01' fn: '2' - id: 0159 + id: '0159' name: 'PCI bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port (rev 09)' - bus: '00' diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/pcie.yaml b/device/mellanox/x86_64-mlnx_msn4600c-r0/pcie.yaml index 4356f48a250b..0ec69ca08c82 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/pcie.yaml +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/pcie.yaml @@ -154,7 +154,7 @@ - bus: '09' dev: '00' fn: '0' - id: 1533 + id: '1533' name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03)' - bus: 'ff' From ecc0f4c24381aa15ac8eeae51a76fc4b2ef022c1 Mon Sep 17 00:00:00 2001 From: mssonicbld Date: Wed, 19 Jul 2023 06:08:11 +0000 Subject: [PATCH 033/145] [ci/build]: Upgrade SONiC package versions --- .../versions-deb-bullseye | 1 - .../versions-deb-bullseye-arm64 | 2 ++ .../versions-py3-all-arm64 | 5 +++++ .../versions-py3-all-armhf | 1 + files/build/versions/default/versions-git | 6 +++--- files/build/versions/default/versions-mirror | 20 +++++++++---------- .../versions-deb-bullseye-arm64 | 2 +- .../versions-deb-bullseye-armhf | 2 +- .../versions-deb-bullseye | 2 +- .../docker-sonic-mgmt-framework/versions-py3 | 2 +- .../versions-deb-bullseye | 2 +- .../docker-sonic-vs/versions-deb-bullseye | 2 +- .../docker-syncd-bfn/versions-deb-bullseye | 2 +- .../versions-deb-bullseye | 2 +- .../versions-deb-bullseye | 2 +- .../versions-deb-bullseye | 2 +- .../docker-syncd-mlnx/versions-deb-bullseye | 2 +- .../versions-deb-bullseye | 12 +++++------ .../versions-deb-bullseye-arm64 | 4 ++-- .../versions-deb-bullseye-armhf | 6 +++--- .../versions/host-image/versions-deb-bullseye | 4 ++-- .../host-image/versions-deb-bullseye-arm64 | 2 +- .../host-image/versions-deb-bullseye-armhf | 2 +- 23 files changed, 47 insertions(+), 40 deletions(-) create mode 100644 files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye index 3798fe82e437..16122658e070 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye @@ -24,7 +24,6 @@ libsairedis==1.0.0 libsairedis-dev==1.0.0 libsaithrift-dev==0.9.4 libsaivs==1.0.0 -libsaivs-dev==1.0.0 libswsscommon==1.0.0 libswsscommon-dev==1.0.0 libtac-dev==1.4.1-1 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 index 3bad5a5352bd..90f712515be3 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye-arm64 @@ -1 +1,3 @@ +libnl-3-200==3.5.0-1 +libnl-route-3-200==3.5.0-1 linux-headers-5.10.0-18-2-arm64==5.10.140-1 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 new file mode 100644 index 000000000000..46df813bf748 --- /dev/null +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 @@ -0,0 +1,5 @@ +bcrypt==3.2.2 +bitarray==1.5.3 +click==7.0 +requests==2.31.0 +zipp==1.2.0 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf index cd01abdaf741..46df813bf748 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-armhf @@ -2,3 +2,4 @@ bcrypt==3.2.2 bitarray==1.5.3 click==7.0 requests==2.31.0 +zipp==1.2.0 diff --git a/files/build/versions/default/versions-git b/files/build/versions/default/versions-git index ed4a8affbee3..53dc40a21d41 100644 --- a/files/build/versions/default/versions-git +++ b/files/build/versions/default/versions-git @@ -1,11 +1,11 @@ -https://chromium.googlesource.com/chromium/tools/depot_tools.git==b389d031a263181c816b6609333a30bdecf4194b +https://chromium.googlesource.com/chromium/tools/depot_tools.git==a654ff36bb3dba91a3d4f1ac8a2c6e2055e1f2df https://github.com/aristanetworks/swi-tools.git==b5f087e4774168bf536360d43c9c509c8f14ad9f https://github.com/CESNET/libyang.git==ea94c8b9f513f8a6ddc6ce1540fa41eaf4c8922a https://github.com/daveolson53/audisp-tacplus.git==559c9f22edd4f2dea0ecedffb3ad9502b12a75b6 https://github.com/daveolson53/libnss-tacplus.git==19008ab68d9d504aa58eb34d5f564755a1613b8b https://github.com/dyninc/OpenBFDD.git==e35f43ad8d2b3f084e96a84c392528a90d05a287 -https://github.com/flashrom/flashrom.git==ea54723cf86b8c2f670371e93d66593acea0749e -https://github.com/FreeRADIUS/freeradius-server.git==661f794ec70f39825ad354276e399c51c382220d +https://github.com/flashrom/flashrom.git==e08899fcf4127de5cb2ad2dd134539d41f7e33b0 +https://github.com/FreeRADIUS/freeradius-server.git==54eb782f8b01c98a41208116e0f134a4c1564e4f https://github.com/FreeRADIUS/pam_radius.git==8d373539bb9f13b0abfe8bcae0095a930a00fad0 https://github.com/jeroennijhof/pam_tacplus.git==4284d9016e64def2bb81d5f50f96dc3b59bfdc39 https://github.com/jpirko/libteam.git==7cb5de8b01be132bd4150eff460bfd83296414b6 diff --git a/files/build/versions/default/versions-mirror b/files/build/versions/default/versions-mirror index 27925017b56d..7ab4e2dd81ec 100644 --- a/files/build/versions/default/versions-mirror +++ b/files/build/versions/default/versions-mirror @@ -1,15 +1,15 @@ deb.nodesource.com_node%5f14.x_dists_bullseye==2023-02-17T00:35:28Z deb.nodesource.com_node%5f14.x_dists_buster==2023-02-17T00:35:28Z -debian==20230716T000128Z -debian-security==20230716T000215Z +debian==20230718T000215Z +debian-security==20230718T000622Z download.docker.com_linux_debian_dists_bullseye==2023-07-07T20:10:57Z download.docker.com_linux_debian_dists_buster==2023-07-07T20:10:57Z packages.microsoft.com_repos_sonic-dev_dists_jessie==2022-10-31T19:34:29Z -packages.trafficmanager.net_snapshot_debian-security_20230716T000215Z_dists_bullseye-security==2023-07-14T23:42:45Z -packages.trafficmanager.net_snapshot_debian-security_20230716T000215Z_dists_buster_updates==2023-07-14T23:42:45Z -packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_bullseye==2023-06-10T08:52:21Z -packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_bullseye-backports==2023-07-15T20:35:32Z -packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_bullseye-updates==2023-07-15T20:35:32Z -packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_buster==2023-06-10T08:53:33Z -packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_buster-backports==2023-07-15T20:35:32Z -packages.trafficmanager.net_snapshot_debian_20230716T000128Z_dists_buster-updates==2023-06-10T08:55:10Z +packages.trafficmanager.net_snapshot_debian-security_20230718T000622Z_dists_bullseye-security==2023-07-17T13:53:30Z +packages.trafficmanager.net_snapshot_debian-security_20230718T000622Z_dists_buster_updates==2023-07-17T13:53:30Z +packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_bullseye==2023-06-10T08:52:21Z +packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_bullseye-backports==2023-07-17T20:24:12Z +packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_bullseye-updates==2023-07-17T20:24:12Z +packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_buster==2023-06-10T08:53:33Z +packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_buster-backports==2023-07-17T20:24:12Z +packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_buster-updates==2023-06-10T08:55:10Z diff --git a/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-arm64 b/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-arm64 index 956750587805..93aa4686b2cd 100644 --- a/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-arm64 +++ b/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-arm64 @@ -10,5 +10,5 @@ libxml2==2.9.10+dfsg-6.7+deb11u4 libxml2-dev==2.9.10+dfsg-6.7+deb11u4 libxslt1-dev==1.1.34-4+deb11u1 libxslt1.1==1.1.34-4+deb11u1 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 zlib1g-dev==1:1.2.11.dfsg-2+deb11u2 diff --git a/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-armhf b/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-armhf index 956750587805..93aa4686b2cd 100644 --- a/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-armhf +++ b/files/build/versions/dockers/docker-config-engine-bullseye/versions-deb-bullseye-armhf @@ -10,5 +10,5 @@ libxml2==2.9.10+dfsg-6.7+deb11u4 libxml2-dev==2.9.10+dfsg-6.7+deb11u4 libxslt1-dev==1.1.34-4+deb11u1 libxslt1.1==1.1.34-4+deb11u1 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 zlib1g-dev==1:1.2.11.dfsg-2+deb11u2 diff --git a/files/build/versions/dockers/docker-gbsyncd-broncos/versions-deb-bullseye b/files/build/versions/dockers/docker-gbsyncd-broncos/versions-deb-bullseye index d3cbca6be966..3eeffa6b2690 100644 --- a/files/build/versions/dockers/docker-gbsyncd-broncos/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-gbsyncd-broncos/versions-deb-bullseye @@ -29,7 +29,7 @@ libsource-highlight4v5==3.1.9-3+b1 libswsscommon-dbgsym==1.0.0 libtirpc-dev==1.3.1-1+deb11u1 libunwind8==1.3.2-2 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 openssh-client==1:8.4p1-5+deb11u1 sshpass==1.09-1+b1 strace==5.10-1 diff --git a/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 b/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 index b4530a1240e7..a43b8ebb7dfd 100644 --- a/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 +++ b/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 @@ -1,7 +1,7 @@ attrs==23.1.0 certifi==2017.4.17 charset-normalizer==3.2.0 -click==8.1.5 +click==8.1.6 clickclick==20.10.2 connexion==2.7.0 flask==2.2.5 diff --git a/files/build/versions/dockers/docker-sonic-telemetry/versions-deb-bullseye b/files/build/versions/dockers/docker-sonic-telemetry/versions-deb-bullseye index 8390c1ad927b..8712cc4d6618 100644 --- a/files/build/versions/dockers/docker-sonic-telemetry/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-sonic-telemetry/versions-deb-bullseye @@ -35,7 +35,7 @@ libtirpc-dev==1.3.1-1+deb11u1 libtsan0==10.2.1-6 libubsan1==10.2.1-6 libunwind8==1.3.2-2 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 openssh-client==1:8.4p1-5+deb11u1 sonic-gnmi==0.1 sonic-mgmt-common==1.0.0 diff --git a/files/build/versions/dockers/docker-sonic-vs/versions-deb-bullseye b/files/build/versions/dockers/docker-sonic-vs/versions-deb-bullseye index 3bba9a262312..bd6cb0114a26 100644 --- a/files/build/versions/dockers/docker-sonic-vs/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-sonic-vs/versions-deb-bullseye @@ -98,7 +98,7 @@ libxml2==2.9.10+dfsg-6.7+deb11u4 libxml2-dev==2.9.10+dfsg-6.7+deb11u4 libyang2==2.0.112-6 libzmq3-dev==4.3.4-1 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 logrotate==3.18.0-2+deb11u1 lsof==4.93.2+dfsg-1.1 mailcap==3.69 diff --git a/files/build/versions/dockers/docker-syncd-bfn/versions-deb-bullseye b/files/build/versions/dockers/docker-syncd-bfn/versions-deb-bullseye index 4b273e62a28a..cba5596e21ba 100644 --- a/files/build/versions/dockers/docker-syncd-bfn/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-syncd-bfn/versions-deb-bullseye @@ -24,6 +24,6 @@ libunwind-dev==1.3.2-2 libunwind8==1.3.2-2 libusb-1.0-0==2:1.0.24-3 libxml2==2.9.10+dfsg-6.7+deb11u4 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 pkg-config==0.29.2-1 syncd==1.0.0 diff --git a/files/build/versions/dockers/docker-syncd-brcm-dnx-rpc/versions-deb-bullseye b/files/build/versions/dockers/docker-syncd-brcm-dnx-rpc/versions-deb-bullseye index dcb8098d1bee..529c5c0b326a 100644 --- a/files/build/versions/dockers/docker-syncd-brcm-dnx-rpc/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-syncd-brcm-dnx-rpc/versions-deb-bullseye @@ -57,7 +57,7 @@ libtsan0==10.2.1-6 libubsan1==10.2.1-6 libuv1==1.40.0-2 libxml2==2.9.10+dfsg-6.7+deb11u4 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 mailcap==3.69 make==4.3-4.1 mime-support==3.66 diff --git a/files/build/versions/dockers/docker-syncd-brcm-rpc/versions-deb-bullseye b/files/build/versions/dockers/docker-syncd-brcm-rpc/versions-deb-bullseye index dcb8098d1bee..529c5c0b326a 100644 --- a/files/build/versions/dockers/docker-syncd-brcm-rpc/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-syncd-brcm-rpc/versions-deb-bullseye @@ -57,7 +57,7 @@ libtsan0==10.2.1-6 libubsan1==10.2.1-6 libuv1==1.40.0-2 libxml2==2.9.10+dfsg-6.7+deb11u4 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 mailcap==3.69 make==4.3-4.1 mime-support==3.66 diff --git a/files/build/versions/dockers/docker-syncd-centec-rpc/versions-deb-bullseye b/files/build/versions/dockers/docker-syncd-centec-rpc/versions-deb-bullseye index dcb8098d1bee..529c5c0b326a 100644 --- a/files/build/versions/dockers/docker-syncd-centec-rpc/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-syncd-centec-rpc/versions-deb-bullseye @@ -57,7 +57,7 @@ libtsan0==10.2.1-6 libubsan1==10.2.1-6 libuv1==1.40.0-2 libxml2==2.9.10+dfsg-6.7+deb11u4 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 mailcap==3.69 make==4.3-4.1 mime-support==3.66 diff --git a/files/build/versions/dockers/docker-syncd-mlnx/versions-deb-bullseye b/files/build/versions/dockers/docker-syncd-mlnx/versions-deb-bullseye index 92530838ec0e..bbcaf6ff5a01 100644 --- a/files/build/versions/dockers/docker-syncd-mlnx/versions-deb-bullseye +++ b/files/build/versions/dockers/docker-syncd-mlnx/versions-deb-bullseye @@ -40,7 +40,7 @@ libswsscommon-dbgsym==1.0.0 libtirpc-dev==1.3.1-1+deb11u1 libunwind8==1.3.2-2 libxml2==2.9.10+dfsg-6.7+deb11u4 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 mft==4.22.1-15 mlnx-sai==1.mlnx.SAIBuild2305.24.0.1 openssh-client==1:8.4p1-5+deb11u1 diff --git a/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye b/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye index 2a4aeca2a106..5a87a20b6da1 100644 --- a/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye +++ b/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye @@ -1397,12 +1397,12 @@ libzvbi0==0.2.35-18 libzzip-0-13==0.13.62-3.3+deb11u1 licensecheck==3.1.1-2 lintian==2.104.0 -linux-compiler-gcc-10-x86==5.10.179-1 -linux-headers-5.10.0-23-amd64==5.10.179-1 -linux-headers-5.10.0-23-common==5.10.179-1 -linux-headers-amd64==5.10.179-1 -linux-kbuild-5.10==5.10.179-1 -linux-libc-dev==5.10.179-1 +linux-compiler-gcc-10-x86==5.10.179-2 +linux-headers-5.10.0-23-amd64==5.10.179-2 +linux-headers-5.10.0-23-common==5.10.179-2 +linux-headers-amd64==5.10.179-2 +linux-kbuild-5.10==5.10.179-2 +linux-libc-dev==5.10.179-2 linuxdoc-tools==0.9.82-1 llvm-11==1:11.0.1-2 llvm-11-runtime==1:11.0.1-2 diff --git a/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-arm64 b/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-arm64 index 05ebfa8e9f35..78977dcfbdd5 100644 --- a/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-arm64 +++ b/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-arm64 @@ -18,6 +18,6 @@ libstdc++6-armhf-cross==10.2.1-6cross1 libubsan1-armhf-cross==10.2.1-6cross1 libunicode-linebreak-perl==0.0.20190101-1+b2 libxslt1-dev==1.1.34-4+deb11u1 -linux-headers-5.10.0-23-arm64==5.10.179-1 -linux-headers-arm64==5.10.179-1 +linux-headers-5.10.0-23-arm64==5.10.179-2 +linux-headers-arm64==5.10.179-2 nodejs==14.21.3-deb-1nodesource1 diff --git a/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-armhf b/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-armhf index 69454f7ebe94..b834957ecc26 100644 --- a/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-armhf +++ b/files/build/versions/dockers/sonic-slave-bullseye/versions-deb-bullseye-armhf @@ -7,8 +7,8 @@ libjpeg-dev==1:2.0.6-4 libjpeg62-turbo-dev==1:2.0.6-4 libunicode-linebreak-perl==0.0.20190101-1+b2 libxslt1-dev==1.1.34-4+deb11u1 -linux-compiler-gcc-10-arm==5.10.179-1 -linux-headers-5.10.0-23-armmp==5.10.179-1 -linux-headers-armmp==5.10.179-1 +linux-compiler-gcc-10-arm==5.10.179-2 +linux-headers-5.10.0-23-armmp==5.10.179-2 +linux-headers-armmp==5.10.179-2 nasm==2.15.05-1 nodejs==14.21.3-deb-1nodesource1 diff --git a/files/build/versions/host-image/versions-deb-bullseye b/files/build/versions/host-image/versions-deb-bullseye index 04dac275779c..d83dccb5d7ce 100644 --- a/files/build/versions/host-image/versions-deb-bullseye +++ b/files/build/versions/host-image/versions-deb-bullseye @@ -242,8 +242,8 @@ libyang-cpp==1.0.73 libzmq5==4.3.4-1 linux-base==4.6 linux-image-5.10.0-18-2-amd64-unsigned==5.10.140-1 -linux-perf==5.10.179-1 -linux-perf-5.10==5.10.179-1 +linux-perf==5.10.179-2 +linux-perf-5.10==5.10.179-2 locales==2.31-13+deb11u6 logrotate==3.18.0-2+deb11u1 lsb-release==11.1.0 diff --git a/files/build/versions/host-image/versions-deb-bullseye-arm64 b/files/build/versions/host-image/versions-deb-bullseye-arm64 index 2f85f0b7a89d..021ffd2b236f 100644 --- a/files/build/versions/host-image/versions-deb-bullseye-arm64 +++ b/files/build/versions/host-image/versions-deb-bullseye-arm64 @@ -13,7 +13,7 @@ libxml2-dev==2.9.10+dfsg-6.7+deb11u4 libxslt1-dev==1.1.34-4+deb11u1 libxslt1.1==1.1.34-4+deb11u1 linux-image-5.10.0-18-2-arm64-unsigned==5.10.140-1 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 ntpstat==0.0.0.1-2 picocom==3.1-2 tsingma-bsp==1.0 diff --git a/files/build/versions/host-image/versions-deb-bullseye-armhf b/files/build/versions/host-image/versions-deb-bullseye-armhf index b6819a1d40db..707f042f3170 100644 --- a/files/build/versions/host-image/versions-deb-bullseye-armhf +++ b/files/build/versions/host-image/versions-deb-bullseye-armhf @@ -14,7 +14,7 @@ libxml2-dev==2.9.10+dfsg-6.7+deb11u4 libxslt1-dev==1.1.34-4+deb11u1 libxslt1.1==1.1.34-4+deb11u1 linux-image-5.10.0-18-2-armmp==5.10.140-1 -linux-libc-dev==5.10.179-1 +linux-libc-dev==5.10.179-2 mrvlprestera==1.0 ntpstat==0.0.0.1-2 openssh-client==1:8.4p1-5+deb11u1 From c8ea7d26f390451b8ce8a95d5e3139b1d797db4c Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 20 Jul 2023 04:33:02 +0800 Subject: [PATCH 034/145] [submodule] Update submodule linkmgrd to the latest HEAD automatically (#15885) #### Why I did it src/linkmgrd ``` * 6e5cfda - (HEAD -> master, origin/master, origin/HEAD) Change common_libs dependencies from buster to bullseye (#212) (2 days ago) [Ze Gan] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index 4bda49bd71ac..6e5cfda88747 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 4bda49bd71acccb644293da662a9ac937ddd6e7a +Subproject commit 6e5cfda8874735e50c935e5f49268b3ae3be30dc From fea10546f298c20d6dc14a6b719ea9cdb1f31ea1 Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Wed, 19 Jul 2023 15:00:39 -0700 Subject: [PATCH 035/145] Update WRED profile on system ports (#15612) * Update WRED profile on system ports --- files/build_templates/qos_config.j2 | 61 + .../py2/qos-arista7800r3-48cq2-lc.json | 2766 ++++++++++++++-- .../py2/qos-arista7800r3-48cqm2-lc.json | 2766 ++++++++++++++-- .../py2/qos-arista7800r3a-36dm2-c36-lc.json | 2946 ++++++++++++++++- .../py2/qos-arista7800r3a-36dm2-d36-lc.json | 2745 ++++++++++++++- .../py2/qos-nokia-ixr7250e-36x100g.json | 2217 ++++++++++++- .../py2/qos-nokia-ixr7250e-36x400g.json | 1566 ++++++++- .../py3/qos-arista7800r3-48cq2-lc.json | 2766 ++++++++++++++-- .../py3/qos-arista7800r3-48cqm2-lc.json | 2766 ++++++++++++++-- .../py3/qos-arista7800r3a-36dm2-c36-lc.json | 2946 ++++++++++++++++- .../py3/qos-arista7800r3a-36dm2-d36-lc.json | 2745 ++++++++++++++- .../py3/qos-nokia-ixr7250e-36x100g.json | 2217 ++++++++++++- .../py3/qos-nokia-ixr7250e-36x400g.json | 1566 ++++++++- 13 files changed, 27653 insertions(+), 2420 deletions(-) diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index f9900714d829..44b13763632d 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -1,5 +1,24 @@ {%- set PORT_ALL = [] %} {%- set PORT_BP = [] %} +{%- set SYSTEM_PORT_ALL = [] %} + +{%- set voq_chassis = false %} +{%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost']['switch_type'] is defined and DEVICE_METADATA['localhost']['switch_type'] == 'voq' %} +{%- set voq_chassis = true %} +{%- endif -%} + +{%- if voq_chassis %} + {%- for system_port in SYSTEM_PORT %} + {% if '|' not in system_port %} + {%- set system_port_name = system_port|join("|") %} + {% else %} + {%- set system_port_name = system_port %} + {% endif %} + {%- if 'cpu' not in system_port_name.lower() and 'IB' not in system_port_name and 'Rec' not in system_port_name %} + {%- if SYSTEM_PORT_ALL.append(system_port_name) %}{%- endif %} + {%- endif %} + {%- endfor %} +{%- endif %} {%- for port in PORT %} {%- if not port.startswith('Ethernet-Rec') and not port.startswith('Ethernet-IB') %} {%- if PORT_ALL.append(port) %}{% endif %} @@ -307,7 +326,48 @@ } }, {% endif %} +{% if voq_chassis %} "QUEUE": { +{% for system_port in SYSTEM_PORT_ALL %} + "{{ system_port }}|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, +{% endfor %} +{% for system_port in SYSTEM_PORT_ALL %} + "{{ system_port }}|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, +{% endfor %} +{% for system_port in SYSTEM_PORT_ALL %} + "{{ system_port }}|0": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for system_port in SYSTEM_PORT_ALL %} + "{{ system_port }}|1": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for system_port in SYSTEM_PORT_ALL %} + "{{ system_port }}|2": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for system_port in SYSTEM_PORT_ALL %} + "{{ system_port }}|5": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for system_port in SYSTEM_PORT_ALL %} + "{{ system_port }}|6": { + "scheduler": "scheduler.0" + }{% if not loop.last %},{% endif %} +{% endfor %} + } +{% else %} + "QUEUE": { {% for port in PORT_ACTIVE %} "{{ port }}|3": { "scheduler" : "scheduler.1", @@ -372,4 +432,5 @@ {% endfor %} } +{% endif %} } diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json index 7aecbdbd90e5..1296b4e2b8fc 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json @@ -496,1040 +496,3174 @@ } }, "QUEUE": { - "Ethernet0|3": { + "dut-lc5|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|3": { + "dut-lc5|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "dut-lc3|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|3": { + "dut-lc3|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "dut-lc4|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|3": { + "dut-lc4|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "dut-lc4|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|3": { + "dut-lc3|Asic0|Ethernet4|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "dut-lc4|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|3": { + "dut-lc3|Asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "dut-lc3|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|3": { + "dut-lc3|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "dut-lc4|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|3": { + "dut-lc4|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "dut-lc5|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|3": { + "dut-lc4|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "dut-lc3|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|3": { + "dut-lc4|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "dut-lc3|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|3": { + "dut-lc3|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "dut-lc3|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|3": { + "dut-lc3|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "dut-lc3|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|3": { + "dut-lc4|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "dut-lc5|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|3": { + "dut-lc4|Asic0|Ethernet188|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "dut-lc5|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|3": { + "dut-lc4|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "dut-lc4|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|3": { + "dut-lc4|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "dut-lc3|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|3": { + "dut-lc4|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "dut-lc3|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|3": { + "dut-lc3|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "dut-lc4|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|3": { + "dut-lc4|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|3": { + "dut-lc4|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|3": { + "dut-lc5|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|3": { + "dut-lc5|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|3": { + "dut-lc4|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|3": { + "dut-lc5|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|3": { + "dut-lc4|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|3": { + "dut-lc4|Asic0|Ethernet172|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|3": { + "dut-lc5|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|3": { + "dut-lc4|Asic0|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "dut-lc5|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|4": { + "dut-lc4|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "dut-lc3|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|4": { + "dut-lc3|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "dut-lc4|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|4": { + "dut-lc3|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "dut-lc3|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|4": { + "dut-lc3|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "dut-lc3|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|4": { + "dut-lc3|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "dut-lc4|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|4": { + "dut-lc4|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "dut-lc4|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|4": { + "dut-lc5|Asic0|Ethernet180|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "dut-lc4|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|4": { + "dut-lc5|Asic0|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "dut-lc5|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|4": { + "dut-lc5|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "dut-lc5|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|4": { + "dut-lc4|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "dut-lc5|Asic0|Ethernet188|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|4": { + "dut-lc4|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "dut-lc5|Asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|4": { + "dut-lc5|Asic0|Ethernet28|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "dut-lc4|Asic0|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|4": { + "dut-lc3|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "dut-lc3|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|4": { + "dut-lc3|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "dut-lc4|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|4": { + "dut-lc4|Asic0|Ethernet180|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "dut-lc4|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|4": { + "dut-lc5|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "dut-lc3|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|4": { + "dut-lc4|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "dut-lc5|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|4": { + "dut-lc5|Asic0|Ethernet108|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|4": { + "dut-lc5|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|4": { + "dut-lc5|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|4": { + "dut-lc5|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|4": { + "dut-lc3|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|4": { + "dut-lc3|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|4": { + "dut-lc5|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|4": { + "dut-lc5|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|4": { + "dut-lc3|Asic0|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|4": { + "dut-lc5|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "dut-lc5|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet4|0": { + "dut-lc3|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "dut-lc3|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet12|0": { + "dut-lc3|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "dut-lc4|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet20|0": { + "dut-lc4|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "dut-lc5|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet28|0": { + "dut-lc4|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "dut-lc3|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet36|0": { + "dut-lc4|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "dut-lc3|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet44|0": { + "dut-lc3|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "dut-lc3|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet52|0": { + "dut-lc3|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "dut-lc3|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet60|0": { + "dut-lc4|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "dut-lc5|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet68|0": { + "dut-lc4|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "dut-lc5|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet76|0": { + "dut-lc4|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "dut-lc4|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet84|0": { + "dut-lc4|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "dut-lc3|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet92|0": { + "dut-lc4|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "dut-lc3|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet100|0": { + "dut-lc3|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "dut-lc4|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet108|0": { + "dut-lc4|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "dut-lc4|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet116|0": { + "dut-lc5|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "dut-lc5|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet124|0": { + "dut-lc4|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "dut-lc5|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet132|0": { + "dut-lc4|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "dut-lc4|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet140|0": { + "dut-lc5|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet144|0": { + "dut-lc4|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet148|0": { + "dut-lc5|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet152|0": { + "dut-lc4|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet156|0": { + "dut-lc3|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet164|0": { + "dut-lc3|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet176|0": { + "dut-lc4|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet180|0": { + "dut-lc3|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet184|0": { + "dut-lc3|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet188|0": { + "dut-lc3|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "dut-lc3|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet4|1": { + "dut-lc3|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "dut-lc4|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet12|1": { + "dut-lc4|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "dut-lc4|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet20|1": { + "dut-lc5|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "dut-lc4|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet28|1": { + "dut-lc5|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "dut-lc5|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet36|1": { + "dut-lc5|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "dut-lc5|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet44|1": { + "dut-lc4|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "dut-lc5|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet52|1": { + "dut-lc4|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "dut-lc5|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet60|1": { + "dut-lc5|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "dut-lc4|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet68|1": { + "dut-lc3|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "dut-lc3|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet76|1": { + "dut-lc3|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "dut-lc4|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet84|1": { + "dut-lc4|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "dut-lc4|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet92|1": { + "dut-lc5|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "dut-lc3|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet100|1": { + "dut-lc4|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "dut-lc5|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet108|1": { + "dut-lc5|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "dut-lc5|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet116|1": { + "dut-lc5|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "dut-lc5|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet124|1": { + "dut-lc3|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "dut-lc3|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet132|1": { + "dut-lc5|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "dut-lc5|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet140|1": { + "dut-lc3|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet144|1": { + "dut-lc5|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet148|1": { + "dut-lc5|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet152|1": { + "dut-lc3|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet156|1": { + "dut-lc3|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet164|1": { + "dut-lc5|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet176|1": { + "dut-lc5|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet180|1": { + "dut-lc4|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet184|1": { + "dut-lc5|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet188|1": { + "dut-lc5|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "dut-lc5|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet4|2": { + "dut-lc4|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "dut-lc3|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet12|2": { + "dut-lc3|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "dut-lc3|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet20|2": { + "dut-lc4|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "dut-lc4|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet28|2": { + "dut-lc5|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "dut-lc4|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet36|2": { + "dut-lc5|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "dut-lc5|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet44|2": { + "dut-lc4|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "dut-lc5|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet52|2": { + "dut-lc5|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "dut-lc3|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet60|2": { + "dut-lc5|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "dut-lc3|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet68|2": { + "dut-lc5|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "dut-lc4|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet76|2": { + "dut-lc4|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "dut-lc3|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet84|2": { + "dut-lc3|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "dut-lc5|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet92|2": { + "dut-lc3|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "dut-lc3|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet100|2": { + "dut-lc5|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "dut-lc3|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet108|2": { + "dut-lc5|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "dut-lc5|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet116|2": { + "dut-lc3|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "dut-lc5|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet124|2": { + "dut-lc3|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "dut-lc5|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet132|2": { + "dut-lc3|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "dut-lc5|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet140|2": { + "dut-lc3|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet144|2": { + "dut-lc5|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet148|2": { + "dut-lc4|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet152|2": { + "dut-lc4|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet156|2": { + "dut-lc3|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet164|2": { + "dut-lc4|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet176|2": { + "dut-lc3|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet180|2": { + "dut-lc4|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet184|2": { + "dut-lc4|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet188|2": { + "dut-lc4|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "dut-lc3|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet4|5": { + "dut-lc5|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "dut-lc5|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet12|5": { + "dut-lc3|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "dut-lc3|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet20|5": { + "dut-lc4|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "dut-lc4|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet28|5": { + "dut-lc4|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "dut-lc3|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet36|5": { + "dut-lc4|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "dut-lc3|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet44|5": { + "dut-lc3|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "dut-lc3|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet52|5": { + "dut-lc4|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "dut-lc4|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet60|5": { + "dut-lc5|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "dut-lc4|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet68|5": { + "dut-lc3|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "dut-lc4|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet76|5": { + "dut-lc3|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "dut-lc3|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet84|5": { + "dut-lc3|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "dut-lc3|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet92|5": { + "dut-lc3|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "dut-lc4|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet100|5": { + "dut-lc5|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "dut-lc4|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet108|5": { + "dut-lc5|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "dut-lc4|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet116|5": { + "dut-lc4|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "dut-lc4|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet124|5": { + "dut-lc3|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "dut-lc4|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet132|5": { + "dut-lc3|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "dut-lc3|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet140|5": { + "dut-lc4|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet144|5": { + "dut-lc4|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet148|5": { + "dut-lc4|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet152|5": { + "dut-lc5|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet156|5": { + "dut-lc5|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet164|5": { + "dut-lc4|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet176|5": { + "dut-lc5|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet180|5": { + "dut-lc4|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet184|5": { + "dut-lc4|Asic0|Ethernet172|5": { "scheduler": "scheduler.0" }, - "Ethernet188|5": { + "dut-lc5|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "dut-lc4|Asic0|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet4|6": { + "dut-lc5|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "dut-lc4|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet12|6": { + "dut-lc3|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "dut-lc3|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet20|6": { + "dut-lc4|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "dut-lc3|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet28|6": { + "dut-lc3|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "dut-lc3|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet36|6": { + "dut-lc3|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "dut-lc3|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet44|6": { + "dut-lc4|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "dut-lc4|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet52|6": { + "dut-lc4|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "dut-lc5|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet60|6": { + "dut-lc4|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "dut-lc5|Asic0|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet68|6": { + "dut-lc5|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "dut-lc5|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet76|6": { + "dut-lc5|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "dut-lc4|Asic0|Ethernet164|5": { "scheduler": "scheduler.0" }, - "Ethernet84|6": { + "dut-lc5|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "dut-lc4|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet92|6": { + "dut-lc5|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "dut-lc5|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet100|6": { + "dut-lc4|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "dut-lc3|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet108|6": { + "dut-lc3|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "dut-lc3|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet116|6": { + "dut-lc4|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "dut-lc4|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet124|6": { + "dut-lc4|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "dut-lc5|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet132|6": { + "dut-lc3|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "dut-lc4|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet140|6": { + "dut-lc5|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet144|6": { + "dut-lc5|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet148|6": { + "dut-lc5|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet152|6": { + "dut-lc5|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet156|6": { + "dut-lc5|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet164|6": { + "dut-lc3|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet176|6": { + "dut-lc3|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet180|6": { + "dut-lc5|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet184|6": { + "dut-lc5|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet188|6": { + "dut-lc3|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" - } + }, + "dut-lc5|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cqm2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cqm2-lc.json index 7aecbdbd90e5..1296b4e2b8fc 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cqm2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cqm2-lc.json @@ -496,1040 +496,3174 @@ } }, "QUEUE": { - "Ethernet0|3": { + "dut-lc5|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|3": { + "dut-lc5|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "dut-lc3|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|3": { + "dut-lc3|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "dut-lc4|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|3": { + "dut-lc4|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "dut-lc4|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|3": { + "dut-lc3|Asic0|Ethernet4|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "dut-lc4|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|3": { + "dut-lc3|Asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "dut-lc3|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|3": { + "dut-lc3|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "dut-lc4|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|3": { + "dut-lc4|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "dut-lc5|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|3": { + "dut-lc4|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "dut-lc3|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|3": { + "dut-lc4|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "dut-lc3|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|3": { + "dut-lc3|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "dut-lc3|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|3": { + "dut-lc3|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "dut-lc3|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|3": { + "dut-lc4|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "dut-lc5|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|3": { + "dut-lc4|Asic0|Ethernet188|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "dut-lc5|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|3": { + "dut-lc4|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "dut-lc4|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|3": { + "dut-lc4|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "dut-lc3|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|3": { + "dut-lc4|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "dut-lc3|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|3": { + "dut-lc3|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "dut-lc4|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|3": { + "dut-lc4|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|3": { + "dut-lc4|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|3": { + "dut-lc5|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|3": { + "dut-lc5|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|3": { + "dut-lc4|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|3": { + "dut-lc5|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|3": { + "dut-lc4|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|3": { + "dut-lc4|Asic0|Ethernet172|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|3": { + "dut-lc5|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|3": { + "dut-lc4|Asic0|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "dut-lc5|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|4": { + "dut-lc4|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "dut-lc3|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|4": { + "dut-lc3|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "dut-lc4|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|4": { + "dut-lc3|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "dut-lc3|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|4": { + "dut-lc3|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "dut-lc3|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|4": { + "dut-lc3|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "dut-lc4|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|4": { + "dut-lc4|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "dut-lc4|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|4": { + "dut-lc5|Asic0|Ethernet180|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "dut-lc4|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|4": { + "dut-lc5|Asic0|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "dut-lc5|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|4": { + "dut-lc5|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "dut-lc5|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|4": { + "dut-lc4|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "dut-lc5|Asic0|Ethernet188|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|4": { + "dut-lc4|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "dut-lc5|Asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|4": { + "dut-lc5|Asic0|Ethernet28|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "dut-lc4|Asic0|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|4": { + "dut-lc3|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "dut-lc3|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|4": { + "dut-lc3|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "dut-lc4|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|4": { + "dut-lc4|Asic0|Ethernet180|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "dut-lc4|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|4": { + "dut-lc5|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "dut-lc3|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|4": { + "dut-lc4|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "dut-lc5|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|4": { + "dut-lc5|Asic0|Ethernet108|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|4": { + "dut-lc5|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|4": { + "dut-lc5|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|4": { + "dut-lc5|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|4": { + "dut-lc3|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|4": { + "dut-lc3|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|4": { + "dut-lc5|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|4": { + "dut-lc5|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|4": { + "dut-lc3|Asic0|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|4": { + "dut-lc5|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "dut-lc5|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet4|0": { + "dut-lc3|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "dut-lc3|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet12|0": { + "dut-lc3|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "dut-lc4|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet20|0": { + "dut-lc4|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "dut-lc5|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet28|0": { + "dut-lc4|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "dut-lc3|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet36|0": { + "dut-lc4|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "dut-lc3|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet44|0": { + "dut-lc3|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "dut-lc3|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet52|0": { + "dut-lc3|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "dut-lc3|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet60|0": { + "dut-lc4|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "dut-lc5|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet68|0": { + "dut-lc4|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "dut-lc5|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet76|0": { + "dut-lc4|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "dut-lc4|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet84|0": { + "dut-lc4|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "dut-lc3|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet92|0": { + "dut-lc4|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "dut-lc3|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet100|0": { + "dut-lc3|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "dut-lc4|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet108|0": { + "dut-lc4|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "dut-lc4|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet116|0": { + "dut-lc5|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "dut-lc5|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet124|0": { + "dut-lc4|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "dut-lc5|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet132|0": { + "dut-lc4|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "dut-lc4|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet140|0": { + "dut-lc5|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet144|0": { + "dut-lc4|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet148|0": { + "dut-lc5|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet152|0": { + "dut-lc4|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet156|0": { + "dut-lc3|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet164|0": { + "dut-lc3|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet176|0": { + "dut-lc4|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet180|0": { + "dut-lc3|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet184|0": { + "dut-lc3|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet188|0": { + "dut-lc3|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "dut-lc3|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet4|1": { + "dut-lc3|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "dut-lc4|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet12|1": { + "dut-lc4|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "dut-lc4|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet20|1": { + "dut-lc5|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "dut-lc4|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet28|1": { + "dut-lc5|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "dut-lc5|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet36|1": { + "dut-lc5|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "dut-lc5|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet44|1": { + "dut-lc4|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "dut-lc5|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet52|1": { + "dut-lc4|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "dut-lc5|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet60|1": { + "dut-lc5|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "dut-lc4|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet68|1": { + "dut-lc3|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "dut-lc3|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet76|1": { + "dut-lc3|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "dut-lc4|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet84|1": { + "dut-lc4|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "dut-lc4|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet92|1": { + "dut-lc5|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "dut-lc3|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet100|1": { + "dut-lc4|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "dut-lc5|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet108|1": { + "dut-lc5|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "dut-lc5|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet116|1": { + "dut-lc5|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "dut-lc5|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet124|1": { + "dut-lc3|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "dut-lc3|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet132|1": { + "dut-lc5|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "dut-lc5|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet140|1": { + "dut-lc3|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet144|1": { + "dut-lc5|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet148|1": { + "dut-lc5|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet152|1": { + "dut-lc3|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet156|1": { + "dut-lc3|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet164|1": { + "dut-lc5|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet176|1": { + "dut-lc5|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet180|1": { + "dut-lc4|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet184|1": { + "dut-lc5|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet188|1": { + "dut-lc5|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "dut-lc5|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet4|2": { + "dut-lc4|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "dut-lc3|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet12|2": { + "dut-lc3|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "dut-lc3|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet20|2": { + "dut-lc4|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "dut-lc4|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet28|2": { + "dut-lc5|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "dut-lc4|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet36|2": { + "dut-lc5|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "dut-lc5|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet44|2": { + "dut-lc4|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "dut-lc5|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet52|2": { + "dut-lc5|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "dut-lc3|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet60|2": { + "dut-lc5|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "dut-lc3|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet68|2": { + "dut-lc5|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "dut-lc4|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet76|2": { + "dut-lc4|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "dut-lc3|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet84|2": { + "dut-lc3|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "dut-lc5|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet92|2": { + "dut-lc3|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "dut-lc3|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet100|2": { + "dut-lc5|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "dut-lc3|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet108|2": { + "dut-lc5|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "dut-lc5|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet116|2": { + "dut-lc3|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "dut-lc5|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet124|2": { + "dut-lc3|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "dut-lc5|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet132|2": { + "dut-lc3|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "dut-lc5|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet140|2": { + "dut-lc3|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet144|2": { + "dut-lc5|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet148|2": { + "dut-lc4|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet152|2": { + "dut-lc4|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet156|2": { + "dut-lc3|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet164|2": { + "dut-lc4|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet176|2": { + "dut-lc3|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet180|2": { + "dut-lc4|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet184|2": { + "dut-lc4|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet188|2": { + "dut-lc4|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "dut-lc3|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet4|5": { + "dut-lc5|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "dut-lc5|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet12|5": { + "dut-lc3|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "dut-lc3|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet20|5": { + "dut-lc4|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "dut-lc4|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet28|5": { + "dut-lc4|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "dut-lc3|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet36|5": { + "dut-lc4|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "dut-lc3|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet44|5": { + "dut-lc3|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "dut-lc3|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet52|5": { + "dut-lc4|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "dut-lc4|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet60|5": { + "dut-lc5|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "dut-lc4|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet68|5": { + "dut-lc3|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "dut-lc4|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet76|5": { + "dut-lc3|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "dut-lc3|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet84|5": { + "dut-lc3|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "dut-lc3|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet92|5": { + "dut-lc3|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "dut-lc4|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet100|5": { + "dut-lc5|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "dut-lc4|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet108|5": { + "dut-lc5|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "dut-lc4|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet116|5": { + "dut-lc4|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "dut-lc4|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet124|5": { + "dut-lc3|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "dut-lc4|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet132|5": { + "dut-lc3|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "dut-lc3|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet140|5": { + "dut-lc4|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet144|5": { + "dut-lc4|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet148|5": { + "dut-lc4|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet152|5": { + "dut-lc5|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet156|5": { + "dut-lc5|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet164|5": { + "dut-lc4|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet176|5": { + "dut-lc5|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet180|5": { + "dut-lc4|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet184|5": { + "dut-lc4|Asic0|Ethernet172|5": { "scheduler": "scheduler.0" }, - "Ethernet188|5": { + "dut-lc5|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "dut-lc4|Asic0|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet4|6": { + "dut-lc5|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "dut-lc4|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet12|6": { + "dut-lc3|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "dut-lc3|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet20|6": { + "dut-lc4|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "dut-lc3|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet28|6": { + "dut-lc3|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "dut-lc3|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet36|6": { + "dut-lc3|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "dut-lc3|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet44|6": { + "dut-lc4|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "dut-lc4|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet52|6": { + "dut-lc4|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "dut-lc5|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet60|6": { + "dut-lc4|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "dut-lc5|Asic0|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet68|6": { + "dut-lc5|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "dut-lc5|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet76|6": { + "dut-lc5|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "dut-lc4|Asic0|Ethernet164|5": { "scheduler": "scheduler.0" }, - "Ethernet84|6": { + "dut-lc5|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "dut-lc4|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet92|6": { + "dut-lc5|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "dut-lc5|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet100|6": { + "dut-lc4|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "dut-lc3|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet108|6": { + "dut-lc3|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "dut-lc3|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet116|6": { + "dut-lc4|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "dut-lc4|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet124|6": { + "dut-lc4|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "dut-lc5|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet132|6": { + "dut-lc3|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "dut-lc4|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet140|6": { + "dut-lc5|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet144|6": { + "dut-lc5|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet148|6": { + "dut-lc5|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet152|6": { + "dut-lc5|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet156|6": { + "dut-lc5|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet164|6": { + "dut-lc3|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet176|6": { + "dut-lc3|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet180|6": { + "dut-lc5|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet184|6": { + "dut-lc5|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet188|6": { + "dut-lc3|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" - } + }, + "dut-lc5|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-c36-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-c36-lc.json index cf6fbf64f8db..1007b272c466 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-c36-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-c36-lc.json @@ -280,418 +280,3040 @@ } }, "QUEUE": { - "Ethernet0|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc3-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet48|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet56|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet64|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet72|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet80|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet88|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet96|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet104|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet112|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet192|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet200|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet208|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet216|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet224|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet232|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet240|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet248|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet256|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet264|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet272|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet280|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet48|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet52|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet56|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet60|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet64|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet68|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet72|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet76|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet80|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet84|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet88|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet92|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet96|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet100|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet104|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet108|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet112|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet116|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "str2-7804-lc7-1|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet120|0": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|1": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|6": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|0": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|1": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet124|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|6": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|0": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|1": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|6": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "str2-7804-lc7-1|Asic0|Ethernet132|0": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "str2-7804-lc7-1|Asic0|Ethernet132|1": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "str2-7804-lc7-1|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "str2-7804-lc7-1|Asic0|Ethernet132|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet132|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "str2-7804-lc7-1|Asic0|Ethernet132|6": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|0": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|1": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|6": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|0": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|1": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet140|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|6": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|0": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|1": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|6": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "str2-7804-lc7-1|Asic0|Ethernet148|0": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|1": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet148|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|6": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|0": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|1": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|6": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|0": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|1": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet156|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|6": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|0": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|1": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "str2-7804-lc7-1|Asic0|Ethernet160|6": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|0": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|1": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet164|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet164|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|6": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|0": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|1": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|6": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|0": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|1": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet172|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet172|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|6": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "str2-7804-lc7-1|Asic0|Ethernet176|0": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "str2-7804-lc7-1|Asic0|Ethernet176|1": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "str2-7804-lc7-1|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "str2-7804-lc7-1|Asic0|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "str2-7804-lc7-1|Asic0|Ethernet176|6": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|0": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|1": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet180|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|6": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|0": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|1": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|6": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|0": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|1": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet188|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|6": { "scheduler": "scheduler.0" } } diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-d36-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-d36-lc.json index cf6fbf64f8db..d66ef4f84a37 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-d36-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3a-36dm2-d36-lc.json @@ -280,419 +280,2910 @@ } }, "QUEUE": { - "Ethernet0|3": { + "str3-7800-lc1-1|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "str3-7800-lc2-1|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "str3-7800-lc1-1|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "str3-7800-lc2-1|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "str3-7800-lc1-1|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "str3-7800-lc2-1|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "str3-7800-lc1-1|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "str3-7800-lc1-1|Asic0|Ethernet108|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "str3-7800-lc2-1|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "str3-7800-lc8-1|asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "str3-7800-lc8-1|asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "str3-7800-lc1-1|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "str3-7800-lc2-1|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "str3-7800-lc8-1|asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "str3-7800-lc2-1|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "str3-7800-lc8-1|asic1|Ethernet200|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "str3-7800-lc8-1|asic1|Ethernet224|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "str3-7800-lc8-1|asic1|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "str3-7800-lc1-1|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "str3-7800-lc1-1|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "str3-7800-lc1-1|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "str3-7800-lc1-1|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "str3-7800-lc1-1|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "str3-7800-lc8-1|asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "str3-7800-lc2-1|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "str3-7800-lc2-1|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "str3-7800-lc2-1|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "str3-7800-lc8-1|asic1|Ethernet232|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "str3-7800-lc2-1|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "str3-7800-lc1-1|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "str3-7800-lc1-1|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "str3-7800-lc2-1|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "str3-7800-lc2-1|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "str3-7800-lc8-1|asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "str3-7800-lc2-1|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "str3-7800-lc1-1|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "str3-7800-lc2-1|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet256|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet264|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet272|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet280|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "str3-7800-lc8-1|asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "str3-7800-lc1-1|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "str3-7800-lc1-1|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "str3-7800-lc1-1|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "str3-7800-lc1-1|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "str3-7800-lc2-1|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "str3-7800-lc8-1|asic1|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "str3-7800-lc2-1|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "str3-7800-lc2-1|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "str3-7800-lc8-1|asic1|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "str3-7800-lc2-1|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "str3-7800-lc1-1|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "str3-7800-lc1-1|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "str3-7800-lc1-1|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "str3-7800-lc1-1|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "str3-7800-lc8-1|asic1|Ethernet192|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "str3-7800-lc8-1|asic1|Ethernet216|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "str3-7800-lc8-1|asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "str3-7800-lc1-1|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "str3-7800-lc2-1|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "str3-7800-lc1-1|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "str3-7800-lc2-1|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "str3-7800-lc1-1|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "str3-7800-lc2-1|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "str3-7800-lc1-1|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "str3-7800-lc1-1|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "str3-7800-lc2-1|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "str3-7800-lc8-1|asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "str3-7800-lc8-1|asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "str3-7800-lc1-1|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "str3-7800-lc2-1|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "str3-7800-lc8-1|asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "str3-7800-lc2-1|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "str3-7800-lc8-1|asic1|Ethernet200|5": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "str3-7800-lc8-1|asic1|Ethernet224|5": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "str3-7800-lc8-1|asic1|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "str3-7800-lc1-1|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "str3-7800-lc1-1|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "str3-7800-lc1-1|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "str3-7800-lc1-1|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "str3-7800-lc1-1|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "str3-7800-lc8-1|asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "str3-7800-lc2-1|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "str3-7800-lc2-1|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "str3-7800-lc2-1|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "str3-7800-lc8-1|asic1|Ethernet232|5": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "str3-7800-lc2-1|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "str3-7800-lc1-1|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "str3-7800-lc1-1|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "str3-7800-lc2-1|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "str3-7800-lc2-1|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "str3-7800-lc8-1|asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "str3-7800-lc2-1|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "str3-7800-lc1-1|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "str3-7800-lc2-1|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "str3-7800-lc8-1|asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "str3-7800-lc1-1|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "str3-7800-lc1-1|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "str3-7800-lc8-1|asic1|Ethernet248|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "str3-7800-lc1-1|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "str3-7800-lc8-1|asic1|Ethernet240|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "str3-7800-lc2-1|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "str3-7800-lc2-1|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "str3-7800-lc2-1|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "str3-7800-lc2-1|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "str3-7800-lc2-1|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "str3-7800-lc8-1|asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "str3-7800-lc1-1|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "str3-7800-lc1-1|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "str3-7800-lc1-1|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "str3-7800-lc8-1|asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "str3-7800-lc1-1|Asic0|Ethernet20|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "str3-7800-lc8-1|asic1|Ethernet256|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "str3-7800-lc8-1|asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "str3-7800-lc1-1|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "str3-7800-lc8-1|asic1|Ethernet208|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "str3-7800-lc8-1|asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "str3-7800-lc2-1|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "str3-7800-lc8-1|asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "str3-7800-lc2-1|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "str3-7800-lc1-1|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "str3-7800-lc2-1|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "str3-7800-lc8-1|asic1|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "str3-7800-lc8-1|asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "str3-7800-lc2-1|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "str3-7800-lc8-1|asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "str3-7800-lc2-1|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "str3-7800-lc8-1|asic1|Ethernet264|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "str3-7800-lc1-1|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" - } + }, + "str3-7800-lc2-1|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x100g.json b/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x100g.json index cf6fbf64f8db..cff51028497c 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x100g.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x100g.json @@ -280,419 +280,2382 @@ } }, "QUEUE": { - "Ethernet0|3": { + "svcstr-7250-lc2-1|asic1|Ethernet248|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "svcstr-7250-lc3-1|asic1|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "svcstr-7250-lc2-1|asic1|Ethernet240|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "svcstr-7250-lc1-1|asic1|Ethernet280|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "svcstr-7250-lc3-1|asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "svcstr-7250-lc2-1|asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "svcstr-7250-lc3-1|asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "svcstr-7250-lc1-1|asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "svcstr-7250-lc2-1|asic1|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "svcstr-7250-lc1-1|asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "svcstr-7250-lc2-1|asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "svcstr-7250-lc1-1|asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "svcstr-7250-lc1-1|asic1|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "svcstr-7250-lc3-1|asic1|Ethernet240|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "svcstr-7250-lc3-1|asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "svcstr-7250-lc3-1|asic1|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "svcstr-7250-lc1-1|asic1|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "svcstr-7250-lc2-1|asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "svcstr-7250-lc3-1|asic1|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "svcstr-7250-lc2-1|asic1|Ethernet256|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "svcstr-7250-lc3-1|asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "svcstr-7250-lc2-1|asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "svcstr-7250-lc1-1|asic1|Ethernet272|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "svcstr-7250-lc2-1|asic1|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "svcstr-7250-lc2-1|asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "svcstr-7250-lc1-1|asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "svcstr-7250-lc2-1|asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "svcstr-7250-lc3-1|asic1|Ethernet272|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "svcstr-7250-lc1-1|asic1|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "svcstr-7250-lc2-1|asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "svcstr-7250-lc2-1|asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "svcstr-7250-lc3-1|asic1|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "svcstr-7250-lc2-1|asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "svcstr-7250-lc3-1|asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "svcstr-7250-lc2-1|asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "svcstr-7250-lc2-1|asic1|Ethernet224|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "svcstr-7250-lc1-1|asic1|Ethernet264|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "svcstr-7250-lc3-1|asic1|Ethernet208|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "svcstr-7250-lc3-1|asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "svcstr-7250-lc3-1|asic1|Ethernet200|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "svcstr-7250-lc1-1|asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "svcstr-7250-lc3-1|asic1|Ethernet280|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "svcstr-7250-lc2-1|asic1|Ethernet208|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "svcstr-7250-lc2-1|asic1|Ethernet200|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "svcstr-7250-lc2-1|asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "svcstr-7250-lc1-1|asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "svcstr-7250-lc1-1|asic1|Ethernet248|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "svcstr-7250-lc1-1|asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "svcstr-7250-lc1-1|asic1|Ethernet240|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "svcstr-7250-lc3-1|asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "svcstr-7250-lc3-1|asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "svcstr-7250-lc2-1|asic1|Ethernet216|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "svcstr-7250-lc2-1|asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "svcstr-7250-lc3-1|asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "svcstr-7250-lc3-1|asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "svcstr-7250-lc2-1|asic1|Ethernet192|2": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "svcstr-7250-lc2-1|asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "svcstr-7250-lc3-1|asic1|Ethernet232|2": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "svcstr-7250-lc1-1|asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "svcstr-7250-lc3-1|asic1|Ethernet248|2": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "svcstr-7250-lc1-1|asic1|Ethernet232|2": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "svcstr-7250-lc2-1|asic1|Ethernet264|2": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "svcstr-7250-lc2-1|asic1|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "svcstr-7250-lc3-1|asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "svcstr-7250-lc1-1|asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "svcstr-7250-lc3-1|asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "svcstr-7250-lc3-1|asic1|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "svcstr-7250-lc1-1|asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "svcstr-7250-lc1-1|asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "svcstr-7250-lc2-1|asic1|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "svcstr-7250-lc2-1|asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "svcstr-7250-lc1-1|asic1|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "svcstr-7250-lc3-1|asic1|Ethernet224|2": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "svcstr-7250-lc1-1|asic1|Ethernet192|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "svcstr-7250-lc1-1|asic1|Ethernet224|2": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "svcstr-7250-lc1-1|asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "svcstr-7250-lc2-1|asic1|Ethernet272|2": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "svcstr-7250-lc3-1|asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "svcstr-7250-lc3-1|asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "svcstr-7250-lc1-1|asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "svcstr-7250-lc3-1|asic1|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "svcstr-7250-lc2-1|asic1|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "svcstr-7250-lc3-1|asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "svcstr-7250-lc1-1|asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "svcstr-7250-lc2-1|asic1|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "svcstr-7250-lc3-1|asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "svcstr-7250-lc2-1|asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "svcstr-7250-lc3-1|asic1|Ethernet256|2": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "svcstr-7250-lc3-1|asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "svcstr-7250-lc1-1|asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "svcstr-7250-lc1-1|asic1|Ethernet216|2": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "svcstr-7250-lc2-1|asic1|Ethernet248|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "svcstr-7250-lc3-1|asic1|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "svcstr-7250-lc2-1|asic1|Ethernet240|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "svcstr-7250-lc1-1|asic1|Ethernet280|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "svcstr-7250-lc3-1|asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "svcstr-7250-lc2-1|asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "svcstr-7250-lc3-1|asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "svcstr-7250-lc1-1|asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "svcstr-7250-lc2-1|asic1|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "svcstr-7250-lc1-1|asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "svcstr-7250-lc2-1|asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "svcstr-7250-lc1-1|asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "svcstr-7250-lc1-1|asic1|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "svcstr-7250-lc3-1|asic1|Ethernet240|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "svcstr-7250-lc3-1|asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "svcstr-7250-lc3-1|asic1|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "svcstr-7250-lc1-1|asic1|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "svcstr-7250-lc2-1|asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "svcstr-7250-lc3-1|asic1|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "svcstr-7250-lc2-1|asic1|Ethernet256|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "svcstr-7250-lc3-1|asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "svcstr-7250-lc2-1|asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "svcstr-7250-lc1-1|asic1|Ethernet272|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "svcstr-7250-lc2-1|asic1|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "svcstr-7250-lc2-1|asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "svcstr-7250-lc1-1|asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "svcstr-7250-lc2-1|asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "svcstr-7250-lc3-1|asic1|Ethernet272|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "svcstr-7250-lc1-1|asic1|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "svcstr-7250-lc2-1|asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "svcstr-7250-lc2-1|asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "svcstr-7250-lc3-1|asic1|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "svcstr-7250-lc2-1|asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "svcstr-7250-lc3-1|asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "svcstr-7250-lc2-1|asic0|Ethernet0|5": { "scheduler": "scheduler.0" - } + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x400g.json b/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x400g.json index cf6fbf64f8db..5a5badc9d369 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x400g.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-nokia-ixr7250e-36x400g.json @@ -280,418 +280,1660 @@ } }, "QUEUE": { - "Ethernet0|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc1-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet48|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet56|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet64|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet72|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet80|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet88|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet96|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet104|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet112|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet192|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet200|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet208|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet216|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet224|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet232|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet240|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet248|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet256|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet264|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet272|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet280|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet0|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet8|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet16|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet24|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet32|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet40|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet48|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet56|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet64|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet72|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet80|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet88|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet96|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet104|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet112|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet120|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet128|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet136|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "str2-7250-lc2-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic1|Ethernet144|0": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "str2-7250-lc2-1|asic1|Ethernet144|1": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "str2-7250-lc2-1|asic1|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "str2-7250-lc2-1|asic1|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "str2-7250-lc2-1|asic1|Ethernet144|6": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "str2-7250-lc2-1|asic1|Ethernet152|0": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "str2-7250-lc2-1|asic1|Ethernet152|1": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "str2-7250-lc2-1|asic1|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "str2-7250-lc2-1|asic1|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "str2-7250-lc2-1|asic1|Ethernet152|6": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "str2-7250-lc2-1|asic1|Ethernet160|0": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "str2-7250-lc2-1|asic1|Ethernet160|1": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "str2-7250-lc2-1|asic1|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "str2-7250-lc2-1|asic1|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "str2-7250-lc2-1|asic1|Ethernet160|6": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "str2-7250-lc2-1|asic1|Ethernet168|0": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "str2-7250-lc2-1|asic1|Ethernet168|1": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "str2-7250-lc2-1|asic1|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "str2-7250-lc2-1|asic1|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "str2-7250-lc2-1|asic1|Ethernet168|6": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "str2-7250-lc2-1|asic1|Ethernet176|0": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "str2-7250-lc2-1|asic1|Ethernet176|1": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "str2-7250-lc2-1|asic1|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "str2-7250-lc2-1|asic1|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "str2-7250-lc2-1|asic1|Ethernet176|6": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "str2-7250-lc2-1|asic1|Ethernet184|0": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "str2-7250-lc2-1|asic1|Ethernet184|1": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "str2-7250-lc2-1|asic1|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "str2-7250-lc2-1|asic1|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "str2-7250-lc2-1|asic1|Ethernet184|6": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "str2-7250-lc2-1|asic1|Ethernet192|0": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "str2-7250-lc2-1|asic1|Ethernet192|1": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "str2-7250-lc2-1|asic1|Ethernet192|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "str2-7250-lc2-1|asic1|Ethernet192|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet192|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet192|5": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "str2-7250-lc2-1|asic1|Ethernet192|6": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "str2-7250-lc2-1|asic1|Ethernet200|0": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "str2-7250-lc2-1|asic1|Ethernet200|1": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "str2-7250-lc2-1|asic1|Ethernet200|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "str2-7250-lc2-1|asic1|Ethernet200|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet200|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet200|5": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "str2-7250-lc2-1|asic1|Ethernet200|6": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "str2-7250-lc2-1|asic1|Ethernet208|0": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "str2-7250-lc2-1|asic1|Ethernet208|1": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "str2-7250-lc2-1|asic1|Ethernet208|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "str2-7250-lc2-1|asic1|Ethernet208|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet208|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet208|5": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "str2-7250-lc2-1|asic1|Ethernet208|6": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "str2-7250-lc2-1|asic1|Ethernet216|0": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "str2-7250-lc2-1|asic1|Ethernet216|1": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "str2-7250-lc2-1|asic1|Ethernet216|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "str2-7250-lc2-1|asic1|Ethernet216|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet216|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet216|5": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "str2-7250-lc2-1|asic1|Ethernet216|6": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "str2-7250-lc2-1|asic1|Ethernet224|0": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "str2-7250-lc2-1|asic1|Ethernet224|1": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "str2-7250-lc2-1|asic1|Ethernet224|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "str2-7250-lc2-1|asic1|Ethernet224|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet224|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet224|5": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "str2-7250-lc2-1|asic1|Ethernet224|6": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "str2-7250-lc2-1|asic1|Ethernet232|0": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "str2-7250-lc2-1|asic1|Ethernet232|1": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "str2-7250-lc2-1|asic1|Ethernet232|2": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "str2-7250-lc2-1|asic1|Ethernet232|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet232|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet232|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "str2-7250-lc2-1|asic1|Ethernet232|6": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "str2-7250-lc2-1|asic1|Ethernet240|0": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "str2-7250-lc2-1|asic1|Ethernet240|1": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "str2-7250-lc2-1|asic1|Ethernet240|2": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "str2-7250-lc2-1|asic1|Ethernet240|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet240|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet240|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "str2-7250-lc2-1|asic1|Ethernet240|6": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "str2-7250-lc2-1|asic1|Ethernet248|0": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "str2-7250-lc2-1|asic1|Ethernet248|1": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "str2-7250-lc2-1|asic1|Ethernet248|2": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "str2-7250-lc2-1|asic1|Ethernet248|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet248|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet248|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "str2-7250-lc2-1|asic1|Ethernet248|6": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "str2-7250-lc2-1|asic1|Ethernet256|0": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "str2-7250-lc2-1|asic1|Ethernet256|1": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "str2-7250-lc2-1|asic1|Ethernet256|2": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "str2-7250-lc2-1|asic1|Ethernet256|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet256|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet256|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "str2-7250-lc2-1|asic1|Ethernet256|6": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "str2-7250-lc2-1|asic1|Ethernet264|0": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "str2-7250-lc2-1|asic1|Ethernet264|1": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "str2-7250-lc2-1|asic1|Ethernet264|2": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "str2-7250-lc2-1|asic1|Ethernet264|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet264|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet264|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "str2-7250-lc2-1|asic1|Ethernet264|6": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "str2-7250-lc2-1|asic1|Ethernet272|0": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "str2-7250-lc2-1|asic1|Ethernet272|1": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "str2-7250-lc2-1|asic1|Ethernet272|2": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "str2-7250-lc2-1|asic1|Ethernet272|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet272|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet272|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "str2-7250-lc2-1|asic1|Ethernet272|6": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "str2-7250-lc2-1|asic1|Ethernet280|0": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "str2-7250-lc2-1|asic1|Ethernet280|1": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "str2-7250-lc2-1|asic1|Ethernet280|2": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "str2-7250-lc2-1|asic1|Ethernet280|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet280|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet280|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "str2-7250-lc2-1|asic1|Ethernet280|6": { "scheduler": "scheduler.0" } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json index 7aecbdbd90e5..32d49aa9709c 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json @@ -496,1040 +496,3174 @@ } }, "QUEUE": { - "Ethernet0|3": { + "dut-lc3|Asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|3": { + "dut-lc3|Asic0|Ethernet4|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "dut-lc3|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|3": { + "dut-lc3|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "dut-lc3|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|3": { + "dut-lc3|Asic0|Ethernet20|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "dut-lc3|Asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|3": { + "dut-lc3|Asic0|Ethernet28|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "dut-lc3|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|3": { + "dut-lc3|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "dut-lc3|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|3": { + "dut-lc3|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "dut-lc3|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|3": { + "dut-lc3|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "dut-lc3|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|3": { + "dut-lc3|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "dut-lc3|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|3": { + "dut-lc3|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "dut-lc3|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|3": { + "dut-lc3|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "dut-lc3|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|3": { + "dut-lc3|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "dut-lc3|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|3": { + "dut-lc3|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "dut-lc3|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|3": { + "dut-lc3|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "dut-lc3|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|3": { + "dut-lc3|Asic0|Ethernet108|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "dut-lc3|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|3": { + "dut-lc3|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "dut-lc3|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|3": { + "dut-lc3|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "dut-lc3|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|3": { + "dut-lc3|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "dut-lc3|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|3": { + "dut-lc3|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|3": { + "dut-lc3|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|3": { + "dut-lc3|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|3": { + "dut-lc3|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|3": { + "dut-lc3|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|3": { + "dut-lc3|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|3": { + "dut-lc3|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|3": { + "dut-lc3|Asic0|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|3": { + "dut-lc3|Asic0|Ethernet172|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|3": { + "dut-lc3|Asic0|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "dut-lc3|Asic0|Ethernet180|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|4": { + "dut-lc3|Asic0|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "dut-lc3|Asic0|Ethernet188|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|4": { + "dut-lc4|Asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "dut-lc4|Asic0|Ethernet4|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|4": { + "dut-lc4|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "dut-lc4|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|4": { + "dut-lc4|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "dut-lc4|Asic0|Ethernet20|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|4": { + "dut-lc4|Asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "dut-lc4|Asic0|Ethernet28|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|4": { + "dut-lc4|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "dut-lc4|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|4": { + "dut-lc4|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "dut-lc4|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|4": { + "dut-lc4|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "dut-lc4|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|4": { + "dut-lc4|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "dut-lc4|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|4": { + "dut-lc4|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "dut-lc4|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|4": { + "dut-lc4|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "dut-lc4|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|4": { + "dut-lc4|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "dut-lc4|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|4": { + "dut-lc4|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "dut-lc4|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|4": { + "dut-lc4|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "dut-lc4|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|4": { + "dut-lc4|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "dut-lc4|Asic0|Ethernet108|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|4": { + "dut-lc4|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "dut-lc4|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|4": { + "dut-lc4|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "dut-lc4|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|4": { + "dut-lc4|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|4": { + "dut-lc4|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|4": { + "dut-lc4|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|4": { + "dut-lc4|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|4": { + "dut-lc4|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|4": { + "dut-lc4|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|4": { + "dut-lc4|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|4": { + "dut-lc4|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|4": { + "dut-lc4|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|4": { + "dut-lc4|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "dut-lc4|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet4|0": { + "dut-lc3|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "dut-lc3|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet12|0": { + "dut-lc3|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "dut-lc3|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet20|0": { + "dut-lc3|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "dut-lc3|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet28|0": { + "dut-lc3|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "dut-lc3|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet36|0": { + "dut-lc3|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "dut-lc3|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet44|0": { + "dut-lc3|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "dut-lc3|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet52|0": { + "dut-lc3|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "dut-lc3|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet60|0": { + "dut-lc3|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "dut-lc3|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet68|0": { + "dut-lc3|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "dut-lc3|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet76|0": { + "dut-lc3|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "dut-lc3|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet84|0": { + "dut-lc3|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "dut-lc3|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet92|0": { + "dut-lc3|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "dut-lc3|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet100|0": { + "dut-lc3|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "dut-lc3|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet108|0": { + "dut-lc3|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "dut-lc3|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet116|0": { + "dut-lc3|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "dut-lc3|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet124|0": { + "dut-lc3|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "dut-lc3|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet132|0": { + "dut-lc3|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "dut-lc3|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet140|0": { + "dut-lc3|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet144|0": { + "dut-lc3|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet148|0": { + "dut-lc3|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet152|0": { + "dut-lc3|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet156|0": { + "dut-lc3|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet164|0": { + "dut-lc4|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet176|0": { + "dut-lc4|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet180|0": { + "dut-lc4|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet184|0": { + "dut-lc4|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet188|0": { + "dut-lc4|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "dut-lc4|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet4|1": { + "dut-lc4|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "dut-lc4|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet12|1": { + "dut-lc4|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "dut-lc4|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet20|1": { + "dut-lc4|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "dut-lc4|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet28|1": { + "dut-lc4|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "dut-lc4|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet36|1": { + "dut-lc4|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "dut-lc4|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet44|1": { + "dut-lc4|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "dut-lc4|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet52|1": { + "dut-lc4|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "dut-lc4|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet60|1": { + "dut-lc4|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "dut-lc4|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet68|1": { + "dut-lc4|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "dut-lc4|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet76|1": { + "dut-lc4|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "dut-lc4|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet84|1": { + "dut-lc4|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "dut-lc4|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet92|1": { + "dut-lc4|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "dut-lc4|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet100|1": { + "dut-lc4|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "dut-lc4|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet108|1": { + "dut-lc4|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "dut-lc4|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet116|1": { + "dut-lc4|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "dut-lc4|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet124|1": { + "dut-lc4|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "dut-lc4|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet132|1": { + "dut-lc4|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "dut-lc4|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet140|1": { + "dut-lc4|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet144|1": { + "dut-lc4|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet148|1": { + "dut-lc4|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet152|1": { + "dut-lc4|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet156|1": { + "dut-lc4|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet164|1": { + "dut-lc4|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet176|1": { + "dut-lc4|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet180|1": { + "dut-lc4|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet184|1": { + "dut-lc5|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet188|1": { + "dut-lc5|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "dut-lc5|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet4|2": { + "dut-lc5|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "dut-lc5|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet12|2": { + "dut-lc5|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "dut-lc5|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet20|2": { + "dut-lc5|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "dut-lc5|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet28|2": { + "dut-lc5|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "dut-lc5|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet36|2": { + "dut-lc5|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "dut-lc5|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet44|2": { + "dut-lc5|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "dut-lc5|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet52|2": { + "dut-lc5|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "dut-lc5|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet60|2": { + "dut-lc5|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "dut-lc5|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet68|2": { + "dut-lc5|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "dut-lc5|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet76|2": { + "dut-lc5|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "dut-lc5|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet84|2": { + "dut-lc5|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "dut-lc5|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet92|2": { + "dut-lc5|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "dut-lc5|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet100|2": { + "dut-lc5|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "dut-lc5|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet108|2": { + "dut-lc5|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "dut-lc5|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet116|2": { + "dut-lc5|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "dut-lc5|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet124|2": { + "dut-lc5|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "dut-lc5|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet132|2": { + "dut-lc5|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "dut-lc5|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet140|2": { + "dut-lc5|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet144|2": { + "dut-lc5|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet148|2": { + "dut-lc5|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet152|2": { + "dut-lc5|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet156|2": { + "dut-lc5|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet164|2": { + "dut-lc5|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet176|2": { + "dut-lc5|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet180|2": { + "dut-lc5|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet184|2": { + "dut-lc5|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet188|2": { + "dut-lc5|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "dut-lc5|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet4|5": { + "dut-lc3|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "dut-lc3|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet12|5": { + "dut-lc3|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "dut-lc3|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet20|5": { + "dut-lc3|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "dut-lc3|Asic0|Ethernet20|5": { "scheduler": "scheduler.0" }, - "Ethernet28|5": { + "dut-lc3|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "dut-lc3|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet36|5": { + "dut-lc3|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "dut-lc3|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet44|5": { + "dut-lc3|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "dut-lc3|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet52|5": { + "dut-lc3|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "dut-lc3|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet60|5": { + "dut-lc3|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "dut-lc3|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet68|5": { + "dut-lc3|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "dut-lc3|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet76|5": { + "dut-lc3|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "dut-lc3|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet84|5": { + "dut-lc3|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "dut-lc3|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet92|5": { + "dut-lc3|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "dut-lc3|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet100|5": { + "dut-lc3|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "dut-lc3|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet108|5": { + "dut-lc3|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "dut-lc3|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet116|5": { + "dut-lc3|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "dut-lc3|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet124|5": { + "dut-lc3|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "dut-lc3|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet132|5": { + "dut-lc3|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "dut-lc3|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet140|5": { + "dut-lc3|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet144|5": { + "dut-lc3|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet148|5": { + "dut-lc3|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet152|5": { + "dut-lc3|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet156|5": { + "dut-lc3|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet164|5": { + "dut-lc3|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet176|5": { + "dut-lc3|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet180|5": { + "dut-lc3|Asic0|Ethernet164|5": { "scheduler": "scheduler.0" }, - "Ethernet184|5": { + "dut-lc3|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet188|5": { + "dut-lc3|Asic0|Ethernet172|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "dut-lc3|Asic0|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet4|6": { + "dut-lc3|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "dut-lc3|Asic0|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet12|6": { + "dut-lc3|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "dut-lc4|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet20|6": { + "dut-lc4|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "dut-lc4|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet28|6": { + "dut-lc4|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "dut-lc4|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet36|6": { + "dut-lc4|Asic0|Ethernet20|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "dut-lc4|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet44|6": { + "dut-lc4|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "dut-lc4|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet52|6": { + "dut-lc4|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "dut-lc4|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet60|6": { + "dut-lc4|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "dut-lc4|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet68|6": { + "dut-lc4|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "dut-lc4|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet76|6": { + "dut-lc4|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "dut-lc4|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet84|6": { + "dut-lc4|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "dut-lc4|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet92|6": { + "dut-lc4|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "dut-lc4|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet100|6": { + "dut-lc4|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "dut-lc4|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet108|6": { + "dut-lc4|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "dut-lc4|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet116|6": { + "dut-lc4|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "dut-lc4|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet124|6": { + "dut-lc4|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "dut-lc4|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet132|6": { + "dut-lc4|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "dut-lc4|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet140|6": { + "dut-lc4|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet144|6": { + "dut-lc4|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet148|6": { + "dut-lc4|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet152|6": { + "dut-lc4|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet156|6": { + "dut-lc4|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet164|6": { + "dut-lc4|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet176|6": { + "dut-lc4|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet180|6": { + "dut-lc4|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet184|6": { + "dut-lc4|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet188|6": { + "dut-lc4|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" - } + }, + "dut-lc4|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cqm2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cqm2-lc.json index 7aecbdbd90e5..32d49aa9709c 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cqm2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cqm2-lc.json @@ -496,1040 +496,3174 @@ } }, "QUEUE": { - "Ethernet0|3": { + "dut-lc3|Asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|3": { + "dut-lc3|Asic0|Ethernet4|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "dut-lc3|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|3": { + "dut-lc3|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "dut-lc3|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|3": { + "dut-lc3|Asic0|Ethernet20|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "dut-lc3|Asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|3": { + "dut-lc3|Asic0|Ethernet28|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "dut-lc3|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|3": { + "dut-lc3|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "dut-lc3|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|3": { + "dut-lc3|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "dut-lc3|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|3": { + "dut-lc3|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "dut-lc3|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|3": { + "dut-lc3|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "dut-lc3|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|3": { + "dut-lc3|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "dut-lc3|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|3": { + "dut-lc3|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "dut-lc3|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|3": { + "dut-lc3|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "dut-lc3|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|3": { + "dut-lc3|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "dut-lc3|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|3": { + "dut-lc3|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "dut-lc3|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|3": { + "dut-lc3|Asic0|Ethernet108|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "dut-lc3|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|3": { + "dut-lc3|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "dut-lc3|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|3": { + "dut-lc3|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "dut-lc3|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|3": { + "dut-lc3|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "dut-lc3|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|3": { + "dut-lc3|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|3": { + "dut-lc3|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|3": { + "dut-lc3|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|3": { + "dut-lc3|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|3": { + "dut-lc3|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|3": { + "dut-lc3|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|3": { + "dut-lc3|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|3": { + "dut-lc3|Asic0|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|3": { + "dut-lc3|Asic0|Ethernet172|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|3": { + "dut-lc3|Asic0|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "dut-lc3|Asic0|Ethernet180|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet4|4": { + "dut-lc3|Asic0|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "dut-lc3|Asic0|Ethernet188|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet12|4": { + "dut-lc4|Asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "dut-lc4|Asic0|Ethernet4|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet20|4": { + "dut-lc4|Asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "dut-lc4|Asic0|Ethernet12|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet28|4": { + "dut-lc4|Asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "dut-lc4|Asic0|Ethernet20|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet36|4": { + "dut-lc4|Asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "dut-lc4|Asic0|Ethernet28|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet44|4": { + "dut-lc4|Asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "dut-lc4|Asic0|Ethernet36|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet52|4": { + "dut-lc4|Asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "dut-lc4|Asic0|Ethernet44|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet60|4": { + "dut-lc4|Asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "dut-lc4|Asic0|Ethernet52|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet68|4": { + "dut-lc4|Asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "dut-lc4|Asic0|Ethernet60|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet76|4": { + "dut-lc4|Asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "dut-lc4|Asic0|Ethernet68|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet84|4": { + "dut-lc4|Asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "dut-lc4|Asic0|Ethernet76|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet92|4": { + "dut-lc4|Asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "dut-lc4|Asic0|Ethernet84|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet100|4": { + "dut-lc4|Asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "dut-lc4|Asic0|Ethernet92|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet108|4": { + "dut-lc4|Asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "dut-lc4|Asic0|Ethernet100|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet116|4": { + "dut-lc4|Asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "dut-lc4|Asic0|Ethernet108|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet124|4": { + "dut-lc4|Asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "dut-lc4|Asic0|Ethernet116|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet132|4": { + "dut-lc4|Asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "dut-lc4|Asic0|Ethernet124|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet140|4": { + "dut-lc4|Asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet144|4": { + "dut-lc4|Asic0|Ethernet132|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet148|4": { + "dut-lc4|Asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet152|4": { + "dut-lc4|Asic0|Ethernet140|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet156|4": { + "dut-lc4|Asic0|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet164|4": { + "dut-lc4|Asic0|Ethernet148|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet176|4": { + "dut-lc4|Asic0|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet180|4": { + "dut-lc4|Asic0|Ethernet156|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet184|4": { + "dut-lc4|Asic0|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet188|4": { + "dut-lc4|Asic0|Ethernet164|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "dut-lc4|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc4|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc5|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "dut-lc3|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet4|0": { + "dut-lc3|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "dut-lc3|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet12|0": { + "dut-lc3|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "dut-lc3|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet20|0": { + "dut-lc3|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "dut-lc3|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet28|0": { + "dut-lc3|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "dut-lc3|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet36|0": { + "dut-lc3|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "dut-lc3|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet44|0": { + "dut-lc3|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "dut-lc3|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet52|0": { + "dut-lc3|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "dut-lc3|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet60|0": { + "dut-lc3|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "dut-lc3|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet68|0": { + "dut-lc3|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "dut-lc3|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet76|0": { + "dut-lc3|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "dut-lc3|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet84|0": { + "dut-lc3|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "dut-lc3|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet92|0": { + "dut-lc3|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "dut-lc3|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet100|0": { + "dut-lc3|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "dut-lc3|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet108|0": { + "dut-lc3|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "dut-lc3|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet116|0": { + "dut-lc3|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "dut-lc3|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet124|0": { + "dut-lc3|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "dut-lc3|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet132|0": { + "dut-lc3|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "dut-lc3|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet140|0": { + "dut-lc3|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet144|0": { + "dut-lc3|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet148|0": { + "dut-lc3|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet152|0": { + "dut-lc3|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet156|0": { + "dut-lc3|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet164|0": { + "dut-lc4|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet176|0": { + "dut-lc4|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet180|0": { + "dut-lc4|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet184|0": { + "dut-lc4|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet188|0": { + "dut-lc4|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "dut-lc4|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet4|1": { + "dut-lc4|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "dut-lc4|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet12|1": { + "dut-lc4|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "dut-lc4|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet20|1": { + "dut-lc4|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "dut-lc4|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet28|1": { + "dut-lc4|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "dut-lc4|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet36|1": { + "dut-lc4|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "dut-lc4|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet44|1": { + "dut-lc4|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "dut-lc4|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet52|1": { + "dut-lc4|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "dut-lc4|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet60|1": { + "dut-lc4|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "dut-lc4|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet68|1": { + "dut-lc4|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "dut-lc4|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet76|1": { + "dut-lc4|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "dut-lc4|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet84|1": { + "dut-lc4|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "dut-lc4|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet92|1": { + "dut-lc4|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "dut-lc4|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet100|1": { + "dut-lc4|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "dut-lc4|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet108|1": { + "dut-lc4|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "dut-lc4|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet116|1": { + "dut-lc4|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "dut-lc4|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet124|1": { + "dut-lc4|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "dut-lc4|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet132|1": { + "dut-lc4|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "dut-lc4|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet140|1": { + "dut-lc4|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet144|1": { + "dut-lc4|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet148|1": { + "dut-lc4|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet152|1": { + "dut-lc4|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet156|1": { + "dut-lc4|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet164|1": { + "dut-lc4|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet176|1": { + "dut-lc4|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet180|1": { + "dut-lc4|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet184|1": { + "dut-lc5|Asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet188|1": { + "dut-lc5|Asic0|Ethernet4|2": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "dut-lc5|Asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet4|2": { + "dut-lc5|Asic0|Ethernet12|2": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "dut-lc5|Asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet12|2": { + "dut-lc5|Asic0|Ethernet20|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "dut-lc5|Asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet20|2": { + "dut-lc5|Asic0|Ethernet28|2": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "dut-lc5|Asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet28|2": { + "dut-lc5|Asic0|Ethernet36|2": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "dut-lc5|Asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet36|2": { + "dut-lc5|Asic0|Ethernet44|2": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "dut-lc5|Asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet44|2": { + "dut-lc5|Asic0|Ethernet52|2": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "dut-lc5|Asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet52|2": { + "dut-lc5|Asic0|Ethernet60|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "dut-lc5|Asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet60|2": { + "dut-lc5|Asic0|Ethernet68|2": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "dut-lc5|Asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet68|2": { + "dut-lc5|Asic0|Ethernet76|2": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "dut-lc5|Asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet76|2": { + "dut-lc5|Asic0|Ethernet84|2": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "dut-lc5|Asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet84|2": { + "dut-lc5|Asic0|Ethernet92|2": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "dut-lc5|Asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet92|2": { + "dut-lc5|Asic0|Ethernet100|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "dut-lc5|Asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet100|2": { + "dut-lc5|Asic0|Ethernet108|2": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "dut-lc5|Asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet108|2": { + "dut-lc5|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "dut-lc5|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet116|2": { + "dut-lc5|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "dut-lc5|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet124|2": { + "dut-lc5|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "dut-lc5|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet132|2": { + "dut-lc5|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "dut-lc5|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet140|2": { + "dut-lc5|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet144|2": { + "dut-lc5|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet148|2": { + "dut-lc5|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet152|2": { + "dut-lc5|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet156|2": { + "dut-lc5|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet164|2": { + "dut-lc5|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet176|2": { + "dut-lc5|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet180|2": { + "dut-lc5|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet184|2": { + "dut-lc5|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet188|2": { + "dut-lc5|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "dut-lc5|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet4|5": { + "dut-lc3|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "dut-lc3|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet12|5": { + "dut-lc3|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "dut-lc3|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet20|5": { + "dut-lc3|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "dut-lc3|Asic0|Ethernet20|5": { "scheduler": "scheduler.0" }, - "Ethernet28|5": { + "dut-lc3|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "dut-lc3|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet36|5": { + "dut-lc3|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "dut-lc3|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet44|5": { + "dut-lc3|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "dut-lc3|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet52|5": { + "dut-lc3|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "dut-lc3|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet60|5": { + "dut-lc3|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "dut-lc3|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet68|5": { + "dut-lc3|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "dut-lc3|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet76|5": { + "dut-lc3|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "dut-lc3|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet84|5": { + "dut-lc3|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "dut-lc3|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet92|5": { + "dut-lc3|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "dut-lc3|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet100|5": { + "dut-lc3|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "dut-lc3|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet108|5": { + "dut-lc3|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "dut-lc3|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet116|5": { + "dut-lc3|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "dut-lc3|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet124|5": { + "dut-lc3|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "dut-lc3|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet132|5": { + "dut-lc3|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "dut-lc3|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet140|5": { + "dut-lc3|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet144|5": { + "dut-lc3|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet148|5": { + "dut-lc3|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet152|5": { + "dut-lc3|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet156|5": { + "dut-lc3|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet164|5": { + "dut-lc3|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet176|5": { + "dut-lc3|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet180|5": { + "dut-lc3|Asic0|Ethernet164|5": { "scheduler": "scheduler.0" }, - "Ethernet184|5": { + "dut-lc3|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet188|5": { + "dut-lc3|Asic0|Ethernet172|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "dut-lc3|Asic0|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet4|6": { + "dut-lc3|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "dut-lc3|Asic0|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet12|6": { + "dut-lc3|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "dut-lc4|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet20|6": { + "dut-lc4|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "dut-lc4|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet28|6": { + "dut-lc4|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "dut-lc4|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet36|6": { + "dut-lc4|Asic0|Ethernet20|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "dut-lc4|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet44|6": { + "dut-lc4|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "dut-lc4|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet52|6": { + "dut-lc4|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "dut-lc4|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet60|6": { + "dut-lc4|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "dut-lc4|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet68|6": { + "dut-lc4|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "dut-lc4|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet76|6": { + "dut-lc4|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "dut-lc4|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet84|6": { + "dut-lc4|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "dut-lc4|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet92|6": { + "dut-lc4|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "dut-lc4|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet100|6": { + "dut-lc4|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "dut-lc4|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet108|6": { + "dut-lc4|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "dut-lc4|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet116|6": { + "dut-lc4|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "dut-lc4|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet124|6": { + "dut-lc4|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "dut-lc4|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet132|6": { + "dut-lc4|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "dut-lc4|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet140|6": { + "dut-lc4|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet144|6": { + "dut-lc4|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet148|6": { + "dut-lc4|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet152|6": { + "dut-lc4|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet156|6": { + "dut-lc4|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet164|6": { + "dut-lc4|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet176|6": { + "dut-lc4|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet180|6": { + "dut-lc4|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet184|6": { + "dut-lc4|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet188|6": { + "dut-lc4|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" - } + }, + "dut-lc4|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc4|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "dut-lc5|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "dut-lc3|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc3|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc4|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "dut-lc5|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-c36-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-c36-lc.json index cf6fbf64f8db..1007b272c466 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-c36-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-c36-lc.json @@ -280,418 +280,3040 @@ } }, "QUEUE": { - "Ethernet0|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc3-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc3-1|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet48|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet56|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet64|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet72|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet80|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet88|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet96|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet104|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet112|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet192|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet200|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet208|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet216|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet224|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet232|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet240|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet248|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet256|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet264|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet272|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet280|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc5-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc5-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet48|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet52|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet56|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet60|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet64|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet68|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet72|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet76|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet80|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet84|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet88|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet92|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet96|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet100|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet104|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet108|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet112|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { - "scheduler" : "scheduler.1", + "str2-7804-lc7-1|Asic0|Ethernet116|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "str2-7804-lc7-1|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "str2-7804-lc7-1|Asic0|Ethernet120|0": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|1": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "str2-7804-lc7-1|Asic0|Ethernet120|6": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|0": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|1": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet124|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "str2-7804-lc7-1|Asic0|Ethernet124|6": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|0": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|1": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "str2-7804-lc7-1|Asic0|Ethernet128|6": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "str2-7804-lc7-1|Asic0|Ethernet132|0": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "str2-7804-lc7-1|Asic0|Ethernet132|1": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "str2-7804-lc7-1|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "str2-7804-lc7-1|Asic0|Ethernet132|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet132|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "str2-7804-lc7-1|Asic0|Ethernet132|6": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|0": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|1": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "str2-7804-lc7-1|Asic0|Ethernet136|6": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|0": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|1": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet140|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet140|5": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "str2-7804-lc7-1|Asic0|Ethernet140|6": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|0": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|1": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "str2-7804-lc7-1|Asic0|Ethernet144|6": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "str2-7804-lc7-1|Asic0|Ethernet148|0": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|1": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet148|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet148|5": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "str2-7804-lc7-1|Asic0|Ethernet148|6": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|0": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|1": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "str2-7804-lc7-1|Asic0|Ethernet152|6": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|0": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|1": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet156|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet156|5": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "str2-7804-lc7-1|Asic0|Ethernet156|6": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|0": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|1": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "str2-7804-lc7-1|Asic0|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "str2-7804-lc7-1|Asic0|Ethernet160|6": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|0": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|1": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet164|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet164|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "str2-7804-lc7-1|Asic0|Ethernet164|6": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|0": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|1": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "str2-7804-lc7-1|Asic0|Ethernet168|6": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|0": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|1": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet172|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet172|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "str2-7804-lc7-1|Asic0|Ethernet172|6": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "str2-7804-lc7-1|Asic0|Ethernet176|0": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "str2-7804-lc7-1|Asic0|Ethernet176|1": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "str2-7804-lc7-1|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "str2-7804-lc7-1|Asic0|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "str2-7804-lc7-1|Asic0|Ethernet176|6": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|0": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|1": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet180|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet180|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "str2-7804-lc7-1|Asic0|Ethernet180|6": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|0": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|1": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "str2-7804-lc7-1|Asic0|Ethernet184|6": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|0": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|1": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet188|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7804-lc7-1|Asic0|Ethernet188|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "str2-7804-lc7-1|Asic0|Ethernet188|6": { "scheduler": "scheduler.0" } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-d36-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-d36-lc.json index cf6fbf64f8db..027753a09f2f 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-d36-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3a-36dm2-d36-lc.json @@ -280,419 +280,2910 @@ } }, "QUEUE": { - "Ethernet0|3": { + "str3-7800-lc8-1|asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "str3-7800-lc8-1|asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "str3-7800-lc8-1|asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "str3-7800-lc8-1|asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "str3-7800-lc8-1|asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "str3-7800-lc8-1|asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "str3-7800-lc8-1|asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "str3-7800-lc8-1|asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "str3-7800-lc8-1|asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "str3-7800-lc8-1|asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "str3-7800-lc8-1|asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "str3-7800-lc8-1|asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "str3-7800-lc8-1|asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "str3-7800-lc8-1|asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "str3-7800-lc8-1|asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "str3-7800-lc8-1|asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "str3-7800-lc8-1|asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "str3-7800-lc8-1|asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "str3-7800-lc8-1|asic1|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "str3-7800-lc8-1|asic1|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "str3-7800-lc8-1|asic1|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "str3-7800-lc8-1|asic1|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "str3-7800-lc8-1|asic1|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "str3-7800-lc8-1|asic1|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "str3-7800-lc8-1|asic1|Ethernet192|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "str3-7800-lc8-1|asic1|Ethernet200|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "str3-7800-lc8-1|asic1|Ethernet208|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "str3-7800-lc8-1|asic1|Ethernet216|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "str3-7800-lc8-1|asic1|Ethernet224|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "str3-7800-lc8-1|asic1|Ethernet232|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "str3-7800-lc8-1|asic1|Ethernet240|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "str3-7800-lc8-1|asic1|Ethernet248|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "str3-7800-lc8-1|asic1|Ethernet256|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "str3-7800-lc8-1|asic1|Ethernet264|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "str3-7800-lc8-1|asic1|Ethernet272|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "str3-7800-lc8-1|asic1|Ethernet280|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "str3-7800-lc1-1|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str3-7800-lc8-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "str3-7800-lc2-1|Asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "str3-7800-lc2-1|Asic0|Ethernet124|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "str3-7800-lc2-1|Asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "str3-7800-lc2-1|Asic0|Ethernet132|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "str3-7800-lc2-1|Asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "str3-7800-lc2-1|Asic0|Ethernet140|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "str3-7800-lc2-1|Asic0|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "str3-7800-lc2-1|Asic0|Ethernet148|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "str3-7800-lc2-1|Asic0|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "str3-7800-lc2-1|Asic0|Ethernet156|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "str3-7800-lc2-1|Asic0|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "str3-7800-lc2-1|Asic0|Ethernet164|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "str3-7800-lc2-1|Asic0|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "str3-7800-lc2-1|Asic0|Ethernet172|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "str3-7800-lc2-1|Asic0|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "str3-7800-lc2-1|Asic0|Ethernet180|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "str3-7800-lc2-1|Asic0|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "str3-7800-lc2-1|Asic0|Ethernet188|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "str3-7800-lc8-1|asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "str3-7800-lc8-1|asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "str3-7800-lc8-1|asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "str3-7800-lc8-1|asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "str3-7800-lc8-1|asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "str3-7800-lc8-1|asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "str3-7800-lc8-1|asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "str3-7800-lc8-1|asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "str3-7800-lc8-1|asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "str3-7800-lc8-1|asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "str3-7800-lc8-1|asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "str3-7800-lc8-1|asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "str3-7800-lc8-1|asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "str3-7800-lc8-1|asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "str3-7800-lc8-1|asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "str3-7800-lc8-1|asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "str3-7800-lc8-1|asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "str3-7800-lc8-1|asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "str3-7800-lc8-1|asic1|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "str3-7800-lc8-1|asic1|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "str3-7800-lc8-1|asic1|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "str3-7800-lc8-1|asic1|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "str3-7800-lc8-1|asic1|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "str3-7800-lc8-1|asic1|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "str3-7800-lc8-1|asic1|Ethernet192|5": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "str3-7800-lc8-1|asic1|Ethernet200|5": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "str3-7800-lc8-1|asic1|Ethernet208|5": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "str3-7800-lc8-1|asic1|Ethernet216|5": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "str3-7800-lc8-1|asic1|Ethernet224|5": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "str3-7800-lc8-1|asic1|Ethernet232|5": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "str3-7800-lc8-1|asic1|Ethernet240|5": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "str3-7800-lc8-1|asic1|Ethernet248|5": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "str3-7800-lc8-1|asic1|Ethernet256|5": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "str3-7800-lc8-1|asic1|Ethernet264|5": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "str3-7800-lc8-1|asic1|Ethernet272|5": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "str3-7800-lc8-1|asic1|Ethernet280|5": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "str3-7800-lc1-1|Asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "str3-7800-lc1-1|Asic0|Ethernet4|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "str3-7800-lc1-1|Asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "str3-7800-lc1-1|Asic0|Ethernet12|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "str3-7800-lc1-1|Asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "str3-7800-lc1-1|Asic0|Ethernet20|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "str3-7800-lc1-1|Asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "str3-7800-lc1-1|Asic0|Ethernet28|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "str3-7800-lc1-1|Asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "str3-7800-lc1-1|Asic0|Ethernet36|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "str3-7800-lc1-1|Asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "str3-7800-lc1-1|Asic0|Ethernet44|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "str3-7800-lc1-1|Asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "str3-7800-lc1-1|Asic0|Ethernet52|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "str3-7800-lc1-1|Asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "str3-7800-lc1-1|Asic0|Ethernet60|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "str3-7800-lc1-1|Asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "str3-7800-lc1-1|Asic0|Ethernet68|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "str3-7800-lc1-1|Asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "str3-7800-lc1-1|Asic0|Ethernet76|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "str3-7800-lc1-1|Asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "str3-7800-lc1-1|Asic0|Ethernet84|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "str3-7800-lc1-1|Asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "str3-7800-lc1-1|Asic0|Ethernet92|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "str3-7800-lc1-1|Asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "str3-7800-lc1-1|Asic0|Ethernet100|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "str3-7800-lc1-1|Asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "str3-7800-lc1-1|Asic0|Ethernet108|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "str3-7800-lc1-1|Asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "str3-7800-lc1-1|Asic0|Ethernet116|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "str3-7800-lc1-1|Asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "str3-7800-lc1-1|Asic0|Ethernet124|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "str3-7800-lc1-1|Asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "str3-7800-lc1-1|Asic0|Ethernet132|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "str3-7800-lc1-1|Asic0|Ethernet136|5": { "scheduler": "scheduler.0" - } + }, + "str3-7800-lc1-1|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc1-1|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc2-1|Asic0|Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "str3-7800-lc8-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc8-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc1-1|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet4|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet12|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet20|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet28|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet36|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet44|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet52|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet60|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet68|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet76|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet84|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet92|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet100|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet108|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet116|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet124|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet132|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet140|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet148|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet156|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet164|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet172|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet180|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "str3-7800-lc2-1|Asic0|Ethernet188|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x100g.json b/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x100g.json index cf6fbf64f8db..351c9cd8a509 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x100g.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x100g.json @@ -280,419 +280,2382 @@ } }, "QUEUE": { - "Ethernet0|3": { + "svcstr-7250-lc1-1|asic0|Ethernet0|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { + "svcstr-7250-lc1-1|asic0|Ethernet8|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { + "svcstr-7250-lc1-1|asic0|Ethernet16|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { + "svcstr-7250-lc1-1|asic0|Ethernet24|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { + "svcstr-7250-lc1-1|asic0|Ethernet32|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { + "svcstr-7250-lc1-1|asic0|Ethernet40|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { + "svcstr-7250-lc1-1|asic0|Ethernet48|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { + "svcstr-7250-lc1-1|asic0|Ethernet56|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { + "svcstr-7250-lc1-1|asic0|Ethernet64|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { + "svcstr-7250-lc1-1|asic0|Ethernet72|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { + "svcstr-7250-lc1-1|asic0|Ethernet80|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { + "svcstr-7250-lc1-1|asic0|Ethernet88|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { + "svcstr-7250-lc1-1|asic0|Ethernet96|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { + "svcstr-7250-lc1-1|asic0|Ethernet104|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { + "svcstr-7250-lc1-1|asic0|Ethernet112|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { + "svcstr-7250-lc1-1|asic0|Ethernet120|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { + "svcstr-7250-lc1-1|asic0|Ethernet128|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { + "svcstr-7250-lc1-1|asic0|Ethernet136|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { + "svcstr-7250-lc1-1|asic1|Ethernet144|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { + "svcstr-7250-lc1-1|asic1|Ethernet152|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { + "svcstr-7250-lc1-1|asic1|Ethernet160|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { + "svcstr-7250-lc1-1|asic1|Ethernet168|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { + "svcstr-7250-lc1-1|asic1|Ethernet176|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { + "svcstr-7250-lc1-1|asic1|Ethernet184|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { + "svcstr-7250-lc1-1|asic1|Ethernet192|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { + "svcstr-7250-lc1-1|asic1|Ethernet200|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { + "svcstr-7250-lc1-1|asic1|Ethernet208|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { + "svcstr-7250-lc1-1|asic1|Ethernet216|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { + "svcstr-7250-lc1-1|asic1|Ethernet224|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { + "svcstr-7250-lc1-1|asic1|Ethernet232|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { + "svcstr-7250-lc1-1|asic1|Ethernet240|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { + "svcstr-7250-lc1-1|asic1|Ethernet248|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { + "svcstr-7250-lc1-1|asic1|Ethernet256|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { + "svcstr-7250-lc1-1|asic1|Ethernet264|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { + "svcstr-7250-lc1-1|asic1|Ethernet272|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { + "svcstr-7250-lc1-1|asic1|Ethernet280|3": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "svcstr-7250-lc2-1|asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "svcstr-7250-lc2-1|asic1|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "svcstr-7250-lc2-1|asic1|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "svcstr-7250-lc2-1|asic1|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "svcstr-7250-lc2-1|asic1|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "svcstr-7250-lc2-1|asic1|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "svcstr-7250-lc2-1|asic1|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "svcstr-7250-lc2-1|asic1|Ethernet192|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "svcstr-7250-lc2-1|asic1|Ethernet200|2": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "svcstr-7250-lc2-1|asic1|Ethernet208|2": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "svcstr-7250-lc2-1|asic1|Ethernet216|2": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "svcstr-7250-lc2-1|asic1|Ethernet224|2": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "svcstr-7250-lc2-1|asic1|Ethernet232|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "svcstr-7250-lc2-1|asic1|Ethernet240|2": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "svcstr-7250-lc2-1|asic1|Ethernet248|2": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "svcstr-7250-lc2-1|asic1|Ethernet256|2": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "svcstr-7250-lc2-1|asic1|Ethernet264|2": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "svcstr-7250-lc2-1|asic1|Ethernet272|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "svcstr-7250-lc2-1|asic1|Ethernet280|2": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "svcstr-7250-lc3-1|asic0|Ethernet0|2": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "svcstr-7250-lc3-1|asic0|Ethernet8|2": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "svcstr-7250-lc3-1|asic0|Ethernet16|2": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "svcstr-7250-lc3-1|asic0|Ethernet24|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "svcstr-7250-lc3-1|asic0|Ethernet32|2": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "svcstr-7250-lc3-1|asic0|Ethernet40|2": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "svcstr-7250-lc3-1|asic0|Ethernet48|2": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "svcstr-7250-lc3-1|asic0|Ethernet56|2": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "svcstr-7250-lc3-1|asic0|Ethernet64|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "svcstr-7250-lc3-1|asic0|Ethernet72|2": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "svcstr-7250-lc3-1|asic0|Ethernet80|2": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "svcstr-7250-lc3-1|asic0|Ethernet88|2": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "svcstr-7250-lc3-1|asic0|Ethernet96|2": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "svcstr-7250-lc3-1|asic0|Ethernet104|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "svcstr-7250-lc3-1|asic0|Ethernet112|2": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "svcstr-7250-lc3-1|asic0|Ethernet120|2": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "svcstr-7250-lc3-1|asic0|Ethernet128|2": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "svcstr-7250-lc3-1|asic0|Ethernet136|2": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "svcstr-7250-lc3-1|asic1|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "svcstr-7250-lc3-1|asic1|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "svcstr-7250-lc3-1|asic1|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "svcstr-7250-lc3-1|asic1|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "svcstr-7250-lc3-1|asic1|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "svcstr-7250-lc3-1|asic1|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "svcstr-7250-lc3-1|asic1|Ethernet192|2": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "svcstr-7250-lc3-1|asic1|Ethernet200|2": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "svcstr-7250-lc3-1|asic1|Ethernet208|2": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "svcstr-7250-lc3-1|asic1|Ethernet216|2": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "svcstr-7250-lc3-1|asic1|Ethernet224|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "svcstr-7250-lc3-1|asic1|Ethernet232|2": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "svcstr-7250-lc3-1|asic1|Ethernet240|2": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "svcstr-7250-lc3-1|asic1|Ethernet248|2": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "svcstr-7250-lc3-1|asic1|Ethernet256|2": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "svcstr-7250-lc3-1|asic1|Ethernet264|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "svcstr-7250-lc3-1|asic1|Ethernet272|2": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "svcstr-7250-lc3-1|asic1|Ethernet280|2": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "svcstr-7250-lc1-1|asic0|Ethernet0|5": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "svcstr-7250-lc1-1|asic0|Ethernet8|5": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "svcstr-7250-lc1-1|asic0|Ethernet16|5": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "svcstr-7250-lc1-1|asic0|Ethernet24|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "svcstr-7250-lc1-1|asic0|Ethernet32|5": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "svcstr-7250-lc1-1|asic0|Ethernet40|5": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "svcstr-7250-lc1-1|asic0|Ethernet48|5": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "svcstr-7250-lc1-1|asic0|Ethernet56|5": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "svcstr-7250-lc1-1|asic0|Ethernet64|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "svcstr-7250-lc1-1|asic0|Ethernet72|5": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "svcstr-7250-lc1-1|asic0|Ethernet80|5": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "svcstr-7250-lc1-1|asic0|Ethernet88|5": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "svcstr-7250-lc1-1|asic0|Ethernet96|5": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "svcstr-7250-lc1-1|asic0|Ethernet104|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "svcstr-7250-lc1-1|asic0|Ethernet112|5": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "svcstr-7250-lc1-1|asic0|Ethernet120|5": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "svcstr-7250-lc1-1|asic0|Ethernet128|5": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "svcstr-7250-lc1-1|asic0|Ethernet136|5": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "svcstr-7250-lc1-1|asic1|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "svcstr-7250-lc1-1|asic1|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "svcstr-7250-lc1-1|asic1|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "svcstr-7250-lc1-1|asic1|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "svcstr-7250-lc1-1|asic1|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "svcstr-7250-lc1-1|asic1|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "svcstr-7250-lc1-1|asic1|Ethernet192|5": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "svcstr-7250-lc1-1|asic1|Ethernet200|5": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "svcstr-7250-lc1-1|asic1|Ethernet208|5": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "svcstr-7250-lc1-1|asic1|Ethernet216|5": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "svcstr-7250-lc1-1|asic1|Ethernet224|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "svcstr-7250-lc1-1|asic1|Ethernet232|5": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "svcstr-7250-lc1-1|asic1|Ethernet240|5": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "svcstr-7250-lc1-1|asic1|Ethernet248|5": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "svcstr-7250-lc1-1|asic1|Ethernet256|5": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "svcstr-7250-lc1-1|asic1|Ethernet264|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "svcstr-7250-lc1-1|asic1|Ethernet272|5": { "scheduler": "scheduler.0" - } + }, + "svcstr-7250-lc1-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc2-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc3-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "svcstr-7250-lc1-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc1-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc2-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, "svcstr-7250-lc3-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + } } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x400g.json b/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x400g.json index cf6fbf64f8db..5a5badc9d369 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x400g.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-nokia-ixr7250e-36x400g.json @@ -280,418 +280,1660 @@ } }, "QUEUE": { - "Ethernet0|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc1-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet0|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet8|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet16|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet24|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet32|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet40|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet48|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet56|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet64|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet72|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet80|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet88|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet96|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet104|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet112|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet120|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet128|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet136|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet192|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet200|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet208|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet216|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet224|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet232|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet240|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet248|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet256|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet256|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet256|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet264|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet264|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet264|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet272|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet272|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet272|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet280|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc1-1|asic1|Ethernet280|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc1-1|asic1|Ethernet280|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet0|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet8|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet16|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet24|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet32|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet40|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet48|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet56|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|3": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet64|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet8|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet72|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet16|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet24|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet80|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet32|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet40|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet88|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet48|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet56|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet96|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet64|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet72|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet104|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet80|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet88|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet112|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet96|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet104|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet120|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet112|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet120|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet128|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet128|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|3": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet136|4": { - "scheduler" : "scheduler.1", + "str2-7250-lc2-1|asic0|Ethernet136|4": { + "scheduler": "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, - "Ethernet0|0": { + "str2-7250-lc2-1|asic0|Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic0|Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "str2-7250-lc2-1|asic1|Ethernet144|0": { "scheduler": "scheduler.0" }, - "Ethernet8|0": { + "str2-7250-lc2-1|asic1|Ethernet144|1": { "scheduler": "scheduler.0" }, - "Ethernet16|0": { + "str2-7250-lc2-1|asic1|Ethernet144|2": { "scheduler": "scheduler.0" }, - "Ethernet24|0": { + "str2-7250-lc2-1|asic1|Ethernet144|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet144|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet144|5": { "scheduler": "scheduler.0" }, - "Ethernet32|0": { + "str2-7250-lc2-1|asic1|Ethernet144|6": { "scheduler": "scheduler.0" }, - "Ethernet40|0": { + "str2-7250-lc2-1|asic1|Ethernet152|0": { "scheduler": "scheduler.0" }, - "Ethernet48|0": { + "str2-7250-lc2-1|asic1|Ethernet152|1": { "scheduler": "scheduler.0" }, - "Ethernet56|0": { + "str2-7250-lc2-1|asic1|Ethernet152|2": { "scheduler": "scheduler.0" }, - "Ethernet64|0": { + "str2-7250-lc2-1|asic1|Ethernet152|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet152|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet152|5": { "scheduler": "scheduler.0" }, - "Ethernet72|0": { + "str2-7250-lc2-1|asic1|Ethernet152|6": { "scheduler": "scheduler.0" }, - "Ethernet80|0": { + "str2-7250-lc2-1|asic1|Ethernet160|0": { "scheduler": "scheduler.0" }, - "Ethernet88|0": { + "str2-7250-lc2-1|asic1|Ethernet160|1": { "scheduler": "scheduler.0" }, - "Ethernet96|0": { + "str2-7250-lc2-1|asic1|Ethernet160|2": { "scheduler": "scheduler.0" }, - "Ethernet104|0": { + "str2-7250-lc2-1|asic1|Ethernet160|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet160|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet160|5": { "scheduler": "scheduler.0" }, - "Ethernet112|0": { + "str2-7250-lc2-1|asic1|Ethernet160|6": { "scheduler": "scheduler.0" }, - "Ethernet120|0": { + "str2-7250-lc2-1|asic1|Ethernet168|0": { "scheduler": "scheduler.0" }, - "Ethernet128|0": { + "str2-7250-lc2-1|asic1|Ethernet168|1": { "scheduler": "scheduler.0" }, - "Ethernet136|0": { + "str2-7250-lc2-1|asic1|Ethernet168|2": { "scheduler": "scheduler.0" }, - "Ethernet0|1": { + "str2-7250-lc2-1|asic1|Ethernet168|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet168|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet168|5": { "scheduler": "scheduler.0" }, - "Ethernet8|1": { + "str2-7250-lc2-1|asic1|Ethernet168|6": { "scheduler": "scheduler.0" }, - "Ethernet16|1": { + "str2-7250-lc2-1|asic1|Ethernet176|0": { "scheduler": "scheduler.0" }, - "Ethernet24|1": { + "str2-7250-lc2-1|asic1|Ethernet176|1": { "scheduler": "scheduler.0" }, - "Ethernet32|1": { + "str2-7250-lc2-1|asic1|Ethernet176|2": { "scheduler": "scheduler.0" }, - "Ethernet40|1": { + "str2-7250-lc2-1|asic1|Ethernet176|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet176|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet176|5": { "scheduler": "scheduler.0" }, - "Ethernet48|1": { + "str2-7250-lc2-1|asic1|Ethernet176|6": { "scheduler": "scheduler.0" }, - "Ethernet56|1": { + "str2-7250-lc2-1|asic1|Ethernet184|0": { "scheduler": "scheduler.0" }, - "Ethernet64|1": { + "str2-7250-lc2-1|asic1|Ethernet184|1": { "scheduler": "scheduler.0" }, - "Ethernet72|1": { + "str2-7250-lc2-1|asic1|Ethernet184|2": { "scheduler": "scheduler.0" }, - "Ethernet80|1": { + "str2-7250-lc2-1|asic1|Ethernet184|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet184|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet184|5": { "scheduler": "scheduler.0" }, - "Ethernet88|1": { + "str2-7250-lc2-1|asic1|Ethernet184|6": { "scheduler": "scheduler.0" }, - "Ethernet96|1": { + "str2-7250-lc2-1|asic1|Ethernet192|0": { "scheduler": "scheduler.0" }, - "Ethernet104|1": { + "str2-7250-lc2-1|asic1|Ethernet192|1": { "scheduler": "scheduler.0" }, - "Ethernet112|1": { + "str2-7250-lc2-1|asic1|Ethernet192|2": { "scheduler": "scheduler.0" }, - "Ethernet120|1": { + "str2-7250-lc2-1|asic1|Ethernet192|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet192|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet192|5": { "scheduler": "scheduler.0" }, - "Ethernet128|1": { + "str2-7250-lc2-1|asic1|Ethernet192|6": { "scheduler": "scheduler.0" }, - "Ethernet136|1": { + "str2-7250-lc2-1|asic1|Ethernet200|0": { "scheduler": "scheduler.0" }, - "Ethernet0|2": { + "str2-7250-lc2-1|asic1|Ethernet200|1": { "scheduler": "scheduler.0" }, - "Ethernet8|2": { + "str2-7250-lc2-1|asic1|Ethernet200|2": { "scheduler": "scheduler.0" }, - "Ethernet16|2": { + "str2-7250-lc2-1|asic1|Ethernet200|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet200|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet200|5": { "scheduler": "scheduler.0" }, - "Ethernet24|2": { + "str2-7250-lc2-1|asic1|Ethernet200|6": { "scheduler": "scheduler.0" }, - "Ethernet32|2": { + "str2-7250-lc2-1|asic1|Ethernet208|0": { "scheduler": "scheduler.0" }, - "Ethernet40|2": { + "str2-7250-lc2-1|asic1|Ethernet208|1": { "scheduler": "scheduler.0" }, - "Ethernet48|2": { + "str2-7250-lc2-1|asic1|Ethernet208|2": { "scheduler": "scheduler.0" }, - "Ethernet56|2": { + "str2-7250-lc2-1|asic1|Ethernet208|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet208|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet208|5": { "scheduler": "scheduler.0" }, - "Ethernet64|2": { + "str2-7250-lc2-1|asic1|Ethernet208|6": { "scheduler": "scheduler.0" }, - "Ethernet72|2": { + "str2-7250-lc2-1|asic1|Ethernet216|0": { "scheduler": "scheduler.0" }, - "Ethernet80|2": { + "str2-7250-lc2-1|asic1|Ethernet216|1": { "scheduler": "scheduler.0" }, - "Ethernet88|2": { + "str2-7250-lc2-1|asic1|Ethernet216|2": { "scheduler": "scheduler.0" }, - "Ethernet96|2": { + "str2-7250-lc2-1|asic1|Ethernet216|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet216|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet216|5": { "scheduler": "scheduler.0" }, - "Ethernet104|2": { + "str2-7250-lc2-1|asic1|Ethernet216|6": { "scheduler": "scheduler.0" }, - "Ethernet112|2": { + "str2-7250-lc2-1|asic1|Ethernet224|0": { "scheduler": "scheduler.0" }, - "Ethernet120|2": { + "str2-7250-lc2-1|asic1|Ethernet224|1": { "scheduler": "scheduler.0" }, - "Ethernet128|2": { + "str2-7250-lc2-1|asic1|Ethernet224|2": { "scheduler": "scheduler.0" }, - "Ethernet136|2": { + "str2-7250-lc2-1|asic1|Ethernet224|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet224|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet224|5": { "scheduler": "scheduler.0" }, - "Ethernet0|5": { + "str2-7250-lc2-1|asic1|Ethernet224|6": { "scheduler": "scheduler.0" }, - "Ethernet8|5": { + "str2-7250-lc2-1|asic1|Ethernet232|0": { "scheduler": "scheduler.0" }, - "Ethernet16|5": { + "str2-7250-lc2-1|asic1|Ethernet232|1": { "scheduler": "scheduler.0" }, - "Ethernet24|5": { + "str2-7250-lc2-1|asic1|Ethernet232|2": { "scheduler": "scheduler.0" }, - "Ethernet32|5": { + "str2-7250-lc2-1|asic1|Ethernet232|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet232|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet232|5": { "scheduler": "scheduler.0" }, - "Ethernet40|5": { + "str2-7250-lc2-1|asic1|Ethernet232|6": { "scheduler": "scheduler.0" }, - "Ethernet48|5": { + "str2-7250-lc2-1|asic1|Ethernet240|0": { "scheduler": "scheduler.0" }, - "Ethernet56|5": { + "str2-7250-lc2-1|asic1|Ethernet240|1": { "scheduler": "scheduler.0" }, - "Ethernet64|5": { + "str2-7250-lc2-1|asic1|Ethernet240|2": { "scheduler": "scheduler.0" }, - "Ethernet72|5": { + "str2-7250-lc2-1|asic1|Ethernet240|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet240|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet240|5": { "scheduler": "scheduler.0" }, - "Ethernet80|5": { + "str2-7250-lc2-1|asic1|Ethernet240|6": { "scheduler": "scheduler.0" }, - "Ethernet88|5": { + "str2-7250-lc2-1|asic1|Ethernet248|0": { "scheduler": "scheduler.0" }, - "Ethernet96|5": { + "str2-7250-lc2-1|asic1|Ethernet248|1": { "scheduler": "scheduler.0" }, - "Ethernet104|5": { + "str2-7250-lc2-1|asic1|Ethernet248|2": { "scheduler": "scheduler.0" }, - "Ethernet112|5": { + "str2-7250-lc2-1|asic1|Ethernet248|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet248|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet248|5": { "scheduler": "scheduler.0" }, - "Ethernet120|5": { + "str2-7250-lc2-1|asic1|Ethernet248|6": { "scheduler": "scheduler.0" }, - "Ethernet128|5": { + "str2-7250-lc2-1|asic1|Ethernet256|0": { "scheduler": "scheduler.0" }, - "Ethernet136|5": { + "str2-7250-lc2-1|asic1|Ethernet256|1": { "scheduler": "scheduler.0" }, - "Ethernet0|6": { + "str2-7250-lc2-1|asic1|Ethernet256|2": { "scheduler": "scheduler.0" }, - "Ethernet8|6": { + "str2-7250-lc2-1|asic1|Ethernet256|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet256|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet256|5": { "scheduler": "scheduler.0" }, - "Ethernet16|6": { + "str2-7250-lc2-1|asic1|Ethernet256|6": { "scheduler": "scheduler.0" }, - "Ethernet24|6": { + "str2-7250-lc2-1|asic1|Ethernet264|0": { "scheduler": "scheduler.0" }, - "Ethernet32|6": { + "str2-7250-lc2-1|asic1|Ethernet264|1": { "scheduler": "scheduler.0" }, - "Ethernet40|6": { + "str2-7250-lc2-1|asic1|Ethernet264|2": { "scheduler": "scheduler.0" }, - "Ethernet48|6": { + "str2-7250-lc2-1|asic1|Ethernet264|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet264|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet264|5": { "scheduler": "scheduler.0" }, - "Ethernet56|6": { + "str2-7250-lc2-1|asic1|Ethernet264|6": { "scheduler": "scheduler.0" }, - "Ethernet64|6": { + "str2-7250-lc2-1|asic1|Ethernet272|0": { "scheduler": "scheduler.0" }, - "Ethernet72|6": { + "str2-7250-lc2-1|asic1|Ethernet272|1": { "scheduler": "scheduler.0" }, - "Ethernet80|6": { + "str2-7250-lc2-1|asic1|Ethernet272|2": { "scheduler": "scheduler.0" }, - "Ethernet88|6": { + "str2-7250-lc2-1|asic1|Ethernet272|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet272|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet272|5": { "scheduler": "scheduler.0" }, - "Ethernet96|6": { + "str2-7250-lc2-1|asic1|Ethernet272|6": { "scheduler": "scheduler.0" }, - "Ethernet104|6": { + "str2-7250-lc2-1|asic1|Ethernet280|0": { "scheduler": "scheduler.0" }, - "Ethernet112|6": { + "str2-7250-lc2-1|asic1|Ethernet280|1": { "scheduler": "scheduler.0" }, - "Ethernet120|6": { + "str2-7250-lc2-1|asic1|Ethernet280|2": { "scheduler": "scheduler.0" }, - "Ethernet128|6": { + "str2-7250-lc2-1|asic1|Ethernet280|3": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet280|4": { + "scheduler": "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "str2-7250-lc2-1|asic1|Ethernet280|5": { "scheduler": "scheduler.0" }, - "Ethernet136|6": { + "str2-7250-lc2-1|asic1|Ethernet280|6": { "scheduler": "scheduler.0" } } From e73f1110ade1ecd4becfc3697a030983daedc54d Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 20 Jul 2023 06:56:24 +0800 Subject: [PATCH 036/145] [Build] Fix the dash cache dependency issue (#15851) #### Why I did it [Build] Fix the dash cache dependency issue ``` 12:47:34 [ finished ] [ target/files/bullseye/ctrmgrd.service ] 12:47:36 fatal: Unable to hash src/sonic-dash-api/sonic-dash-api 12:47:36 make: *** [Makefile.cache:528: target/debs/bullseye/libdashapi_1.0.0_amd64.deb.smdep] Error 123 12:47:36 make: *** Waiting for unfinished jobs.... ``` ##### Work item tracking - Microsoft ADO **(number only)**: 24547630 --- rules/sonic-dash-api.dep | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rules/sonic-dash-api.dep b/rules/sonic-dash-api.dep index 6bf9209e499d..6d4ffcad847f 100644 --- a/rules/sonic-dash-api.dep +++ b/rules/sonic-dash-api.dep @@ -2,7 +2,8 @@ SPATH := $($(LIB_SONIC_DASH_API)_SRC_PATH) DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-dash-api.mk rules/sonic-dash-api.dep DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) -SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) +DEP_FILES += $(shell git ls-files $(SPATH) | grep -v sonic-dash-api) +SMDEP_FILES := $(addprefix $(SPATH)/sonic-dash-api/,$(shell cd $(SPATH)/sonic-dash-api && git ls-files)) $(LIB_SONIC_DASH_API)_CACHE_MODE := GIT_CONTENT_SHA $(LIB_SONIC_DASH_API)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) From e4d2752143b5cd7025176e16a52b6b75c1a90829 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 20 Jul 2023 09:47:43 +0800 Subject: [PATCH 037/145] [submodule] Update submodule sonic-swss to the latest HEAD automatically (#15908) #### Why I did it src/sonic-swss ``` * cb1b3f40 - (HEAD -> master, origin/master, origin/HEAD) Remove system neighbor DEL operation in m_toSync if SET operation for (#2853) (7 hours ago) [Song Yuan] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 5b27c209ed95..cb1b3f409dc4 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 5b27c209ed952bb6d2324fd9834e6ce3d49b8ee3 +Subproject commit cb1b3f409dc453848a62a872f7ae091e7df892b7 From 7533c8ccf6883a99c8e1e0d4427d3b36cd97ec39 Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Thu, 20 Jul 2023 14:28:08 +0800 Subject: [PATCH 038/145] [sonic-mgmt docker image] Upgrade celery in the python3 to 5.2.7, upgrade ipython to 8.12.2 (#15911) Upgrade celery in the python3 to 5.2.7, Upgrade ipython to 8.12.2 since 5.4.1 requires prompt-toolkit<2.0.0,>=1.0.4, But celery 5.2.7 relies click-repl>=0.2.0 , click-repl>=0.2.0 relies prompt-toolkit>=3.0.36. So upgrade ipython to resolve the prompt-toolkit version incompatible issue. --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index f110d8baa82f..2a48616d8537 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -46,7 +46,7 @@ RUN pip3 install aiohttp \ azure-kusto-data \ azure-kusto-ingest \ defusedxml \ - celery[redis]==4.4.7 \ + celery[redis]==5.2.7 \ cffi \ contextlib2==0.6.0.post1 \ cryptography==3.3.2 \ @@ -54,7 +54,7 @@ RUN pip3 install aiohttp \ "future>=0.16.0" \ gitpython \ ipaddr \ - ipython==5.4.1 \ + ipython==8.12.2 \ ixnetwork-restpy==1.0.64 \ ixnetwork-open-traffic-generator==0.0.79 \ jinja2==2.10.1 \ @@ -280,7 +280,7 @@ RUN python3 -m pip install aiohttp \ azure-kusto-data \ azure-kusto-ingest \ defusedxml \ - celery[redis]==4.4.7 \ + celery[redis]==5.2.7 \ cffi \ contextlib2==0.6.0.post1 \ cryptography==3.3.2 \ @@ -288,7 +288,7 @@ RUN python3 -m pip install aiohttp \ "future>=0.16.0" \ gitpython \ ipaddr \ - ipython==5.4.1 \ + ipython==8.12.2 \ ixnetwork-restpy==1.0.64 \ ixnetwork-open-traffic-generator==0.0.79 \ jinja2==2.10.1 \ From 135243d7bf3f97973e027dc280287d0413516b23 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 20 Jul 2023 19:16:40 +0800 Subject: [PATCH 039/145] [submodule] Update submodule sonic-swss to the latest HEAD automatically (#15920) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index cb1b3f409dc4..a2a583656a59 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit cb1b3f409dc453848a62a872f7ae091e7df892b7 +Subproject commit a2a583656a592b8b524fe6c5836ea63a2f43d070 From 601ec40700ef4576b6ffb94eff844c6bb3d80c36 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 20 Jul 2023 19:20:29 +0800 Subject: [PATCH 040/145] [submodule] Update submodule sonic-linux-kernel to the latest HEAD automatically (#15916) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index d070cae8e92a..e72818fcb6c2 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit d070cae8e92ae3cd9798546e27d796a71fd7e914 +Subproject commit e72818fcb6c2b02864e66d842d67e13d8b67df4a From a4787fd213a2c0f8c07f609dd7067fbc11938355 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:50:08 +0800 Subject: [PATCH 041/145] [submodule] Update submodule sonic-gnmi to the latest HEAD automatically (#15921) #### Why I did it src/sonic-gnmi ``` * 610509b - (HEAD -> master, origin/master, origin/HEAD) Install necessary debs instead of entire artifact in azp (#137) (2 hours ago) [Zain Budhwani] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-gnmi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-gnmi b/src/sonic-gnmi index 01fe667e7d44..610509b3cc61 160000 --- a/src/sonic-gnmi +++ b/src/sonic-gnmi @@ -1 +1 @@ -Subproject commit 01fe667e7d44cdfb2d046064c18e4d14ac6c0b4d +Subproject commit 610509b3cc610af9373110e33dec807a8f9b7e11 From 371c3a0be5c046eed2a98ffac108aaee547718f4 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Thu, 20 Jul 2023 09:14:23 -0700 Subject: [PATCH 042/145] Add support for deb build profiles env variable (#15858) Add support for a separate DEB_BUILD_PROFILES environment variable, to be able to set build profiles. This may be used to specify whether python 2 bindings/libraries should be built, or what configuration options should be specified for a package. This also makes it easier to append/remove build profiles from our rules files, which will be needed for the sairedis build. Signed-off-by: Saikrishna Arcot --- rules/sairedis.mk | 2 +- rules/swss-common.mk | 2 +- rules/syncd.mk | 2 +- slave.mk | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index baa32493b330..73ea1366bb92 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -46,7 +46,7 @@ $(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) ifeq ($(ENABLE_PY2_MODULES), n) - $(LIBSAIREDIS)_BUILD_ENV += DEB_BUILD_PROFILES=nopython2 + $(LIBSAIREDIS)_DEB_BUILD_PROFILES += nopython2 endif # The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} diff --git a/rules/swss-common.mk b/rules/swss-common.mk index 462e0b3e96f3..838c9a6725da 100644 --- a/rules/swss-common.mk +++ b/rules/swss-common.mk @@ -21,7 +21,7 @@ ifeq ($(ENABLE_PY2_MODULES), y) PYTHON_SWSSCOMMON = python-swsscommon_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(PYTHON_SWSSCOMMON))) else - $(LIBSWSSCOMMON)_BUILD_ENV += DEB_BUILD_PROFILES=nopython2 + $(LIBSWSSCOMMON)_DEB_BUILD_PROFILES += nopython2 endif PYTHON3_SWSSCOMMON = python3-swsscommon_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb diff --git a/rules/syncd.mk b/rules/syncd.mk index 225f7ec0574c..6aa3e990843a 100644 --- a/rules/syncd.mk +++ b/rules/syncd.mk @@ -34,7 +34,7 @@ $(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBG))) endif ifeq ($(ENABLE_PY2_MODULES), n) - $(SYNCD)_BUILD_ENV += DEB_BUILD_PROFILES=nopython2 + $(SYNCD)_DEB_BUILD_PROFILES += nopython2 endif endif diff --git a/slave.mk b/slave.mk index 4b49234c7c18..205445a08027 100644 --- a/slave.mk +++ b/slave.mk @@ -738,8 +738,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a if [ -f ./autogen.sh ]; then ./autogen.sh $(LOG); fi $(SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR) $(if $($*_DPKG_TARGET), - ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) dpkg-buildpackage -rfakeroot -b $(ANT_DEB_CROSS_OPT) -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --as-root -T$($*_DPKG_TARGET) --admindir $$mergedir $(LOG), - ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) dpkg-buildpackage -rfakeroot -b $(ANT_DEB_CROSS_OPT) -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $$mergedir $(LOG) + ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" DEB_BUILD_PROFILES="${$*_DEB_BUILD_PROFILES}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) dpkg-buildpackage -rfakeroot -b $(ANT_DEB_CROSS_OPT) -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --as-root -T$($*_DPKG_TARGET) --admindir $$mergedir $(LOG), + ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" DEB_BUILD_PROFILES="${$*_DEB_BUILD_PROFILES}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) dpkg-buildpackage -rfakeroot -b $(ANT_DEB_CROSS_OPT) -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $$mergedir $(LOG) ) popd $(LOG_SIMPLE) # Clean up From 05314f9e5b0df5131ad09e438841e905314891b4 Mon Sep 17 00:00:00 2001 From: Aravind Mani <53524901+aravindmani-1@users.noreply.github.com> Date: Thu, 20 Jul 2023 22:19:48 +0530 Subject: [PATCH 043/145] DellEMC: S5248F update LED Firmware (#15790) * DellEMC: S5248F update LED firmware --- .../DellEMC-S5248f-P-10G/custom_led.bin | Bin 372 -> 196 bytes .../td3-s5248f-10g.config.bcm | 3 +- .../DellEMC-S5248f-P-25G/custom_led.bin | Bin 372 -> 196 bytes .../td3-s5248f-25g.config.bcm | 2 +- .../port-locator.soc | 152 ++++++++++++++++++ 5 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 device/dell/x86_64-dellemc_s5248f_c3538-r0/port-locator.soc diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/custom_led.bin b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/custom_led.bin index b3966e520c51dd288e36859523157396cb587911..626e41c3bbbda1b1e4fe22ded972fdb4b3e72b25 100755 GIT binary patch delta 136 zcmV;30C)fN0>lA-@U?@m4*(iTc|-~TP%#81fF%PY0V6v=0y6=V2H-o3bYW9YXHV0w)|o>(Bw8>E{6>!(anp7$QPp7CM4q!(kXR q17bHbLt=tr03*X>Cjmvn(<|cu delta 301 zcmX@Y_=Tzd!`67WFgIT}7q<^vnm0K3Feo{A&v9c=Zctt2#;mr%jZvN7fpNNxXQvzM z0|jlSi!91>To{xYO&E<-D^@bFWpqmNbudh0RGjIM?q;9C@5FY&5onrj27|8r1x7{L z2aZ6~8RpwLNnDt?$v~~osngNZiOI0rtv#bQmQB~H9;hhJ&CtpGf~E|orLR+_Bcq|= z1IGCb`V2sWrZTu?td-PkU^EWUI&e|iJ32#7oBN`qH-l1Cf^-IhHq!+$Z>a>P2aHN0 zKw8*4DudA|DuGe?Z~}9pgpyMtlTuUS;Y3Mg=A-~+=cJ}22Ia#^hm#Mdus&c?ba!Kz stM4Rp^5U82%o}X>OmLg&w#aR@+lRd}mJAFlHZU;cSWYYo;$VOR0MZ6r1^@s6 diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/td3-s5248f-10g.config.bcm b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/td3-s5248f-10g.config.bcm index 69c3d1af90d9..3a7aeafc586a 100644 --- a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/td3-s5248f-10g.config.bcm +++ b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/td3-s5248f-10g.config.bcm @@ -350,5 +350,4 @@ dport_map_port_5=55 dport_map_port_41=56 mmu_init_config="TD3-DELL-lossless" -#sai_preinit_cmd_file=/usr/share/sonic/hwsku/sai_preinit_cmd.soc - +sai_preinit_cmd_file=/usr/share/sonic/hwsku/sai_preinit_cmd.soc diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/custom_led.bin b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/custom_led.bin index b3966e520c51dd288e36859523157396cb587911..626e41c3bbbda1b1e4fe22ded972fdb4b3e72b25 100755 GIT binary patch delta 136 zcmV;30C)fN0>lA-@U?@m4*(iTc|-~TP%#81fF%PY0V6v=0y6=V2H-o3bYW9YXHV0w)|o>(Bw8>E{6>!(anp7$QPp7CM4q!(kXR q17bHbLt=tr03*X>Cjmvn(<|cu delta 301 zcmX@Y_=Tzd!`67WFgIT}7q<^vnm0K3Feo{A&v9c=Zctt2#;mr%jZvN7fpNNxXQvzM z0|jlSi!91>To{xYO&E<-D^@bFWpqmNbudh0RGjIM?q;9C@5FY&5onrj27|8r1x7{L z2aZ6~8RpwLNnDt?$v~~osngNZiOI0rtv#bQmQB~H9;hhJ&CtpGf~E|orLR+_Bcq|= z1IGCb`V2sWrZTu?td-PkU^EWUI&e|iJ32#7oBN`qH-l1Cf^-IhHq!+$Z>a>P2aHN0 zKw8*4DudA|DuGe?Z~}9pgpyMtlTuUS;Y3Mg=A-~+=cJ}22Ia#^hm#Mdus&c?ba!Kz stM4Rp^5U82%o}X>OmLg&w#aR@+lRd}mJAFlHZU;cSWYYo;$VOR0MZ6r1^@s6 diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/td3-s5248f-25g.config.bcm b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/td3-s5248f-25g.config.bcm index 468b7d527989..028a04484a88 100644 --- a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/td3-s5248f-25g.config.bcm +++ b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/td3-s5248f-25g.config.bcm @@ -352,5 +352,5 @@ dport_map_port_5=55 dport_map_port_41=56 mmu_init_config="TD3-DELL-lossless" -#sai_preinit_cmd_file=/usr/share/sonic/hwsku/sai_preinit_cmd.soc +sai_preinit_cmd_file=/usr/share/sonic/hwsku/sai_preinit_cmd.soc diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/port-locator.soc b/device/dell/x86_64-dellemc_s5248f_c3538-r0/port-locator.soc new file mode 100644 index 000000000000..23fd23b47b0f --- /dev/null +++ b/device/dell/x86_64-dellemc_s5248f_c3538-r0/port-locator.soc @@ -0,0 +1,152 @@ +# LED interface controls +config add sai_led_intf_enable_0=1 +config add sai_led_intf_head_0=1 +config add sai_led_intf_tail_0=24 +config add sai_led_intf_bits_0=2 + +config add sai_led_intf_enable_1=1 +config add sai_led_intf_head_1=25 +config add sai_led_intf_tail_1=80 +config add sai_led_intf_bits_1=2 + +# LED data patterns for ON/OFF +config add sai_led_patt_off_0=0x3 +config add sai_led_patt_on_0=0x2 + +# Physical Port --> LED Port (1-based indexing) +# 1-lane port [49-49] Ethernet0 Eth1/1 +config add sai_led_portmap_49=2 +# 1-lane port [50-50] Ethernet1 Eth1/2 +config add sai_led_portmap_50=3 +# 1-lane port [51-51] Ethernet2 Eth1/3 +config add sai_led_portmap_51=4 +# 1-lane port [52-52] Ethernet3 Eth1/4 +config add sai_led_portmap_52=5 +# 1-lane port [57-57] Ethernet4 Eth1/5 +config add sai_led_portmap_57=6 +# 1-lane port [58-58] Ethernet5 Eth1/6 +config add sai_led_portmap_58=7 +# 1-lane port [59-59] Ethernet6 Eth1/7 +config add sai_led_portmap_59=8 +# 1-lane port [60-60] Ethernet7 Eth1/8 +config add sai_led_portmap_60=9 +# 1-lane port [61-61] Ethernet8 Eth1/9 +config add sai_led_portmap_61=10 +# 1-lane port [62-62] Ethernet9 Eth1/10 +config add sai_led_portmap_62=11 +# 1-lane port [63-63] Ethernet10 Eth1/11 +config add sai_led_portmap_63=12 +# 1-lane port [64-64] Ethernet11 Eth1/12 +config add sai_led_portmap_64=13 +# 1-lane port [77-77] Ethernet12 Eth1/13 +config add sai_led_portmap_77=14 +# 1-lane port [78-78] Ethernet13 Eth1/14 +config add sai_led_portmap_78=15 +# 1-lane port [79-79] Ethernet14 Eth1/15 +config add sai_led_portmap_79=16 +# 1-lane port [80-80] Ethernet15 Eth1/16 +config add sai_led_portmap_80=17 +# 1-lane port [85-85] Ethernet16 Eth1/17 +config add sai_led_portmap_85=18 +# 1-lane port [86-86] Ethernet17 Eth1/18 +config add sai_led_portmap_86=19 +# 1-lane port [87-87] Ethernet18 Eth1/19 +config add sai_led_portmap_87=20 +# 1-lane port [88-88] Ethernet19 Eth1/20 +config add sai_led_portmap_88=21 +# 1-lane port [93-93] Ethernet20 Eth1/21 +config add sai_led_portmap_93=22 +# 1-lane port [94-94] Ethernet21 Eth1/22 +config add sai_led_portmap_94=23 +# 1-lane port [95-95] Ethernet22 Eth1/23 +config add sai_led_portmap_95=24 +# 1-lane port [96-96] Ethernet23 Eth1/24 +config add sai_led_portmap_96=25 +# 1-lane port [13-13] Ethernet24 Eth1/25 +config add sai_led_portmap_13=26 +# 1-lane port [14-14] Ethernet25 Eth1/26 +config add sai_led_portmap_14=27 +# 1-lane port [15-15] Ethernet26 Eth1/27 +config add sai_led_portmap_15=28 +# 1-lane port [16-16] Ethernet27 Eth1/28 +config add sai_led_portmap_16=29 +# 1-lane port [21-21] Ethernet28 Eth1/29 +config add sai_led_portmap_21=30 +# 1-lane port [22-22] Ethernet29 Eth1/30 +config add sai_led_portmap_22=31 +# 1-lane port [23-23] Ethernet30 Eth1/31 +config add sai_led_portmap_23=32 +# 1-lane port [24-24] Ethernet31 Eth1/32 +config add sai_led_portmap_24=33 +# 1-lane port [29-29] Ethernet32 Eth1/33 +config add sai_led_portmap_29=34 +# 1-lane port [30-30] Ethernet33 Eth1/34 +config add sai_led_portmap_30=35 +# 1-lane port [31-31] Ethernet34 Eth1/35 +config add sai_led_portmap_31=36 +# 1-lane port [32-32] Ethernet35 Eth1/36 +config add sai_led_portmap_32=37 +# 1-lane port [97-97] Ethernet36 Eth1/37 +config add sai_led_portmap_97=38 +# 1-lane port [98-98] Ethernet37 Eth1/38 +config add sai_led_portmap_98=39 +# 1-lane port [99-99] Ethernet38 Eth1/39 +config add sai_led_portmap_99=40 +# 1-lane port [100-100] Ethernet39 Eth1/40 +config add sai_led_portmap_100=41 +# 1-lane port [105-105] Ethernet40 Eth1/41 +config add sai_led_portmap_105=42 +# 1-lane port [106-106] Ethernet41 Eth1/42 +config add sai_led_portmap_106=43 +# 1-lane port [107-107] Ethernet42 Eth1/43 +config add sai_led_portmap_107=44 +# 1-lane port [108-108] Ethernet43 Eth1/44 +config add sai_led_portmap_108=45 +# 1-lane port [113-113] Ethernet44 Eth1/45 +config add sai_led_portmap_113=46 +# 1-lane port [114-114] Ethernet45 Eth1/46 +config add sai_led_portmap_114=47 +# 1-lane port [115-115] Ethernet46 Eth1/47 +config add sai_led_portmap_115=48 +# 1-lane port [116-116] Ethernet47 Eth1/48 +config add sai_led_portmap_116=49 +# QSFP [121-124] Ethernet48-51 Eth1/49/1-4 +config add sai_led_portmap_121=66 +config add sai_led_portmap_122=67 +config add sai_led_portmap_123=68 +config add sai_led_portmap_124=69 +# QSFP [125-128] Ethernet52-55 Eth1/50/1-4 +config add sai_led_portmap_125=70 +config add sai_led_portmap_126=71 +config add sai_led_portmap_127=72 +config add sai_led_portmap_128=73 +# QSFP [69-72] Ethernet56-59 Eth1/51/1-4 +config add sai_led_portmap_69=74 +config add sai_led_portmap_70=75 +config add sai_led_portmap_71=76 +config add sai_led_portmap_72=77 +# QSFP [65-68] Ethernet60-63 Eth1/52/1-4 +config add sai_led_portmap_65=78 +config add sai_led_portmap_66=79 +config add sai_led_portmap_67=80 +config add sai_led_portmap_68=81 +# QSFP [1-4] Ethernet64-67 Eth1/53/1-4 +config add sai_led_portmap_1=50 +config add sai_led_portmap_2=51 +config add sai_led_portmap_3=52 +config add sai_led_portmap_4=53 +# QSFP [33-36] Ethernet68-71 Eth1/54/1-4 +config add sai_led_portmap_33=54 +config add sai_led_portmap_34=55 +config add sai_led_portmap_35=56 +config add sai_led_portmap_36=57 +# QSFP [5-8] Ethernet72-75 Eth1/55/1-4 +config add sai_led_portmap_5=58 +config add sai_led_portmap_6=59 +config add sai_led_portmap_7=60 +config add sai_led_portmap_8=61 +# QSFP [41-44] Ethernet76-79 Eth1/56/1-4 +config add sai_led_portmap_41=62 +config add sai_led_portmap_42=63 +config add sai_led_portmap_43=64 +config add sai_led_portmap_44=65 From 2de5abdaf4f7cf83630f0b549e05a5e0d0e86a6d Mon Sep 17 00:00:00 2001 From: Aravind Mani <53524901+aravindmani-1@users.noreply.github.com> Date: Thu, 20 Jul 2023 22:20:22 +0530 Subject: [PATCH 044/145] DellEMC: Fix API2.0 initialization issue (#15687) Why I did it To fix sonic-net/sonic-mgmt#8786 How I did it Modified Fan API to check whether the data retrieved is valid or not and return accordingly How to verify it Verify whether API 2.0 is loaded properly or not. Execute CLI's like "show version", "show interface status", "show platform psustatus" etc.. --- .../s5224f/sonic_platform/fan.py | 12 +++++++----- .../s5232f/sonic_platform/fan.py | 10 ++++++---- .../s5248f/sonic_platform/fan.py | 12 +++++++----- .../z9264f/sonic_platform/fan.py | 10 ++++++---- .../z9432f/sonic_platform/fan.py | 7 +++++-- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py index 57e163469a95..b67f6acea657 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py @@ -71,8 +71,7 @@ def __init__(self, fantray_index=1, fan_index=1, psu_fan=False, self.fru = IpmiFru(self.PSU_FRU_MAPPING[self.fanindex]) self.max_speed_offset = PSU_FAN_MAX_SPEED_OFFSET self.fan_direction_offset = PSU_FAN_DIRECTION_OFFSET - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + self.max_speed = 0 def get_name(self): """ @@ -163,11 +162,14 @@ def get_speed(self): int: percentage of the max fan speed """ if self.max_speed == 0: - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + is_valid, max_speed = self.fru.get_fru_data(self.max_speed_offset,2) + if not is_valid: + return 0 + self.max_speed = max_speed[1] + self.max_speed = max_speed[1] << 8 | max_speed[0] is_valid, fan_speed = self.speed_sensor.get_reading() if not is_valid or self.max_speed == 0: - return None + speed = 0 else: speed = (100 * fan_speed)//self.max_speed return speed diff --git a/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/fan.py index c634dc7d0d17..2b37bd3783d2 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/fan.py @@ -69,8 +69,7 @@ def __init__(self, fantray_index=1, fan_index=1, psu_fan=False, self.fru = IpmiFru(self.PSU_FRU_MAPPING[self.fanindex]) self.max_speed_offset = PSU_FAN_MAX_SPEED_OFFSET self.fan_direction_offset = PSU_FAN_DIRECTION_OFFSET - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + self.max_speed = 0 def get_name(self): """ @@ -163,8 +162,11 @@ def get_speed(self): int: percentage of the max fan speed """ if self.max_speed == 0: - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + is_valid, max_speed = self.fru.get_fru_data(self.max_speed_offset,2) + if not is_valid: + return 0 + self.max_speed = max_speed[1] + self.max_speed = max_speed[1] << 8 | max_speed[0] is_valid, fan_speed = self.speed_sensor.get_reading() if not is_valid or self.max_speed == 0: speed = 0 diff --git a/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/fan.py index 55327d5ddf58..a9b0fcc4b2f7 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/fan.py @@ -71,8 +71,7 @@ def __init__(self, fantray_index=1, fan_index=1, psu_fan=False, self.fru = IpmiFru(self.PSU_FRU_MAPPING[self.fanindex]) self.max_speed_offset = PSU_FAN_MAX_SPEED_OFFSET self.fan_direction_offset = PSU_FAN_DIRECTION_OFFSET - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + self.max_speed = 0 def get_name(self): """ @@ -165,11 +164,14 @@ def get_speed(self): int: percentage of the max fan speed """ if self.max_speed == 0: - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + is_valid, max_speed = self.fru.get_fru_data(self.max_speed_offset,2) + if not is_valid: + return 0 + self.max_speed = max_speed[1] + self.max_speed = max_speed[1] << 8 | max_speed[0] is_valid, fan_speed = self.speed_sensor.get_reading() if not is_valid or self.max_speed == 0: - return None + speed = 0 else: speed = (100 * fan_speed)//self.max_speed return speed diff --git a/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/fan.py index b7d990877daa..f9dacc94d9de 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/fan.py @@ -71,8 +71,7 @@ def __init__(self, fantray_index=1, fan_index=1, psu_fan=False, self.fru = IpmiFru(self.PSU_FRU_MAPPING[self.fanindex]) self.max_speed_offset = PSU_FAN_MAX_SPEED_OFFSET self.fan_direction_offset = PSU_FAN_DIRECTION_OFFSET - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + self.max_speed = 0 def get_name(self): """ @@ -165,8 +164,11 @@ def get_speed(self): int: percentage of the max fan speed """ if self.max_speed == 0: - self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + is_valid, max_speed = self.fru.get_fru_data(self.max_speed_offset,2) + if not is_valid: + return 0 + self.max_speed = max_speed[1] + self.max_speed = max_speed[1] << 8 | max_speed[0] is_valid, fan_speed = self.speed_sensor.get_reading() if not is_valid or self.max_speed == 0: speed = 0 diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan.py index b95b4d070ae0..a928d559cbfa 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan.py @@ -165,8 +165,11 @@ def get_speed(self): int: percentage of the max fan speed """ if self.max_speed == 0: - self.max_speed = self.fru.get_fru_data(self.max_speed_offset, 2)[1] - self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + is_valid, max_speed = self.fru.get_fru_data(self.max_speed_offset, 2) + if not is_valid: + return 0 + self.max_speed = max_speed[1] + self.max_speed = max_speed[1] << 8 | max_speed[0] is_valid, fan_speed = self.speed_sensor.get_reading() if not is_valid or self.max_speed == 0: return None From 2d0bad0523fadd0bdc6f7ea348de70cebb0e228e Mon Sep 17 00:00:00 2001 From: wilson-smci <133636887+wilson-smci@users.noreply.github.com> Date: Fri, 21 Jul 2023 01:24:56 +0800 Subject: [PATCH 045/145] [Supermicro]: Add a new supported device and platform, SSE-T7132S. (#15368) * * platform/innoviunm: Add a new supported device and platform, SSE-T7132S * Switch Vendor: Supermicro * Switch SKU: Supermicro_sse_t7132s * ASIC Vendor: innovium * Swich ASIC: TL7 * Port Configuration: 32x400G * SONiC Image: SONiC-ONIE-Innoviunm Signed-off-by: wilsonw --- .../CSV/TL7_DAC_1M.csv | 263 +++ .../CSV/TL7_DAC_3M.csv | 263 +++ .../CSV/TL7_Optics.csv | 263 +++ .../CSV/TL7_RJ45.csv | 7 + .../Supermicro_sse_t7132s/buffers.json.j2 | 167 ++ .../buffers_defaults_def_lossy.j2 | 45 + .../buffers_defaults_t1.j2 | 167 ++ .../config_32x400G_sse_t7132s.yaml | 440 +++++ .../Supermicro_sse_t7132s/innovium.77700_A | 60 + .../Supermicro_sse_t7132s/innovium.77700_B | 60 + .../Supermicro_sse_t7132s/ivm.sai.config.yaml | 10 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 22 + .../Supermicro_sse_t7132s/port_config.ini | 35 + .../Supermicro_sse_t7132s/qos.json.j2 | 195 ++ .../qos_defaults_def_lossy.j2 | 124 ++ .../Supermicro_sse_t7132s/qos_defaults_t1.j2 | 195 ++ .../Supermicro_sse_t7132s/sai.profile | 1 + .../default_sku | 1 + .../fast-reboot_plugin | 2 + .../installer.conf | 4 + .../lib_ivm_serdes_pltfm.so | Bin 0 -> 283696 bytes .../x86_64-supermicro_sse_t7132s-r0/pcie.yaml | 453 +++++ .../platform.json | 238 +++ .../platform_asic | 1 + .../plugins/eeprom.py | 20 + .../plugins/psuutil.py | 84 + .../plugins/sfputil.py | 211 ++ .../plugins/ssd_util.py | 8 + .../pmon_daemon_control.json | 6 + .../sensors.conf | 2 + .../system_health_monitoring_config.json | 11 + .../thermal_policy.json | 0 .../x86_64-supermicro_sse_t7132s-r0/topo.conf | 1 + .../warm-reboot_plugin | 2 + platform/innovium/one-image.mk | 1 + .../innovium/platform-modules-supermicro.mk | 9 + platform/innovium/rules.mk | 1 + .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 16 + .../platform-modules-sse-t7132s.install | 8 + .../platform-modules-sse-t7132s.postinst | 14 + .../debian/rules | 39 + .../sse-t7132s/cfg/iTCO_wdt.conf | 1 + .../sse-t7132s/cfg/t7132s-modules.conf | 16 + .../sse-t7132s/modules/Makefile | 1 + .../sse-t7132s/modules/t7132s.c | 1706 +++++++++++++++++ .../scripts/health_checker_thermal.py | 50 + .../sse-t7132s/scripts/platform.sh | 102 + .../sse-t7132s/scripts/sysledctl.py | 53 + .../sse-t7132s/scripts/test_cpld.py | 209 ++ .../sse-t7132s/setup.py | 30 + .../sse-t7132s/sonic_platform/__init__.py | 2 + .../sse-t7132s/sonic_platform/chassis.py | 566 ++++++ .../sse-t7132s/sonic_platform/component.py | 106 + .../sse-t7132s/sonic_platform/eeprom.py | 122 ++ .../sse-t7132s/sonic_platform/fan.py | 353 ++++ .../sse-t7132s/sonic_platform/fan_drawer.py | 121 ++ .../sse-t7132s/sonic_platform/helper.py | 108 ++ .../sse-t7132s/sonic_platform/pcie.py | 18 + .../sse-t7132s/sonic_platform/platform.py | 21 + .../sse-t7132s/sonic_platform/psu.py | 545 ++++++ .../sse-t7132s/sonic_platform/sfp.py | 444 +++++ .../sse-t7132s/sonic_platform/thermal.py | 253 +++ .../sse-t7132s/sonic_platform/watchdog.py | 317 +++ .../platform-modules-sse-t7132s.service | 14 + .../sse-t7132s/systemd/sysled.service | 15 + 68 files changed, 8637 insertions(+) create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_1M.csv create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_3M.csv create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_Optics.csv create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_RJ45.csv create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers.json.j2 create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_def_lossy.j2 create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_t1.j2 create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/config_32x400G_sse_t7132s.yaml create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_A create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_B create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.config.yaml create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.datapath.config.yaml create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/pg_profile_lookup.ini create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/port_config.ini create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos.json.j2 create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_def_lossy.j2 create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_t1.j2 create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/sai.profile create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/default_sku create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/fast-reboot_plugin create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/installer.conf create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/lib_ivm_serdes_pltfm.so create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/pcie.yaml create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform.json create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform_asic create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/eeprom.py create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/psuutil.py create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/sfputil.py create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/ssd_util.py create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/pmon_daemon_control.json create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/sensors.conf create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/system_health_monitoring_config.json create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/thermal_policy.json create mode 100644 device/supermicro/x86_64-supermicro_sse_t7132s-r0/topo.conf create mode 100755 device/supermicro/x86_64-supermicro_sse_t7132s-r0/warm-reboot_plugin create mode 100644 platform/innovium/platform-modules-supermicro.mk create mode 100644 platform/innovium/sonic-platform-modules-supermicro/debian/changelog create mode 100644 platform/innovium/sonic-platform-modules-supermicro/debian/compat create mode 100644 platform/innovium/sonic-platform-modules-supermicro/debian/control create mode 100644 platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.install create mode 100644 platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.postinst create mode 100644 platform/innovium/sonic-platform-modules-supermicro/debian/rules create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/iTCO_wdt.conf create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/t7132s-modules.conf create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/Makefile create mode 100755 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/t7132s.c create mode 100755 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/health_checker_thermal.py create mode 100755 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/platform.sh create mode 100755 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/sysledctl.py create mode 100755 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/test_cpld.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/setup.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/__init__.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/chassis.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/component.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/eeprom.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan_drawer.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/helper.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/pcie.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/platform.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/psu.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/sfp.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/thermal.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/watchdog.py create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/platform-modules-sse-t7132s.service create mode 100644 platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/sysled.service diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_1M.csv b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_1M.csv new file mode 100755 index 000000000000..00afc9d8efc9 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_1M.csv @@ -0,0 +1,263 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_1M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G ,PAM4,,,,,,,ANLT 25G/100G ,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,2,0,0,2,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,4,0,0,4,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,2,0,0,2,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,8,0,0,8,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +256,32,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,10GBASE-CR4,NONE +257,32,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,10GBASE-CR4,NONE diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_3M.csv b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_3M.csv new file mode 100755 index 000000000000..6b9579b3d055 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_DAC_3M.csv @@ -0,0 +1,263 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_3M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G,PAM4,,,,,,,ANLT 25G/100G,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,2,0,0,2,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,4,0,0,4,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,2,0,0,2,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,6,0,0,6,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +256,32,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,2,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,10GBASE-CR4,NONE +257,32,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,2,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,10GBASE-CR4,NONE diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_Optics.csv b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_Optics.csv new file mode 100755 index 000000000000..07ac2b449d12 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_Optics.csv @@ -0,0 +1,263 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,OPTICS,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,,SPEED,ENCODING,,,,,, +,,,50G/400G,PAM4,,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,,10G/40G,NRZ,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING +0,0,0,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +1,0,1,0,4,-1,0,2,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +2,0,2,0,4,0,0,0,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +3,0,3,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +4,0,4,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +5,0,5,0,4,0,0,4,5.5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +6,0,6,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +7,0,7,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +8,1,0,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +9,1,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +10,1,2,0,4,0,0,0,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +11,1,3,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +12,1,4,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +13,1,5,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +14,1,6,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +15,1,7,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +16,2,0,0,4,0,0,0,6,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +17,2,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +18,2,2,0,4,0,0,0,6,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +19,2,3,0,4,0,0,0,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +20,2,4,0,4,0,0,4,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +21,2,5,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +22,2,6,0,4,0,0,4,5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +23,2,7,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +24,3,0,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +25,3,1,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +26,3,2,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +27,3,3,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +28,3,4,0,4,-1,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +29,3,5,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +30,3,6,0,2,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +31,3,7,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +32,4,0,0,4,0,0,2,4,Medium,High,0,0,0,0,6,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +33,4,1,0,2,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +34,4,2,0,4,0,0,2,4,Medium,High,0,0,0,1,0,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +35,4,3,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +36,4,4,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +37,4,5,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +38,4,6,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +39,4,7,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +40,5,0,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +41,5,1,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +42,5,2,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +43,5,3,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +44,5,4,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +45,5,5,0,2,0,0,4,4,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +46,5,6,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +47,5,7,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +48,6,0,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +49,6,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +50,6,2,0,4,0,0,2,4,Medium,High,0,0,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +51,6,3,0,4,0,0,0,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +52,6,4,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +53,6,5,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +54,6,6,0,2,0,0,2,5.5,Medium,High,0,0,0,0,2,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +55,6,7,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +56,7,0,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +57,7,1,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +58,7,2,0,4,-1,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +59,7,3,0,4,0,0,2,4,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +60,7,4,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +61,7,5,0,4,0,0,0,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +62,7,6,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +63,7,7,0,4,0,0,4,4,Medium,High,0,0,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +64,8,0,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +65,8,1,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +66,8,2,0,4,0,0,2,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +67,8,3,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +68,8,4,0,4,0,0,4,6,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +69,8,5,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +70,8,6,0,2,0,0,4,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +71,8,7,0,4,0,0,4,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +72,9,0,0,4,0,0,4,5.5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +73,9,1,0,4,0,0,0,6.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +74,9,2,0,4,0,0,4,5.5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +75,9,3,0,4,0,0,0,6.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +76,9,4,0,4,0,0,4,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +77,9,5,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +78,9,6,0,4,0,0,2,6,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +79,9,7,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +80,10,0,0,4,0,0,4,4,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +81,10,1,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +82,10,2,0,4,0,0,4,4,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +83,10,3,0,4,0,0,2,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +84,10,4,0,4,-1,0,4,6,Medium,High,0,0,0,0,6,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +85,10,5,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +86,10,6,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +87,10,7,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +88,11,0,0,4,0,0,0,6.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +89,11,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +90,11,2,0,4,0,0,0,6,Medium,High,0,0,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +91,11,3,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +92,11,4,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +93,11,5,0,4,0,0,2,7,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +94,11,6,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +95,11,7,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +96,12,0,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +97,12,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +98,12,2,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +99,12,3,0,4,0,0,2,5,Medium,High,0,0,0,2,2,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +100,12,4,0,4,0,0,2,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +101,12,5,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +102,12,6,0,4,0,0,4,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +103,12,7,0,4,0,0,0,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +104,13,0,0,2,0,0,4,4.5,Medium,High,0,0,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +105,13,1,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +106,13,2,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +107,13,3,0,2,0,0,2,4.5,Medium,High,0,0,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +108,13,4,0,4,0,0,2,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +109,13,5,0,4,0,0,4,4,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +110,13,6,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +111,13,7,0,4,-1,0,0,5,Medium,High,0,0,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +112,14,0,0,4,0,0,0,5,Medium,High,0,0,0,4,0,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +113,14,1,0,4,0,0,2,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +114,14,2,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +115,14,3,0,4,0,0,0,5,Medium,High,0,0,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +116,14,4,0,4,0,0,4,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +117,14,5,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +118,14,6,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +119,14,7,0,4,0,0,0,5,Medium,High,0,0,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +120,15,0,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +121,15,1,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +122,15,2,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +123,15,3,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +124,15,4,0,4,-1,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +125,15,5,0,4,0,0,0,5,Medium,High,0,0,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +126,15,6,0,4,0,0,0,4.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +127,15,7,0,4,0,0,0,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +128,16,0,0,2,0,0,2,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +129,16,1,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +130,16,2,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +131,16,3,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +132,16,4,0,4,0,0,0,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +133,16,5,0,2,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +134,16,6,0,4,0,0,0,6.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +135,16,7,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +136,17,0,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +137,17,1,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +138,17,2,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +139,17,3,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +140,17,4,1,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +141,17,5,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +142,17,6,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +143,17,7,0,4,0,0,2,5,Medium,High,0,0,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +144,18,0,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +145,18,1,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +146,18,2,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +147,18,3,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +148,18,4,0,2,0,0,0,7,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +149,18,5,0,2,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +150,18,6,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +151,18,7,0,4,0,0,4,4,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +152,19,0,0,2,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +153,19,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +154,19,2,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +155,19,3,0,4,0,0,-2,6,Medium,High,0,0,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +156,19,4,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +157,19,5,0,4,0,0,0,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +158,19,6,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +159,19,7,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +160,20,0,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +161,20,1,0,2,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +162,20,2,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +163,20,3,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +164,20,4,0,2,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +165,20,5,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +166,20,6,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +167,20,7,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +168,21,0,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +169,21,1,0,4,-1,0,0,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +170,21,2,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +171,21,3,0,4,0,0,0,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +172,21,4,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +173,21,5,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +174,21,6,0,2,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +175,21,7,0,4,0,0,2,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +176,22,0,0,4,0,0,4,5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +177,22,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +178,22,2,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +179,22,3,0,4,-1,0,4,5.5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +180,22,4,0,4,0,0,4,4.5,Medium,High,0,0,0,0,2,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +181,22,5,0,4,0,0,4,4.5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +182,22,6,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +183,22,7,0,4,0,0,4,5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +184,23,0,0,2,0,0,2,6,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +185,23,1,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +186,23,2,0,4,0,0,2,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +187,23,3,0,4,0,0,0,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +188,23,4,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +189,23,5,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +190,23,6,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +191,23,7,0,4,0,0,4,5.5,Medium,High,0,0,0,0,6,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +192,24,0,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +193,24,1,0,2,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +194,24,2,0,4,0,0,2,4.5,Medium,High,0,0,0,1,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +195,24,3,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +196,24,4,0,4,0,0,4,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +197,24,5,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +198,24,6,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +199,24,7,0,4,0,0,2,4,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +200,25,0,0,4,0,0,0,5.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +201,25,1,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +202,25,2,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +203,25,3,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +204,25,4,0,4,0,0,0,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +205,25,5,0,4,0,0,0,5,Medium,High,0,0,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +206,25,6,0,4,0,0,2,5,Medium,High,0,0,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +207,25,7,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +208,26,0,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,-1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +209,26,1,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +210,26,2,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +211,26,3,0,4,0,0,2,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +212,26,4,0,2,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +213,26,5,0,4,0,0,0,5.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +214,26,6,0,4,0,0,4,3.5,Medium,High,0,0,0,0,2,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +215,26,7,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +216,27,0,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +217,27,1,0,4,0,0,2,6,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +218,27,2,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +219,27,3,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +220,27,4,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +221,27,5,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +222,27,6,0,2,0,0,0,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +223,27,7,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +224,28,0,0,4,0,0,0,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +225,28,1,0,4,0,0,2,4.5,Medium,High,0,0,0,2,2,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +226,28,2,0,4,0,0,0,4.5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +227,28,3,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +228,28,4,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +229,28,5,0,2,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +230,28,6,0,2,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +231,28,7,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +232,29,0,0,4,0,0,4,4,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +233,29,1,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +234,29,2,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +235,29,3,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +236,29,4,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +237,29,5,0,4,0,0,4,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +238,29,6,0,4,0,0,2,5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +239,29,7,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +240,30,0,0,4,0,0,2,4.5,Medium,High,0,0,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +241,30,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +242,30,2,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +243,30,3,0,2,0,0,2,6,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +244,30,4,0,4,0,0,2,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +245,30,5,0,4,0,0,4,5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +246,30,6,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +247,30,7,0,4,0,0,4,5,Medium,High,0,0,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +248,31,0,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +249,31,1,0,4,0,-1,2,5.5,Medium,High,0,0,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +250,31,2,0,4,0,0,2,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +251,31,3,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +252,31,4,0,4,-1,0,4,5.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +253,31,5,0,4,0,0,4,6,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +254,31,6,0,4,0,0,2,5,Medium,High,0,0,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +255,31,7,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +256,32,0,0,4,0,0,4,4.5,Medium,High,0,0,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +257,32,1,0,4,0,0,2,5.5,Medium,High,0,0,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_RJ45.csv b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_RJ45.csv new file mode 100755 index 000000000000..342eef997698 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/CSV/TL7_RJ45.csv @@ -0,0 +1,7 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,RJ45,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,,SPEED,ENCODING,,,,,, +,,,50G/400G,PAM4,,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,,10G/40G,NRZ,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING +256,32,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +257,32,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers.json.j2 b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers.json.j2 new file mode 100755 index 000000000000..9b95afc21f81 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers.json.j2 @@ -0,0 +1,167 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} +{% set mgmt_port_name = ['Ethernet256','Ethernet257'] %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {% if port not in mgmt_port_name %} + {%- if port_names_list.append(port) %}{% endif %} + {% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% if port not in mgmt_port_name %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + {% endif %} + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "51691264", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"10243072" + }, + "ingress_lossy_profile": { + "pool":"lossy_pool", + "size":"0", + "static_th":"10243072" + }, + "egress_lossy_profile": { + "pool":"lossy_pool", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + {% set cable = cable_length(port) -%} + "profile" : "pg_lossless_400000_{{ cable }}_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + + "BUFFER_QUEUE": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_def_lossy.j2 b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..8b1291ac2674 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_def_lossy.j2 @@ -0,0 +1,45 @@ +{% set mgmt_port_name = ['Ethernet256','Ethernet257'] %} +{% set port_names_list = [] %} +{% for port in PORT %} + {% if port not in mgmt_port_name %} + {%- if port_names_list.append(port) %}{% endif %} + {% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "61458432", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"lossy_pool", + "size":"0", + "static_th":"10243072" + }, + "egress_lossy_profile": { + "pool":"lossy_pool", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} + }, + "BUFFER_QUEUE": { +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} + } +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_t1.j2 b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_t1.j2 new file mode 100755 index 000000000000..9b95afc21f81 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/buffers_defaults_t1.j2 @@ -0,0 +1,167 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} +{% set mgmt_port_name = ['Ethernet256','Ethernet257'] %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {% if port not in mgmt_port_name %} + {%- if port_names_list.append(port) %}{% endif %} + {% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% if port not in mgmt_port_name %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + {% endif %} + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "51691264", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"10243072" + }, + "ingress_lossy_profile": { + "pool":"lossy_pool", + "size":"0", + "static_th":"10243072" + }, + "egress_lossy_profile": { + "pool":"lossy_pool", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + {% set cable = cable_length(port) -%} + "profile" : "pg_lossless_400000_{{ cable }}_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + + "BUFFER_QUEUE": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/config_32x400G_sse_t7132s.yaml b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/config_32x400G_sse_t7132s.yaml new file mode 100644 index 000000000000..9c84910a1f4d --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/config_32x400G_sse_t7132s.yaml @@ -0,0 +1,440 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 0, 0, 0" + pcie_pre1: "0, 0, 0, 0" + buffer_management_mode: "api_driven" + wred_cr_ip_proto_list: "17" + cr_assignment_mode: "1" + max_lossless_tc: "2" + ilpm_enable: "1" + ecn_stats_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "10100000" + rx_polarity: "11111011" + lane_swap: "37250416" + - id: "1" + tx_polarity: "01010011" + rx_polarity: "00000100" + lane_swap: "52407613" + - id: "2" + tx_polarity: "11010001" + rx_polarity: "01111100" + lane_swap: "06153427" + - id: "3" + tx_polarity: "00100000" + rx_polarity: "10001001" + lane_swap: "74501263" + - id: "4" + tx_polarity: "10100000" + rx_polarity: "11101000" + lane_swap: "05471632" + - id: "5" + tx_polarity: "00010100" + rx_polarity: "00111100" + lane_swap: "72604351" + - id: "6" + tx_polarity: "11011001" + rx_polarity: "00011001" + lane_swap: "16340725" + - id: "7" + tx_polarity: "11010000" + rx_polarity: "11000010" + lane_swap: "70615324" + - id: "8" + tx_polarity: "00111101" + rx_polarity: "11011000" + lane_swap: "25074613" + - id: "9" + tx_polarity: "00001010" + rx_polarity: "01000011" + lane_swap: "32706451" + - id: "10" + tx_polarity: "00100010" + rx_polarity: "01001011" + lane_swap: "07162543" + - id: "11" + tx_polarity: "01101001" + rx_polarity: "11110001" + lane_swap: "41706253" + - id: "12" + tx_polarity: "11001000" + rx_polarity: "11000011" + lane_swap: "07136524" + - id: "13" + tx_polarity: "01100001" + rx_polarity: "10010000" + lane_swap: "73506412" + - id: "14" + tx_polarity: "01010001" + rx_polarity: "10110110" + lane_swap: "26143705" + - id: "15" + tx_polarity: "00001000" + rx_polarity: "11101100" + lane_swap: "51602437" + - id: "16" + tx_polarity: "00010000" + rx_polarity: "11101011" + lane_swap: "45076312" + - id: "17" + tx_polarity: "01011000" + rx_polarity: "00000000" + lane_swap: "50642371" + - id: "18" + tx_polarity: "01010100" + rx_polarity: "00011001" + lane_swap: "07436125" + - id: "19" + tx_polarity: "00011010" + rx_polarity: "01001011" + lane_swap: "61734250" + - id: "20" + tx_polarity: "00111110" + rx_polarity: "10011100" + lane_swap: "04275631" + - id: "21" + tx_polarity: "10110100" + rx_polarity: "01110110" + lane_swap: "41620573" + - id: "22" + tx_polarity: "01100110" + rx_polarity: "10010000" + lane_swap: "17240635" + - id: "23" + tx_polarity: "01010000" + rx_polarity: "11110101" + lane_swap: "52704631" + - id: "24" + tx_polarity: "00010001" + rx_polarity: "10100100" + lane_swap: "16253704" + - id: "25" + tx_polarity: "01000101" + rx_polarity: "00010000" + lane_swap: "53607241" + - id: "26" + tx_polarity: "00110101" + rx_polarity: "11101110" + lane_swap: "16074325" + - id: "27" + tx_polarity: "10000111" + rx_polarity: "01011110" + lane_swap: "75604231" + - id: "28" + tx_polarity: "01010100" + rx_polarity: "01010101" + lane_swap: "70614235" + - id: "29" + tx_polarity: "01010001" + rx_polarity: "01000001" + lane_swap: "24610537" + - id: "30" + tx_polarity: "01101011" + rx_polarity: "01010011" + lane_swap: "70614352" + - id: "31" + tx_polarity: "01101001" + rx_polarity: "10100000" + lane_swap: "34250716" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_A b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_A new file mode 100644 index 000000000000..ec13307805e1 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_A @@ -0,0 +1,60 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + ib_active: 0,1,2,3,4,5 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_B b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_B new file mode 100644 index 000000000000..57ba52cbc3bc --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/innovium.77700_B @@ -0,0 +1,60 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + ib_active: 0,1,2,3,4,5 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.config.yaml b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.config.yaml new file mode 100755 index 000000000000..e896723a03c3 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.config.yaml @@ -0,0 +1,10 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_sse_t7132s.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil:$INNOVIUM_DIR/isai_cmds" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.datapath.config.yaml b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/pg_profile_lookup.ini b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/pg_profile_lookup.ini new file mode 100644 index 000000000000..0d881737cfa1 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/pg_profile_lookup.ini @@ -0,0 +1,22 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/port_config.ini b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/port_config.ini new file mode 100755 index 000000000000..950038f8a8bb --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/port_config.ini @@ -0,0 +1,35 @@ +# name lanes alias speed index mtu fec +Ethernet0 241,242,243,244,245,246,247,248 Eth1 400000 1 9126 rs +Ethernet8 249,250,251,252,253,254,255,256 Eth2 400000 2 9126 rs +Ethernet16 225,226,227,228,229,230,231,232 Eth3 400000 3 9126 rs +Ethernet24 233,234,235,236,237,238,239,240 Eth4 400000 4 9126 rs +Ethernet32 217,218,219,220,221,222,223,224 Eth5 400000 5 9126 rs +Ethernet40 209,210,211,212,213,214,215,216 Eth6 400000 6 9126 rs +Ethernet48 201,202,203,204,205,206,207,208 Eth7 400000 7 9126 rs +Ethernet56 193,194,195,196,197,198,199,200 Eth8 400000 8 9126 rs +Ethernet64 185,186,187,188,189,190,191,192 Eth9 400000 9 9126 rs +Ethernet72 177,178,179,180,181,182,183,184 Eth10 400000 10 9126 rs +Ethernet80 169,170,171,172,173,174,175,176 Eth11 400000 11 9126 rs +Ethernet88 161,162,163,164,165,166,167,168 Eth12 400000 12 9126 rs +Ethernet96 153,154,155,156,157,158,159,160 Eth13 400000 13 9126 rs +Ethernet104 145,146,147,148,149,150,151,152 Eth14 400000 14 9126 rs +Ethernet112 137,138,139,140,141,142,143,144 Eth15 400000 15 9126 rs +Ethernet120 129,130,131,132,133,134,135,136 Eth16 400000 16 9126 rs +Ethernet128 121,122,123,124,125,126,127,128 Eth17 400000 17 9126 rs +Ethernet136 113,114,115,116,117,118,119,120 Eth18 400000 18 9126 rs +Ethernet144 105,106,107,108,109,110,111,112 Eth19 400000 19 9126 rs +Ethernet152 97,98,99,100,101,102,103,104 Eth20 400000 20 9126 rs +Ethernet160 89,90,91,92,93,94,95,96 Eth21 400000 21 9126 rs +Ethernet168 81,82,83,84,85,86,87,88 Eth22 400000 22 9126 rs +Ethernet176 73,74,75,76,77,78,79,80 Eth23 400000 23 9126 rs +Ethernet184 65,66,67,68,69,70,71,72 Eth24 400000 24 9126 rs +Ethernet192 57,58,59,60,61,62,63,64 Eth25 400000 25 9126 rs +Ethernet200 49,50,51,52,53,54,55,56 Eth26 400000 26 9126 rs +Ethernet208 41,42,43,44,45,46,47,48 Eth27 400000 27 9126 rs +Ethernet216 33,34,35,36,37,38,39,40 Eth28 400000 28 9126 rs +Ethernet224 25,26,27,28,29,30,31,32 Eth29 400000 29 9126 rs +Ethernet232 17,18,19,20,21,22,23,24 Eth30 400000 30 9126 rs +Ethernet240 9,10,11,12,13,14,15,16 Eth31 400000 31 9126 rs +Ethernet248 1,2,3,4,5,6,7,8 Eth32 400000 32 9126 rs +Ethernet256 257 Eth33 10000 33 9126 none +Ethernet257 258 Eth34 10000 34 9126 none diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos.json.j2 b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos.json.j2 new file mode 100755 index 000000000000..34f7413d9522 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos.json.j2 @@ -0,0 +1,195 @@ +{% set mgmt_port_name = ['Ethernet256','Ethernet257'] %} +{% set port_names_list = [] %} +{% for port in PORT %} + {% if port not in mgmt_port_name %} + {%- if port_names_list.append(port) %}{% endif %} + {% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "1" + } + }, + "QUEUE": { +{% for port in port_names_list %} + "{{ port }}|3": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|4": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|2": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|6": { + "scheduler": "scheduler.0" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "PORT_QOS_MAP": { +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + } +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_def_lossy.j2 b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..a390d37b4ffb --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_def_lossy.j2 @@ -0,0 +1,124 @@ +{% set mgmt_port_name = ['Ethernet256','Ethernet257'] %} +{% set port_names_list = [] %} +{% for port in PORT %} + {% if port not in mgmt_port_name %} + {%- if port_names_list.append(port) %}{% endif %} + {% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "1", + "4": "2", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_t1.j2 b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_t1.j2 new file mode 100644 index 000000000000..34f7413d9522 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/qos_defaults_t1.j2 @@ -0,0 +1,195 @@ +{% set mgmt_port_name = ['Ethernet256','Ethernet257'] %} +{% set port_names_list = [] %} +{% for port in PORT %} + {% if port not in mgmt_port_name %} + {%- if port_names_list.append(port) %}{% endif %} + {% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "1" + } + }, + "QUEUE": { +{% for port in port_names_list %} + "{{ port }}|3": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|4": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|2": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|6": { + "scheduler": "scheduler.0" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "PORT_QOS_MAP": { +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + } +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/sai.profile b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/Supermicro_sse_t7132s/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/default_sku b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/default_sku new file mode 100755 index 000000000000..8feb806f2f82 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/default_sku @@ -0,0 +1 @@ +Supermicro_sse_t7132s t1 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/fast-reboot_plugin b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/fast-reboot_plugin new file mode 100755 index 000000000000..6bc65e0edfa2 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/fast-reboot_plugin @@ -0,0 +1,2 @@ +#!/bin/bash +/usr/local/bin/sysledctl.py reboot diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/installer.conf b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/installer.conf new file mode 100755 index 000000000000..1eb3e9e4949b --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off pcie_aspm=off usbcore.old_scheme_first=1" diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/lib_ivm_serdes_pltfm.so b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/lib_ivm_serdes_pltfm.so new file mode 100755 index 0000000000000000000000000000000000000000..651e66a19ff58a35c7ec56373fa7cab0cd746227 GIT binary patch literal 283696 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

(v$3O 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 literal 0 HcmV?d00001 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/pcie.yaml b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/pcie.yaml new file mode 100755 index 000000000000..2b8dce2e0635 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/pcie.yaml @@ -0,0 +1,453 @@ +- bus: '00' + dev: '00' + fn: '0' + id: 6f00 + name: 'Host bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2 + (rev 03)' +- bus: '00' + dev: '01' + fn: '0' + id: 6f02 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 1 (rev 03)' +- bus: '00' + dev: '01' + fn: '1' + id: 6f03 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 1 (rev 03)' +- bus: '00' + dev: '02' + fn: '0' + id: 6f04 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 2 (rev 03)' +- bus: '00' + dev: '02' + fn: '2' + id: 6f06 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 2 (rev 03)' +- bus: '00' + dev: '03' + fn: '0' + id: 6f08 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '3' + id: 6f0b + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '05' + fn: '0' + id: 6f28 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Map/VTd_Misc/System Management (rev 03)' +- bus: '00' + dev: '05' + fn: '1' + id: 6f29 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D IIO Hot Plug (rev 03)' +- bus: '00' + dev: '05' + fn: '2' + id: 6f2a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D IIO RAS/Control Status/Global Errors (rev 03)' +- bus: '00' + dev: '14' + fn: '0' + id: 8c31 + name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB + xHCI (rev 05)' +- bus: '00' + dev: '16' + fn: '0' + id: 8c3a + name: 'Communication controller: Intel Corporation 8 Series/C220 Series Chipset + Family MEI Controller #1 (rev 04)' +- bus: '00' + dev: '16' + fn: '1' + id: 8c3b + name: 'Communication controller: Intel Corporation 8 Series/C220 Series Chipset + Family MEI Controller #2 (rev 04)' +- bus: '00' + dev: 1a + fn: '0' + id: 8c2d + name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB + EHCI #2 (rev 05)' +- bus: '00' + dev: 1c + fn: '0' + id: 8c10 + name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express + Root Port #1 (rev d5)' +- bus: '00' + dev: 1c + fn: '3' + id: 8c16 + name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express + Root Port #4 (rev d5)' +- bus: '00' + dev: 1d + fn: '0' + id: 8c26 + name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB + EHCI #1 (rev 05)' +- bus: '00' + dev: 1f + fn: '0' + id: 8c54 + name: 'ISA bridge: Intel Corporation C224 Series Chipset Family Server Standard + SKU LPC Controller (rev 05)' +- bus: '00' + dev: 1f + fn: '2' + id: 8c02 + name: 'SATA controller: Intel Corporation 8 Series/C220 Series Chipset Family 6-port + SATA Controller 1 [AHCI mode] (rev 05)' +- bus: '00' + dev: 1f + fn: '3' + id: 8c22 + name: 'SMBus: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller + (rev 05)' +- bus: '00' + dev: 1f + fn: '6' + id: 8c24 + name: 'Signal processing controller: Intel Corporation 8 Series Chipset Family Thermal + Management Controller (rev 05)' +- bus: '03' + dev: '00' + fn: '0' + id: 6f50 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 0' +- bus: '03' + dev: '00' + fn: '1' + id: 6f51 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 1' +- bus: '03' + dev: '00' + fn: '2' + id: 6f52 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 2' +- bus: '03' + dev: '00' + fn: '3' + id: 6f53 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 3' +- bus: '05' + dev: '00' + fn: '0' + id: 1b58 + name: 'Ethernet controller: Device 1d98:1b58 (rev 10)' +- bus: '06' + dev: '00' + fn: '0' + id: '9110' + name: 'Bridge: Asix Electronics Corporation Device 9110' +- bus: '07' + dev: '00' + fn: '0' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' +- bus: 08 + dev: '00' + fn: '0' + id: '1150' + name: 'PCI bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge (rev 06)' +- bus: 09 + dev: '00' + fn: '0' + id: '2000' + name: 'VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family + (rev 52)' +- bus: ff + dev: 0b + fn: '0' + id: 6f81 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '1' + id: 6f36 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '2' + id: 6f37 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '3' + id: 6f76 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link Debug (rev 03)' +- bus: ff + dev: 0c + fn: '0' + id: 6fe0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '1' + id: 6fe1 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '2' + id: 6fe2 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '3' + id: 6fe3 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '0' + id: 6ff8 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '4' + id: 6ffc + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '5' + id: 6ffd + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '6' + id: 6ffe + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: '10' + fn: '0' + id: 6f1d + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R2PCIe Agent (rev 03)' +- bus: ff + dev: '10' + fn: '1' + id: 6f34 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R2PCIe Agent (rev 03)' +- bus: ff + dev: '10' + fn: '5' + id: 6f1e + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '10' + fn: '6' + id: 6f7d + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '10' + fn: '7' + id: 6f1f + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '12' + fn: '0' + id: 6fa0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Home Agent 0 (rev 03)' +- bus: ff + dev: '12' + fn: '1' + id: 6f30 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Home Agent 0 (rev 03)' +- bus: ff + dev: '13' + fn: '0' + id: 6fa8 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: ff + dev: '13' + fn: '1' + id: 6f71 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: ff + dev: '13' + fn: '2' + id: 6faa + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '3' + id: 6fab + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '4' + id: 6fac + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '5' + id: 6fad + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '6' + id: 6fae + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Broadcast (rev 03)' +- bus: ff + dev: '13' + fn: '7' + id: 6faf + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Global Broadcast (rev 03)' +- bus: ff + dev: '14' + fn: '0' + id: 6fb0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 0 Thermal Control (rev 03)' +- bus: ff + dev: '14' + fn: '1' + id: 6fb1 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 1 Thermal Control (rev 03)' +- bus: ff + dev: '14' + fn: '2' + id: 6fb2 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 0 Error (rev 03)' +- bus: ff + dev: '14' + fn: '3' + id: 6fb3 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 1 Error (rev 03)' +- bus: ff + dev: '14' + fn: '4' + id: 6fbc + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '5' + id: 6fbd + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '6' + id: 6fbe + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '7' + id: 6fbf + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '15' + fn: '0' + id: 6fb4 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 2 Thermal Control (rev 03)' +- bus: ff + dev: '15' + fn: '1' + id: 6fb5 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 3 Thermal Control (rev 03)' +- bus: ff + dev: '15' + fn: '2' + id: 6fb6 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 2 Error (rev 03)' +- bus: ff + dev: '15' + fn: '3' + id: 6fb7 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 3 Error (rev 03)' +- bus: ff + dev: 1e + fn: '0' + id: 6f98 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '1' + id: 6f99 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '2' + id: 6f9a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '3' + id: 6fc0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '4' + id: 6f9c + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1f + fn: '0' + id: 6f88 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1f + fn: '2' + id: 6f8a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform.json b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform.json new file mode 100644 index 000000000000..e28ca23c7aee --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform.json @@ -0,0 +1,238 @@ +{ + "chassis": { + "name": "Supermicro-SSE-T7132S-R0", + "components": [ + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + } + ], + "fans": [ + { + "name": "FAN-1" + }, + { + "name": "FAN-2" + }, + { + "name": "FAN-3" + }, + { + "name": "FAN-4" + }, + { + "name": "FAN-5" + }, + { + "name": "FAN-6" + } + ], + "fan_drawers": [ + { + "name": "Drawer1", + "fans": [ + { + "name": "FAN-1" + } + ] + }, + { + "name": "Drawer2", + "fans": [ + { + "name": "FAN-2" + } + ] + }, + { + "name": "Drawer3", + "fans": [ + { + "name": "FAN-3" + } + ] + }, + { + "name": "Drawer4", + "fans": [ + { + "name": "FAN-4" + } + ] + }, + { + "name": "Drawer5", + "fans": [ + { + "name": "FAN-5" + } + ] + }, + { + "name": "Drawer6", + "fans": [ + { + "name": "FAN-6" + } + ] + } + ], + "psus": [ + { + "name": "PSU 1", + "fans": [ + { + "name": "PSU 1 FAN-1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "PSU 2", + "fans": [ + { + "name": "PSU 2 FAN-1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + } + ], + "thermals": [ + { + "name": "CPU Temp" + }, + { + "name": "PCH Temp" + }, + { + "name": "Peripheral Temp" + }, + { + "name": "Switch Buttom-1" + }, + { + "name": "Switch Buttom-2" + }, + { + "name": "Switch Top-1" + }, + { + "name": "Switch Top-2" + }, + { + "name": "System Temp" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet72" + }, + { + "name": "Ethernet80" + }, + { + "name": "Ethernet88" + }, + { + "name": "Ethernet96" + }, + { + "name": "Ethernet104" + }, + { + "name": "Ethernet112" + }, + { + "name": "Ethernet120" + }, + { + "name": "Ethernet128" + }, + { + "name": "Ethernet136" + }, + { + "name": "Ethernet144" + }, + { + "name": "Ethernet152" + }, + { + "name": "Ethernet160" + }, + { + "name": "Ethernet168" + }, + { + "name": "Ethernet176" + }, + { + "name": "Ethernet184" + }, + { + "name": "Ethernet192" + }, + { + "name": "Ethernet200" + }, + { + "name": "Ethernet208" + }, + { + "name": "Ethernet216" + }, + { + "name": "Ethernet224" + }, + { + "name": "Ethernet232" + }, + { + "name": "Ethernet240" + }, + { + "name": "Ethernet248" + } + ] + }, + "interfaces": {} +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform_asic b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform_asic new file mode 100644 index 000000000000..84083a7415d9 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/platform_asic @@ -0,0 +1 @@ +innovium diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/eeprom.py b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/eeprom.py new file mode 100644 index 000000000000..ba6a569c7104 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/eeprom.py @@ -0,0 +1,20 @@ +############################################################################# +# Celestica Silverstone +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0053/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/psuutil.py b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/psuutil.py new file mode 100644 index 000000000000..3bba2adc2063 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/psuutil.py @@ -0,0 +1,84 @@ +import os.path +import subprocess +import sys +import re + +IPMI_PSU1_DATA = "docker exec -it pmon ipmitool sdr list | grep PS1 | awk -F \"|\" '{print $2}'" +IPMI_PSU2_DATA = "docker exec -it pmon ipmitool sdr list | grep PS2 | awk -F \"|\" '{print $2}'" + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + def run_command(self, command): + proc = subprocess.Popen(command, shell=True, universal_newlines=True, stdout=subprocess.PIPE) + (out, err) = proc.communicate() + + if proc.returncode != 0: + sys.exit(proc.returncode) + + return out + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + if index == 1: + res_string = self.run_command(IPMI_PSU1_DATA) + else: + res_string = self.run_command(IPMI_PSU2_DATA) + + try: + ret_value = int(res_string, 0) + except ValueError as e: + return False + + if ret_value == 0x1: + return True + else: + return False + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + if index == 1: + res_string = self.run_command(IPMI_PSU1_DATA) + else: + res_string = self.run_command(IPMI_PSU2_DATA) + + try: + ret_value = int(res_string, 0) + except ValueError as e: + return False + + if ret_value == 0x1 or ret_value == 0xb: + return True + else: + return False diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/sfputil.py b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/sfputil.py new file mode 100644 index 000000000000..f8fb3d2744c3 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/sfputil.py @@ -0,0 +1,211 @@ +# Platform-specific SFP transceiver interface for SONiC +# This plugin supports QSFP and SFP. + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 34 + QSFP_PORT_START = 0 + QSFP_PORT_END = 32 + SFP_PORT_START = 33 + SFP_PORT_END = 34 + + EEPROM_OFFSET = 11 + PORT_INFO_PATH = '/sys/class/t7132s_cpld' + + _port_name = "" + _port_to_eeprom_mapping = {} + _port_to_i2cbus_mapping = {} + _port_to_offset = [11, 30, 12, 29, 13, 28, 14, 27, 15, 34, + 16, 33, 17, 32, 18, 31, 19, 38, 20, 37, + 21, 36, 22, 35, 23, 42, 24, 41, 25, 40, + 26, 39, + 43, 44] + _global_port_pres_dict = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return [] + + @property + def qsfp_ports(self): + return list(range(self.QSFP_PORT_START, self.QSFP_PORT_END)) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def port_to_i2cbus_mapping(self): + return self._port_to_i2cbus_mapping + + def get_port_name(self, port_num): + if port_num in self.qsfp_ports: + self._port_name = "QSFP" + str(port_num + 1) + else: + self._port_name = "SFP" + str(port_num - self.QSFP_PORT_END + 1) + return self._port_name + + def get_eeprom_dom_raw(self, port_num): + if port_num in self.qsfp_ports: + # QSFP DOM EEPROM is also at addr 0x50 and thus also stored in eeprom_ifraw + return None + else: + # Read dom eeprom at addr 0x51 + return self._read_eeprom_devid(port_num, self.DOM_EEPROM_ADDR, 256) + + def __init__(self): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + + for x in range(self.PORT_START, self.PORT_END): + self.port_to_i2cbus_mapping[x] = (x + self.EEPROM_OFFSET) + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_offset[x]) + self.init_global_port_presence() + SfpUtilBase.__init__(self) + + def init_global_port_presence(self): + for port_num in range(self.port_start, (self.port_end)): + presence = self.get_presence(port_num) + if(presence): + self._global_port_pres_dict[port_num] = '1' + else: + self._global_port_pres_dict[port_num] = '0' + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num not in list(range(self.port_start, self.port_end + 1)): + return False + + # Get path for access port presence status + port_name = self.get_port_name(port_num) + sysfs_filename = "qsfp_modprs" if port_num in self.qsfp_ports else "sfp_modabs" + reg_path = "/".join([self.PORT_INFO_PATH, port_name, sysfs_filename]) + + # Read status + try: + reg_file = open(reg_path) + content = reg_file.readline().rstrip() + reg_value = int(content) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # Module present is active low + if reg_value == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid QSFP port_num + if port_num not in self.qsfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_lpmode"])) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # Read status + content = reg_file.readline().rstrip() + reg_value = int(content) + # low power mode is active high + if reg_value == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid QSFP port_num + if port_num not in self.qsfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_lpmode"]), "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = hex(lpmode) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + # Check for invalid QSFP port_num + if port_num not in self.qsfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_reset"]), "w") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(0)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open( + "/".join([self.PORT_INFO_PATH, port_name, "qsfp_reset"]), "w") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + reg_file.seek(0) + reg_file.write(hex(1)) + reg_file.close() + + return True + + def get_transceiver_change_event(self): + port_dict = {} + while True: + for port_num in range(self.port_start, (self.port_end + 1)): + presence = self.get_presence(port_num) + if(presence and self._global_port_pres_dict[port_num] == '0'): + self._global_port_pres_dict[port_num] = '1' + port_dict[port_num] = '1' + elif(not presence and + self._global_port_pres_dict[port_num] == '1'): + self._global_port_pres_dict[port_num] = '0' + port_dict[port_num] = '0' + + if(len(port_dict) > 0): + return True, port_dict + + time.sleep(0.5) diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/ssd_util.py b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/ssd_util.py new file mode 100644 index 000000000000..3a26dbfe4388 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/plugins/ssd_util.py @@ -0,0 +1,8 @@ +from sonic_platform_base.sonic_ssd.ssd_generic import SsdUtil as SsdUtilGeneric + +class SsdUtil(SsdUtilGeneric): + def parse_innodisk_info(self): + super().parse_innodisk_info() + if self.vendor_ssd_info: + # fix too lazy pattern 'Health:\s*(.+?)%?' + self.health = self._parse_re('Health:\s*(.+?)%', self.vendor_ssd_info) diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/pmon_daemon_control.json b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..16f0755583ac --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/pmon_daemon_control.json @@ -0,0 +1,6 @@ +{ + "skip_ledd": true, + "skip_xcvrd": false, + "skip_psud": false, + "skip_thermalctld": false +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/sensors.conf b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/sensors.conf new file mode 100755 index 000000000000..7c9a6321dfc0 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/sensors.conf @@ -0,0 +1,2 @@ +# libsensors configuration file for Celestica Midstone-200i. +# The i2c bus portion is omit because adapter name diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/system_health_monitoring_config.json b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..728dcb491e75 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["asic", "psu.temperature"], + "user_defined_checkers": ["python3 /usr/local/bin/health_checker_thermal.py"], + "polling_interval": 60, + "led_color": { + "fault": "red", + "normal": "green", + "booting": "green_blink" + } +} diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/thermal_policy.json b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/thermal_policy.json new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/topo.conf b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/topo.conf new file mode 100644 index 000000000000..795ea43143eb --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/supermicro/x86_64-supermicro_sse_t7132s-r0/warm-reboot_plugin b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/warm-reboot_plugin new file mode 100755 index 000000000000..6bc65e0edfa2 --- /dev/null +++ b/device/supermicro/x86_64-supermicro_sse_t7132s-r0/warm-reboot_plugin @@ -0,0 +1,2 @@ +#!/bin/bash +/usr/local/bin/sysledctl.py reboot diff --git a/platform/innovium/one-image.mk b/platform/innovium/one-image.mk index 2cae779d71ac..bd63990f511d 100755 --- a/platform/innovium/one-image.mk +++ b/platform/innovium/one-image.mk @@ -7,6 +7,7 @@ $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELTA_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_715_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(SMCI_SSE_T7132S_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WISTRON_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) diff --git a/platform/innovium/platform-modules-supermicro.mk b/platform/innovium/platform-modules-supermicro.mk new file mode 100644 index 000000000000..f9efee4aedb9 --- /dev/null +++ b/platform/innovium/platform-modules-supermicro.mk @@ -0,0 +1,9 @@ +SMCI_PLATFORM_MODULE_VERSION = 0.1 + +export SMCI_PLATFORM_MODULE_VERSION + +SMCI_SSE_T7132S_PLATFORM_MODULE = platform-modules-sse-t7132s_$(SMCI_PLATFORM_MODULE_VERSION)_$(CONFIGURED_ARCH).deb +$(SMCI_SSE_T7132S_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-supermicro +$(SMCI_SSE_T7132S_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(SMCI_SSE_T7132S_PLATFORM_MODULE)_PLATFORM = x86_64-supermicro_sse_t7132s-r0 +SONIC_DPKG_DEBS += $(SMCI_SSE_T7132S_PLATFORM_MODULE) diff --git a/platform/innovium/rules.mk b/platform/innovium/rules.mk index 350ab8ef3f80..03efa70b0def 100755 --- a/platform/innovium/rules.mk +++ b/platform/innovium/rules.mk @@ -1,5 +1,6 @@ include $(PLATFORM_PATH)/invm-sai.mk include $(PLATFORM_PATH)/platform-modules-cel.mk +include $(PLATFORM_PATH)/platform-modules-supermicro.mk #include $(PLATFORM_PATH)/platform-modules-delta.mk include $(PLATFORM_PATH)/platform-modules-wistron.mk #include $(PLATFORM_PATH)/platform-modules-netberg.mk diff --git a/platform/innovium/sonic-platform-modules-supermicro/debian/changelog b/platform/innovium/sonic-platform-modules-supermicro/debian/changelog new file mode 100644 index 000000000000..d7863facbb9d --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/debian/changelog @@ -0,0 +1,5 @@ +sonic-supermicro-platform-modules (0.1) unstable; urgency=low + + * Inital release of SSE-T7132S platform module package. + + -- SuperMicro Team Fri, 22 Oct 2021 17:14:00 +0800 diff --git a/platform/innovium/sonic-platform-modules-supermicro/debian/compat b/platform/innovium/sonic-platform-modules-supermicro/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/innovium/sonic-platform-modules-supermicro/debian/control b/platform/innovium/sonic-platform-modules-supermicro/debian/control new file mode 100644 index 000000000000..1189c7d86766 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/debian/control @@ -0,0 +1,16 @@ +Source: sonic-supermicro-platform-modules +Section: main +Priority: extra +Maintainer: SuperMicro Team +Build-Depends: + dh-python, + debhelper (>= 9.0.0), + python3(>=3.5), + python3-setuptools, + bzip2 + +Standards-Version: 3.9.3 +Package: platform-modules-sse-t7132s +Architecture: amd64 +Description: kernel modules for platform devices such as fan, led, sfp + diff --git a/platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.install b/platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.install new file mode 100644 index 000000000000..bf9378db1f10 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.install @@ -0,0 +1,8 @@ +sse-t7132s/scripts/platform.sh /usr/local/bin +sse-t7132s/scripts/health_checker_thermal.py /usr/local/bin +sse-t7132s/scripts/sysledctl.py /usr/local/bin +sse-t7132s/cfg/t7132s-modules.conf etc/modules-load.d +sse-t7132s/cfg/iTCO_wdt.conf /etc/modprobe.d +sse-t7132s/systemd/platform-modules-sse-t7132s.service etc/systemd/system +sse-t7132s/systemd/sysled.service etc/systemd/system +sse-t7132s/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-supermicro_sse_t7132s-r0 diff --git a/platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.postinst b/platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.postinst new file mode 100644 index 000000000000..fc0521a672e4 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/debian/platform-modules-sse-t7132s.postinst @@ -0,0 +1,14 @@ +# postinst script for SSE-T7132S + +# Enable SuperMicro SSE-T7132S +depmod -a +modprobe -r iTCO_wdt +modprobe -r t7132s +modprobe t7132s +systemctl enable platform-modules-sse-t7132s.service +systemctl start platform-modules-sse-t7132s.service +systemctl enable sysled.service + + +#DEBHELPER# + diff --git a/platform/innovium/sonic-platform-modules-supermicro/debian/rules b/platform/innovium/sonic-platform-modules-supermicro/debian/rules new file mode 100644 index 000000000000..1d733f22f4d6 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/debian/rules @@ -0,0 +1,39 @@ +#!/usr/bin/make -f + +export INSTALL_MOD_DIR:=extra + +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= sse-t7132s + +%: + dh $@ + +override_dh_auto_build: + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR); \ + done) + +override_dh_auto_install: + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -pplatform-modules-$${mod} \ + $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ + debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + done) + +override_dh_usrlocal: + +override_dh_clean: + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/build; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/*.egg-info; \ + done) + diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/iTCO_wdt.conf b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/iTCO_wdt.conf new file mode 100644 index 000000000000..99ded4c32206 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/iTCO_wdt.conf @@ -0,0 +1 @@ +blacklist iTCO_wdt diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/t7132s-modules.conf b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/t7132s-modules.conf new file mode 100644 index 000000000000..ffb5b98feb4a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/cfg/t7132s-modules.conf @@ -0,0 +1,16 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +i2c-i801 +i2c-isch +i2c-ismt +i2c-dev +i2c-mux +i2c-smbus +i2c-mux-gpio +i2c-mux-pca954x +ipmi-devintf +ast +t7132s \ No newline at end of file diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/Makefile b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/Makefile new file mode 100644 index 000000000000..7288a5e59c2c --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/Makefile @@ -0,0 +1 @@ +obj-m := t7132s.o diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/t7132s.c b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/t7132s.c new file mode 100755 index 000000000000..2bc83f5b3a7a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/modules/t7132s.c @@ -0,0 +1,1706 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* For the watchdog specific items */ +#define REG_LACKSR 0x00 +#define LACKSR_CLKDIV 0x8 +#define LACKSR_CLKSEL (1 << 8) +#define LACKSR_DIVEN (1 << 10) +#define LACKSR_CLKODR (1 << 12) +#define LACKSR_CLKOEN (1 << 13) +#define LACKSR_ALERA (1 << 14) + +#define REG_LAS0CFGR 0x00C +#define REG_LAS0TIMR 0x010 +#define REG_LAS0ADDR 0x014 +#define REG_LAS1CFGR 0x018 +#define REG_LAS1TIMR 0x01C +#define REG_LAS1ADDR 0x020 +#define LASCFGR_INT_P (1 << 0) +#define LASCFGR_INT_L (1 << 1) +#define LASCFGR_DRQ_P (1 << 2) +#define LASCFGR_DAK_P (1 << 3) +#define LASCFGR_LSER (1 << 4) +#define LASCFGR_ENDIAN (1 << 5) +#define LASCFGR_BW16 (1 << 6) +#define REG_LIEMR 0x024 +#define LIEMR_RDYPOL (1 << 4) +#define LIEMR_ALEPOL (1 << 5) +#define LIEMR_SYNCBUS (1 << 6) +#define LIEMR_MULTBUS (1 << 7) +#define LIEMR_DMA0EN (1 << 8) +#define LIEMR_DMA1EN (1 << 9) +#define LIEMR_LRST (1 << 14) +#define LIEMR_SRST (1 << 15) +#define LIEMR_L0EINTEN (1 << 16) +#define LIEMR_L0RTOIEN (1 << 17) +#define LIEMR_L1EINTEN (1 << 18) +#define LIEMR_L1RTOIEN (1 << 19) +#define LIEMR_D0DIEN (1 << 24) +#define LIEMR_D0AIEN (1 << 25) +#define LIEMR_D1DIEN (1 << 26) +#define LIEMR_D1AIEN (1 << 27) + +#define DRIVER_NAME "switchboard" +#define DEVICE_NAME "fwupgrade" +#define CLASS_NAME "t7132s_cpld" +#define SFF_PORT_TOTAL 34 +#define QSFP_PORT_TOTAL 32 +#define SFP_PORT_TOTAL 2 + +/* Refer to SSE_T7132S_CPLD_spec_0820.docx for more details */ +/* Switch model ID */ +#define CPLD1_REG_SW_ID 0x1 +/* HW/CPLD version */ +#define CPLD1_REG_HWREV 0x2 +/* Power sequence module status */ +#define CPLD1_REG_PWR_GOOD 0x3 +/* Voltage Regulator Module ALERT/Thermal */ +#define CPLD1_REG_VRM 0x4 +/* Enable/ Reset misc. devices */ +#define CPLD1_REG_DEV_STATE_1 0x5 +/* Enable/ Reset misc. devices */ +#define CPLD1_REG_DEV_STATE_2 0x6 +/* System reset records */ +#define CPLD1_REG_SYS_RESET_REC 0x9 +/* PCA9548 I2C bus switch RSTn */ +#define CPLD1_REG_MUX_STATE 0xB +/* Transceiver Power Enable */ +#define CPLD1_REG_X_PWR_EN_1 0xC +/* Transceiver Power Enable */ +#define CPLD1_REG_X_PWR_EN_2 0xD +/* Transceiver Power Good */ +#define CPLD1_REG_X_PWR_GOOD_1 0xE +/* Transceiver Power Good */ +#define CPLD1_REG_X_PWR_GOOD_2 0xF +/* Watch Dog Timer maximum count setting by seconds */ +#define CPLD1_REG_WDT_MAX_COUNT_1 0x22 +#define CPLD1_REG_WDT_MAX_COUNT_2 0x23 +/* Watch Dog Timer current count value 16 bits */ +#define CPLD1_REG_WDT_CUR_COUNT_1 0x24 +#define CPLD1_REG_WDT_CUR_COUNT_2 0x25 +/* Version as BMC I2C Registers */ +#define CPLD1_REG_VER_BMC_I2C_1 0xF0 +#define CPLD1_REG_VER_BMC_I2C_2 0xF1 +#define CPLD1_REG_VER_BMC_I2C_3 0xF2 +#define CPLD1_REG_VER_BMC_I2C_4 0xF3 +/* CPLD JED Released Date */ +#define CPLD1_REG_JED_REL_MONTH 0xFE +#define CPLD1_REG_JED_REL_DAY 0xFF + +/* HW/CPLD version */ +#define CPLD2_REG_HWREV 0x2 +/* System Ready/Reset Status */ +#define CPLD2_REG_SYSRDY_RESET_STATUS 0x3 +/* All xcvr LED control */ +#define CPLD2_REG_ALL_LED_CTRL 0x4 +/* Version as BMC I2C Registers */ +#define CPLD2_REG_VER_BMC_I2C_1 0xF0 +#define CPLD2_REG_VER_BMC_I2C_2 0xF1 +#define CPLD2_REG_VER_BMC_I2C_3 0xF2 +#define CPLD2_REG_VER_BMC_I2C_4 0xF3 +/* CPLD JED Released Date */ +#define CPLD2_REG_JED_REL_MONTH 0xFE +#define CPLD2_REG_JED_REL_DAY 0xFF + +#define QSFP_T_RESET_LOf 0x10 +#define QSFP_T_RESET_HIf 0x11 + +#define QSFP_T_LPMODE_LOf 0x12 +#define QSFP_T_LPMODE_HIf 0x13 + +#define QSFP_T_INT_LOf 0x14 +#define QSFP_T_INT_HIf 0x15 + +#define QSFP_T_MODPRS_LOf 0x16 +#define QSFP_T_MODPRS_HIf 0x17 + +#define QSFP_B_RESET_LOf 0x18 +#define QSFP_B_RESET_HIf 0x19 + +#define QSFP_B_LPMODE_LOf 0x1A +#define QSFP_B_LPMODE_HIf 0x1B + +#define QSFP_B_INT_LOf 0x1C +#define QSFP_B_INT_HIf 0x1D + +#define QSFP_B_MODPRS_LOf 0x1E +#define QSFP_B_MODPRS_HIf 0x1F + +#define QSFP_REG_READ(_pbmp_, _reg_, _base_) \ + do { \ + _pbmp_ = readb(_base_ + _reg_##_HIf) | \ + (readb(_base_ + _reg_##_LOf) << 8); \ + } while (0); + +#define QSFP_REG_WRITE(_pbmp_, _reg_, _base_) \ + do { \ + writeb((_pbmp_ & 0x00ff), \ + _base_ + _reg_##_HIf); \ + writeb(((_pbmp_ >> 8) & 0x00ff), \ + _base_ + _reg_##_LOf); \ + } while (0); + +enum PORT_TYPE { NONE, QSFP, SFP }; + +struct t7132s_cpld { + struct mutex lock; + unsigned char __iomem *cpld_base; + unsigned char __iomem *cpld2_base; + struct device *sff_devices[SFF_PORT_TOTAL]; + struct i2c_client *sff_i2c_clients[SFF_PORT_TOTAL]; +}; + +static struct t7132s_cpld *cpld_data; +static struct class *cpld_class = NULL; + +enum i2c_adapter_type { + I2C_ADAPTER_I801 = 0, + I2C_ADAPTER_ISMT, + I2C_ADAPTER_CP2112, + I2C_ADAPTER_PCA954X +}; + +const char *bms_i2c_adapter_names[] = { + "SMBus I801 adapter", + "SMBus iSMT adapter", + "CP2112 SMBus Bridge", + "PCA954X Mux" }; + +struct i2c_topo_node { + int adapter_type; + int parent_index; + int chan_id; + struct i2c_board_info entry; + struct i2c_client *client; +}; + +static struct i2c_topo_node i2c_topo[] = { + { I2C_ADAPTER_CP2112, -1, -1, { I2C_BOARD_INFO("pca9548", 0x70) }, NULL }, + { I2C_ADAPTER_PCA954X, 0, 0, { I2C_BOARD_INFO("pca9548", 0x71) }, NULL }, + { I2C_ADAPTER_PCA954X, 0, 2, { I2C_BOARD_INFO("pca9548", 0x72) }, NULL }, + { I2C_ADAPTER_PCA954X, 0, 1, { I2C_BOARD_INFO("pca9548", 0x73) }, NULL }, + { I2C_ADAPTER_PCA954X, 0, 3, { I2C_BOARD_INFO("pca9548", 0x74) }, NULL }, + { I2C_ADAPTER_PCA954X, 0, 4, { I2C_BOARD_INFO("pca9548", 0x75) }, NULL }, + { I2C_ADAPTER_PCA954X, 5, 3, { I2C_BOARD_INFO("24c64", 0x53) }, NULL }, +}; + +static struct i2c_board_info sff_eeprom_info[] = { + { I2C_BOARD_INFO("optoe3", 0x50) }, + { I2C_BOARD_INFO("optoe2", 0x50) } +}; + +struct sff_device_data { + int portid; + enum PORT_TYPE port_type; + int parent_index; + int chan_id; +}; + +struct sff_device_data sff_device_tbl[SFF_PORT_TOTAL] = { + { 1, QSFP, 1, 0 }, { 2, QSFP, 3, 3 }, { 3, QSFP, 1, 1 }, + { 4, QSFP, 3, 2 }, { 5, QSFP, 1, 2 }, { 6, QSFP, 3, 1 }, + { 7, QSFP, 1, 3 }, { 8, QSFP, 3, 0 }, { 9, QSFP, 1, 4 }, + { 10, QSFP, 3, 7 }, { 11, QSFP, 1, 5 }, { 12, QSFP, 3, 6 }, + { 13, QSFP, 1, 6 }, { 14, QSFP, 3, 5 }, { 15, QSFP, 1, 7 }, + { 16, QSFP, 3, 4 }, { 17, QSFP, 2, 0 }, { 18, QSFP, 4, 3 }, + { 19, QSFP, 2, 1 }, { 20, QSFP, 4, 2 }, { 21, QSFP, 2, 2 }, + { 22, QSFP, 4, 1 }, { 23, QSFP, 2, 3 }, { 24, QSFP, 4, 0 }, + { 25, QSFP, 2, 4 }, { 26, QSFP, 4, 7 }, { 27, QSFP, 2, 5 }, + { 28, QSFP, 4, 6 }, { 29, QSFP, 2, 6 }, { 30, QSFP, 4, 5 }, + { 31, QSFP, 2, 7 }, { 32, QSFP, 4, 4 }, { 1, SFP, 5, 0 }, + { 2, SFP, 5, 1 }, +}; + +#define WATCHDOG_TIMEOUT 30 /* 30 sec default heartbeat */ + +static struct watchdog_device *pwddev; + +static const struct watchdog_info ident = { + .options = WDIOF_SETTIMEOUT | + WDIOF_KEEPALIVEPING | + WDIOF_MAGICCLOSE, + .firmware_version = 0, + .identity = "t7132s_wdt", +}; + +/* used to access CPLD register not defined in this driver with sys filesystem */ +uint8_t cpld_testee_offset[2] = {0, 0}; + +static ssize_t swid_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + char *ptr = (cpld_data->cpld_base + CPLD1_REG_SW_ID); + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_SW_ID); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +struct device_attribute dev_attr_swid = __ATTR(swid, 0400, swid_show, NULL); + +static ssize_t hwrev_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + char *ptr = (cpld_data->cpld_base + CPLD1_REG_HWREV); + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_HWREV); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +struct device_attribute dev_attr_hwrev = __ATTR(hw_rev, 0400, hwrev_show, NULL); + +static ssize_t pwrgood_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_PWR_GOOD); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +struct device_attribute dev_attr_pwrgood = + __ATTR(pwr_good, 0400, pwrgood_show, NULL); + +static ssize_t vrm_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_VRM); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +struct device_attribute dev_attr_vrm = __ATTR(vrm, 0400, vrm_show, NULL); + +static ssize_t devstate_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + uint8_t data2 = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_DEV_STATE_1); + data2 = readb(cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + value = data; + value |= (data2 << 8); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%4.4lx\n", value); +} +static ssize_t devstate_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + long value = 0; + uint8_t data = 0; + uint8_t data2 = 0; + + mutex_lock(&cpld_data->lock); + status = kstrtol(buf, 0, &value); + if (status == 0) { + data = value & 0xff; + data2 = (value & 0xff00) >> 8; + writeb(data, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_1); + writeb(data2, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_devstate = + __ATTR(dev_state, 0600, devstate_show, devstate_store); + +static ssize_t wdtmax_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data1 = 0; + uint8_t data2 = 0; + long value = 0; + + mutex_lock(&cpld_data->lock); + data1 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_1); + data2 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_2); + value = (data2 << 8) | data1; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%4.4lx\n", value); +} +static ssize_t wdtmax_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + long value = 0; + uint8_t data1; + uint8_t data2; + + mutex_lock(&cpld_data->lock); + status = kstrtol(buf, 0, &value); + if (status == 0) { + data1 = value & 0xff; + data2 = (value & 0xff00) >> 8; + writeb(data1, cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_1); + writeb(data2, cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_2); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_wdtmax = + __ATTR(wdt_max, 0600, wdtmax_show, wdtmax_store); + +static ssize_t wdtcount_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data1 = 0; + uint8_t data2 = 0; + long value = 0; + + mutex_lock(&cpld_data->lock); + data1 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_CUR_COUNT_1); + data2 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_CUR_COUNT_2); + value = (data2 << 8) | data1; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%4.4lx\n", value); +} +struct device_attribute dev_attr_wdtcount = + __ATTR(wdt_count, 0400, wdtcount_show, NULL); + +static ssize_t sysrst_rec_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_SYS_RESET_REC); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +static ssize_t sysrst_rec_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + uint8_t data; + + mutex_lock(&cpld_data->lock); + status = kstrtou8(buf, 0, &data); + + if (status == 0) { + writeb(data, cpld_data->cpld_base + CPLD1_REG_SYS_RESET_REC); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_sysrst_rec = + __ATTR(sysrst_rec, 0600, sysrst_rec_show, sysrst_rec_store); + +static ssize_t muxstate_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_MUX_STATE); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +static ssize_t muxstate_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + uint8_t data; + + mutex_lock(&cpld_data->lock); + status = kstrtou8(buf, 0, &data); + if (status == 0) { + writeb(data, cpld_data->cpld_base + CPLD1_REG_MUX_STATE); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_muxstate = + __ATTR(i2c_mux_state, 0600, muxstate_show, muxstate_store); + +static ssize_t xcvr_pwrstate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + uint8_t data2 = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_X_PWR_EN_2); + data2 = readb(cpld_data->cpld_base + CPLD1_REG_X_PWR_EN_1); + value = data; + value |= (data2 << 8); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", value); +} +static ssize_t xcvr_pwrstate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + long value = 0; + uint8_t data = 0; + uint8_t data2 = 0; + + mutex_lock(&cpld_data->lock); + status = kstrtol(buf, 0, &value); + if (status == 0) { + data = value & 0xff; + data2 = (value & 0xff00) >> 8; + writeb(data, cpld_data->cpld_base + CPLD1_REG_X_PWR_EN_2); + writeb(data2, cpld_data->cpld_base + CPLD1_REG_X_PWR_EN_1); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_xcvr_pwrstate = + __ATTR(xcvr_pwr_state, 0600, xcvr_pwrstate_show, xcvr_pwrstate_store); + +static ssize_t xcvr_pwrgood_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + uint8_t data2 = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_X_PWR_GOOD_2); + data2 = readb(cpld_data->cpld_base + CPLD1_REG_X_PWR_GOOD_1); + value = data; + value |= (data2 << 8); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", value); +} +struct device_attribute dev_attr_xcvr_pwrgood = + __ATTR(xcvr_pwr_good, 0400, xcvr_pwrgood_show, NULL); + +static ssize_t cpld1_ver_bmc_i2c_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + uint8_t data2 = 0; + uint8_t data3 = 0; + uint8_t data4 = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_VER_BMC_I2C_4); + data2 = readb(cpld_data->cpld_base + CPLD1_REG_VER_BMC_I2C_3); + data3 = readb(cpld_data->cpld_base + CPLD1_REG_VER_BMC_I2C_2); + data4 = readb(cpld_data->cpld_base + CPLD1_REG_VER_BMC_I2C_1); + value = data; + value |= (data2 << 8); + value |= (data3 << 16); + value |= (data4 << 24); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%8.8lx\n", value); +} +struct device_attribute dev_attr_cpld1_ver_bmc_i2c = + __ATTR(ver_bmc_i2c, 0444, cpld1_ver_bmc_i2c_show, NULL); + +static ssize_t cpld1_jed_rel_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + uint8_t data2 = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_JED_REL_DAY); + data2 = readb(cpld_data->cpld_base + CPLD1_REG_JED_REL_MONTH); + value = data; + value |= (data2 << 8); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%4.4lx\n", value); +} +struct device_attribute dev_attr_cpld1_jed_rel = + __ATTR(jed_rel, 0400, cpld1_jed_rel_show, NULL); + +static ssize_t cpld1_testee_offset_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "0x%2.2x\n", cpld_testee_offset[0]); +} +static ssize_t cpld1_testee_offset_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + uint8_t data; + + status = kstrtou8(buf, 0, &data); + if (status == 0) { + cpld_testee_offset[0] = data; + status = count; + } + + return status; +} +struct device_attribute dev_attr_cpld1_testee_offset = + __ATTR(testee_offset, 0600, cpld1_testee_offset_show, cpld1_testee_offset_store); + +static ssize_t cpld1_testee_value_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + cpld_testee_offset[0]); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +static ssize_t cpld1_testee_value_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + uint8_t data; + + mutex_lock(&cpld_data->lock); + status = kstrtou8(buf, 0, &data); + if (status == 0) { + writeb(data, cpld_data->cpld_base + cpld_testee_offset[0]); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_cpld1_testee_value = + __ATTR(testee_value, 0600, cpld1_testee_value_show, cpld1_testee_value_store); + +static struct attribute *cpld1_attrs[] = { + &dev_attr_swid.attr, + &dev_attr_hwrev.attr, + &dev_attr_pwrgood.attr, + &dev_attr_vrm.attr, + &dev_attr_devstate.attr, + &dev_attr_sysrst_rec.attr, + &dev_attr_muxstate.attr, + &dev_attr_xcvr_pwrstate.attr, + &dev_attr_xcvr_pwrgood.attr, + &dev_attr_wdtmax.attr, + &dev_attr_wdtcount.attr, + &dev_attr_cpld1_ver_bmc_i2c.attr, + &dev_attr_cpld1_jed_rel.attr, + &dev_attr_cpld1_testee_offset.attr, + &dev_attr_cpld1_testee_value.attr, + NULL, +}; + +static struct attribute_group cpld1_attr_grp = { + .attrs = cpld1_attrs, +}; + +static ssize_t cpld2_ver_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld2_base + CPLD2_REG_HWREV); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +struct device_attribute dev_attr_cpld2_ver = __ATTR(cpld2_ver, 0400, cpld2_ver_show, NULL); + +static ssize_t sysrdy_rst_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld2_base + + CPLD2_REG_SYSRDY_RESET_STATUS); + value = data; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", value); +} +static ssize_t sysrdy_rst_status_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + long value = 0; + uint8_t data = 0; + + mutex_lock(&cpld_data->lock); + status = kstrtol(buf, 0, &value); + if (status == 0) { + data = value & 0xff; + writeb(data, cpld_data->cpld2_base + + CPLD2_REG_SYSRDY_RESET_STATUS); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_sysrdy_rst_status = + __ATTR(sysrdy_rst_state, 0600, sysrdy_rst_status_show, + sysrdy_rst_status_store); + +static ssize_t all_xcvr_led_ctrl_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld2_base + + CPLD2_REG_ALL_LED_CTRL); + value = data; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", value); +} +static ssize_t all_xcvr_led_ctrl_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + long value = 0; + uint8_t data = 0; + + mutex_lock(&cpld_data->lock); + status = kstrtol(buf, 0, &value); + if (status == 0) { + data = value & 0x1f; + writeb(data, cpld_data->cpld2_base + + CPLD2_REG_ALL_LED_CTRL); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_all_xcvr_led_ctrl = + __ATTR(all_xcvr_led_ctrl, 0600, all_xcvr_led_ctrl_show, + all_xcvr_led_ctrl_store); + +static ssize_t cpld2_ver_bmc_i2c_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + uint8_t data2 = 0; + uint8_t data3 = 0; + uint8_t data4 = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld2_base + CPLD2_REG_VER_BMC_I2C_4); + data2 = readb(cpld_data->cpld2_base + CPLD2_REG_VER_BMC_I2C_3); + data3 = readb(cpld_data->cpld2_base + CPLD2_REG_VER_BMC_I2C_2); + data4 = readb(cpld_data->cpld2_base + CPLD2_REG_VER_BMC_I2C_1); + value = data; + value |= (data2 << 8); + value |= (data3 << 16); + value |= (data4 << 24); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%8.8lx\n", value); +} +struct device_attribute dev_attr_cpld2_ver_bmc_i2c = + __ATTR(ver_bmc_i2c, 0400, cpld2_ver_bmc_i2c_show, NULL); + +static ssize_t cpld2_jed_rel_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + uint8_t data = 0; + uint8_t data2 = 0; + long value = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld2_base + CPLD2_REG_JED_REL_DAY); + data2 = readb(cpld_data->cpld2_base + CPLD2_REG_JED_REL_MONTH); + value = data; + value |= (data2 << 8); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%4.4lx\n", value); +} +struct device_attribute dev_attr_cpld2_jed_rel = + __ATTR(jed_rel, 0400, cpld2_jed_rel_show, NULL); + +static ssize_t cpld2_testee_offset_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "0x%2.2x\n", cpld_testee_offset[1]); +} +static ssize_t cpld2_testee_offset_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + uint8_t data; + + status = kstrtou8(buf, 0, &data); + if (status == 0) { + cpld_testee_offset[1] = data; + status = count; + } + + return status; +} +struct device_attribute dev_attr_cpld2_testee_offset = + __ATTR(testee_offset, 0600, cpld2_testee_offset_show, cpld2_testee_offset_store); + +static ssize_t cpld2_testee_value_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + uint8_t data = 0; + int err; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld2_base + cpld_testee_offset[1]); + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "0x%2.2x\n", data); +} +static ssize_t cpld2_testee_value_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t status = 0; + uint8_t data; + + mutex_lock(&cpld_data->lock); + status = kstrtou8(buf, 0, &data); + if (status == 0) { + writeb(data, cpld_data->cpld2_base + cpld_testee_offset[1]); + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +struct device_attribute dev_attr_cpld2_testee_value = + __ATTR(testee_value, 0600, cpld2_testee_value_show, cpld2_testee_value_store); + +static struct attribute *cpld2_attrs[] = { + &dev_attr_cpld2_ver.attr, + &dev_attr_sysrdy_rst_status.attr, + &dev_attr_all_xcvr_led_ctrl.attr, + &dev_attr_cpld2_ver_bmc_i2c.attr, + &dev_attr_cpld2_jed_rel.attr, + &dev_attr_cpld2_testee_offset.attr, + &dev_attr_cpld2_testee_value.attr, + NULL, +}; + +static struct attribute_group cpld2_attr_grp = { + .attrs = cpld2_attrs, +}; + +struct t7132s { + unsigned char __iomem *cfg_mmio_start; + resource_size_t cfg_mmio_len; + unsigned char __iomem *dev_mmio_start; + resource_size_t dev_mmio_len; + unsigned char __iomem *dev2_mmio_start; + resource_size_t dev2_mmio_len; +}; + +static struct t7132s t7132s_dev; +static struct platform_device *t7132s_platform_dev; +static struct kobject *cpld1 = NULL; +static struct kobject *cpld2 = NULL; +static struct device *sff_dev = NULL; + +static ssize_t qsfp_modirq_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 index = 0; + u16 reg = 0; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + if ((portid % 2) != 0) { + QSFP_REG_READ (reg, QSFP_T_INT, + cpld_data->cpld_base); + index = (portid + 1) / 2; + } else { + QSFP_REG_READ (reg, QSFP_B_INT, + cpld_data->cpld_base); + index = portid / 2; + } + value = reg >> (index - 1) & 1; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} +DEVICE_ATTR_RO(qsfp_modirq); + +static ssize_t qsfp_modprs_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 index = 0; + u16 reg = 0; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + if ((portid % 2) != 0) { + QSFP_REG_READ (reg, QSFP_T_MODPRS, + cpld_data->cpld_base); + index = (portid + 1) / 2; + } else { + QSFP_REG_READ (reg, QSFP_B_MODPRS, + cpld_data->cpld_base); + index = portid / 2; + } + value = reg >> (index - 1) & 1; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} +DEVICE_ATTR_RO(qsfp_modprs); + +static ssize_t qsfp_lpmode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 index = 0; + u16 reg = 0; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + if ((portid % 2) != 0) { + QSFP_REG_READ (reg, QSFP_T_LPMODE, + cpld_data->cpld_base); + index = (portid + 1) / 2; + } else { + QSFP_REG_READ (reg, QSFP_B_LPMODE, + cpld_data->cpld_base); + index = portid / 2; + } + value = reg >> (index - 1) & 1; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} +static ssize_t qsfp_lpmode_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + ssize_t status; + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 value = 0; + u8 index = 0; + u16 reg = 0; + + mutex_lock(&cpld_data->lock); + status = kstrtou8(buf, 0, &value); + + if ((status == 0) && (value <= 1)) { + if ((portid % 2) != 0) { + QSFP_REG_READ (reg, QSFP_T_LPMODE, + cpld_data->cpld_base); + index = (portid + 1) / 2; + if (value == 1) { + reg |= (1 << (index - 1)); + } else { + reg &= ~(1 << (index - 1)); + } + QSFP_REG_WRITE (reg, QSFP_T_LPMODE, + cpld_data->cpld_base); + } else { + QSFP_REG_READ (reg, QSFP_B_LPMODE, + cpld_data->cpld_base); + index = portid / 2; + if (value == 1) { + reg |= (1 << (index - 1)); + } else { + reg &= ~(1 << (index - 1)); + } + QSFP_REG_WRITE (reg, QSFP_B_LPMODE, + cpld_data->cpld_base); + } + status = count; + } + + mutex_unlock(&cpld_data->lock); + + return status; +} +DEVICE_ATTR_RW(qsfp_lpmode); + +static ssize_t qsfp_reset_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 index = 0; + u16 reg = 0; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + if ((portid % 2) != 0) { + QSFP_REG_READ (reg, QSFP_T_RESET, + cpld_data->cpld_base); + index = (portid + 1) / 2; + } else { + QSFP_REG_READ (reg, QSFP_B_RESET, + cpld_data->cpld_base); + index = portid / 2; + } + value = reg >> (index - 1) & 1; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} + +static ssize_t qsfp_reset_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + ssize_t status; + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 value = 0; + u8 index = 0; + u16 reg = 0; + + mutex_lock(&cpld_data->lock); + status = kstrtou8(buf, 0, &value); + + if ((status == 0) && (value <= 1)) { + if ((portid % 2) != 0) { + QSFP_REG_READ (reg, QSFP_T_RESET, + cpld_data->cpld_base); + index = (portid + 1) / 2; + if (value == 1) { + reg |= (1 << (index - 1)); + } else { + reg &= ~(1 << (index - 1)); + } + QSFP_REG_WRITE (reg, QSFP_T_RESET, + cpld_data->cpld_base); + } else { + QSFP_REG_READ (reg, QSFP_B_RESET, + cpld_data->cpld_base); + index = portid / 2; + if (value == 1) { + reg |= (1 << (index - 1)); + } else { + reg &= ~(1 << (index - 1)); + } + QSFP_REG_WRITE (reg, QSFP_B_RESET, + cpld_data->cpld_base); + } + status = count; + } + mutex_unlock(&cpld_data->lock); + + return status; +} +DEVICE_ATTR_RW(qsfp_reset); + +static struct attribute *sff_attrs[] = { + &dev_attr_qsfp_modprs.attr, + &dev_attr_qsfp_modirq.attr, + &dev_attr_qsfp_lpmode.attr, + &dev_attr_qsfp_reset.attr, + NULL, +}; +static struct attribute_group sff_attr_grp = { + .attrs = sff_attrs, +}; +static const struct attribute_group *sff_attr_grps[] = { &sff_attr_grp, NULL }; + +#define SFP_MOD_MASK (1 << 5) +#define SFP_LOS_MASK (1 << 4) +#define SFP_TXFAULT_MASK (1 << 3) +#define SFP_RS0_MASK (1 << 2) +#define SFP_RS1_MASK (1 << 1) +#define SFP_TXDISABLE_MASK (1) +#define CPLD1_SFP_OFFSET 0x20 +#define SFP_REG_READ(_portid_, _data_, _base_) \ + do { \ + _data_ = readb(_base_ + CPLD1_SFP_OFFSET + _portid_ - 1); \ + } while (0); +#define SFP_REG_WRITE(_portid_, _data_, _base_) \ + do { \ + writeb(_data_, _base_ + CPLD1_SFP_OFFSET + _portid_ - 1); \ + } while (0); + +static ssize_t sfp_modabs_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + SFP_REG_READ (portid, value, cpld_data->cpld_base); + value = ((value & SFP_MOD_MASK) != 0) ? 1 : 0; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} +DEVICE_ATTR_RO(sfp_modabs); + +static ssize_t sfp_txfault_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + SFP_REG_READ (portid, value, cpld_data->cpld_base); + value = ((value & SFP_TXFAULT_MASK) != 0) ? 1 : 0; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} +DEVICE_ATTR_RO(sfp_txfault); + +static ssize_t sfp_rxlos_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 index = 0; + u16 reg = 0; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + SFP_REG_READ (portid, value, cpld_data->cpld_base); + value = ((value & SFP_LOS_MASK) != 0) ? 1 : 0; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} +DEVICE_ATTR_RO(sfp_rxlos); + +static ssize_t sfp_txdisable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 value = 0; + + mutex_lock(&cpld_data->lock); + SFP_REG_READ (portid, value, cpld_data->cpld_base); + value = ((value & SFP_TXDISABLE_MASK) != 0) ? 1 : 0; + mutex_unlock(&cpld_data->lock); + + return sprintf(buf, "%d\n", value); +} + +static ssize_t sfp_txdisable_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + ssize_t status; + struct sff_device_data *dev_data = dev_get_drvdata(dev); + unsigned int portid = dev_data->portid; + u8 value = 0; + u8 index = 0; + u8 reg = 0; + + mutex_lock(&cpld_data->lock); + status = kstrtou8(buf, 0, &value); + + if ((status == 0) && value <= 1) { + SFP_REG_READ (portid, reg, cpld_data->cpld_base); + if (value == 1) { + reg |= 1; + } else { + reg &= ~1; + } + SFP_REG_WRITE (portid, reg, cpld_data->cpld_base); + status = count; + } else { + status = -EINVAL; + } + + mutex_unlock(&cpld_data->lock); + + return status; +} +DEVICE_ATTR_RW(sfp_txdisable); + +static struct attribute *sff_sfp_attrs[] = { + &dev_attr_sfp_txfault.attr, + &dev_attr_sfp_rxlos.attr, + &dev_attr_sfp_modabs.attr, + &dev_attr_sfp_txdisable.attr, + NULL, +}; +static struct attribute_group sff_sfp_attr_grp = { + .attrs = sff_sfp_attrs, +}; +static const struct attribute_group *sff_sfp_attr_grps[] = + { &sff_sfp_attr_grp, NULL }; + +static struct device *t7132s_sff_init(int portid) +{ + struct sff_device_data *new_data; + struct device *new_device; + char tmpStr[20]; + + new_data = kzalloc(sizeof(*new_data), GFP_KERNEL); + + new_data->portid = sff_device_tbl[portid].portid; + new_data->port_type = sff_device_tbl[portid].port_type; + new_data->parent_index = sff_device_tbl[portid].parent_index; + new_data->chan_id = sff_device_tbl[portid].chan_id; + + if (sff_device_tbl[portid].port_type == QSFP) { + sprintf(tmpStr, "QSFP%d", new_data->portid); + new_device = device_create_with_groups(cpld_class, sff_dev, MKDEV(0, 0), + new_data, sff_attr_grps, "%s", + tmpStr); + } else { + sprintf(tmpStr, "SFP%d", new_data->portid); + new_device = device_create_with_groups(cpld_class, sff_dev, MKDEV(0, 0), + new_data, sff_sfp_attr_grps, "%s", + tmpStr); + } + + return new_device; +} + +static void t7132s_sff_deinit(int portid) +{ + struct sff_device_data *dev_data; + + dev_data = dev_get_drvdata(cpld_data->sff_devices[portid]); + device_unregister(cpld_data->sff_devices[portid]); + put_device(cpld_data->sff_devices[portid]); + kfree(dev_data); + + return; +} + +static int t7132s_wdt_start(struct watchdog_device *wd_dev) +{ + uint8_t data = 0; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + data |= 0x01; + writeb(data, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + mutex_unlock(&cpld_data->lock); + return 0; +} + +static int t7132s_wdt_stop(struct watchdog_device *wd_dev) +{ + uint8_t data = 0; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + data &= 0xfe; + writeb(data, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + mutex_unlock(&cpld_data->lock); + return 0; +} + +static int t7132s_wdt_ping(struct watchdog_device *wd_dev) +{ + uint8_t data = 0; + + mutex_lock(&cpld_data->lock); + data = readb(cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + /* disable */ + data &= 0xfe; + writeb(data, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + /* enable */ + data |= 0x01; + writeb(data, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + mutex_unlock(&cpld_data->lock); + return 0; +} + +static int t7132s_wdt_set_timeout(struct watchdog_device *wd_dev, unsigned int t) +{ + uint8_t data1 = 0; + uint8_t data2 = 0; + uint8_t data = 0; + int is_enabled = 0; + + if (t > 65535) + return -EINVAL; + + data1 = t & 0xff; + data2 = (t & 0xff00) >> 8; + mutex_lock(&cpld_data->lock); + /* save and stop */ + data = readb(cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + is_enabled = data & 0x01; + if (is_enabled != 0) { + data &= 0xfe; + writeb(data, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + } + /* update max */ + writeb(data1, cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_1); + writeb(data2, cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_2); + /* restore */ + if (is_enabled != 0) { + data = readb(cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + data |= is_enabled; + writeb(data, cpld_data->cpld_base + CPLD1_REG_DEV_STATE_2); + } + mutex_unlock(&cpld_data->lock); + + wd_dev->timeout = t; + return 0; +} + +static unsigned int t7132s_wdt_get_timeleft(struct watchdog_device *wd_dev) +{ + unsigned int time_left = 0; + uint8_t data_max1 = 0; + uint8_t data_max2 = 0; + long time_max = 0; + uint8_t data_now1 = 0; + uint8_t data_now2 = 0; + long time_now = 0; + + mutex_lock(&cpld_data->lock); + data_max1 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_1); + data_max2 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_MAX_COUNT_2); + data_now1 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_CUR_COUNT_1); + data_now2 = readb(cpld_data->cpld_base + CPLD1_REG_WDT_CUR_COUNT_2); + mutex_unlock(&cpld_data->lock); + + /* our watchdog is counting up */ + time_max = (data_max2 << 8) | data_max1; + time_now = (data_now2 << 8) | data_now1; + if (time_max >= time_now) { + time_left = time_max - time_now; + } + else + { + /* for debug */ + time_left = 0; + printk("T7132S: t7132s_wdt_get_timeleft time_max=0x%04lx time_now=0x%04lx\n", + time_max, time_now); + } + + return time_left; + +} + +static const struct watchdog_ops t7132s_wdt_ops = { + .owner = THIS_MODULE, + .start = t7132s_wdt_start, + .stop = t7132s_wdt_stop, + .ping = t7132s_wdt_ping, + .set_timeout = t7132s_wdt_set_timeout, + .get_timeleft = t7132s_wdt_get_timeleft, +}; + +static int __init __find_i2c_adap(struct device *dev, const void *data) +{ + const char *name = data; + static const char *prefix = "i2c-"; + struct i2c_adapter *adapter; + + if (strncmp(dev_name(dev), prefix, strlen(prefix)) != 0) { + return 0; + } + adapter = to_i2c_adapter(dev); + + return (strncmp(adapter->name, name, strlen(name)) == 0); +} + +static int t7132s_drv_probe(struct platform_device *pdev) +{ + int ret = 0; + int port_count = 0; + struct sff_device_data *sff_data = NULL; + const char *name = NULL; + struct device *dev = NULL; + struct i2c_adapter *adapter = NULL; + struct i2c_board_info *entry = NULL; + struct i2c_client *client = NULL; + struct i2c_mux_core *muxc = NULL; + int index = 0; + int parent_idx = 0; + int max_index = sizeof(i2c_topo) / sizeof(struct i2c_topo_node); + int adapter_id = 0; + int chan_id = 0; + + cpld_class = class_create(THIS_MODULE, CLASS_NAME); + ret = PTR_ERR(cpld_class); + + cpld_data = devm_kzalloc(&pdev->dev, sizeof(struct t7132s_cpld), + GFP_KERNEL); + mutex_init(&cpld_data->lock); + cpld_data->cpld_base = t7132s_dev.dev_mmio_start; + cpld1 = kobject_create_and_add("CPLD1", &pdev->dev.kobj); + ret = sysfs_create_group(cpld1, &cpld1_attr_grp); + cpld_data->cpld2_base = t7132s_dev.dev2_mmio_start; + cpld2 = kobject_create_and_add("CPLD2", &pdev->dev.kobj); + ret = sysfs_create_group(cpld2, &cpld2_attr_grp); + + sff_dev = device_create(cpld_class, NULL, MKDEV(0, 0), NULL, "%s", + "sff_device"); + ret = sysfs_create_link(&pdev->dev.kobj, &sff_dev->kobj, "SFF"); + + /* Setup i2c MUX devices */ + for (index = 0; index < max_index; index++) { + if (i2c_topo[index].parent_index == -1) { + name = bms_i2c_adapter_names[i2c_topo[index] + .adapter_type]; + dev = bus_find_device(&i2c_bus_type, NULL, (void *)name, + __find_i2c_adap); + adapter = to_i2c_adapter(dev); + if (adapter != NULL) { + i2c_topo[index].client = i2c_new_client_device( + adapter, &i2c_topo[index].entry); + msleep(500); + } + } else if (i2c_topo[index].parent_index != -1) { + parent_idx = i2c_topo[index].parent_index; + if (i2c_topo[parent_idx].client != NULL) { + client = i2c_topo[parent_idx].client; + muxc = i2c_get_clientdata(client); + if (muxc != NULL) { + chan_id = i2c_topo[index].chan_id; + adapter_id = muxc->adapter[chan_id]->nr; + adapter = i2c_get_adapter(adapter_id); + if (adapter != NULL) { + i2c_topo[index] + .client = i2c_new_client_device( + adapter, + &i2c_topo[index].entry); + i2c_put_adapter(adapter); + msleep(100); + } + } + } + } + dev = NULL; + adapter = NULL; + } + + for (port_count = 0; port_count < SFF_PORT_TOTAL; port_count++) { + cpld_data->sff_devices[port_count] = + t7132s_sff_init(port_count); + sff_data = dev_get_drvdata(cpld_data->sff_devices[port_count]); + parent_idx = sff_data->parent_index; + chan_id = sff_data->chan_id; + muxc = i2c_get_clientdata(i2c_topo[parent_idx].client); + if (muxc != NULL) { + adapter_id = muxc->adapter[chan_id]->nr; + adapter = i2c_get_adapter(adapter_id); + } + if (adapter == NULL) + continue; + if (sff_data->port_type == QSFP) { + /* Initiate optoe1 device */ + cpld_data->sff_i2c_clients[port_count] = + i2c_new_client_device(adapter, &sff_eeprom_info[0]); + } else { + /* Initiate optoe2 device */ + cpld_data->sff_i2c_clients[port_count] = + i2c_new_client_device(adapter, &sff_eeprom_info[1]); + } + i2c_put_adapter(adapter); + sff_data = NULL; + adapter = NULL; + /* Create sysfs link */ + sysfs_create_link( + &cpld_data->sff_devices[port_count]->kobj, + &cpld_data->sff_i2c_clients[port_count]->dev.kobj, + "i2c"); + } + + /* watchdog */ + pwddev = devm_kzalloc(&pdev->dev, sizeof(*pwddev), GFP_KERNEL); + if (pwddev) { + pwddev->info = &ident, + pwddev->ops = &t7132s_wdt_ops, + pwddev->bootstatus = 0; + pwddev->timeout = WATCHDOG_TIMEOUT; + pwddev->parent = &pdev->dev; + pwddev->min_timeout = 1; + pwddev->max_timeout = 65535; + //pwddev->max_hw_heartbeat_ms = 65535 * 1000; + + ret = devm_watchdog_register_device(&pdev->dev, pwddev); + if (ret != 0) { + printk("T7132S: cannot register watchdog device (err=%d)\n", ret); + } + else { + t7132s_wdt_stop(pwddev); + t7132s_wdt_set_timeout(pwddev, WATCHDOG_TIMEOUT); + printk("T7132S: watchdog initialized. heartbeat=%d sec (nowayout=%d)\n", + pwddev->timeout, 0); + } + } + else { + printk("T7132S: devm_kzalloc fail for watchdog device\n"); + } + + return 0; +} + +static int t7132s_drv_remove(struct platform_device *pdev) +{ + int ret = 0; + int port_count = 0; + struct sff_device_data *sff_data = NULL; + const char *name = NULL; + struct device *dev = NULL; + struct i2c_adapter *adapter; + struct i2c_board_info *entry; + int index = 0; + int max_index = sizeof(i2c_topo) / sizeof(struct i2c_topo_node); + + for (port_count = 0; port_count < SFF_PORT_TOTAL; port_count++) { + sysfs_remove_link(&cpld_data->sff_devices[port_count]->kobj, + "i2c"); + if (cpld_data->sff_i2c_clients[port_count] != NULL) { + i2c_unregister_device( + cpld_data->sff_i2c_clients[port_count]); + } + } + + for (port_count = 0; port_count < SFF_PORT_TOTAL; port_count++) { + t7132s_sff_deinit(port_count); + } + + for (index = max_index - 1; index >= 0; index--) { + if (i2c_topo[index].client != NULL) { + i2c_unregister_device(i2c_topo[index].client); + } + } + + sysfs_remove_link(&pdev->dev.kobj, "SFF"); + device_destroy(cpld_class, MKDEV(0, 0)); + sysfs_remove_group(cpld1, &cpld1_attr_grp); + class_destroy(cpld_class); // remove the device class + cpld_class = NULL; + devm_kfree(&pdev->dev, cpld_data); + devm_kfree(&pdev->dev, pwddev); + + return 0; +} + +static struct platform_driver t7132s_drv = { + .probe = t7132s_drv_probe, + .remove = __exit_p(t7132s_drv_remove), + .driver = + { + .name = DRIVER_NAME, + .owner = THIS_MODULE, + }, +}; + +static void t7132s_remove(struct pci_dev *dev) +{ + platform_device_unregister(t7132s_platform_dev); + platform_driver_unregister(&t7132s_drv); + iounmap(t7132s_dev.cfg_mmio_start); + iounmap(t7132s_dev.dev_mmio_start); + iounmap(t7132s_dev.dev2_mmio_start); + + pci_disable_device(dev); +} + +static int t7132s_probe(struct pci_dev *dev, const struct pci_device_id *ent) +{ + int retval, ret; + unsigned long base; + resource_size_t len; + unsigned long val; + char *ptr = NULL; + + retval = pci_enable_device(dev); + pci_set_master(dev); + + len = pci_resource_len(dev, 5); + base = pci_resource_start(dev, 5); + t7132s_dev.cfg_mmio_start = ioremap(base, len); + t7132s_dev.cfg_mmio_len = len; + + len = pci_resource_len(dev, 0); + base = pci_resource_start(dev, 0); + t7132s_dev.dev_mmio_start = ioremap(base, len); + t7132s_dev.dev_mmio_len = len; + + len = pci_resource_len(dev, 1); + base = pci_resource_start(dev, 1); + t7132s_dev.dev2_mmio_start = ioremap(base, len); + t7132s_dev.dev2_mmio_len = len; + + /* Localbus bridge reset sequence */ + val = readl(t7132s_dev.cfg_mmio_start + REG_LIEMR); + printk("LIEMR = 0x%x", val); + writeb(val | LIEMR_SRST | LIEMR_LRST, + t7132s_dev.cfg_mmio_start + REG_LIEMR); + val = readl(t7132s_dev.cfg_mmio_start + REG_LIEMR); + printk("LIEMR(after hw reset) = 0x%x", val); + + /* Localbus init sequence */ + val = LIEMR_RDYPOL | LIEMR_ALEPOL | LIEMR_SYNCBUS | LIEMR_MULTBUS | + LIEMR_DMA0EN | LIEMR_DMA1EN | LIEMR_L0EINTEN | LIEMR_L0RTOIEN | + LIEMR_L1EINTEN | LIEMR_L1RTOIEN | LIEMR_D0DIEN | LIEMR_D0AIEN | + LIEMR_D1DIEN | LIEMR_D1AIEN; + printk("LIEMR(new) = 0x%x", val); + writel(val, t7132s_dev.cfg_mmio_start + REG_LIEMR); + val = readl(t7132s_dev.cfg_mmio_start + REG_LIEMR); + printk("LIEMR(modified) = 0x%x", val); + + val = readl(t7132s_dev.cfg_mmio_start + REG_LAS0CFGR); + val &= ~LASCFGR_BW16; + writel(val, t7132s_dev.cfg_mmio_start + REG_LAS0CFGR); + val = readl(t7132s_dev.cfg_mmio_start + REG_LAS0CFGR); /* flush */ + + val = readl(t7132s_dev.cfg_mmio_start + REG_LAS1CFGR); + val &= ~LASCFGR_BW16; + writel(val, t7132s_dev.cfg_mmio_start + REG_LAS1CFGR); + val = readl(t7132s_dev.cfg_mmio_start + REG_LAS1CFGR); /* flush */ + + val = readl(t7132s_dev.cfg_mmio_start + REG_LACKSR); + printk("LACKSR = 0x%x", val); + val &= ~LACKSR_ALERA; + val |= LACKSR_CLKOEN; + val = 0x2405; + writel(val, t7132s_dev.cfg_mmio_start + REG_LACKSR); + val = readl(t7132s_dev.cfg_mmio_start + REG_LACKSR); + printk("LACKSR(modified) = 0x%x", val); + + /* Read Switch ID from offset 0x1 */ + ptr = (t7132s_dev.dev_mmio_start + CPLD1_REG_SW_ID); + val = readb(t7132s_dev.dev_mmio_start + CPLD1_REG_SW_ID); + printk("Switch ID : 0x%x", val); + + platform_driver_register(&t7132s_drv); + t7132s_platform_dev = + platform_device_register_simple(DRIVER_NAME, -1, NULL, 0); + + return 0; +} + +static int t7132s_suspend(struct pci_dev *dev, pm_message_t state) +{ + return 0; +}; + +static int t7132s_resume(struct pci_dev *dev) +{ + return 0; +}; + +static struct pci_device_id t7132s_pci_tbl[] = { + { 0x125B, 0x9110, 0xa000, 0x7000, 0, 0, 0 }, + { 0x125B, 0x9100, 0xa000, 0x7000, 0, 0, 0 }, + { + 0, + }, +}; + +static struct pci_driver t7132s_pci_driver = { + .name = "t7132s", + .probe = t7132s_probe, + .remove = t7132s_remove, + .id_table = t7132s_pci_tbl, + .suspend = t7132s_suspend, + .resume = t7132s_resume, +}; + +static int __init t7132s_init(void) +{ + int ret; + + memset(&t7132s_dev, 0, sizeof(struct t7132s)); + ret = pci_register_driver(&t7132s_pci_driver); + + return ret; +} + +static void __exit t7132s_exit(void) +{ + pci_unregister_driver(&t7132s_pci_driver); +} + +module_init(t7132s_init); +module_exit(t7132s_exit); + +MODULE_DEVICE_TABLE(pci, t7132s_pci_tbl); +MODULE_DESCRIPTION("SuperMicro T7132S CPLD Module"); +MODULE_SUPPORTED_DEVICE("T7132S"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/health_checker_thermal.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/health_checker_thermal.py new file mode 100755 index 000000000000..6f1ee137843d --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/health_checker_thermal.py @@ -0,0 +1,50 @@ +#!/usr/bin/python3 + +''' +This script is for healthd user_defined_checkers. +''' + +from swsscommon.swsscommon import SonicV2Connector +from natsort import natsorted + +TEMPER_TABLE_NAME = 'TEMPERATURE_INFO' +TEMPER_FIELD_NAME = 'temperature' +TIMESTAMP_FIELD_NAME = 'timestamp' +HIGH_THRESH_FIELD_NAME = 'high_threshold' +LOW_THRESH_FIELD_NAME = 'low_threshold' +CRIT_HIGH_THRESH_FIELD_NAME = 'critical_high_threshold' +CRIT_LOW_THRESH_FIELD_NAME = 'critical_low_threshold' +WARNING_STATUS_FIELD_NAME = 'warning_status' + +class TemperCheck(object): + def __init__(self): + self.db = SonicV2Connector(host="127.0.0.1") + self.db.connect(self.db.STATE_DB) + + def show(self): + keys = self.db.keys(self.db.STATE_DB, TEMPER_TABLE_NAME + '*') + if not keys: + #print('Thermal Not detected\n') + return + + print("Thermal") + for key in natsorted(keys): + key_list = key.split('|') + if len(key_list) != 2: # error data in DB, log it and ignore + #print('Warn: Invalid key in table {}: {}'.format(TEMPER_TABLE_NAME, key)) + continue + + name = key_list[1] + data_dict = self.db.get_all(self.db.STATE_DB, key) + if data_dict[WARNING_STATUS_FIELD_NAME] == 'False': + print("{}:OK".format(name)) + else: + temperature = data_dict[TEMPER_FIELD_NAME] + high_threshold = data_dict[HIGH_THRESH_FIELD_NAME] + low_threshold = data_dict[LOW_THRESH_FIELD_NAME] + print("{}:{} status is warning about temperature {} (threshold high {} low {})". + format(name, name, temperature, high_threshold, low_threshold)) + +if __name__ == "__main__": + temperCheck = TemperCheck() + temperCheck.show() diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/platform.sh b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/platform.sh new file mode 100755 index 000000000000..91c7249b448c --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/platform.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +i2c_config() { + local count=0 + local MAX_BUS_RETRY=20 + local MAX_I2C_OP_RETRY=10 + + i2c_bus_op=`echo "$@" | cut -d'>' -f 2` + i2c_bus=$(dirname $i2c_bus_op) + + # check if bus exists + while [[ "$count" -lt "$MAX_BUS_RETRY" ]]; do + [[ -e $i2c_bus ]] && break || sleep .1 + count=$((count+1)) + done + + if [[ "$count" -eq "$MAX_BUS_RETRY" ]]; then + echo "dell_i2c_utils : ERROR: $@ : i2c bus not created" + return + fi + + # perform the add/delete + count=0 + while [[ "$count" -lt "$MAX_I2C_OP_RETRY" ]]; do + eval "$@" > /dev/null 2>&1 + [[ $? == 0 ]] && break || sleep .2 + count=$((count+1)) + done + + if [[ "$count" -eq "$MAX_I2C_OP_RETRY" ]]; then + echo "dell_i2c_utils : ERROR: $@ : i2c operation failed" + return + fi +} + +# Attach/Detach syseeprom on CPU board +sys_eeprom() { + case $1 in + "new_device") i2c_config "echo 24c02 0x53 > /sys/bus/i2c/devices/i2c-0/$1" + ;; + "delete_device") i2c_config "echo 0x53 > /sys/bus/i2c/devices/i2c-0/$1" + ;; + *) echo "platform: sys_eeprom : invalid command !" + ;; + esac +} + +install_python_api_package() { + device="/usr/share/sonic/device" + platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + + rv=$(pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl) +} + +remove_python_api_package() { + rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null) + if [ $? -eq 0 ]; then + rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null) + fi +} +update_share_password() { + echo "Update shared password !!!" + SONIC_VERSION=$(cat /etc/sonic/sonic_version.yml | grep "build_version" | sed -e "s/build_version: //g;s/'//g") + image_dir=$(cat /proc/cmdline | sed -e 's/.*loop=\(\S*\)\/.*/\1/') + if [ -f /host/reboot-cause/platform/last_boot_image ]; then + last_image_ver=$(cat /host/reboot-cause/platform/last_boot_image) + else + last_image_ver="" + fi + echo "last_image_ver=${last_image_ver}" + + find /host -name "*image-*" | sed -e 's/\/host\/image-//' | while read var ; do + #echo "var=${var} image_dir=${image_dir}" + if [ "image-${var}" != "$image_dir" ] && [ "$last_image_ver" != "${SONIC_VERSION}" ]; then + cp /host/image-${var}/rw/etc/shadow /host/${image_dir}/rw/etc/shadow + cp /host/image-${var}/rw/etc/passwd /host/${image_dir}/rw/etc/passwd + cp /host/image-${var}/rw/etc/gshadow /host/${image_dir}/rw/etc/gshadow + cp /host/image-${var}/rw/etc/group /host/${image_dir}/rw/etc/group + fi + done + + if [ -d /host/reboot-cause/platform ]; then + echo "${SONIC_VERSION}" | sudo tee /host/reboot-cause/platform/last_boot_image > /dev/null + fi +} + + +if [ "$1" == "init" ]; then + echo "Initializing hardware components ..." + depmod -a + sys_eeprom "new_device" + modprobe t7132s + install_python_api_package + update_share_password +elif [ "$1" == "deinit" ]; then + echo "De-initializing hardware components ..." + modprobe -r t7132s + sys_eeprom "delete_device" + remove_python_api_package +else + echo "Invalid options !" +fi diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/sysledctl.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/sysledctl.py new file mode 100755 index 000000000000..4493ee55028d --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/sysledctl.py @@ -0,0 +1,53 @@ +#!/usr/bin/python3 +import sys +import subprocess +import re +import sonic_platform.platform + +def systemctl(): + log_path = sys.argv[0] + ".log" + with open(log_path, 'w') as f: + out = subprocess.run(['systemctl', 'list-jobs'], capture_output=True, text=True).stdout + f.write(out) + chassis = sonic_platform.platform.Platform().get_chassis() + + x = re.search("reboot.target[ ]+start", out) + if x: + f.write("starting reboot\n") + chassis.set_status_led('green_blink') + + x = re.search("kexec.target[ ]+start", out) + if x: + f.write("starting kexec\n") + chassis.set_status_led('green_blink') + + x = re.search("halt.target[ ]+start", out) + if x: + f.write("starting halt\n") + chassis.set_status_led('red') + + x = re.search("poweroff.target[ ]+start", out) + if x: + f.write("starting poweroff\n") + chassis.set_status_led('off') + chassis.set_cpld2_s3(1) + + f.write("done\n") + +def reboot(): + log_path = sys.argv[0] + ".log" + with open(log_path, 'w') as f: + f.write("fast/warm reboot\n") + chassis = sonic_platform.platform.Platform().get_chassis() + chassis.set_status_led('green_blink') + f.write("done\n") + +def main(): + if len(sys.argv)>=2 and sys.argv[1]=='start': + systemctl() + if len(sys.argv)>=2 and sys.argv[1]=='reboot': + reboot() + + +if __name__ == '__main__': + main() diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/test_cpld.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/test_cpld.py new file mode 100755 index 000000000000..69e0f8302aea --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/scripts/test_cpld.py @@ -0,0 +1,209 @@ +import pytest + +CPLD_INFO_PATH='/sys/devices/platform/switchboard/CPLD{}' + +@pytest.mark.parametrize( + "cpld, offset, default, valid_mask, writeable_mask, test_mask", + [ + pytest.param( 1, 0x00, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x00 Reserved"), + pytest.param( 1, 0x01, 0x00, 0x1f, 0x00, 0x00, id="CPLD1 0x01 Switch model ID"), + pytest.param( 1, 0x02, 0x10, 0xff, 0x00, 0x00, id="CPLD1 0x02 HW/CPLD version"), + pytest.param( 1, 0x03, 0xff, 0xff, 0x00, 0x00, id="CPLD1 0x03 Power sequence module status"), + pytest.param( 1, 0x04, 0x00, 0xff, 0x00, 0x00, id="CPLD1 0x04 Voltage Regulator Module ALERT/ Thermal"), + pytest.param( 1, 0x05, 0x7f, 0xff, 0x98, 0x18, id="CPLD1 0x05 Enable/ Reset misc. devices"), + pytest.param( 1, 0x06, 0xfe, 0xff, 0xff, 0x01, id="CPLD1 0x06 Enable/ Reset misc. devices"), + pytest.param( 1, 0x07, 0x0a, 0x0f, 0x0a, 0x0a, id="CPLD1 0x07 FACTORY_BTN event log and clear"), + pytest.param( 1, 0x09, 0xe0, 0xe0, 0xe0, 0xe0, id="CPLD1 0x09 System reset records"), + pytest.param( 1, 0x0B, 0xff, 0xff, 0x3f, 0x00, id="CPLD1 0x0B PCA9548 I2C bus switch RSTn"), + pytest.param( 1, 0x0C, 0x07, 0x07, 0x07, 0x07, id="CPLD1 0x0C Transceiver Power Enable"), + pytest.param( 1, 0x0D, 0xff, 0xff, 0xff, 0xff, id="CPLD1 0x0D Transceiver Power Enable"), + pytest.param( 1, 0x0E, 0x07, 0x07, 0x00, 0x00, id="CPLD1 0x0E Transceiver Power Good"), + pytest.param( 1, 0x0F, 0xff, 0xff, 0x00, 0x00, id="CPLD1 0x0F Transceiver Power Good"), + pytest.param( 1, 0x10, 0xff, 0xff, 0xff, 0xff, id="CPLD1 0x10 QSFP-DD Reset signals for Port QT16 to QT9"), + pytest.param( 1, 0x11, 0xff, 0xff, 0xff, 0xff, id="CPLD1 0x11 QSFP-DD Reset signals for Port QT8 to QT1"), + pytest.param( 1, 0x12, 0x00, 0xff, 0xff, 0xff, id="CPLD1 0x12 QSFP-DD LPMODE signals for Port QT16 to QT9"), + pytest.param( 1, 0x13, 0x00, 0xff, 0xff, 0xff, id="CPLD1 0x13 QSFP-DD LPMODE signals for Port QT8 to QT1"), + pytest.param( 1, 0x14, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x14 QSFP-DD INT signals from Port QT16 to QT9"), + pytest.param( 1, 0x15, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x15 QSFP-DD INT signals from Port QT8 to QT1"), + pytest.param( 1, 0x16, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x16 QSFP-DD MODPRS signals from Port QT16 to QT9"), + pytest.param( 1, 0x17, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x17 QSFP-DD MODPRS signals from Port QT8 to QT1"), + pytest.param( 1, 0x18, 0xff, 0xff, 0xff, 0xff, id="CPLD1 0x18 QSFP-DD Reset signals for Port QB16 to QB9"), + pytest.param( 1, 0x19, 0xff, 0xff, 0xff, 0xff, id="CPLD1 0x19 QSFP-DD Reset signals for Port QB8 to QB1"), + pytest.param( 1, 0x1A, 0x00, 0x00, 0xff, 0xff, id="CPLD1 0x1A QSFP-DD LPMODE signals for Port QB16 to QB9"), + pytest.param( 1, 0x1B, 0x00, 0x00, 0xff, 0xff, id="CPLD1 0x1B QSFP-DD LPMODE signals for Port QB8 to QB1"), + pytest.param( 1, 0x1C, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x1C QSFP-DD INT signals from Port QB16 to QB9"), + pytest.param( 1, 0x1D, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x1D QSFP-DD INT signals from Port QB8 to QB1"), + pytest.param( 1, 0x1E, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x1E QSFP-DD MODPRS signals from Port QB16 to QB9"), + pytest.param( 1, 0x1F, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x1F QSFP-DD MODPRS signals from Port QB8 to QB1"), + pytest.param( 1, 0x20, 0x06, 0x00, 0x07, 0x07, id="CPLD1 0x20 Top side SFPP"), + pytest.param( 1, 0x21, 0x06, 0x00, 0x07, 0x07, id="CPLD1 0x21 Bottom side SFPP"), + pytest.param( 1, 0x22, 0x00, 0x00, 0xff, 0xff, id="CPLD1 0x22 Watch Dog Maximum count setting, Least significant 8 bits"), + pytest.param( 1, 0x23, 0x00, 0x00, 0xff, 0xff, id="CPLD1 0x23 Watch Dog Maximum count setting, Most significant 8 bits"), + pytest.param( 1, 0x24, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x24 Watch Dog Current count value, Least significant 8 bits"), + pytest.param( 1, 0x25, 0x00, 0x00, 0x00, 0x00, id="CPLD1 0x25 Watch Dog Current count value, Most significant 8 bits"), + pytest.param( 1, 0xF0, 0x00, 0xff, 0x00, 0x00, id="CPLD1 0xF0 Version as BMC I2C Registers #0"), + pytest.param( 1, 0xF1, 0x48, 0xff, 0x00, 0x00, id="CPLD1 0xF1 Version as BMC I2C Registers #1"), + pytest.param( 1, 0xF2, 0x00, 0xff, 0x00, 0x00, id="CPLD1 0xF2 Version as BMC I2C Registers #2"), + pytest.param( 1, 0xF3, 0x02, 0xff, 0x00, 0x00, id="CPLD1 0xF3 Version as BMC I2C Registers #3"), + pytest.param( 1, 0xFE, 0x10, 0xff, 0x00, 0x00, id="CPLD1 0xFE CPLD JED Released Date Month"), + pytest.param( 1, 0xFF, 0x26, 0xff, 0x00, 0x00, id="CPLD1 0xFF CPLD JED Released Date Day"), + pytest.param( 2, 0x00, 0x00, 0x00, 0x00, 0x00, id="CPLD2 0x00 Reserved"), + pytest.param( 2, 0x01, 0x00, 0x00, 0x00, 0x00, id="CPLD2 0x01 Reserved"), + pytest.param( 2, 0x02, 0x00, 0x0f, 0x00, 0x00, id="CPLD2 0x02 CPLD2 FW version"), + pytest.param( 2, 0x03, 0x2c, 0x7f, 0x37, 0x33, id="CPLD2 0x03 System Ready/Reset Status and LED control"), + pytest.param( 2, 0x04, 0x00, 0xff, 0x1f, 0x1f, id="CPLD2 0x04 All transceiver LEDs control"), + pytest.param( 2, 0x05, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x05 SFPP LED manual control TSFPP"), + pytest.param( 2, 0x06, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x06 SFPP LED manual control BSFPP"), + pytest.param( 2, 0x07, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x07 QSFP-DD LED manual control QT1_Pn_G"), + pytest.param( 2, 0x08, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x08 QSFP-DD LED manual control QT1_Pn_Y"), + pytest.param( 2, 0x09, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x09 QSFP-DD LED manual control QB1_P1_G"), + pytest.param( 2, 0x0A, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x0A QSFP-DD LED manual control QB1_P1_Y"), + pytest.param( 2, 0x0B, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x0B QT2 Green 4 LEDs"), + pytest.param( 2, 0x0C, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x0C QT2 Yellow 4 LEDs"), + pytest.param( 2, 0x0D, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x0D QB2 Green 4 LEDs"), + pytest.param( 2, 0x0E, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x0E QB2Yellow 4 LEDs"), + pytest.param( 2, 0x0F, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x0F QT3 Green 4 LEDs"), + pytest.param( 2, 0x10, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x10 QT3 Yellow 4 LEDs"), + pytest.param( 2, 0x11, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x11 QB3 Green 4 LEDs"), + pytest.param( 2, 0x12, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x12 QB3Yellow 4 LEDs"), + pytest.param( 2, 0x13, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x13 QT4 Green 4 LEDs"), + pytest.param( 2, 0x14, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x14 QT4 Yellow 4 LEDs"), + pytest.param( 2, 0x15, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x15 QB4 Green 4 LEDs"), + pytest.param( 2, 0x16, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x16 QB4Yellow 4 LEDs"), + pytest.param( 2, 0x17, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x17 QT5 Green 4 LEDs"), + pytest.param( 2, 0x18, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x18 QT5 Yellow 4 LEDs"), + pytest.param( 2, 0x19, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x19 QB5 Green 4 LEDs"), + pytest.param( 2, 0x1A, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x1A QB5Yellow 4 LEDs"), + pytest.param( 2, 0x1B, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x1B QT6 Green 4 LEDs"), + pytest.param( 2, 0x1C, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x1C QT6 Yellow 4 LEDs"), + pytest.param( 2, 0x1D, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x1D QB6 Green 4 LEDs"), + pytest.param( 2, 0x1E, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x1E QB6 Yellow 4 LEDs"), + pytest.param( 2, 0x1F, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x1F QT7 Green 4 LEDs"), + pytest.param( 2, 0x20, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x20 QT7 Yellow 4 LEDs"), + pytest.param( 2, 0x21, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x21 QB7 Green 4 LEDs"), + pytest.param( 2, 0x22, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x22 QB7 Yellow 4 LEDs"), + pytest.param( 2, 0x23, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x23 QT8 Green 4 LEDs"), + pytest.param( 2, 0x24, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x24 QT8 Yellow 4 LEDs"), + pytest.param( 2, 0x25, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x25 QB8 Green 4 LEDs"), + pytest.param( 2, 0x26, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x26 QB8 Yellow 4 LEDs"), + pytest.param( 2, 0x27, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x27 QT9 Green 4 LEDs"), + pytest.param( 2, 0x28, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x28 QT9 Yellow 4 LEDs"), + pytest.param( 2, 0x29, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x29 QB9 Green 4 LEDs"), + pytest.param( 2, 0x2A, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x2A QB9 Yellow 4 LEDs"), + pytest.param( 2, 0x2B, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x2B QT10 Green 4 LEDs"), + pytest.param( 2, 0x2C, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x2C QT10 Yellow 4 LEDs"), + pytest.param( 2, 0x2D, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x2D QB10 Green 4 LEDs"), + pytest.param( 2, 0x2E, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x2E QB10 Yellow 4 LEDs"), + pytest.param( 2, 0x2F, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x2F QT11 Green 4 LEDs"), + pytest.param( 2, 0x30, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x30 QT11 Yellow 4 LEDs"), + pytest.param( 2, 0x31, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x31 QB11 Green 4 LEDs"), + pytest.param( 2, 0x32, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x32 QB11 Yellow 4 LEDs"), + pytest.param( 2, 0x33, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x33 QT12 Green 4 LEDs"), + pytest.param( 2, 0x34, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x34 QT12 Yellow 4 LEDs"), + pytest.param( 2, 0x35, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x35 QB12 Green 4 LEDs"), + pytest.param( 2, 0x36, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x36 QB12 Yellow 4 LEDs"), + pytest.param( 2, 0x37, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x37 QT13 Green 4 LEDs"), + pytest.param( 2, 0x38, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x38 QT13 Yellow 4 LEDs"), + pytest.param( 2, 0x39, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x39 QB13 Green 4 LEDs"), + pytest.param( 2, 0x3A, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x3A QB13 Yellow 4 LEDs"), + pytest.param( 2, 0x3B, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x3B QT14 Green 4 LEDs"), + pytest.param( 2, 0x3C, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x3C QT14 Yellow 4 LEDs"), + pytest.param( 2, 0x3D, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x3D QB14 Green 4 LEDs"), + pytest.param( 2, 0x3E, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x3E QB14 Yellow 4 LEDs"), + pytest.param( 2, 0x3F, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x3F QT15 Green 4 LEDs"), + pytest.param( 2, 0x40, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x40 QT15 Yellow 4 LEDs"), + pytest.param( 2, 0x41, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x41 QB15 Green 4 LEDs"), + pytest.param( 2, 0x42, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x42 QB15 Yellow 4 LEDs"), + pytest.param( 2, 0x43, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x43 QT16 Green 4 LEDs"), + pytest.param( 2, 0x44, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x44 QT16 Yellow 4 LEDs"), + pytest.param( 2, 0x45, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x45 QB16 Green 4 LEDs"), + pytest.param( 2, 0x46, 0x00, 0xff, 0xff, 0xff, id="CPLD2 0x46 QB16 Yellow 4 LEDs"), + pytest.param( 2, 0xF0, 0x00, 0xff, 0x00, 0x00, id="CPLD2 0xF0 Version as BMC I2C Registers #0"), + pytest.param( 2, 0xF1, 0x48, 0xff, 0x00, 0x00, id="CPLD2 0xF1 Version as BMC I2C Registers #1"), + pytest.param( 2, 0xF2, 0x20, 0xff, 0x00, 0x00, id="CPLD2 0xF2 Version as BMC I2C Registers #2"), + pytest.param( 2, 0xF3, 0x02, 0xff, 0x00, 0x00, id="CPLD2 0xF3 Version as BMC I2C Registers #3"), + pytest.param( 2, 0xFE, 0x10, 0xff, 0x00, 0x00, id="CPLD2 0xFE CPLD JED Released Date Month"), + pytest.param( 2, 0xFF, 0x27, 0xff, 0x00, 0x00, id="CPLD2 0xFF CPLD JED Released Date Day"), + ], +) +class TestClass: + def test_cpld_read_default(self, cpld, offset, default, valid_mask, writeable_mask, test_mask): + reg_offset = "/".join([CPLD_INFO_PATH.format(cpld), "testee_offset"]) + reg_value = "/".join([CPLD_INFO_PATH.format(cpld), "testee_value"]) + + # write offset + with open(reg_offset, "r+") as file_offset: + file_offset.write(hex(offset)) + + for i in range(2): + with open(reg_value, "r+") as file_value: + content = file_value.readline().strip() + content_value = int(content, 16) + assert hex(content_value & valid_mask) == hex(default & valid_mask) + + def test_cpld_read_stable(self, cpld, offset, default, valid_mask, writeable_mask, test_mask): + reg_offset = "/".join([CPLD_INFO_PATH.format(cpld), "testee_offset"]) + reg_value = "/".join([CPLD_INFO_PATH.format(cpld), "testee_value"]) + + # write offset + with open(reg_offset, "r+") as file_offset: + file_offset.write(hex(offset)) + + # read current value + with open(reg_value, "r+") as file_value: + content = file_value.readline().strip() + last_value = int(content, 16) + + for i in range(100): + with open(reg_value, "r+") as file_value: + content = file_value.readline().strip() + content_value = int(content, 16) + assert hex(content_value) == hex(last_value) + + def test_cpld_write_stable(self, cpld, offset, default, valid_mask, writeable_mask, test_mask): + reg_offset = "/".join([CPLD_INFO_PATH.format(cpld), "testee_offset"]) + reg_value = "/".join([CPLD_INFO_PATH.format(cpld), "testee_value"]) + + # write offset + with open(reg_offset, "r+") as file_offset: + file_offset.write(hex(offset)) + + # read and save current value + with open(reg_value, "r+") as file_value: + content = file_value.readline().strip() + last_value = int(content, 16) + + for i in range(100): + for j in range(8): + if (1< 0): + return True, change_dict + + if timeout: + now_ms = time.time() * 1000 + if (now_ms - start_ms >= timeout): + return True, change_dict + + ############################################################## + ######################## SFP methods ######################### + ############################################################## + + def get_num_sfps(self): + """ + Retrieves the number of sfps available on this chassis + Returns: + An integer, the number of sfps available on this chassis + """ + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return len(self._sfp_list) + + def get_all_sfps(self): + """ + Retrieves all sfps available on this chassis + Returns: + A list of objects derived from SfpBase representing all sfps + available on this chassis + """ + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return self._sfp_list + + def get_sfp(self, index): + """ + Retrieves sfp represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 0. + For example, 0 for Ethernet0, 1 for Ethernet4 and so on. + + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + if not self.sfp_module_initialized: + self.__initialize_sfp() + + try: + # The index will start from 0 + sfp = self._sfp_list[index-1] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + ############################################## + # System LED methods + ############################################## + + def set_status_led(self, color): + """ + Sets the state of the system LED + + Args: + color: A string representing the color with which to set the + system LED + + Returns: + bool: True if system LED state is set successfully, False if not + """ + if color not in self.supported_led_color: + return False + + reg_path = "/".join([CPLD2_INFO_PATH, "sysrdy_rst_state"]) + + # Read current status + try: + with open(reg_path, "r+") as reg_file: + content_str = reg_file.readline().rstrip() + reg_value = int(content_str, 16) + color_value = self.color_to_status_led_reg[color] + new_reg_value = reg_value & 0b11111100 | color_value + reg_file.seek(0) + reg_file.write(hex(new_reg_value)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # clear S3 and S5 if status led set 'green_blink' for booting + if color == 'green_blink': + if self.get_cpld2_s5() == 1: + self.set_cpld2_s5(0) #Clear S5 status + self.set_cpld2_s5(1) #Enable to record S5 status + if self.get_cpld2_s3() == 1: + self.set_cpld2_s3(0) #Clear S3 status + + return True + + def get_status_led(self): + """ + Gets the state of the system LED + + Returns: + A string, one of the valid LED color strings which could be vendor + specified. + """ + reg_path = "/".join([CPLD2_INFO_PATH, "sysrdy_rst_state"]) + + # Read status + try: + with open(reg_path) as reg_file: + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content_value = int(content, 16) + sysled_color_reg = content_value & 0b11 + return self.status_led_reg_to_color.get(sysled_color_reg, "Unknown " + content) + + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + if self._watchdog is None: + # Initialize watchdog + try: + self._watchdog = Watchdog() + except Exception as e: + self._watchdog = None + + return self._watchdog + + def set_cpld2_s3(self, s3): + """ + Sets the bit S3 in CPLD2 sysrdy_rst_state (offset 0x03) + + Args: + s3: integer 1 or 0 + + Returns: + bool: True if the bit is set successfully, False if not + """ + reg_path = "/".join([CPLD2_INFO_PATH, "sysrdy_rst_state"]) + + # Read current status + try: + with open(reg_path, "r+") as reg_file: + content_str = reg_file.readline().rstrip() + reg_value = int(content_str, 16) + bit_value = 0b10000 if s3!=0 else 0 + new_reg_value = reg_value & 0b11101111 | bit_value + reg_file.seek(0) + reg_file.write(hex(new_reg_value)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return True + + def get_cpld2_s3(self): + """ + Gets the bit S3 in CPLD2 sysrdy_rst_state (offset 0x03) + + Returns: + integer 1 or 0. + """ + reg_path = "/".join([CPLD2_INFO_PATH, "sysrdy_rst_state"]) + + # Read status + try: + with open(reg_path) as reg_file: + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content_value = int(content, 16) + bit_value = 1 if (content_value & 0b10000) != 0 else 0 + return bit_value + + def initizalize_system_led(self): + """ + called by system_health.py. do nothing here. + """ + return True + + def get_cpld2_s5(self): + """ + Gets the bit S5 in CPLD2 sysrdy_rst_state (offset 0x03) + + Returns: + integer 1 or 0. + """ + reg_path = "/".join([CPLD2_INFO_PATH, "sysrdy_rst_state"]) + + # Read status + try: + with open(reg_path) as reg_file: + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content_value = int(content, 16) + bit_value = 1 if (content_value & 0b1000000) != 0 else 0 + return bit_value + + def set_cpld2_s5(self, s5): + """ + Sets the bit S5 in CPLD2 sysrdy_rst_state (offset 0x03) + + Args: + s5: integer 1 or 0 + + Returns: + bool: True if the bit is set successfully, False if not + """ + reg_path = "/".join([CPLD2_INFO_PATH, "sysrdy_rst_state"]) + + # Read current status + try: + with open(reg_path, "r+") as reg_file: + content_str = reg_file.readline().rstrip() + reg_value = int(content_str, 16) + bit_value = 0b100000 if s5!=0 else 0 + new_reg_value = reg_value & 0b11011111 | bit_value + reg_file.seek(0) + reg_file.write(hex(new_reg_value)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return True + + def get_bmc_reboot_cause(self): + """ + Gets the reboot cause from BMC + """ + reboot_cause = -1 + status, raw_cause = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_GET_REBOOT_CAUSE) + if status: + hx_cause_list = [] + if raw_cause == '': + return False + else: + hx_cause = int(raw_cause.split()[0], 16) + if hx_cause > 0: + self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_CLEAR_REBOOT_CAUSE) #Clear BMC reboot cause + for i in range(0, NUM_BMC_REBOOT_CAUSE): + if ((hx_cause >> i) & 1): + hx_cause_list.append(i) + #Invalid case if multiple BMC reboot causes + if len(hx_cause_list) > 1: + sys.stderr.write("{} BMC reboot causes: {}\n".format( + len(hx_cause_list), f'0b{hx_cause:08b}')) + else: + reboot_cause = hx_cause_list[0] + else: + status = False + return status, reboot_cause + + def set_cpld1_wdt_rst(self, enable): + """ + Set bit 7 in CPLD1 sysrst_rec (offset 0x09) to clean bit 4. + + Args: + enable: 1: enable record + 0: clear + + Returns: + bool: True if the bit is set successfully, False if not + """ + reg_path = "/".join([CPLD1_INFO_PATH, "sysrst_rec"]) + + # Read current status + try: + with open(reg_path, "r+") as reg_file: + content_str = reg_file.readline().rstrip() + reg_value = int(content_str, 16) + bit_value = 0x80 if enable else 0 + new_reg_value = reg_value & 0x7f | bit_value + reg_file.seek(0) + reg_file.write(hex(new_reg_value)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return True + + def get_cpld1_wdt_rst(self): + """ + Get the bit 4 in CPLD1 sysrst_rec (offset 0x09). + + Returns: + integer 1 or 0. + """ + reg_path = "/".join([CPLD1_INFO_PATH, "sysrst_rec"]) + + # Read status + try: + with open(reg_path) as reg_file: + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content_value = int(content, 16) + bit_value = 1 if (content_value & 0x10) != 0 else 0 + return bit_value + + def get_cpld1_board_rev(self): + """ + Get the bit [5:3] from CPLD1 ver_bmc_i2c (offset 0xF0:0xF3). + + Returns: + String of board version. + """ + reg_path = "/".join([CPLD1_INFO_PATH, "ver_bmc_i2c"]) + + # Read status + try: + with open(reg_path) as reg_file: + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return 'N/A' + + content_value = int(content, 16) + # bit [5:3] offset 0xF1 + board_ver = (content_value >> 19) & 0x07 + str_dir = {0b000:'1.00', 0b001:'1.01', 0b010:'1.02'} + rev_str = str_dir.get(board_ver, 'Unknown({:#05b})'.format(board_ver)) + return rev_str diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/component.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/component.py new file mode 100644 index 000000000000..ee22ce843f65 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/component.py @@ -0,0 +1,106 @@ +############################################################################# +# SuperMicro SSE-T7132S +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +try: + from sonic_platform_base.component_base import ComponentBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +COMPONENT_LIST = [ + ("BIOS", "Basic Input/Output System"), + ("BMC", "Baseboard Management Controller"), + ("SWITCH_CPLD1", "Switch board CPLD1"), + ("SWITCH_CPLD2", "Switch board CPLD2") +] +SW_CPLD1_VER_PATH = "/sys/devices/platform/switchboard/CPLD1/ver_bmc_i2c" +SW_CPLD2_VER_PATH = "/sys/devices/platform/switchboard/CPLD2/ver_bmc_i2c" +CPLD_UPGRADE_OPT = 4 +BIOS_VER_PATH = "/sys/class/dmi/id/bios_version" +BIOS__UPGRADE_OPT = 2 +BMC_VER_CMD = "ipmitool mc info | grep 'Firmware Revision'" +IPMI_BMC_VER_NETFN = "0x6" +IPMI_BMC_VER_CMD = "0x1" +BMC_VER_MAJOR_OFFSET = 2 +BMC_VER_MINOR_OFFSET = 3 +BMC_VER_AUX_OFFSET = 11 +BMC_UPGRADE_OPT = 1 +CFUFLASH_FW_UPGRADE_CMD = "CFUFLASH -cd -d {} -mse 3 {}" +MEM_PCI_RESOURCE = "/sys/bus/pci/devices/0000:09:00.0/resource0" +FPGA_VER_MEM_OFFSET = 0 + + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index): + ComponentBase.__init__(self) + self.index = component_index + self.name = self.get_name() + self._api_helper = APIHelper() + + def __get_bmc_ver(self): + bmc_ver = "Unknown" + status, raw_bmc_data = self._api_helper.ipmi_raw( + IPMI_BMC_VER_NETFN, IPMI_BMC_VER_CMD) + if status: + bmc_ver_data_list = raw_bmc_data.split() + bmc_ver = '{}.{}.{}'.format(bmc_ver_data_list[BMC_VER_MAJOR_OFFSET], + bmc_ver_data_list[BMC_VER_MINOR_OFFSET], + bmc_ver_data_list[BMC_VER_AUX_OFFSET]) + return bmc_ver + + def __get_cpld_ver(self,path): + cpld_data = self._api_helper.read_txt_file(path) + cpld_ver = cpld_data[-2:] + + return cpld_ver + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = { + "BIOS": self._api_helper.read_txt_file(BIOS_VER_PATH), + "BMC": self.__get_bmc_ver(), + "SWITCH_CPLD1": self.__get_cpld_ver(SW_CPLD1_VER_PATH), + "SWITCH_CPLD2": self.__get_cpld_ver(SW_CPLD2_VER_PATH), + }.get(self.name, "Unknown") + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + """Not Implement""" + return False diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/eeprom.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/eeprom.py new file mode 100644 index 000000000000..bd73d93ad3d9 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/eeprom.py @@ -0,0 +1,122 @@ +############################################################################# +# SuperMicro SSE-T7132S +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import os + import sys + import re + + if sys.version_info.major == 3: + from io import StringIO + else: + from cStringIO import StringIO + + from sonic_platform_base.sonic_eeprom import eeprom_dts + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' +TLV_EEPROM_I2C_BUS = 0 +TLV_EEPROM_I2C_ADDR = 53 + + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-00{1}/eeprom".format( + TLV_EEPROM_I2C_BUS, TLV_EEPROM_I2C_ADDR) + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except Exception: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + try: + self.read_eeprom_db() + except Exception as e: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if 'ok' not in status: + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except Exception: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except Exception: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") + + def get_productname(self): + return self._eeprom.get('0x21', "Undefined.") + + def get_partnumber(self): + return self._eeprom.get('0x22', "Undefined.") + diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan.py new file mode 100644 index 000000000000..12e2ab0a75e4 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan.py @@ -0,0 +1,353 @@ +############################################################################# +# SuperMicro SSE-T7132S +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +import subprocess + +try: + from sonic_platform_base.fan_base import FanBase + from .helper import APIHelper + from swsscommon.swsscommon import SonicV2Connector +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +FAN_NAME_LIST = ["FAN-1", "FAN-2", "FAN-3", "FAN-4", "FAN-5", "FAN-6"] + +IPMI_SENSOR_NETFN = "0x04" +IPMI_SS_READ_CMD = "0x2D {}" +IPMI_OEM_NETFN = "0x30" +IPMI_GET_FAN_SPEED_CMD = "0x70 0x66 0x00 {}" +IPMI_SET_FAN_SPEED_CMD = "0x70 0x66 0x01 {} {}" +IPMI_GET_FAN_LED_CMD = "0x89 0x03 0x00 {}" +IPMI_SET_FAN_LED_CMD = "0x89 0x03 0x01 {} {}" +IPMI_FAN_LED_OFF = 0x00 +IPMI_FAN_LED_GREEN = 0x01 +IPMI_FAN_LED_AMBER = 0x02 +IPMI_FAN_LED_AMBER_BLINK = 0x03 +IPMI_GET_PSU_FAN_SPEED_CMD = "0x89 0x04 0x{:02x} {}" + +MAX_OUTLET = 29500 +MAX_INLET = 25500 +#MAX_PSU_FAN_OUTLET = 11200 # not a fixed value +#MAX_PSU_FAN_INLET = 11200 # not a fixed value +SPEED_TOLERANCE = 20 # based on the speed graph the slowest is about 20% + +FAN_LIST = [ + #name sensor_id led_num + ('FAN1', '0x41', '0x04'), + ('FAN2', '0x42', '0x05'), + ('FAN3', '0x43', '0x06'), + ('FAN4', '0x44', '0x07'), + ('FAN5', '0x45', '0x08'), + ('FAN6', '0x46', '0x09'), +] + +SYSLOG_IDENTIFIER = "fan.py" +NOT_AVAILABLE = 'N/A' + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_pwn_number=0, fan_index=0, is_psu_fan=False, psu=None): + FanBase.__init__(self) + #self.logger = logger.Logger(SYSLOG_IDENTIFIER) + #self.logger.set_min_log_priority_debug() + #self.logger.log_debug('init fan_pwn_number={} fan_index={}'.format(fan_pwn_number, fan_index)) + self.fan_pwn_number = fan_pwn_number + self.is_psu_fan = is_psu_fan + if self.is_psu_fan: + self.psu = psu + self.psu_index = self.psu.index + self._api_helper = APIHelper() + self.index = fan_index + self.sensor_reading_addr = FAN_LIST[self.index][1] + self.led_number = FAN_LIST[self.index][2] + self.led_set = self.STATUS_LED_COLOR_OFF + self.speed_set = None + + def get_direction(self): + """ + Retrieves the direction of fan + + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + # read part number from eeprom + # psu fan follows the same rule + db = SonicV2Connector() + db.connect(db.STATE_DB) + eeprom_table = db.get_all(db.STATE_DB, 'EEPROM_INFO|0x22') + if "Name" in eeprom_table and eeprom_table["Name"] == "Part Number" and "Value" in eeprom_table: + part_number = eeprom_table["Value"] + else: + part_number_cmd = "sudo decode-syseeprom | grep 'Part Number' | grep -oE '[^ ]+$'" + part_number = subprocess.Popen(part_number_cmd, shell=True, text=True, stdout=subprocess.PIPE).stdout.read() + + if "T7132SR" in part_number: + # "SSE-T7132SR" + direction = self.FAN_DIRECTION_INTAKE + else: + # "SSE-T7132S" + direction = self.FAN_DIRECTION_EXHAUST + + return direction + + def get_speed_rpm(self): + """ + Retrieves the speed of fan as RPM. + + Returns: + An integer of RPM. + """ + if self.is_psu_fan: + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_GET_PSU_FAN_SPEED_CMD.format(self.psu_index + 1, "0x08")) + rpm_speed = int("".join(raw_ss_read.split()[::-1]), 16) if status else 0 + else: + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(self.sensor_reading_addr)) + # factor 140 should read from SDR + rpm_speed = int(raw_ss_read.split()[0], 16) * 140 if status else 0 + + return rpm_speed + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + rpm_speed = self.get_speed_rpm() + + if self.is_psu_fan: + # psu fan do not know max speed, so return rpm + speed = rpm_speed + if speed <= 100: + speed = 0 # to prevent be taken as percentage + else: + # when intake, the whole fan module is reversed, so still MAX_OUTLET + max = MAX_OUTLET + speed = int(float(rpm_speed)/max * 100) + + return speed + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + """ + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_GET_FAN_SPEED_CMD.format(self.fan_pwn_number)) + ss_read = raw_ss_read.split()[0] + pwn = int(ss_read, 16) + target = pwn + """ + if self.is_psu_fan: + # not support so return current speed + target = self.get_speed() + else: + # set and get result are not the same with our ipmi oem command + # This is because of the scaling between 100-based and 255-based + # here just return the cached set value for tesstbed + target = self.speed_set + if target is None: + target = self.get_speed() + return target + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return SPEED_TOLERANCE + + def set_speed(self, speed): + """ + Sets the fan speed + + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + + Returns: + A boolean, True if speed is set successfully, False if not + """ + if self.is_psu_fan: + # not support + return False + + speed_hex = hex(speed) + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_SET_FAN_SPEED_CMD.format(self.fan_pwn_number, speed_hex)) + set_speed = False if not status else True + if set_speed: + self.speed_set = speed + return set_speed + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + + Args: + color: A string representing the color with which to set the + fan module status LED + + Returns: + bool: True if status LED state is set successfully, False if not + """ + if self.is_psu_fan: + # Not support + return False + + # there are only green and red led on fan + led_color = { + self.STATUS_LED_COLOR_GREEN: IPMI_FAN_LED_GREEN, + self.STATUS_LED_COLOR_AMBER: IPMI_FAN_LED_AMBER, + self.STATUS_LED_COLOR_RED: IPMI_FAN_LED_AMBER, + self.STATUS_LED_COLOR_OFF: IPMI_FAN_LED_OFF + }.get(color) + status, set_led = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_SET_FAN_LED_CMD.format(self.led_number, led_color)) + if status: + set_status_led = True + self.led_set = color + else: + set_status_led = False + + return set_status_led + + def get_status_led(self): + """ + Gets the state of the fan status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + if self.is_psu_fan: + # Not support + return NOT_AVAILABLE + + status, hx_color = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_GET_FAN_LED_CMD.format(self.led_number)) + # there are only green and red led on fan + status_led = { + "00": self.STATUS_LED_COLOR_OFF, + "01": self.STATUS_LED_COLOR_GREEN, + "02": self.STATUS_LED_COLOR_RED, + }.get(hx_color, self.STATUS_LED_COLOR_OFF) + + # if it was set AMBER then return AMBER + if status_led == self.STATUS_LED_COLOR_RED: + if self.led_set == self.STATUS_LED_COLOR_AMBER: + status_led = self.STATUS_LED_COLOR_AMBER + + return status_led + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + if self.is_psu_fan: + fan_name = "PSU {} FAN-{}".format(self.psu_index+1, self.index+1) + else: + fan_name = FAN_NAME_LIST[self.index] + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + if self.is_psu_fan: + presence = self.psu.get_presence() + return presence + + rpm_speed = self.get_speed_rpm() + if rpm_speed == 0: + presence = False + else: + presence = True + + return presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + if self.is_psu_fan: + model = self.psu.get_model() + else: + model = "Unknown" + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + if self.is_psu_fan: + serial = self.psu.get_serial() + else: + serial = "Unknown" + + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.is_psu_fan: + # psu status dose not include psu fan status + # follow PWS-1K62A-1R HW P2 11122014.pdf defined slow fan (<1200rpm) + rpm = self.get_speed_rpm() + status = (rpm >= 1200) + return status + else: + return self.get_presence() and self.get_speed() > 0 + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return (self.index + 1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + if self.is_psu_fan: + replaceable = self.psu.is_replaceable() + return replaceable + else: + return True diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan_drawer.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..9ead756023a9 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/fan_drawer.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC Platform Base API and +# provides the the Fan-Drawers' information available in the platform +# +############################################################################# + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN = 1 + + +class FanDrawer(FanDrawerBase): + def __init__(self, fantray_index): + FanDrawerBase.__init__(self) + self._index = fantray_index + 1 + self._init_fan(fantray_index) + + def _init_fan(self, fantray_index): + from sonic_platform.fan import Fan + self.PWN_LIST = [0, 1, 0, 1, 2, 2] # TODO: will change in next HW version + for index in range(NUM_FAN): + pwn = self.PWN_LIST[fantray_index] + fan = Fan(pwn, fantray_index) + self._fan_list.append(fan) + + def set_status_led(self, color): + """ + Sets the state of the fan drawer status LED + Args: + color: A string representing the color with which to set the + fan drawer status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return self._fan_list[0].set_status_led(color) + + def get_status_led(self, color=None): + """ + Gets the state of the fan drawer LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + return self._fan_list[0].get_status_led() + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return 30.24 # by Eddie + + ############################################################## + ###################### Device methods ######################## + ############################################################## + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return "Drawer{}".format(self._index) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self._fan_list[0].get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._fan_list[0].get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self._fan_list[0].get_serial() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self._fan_list[0].get_status() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self._index + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/helper.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/helper.py new file mode 100644 index 000000000000..7acdedb5fabe --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/helper.py @@ -0,0 +1,108 @@ +import os +import struct +import subprocess +from mmap import * + +HOST_CHK_CMD = "docker > /dev/null 2>&1" +EMPTY_STRING = "" + + +class APIHelper(): + + def __init__(self): + pass + + def is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def pci_get_value(self, resource, offset): + status = True + result = "" + try: + fd = os.open(resource, os.O_RDWR) + mm = mmap(fd, 0) + mm.seek(int(offset)) + read_data_stream = mm.read(4) + result = struct.unpack('I', read_data_stream) + except Exception as e: + status = False + return status, result + + def run_command(self, cmd): + status = True + result = "" + try: + p = subprocess.Popen( + cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + except Exception as e: + status = False + return status, result + + def run_interactive_command(self, cmd): + try: + os.system(cmd) + except Exception as e: + return False + return True + + def read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def ipmi_raw(self, netfn, cmd): + status = True + result = "" + try: + cmd = ["ipmitool raw {} {}".format(str(netfn), str(cmd))] + p = subprocess.Popen( + cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception as e: + status = False + return status, result + + def ipmi_fru_id(self, id, key=None): + status = True + result = "" + try: + cmd = ["ipmitool fru print {}".format(str( + id))] if not key else ["ipmitool fru print {0} | grep '{1}' ".format(str(id), str(key))] + + p = subprocess.Popen( + cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception as e: + status = False + return status, result + + def ipmi_set_ss_thres(self, id, threshold_key, value): + status = True + result = "" + try: + cmd = ["ipmitool sensor thresh '{}' {} {}".format(str(id), str(threshold_key), str(value))] + p = subprocess.Popen( + cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception as e: + status = False + return status, result diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/pcie.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/pcie.py new file mode 100644 index 000000000000..6901f62ea856 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/pcie.py @@ -0,0 +1,18 @@ +############################################################################# +# SuperMicro SSE-T7132S +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PCIe information which are available in the platform +# +############################################################################# + +try: + from sonic_platform_base.sonic_pcie.pcie_common import PcieUtil +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Pcie(PcieUtil): + """ T7132S Platform-specific PCIe class """ + """ fallback to pcie_common.PcieUtil to avoid pcieutil warning message """ + diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/platform.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/platform.py new file mode 100644 index 000000000000..7d5424dc9419 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/platform.py @@ -0,0 +1,21 @@ +############################################################################# +# SuperMicro SSE-T7132S +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/psu.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/psu.py new file mode 100644 index 000000000000..1a77b75f7415 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/psu.py @@ -0,0 +1,545 @@ +############################################################################# +# SuperMicro SSE-T7132S +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import re + +try: + from sonic_platform_base.psu_base import PsuBase + from .helper import APIHelper + from sonic_platform.fan import Fan + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_NAME_LIST = ["PSU_1", "PSU_2"] +PSU_NUM_FAN = [1, 1] +PSU_NUM_TERMAL = [2, 2] + +IPMI_SENSOR_NETFN = "0x04" +IPMI_OEM_NETFN = "0x30" +IPMI_SS_READ_CMD = "0x2D {}" +IPMI_OEM_CMD = "0x89 {}" +IPMI_PSU_TYPE_CMD = "0x1 {}" +IPMI_GET_PSU_LED_MODE_CMD = "0x2 0x1" +IPMI_SET_PSU_LED_MODE_CMD = "0x2 0x2 {}" +IPMI_GET_PSU_LED_PATTERN_CMD = "0x3 0x0 {}" +IPMI_SET_PSU_LED_PATTERN_CMD = "0x3 0x1 {} {}" +IPMI_PSU_INFO_CMD= "0x4 {} {}" + +PSU_LED_OFF_CMD = "0x00" +PSU_LED_GREEN_CMD = "0x01" +PSU_LED_AMBER_CMD = "0x02" + +PSU_SERIAL_CMD = "0x00" +PSU_MODEL_CMD = "0x01" +PSU_VOUT_CMD = "0x02" +PSU_COUT_CMD = "0x03" +PSU_POUT_CMD = "0x04" +PSU_VIN_CMD = "0x05" +PSU_CIN_CMD = "0x06" +PSU_PIN_CMD = "0x07" +PSU_FAN1_CMD = "0x08" +PSU_FAN2_CMD = "0x09" +PSU_TEMP1_CMD = "0x0A" +PSU_TEMP2_CMD = "0x0B" +PSU_MAX_TEMP1_CMD = "0x0C" +PSU_MAX_TEMP2_CMD = "0x0D" +PSU_MAX_POUT_CMD = "0x0E" + +PSU1_STATUS_REG = "0xC4" +PSU2_STATUS_REG = "0xC5" + +PSU1_FRU_ID = 3 + +PSU_OUT_VOLTAGE = 12 + +SS_READ_OFFSET = 0 +OEM_READ_OFFSET = 0 + + +class Psu(PsuBase): + """Platform-specific Psu class""" + + def __init__(self, psu_index): + PsuBase.__init__(self) + self.index = psu_index + for fan_index in range(0, PSU_NUM_FAN[self.index]): + fan = Fan(0, fan_index, is_psu_fan=True, psu=self) + self._fan_list.append(fan) + for thermal_index in range(0, PSU_NUM_TERMAL[self.index]): + self._thermal_list.append(PsuThermal(self, thermal_index)) + self._api_helper = APIHelper() + + def find_value(self, in_string): + result = re.search("^.+ ([0-9a-f]{2}) .+$", in_string) + return result.group(1) if result else result + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + psu_voltage = 0.0 + psu_vout_key = IPMI_PSU_INFO_CMD.format(self.index+1, PSU_VOUT_CMD) + status, raw_oem_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_vout_key)) + + if raw_oem_read: + # Formula: R/10 + psu_voltage = int("".join(raw_oem_read.split()[::-1]), 16) / 10 + + return psu_voltage + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + # Formula: PSU_OUT_VOLTAGEx11/10 + psu_voltage = PSU_OUT_VOLTAGE * 11 / 10 + + return psu_voltage + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + # Formula: PSU_OUT_VOLTAGEx9/10 + psu_voltage = PSU_OUT_VOLTAGE * 9 / 10 + + return psu_voltage + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + psu_current = 0.0 + psu_cout_key = IPMI_PSU_INFO_CMD.format(self.index+1, PSU_COUT_CMD) + status, raw_oem_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_cout_key)) + + if raw_oem_read: + # Formula: R/1000 + psu_current = int("".join(raw_oem_read.split()[::-1]), 16) / 1000 + + return psu_current + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + psu_power = 0.0 + psu_pout_key = IPMI_PSU_INFO_CMD.format(self.index+1, PSU_POUT_CMD) + status, raw_oem_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_pout_key)) + + if raw_oem_read: + # Formula: R + psu_power = int("".join(raw_oem_read.split()[::-1]), 16) + return psu_power + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + psu_power = 0.0 + psu_pout_key = IPMI_PSU_INFO_CMD.format(self.index+1, PSU_MAX_POUT_CMD) + status, raw_oem_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_pout_key)) + + if raw_oem_read: + # Formula: R + psu_power = int("".join(raw_oem_read.split()[::-1]), 16) + return psu_power + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + Note + """ + led_cmd = { + self.STATUS_LED_COLOR_GREEN: PSU_LED_GREEN_CMD, + "orange": PSU_LED_AMBER_CMD, + self.STATUS_LED_COLOR_OFF: PSU_LED_OFF_CMD + }.get(color) + + psu_led_key = IPMI_SET_PSU_LED_PATTERN_CMD.format(self.index+2,led_cmd) + status, set_led = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_led_key)) + set_status_led = False if not status else True + + return set_status_led + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + psu_led_key = IPMI_GET_PSU_LED_PATTERN_CMD.format(self.index+2) + status, hx_color = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_led_key)) + + status_led = { + "00": self.STATUS_LED_COLOR_OFF, + "01": self.STATUS_LED_COLOR_GREEN, + "02": "orange", + }.get(hx_color, self.STATUS_LED_COLOR_OFF) + + return status_led + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + there are three temp sensors , we choose one of them + """ + # Need implement after BMC function ready + psu_temperature = None + + return psu_temperature + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + there are three temp sensors , we choose one of them + """ + # Need implement after BMC function ready + psu_temperature = None + + return psu_temperature + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + psu_presence = False + psu_pstatus_key = globals()['PSU{}_STATUS_REG'.format(self.index+1)] + status, raw_status_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_pstatus_key)) + status_byte = self.find_value(raw_status_read) + + if status: + presence_int = (int(status_byte, 16) >> 0) & 1 + psu_presence = True if presence_int else False + + return psu_presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + model = "Unknown" + psu_model_key = IPMI_PSU_INFO_CMD.format(self.index+1, PSU_MODEL_CMD) + status, raw_model = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_model_key)) + + model_raw_list = raw_model.split() + if len(model_raw_list) > 0: + model="".join(map(chr,map(lambda x: int(x, 16), model_raw_list))) + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial = "Unknown" + psu_serial_key = IPMI_PSU_INFO_CMD.format(self.index+1, PSU_SERIAL_CMD) + status, raw_serial = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_serial_key)) + + serial_raw_list = raw_serial.split() + if len(serial_raw_list) > 0: + serial="".join(map(chr,map(lambda x: int(x, 16), serial_raw_list))) + + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + psu_status = False + psu_pstatus_key = globals()['PSU{}_STATUS_REG'.format(self.index+1)] + status, raw_status_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_pstatus_key)) + status_byte = self.find_value(raw_status_read) + + if status: + failure_detected = (int(status_byte, 16) >> 1) & 1 + input_lost = (int(status_byte, 16) >> 3) & 1 + psu_status = False if (input_lost or failure_detected) else True + + return psu_status + + def get_type(self): + """ + Retrives the Power Type of PSU + + Returns : + A string, PSU power type + """ + psu_type = [None, 'AC', 'AC', 'DC'] + psu_type_key = IPMI_PSU_TYPE_CMD.format(self.index+1) + status, raw_type_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_type_key)) + if status: + raw_type = raw_type_read.split()[OEM_READ_OFFSET] + type_index = int(raw_type, 16) + if type_index < 4: + return psu_type[type_index] + return None + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this PSU is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + + def get_num_thermals(self): + """ + Retrieves the number of thermals available on this PSU + + Returns: + An integer, the number of thermals available on this PSU + """ + return len(self._thermal_list) + + def get_all_thermals(self): + """ + Retrieves all thermals available on this PSU + + Returns: + A list of objects derived from ThermalBase representing all thermals + available on this PSU + """ + return self._thermal_list + + def get_thermal(self, index): + """ + Retrieves thermal unit represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the thermal to + retrieve + + Returns: + An object derived from ThermalBase representing the specified thermal + """ + thermal = None + + try: + thermal = self._thermal_list[index] + except IndexError: + sys.stderr.write("THERMAL index {} out of range (0-{})\n".format( + index, len(self._thermal_list)-1)) + + return thermal + +class PsuThermal(ThermalBase): + """Platform-specific Thermal class for PSU """ + + def __init__(self, psu, index): + self._api_helper = APIHelper() + self.psu = psu + self.index = index + self.minimum_thermal = 999 + self.maximum_thermal = 0 + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + if self.psu.get_presence() != True: + return None + + psu_temperature = 0.0 + psu_temp_cmd_key = globals()['PSU_TEMP{}_CMD'.format(self.index+1)] + psu_temp_key = IPMI_PSU_INFO_CMD.format(self.psu.index+1, psu_temp_cmd_key) + status, raw_oem_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_temp_key)) + + if raw_oem_read: + # Formula: R + psu_temperature = int("".join(raw_oem_read.split()[::-1]), 16) + + if psu_temperature > self.maximum_thermal: + self.maximum_thermal = psu_temperature + if psu_temperature < self.minimum_thermal: + self.minimum_thermal = psu_temperature + + return psu_temperature + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + # ignore max_temp 1 to aviod false alarm because PSU fan control is not ready + if self.index == 0: + return None + + if self.get_presence() != True: + return None + + psu_temper_high = 0.0 + psu_temp_cmd_key = globals()['PSU_MAX_TEMP{}_CMD'.format(self.index+1)] + psu_temp_key = IPMI_PSU_INFO_CMD.format(self.psu.index+1, psu_temp_cmd_key) + status, raw_oem_read = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_OEM_CMD.format(psu_temp_key)) + + if raw_oem_read: + # Formula: R + psu_temper_high = int("".join(raw_oem_read.split()[::-1]), 16) + + return psu_temper_high + + def get_minimum_recorded(self): + """ + Retrieves the minimum recorded temperature of thermal + + Returns: + A float number, the minimum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return self.minimum_thermal; + + def get_maximum_recorded(self): + """ + Retrieves the maximum recorded temperature of thermal + + Returns: + A float number, the maximum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return self.maximum_thermal + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return '{}_TEMP_{}'.format(self.psu.get_name(), self.index+1) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self.psu.get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self.psu.get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self.psu.get_serial() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.psu.get_status() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return (self.index + 1) + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/sfp.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/sfp.py new file mode 100644 index 000000000000..3bb0d7fdda33 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/sfp.py @@ -0,0 +1,444 @@ +#!/usr/bin/env python +""" +############################################################################# +# SuperMicro SSE-T7132S +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp status which are available in the platform +# +############################################################################# +""" + +try: + import os + import time + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + +except ImportError as err: + raise ImportError(str(err) + "- required module not found") + +QSFP_INFO_OFFSET = 128 +SFP_INFO_OFFSET = 0 +QSFP_DD_PAGE0 = 0 + +SFP_TYPE_LIST = [ + '0x3' # SFP/SFP+/SFP28 and later +] +QSFP_TYPE_LIST = [ + '0x0c', # QSFP + '0x0d', # QSFP+ or later + '0x11' # QSFP28 or later +] +QSFP_DD_TYPE_LIST = [ + '0x18' #QSFP_DD Type +] + +OSFP_TYPE_LIST = [ + '0x19' # OSFP 8X Type +] + +SFP_TYPE = "SFP" +QSFP_TYPE = "QSFP" +OSFP_TYPE = "OSFP" +QSFP_DD_TYPE = "QSFP_DD" +SFP_NAME = "Ethernet{}" + +PORT_START = 0 +PORT_END = 34 +QSFP_PORT_START = 0 +QSFP_PORT_END = 32 + +I2C_EEPROM_PATH = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' +PORT_INFO_PATH= '/sys/class/t7132s_cpld' + +class Sfp(SfpOptoeBase): + """Platform-specific Sfp class""" + PLATFORM = "x86_64-supermicro_sse_t7132s-r0" + HWSKU = "Supermicro_sse_t7132s" + + _port_to_offset = [11, 30, 12, 29, 13, 28, 14, 27, 15, 34, + 16, 33, 17, 32, 18, 31, 19, 38, 20, 37, + 21, 36, 22, 35, 23, 42, 24, 41, 25, 40, + 26, 39, + 43, 44] + + def __init__(self, sfp_index=0): + SfpOptoeBase.__init__(self) + + self.index = sfp_index # for sfputil show error-status --fetch-from-hardware + self._master_port = self.index - 1 + self._port_num = self.index + self.sfp_type = QSFP_DD_TYPE + #port_type is the native port type and sfp_type is the transceiver type + #sfp_type will be detected in get_transceiver_info + if self._master_port < QSFP_PORT_END: + self.port_type = QSFP_DD_TYPE + self.NUM_CHANNELS = 8 + self.port_name = "QSFP" + str(self._port_num) + self._name = [SFP_NAME.format(str(self._master_port*8))] + else: + self.port_type = SFP_TYPE + self.NUM_CHANNELS = 1 + self.port_name = "SFP" + str(self._port_num - QSFP_PORT_END) + self._name = [SFP_NAME.format(str((QSFP_PORT_END*8)+(self._master_port - QSFP_PORT_END)))] + self.sfp_type = self.port_type + self.sfp_eeprom_path = self.get_eeprom_path() + self._initialize_media(delay=False) + + def _detect_sfp_type(self): + eeprom_raw = [] + eeprom_ready = True + + time_begin = time.time() + eeprom_ready = False + while (time.time() - time_begin) < 4: + # read 2 more bytes to check eeprom ready + eeprom_raw = self.read_eeprom(XCVR_TYPE_OFFSET, XCVR_TYPE_WIDTH + 2) + + if eeprom_raw: + if eeprom_raw[0] in SFP_TYPE_CODE_LIST: + self.sfp_type = SFP_TYPE + eeprom_ready = True + elif eeprom_raw[0] in QSFP_TYPE_CODE_LIST: + self.sfp_type = QSFP_TYPE + eeprom_ready = True + elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: + self.sfp_type = QSFP_DD_TYPE + eeprom_ready = True + else: + self.sfp_type = self.port_type + if all([b == '00' for b in eeprom_raw]): + logger.Logger('SFP').log_warning( + "_detect_sfp_type: {} index {} by {} eeprom all 0". + format(self._name, self.index, + inspect.currentframe().f_back.f_code.co_name)) + else: + eeprom_ready = True + else: + logger.Logger('SFP').log_warning( + "_detect_sfp_type: {} index {} by {} eeprom none". + format(self._name, self.index, + inspect.currentframe().f_back.f_code.co_name)) + self.sfp_type = self.port_type + + if not eeprom_ready: + # retry after sleep + time.sleep(1) + else: + break; + + if self.sfp_type == QSFP_DD_TYPE: + self.NUM_CHANNELS = 8 + elif self.sfp_type == QSFP_TYPE: + self.NUM_CHANNELS = 4 + elif self.sfp_type == SFP_TYPE: + self.NUM_CHANNELS = 1 + + return eeprom_ready + + def get_eeprom_path(self): + """ + Returns SFP eeprom path + """ + port_eeprom_path = I2C_EEPROM_PATH.format(self._port_to_offset[self._master_port]) + return port_eeprom_path + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self._name[0] + + def _initialize_media(self, delay=False): + """ + Initialize the media type and eeprom driver for SFP + """ + if delay: + time.sleep(1) + self._xcvr_api = None + self.get_xcvr_api() + + self.set_media_type() + self.reinit_sfp_driver() + + def get_presence(self): + """ + Retrieves the presence of the SFP + Returns: + bool: True if SFP is present, False if not + """ + sysfs_filename = "sfp_modabs" if self.port_type == SFP_TYPE else "qsfp_modprs" + reg_path = "/".join([PORT_INFO_PATH, self.port_name, sysfs_filename]) + + # Read status + try: + with open(reg_path) as reg_file: + content = reg_file.readline().rstrip() + reg_value = int(content) + # Module present is active low + if reg_value == 0: + return True + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # not present + return False + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + if self.port_type != QSFP_DD_TYPE: + return False + + try: + with open( + "/".join([PORT_INFO_PATH, self.port_name, "qsfp_reset"])) as reg_file: + # Read status + content = reg_file.readline().rstrip() + reg_value = int(content) + # reset is active low + if reg_value == 0: + return True + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return False + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + if self.port_type != QSFP_DD_TYPE: + return False + + try: + with open( + "/".join([PORT_INFO_PATH, self.port_name, "qsfp_lpmode"])) as reg_file: + # Read status + content = reg_file.readline().rstrip() + reg_value = int(content) + # low power mode is active high + if reg_value == 0: + return False + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return True + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + if self.port_type != QSFP_DD_TYPE: + return False + + try: + with open( + "/".join([PORT_INFO_PATH, self.port_name, "qsfp_reset"]), "w") as reg_file: + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(0)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + with open( + "/".join([PORT_INFO_PATH, self.port_name, "qsfp_reset"]), "w") as reg_file: + reg_file.seek(0) + reg_file.write(hex(1)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return True + + def no_reset(self): + """ + Set CPLD qsfp_reset to 1 for non-reset status. + Returns: + A boolean, True if successful, False if not + """ + if self.port_type != QSFP_DD_TYPE: + return False + + try: + with open( + "/".join([PORT_INFO_PATH, self.port_name, "qsfp_reset"]), "w") as reg_file: + reg_file.seek(0) + reg_file.write(hex(1)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return True + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + if not self._detect_sfp_type(): + return False + + if self.port_type != QSFP_DD_TYPE: + return False + + try: + reg_file = open( + "/".join([PORT_INFO_PATH, self.port_name, "qsfp_lpmode"]), "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = hex(lpmode) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def set_media_type(self): + """ + Reads optic eeprom byte to determine media type inserted + """ + eeprom_raw = [] + eeprom_raw = self._xcvr_api_factory._get_id() + if eeprom_raw is not None: + eeprom_raw = hex(eeprom_raw) + if eeprom_raw in SFP_TYPE_LIST: + self.sfp_type = SFP_TYPE + elif eeprom_raw in QSFP_TYPE_LIST: + self.sfp_type = QSFP_TYPE + elif eeprom_raw in QSFP_DD_TYPE_LIST: + self.sfp_type = QSFP_DD_TYPE + else: + #Set native port type if EEPROM type is not recognized/readable + self.sfp_type = self.port_type + else: + self.sfp_type = self.port_type + + return self.sfp_type + + def reinit_sfp_driver(self): + """ + Changes the driver based on media type detected + """ + + i2c_bus = self.sfp_eeprom_path[25:].split('/')[0] + del_sfp_path = "/sys/bus/i2c/devices/i2c-{0}/delete_device".format(i2c_bus) + new_sfp_path = "/sys/bus/i2c/devices/i2c-{0}/new_device".format(i2c_bus) + driver_path = "/sys/bus/i2c/devices/i2c-{0}/{0}-0050/name".format(i2c_bus) + + if not os.path.isfile(driver_path): + print(driver_path, "does not exist") + return False + + try: + with os.fdopen(os.open(driver_path, os.O_RDONLY)) as filed: + driver_name = filed.read() + driver_name = driver_name.rstrip('\r\n') + driver_name = driver_name.lstrip(" ") + + #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. + if self.sfp_type == SFP_TYPE and driver_name in ['optoe1', 'optoe3']: + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') + time.sleep(0.2) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') + time.sleep(2) + elif self.sfp_type == OSFP_TYPE and driver_name in ['optoe2', 'optoe3']: + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') + time.sleep(0.2) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') + time.sleep(2) + elif self.sfp_type == QSFP_DD_TYPE and driver_name in ['optoe1', 'optoe2']: + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') + time.sleep(0.2) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') + time.sleep(2) + + except IOError as err: + print("Error: Unable to open file: %s" %str(err)) + return False + + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return 0 + + @staticmethod + def is_replaceable(): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + else: + if not os.path.isfile(self.sfp_eeprom_path): + return "EEPROM driver is not attached" + + if self.sfp_type == SFP_TYPE: + offset = SFP_INFO_OFFSET + elif self.sfp_type == OSFP_TYPE: + offset = QSFP_INFO_OFFSET + elif self.sfp_type == QSFP_TYPE: + offset = QSFP_INFO_OFFSET + elif self.sfp_type == QSFP_DD_TYPE: + offset = QSFP_DD_PAGE0 + else: + return "Invalid SFP type {}".format(self.sfp_type) + + try: + with open(self.sfp_eeprom_path, mode="rb", buffering=0) as eeprom: + eeprom.seek(offset) + eeprom.read(1) + except OSError as e: + return "EEPROM read failed ({})".format(e.strerror) + + return self.SFP_STATUS_OK \ No newline at end of file diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/thermal.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/thermal.py new file mode 100644 index 000000000000..38e3b5b7dc84 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/thermal.py @@ -0,0 +1,253 @@ +############################################################################# +# SuperMicro SSE-T7132S +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +try: + from sonic_platform_base.thermal_base import ThermalBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +IPMI_SENSOR_NETFN = "0x04" +IPMI_SS_READ_CMD = "0x2D {}" +IPMI_SS_THRESHOLD_CMD = "0x27 {}" +HIGH_TRESHOLD_SET_KEY = "ucr" +LOW_TRESHOLD_SET_KEY = "lcr" +HIGH_CRIT_TRESHOLD_SET_KEY = "unr" +LOW_CRIT_TRESHOLD_SET_KEY = "lnr" + + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + def __init__(self, thermal_index): + ThermalBase.__init__(self) + self._api_helper = APIHelper() + self.index = thermal_index + self.THERMAL_LIST = [ + ('CPU_Temp', 'CPU Temperature Sensor', '0x01'), + ('PCH_Temp', 'PCH Temperature Sensor', '0x0a'), + ('System_Temp', 'System Temperature Sensor', '0x0b'), + ('Peripheral_Temp', 'Peripheral Temperature Sensor', '0x0c'), + ('Switch_Top-1', 'Switchboard Left Inlet Temperature Sensor', '0xb4'), + ('Switch_Buttom-1', 'Switchboard Left Outlet Temperature Sensor', '0xb5'), + ('Switch_Top-2', 'Switchboard Right Inlet Temperature Sensor', '0xb6'), + ('Switch_Buttom-2', 'Switchboard Right Outlet Temperature Sensor','0xb7'), + ('Switch_Temp', 'Switch Temperature Sensor', '0xb8'), + ] + self.sensor_id = self.THERMAL_LIST[self.index][0] + self.sensor_des = self.THERMAL_LIST[self.index][1] + self.sensor_reading_addr = self.THERMAL_LIST[self.index][2] + self.minimum_thermal = self.get_temperature() + self.maximum_thermal = self.get_temperature() + + def __set_threshold(self, key, value): + print('{} {}'.format(key, value)) + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + temperature = 0.0 + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(self.sensor_reading_addr)) + if status and len(raw_ss_read.split()) > 0: + ss_read = raw_ss_read.split()[0] + temperature = float(int(ss_read, 16)) + return temperature + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + high_threshold = 0.0 + status, raw_up_thres_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_THRESHOLD_CMD.format(self.sensor_reading_addr)) + if status and len(raw_up_thres_read.split()) > 6: + ss_read = raw_up_thres_read.split()[5] + high_threshold = float(int(ss_read, 16)) + return high_threshold + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + low_threshold = 0.0 + status, raw_up_thres_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_THRESHOLD_CMD.format(self.sensor_reading_addr)) + if status and len(raw_up_thres_read.split()) > 6: + ss_read = raw_up_thres_read.split()[2] + low_threshold = float(int(ss_read, 16)) + return low_threshold + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if not + """ + status, ret_txt = self._api_helper.ipmi_set_ss_thres(self.sensor_id, HIGH_TRESHOLD_SET_KEY, temperature) + return status + + def set_low_threshold(self, temperature): + """ + Sets the low threshold temperature of thermal + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if not + """ + status, ret_txt = self._api_helper.ipmi_set_ss_thres(self.sensor_id, LOW_TRESHOLD_SET_KEY, temperature) + return status + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + Returns: + A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + high_critical_threshold = 0.0 + status, raw_up_thres_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_THRESHOLD_CMD.format(self.sensor_reading_addr)) + if status and len(raw_up_thres_read.split()) > 6: + ss_read = raw_up_thres_read.split()[6] + high_critical_threshold = float(int(ss_read, 16)) + return high_critical_threshold + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + critical_low_threshold = 0.0 + status, raw_up_thres_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_THRESHOLD_CMD.format(self.sensor_reading_addr)) + if status and len(raw_up_thres_read.split()) > 6: + ss_read = raw_up_thres_read.split()[3] + critical_low_threshold = float(int(ss_read, 16)) + return critical_low_threshold + + def set_high_critical_threshold(self, temperature): + """ + Sets the critical high threshold temperature of thermal + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if not + """ + status, ret_txt = self._api_helper.ipmi_set_ss_thres(self.sensor_id, HIGH_CRIT_TRESHOLD_SET_KEY, temperature) + return status + + def set_low_critical_threshold(self, temperature): + """ + Sets the critical low threshold temperature of thermal + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if not + """ + status, ret_txt = self._api_helper.ipmi_set_ss_thres(self.sensor_id, LOW_CRIT_TRESHOLD_SET_KEY, temperature) + return status + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return self.THERMAL_LIST[self.index][0] + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return True if self.get_temperature() > 0 else False + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self.sensor_des + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "Unknown" + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return (self.index + 1) + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_minimum_recorded(self): + """ + Retrieves the minimum recorded temperature of thermal + Returns: + A float number, the minimum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp < self.minimum_thermal: + self.minimum_thermal = tmp + return self.minimum_thermal + + def get_maximum_recorded(self): + """ + Retrieves the maximum recorded temperature of thermal + Returns: + A float number, the maximum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp > self.maximum_thermal: + self.maximum_thermal = tmp + return self.maximum_thermal diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/watchdog.py b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/watchdog.py new file mode 100644 index 000000000000..35c55945deeb --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/sonic_platform/watchdog.py @@ -0,0 +1,317 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Watchdog information +# +############################################################################# + +import os + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +""" ioctl constants """ +IO_WRITE = 0x40000000 +IO_READ = 0x80000000 +IO_READ_WRITE = 0xC0000000 +IO_SIZE_INT = 0x00040000 +IO_SIZE_40 = 0x00280000 +IO_TYPE_WATCHDOG = ord('W') << 8 + +WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG +WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG +WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG + +""" Watchdog ioctl commands """ +WDIOC_GETSUPPORT = 0 | WDR_40 +WDIOC_GETSTATUS = 1 | WDR_INT +WDIOC_GETBOOTSTATUS = 2 | WDR_INT +WDIOC_GETTEMP = 3 | WDR_INT +WDIOC_SETOPTIONS = 4 | WDR_INT +WDIOC_KEEPALIVE = 5 | WDR_INT +WDIOC_SETTIMEOUT = 6 | WDWR_INT +WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT +WDIOC_GETTIMELEFT = 10 | WDR_INT + +""" Watchdog status constants """ +WDIOS_DISABLECARD = 0x0001 +WDIOS_ENABLECARD = 0x0002 + +WDT_COMMON_ERROR = -1 +#WD_MAIN_IDENTITY = "iTCO_wdt" +WD_MAIN_IDENTITY = "t7132s_wdt" +WDT_SYSFS_PATH = "/sys/class/watchdog/" +DEV_STATE_PATH = "/sys/devices/platform/switchboard/CPLD1/dev_state" +WDT_MAX_PATH = "/sys/devices/platform/switchboard/CPLD1/wdt_max" +WDT_COUNT_PATH = "/sys/devices/platform/switchboard/CPLD1/wdt_count" + + +class Watchdog(WatchdogBase): + + def __init__(self): + self.watchdog = None + self.wdt_main_dev_name = None + self.armed = self.is_armed() + self.timeout = self._gettimeout() + + def _is_wd_main(self, dev): + """ + Checks watchdog identity + """ + identity = self._read_file( + "{}/{}/identity".format(WDT_SYSFS_PATH, dev)) + return identity == WD_MAIN_IDENTITY + + def _get_wdt(self): + """ + Retrieves watchdog device + """ + if self.watchdog is not None: + return + + wdt_main_dev_list = [dev for dev in os.listdir( + "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] + if not wdt_main_dev_list: + self.wdt_main_dev_name = None + return + self.wdt_main_dev_name = wdt_main_dev_list[0] + + watchdog_device_path = "/dev/{}".format(self.wdt_main_dev_name) + try: + self.watchdog = os.open(watchdog_device_path, os.O_RDWR) + except (FileNotFoundError, IOError, OSError): + self.watchdog = None + self.wdt_main_dev_name = None + except SystemExit: + pass + + return + + def _put_wdt(self): + """ + Release watchdog device + """ + if self.watchdog is not None: + os.close(self.watchdog) + self.watchdog = None + self.wdt_main_dev_name = None + + def _read_file(self, file_path): + """ + Read text file + """ + try: + with open(file_path, "r") as fd: + txt = fd.read() + except IOError: + return WDT_COMMON_ERROR + return txt.strip() + + def _enable(self): + """ + Turn on the watchdog timer + """ + try: + with open(DEV_STATE_PATH, "r+") as reg_file: + content = reg_file.readline().strip() + reg_value = int(content, 16) + bit_enable = 0x100 + reg_value_new = reg_value | bit_enable + reg_file.write(hex(reg_value_new)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + + def _disable(self): + """ + Turn off the watchdog timer + """ + try: + with open(DEV_STATE_PATH, "r+") as reg_file: + content = reg_file.readline().strip() + reg_value = int(content, 16) + bit_enable = 0x100 + reg_value_new = reg_value & ~bit_enable + reg_file.write(hex(reg_value_new)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + self._disable() + self._enable() + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + if seconds > 65535: + seconds = 65535 + + try: + with open(WDT_MAX_PATH, "r+") as reg_file: + reg_value = seconds + reg_file.write(hex(reg_value)) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + + return seconds + + def _gettimeout(self): + """ + Get watchdog timeout + @return watchdog timeout + """ + seconds = 0 + try: + with open(WDT_MAX_PATH, "r+") as reg_file: + content = reg_file.readline().strip() + reg_value = int(content, 16) + seconds = reg_value + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + + return seconds + + def _gettimeleft(self): + """ + Get time left before watchdog timer expires + @return time left in seconds + """ + try: + with open(WDT_MAX_PATH, "r+") as reg_file: + content = reg_file.readline().strip() + reg_value = int(content, 16) + state_seconds = reg_value + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + + try: + with open(WDT_COUNT_PATH, "r+") as reg_file: + content = reg_file.readline().strip() + reg_value = int(content, 16) + count_seconds = reg_value + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + + timeleft = state_seconds - count_seconds + if timeleft < 0: + timeleft = 0 + print("Error: incorrect counter: state={} count={}". + format(state_seconds, count_seconds)) + elif timeleft > 65535: + timeleft = 65535 + print("Error: incorrect counter: state={} count={}". + format(state_seconds, count_seconds)) + + return timeleft + + ################################################################# + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* available + value. + Returns: + An integer specifying the *actual* number of seconds the watchdog + was armed with. On failure returns -1. + """ + ret = WDT_COMMON_ERROR + if seconds < 0: + return ret + if seconds > 65535: + return ret + + try: + self._disable() + if self._gettimeout() != seconds: + self.timeout = self._settimeout(seconds) + self._enable() + self.armed = True + ret = self.timeout + except IOError as e: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + """ + We always get the HW status because all new instance have + it's own self.armed. And only the instance had called arm() + has self.armed = True if self.armed is a class variable. + """ + # Read status + try: + with open(DEV_STATE_PATH) as reg_file: + content = reg_file.readline().rstrip() + reg_value = int(content, 16) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + bit_enable = 0x100 + if reg_value & bit_enable: + return True + + return False + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds remaining on + the watchdog timer + Returns: + An integer specifying the number of seconds remaining on thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + timeleft = WDT_COMMON_ERROR + + if self.is_armed(): + try: + timeleft = self._gettimeleft() + except IOError: + pass + + return timeleft + + def __del__(self): + """ + Close watchdog + """ + if self.watchdog is not None: + os.close(self.watchdog) diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/platform-modules-sse-t7132s.service b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/platform-modules-sse-t7132s.service new file mode 100644 index 000000000000..71d2b0d98c9f --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/platform-modules-sse-t7132s.service @@ -0,0 +1,14 @@ +[Unit] +Description=SuperMicro SSE-T7132S Platform modules +Before=pmon.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform.sh init +ExecStop=/usr/local/bin/platform.sh deinit +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + diff --git a/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/sysled.service b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/sysled.service new file mode 100644 index 000000000000..cde02505d47e --- /dev/null +++ b/platform/innovium/sonic-platform-modules-supermicro/sse-t7132s/systemd/sysled.service @@ -0,0 +1,15 @@ +[Unit] +Description=Set system LED before reboot/poweroff/halt +DefaultDependencies=no +#Conflicts=reboot.target +Before=poweroff.target halt.target reboot.target kexec.target shutdown.target +#Requires=poweroff.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/sysledctl.py start +#ExecStop=/usr/local/bin/sysledctl.py stop +RemainAfterExit=yes + +[Install] +WantedBy=poweroff.target halt.target shutdown.target reboot.target kexec.target From 57b2ab4bc31f27a37ad58e97acfab715d7af4b74 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 20 Jul 2023 13:12:35 -0700 Subject: [PATCH 046/145] [YANG] add yang model for `MUX_LINKMGR|MUXLOGGER` (#15884) Add yang model for MUX_LINKMGR|MUXLOGGER. --- src/sonic-yang-models/doc/Configuration.md | 3 +++ .../tests/files/sample_config_db.json | 3 +++ .../tests/yang_model_tests/tests/mux-linkmgr.json | 3 +++ .../tests_config/mux-linkmgr.json | 10 ++++++++++ .../yang-models/sonic-mux-linkmgr.yang | 15 +++++++++++++++ 5 files changed, 34 insertions(+) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 44b9f5aa9425..9a7e7beba987 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -1439,6 +1439,9 @@ The **MUX_LINKMGR** table is used for dualtor device configuration. "use_well_known_mac": "enabled", "src_mac": "ToRMac", "interval_pck_loss_count_update": "3" + }, + "MUXLOGGER": { + "log_verbosity": "debug" } } } diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 742c68848f42..8ee6430cd163 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -2153,6 +2153,9 @@ "use_well_known_mac": "enabled", "src_mac": "ToRMac", "interval_pck_loss_count_update": "3" + }, + "MUXLOGGER": { + "log_verbosity": "debug" } }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json b/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json index 3f399eec76cc..6358ec5e6ee3 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json @@ -4,5 +4,8 @@ }, "MUX_LINKMGR_LINK_PROBER_CHANGE_MAC_ADDR": { "desc": "Use well-known mac and vlan mac as dst/src in linkmgrd link prober. " + }, + "MUX_LINKMGR_MUXLOGGER_CHANGE_VERBOSITY_LEVEL": { + "desc": "Consume verbosity level config changes. " } } \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json index 2210c169365c..c57a2c297b6c 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json @@ -22,5 +22,15 @@ } } } + }, + "MUX_LINKMGR_MUXLOGGER_CHANGE_VERBOSITY_LEVEL": { + "sonic-mux-linkmgr:sonic-mux-linkmgr": { + "sonic-mux-linkmgr:MUX_LINKMGR": { + "sonic-mux-linkmgr:MUXLOGGER": + { + "log_verbosity": "debug" + } + } + } } } \ No newline at end of file diff --git a/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang b/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang index 93e605ea8e51..a310cebf417b 100644 --- a/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang +++ b/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang @@ -83,6 +83,21 @@ module sonic-mux-linkmgr { description "The frequency of streaming ICMP heartbeat loss data to telemetry. "; } } + + container MUXLOGGER { + + leaf log_verbosity { + type enumeration { + enum trace; + enum debug; + enum info; + enum error; + enum fatal; + } + + description "Linkmgrd log verbosity level. "; + } + } } } } \ No newline at end of file From bb99552f03f877b1c7ee71f1c4df41b785881d98 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 21 Jul 2023 07:14:31 +0800 Subject: [PATCH 047/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#15861) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index b617d97dfd8e..feea95ed60fe 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit b617d97dfd8e8b9dac2819a0d895909fbfbcf543 +Subproject commit feea95ed60fe437052125b6383386a9ca10f7df2 From 9567c06570a4ad4da9cfef6425a227ee3ce16f2a Mon Sep 17 00:00:00 2001 From: guangyao6 <107662061+guangyao6@users.noreply.github.com> Date: Fri, 21 Jul 2023 09:32:29 +0800 Subject: [PATCH 048/145] Add BGP configuration for BGPSentinel peer (#15714) Why I did it For route registry service, in order to block hijacked routes, IBGP session needs to be set up from BGP sentinel service to SONiC, and BGP sentinel service advertise the same route with higher local-preference and no export community. So that SONiC takes the route from BGP sentinel as the best path and does not advertise the route to EBGP peers. In order to do that, new route-maps are needed. So this change adds a new set of templates, keeping BGPSentinel peers out of the other templates. Work item tracking Microsoft ADO (number only): 24451346 How I did it Add sentinel_community in constants.yml, route from BGPSentinel do not match this community will be denied. Add support to convert BGPSentinel related configuration in the BGPPeerPassive element of the minigraph to a new BGP_SENTINELS table in CONFIG_DB Add a new set of "sentinels" templates to docker-fpm-frr Add a new BGP peer manager to bgpcfgd, to add neighbors from the BGP_SENTINELS table using the "sentinels" templates Add a test case for minigraph.py, making sure the BGPSentinel and BGPSentinelV6 elements create BGP_SENTINELS DB entry. Add a set of test cases for the new sentinels templates in sonic-bgpcfgd tests. Add sonic-bgp-sentinel.yang and a set of testcases for the yang file. How to verify it Testcases and UT newly added would pass. Setup IPv4 and IPv6 BGPSentinel services in minigraph, and load minigraph, show CONFIG_DB and "show runningconfig bgp", configuration would be loaded successfully. Using t1-lag topo and setup IBGP session from BGPSentinel to SONiC loopback address, IBGP session would up. Advertise route from BGPSentinel to T1 with sentinel_community, higher local-preference and no-export communiyt. In T1, show bgp route, the result is "Not advertise to any EBGP peer". Withdraw the route in BGPSentinel, in T1, route would advertise to EBGP peers. Advertise route from T1 that does not match sentinel_community, in T1, would not see the route in show bgp route. --- .../bgpd/templates/sentinels/instance.conf.j2 | 31 ++++++++++ .../templates/sentinels/peer-group.conf.j2 | 7 +++ .../bgpd/templates/sentinels/policies.conf.j2 | 16 +++++ files/image_config/constants/constants.yml | 5 ++ src/sonic-bgpcfgd/bgpcfgd/main.py | 1 + .../sentinels/instance.conf/param_all_v4.json | 8 +++ .../sentinels/instance.conf/param_all_v6.json | 8 +++ .../instance.conf/result_all_v4.conf | 28 +++++++++ .../instance.conf/result_all_v6.conf | 28 +++++++++ .../sentinels/peer-group.conf/param_all.json | 1 + .../sentinels/peer-group.conf/result_all.conf | 7 +++ .../sentinels/policies.conf/param_all.json | 7 +++ .../sentinels/policies.conf/param_base.json | 6 ++ .../sentinels/policies.conf/result_all.conf | 14 +++++ .../sentinels/policies.conf/result_base.conf | 10 ++++ src/sonic-bgpcfgd/tests/test_templates.py | 12 ++++ src/sonic-config-engine/minigraph.py | 33 +++++++---- .../tests/simple-sample-graph.xml | 18 ++++++ src/sonic-config-engine/tests/test_cfggen.py | 15 +++++ src/sonic-yang-models/doc/Configuration.md | 9 ++- src/sonic-yang-models/setup.py | 6 +- .../tests/files/sample_config_db.json | 17 ++++++ .../tests/yang_model_tests/tests/bgp.json | 14 +++++ .../yang_model_tests/tests_config/bgp.json | 56 ++++++++++++++++++ .../yang-models/sonic-bgp-sentinel.yang | 58 +++++++++++++++++++ 25 files changed, 401 insertions(+), 14 deletions(-) create mode 100644 dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/instance.conf.j2 create mode 100644 dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/peer-group.conf.j2 create mode 100644 dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/policies.conf.j2 create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v4.json create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v6.json create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v4.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v6.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/param_all.json create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/result_all.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_all.json create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_base.json create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_all.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_base.conf create mode 100644 src/sonic-yang-models/yang-models/sonic-bgp-sentinel.yang diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/instance.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/instance.conf.j2 new file mode 100644 index 000000000000..951138507689 --- /dev/null +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/instance.conf.j2 @@ -0,0 +1,31 @@ +! +! template: bgpd/templates/sentinels/instance.conf.j2 +! + neighbor {{ bgp_session['name'] }} peer-group + neighbor {{ bgp_session['name'] }} remote-as {{ bgp_asn }} +{% if bgp_session['src_address'] is defined %} + neighbor {{ bgp_session['name'] }} update-source {{ bgp_session['src_address'] | ip }} +{% endif %} +{% for ip_range in bgp_session['ip_range'].split(',') %} + bgp listen range {{ ip_range }} peer-group {{ bgp_session['name'] }} +{% endfor %} +! + address-family ipv4 + neighbor {{ bgp_session['name'] }} activate + neighbor {{ bgp_session['name'] }} addpath-tx-all-paths + neighbor {{ bgp_session['name'] }} soft-reconfiguration inbound + neighbor {{ bgp_session['name'] }} route-map FROM_BGP_SENTINEL in + neighbor {{ bgp_session['name'] }} route-map TO_BGP_SENTINEL out + neighbor {{ bgp_session['name'] }} maximum-prefix 200 + exit-address-family + address-family ipv6 + neighbor {{ bgp_session['name'] }} activate + neighbor {{ bgp_session['name'] }} addpath-tx-all-paths + neighbor {{ bgp_session['name'] }} soft-reconfiguration inbound + neighbor {{ bgp_session['name'] }} route-map FROM_BGP_SENTINEL in + neighbor {{ bgp_session['name'] }} route-map TO_BGP_SENTINEL out + neighbor {{ bgp_session['name'] }} maximum-prefix 200 + exit-address-family +! +! end of template: bgpd/templates/sentinels/instance.conf.j2 +! diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/peer-group.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/peer-group.conf.j2 new file mode 100644 index 000000000000..dcbc3fb578b8 --- /dev/null +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/peer-group.conf.j2 @@ -0,0 +1,7 @@ +! +! template: bgpd/templates/sentinels/peer-group.conf.j2 +! +! nothing is here +! +! end of template: bgpd/templates/sentinels/peer-group.conf.j2 +! diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/policies.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/policies.conf.j2 new file mode 100644 index 000000000000..46a72344f341 --- /dev/null +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/sentinels/policies.conf.j2 @@ -0,0 +1,16 @@ +! +! template: bgpd/templates/sentinels/policies.conf.j2 +! +{% if constants.bgp.sentinel_community is defined %} +bgp community-list standard sentinel_community permit {{ constants.bgp.sentinel_community }} +! +route-map FROM_BGP_SENTINEL permit 100 + match community sentinel_community +{% endif %} +! +route-map FROM_BGP_SENTINEL deny 200 +! +route-map TO_BGP_SENTINEL permit 100 +! +! end of template: bgpd/templates/sentinels/policies.conf.j2 +! diff --git a/files/image_config/constants/constants.yml b/files/image_config/constants/constants.yml index 94f3d0e9706c..4c5339700396 100644 --- a/files/image_config/constants/constants.yml +++ b/files/image_config/constants/constants.yml @@ -4,6 +4,7 @@ constants: "2" : 65433 bgp: traffic_shift_community: 12345:12345 + sentinel_community: 12345:12346 families: - ipv4 - ipv6 @@ -58,3 +59,7 @@ constants: enabled: true db_table: "BGP_VOQ_CHASSIS_NEIGHBOR" template_dir: "voq_chassis" + sentinels: # peer_type + enabled: true + db_table: "BGP_SENTINELS" + template_dir: "sentinels" diff --git a/src/sonic-bgpcfgd/bgpcfgd/main.py b/src/sonic-bgpcfgd/bgpcfgd/main.py index d6434a193106..624d311037ad 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/main.py +++ b/src/sonic-bgpcfgd/bgpcfgd/main.py @@ -60,6 +60,7 @@ def do_work(): BGPPeerMgrBase(common_objs, "CONFIG_DB", "BGP_MONITORS", "monitors", False), BGPPeerMgrBase(common_objs, "CONFIG_DB", "BGP_PEER_RANGE", "dynamic", False), BGPPeerMgrBase(common_objs, "CONFIG_DB", "BGP_VOQ_CHASSIS_NEIGHBOR", "voq_chassis", False), + BGPPeerMgrBase(common_objs, "CONFIG_DB", "BGP_SENTINELS", "sentinels", False), # AllowList Managers BGPAllowListMgr(common_objs, "CONFIG_DB", "BGP_ALLOWED_PREFIXES"), # BBR Manager diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v4.json b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v4.json new file mode 100644 index 000000000000..13a73405c74c --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v4.json @@ -0,0 +1,8 @@ +{ + "bgp_asn": "555", + "bgp_session": { + "ip_range": "10.10.20.0/24,20.20.20.0/24", + "name": "BGPSentinel", + "src_address": "1.1.1.1" + } +} diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v6.json b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v6.json new file mode 100644 index 000000000000..05765bbd7409 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/param_all_v6.json @@ -0,0 +1,8 @@ +{ + "bgp_asn": "555", + "bgp_session": { + "ip_range": "2603:10a0:321:82f9::/64,2603:10a1:30a:8000::/59", + "name": "BGPSentinelV6", + "src_address": "fc00:1::32" + } +} diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v4.conf b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v4.conf new file mode 100644 index 000000000000..7a64e2cd4894 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v4.conf @@ -0,0 +1,28 @@ +! +! template: bgpd/templates/sentinels/instance.conf.j2 +! + neighbor BGPSentinel peer-group + neighbor BGPSentinel remote-as 555 + neighbor BGPSentinel update-source 1.1.1.1 + bgp listen range 10.10.20.0/24 peer-group BGPSentinel + bgp listen range 20.20.20.0/24 peer-group BGPSentinel +! + address-family ipv4 + neighbor BGPSentinel activate + neighbor BGPSentinel addpath-tx-all-paths + neighbor BGPSentinel soft-reconfiguration inbound + neighbor BGPSentinel route-map FROM_BGP_SENTINEL in + neighbor BGPSentinel route-map TO_BGP_SENTINEL out + neighbor BGPSentinel maximum-prefix 200 + exit-address-family + address-family ipv6 + neighbor BGPSentinel activate + neighbor BGPSentinel addpath-tx-all-paths + neighbor BGPSentinel soft-reconfiguration inbound + neighbor BGPSentinel route-map FROM_BGP_SENTINEL in + neighbor BGPSentinel route-map TO_BGP_SENTINEL out + neighbor BGPSentinel maximum-prefix 200 + exit-address-family +! +! end of template: bgpd/templates/sentinels/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v6.conf b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v6.conf new file mode 100644 index 000000000000..8cb2836f7aac --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/instance.conf/result_all_v6.conf @@ -0,0 +1,28 @@ +! +! template: bgpd/templates/sentinels/instance.conf.j2 +! + neighbor BGPSentinelV6 peer-group + neighbor BGPSentinelV6 remote-as 555 + neighbor BGPSentinelV6 update-source fc00:1::32 + bgp listen range 2603:10a0:321:82f9::/64 peer-group BGPSentinelV6 + bgp listen range 2603:10a1:30a:8000::/59 peer-group BGPSentinelV6 +! + address-family ipv4 + neighbor BGPSentinelV6 activate + neighbor BGPSentinelV6 addpath-tx-all-paths + neighbor BGPSentinelV6 soft-reconfiguration inbound + neighbor BGPSentinelV6 route-map FROM_BGP_SENTINEL in + neighbor BGPSentinelV6 route-map TO_BGP_SENTINEL out + neighbor BGPSentinelV6 maximum-prefix 200 + exit-address-family + address-family ipv6 + neighbor BGPSentinelV6 activate + neighbor BGPSentinelV6 addpath-tx-all-paths + neighbor BGPSentinelV6 soft-reconfiguration inbound + neighbor BGPSentinelV6 route-map FROM_BGP_SENTINEL in + neighbor BGPSentinelV6 route-map TO_BGP_SENTINEL out + neighbor BGPSentinelV6 maximum-prefix 200 + exit-address-family +! +! end of template: bgpd/templates/sentinels/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/param_all.json b/src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/param_all.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/param_all.json @@ -0,0 +1 @@ +{} diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/result_all.conf b/src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/result_all.conf new file mode 100644 index 000000000000..86d5c0297227 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/peer-group.conf/result_all.conf @@ -0,0 +1,7 @@ +! +! template: bgpd/templates/BGP_SPEAKER/peer-group.conf.j2 +! +! nothing is here +! +! end of template: bgpd/templates/BGP_SPEAKER/peer-group.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_all.json b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_all.json new file mode 100644 index 000000000000..4270a2ab6b59 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_all.json @@ -0,0 +1,7 @@ +{ + "constants": { + "bgp": { + "sentinel_community": "12345:12346" + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_base.json b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_base.json new file mode 100644 index 000000000000..d6eb89f96850 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/param_base.json @@ -0,0 +1,6 @@ +{ + "constants": { + "bgp": { + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_all.conf b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_all.conf new file mode 100644 index 000000000000..b64e3ceb0dcc --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_all.conf @@ -0,0 +1,14 @@ +! +! template: bgpd/templates/sentinels/policies.conf.j2 +! +bgp community-list standard sentinel_community permit 12345:12346 +! +route-map FROM_BGP_SENTINEL permit 100 + match community sentinel_community +! +route-map FROM_BGP_SENTINEL deny 200 +! +route-map TO_BGP_SENTINEL permit 100 +! +! end of template: bgpd/templates/sentinels/policies.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_base.conf b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_base.conf new file mode 100644 index 000000000000..2ca5f064d5d3 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sentinels/policies.conf/result_base.conf @@ -0,0 +1,10 @@ +! +! template: bgpd/templates/sentinels/policies.conf.j2 +! +! +route-map FROM_BGP_SENTINEL deny 200 +! +route-map TO_BGP_SENTINEL permit 100 +! +! end of template: bgpd/templates/sentinels/policies.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/test_templates.py b/src/sonic-bgpcfgd/tests/test_templates.py index 23ada1aaf3f6..79774e7e57dc 100644 --- a/src/sonic-bgpcfgd/tests/test_templates.py +++ b/src/sonic-bgpcfgd/tests/test_templates.py @@ -152,3 +152,15 @@ def test_voq_chassis_pg(): def test_voq_chassis_instance(): test_data = load_tests("voq_chassis", "instance.conf") run_tests("voq_chassis_instance", *test_data) + +def test_sentinel_policies(): + test_data = load_tests("sentinels", "policies.conf") + run_tests("sentinel_policies", *test_data) + +def test_sentinel_pg(): + test_data = load_tests("sentinels", "peer-group.conf") + run_tests("sentinel_pg", *test_data) + +def test_sentinel_instance(): + test_data = load_tests("sentinels", "instance.conf") + run_tests("sentinel_instance", *test_data) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index e0a8b3bd79cb..0b2f8b0e7640 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -887,6 +887,7 @@ def parse_cpg(cpg, hname, local_devices=[]): bgp_voq_chassis_sessions = {} myasn = None bgp_peers_with_range = {} + bgp_sentinel_sessions = {} for child in cpg: tag = child.tag if tag == str(QName(ns, "PeeringSessions")): @@ -956,14 +957,22 @@ def parse_cpg(cpg, hname, local_devices=[]): name = bgpPeer.find(str(QName(ns1, "Name"))).text ip_range = bgpPeer.find(str(QName(ns1, "PeersRange"))).text ip_range_group = ip_range.split(';') if ip_range and ip_range != "" else [] - bgp_peers_with_range[name] = { - 'name': name, - 'ip_range': ip_range_group - } - if bgpPeer.find(str(QName(ns, "Address"))) is not None: - bgp_peers_with_range[name]['src_address'] = bgpPeer.find(str(QName(ns, "Address"))).text - if bgpPeer.find(str(QName(ns1, "PeerAsn"))) is not None: - bgp_peers_with_range[name]['peer_asn'] = bgpPeer.find(str(QName(ns1, "PeerAsn"))).text + if name == "BGPSentinel" or name == "BGPSentinelV6": + bgp_sentinel_sessions[name] = { + 'name': name, + 'ip_range': ip_range_group + } + if bgpPeer.find(str(QName(ns, "Address"))) is not None: + bgp_sentinel_sessions[name]['src_address'] = bgpPeer.find(str(QName(ns, "Address"))).text + else: + bgp_peers_with_range[name] = { + 'name': name, + 'ip_range': ip_range_group + } + if bgpPeer.find(str(QName(ns, "Address"))) is not None: + bgp_peers_with_range[name]['src_address'] = bgpPeer.find(str(QName(ns, "Address"))).text + if bgpPeer.find(str(QName(ns1, "PeerAsn"))) is not None: + bgp_peers_with_range[name]['peer_asn'] = bgpPeer.find(str(QName(ns1, "PeerAsn"))).text else: for peer in bgp_sessions: bgp_session = bgp_sessions[peer] @@ -985,7 +994,7 @@ def filter_bad_asn(table): bgp_internal_sessions = filter_bad_asn(bgp_internal_sessions) bgp_voq_chassis_sessions = filter_bad_asn(bgp_voq_chassis_sessions) - return bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, myasn, bgp_peers_with_range, bgp_monitors + return bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, myasn, bgp_peers_with_range, bgp_monitors, bgp_sentinel_sessions def parse_meta(meta, hname): @@ -1537,7 +1546,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if child.tag == str(QName(ns, "DpgDec")): (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, acl_table_types, vni, tunnel_intfs, dpg_ecmp_content, static_routes, tunnel_intfs_qos_remap_config) = parse_dpg(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): - (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, hostname) + (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors, bgp_sentinel_sessions) = parse_cpg(child, hostname) elif child.tag == str(QName(ns, "PngDec")): (neighbors, devices, console_dev, console_port, mgmt_dev, mgmt_port, port_speed_png, console_ports, mux_cable_ports, png_ecmp_content) = parse_png(child, hostname, dpg_ecmp_content) elif child.tag == str(QName(ns, "UngDec")): @@ -1553,7 +1562,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, acl_table_types, vni, tunnel_intfs, dpg_ecmp_content, static_routes, tunnel_intfs_qos_remap_config) = parse_dpg(child, asic_name) host_lo_intfs = parse_host_loopback(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): - (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, asic_name, local_devices) + (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors, bgp_sentinel_sessions) = parse_cpg(child, asic_name, local_devices) elif child.tag == str(QName(ns, "PngDec")): (neighbors, devices, port_speed_png) = parse_asic_png(child, asic_name, hostname) elif child.tag == str(QName(ns, "MetadataDeclaration")): @@ -1670,6 +1679,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['BGP_PEER_RANGE'] = bgp_peers_with_range results['BGP_INTERNAL_NEIGHBOR'] = bgp_internal_sessions results['BGP_VOQ_CHASSIS_NEIGHBOR'] = bgp_voq_chassis_sessions + results['BGP_SENTINELS'] = bgp_sentinel_sessions if mgmt_routes: # TODO: differentiate v4 and v6 next(iter(mgmt_intf.values()))['forced_mgmt_routes'] = mgmt_routes @@ -1962,6 +1972,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if is_storage_device and 'BackEnd' in current_device['type']: results['BGP_MONITORS'] = {} results['BGP_PEER_RANGE'] = {} + results['BGP_SENTINELS'] = {} results['VLAN'] = vlans results['VLAN_MEMBER'] = vlan_members diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index c8cd3eacdc31..7da7cb58d4ad 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -108,6 +108,24 @@ + + BGPPeer +

10.2.0.20
+ + + + BGPSentinel + 10.154.232.0/21;10.42.168.0/21 + + + BGPPeer +
fc00:1::32
+ + + + BGPSentinelV6 + 2603:10a0:321:82f9::/64;2603:10a1:30a:8000::/59 +
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index b84d5acdc5e2..66635a9f78bb 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -729,6 +729,21 @@ def test_minigraph_bgp_voq_chassis_peer(self): output = self.run_script(argument) self.assertEqual(output.strip(), "") + def test_minigraph_bgp_sentinel(self): + argument = ['-m', self.sample_graph_simple, '-p', self.port_config, '-v', "BGP_SENTINELS[\'BGPSentinel\']"] + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + utils.to_dict("{'name': 'BGPSentinel', 'ip_range': ['10.154.232.0/21','10.42.168.0/21'], 'src_address': '10.2.0.20'}") + ) + + argument = ['-m', self.sample_graph_simple, '-p', self.port_config, '-v', "BGP_SENTINELS[\'BGPSentinelV6\']"] + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + utils.to_dict("{'name': 'BGPSentinelV6', 'ip_range': ['2603:10a0:321:82f9::/64','2603:10a1:30a:8000::/59'], 'src_address': 'fc00:1::32'}") + ) + def test_minigraph_sub_port_intf_resource_type_non_backend_tor(self, check_stderr=True): self.verify_sub_intf_non_backend_tor(graph_file=self.sample_resource_graph, check_stderr=check_stderr) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 9a7e7beba987..ce0253d605c0 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -424,7 +424,14 @@ group name and IP ranges in **BGP_PEER_RANGE** table. "ip_range": [ "10.2.0.0/16" ] - } + }, + "BGPSentinel": { + "name": "BGPSentinel", + "ip_range": [ + "10.1.0.0/24" + ], + "src_address": "10.1.0.32" + } } } ``` diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index f3de50de857a..b7cc6df95617 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -188,7 +188,8 @@ def run(self): './yang-models/sonic-port-qos-map.yang', './yang-models/sonic-static-route.yang', './yang-models/sonic-system-port.yang', - './yang-models/sonic-macsec.yang']), + './yang-models/sonic-macsec.yang', + './yang-models/sonic-bgp-sentinel.yang']), ('cvlyang-models', ['./cvlyang-models/sonic-acl.yang', './cvlyang-models/sonic-bgp-common.yang', './cvlyang-models/sonic-bgp-global.yang', @@ -261,7 +262,8 @@ def run(self): './cvlyang-models/sonic-port-qos-map.yang', './cvlyang-models/sonic-static-route.yang', './cvlyang-models/sonic-system-port.yang', - './cvlyang-models/sonic-macsec.yang']), + './cvlyang-models/sonic-macsec.yang', + './cvlyang-models/sonic-bgp-sentinel.yang']), ], zip_safe=False, ) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 8ee6430cd163..0bb7a9fbfaee 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1618,6 +1618,23 @@ "src_address": "10.1.0.32" } }, + "BGP_SENTINELS": { + "BGPSentinel": { + "ip_range": [ + "10.1.0.0/24" + ], + "name": "BGPSentinel", + "src_address": "10.1.0.32" + }, + "BGPSentinelV6": { + "ip_range": [ + "2603:10a0:321:82f9::/64", + "2603:10a1:30a:8000::/59" + ], + "name": "BGPSentinelV6", + "src_address": "fc00:1::32" + } + }, "BGP_MONITORS": { "5.6.7.8": { "admin_status": "up", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json index 966171888b37..543a985670f3 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json @@ -197,6 +197,20 @@ "BGP_ALLOWED_PREFIXES_LIST_INVALID_PREFIXES_IPV6": { "desc": "Invalid IPv6 prefix.", "eStrKey" : "Pattern" + }, + "BGP_SENTINEL_ALL_VALID_V4": { + "desc": "Configure BGP Sentinel table." + }, + "BGP_SENTINEL_ALL_VALID_V6": { + "desc": "Configure BGP SentinelV6 table." + }, + "BGP_SENTINEL_INVALID_RANGE_IPV4": { + "desc": "does not satisfy.", + "eStr": "Invalid value \"10.0.0.0/48\" in \"ip_range\" element." + }, + "BGP_SENTINEL_INVALID_RANGE_IPV6": { + "desc": "does not satisfy.", + "eStr": "Invalid value \"fc00:f0::/129\" in \"ip_range\" element." } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json index e18e0bea8f40..6ecc90c38699 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json @@ -1591,6 +1591,62 @@ ] } } + }, + "BGP_SENTINEL_ALL_VALID_V4": { + "sonic-bgp-sentinel:sonic-bgp-sentinel": { + "sonic-bgp-sentinel:BGP_SENTINELS": { + "BGP_SENTINELS_LIST": [ + { + "sentinel_name": "BGPSentinel", + "name": "BGPSentinel", + "src_address": "10.1.0.32", + "ip_range": ["10.1.0.0/24"] + } + ] + } + } + }, + "BGP_SENTINEL_ALL_VALID_V6": { + "sonic-bgp-sentinel:sonic-bgp-sentinel": { + "sonic-bgp-sentinel:BGP_SENTINELS": { + "BGP_SENTINELS_LIST": [ + { + "sentinel_name": "BGPSentinelV6", + "name": "BGPSentinelV6", + "src_address": "fc00:1::32", + "ip_range": ["2603:10a0:321:82f9::/64", "2603:10a1:30a:8000::/59"] + } + ] + } + } + }, + "BGP_SENTINEL_INVALID_RANGE_IPV4": { + "sonic-bgp-sentinel:sonic-bgp-sentinel": { + "sonic-bgp-sentinel:BGP_SENTINELS": { + "BGP_SENTINELS_LIST": [ + { + "sentinel_name": "BGPSentinel", + "name": "BGPSentinel", + "src_address": "10.1.0.32", + "ip_range": ["10.0.0.0/48", "10.1.0.0/24"] + } + ] + } + } + }, + "BGP_SENTINEL_INVALID_RANGE_IPV6": { + "sonic-bgp-sentinel:sonic-bgp-sentinel": { + "sonic-bgp-sentinel:BGP_SENTINELS": { + "BGP_SENTINELS_LIST": [ + { + "sentinel_name": "BGPSentinelV6", + "name": "BGPSentinelV6", + "src_address": "fc00:1::32", + "ip_range": ["fc00:f0::/129", "fc00:a0::/64"] + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-sentinel.yang b/src/sonic-yang-models/yang-models/sonic-bgp-sentinel.yang new file mode 100644 index 000000000000..747aadd2f89e --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-bgp-sentinel.yang @@ -0,0 +1,58 @@ +module sonic-bgp-sentinel { + namespace "http://github.com/Azure/sonic-bgp-sentinel"; + prefix pr; + yang-version 1.1; + + import ietf-inet-types { + prefix inet; + } + + import sonic-types { + prefix stypes; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BGP Sentinel YANG"; + + revision 2023-06-06 { + description + "Initial revision."; + } + + container sonic-bgp-sentinel { + container BGP_SENTINELS { + list BGP_SENTINELS_LIST { + key "sentinel_name"; + + leaf sentinel_name { + type string; + description "BGP Sentinel name"; + } + + leaf name { + type string; + must "(current() = current()/../sentinel_name)" { + error-message "Invalid BGP Sentinel name"; + } + description "BGP Sentinel name"; + } + + leaf src_address { + type inet:ip-address; + description "Source address to use for connection"; + } + + leaf-list ip_range { + type stypes:sonic-ip-prefix; + description "A range of addresses"; + } + } + } + } +} From 287056110e68a6031f303248f255737f26265217 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 21 Jul 2023 15:38:23 +0800 Subject: [PATCH 049/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#15931) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index feea95ed60fe..6716bcf4859c 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit feea95ed60fe437052125b6383386a9ca10f7df2 +Subproject commit 6716bcf4859c43bd66946132986960842de09248 From 19638a4df6c956fe08b5485298a963d5986521c8 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 21 Jul 2023 16:32:44 +0800 Subject: [PATCH 050/145] [submodule] Update submodule sonic-gnmi to the latest HEAD automatically (#15929) #### Why I did it src/sonic-gnmi ``` * fb338d5 - (HEAD -> master, origin/master, origin/HEAD) Merge pull request #135 from liuh-80/dev/liuh/cherry-pick-zmq (3 hours ago) [Hua Liu] * f8d9c7e - Merge branch 'master' into dev/liuh/cherry-pick-zmq (8 hours ago) [Qi Luo] * cbd5185 - Fix PR comments (26 hours ago) [liuh-80] * 226fc31 - Fix PR comments (2 days ago) [liuh-80] * 6579847 - Fix UT (3 days ago) [liuh-80] * 53713c3 - Improve code coverage (3 days ago) [liuh-80] * d8ff562 - Fix UT (3 days ago) [liuh-80] * c3a66bc - Cherry-pick ZMQ change from nvidia repo (3 days ago) [liuh-80] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-gnmi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-gnmi b/src/sonic-gnmi index 610509b3cc61..fb338d50aad1 160000 --- a/src/sonic-gnmi +++ b/src/sonic-gnmi @@ -1 +1 @@ -Subproject commit 610509b3cc610af9373110e33dec807a8f9b7e11 +Subproject commit fb338d50aad1e78d2b675000c916c5b5fdecfc0e From a0ba49d732e9025c84c60f9bddf2242d67073c8b Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 21 Jul 2023 16:48:57 +0800 Subject: [PATCH 051/145] [Build] Fix some of the patches not applied issue (#15660) Why I did it Fix some of the patches in .patches folder not applied issue. The command "quilt applied" only lists the applied patches, if some of the patches have issues, then the patches will not be applied when you run the build command again. Work item tracking Microsoft ADO (number only): 24410730 How I did it Run the command to apply the patches without any conditions. If failed, check if the failure reason is "series fully applied". How to verify it --- slave.mk | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/slave.mk b/slave.mk index 205445a08027..045b3d076aff 100644 --- a/slave.mk +++ b/slave.mk @@ -648,7 +648,7 @@ $(addprefix $(FILES_PATH)/, $(SONIC_MAKE_FILES)) : $(FILES_PATH)/% : .platform $ # Remove target to force rebuild rm -f $(addprefix $(FILES_PATH)/, $*) # Apply series of patches if exist - if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt applied || QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && ( quilt pop -a -f 1>/dev/null 2>&1 || true ) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) # Build project and take package make DEST=$(shell pwd)/$(FILES_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(FILES_PATH)/$* $(LOG) # Clean up @@ -692,7 +692,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(a # Remove target to force rebuild rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) # Apply series of patches if exist - if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt applied || QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && ( quilt pop -a -f 1>/dev/null 2>&1 || true ) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) # Build project and take package $(SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR) DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) make -j$(SONIC_CONFIG_MAKE_JOBS) DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) @@ -732,7 +732,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a # Remove old build logs if they exist rm -f $($*_SRC_PATH)/debian/*.debhelper.log # Apply series of patches if exist - if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt applied || QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && ( quilt pop -a -f 1>/dev/null 2>&1 || true ) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) # Build project pushd $($*_SRC_PATH) $(LOG_SIMPLE) if [ -f ./autogen.sh ]; then ./autogen.sh $(LOG); fi @@ -846,7 +846,7 @@ $(addprefix $(PYTHON_DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) : $(PYTHON_DEBS_PA if [ -z '$($*_CACHE_LOADED)' ] ; then # Apply series of patches if exist - if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt applied || QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && ( quilt pop -a -f 1>/dev/null 2>&1 || true ) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi $(LOG) # Build project pushd $($*_SRC_PATH) $(LOG_SIMPLE) rm -rf deb_dist/* $(LOG) @@ -886,7 +886,7 @@ $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PA pushd $($*_SRC_PATH) $(LOG_SIMPLE) # apply series of patches if exist - if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then quilt applied || QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; fi $(LOG) + if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then ( quilt pop -a -f 1>/dev/null 2>&1 || true ) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; fi $(LOG) ifneq ($(CROSS_BUILD_ENVIRON),y) # Use pip instead of later setup.py to install dependencies into user home, but uninstall self pip$($*_PYTHON_VERSION) install . && pip$($*_PYTHON_VERSION) uninstall --yes `python$($*_PYTHON_VERSION) setup.py --name` @@ -952,7 +952,7 @@ docker-start : $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $(HEADER) # Apply series of patches if exist - if [ -f $($*.gz_PATH).patch/series ]; then pushd $($*.gz_PATH) && quilt applied || QUILT_PATCHES=../$(notdir $($*.gz_PATH)).patch quilt push -a; popd; fi $(LOG) + if [ -f $($*.gz_PATH).patch/series ]; then pushd $($*.gz_PATH) && ( quilt pop -a -f 1>/dev/null 2>&1 || true ) && QUILT_PATCHES=../$(notdir $($*.gz_PATH)).patch quilt push -a; popd; fi $(LOG) # Prepare docker build info SONIC_ENFORCE_VERSIONS=$(SONIC_ENFORCE_VERSIONS) \ TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) \ @@ -1050,7 +1050,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform if [ -z '$($*.gz_CACHE_LOADED)' ] ; then # Apply series of patches if exist - if [ -f $($*.gz_PATH).patch/series ]; then pushd $($*.gz_PATH) && quilt applied || QUILT_PATCHES=../$(notdir $($*.gz_PATH)).patch quilt push -a; popd; fi $(LOG) + if [ -f $($*.gz_PATH).patch/series ]; then pushd $($*.gz_PATH) && ( quilt pop -a -f 1>/dev/null 2>&1 || true ) && QUILT_PATCHES=../$(notdir $($*.gz_PATH)).patch quilt push -a; popd; fi $(LOG) mkdir -p $($*.gz_PATH)/debs $(LOG) mkdir -p $($*.gz_PATH)/files $(LOG) mkdir -p $($*.gz_PATH)/python-debs $(LOG) From 9129a7bf045e2198a703815949baef492ea2794a Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:33:20 +0800 Subject: [PATCH 052/145] [submodule] Update submodule sonic-platform-daemons to the latest HEAD automatically (#15918) #### Why I did it src/sonic-platform-daemons ``` * 76baca3 - (HEAD -> master, origin/master, origin/HEAD) Fixes for the issues uncovered by sonic-pcied unit tests (#389) (32 hours ago) [Ashwin Srinivasan] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 94242c2465d5..76baca3d7154 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 94242c2465d521238535704347f0d01dfd0293c9 +Subproject commit 76baca3d71542dbeeeeac6bea45b762abab7166f From 05f9c5c2971c756e028bc209dfed0b710517314c Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Mon, 24 Jul 2023 23:30:35 +0800 Subject: [PATCH 053/145] Fix issue: set delayed attribute to true for platform monitor service (#15816) There is a redundant line in init_cfg.json.j2. It would cause pmon service always has "delayed=False". However, we know that PMON has a timer now. So, I try to fix it here. --- files/build_templates/init_cfg.json.j2 | 1 - 1 file changed, 1 deletion(-) diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index 827eca04d695..b2e1d2348c2a 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -37,7 +37,6 @@ ("database", "always_enabled", false, "always_enabled"), ("lldp", "enabled", true, "enabled"), ("pmon", "enabled", true, "enabled"), - ("pmon", "enabled", false, "enabled"), ("snmp", "enabled", true, "enabled"), ("eventd", "enabled", false, "enabled"), ("swss", "enabled", false, "enabled"), From d2b5d774c57a98f714da5c7885466dfeecff4e07 Mon Sep 17 00:00:00 2001 From: Jason Tsai Date: Tue, 25 Jul 2023 00:37:48 +0800 Subject: [PATCH 054/145] [Ufispace][PDDF] Add PDDF support on S9180-32X (#14909) * Add s9180-32x pddf support Signed-off-by: cytsai0409 * Fix memset_s parameter Signed-off-by: cytsai0409 * Update chassis.py and fan.py 1. remove duplicate get_sfp() in chassis.py 2. update get_direction() and get_target_speed() in fan.py Signed-off-by: cytsai0409 --------- Signed-off-by: cytsai0409 --- .../UFISPACE-S9180-32X/port_config.ini | 35 + .../UFISPACE-S9180-32X/switch-sai.conf | 33 + .../UFISPACE-S9180-32X/switch-tna-sai.conf | 39 + .../x86_64-ufispace_s9180_32x-r0/default_sku | 1 + .../x86_64-ufispace_s9180_32x-r0/fancontrol | 10 + .../installer.conf | 4 + .../x86_64-ufispace_s9180_32x-r0/pcie.yaml | 417 ++ .../pddf/pd-plugin.json | 68 + .../pddf/pddf-device.json | 5879 +++++++++++++++++ .../x86_64-ufispace_s9180_32x-r0/pddf_support | 0 .../platform.json | 547 ++ .../platform_asic | 1 + .../pmon_daemon_control.json | 9 + .../x86_64-ufispace_s9180_32x-r0/sensors.conf | 9 + .../system_health_monitoring_config.json | 15 + platform/barefoot/bfn-platform-ufispace.mk | 5 + platform/barefoot/docker-saiserver-bfn.mk | 4 +- platform/barefoot/one-image.mk | 4 +- .../barefoot/platform-modules-ufispace.mk | 14 + platform/barefoot/rules.mk | 6 +- .../sonic-platform-modules-ufispace/LICENSE | 674 ++ .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 10 + .../debian/rules | 88 + .../sonic-platform-ufispace-s9180-32x.install | 1 + ...sonic-platform-ufispace-s9180-32x.postinst | 5 + .../s9180-32x/modules/Makefile | 5 + .../s9180-32x/modules/i2c-smbus.c | 423 ++ .../x86-64-ufispace-s9180-32x-sys-eeprom.c | 272 + .../service/pddf-platform-init.service | 1 + .../service/platform-swss-restart.service | 13 + .../s9180-32x/sonic_platform/__init__.py | 4 + .../s9180-32x/sonic_platform/chassis.py | 214 + .../s9180-32x/sonic_platform/component.py | 113 + .../s9180-32x/sonic_platform/eeprom.py | 14 + .../s9180-32x/sonic_platform/fan.py | 147 + .../s9180-32x/sonic_platform/fan_drawer.py | 17 + .../s9180-32x/sonic_platform/platform.py | 25 + .../s9180-32x/sonic_platform/psu.py | 38 + .../s9180-32x/sonic_platform/sfp.py | 17 + .../s9180-32x/sonic_platform/thermal.py | 17 + .../s9180-32x/sonic_platform/watchdog.py | 23 + .../s9180-32x/sonic_platform_setup.py | 27 + .../utils/pddf_post_device_create.sh | 93 + .../utils/pddf_post_driver_install.sh | 2 + .../utils/pddf_pre_driver_install.sh | 5 + .../s9180-32x/utils/pddf_switch_svc.py | 55 + .../s9180-32x/utils/platform_swss_restart.sh | 5 + .../s9180-32x/utils/pre_pddf_init.sh | 5 + 50 files changed, 9414 insertions(+), 5 deletions(-) create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf_support create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf create mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json create mode 100644 platform/barefoot/bfn-platform-ufispace.mk create mode 100644 platform/barefoot/platform-modules-ufispace.mk create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/LICENSE create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/changelog create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/compat create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/control create mode 100755 platform/barefoot/sonic-platform-modules-ufispace/debian/rules create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c create mode 120000 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py create mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py create mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh create mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh create mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh create mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py create mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh create mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini new file mode 100644 index 000000000000..3012ba99ddc9 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini @@ -0,0 +1,35 @@ +# name lanes alias speed autoneg fec index +Ethernet0 0,1,2,3 Ethernet0 100000 off none 0 +Ethernet4 4,5,6,7 Ethernet4 100000 off none 1 +Ethernet8 8,9,10,11 Ethernet8 100000 off none 2 +Ethernet12 12,13,14,15 Ethernet12 100000 off none 3 +Ethernet16 16,17,18,19 Ethernet16 100000 off none 4 +Ethernet20 20,21,22,23 Ethernet20 100000 off none 5 +Ethernet24 24,25,26,27 Ethernet24 100000 off none 6 +Ethernet28 28,29,30,31 Ethernet28 100000 off none 7 +Ethernet32 32,33,34,35 Ethernet32 100000 off none 8 +Ethernet36 36,37,38,39 Ethernet36 100000 off none 9 +Ethernet40 40,41,42,43 Ethernet40 100000 off none 10 +Ethernet44 44,45,46,47 Ethernet44 100000 off none 11 +Ethernet48 48,49,50,51 Ethernet48 100000 off none 12 +Ethernet52 52,53,54,55 Ethernet52 100000 off none 13 +Ethernet56 56,57,58,59 Ethernet56 100000 off none 14 +Ethernet60 60,61,62,63 Ethernet60 100000 off none 15 +Ethernet64 64,65,66,67 Ethernet64 100000 off none 16 +Ethernet68 68,69,70,71 Ethernet68 100000 off none 17 +Ethernet72 72,73,74,75 Ethernet72 100000 off none 18 +Ethernet76 76,77,78,79 Ethernet76 100000 off none 19 +Ethernet80 80,81,82,83 Ethernet80 100000 off none 20 +Ethernet84 84,85,86,87 Ethernet84 100000 off none 21 +Ethernet88 88,89,90,91 Ethernet88 100000 off none 22 +Ethernet92 92,93,94,95 Ethernet92 100000 off none 23 +Ethernet96 96,97,98,99 Ethernet96 100000 off none 24 +Ethernet100 100,101,102,103 Ethernet100 100000 off none 25 +Ethernet104 104,105,106,107 Ethernet104 100000 off none 26 +Ethernet108 108,109,110,111 Ethernet108 100000 off none 27 +Ethernet112 112,113,114,115 Ethernet112 100000 off none 28 +Ethernet116 116,117,118,119 Ethernet116 100000 off none 29 +Ethernet120 120,121,122,123 Ethernet120 100000 off none 30 +Ethernet124 124,125,126,127 Ethernet124 100000 off none 31 +Ethernet128 128 Ethernet128 10000 off none 32 +Ethernet129 129 Ethernet129 10000 off none 33 \ No newline at end of file diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf new file mode 100644 index 000000000000..c3a384ed0796 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf @@ -0,0 +1,33 @@ +{ + "chip_list": [ + { + "id": "asic-0", + "chip_family": "Tofino", + "instance": 0, + "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", + "pcie_domain": 0, + "pcie_bus": 5, + "pcie_fn": 0, + "pcie_dev": 0, + "pcie_int_mode": 1, + "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + } + ], + "instance": 0, + "p4_program_list": [ + { + "id": "pgm-0", + "instance": 0, + "path": "switch", + "program-name": "switch", + "pd": "lib/tofinopd/switch/libpd.so", + "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", + "table-config": "share/tofinopd/switch/context.json", + "tofino-bin": "share/tofinopd/switch/tofino.bin", + "switchapi": "lib/libswitchapi.so", + "sai": "lib/libsai.so", + "agent0": "lib/platform/x86_64-ufispace_s9180_32x-r0/libpltfm_mgr.so", + "switchapi_port_add": false + } + ] +} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf new file mode 100644 index 000000000000..8cd3c6e3538b --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf @@ -0,0 +1,39 @@ +{ + "chip_list": [ + { + "chip_family": "Tofino", + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 + } + ], + "p4_devices": [ + { + "device-id": 0, + "agent0": "lib/platform/x86_64-ufispace_s9180_32x-r0/libpltfm_mgr.so", + "p4_programs": [ + { + "p4_pipelines": [ + { + "p4_pipeline_name": "pipe", + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" + } + ], + "program-name": "switch", + "bfrt-config": "share/switch/bf-rt.json", + "model_json_path" : "share/switch/aug_model.json", + "switchapi_port_add": false, + "non_default_port_ppgs": 5 + } + ] + } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } + ] +} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku b/device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku new file mode 100644 index 000000000000..0effd567eb3a --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku @@ -0,0 +1 @@ +UFISPACE-S9180-32X t1 diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol b/device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol new file mode 100644 index 000000000000..1234cd994f3f --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol @@ -0,0 +1,10 @@ +# Configuration file generated by pwmconfig, changes will be lost +INTERVAL=10 +DEVPATH= +DEVNAME= +FCTEMPS= +FCFANS= +MINTEMP= +MAXTEMP= +MINSTART= +MINSTOP= diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf new file mode 100644 index 000000000000..8f9944da69a6 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="module_blacklist=gpio_ich nomodeset pcie_aspm=off" diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml new file mode 100644 index 000000000000..adafbe61e649 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml @@ -0,0 +1,417 @@ +- bus: '00' + dev: '00' + fn: '0' + id: 6f00 + name: 'Host bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2 + (rev 03)' +- bus: '00' + dev: '02' + fn: '0' + id: 6f04 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 2 (rev 03)' +- bus: '00' + dev: '02' + fn: '2' + id: 6f06 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 2 (rev 03)' +- bus: '00' + dev: '03' + fn: '0' + id: 6f08 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '1' + id: 6f09 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '2' + id: 6f0a + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '3' + id: 6f0b + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '05' + fn: '0' + id: 6f28 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Map/VTd_Misc/System Management (rev 03)' +- bus: '00' + dev: '05' + fn: '1' + id: 6f29 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D IIO Hot Plug (rev 03)' +- bus: '00' + dev: '05' + fn: '2' + id: 6f2a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D IIO RAS/Control Status/Global Errors (rev 03)' +- bus: '00' + dev: '05' + fn: '4' + id: 6f2c + name: 'PIC: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D I/O APIC (rev + 03)' +- bus: '00' + dev: '14' + fn: '0' + id: 8c31 + name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB + xHCI (rev 05)' +- bus: '00' + dev: 1c + fn: '0' + id: 8c10 + name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express + Root Port #1 (rev d5)' +- bus: '00' + dev: 1f + fn: '0' + id: 8c54 + name: 'ISA bridge: Intel Corporation C224 Series Chipset Family Server Standard + SKU LPC Controller (rev 05)' +- bus: '00' + dev: 1f + fn: '2' + id: 8c02 + name: 'SATA controller: Intel Corporation 8 Series/C220 Series Chipset Family 6-port + SATA Controller 1 [AHCI mode] (rev 05)' +- bus: '00' + dev: 1f + fn: '3' + id: 8c22 + name: 'SMBus: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller + (rev 05)' +- bus: '01' + dev: '00' + fn: '0' + id: 6f50 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 0' +- bus: '01' + dev: '00' + fn: '1' + id: 6f51 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 1' +- bus: '01' + dev: '00' + fn: '2' + id: 6f52 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 2' +- bus: '01' + dev: '00' + fn: '3' + id: 6f53 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 3' +- bus: '02' + dev: '00' + fn: '0' + id: 15ab + name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane' +- bus: '02' + dev: '00' + fn: '1' + id: 15ab + name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane' +- bus: '04' + dev: '00' + fn: '0' + id: '0010' + name: 'Unassigned class [ff00]: Device 1d1c:0010 (rev 10)' +- bus: 08 + dev: '00' + fn: '0' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' +- bus: ff + dev: 0b + fn: '0' + id: 6f81 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '1' + id: 6f36 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '2' + id: 6f37 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '3' + id: 6f76 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link Debug (rev 03)' +- bus: ff + dev: 0c + fn: '0' + id: 6fe0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '1' + id: 6fe1 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '2' + id: 6fe2 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '3' + id: 6fe3 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '0' + id: 6ff8 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '4' + id: 6ffc + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '5' + id: 6ffd + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '6' + id: 6ffe + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: '10' + fn: '0' + id: 6f1d + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R2PCIe Agent (rev 03)' +- bus: ff + dev: '10' + fn: '1' + id: 6f34 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R2PCIe Agent (rev 03)' +- bus: ff + dev: '10' + fn: '5' + id: 6f1e + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '10' + fn: '6' + id: 6f7d + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '10' + fn: '7' + id: 6f1f + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '12' + fn: '0' + id: 6fa0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Home Agent 0 (rev 03)' +- bus: ff + dev: '12' + fn: '1' + id: 6f30 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Home Agent 0 (rev 03)' +- bus: ff + dev: '13' + fn: '0' + id: 6fa8 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: ff + dev: '13' + fn: '1' + id: 6f71 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: ff + dev: '13' + fn: '2' + id: 6faa + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '3' + id: 6fab + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '4' + id: 6fac + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '5' + id: 6fad + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '6' + id: 6fae + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Broadcast (rev 03)' +- bus: ff + dev: '13' + fn: '7' + id: 6faf + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Global Broadcast (rev 03)' +- bus: ff + dev: '14' + fn: '0' + id: 6fb0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 0 Thermal Control (rev 03)' +- bus: ff + dev: '14' + fn: '1' + id: 6fb1 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 1 Thermal Control (rev 03)' +- bus: ff + dev: '14' + fn: '2' + id: 6fb2 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 0 Error (rev 03)' +- bus: ff + dev: '14' + fn: '3' + id: 6fb3 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 1 Error (rev 03)' +- bus: ff + dev: '14' + fn: '4' + id: 6fbc + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '5' + id: 6fbd + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '6' + id: 6fbe + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '7' + id: 6fbf + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '15' + fn: '0' + id: 6fb4 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 2 Thermal Control (rev 03)' +- bus: ff + dev: '15' + fn: '1' + id: 6fb5 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 3 Thermal Control (rev 03)' +- bus: ff + dev: '15' + fn: '2' + id: 6fb6 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 2 Error (rev 03)' +- bus: ff + dev: '15' + fn: '3' + id: 6fb7 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 3 Error (rev 03)' +- bus: ff + dev: 1e + fn: '0' + id: 6f98 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '1' + id: 6f99 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '2' + id: 6f9a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '3' + id: 6fc0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '4' + id: 6f9c + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1f + fn: '0' + id: 6f88 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1f + fn: '2' + id: 6f8a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json new file mode 100644 index 000000000000..41b5802fc4a6 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json @@ -0,0 +1,68 @@ +{ + + "XCVR": + { + "xcvr_present": + { + "i2c": + { + "valmap-SFP": {"1":true, "0":false}, + "valmap-QSFP": {"1":true, "0":false} + } + } + }, + "PSU": + { + "psu_present": + { + "i2c": + { + "valmap": { "1":true, "0":false } + }, + "bmc": + { + "valmap": { "0x0280|":true, "0x0180|":false } + } + }, + + "psu_power_good": + { + "i2c": + { + "valmap": { "1": true, "0":false } + }, + "bmc": + { + "valmap": { "0x0280|":true, "0x0180|":false } + } + }, + + "PSU_FAN_MAX_SPEED":"18000" + }, + + "FAN": + { + "direction": + { + "bmc": + { + "valmap": {"0": "UNKNOWN", "1":"INTAKE", "2":"EXHAUST"} + } + }, + + "present": + { + "i2c": + { + "valmap": {"1":true, "0":false} + }, + "bmc": + { + "valmap": { "0x0280|":true, "0x0180|":false } + } + }, + "FAN_R_MAX_SPEED":"22000", + "FAN_F_MAX_SPEED":"22000" + } + +} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json new file mode 100644 index 000000000000..b089cb4cb1bd --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json @@ -0,0 +1,5879 @@ +{ + "PLATFORM": { + "num_psus": 2, + "num_fantrays": 4, + "num_fans_pertray": 2, + "num_ports": 34, + "num_temps": 9, + "pddf_dev_types": { + "description": "PDDF supported devices", + "CPLD": [ + "i2c_cpld" + ], + "PSU": [ + "psu_eeprom", + "psu_pmbus" + ], + "PORT_MODULE": [ + "pddf_xcvr" + ] + }, + "std_kos": [ + "i2c_i801", + "i2c_dev", + "i2c_mux_pca954x", + "optoe", + "lm75", + "gpio-pca953x" + ], + "pddf_kos": [ + "pddf_client_module", + "pddf_cpld_module", + "pddf_cpld_driver", + "pddf_mux_module", + "pddf_xcvr_module", + "pddf_xcvr_driver_module", + "pddf_psu_driver_module", + "pddf_psu_module", + "pddf_fan_driver_module", + "pddf_fan_module", + "pddf_led_module", + "pddf_gpio_module" + ], + "custom_kos": [ + "x86-64-ufispace-s9180-32x-sys-eeprom" + ] + }, + "SYSTEM": { + "dev_info": { + "device_type": "CPU", + "device_name": "ROOT_COMPLEX", + "device_parent": null + }, + "i2c": { + "CONTROLLERS": [ + { + "dev_name": "i2c-0", + "dev": "SMBUS0" + } + ] + } + }, + "SMBUS0": { + "dev_info": { + "device_type": "SMBUS", + "device_name": "SMBUS0", + "device_parent": "SYSTEM" + }, + "i2c": { + "topo_info": { + "dev_addr": "0x0" + }, + "DEVICES": [ + { + "dev": "EEPROM1" + }, + { + "dev": "MUX1" + }, + { + "dev": "GPIO10" + }, + { + "dev": "TEMP1" + } + ] + } + }, + "EEPROM1": { + "dev_info": { + "device_type": "EEPROM", + "device_name": "EEPROM1", + "device_parent": "SMBUS0" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0", + "dev_addr": "0x51", + "dev_type": "sys_eeprom" + }, + "dev_attr": { + "access_mode": "BLOCK" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "TEMP1": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP1", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_CPU_BOARD" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0", + "dev_addr": "0x4f", + "dev_type": "tmp75" + }, + "attr_list": [ + { + "attr_name": "temp1_high_crit_threshold", + "drv_attr_name": "temp1_max" + }, + { + "attr_name": "temp1_max_hyst" + }, + { + "attr_name": "temp1_input" + } + ] + } + }, + "TEMP2": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP2", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_BMC" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_BMC", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_BMC", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_BMC", + "field_pos": "16" + } + ] + } + } + }, + "TEMP3": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP3", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_MAC" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC", + "field_pos": "16" + } + ] + } + } + }, + "TEMP4": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP4", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_MAC_Front" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC_Front", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC_Front", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC_Front", + "field_pos": "16" + } + ] + } + } + }, + "TEMP5": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP5", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_MAC_Rear" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC_Rear", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC_Rear", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_MAC_Rear", + "field_pos": "16" + } + ] + } + } + }, + "TEMP6": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP6", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_PSU1_AMB" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU1_AMB", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU1_AMB", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU1_AMB", + "field_pos": "16" + } + ] + } + } + }, + "TEMP7": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP7", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_PSU1_HS" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU1_HS", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU1_HS", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU1_HS", + "field_pos": "16" + } + ] + } + } + }, + "TEMP8": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP8", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_PSU2_AMB" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU2_AMB", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU2_AMB", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU2_AMB", + "field_pos": "16" + } + ] + } + } + }, + "TEMP9": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP9", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "Temp_PSU2_HS" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU2_HS", + "field_pos": "3" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU2_HS", + "field_pos": "18" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU2_HS", + "field_pos": "16" + } + ] + } + } + }, + "MUX1": { + "dev_info": { + "device_type": "MUX", + "device_name": "MUX1", + "device_parent": "SMBUS0" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0", + "dev_addr": "0x70", + "dev_type": "pca9548" + }, + "dev_attr": { + "virt_bus": "0x1", + "idle_state": "-2" + }, + "channel": [ + { + "chn": "0", + "dev": "MUX2" + }, + { + "chn": "1", + "dev": "MUX3" + }, + { + "chn": "2", + "dev": "MUX4" + }, + { + "chn": "3", + "dev": "MUX5" + }, + { + "chn": "4", + "dev": "GPIO1" + }, + { + "chn": "4", + "dev": "GPIO2" + }, + { + "chn": "4", + "dev": "GPIO3" + }, + { + "chn": "4", + "dev": "GPIO4" + }, + { + "chn": "4", + "dev": "GPIO5" + }, + { + "chn": "5", + "dev": "GPIO6" + }, + { + "chn": "5", + "dev": "GPIO7" + }, + { + "chn": "5", + "dev": "GPIO8" + }, + { + "chn": "5", + "dev": "GPIO9" + }, + { + "chn": "6", + "dev": "MUX6" + } + ] + } + }, + "MUX2": { + "dev_info": { + "device_type": "MUX", + "device_name": "MUX2", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1", + "dev_addr": "0x71", + "dev_type": "pca9548" + }, + "dev_attr": { + "virt_bus": "0x9", + "idle_state": "-2" + }, + "channel": [ + { + "chn": "0", + "dev": "PORT1" + }, + { + "chn": "1", + "dev": "PORT2" + }, + { + "chn": "2", + "dev": "PORT3" + }, + { + "chn": "3", + "dev": "PORT4" + }, + { + "chn": "4", + "dev": "PORT5" + }, + { + "chn": "5", + "dev": "PORT6" + }, + { + "chn": "6", + "dev": "PORT7" + }, + { + "chn": "7", + "dev": "PORT8" + } + ] + } + }, + "MUX3": { + "dev_info": { + "device_type": "MUX", + "device_name": "MUX3", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x71", + "dev_type": "pca9548" + }, + "dev_attr": { + "virt_bus": "0x11", + "idle_state": "-2" + }, + "channel": [ + { + "chn": "0", + "dev": "PORT9" + }, + { + "chn": "1", + "dev": "PORT10" + }, + { + "chn": "2", + "dev": "PORT11" + }, + { + "chn": "3", + "dev": "PORT12" + }, + { + "chn": "4", + "dev": "PORT13" + }, + { + "chn": "5", + "dev": "PORT14" + }, + { + "chn": "6", + "dev": "PORT15" + }, + { + "chn": "7", + "dev": "PORT16" + } + ] + } + }, + "MUX4": { + "dev_info": { + "device_type": "MUX", + "device_name": "MUX4", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3", + "dev_addr": "0x71", + "dev_type": "pca9548" + }, + "dev_attr": { + "virt_bus": "0x19", + "idle_state": "-2" + }, + "channel": [ + { + "chn": "0", + "dev": "PORT17" + }, + { + "chn": "1", + "dev": "PORT18" + }, + { + "chn": "2", + "dev": "PORT19" + }, + { + "chn": "3", + "dev": "PORT20" + }, + { + "chn": "4", + "dev": "PORT21" + }, + { + "chn": "5", + "dev": "PORT22" + }, + { + "chn": "6", + "dev": "PORT23" + }, + { + "chn": "7", + "dev": "PORT24" + } + ] + } + }, + "MUX5": { + "dev_info": { + "device_type": "MUX", + "device_name": "MUX5", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4", + "dev_addr": "0x71", + "dev_type": "pca9548" + }, + "dev_attr": { + "virt_bus": "0x21", + "idle_state": "-2" + }, + "channel": [ + { + "chn": "0", + "dev": "PORT25" + }, + { + "chn": "1", + "dev": "PORT26" + }, + { + "chn": "2", + "dev": "PORT27" + }, + { + "chn": "3", + "dev": "PORT28" + }, + { + "chn": "4", + "dev": "PORT29" + }, + { + "chn": "5", + "dev": "PORT30" + }, + { + "chn": "6", + "dev": "PORT31" + }, + { + "chn": "7", + "dev": "PORT32" + } + ] + } + }, + "MUX6": { + "dev_info": { + "device_type": "MUX", + "device_name": "MUX6", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x7", + "dev_addr": "0x71", + "dev_type": "pca9548" + }, + "dev_attr": { + "virt_bus": "0x29", + "idle_state": "-2" + }, + "channel": [ + { + "chn": "3", + "dev": "CPLD1" + }, + { + "chn": "4", + "dev": "PORT33" + }, + { + "chn": "5", + "dev": "PORT34" + } + ] + } + }, + "GPIO1": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO1", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x5", + "dev_addr": "0x20", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x1f0" + }, + "ports": [ + { + "port_num": "0", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO2": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO2", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x5", + "dev_addr": "0x21", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x1e0" + }, + "ports": [ + { + "port_num": "0", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO3": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO3", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x5", + "dev_addr": "0x22", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x1d0" + }, + "ports": [ + { + "port_num": "0", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO4": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO4", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x5", + "dev_addr": "0x23", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x1c0" + }, + "ports": [ + { + "port_num": "0", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO5": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO5", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x5", + "dev_addr": "0x27", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x1b0" + }, + "ports": [ + { + "port_num": "0", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO6": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO6", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x6", + "dev_addr": "0x20", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x1a0" + }, + "ports": [ + { + "port_num": "0", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO7": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO7", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x6", + "dev_addr": "0x21", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x190" + }, + "ports": [ + { + "port_num": "0", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO8": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO8", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x6", + "dev_addr": "0x22", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x180" + }, + "ports": [ + { + "port_num": "0", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO9": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO9", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x6", + "dev_addr": "0x23", + "dev_type": "pca9555" + }, + "dev_attr": { + "gpio_base": "0x170" + }, + "ports": [ + { + "port_num": "0", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "1", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "2", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "3", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "4", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "5", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "6", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "7", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "8", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "9", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "10", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "11", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "12", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "13", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "14", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + }, + { + "port_num": "15", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "0" + } + ] + } + }, + "GPIO10": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO10", + "device_parent": "SMBUS0" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0", + "dev_addr": "0x77", + "dev_type": "pca9539" + }, + "dev_attr": { + "gpio_base": "0x160" + }, + "ports": [ + { + "port_num": "0", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + } + ] + } + }, + "GPIO11": { + "dev_info": { + "device_type": "GPIO", + "device_name": "GPIO11", + "device_parent": "SMBUS0" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0", + "dev_addr": "0x74", + "dev_type": "pca9539" + }, + "dev_attr": { + "gpio_base": "0x150" + }, + "ports": [ + { + "port_num": "0", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "1", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "2", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "3", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "4", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "5", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "6", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "7", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "8", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "9", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "10", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "11", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "12", + "direction": "in", + "value": "", + "edge": "", + "active_low": "" + }, + { + "port_num": "13", + "direction": "out", + "value": "0", + "edge": "", + "active_low": "" + }, + { + "port_num": "14", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + }, + { + "port_num": "15", + "direction": "out", + "value": "1", + "edge": "", + "active_low": "" + } + ] + } + }, + "CPLD1": { + "dev_info": { + "device_type": "CPLD", + "device_name": "CPLD1", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x30", + "dev_type": "i2c_cpld" + }, + "dev_attr": {} + } + }, + "CPLD2": { + "dev_info": { + "device_type": "CPLD", + "device_name": "CPLD2", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x31", + "dev_type": "i2c_cpld" + }, + "dev_attr": {} + } + }, + "CPLD3": { + "dev_info": { + "device_type": "CPLD", + "device_name": "CPLD3", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x32", + "dev_type": "i2c_cpld" + }, + "dev_attr": {} + } + }, + "PSU1": { + "dev_info": { + "device_type": "PSU", + "device_name": "PSU1", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "dev_idx": "1", + "num_psu_fans": "1" + }, + "i2c": { + "interface": [] + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "psu_present", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "PSU1_PRSNT", + "field_pos": "7" + }, + { + "attr_name": "psu_power_good", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "PSU1_PWROK", + "field_pos": "7" + }, + { + "attr_name": "psu_temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU1_AMB", + "field_pos": "3", + "mult": "1000" + }, + { + "attr_name": "psu_fan1_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Fan_PSU1", + "field_pos": "3" + }, + { + "attr_name": "psu_mfr_id", + "bmc_cmd": "ipmitool fru print 1 | tr -s ' ' | cut -d' ' -f3-5", + "raw": "0", + "field_name": "Manufacturer", + "field_pos": "3", + "delimiter": ":" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "ipmitool fru print 1 | tr -s ' ' | cut -d' ' -f3-5", + "raw": "0", + "field_name": "Name", + "field_pos": "3", + "delimiter": ":" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "ipmitool fru print 1 | tr -s ' ' | cut -d' ' -f3-5", + "raw": "0", + "field_name": "Serial", + "field_pos": "3", + "delimiter": ":" + }, + { + "attr_name": "psu_v_out", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "VOUT_PSU1", + "field_pos": "3", + "mult": "1000" + }, + { + "attr_name": "psu_i_out", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "IOUT_PSU1", + "field_pos": "3", + "mult": "1000" + } + ] + } + } + }, + "PSU2": { + "dev_info": { + "device_type": "PSU", + "device_name": "PSU2", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "dev_idx": "2", + "num_psu_fans": "1" + }, + "i2c": { + "interface": [] + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "psu_present", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "PSU2_PRSNT", + "field_pos": "7" + }, + { + "attr_name": "psu_power_good", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "PSU2_PWROK", + "field_pos": "7" + }, + { + "attr_name": "psu_temp1_input", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Temp_PSU2_AMB", + "field_pos": "3", + "mult": "1000" + }, + { + "attr_name": "psu_fan1_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Fan_PSU2", + "field_pos": "3" + }, + { + "attr_name": "psu_mfr_id", + "bmc_cmd": "ipmitool fru print 2 | tr -s ' ' | cut -d' ' -f3-5", + "raw": "0", + "field_name": "Manufacturer", + "field_pos": "3", + "delimiter": ":" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "ipmitool fru print 2 | tr -s ' ' | cut -d' ' -f3-5", + "raw": "0", + "field_name": "Name", + "field_pos": "3", + "delimiter": ":" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "ipmitool fru print 2 | tr -s ' ' | cut -d' ' -f3-5", + "raw": "0", + "field_name": "Serial", + "field_pos": "3", + "delimiter": ":" + }, + { + "attr_name": "psu_v_out", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "VOUT_PSU2", + "field_pos": "3", + "mult": "1000" + }, + { + "attr_name": "psu_i_out", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "IOUT_PSU2", + "field_pos": "3", + "mult": "1000" + } + ] + } + } + }, + "FAN-CTRL": { + "dev_info": { + "device_type": "FAN", + "device_name": "FAN-CTRL", + "device_parent": "" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "fan1_present", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Fan1_PRSNT", + "field_pos": "7" + }, + { + "attr_name": "fan2_present", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Fan2_PRSNT", + "field_pos": "7" + }, + { + "attr_name": "fan3_present", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Fan3_PRSNT", + "field_pos": "7" + }, + { + "attr_name": "fan4_present", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "Fan4_PRSNT", + "field_pos": "7" + }, + { + "attr_name": "fan1_f_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_1_F", + "field_pos": "3" + }, + { + "attr_name": "fan1_r_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_1_R", + "field_pos": "3" + }, + { + "attr_name": "fan2_f_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_2_F", + "field_pos": "3" + }, + { + "attr_name": "fan2_r_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_2_R", + "field_pos": "3" + }, + { + "attr_name": "fan3_f_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_3_F", + "field_pos": "3" + }, + { + "attr_name": "fan3_r_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_3_R", + "field_pos": "3" + }, + { + "attr_name": "fan4_f_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_4_F", + "field_pos": "3" + }, + { + "attr_name": "fan4_r_speed_rpm", + "bmc_cmd": "ipmitool sensor", + "raw": "0", + "field_name": "FAN_4_R", + "field_pos": "3" + } + ] + } + } + }, + "PORT1": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT1", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "1" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT1-EEPROM" + }, + { + "itf": "control", + "dev": "PORT1-CTRL" + } + ] + } + }, + "PORT1-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0a", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT1-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT2": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT2", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "2" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT2-EEPROM" + }, + { + "itf": "control", + "dev": "PORT2-CTRL" + } + ] + } + }, + "PORT2-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x09", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT2-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x09", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT3": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT3", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "3" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT3-EEPROM" + }, + { + "itf": "control", + "dev": "PORT3-CTRL" + } + ] + } + }, + "PORT3-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0c", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT3-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT4": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT4", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "4" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT4-EEPROM" + }, + { + "itf": "control", + "dev": "PORT4-CTRL" + } + ] + } + }, + "PORT4-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0b", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT4-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT5": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT5", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "5" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT5-EEPROM" + }, + { + "itf": "control", + "dev": "PORT5-CTRL" + } + ] + } + }, + "PORT5-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0e", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT5-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT6": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT6", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "6" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT6-EEPROM" + }, + { + "itf": "control", + "dev": "PORT6-CTRL" + } + ] + } + }, + "PORT6-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0d", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT6-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT7": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT7", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "7" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT7-EEPROM" + }, + { + "itf": "control", + "dev": "PORT7-CTRL" + } + ] + } + }, + "PORT7-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x10", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT7-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x10", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT8": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT8", + "device_parent": "MUX2" + }, + "dev_attr": { + "dev_idx": "8" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT8-EEPROM" + }, + { + "itf": "control", + "dev": "PORT8-CTRL" + } + ] + } + }, + "PORT8-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-EEPROM", + "device_parent": "MUX2", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0f", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT8-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-CTRL", + "device_parent": "MUX2", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x0f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT9": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT9", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "9" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT9-EEPROM" + }, + { + "itf": "control", + "dev": "PORT9-CTRL" + } + ] + } + }, + "PORT9-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x12", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT9-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x12", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT10": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT10", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "10" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT10-EEPROM" + }, + { + "itf": "control", + "dev": "PORT10-CTRL" + } + ] + } + }, + "PORT10-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x11", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT10-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x11", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT11": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT11", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "11" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT11-EEPROM" + }, + { + "itf": "control", + "dev": "PORT11-CTRL" + } + ] + } + }, + "PORT11-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x14", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT11-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x14", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT12": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT12", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "12" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT12-EEPROM" + }, + { + "itf": "control", + "dev": "PORT12-CTRL" + } + ] + } + }, + "PORT12-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x13", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT12-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x13", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT13": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT13", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "13" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT13-EEPROM" + }, + { + "itf": "control", + "dev": "PORT13-CTRL" + } + ] + } + }, + "PORT13-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x16", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT13-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x16", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT14": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT14", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "14" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT14-EEPROM" + }, + { + "itf": "control", + "dev": "PORT14-CTRL" + } + ] + } + }, + "PORT14-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x15", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT14-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x15", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT15": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT15", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "15" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT15-EEPROM" + }, + { + "itf": "control", + "dev": "PORT15-CTRL" + } + ] + } + }, + "PORT15-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x18", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT15-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x18", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT16": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT16", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "16" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT16-EEPROM" + }, + { + "itf": "control", + "dev": "PORT16-CTRL" + } + ] + } + }, + "PORT16-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x17", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT16-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x17", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x22", + "attr_devname": "GPIO3", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x20", + "attr_devname": "GPIO1", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x22", + "attr_devname": "GPIO8", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x20", + "attr_devname": "GPIO6", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT17": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT17", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "17" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT17-EEPROM" + }, + { + "itf": "control", + "dev": "PORT17-CTRL" + } + ] + } + }, + "PORT17-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1a", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT17-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT18": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT18", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "18" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT18-EEPROM" + }, + { + "itf": "control", + "dev": "PORT18-CTRL" + } + ] + } + }, + "PORT18-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x19", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT18-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x19", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT19": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT19", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "19" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT19-EEPROM" + }, + { + "itf": "control", + "dev": "PORT19-CTRL" + } + ] + } + }, + "PORT19-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1c", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT19-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT20": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT20", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "20" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT20-EEPROM" + }, + { + "itf": "control", + "dev": "PORT20-CTRL" + } + ] + } + }, + "PORT20-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1b", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT20-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT21": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT21", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "21" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT21-EEPROM" + }, + { + "itf": "control", + "dev": "PORT21-CTRL" + } + ] + } + }, + "PORT21-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1e", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT21-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT22": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT22", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "22" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT22-EEPROM" + }, + { + "itf": "control", + "dev": "PORT22-CTRL" + } + ] + } + }, + "PORT22-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1d", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT22-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT23": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT23", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "23" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT23-EEPROM" + }, + { + "itf": "control", + "dev": "PORT23-CTRL" + } + ] + } + }, + "PORT23-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT23-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT24": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT24", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "24" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT24-EEPROM" + }, + { + "itf": "control", + "dev": "PORT24-CTRL" + } + ] + } + }, + "PORT24-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1f", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT24-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT25": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT25", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "25" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT25-EEPROM" + }, + { + "itf": "control", + "dev": "PORT25-CTRL" + } + ] + } + }, + "PORT25-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT25-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x9", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT26": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT26", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "26" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT26-EEPROM" + }, + { + "itf": "control", + "dev": "PORT26-CTRL" + } + ] + } + }, + "PORT26-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT26-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0x8", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT27": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT27", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "27" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT27-EEPROM" + }, + { + "itf": "control", + "dev": "PORT27-CTRL" + } + ] + } + }, + "PORT27-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT27-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0xb", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT28": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT28", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "28" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT28-EEPROM" + }, + { + "itf": "control", + "dev": "PORT28-CTRL" + } + ] + } + }, + "PORT28-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT28-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0xa", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT29": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT29", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "29" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT29-EEPROM" + }, + { + "itf": "control", + "dev": "PORT29-CTRL" + } + ] + } + }, + "PORT29-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT29-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0xd", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT30": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT30", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "30" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT30-EEPROM" + }, + { + "itf": "control", + "dev": "PORT30-CTRL" + } + ] + } + }, + "PORT30-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT30-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0xc", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT31": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT31", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "31" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT31-EEPROM" + }, + { + "itf": "control", + "dev": "PORT31-CTRL" + } + ] + } + }, + "PORT31-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT31-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0xf", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT32": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT32", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "32" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT32-EEPROM" + }, + { + "itf": "control", + "dev": "PORT32-CTRL" + } + ] + } + }, + "PORT32-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT32-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x23", + "attr_devname": "GPIO4", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x21", + "attr_devname": "GPIO2", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x23", + "attr_devname": "GPIO9", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x21", + "attr_devname": "GPIO7", + "attr_devtype": "gpio", + "attr_offset": "0xe", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + + "PORT33": { + "dev_info": { + "device_type": "SFP", + "device_name": "PORT33", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "33" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT33-EEPROM" + }, + { + "itf": "control", + "dev": "PORT33-CTRL" + } + ] + } + }, + "PORT33-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT33", + "device_parent": "MUX6", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2d", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT33-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT33-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x0", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x6", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x2", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x4", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + }, + "PORT34": { + "dev_info": { + "device_type": "SFP", + "device_name": "PORT34", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "34" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT34-EEPROM" + }, + { + "itf": "control", + "dev": "PORT34-CTRL" + } + ] + } + }, + "PORT34-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT34", + "device_parent": "MUX6", + "virt_parent": "PORT34" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2e", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT34-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT34-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT34" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x1", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x7", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x3", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x27", + "attr_devname": "GPIO5", + "attr_devtype": "gpio", + "attr_offset": "0x5", + "attr_mask": "", + "attr_cmpval": "", + "attr_len": "" + } + ] + } + } +} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf_support b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json new file mode 100644 index 000000000000..b21674f59f53 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json @@ -0,0 +1,547 @@ +{ + "chassis": { + "name": "S9180-32X", + "components": [ + { + "name": "CPLD1" + }, + { + "name": "BIOS" + }, + { + "name": "BMC" + } + ], + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + }, + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + }, + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + }, + { + "name": "Fantray4_1" + }, + { + "name": "Fantray4_2" + } + ], + "fan_drawers":[ + { + "name": "Fantray1", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + } + ] + }, + { + "name": "Fantray2", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + } + ] + }, + { + "name": "Fantray3", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + } + ] + }, + { + "name": "Fantray4", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray4_1" + }, + { + "name": "Fantray4_2" + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "fans": [ + { + "name": "PSU1_FAN1" + } + ], + "thermals": [ + { + "name": "PSU1_TEMP1" + } + ] + }, + { + "name": "PSU2", + "fans": [ + { + "name": "PSU2_FAN1" + } + ], + "thermals": [ + { + "name": "PSU2_TEMP1" + } + ] + } + ], + "thermals": [ + { + "name": "Temp_CPU_BOARD" + }, + { + "name": "Temp_BMC" + }, + { + "name": "Temp_MAC" + }, + { + "name": "Temp_MAC_Front" + }, + { + "name": "Temp_MAC_Rear" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet4" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet12" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet20" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet28" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet36" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet44" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet52" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet60" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet68" + }, + { + "name": "Ethernet72" + }, + { + "name": "Ethernet76" + }, + { + "name": "Ethernet80" + }, + { + "name": "Ethernet84" + }, + { + "name": "Ethernet88" + }, + { + "name": "Ethernet92" + }, + { + "name": "Ethernet96" + }, + { + "name": "Ethernet100" + }, + { + "name": "Ethernet104" + }, + { + "name": "Ethernet108" + }, + { + "name": "Ethernet112" + }, + { + "name": "Ethernet116" + }, + { + "name": "Ethernet120" + }, + { + "name": "Ethernet124" + }, + { + "name": "Ethernet128" + }, + { + "name": "Ethernet129" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0,0,0,0", + "lanes": "1,2,3,4", + "breakout_modes": { + "1x100G": ["Eth0(Port0)"], + "4x25G": ["Eth0/1(Port0)", "Eth0/2(Port0)", "Eth0/3(Port0)", "Eth0/4(Port0)"] + } + }, + + "Ethernet4": { + "index": "1,1,1,1", + "lanes": "5,6,7,8", + "breakout_modes": { + "1x100G": ["Eth1(Port1)"], + "4x25G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"] + } + }, + + "Ethernet8": { + "index": "2,2,2,2", + "lanes": "9,10,11,12", + "breakout_modes": { + "1x100G": ["Eth2(Port2)"], + "4x25G": ["Eth2/1(Port2)", "Eth2/2(Port2)", "Eth2/3(Port2)", "Eth2/4(Port2)"] + } + }, + + "Ethernet12": { + "index": "3,3,3,3", + "lanes": "13,14,15,16", + "breakout_modes": { + "1x100G": ["Eth3(Port3)"], + "4x25G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"] + } + }, + + "Ethernet16": { + "index": "4,4,4,4", + "lanes": "17,18,19,20", + "breakout_modes": { + "1x100G": ["Eth4(Port4)"], + "4x25G": ["Eth4/1(Port4)", "Eth4/2(Port4)", "Eth4/3(Port4)", "Eth4/4(Port4)"] + } + }, + + "Ethernet20": { + "index": "5,5,5,5", + "lanes": ",21,22,23,24", + "breakout_modes": { + "1x100G": ["Eth5(Port5)"], + "4x25G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"] + } + }, + + "Ethernet24": { + "index": "6,6,6,6", + "lanes": "25,26,27,28", + "breakout_modes": { + "1x100G": ["Eth6(Port6)"], + "4x25G": ["Eth6/1(Port6)", "Eth6/2(Port6)", "Eth6/3(Port6)", "Eth6/4(Port6)"] + } + }, + + "Ethernet28": { + "index": "7,7,7,7", + "lanes": "29,30,31,32", + "breakout_modes": { + "1x100G": ["Eth7(Port7)"], + "4x25G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"] + } + }, + + "Ethernet32": { + "index": "8,8,8,8", + "lanes": "33,34,35,36", + "breakout_modes": { + "1x100G": ["Eth8(Port8)"], + "4x25G": ["Eth8/1(Port8)", "Eth8/2(Port8)", "Eth8/3(Port8)", "Eth8/4(Port8)"] + } + }, + + "Ethernet36": { + "index": "9,9,9,9", + "lanes": "37,38,39,40", + "breakout_modes": { + "1x100G": ["Eth9(Port9)"], + "4x25G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"] + } + }, + + "Ethernet40": { + "index": "10,10,10,10", + "lanes": "41,42,43,44", + "breakout_modes": { + "1x100G": ["Eth10(Port10)"], + "4x25G": ["Eth10/1(Port10)", "Eth10/2(Port10)", "Eth10/3(Port10)", "Eth10/4(Port10)"] + } + }, + + "Ethernet44": { + "index": "11,11,11,11", + "lanes": "45,46,47,48", + "breakout_modes": { + "1x100G": ["Eth11(Port11)"], + "4x25G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"] + } + }, + + "Ethernet48": { + "index": "12,12,12,12", + "lanes": "49,50,51,52", + "breakout_modes": { + "1x100G": ["Eth12(Port12)"], + "4x25G": ["Eth12/1(Port12)", "Eth12/2(Port12)", "Eth12/3(Port12)", "Eth12/4(Port12)"] + } + }, + + "Ethernet52": { + "index": "13,13,13,13", + "lanes": "53,54,55,56", + "breakout_modes": { + "1x100G": ["Eth13(Port13)"], + "4x25G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"] + } + }, + + "Ethernet56": { + "index": "14,14,14,14", + "lanes": "57,58,59,60", + "breakout_modes": { + "1x100G": ["Eth14(Port14)"], + "4x25G": ["Eth14/1(Port14)", "Eth14/2(Port14)", "Eth14/3(Port14)", "Eth14/4(Port14)"] + } + }, + + "Ethernet60": { + "index": "15,15,15,15", + "lanes": "61,62,63,64", + "breakout_modes": { + "1x100G": ["Eth15(Port15)"], + "4x25G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"] + } + }, + + "Ethernet64": { + "index": "16,16,16,16", + "lanes": "65,66,67,68", + "breakout_modes": { + "1x100G": ["Eth16(Port16)"], + "4x25G": ["Eth16/1(Port16)", "Eth16/2(Port16)", "Eth16/3(Port16)", "Eth16/4(Port16)"] + } + }, + + "Ethernet68": { + "index": "17,17,17,17", + "lanes": "69,70,71,72", + "breakout_modes": { + "1x100G": ["Eth17(Port17)"], + "4x25G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"] + } + }, + + "Ethernet72": { + "index": "18,18,18,18", + "lanes": "73,74,75,76", + "breakout_modes": { + "1x100G": ["Eth18(Port18)"], + "4x25G": ["Eth18/1(Port18)", "Eth18/2(Port18)", "Eth18/3(Port18)", "Eth18/4(Port18)"] + } + }, + + "Ethernet76": { + "index": "19,19,19,19", + "lanes": "77,78,79,80", + "breakout_modes": { + "1x100G": ["Eth19(Port19)"], + "4x25G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"] + } + }, + + "Ethernet80": { + "index": "20,20,20,20", + "lanes": "81,82,83,84", + "breakout_modes": { + "1x100G": ["Eth20(Port20)"], + "4x25G": ["Eth20/1(Port20)", "Eth20/2(Port20)", "Eth20/3(Port20)", "Eth20/4(Port20)"] + } + }, + + "Ethernet84": { + "index": "21,21,21,21", + "lanes": "85,86,87,88", + "breakout_modes": { + "1x100G": ["Eth21(Port21)"], + "4x25G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"] + } + }, + + "Ethernet88": { + "index": "22,22,22,22", + "lanes": "89,90,91,92", + "breakout_modes": { + "1x100G": ["Eth22(Port22)"], + "4x25G": ["Eth22/1(Port22)", "Eth22/2(Port22)", "Eth22/3(Port22)", "Eth22/4(Port22)"] + } + }, + + "Ethernet92": { + "index": "23,23,23,23", + "lanes": "93,94,95,96", + "breakout_modes": { + "1x100G": ["Eth23(Port23)"], + "4x25G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"] + } + }, + + "Ethernet96": { + "index": "24,24,24,24", + "lanes": "97,98,99,100", + "breakout_modes": { + "1x100G": ["Eth24(Port24)"], + "4x25G": ["Eth24/1(Port24)", "Eth24/2(Port24)", "Eth24/3(Port24)", "Eth24/4(Port24)"] + } + }, + + "Ethernet100": { + "index": "25,25,25,25", + "lanes": "101,102,103,104", + "breakout_modes": { + "1x100G": ["Eth25(Port25)"], + "4x25G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"] + } + }, + + "Ethernet104": { + "index": "26,26,26,26", + "lanes": "105,106,107,108", + "breakout_modes": { + "1x100G": ["Eth26(Port26)"], + "4x25G": ["Eth26/1(Port26)", "Eth26/2(Port26)", "Eth26/3(Port26)", "Eth26/4(Port26)"] + } + }, + + "Ethernet108": { + "index": "27,27,27,27", + "lanes": "109,110,111,112", + "breakout_modes": { + "1x100G": ["Eth27(Port27)"], + "4x25G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"] + } + }, + + "Ethernet112": { + "index": "28,28,28,28", + "lanes": "113,114,115,116", + "breakout_modes": { + "1x100G": ["Eth28(Port28)"], + "4x25G": ["Eth28/1(Port28)", "Eth28/2(Port28)", "Eth28/3(Port28)", "Eth28/4(Port28)"] + } + }, + + "Ethernet116": { + "index": "29,29,29,29", + "lanes": "117,118,119,120", + "breakout_modes": { + "1x100G": ["Eth29(Port29)"], + "4x25G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"] + } + }, + + "Ethernet120": { + "index": "30,30,30,30", + "lanes": "121,122,123,124", + "breakout_modes": { + "1x100G": ["Eth30(Port30)"], + "4x25G": ["Eth30/1(Port30)", "Eth30/2(Port30)", "Eth30/3(Port30)", "Eth30/4(Port30)"] + } + }, + + "Ethernet124": { + "index": "31,31,31,31", + "lanes": "125,126,127,128", + "breakout_modes": { + "1x100G": ["Eth31(Port31)"], + "4x25G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"] + } + }, + + "Ethernet128": { + "index": "32", + "lanes": "129", + "breakout_modes": { + "1x10G": ["Eth32(Port32)"] + } + }, + + "Ethernet129": { + "index": "33", + "lanes": "130", + "breakout_modes": { + "1x10G": ["Eth33(Port33)"] + } + } + } +} + diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic b/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic new file mode 100644 index 000000000000..88d88117928c --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic @@ -0,0 +1 @@ +barefoot diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..e348e0168fa5 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json @@ -0,0 +1,9 @@ +{ + "skip_pcied": false, + "skip_fancontrol": false, + "skip_thermalctld": false, + "skip_ledd": true, + "skip_xcvrd": false, + "skip_psud": false, + "skip_syseepromd": false +} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf new file mode 100644 index 000000000000..7a1c0408810f --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf @@ -0,0 +1,9 @@ +# libsensors configuration file + +bus "i2c-0" "I2C I801" +chip "tmp75-i2c-*-4f" + label temp1 "CPU Board Temp" + set temp1_max 70 + set temp1_max_hyst 75 + set temp1_crit 85 + diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..6291e81a0621 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu", + "fan" + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "yellow", + "normal": "green", + "booting": "blinking_green" + } +} \ No newline at end of file diff --git a/platform/barefoot/bfn-platform-ufispace.mk b/platform/barefoot/bfn-platform-ufispace.mk new file mode 100644 index 000000000000..fd3dced686dc --- /dev/null +++ b/platform/barefoot/bfn-platform-ufispace.mk @@ -0,0 +1,5 @@ +BFN_UFISPACE_PLATFORM = bfnplatform-ufispace_1.0.0_amd64.deb +$(BFN_UFISPACE_PLATFORM)_URL = "https://github.com/ufispace-dev/bf_sde_bsp/raw/master/sonic/9.12.0/$(BFN_UFISPACE_PLATFORM)" + +SONIC_ONLINE_DEBS += $(BFN_UFISPACE_PLATFORM) # $(BFN_SAI_DEV) +$(BFN_SAI_DEV)_DEPENDS += $(BFN_UFISPACE_PLATFORM) diff --git a/platform/barefoot/docker-saiserver-bfn.mk b/platform/barefoot/docker-saiserver-bfn.mk index dde7e8888a57..26abf7c53b5b 100644 --- a/platform/barefoot/docker-saiserver-bfn.mk +++ b/platform/barefoot/docker-saiserver-bfn.mk @@ -12,7 +12,7 @@ SONIC_COPY_FILES += $(SYNCD_INIT_COMMON_SCRIPT) $(DOCKER_SAISERVER_BFN)_DEPENDS += $(SAISERVER) # Install syncd for reuse the config fun #$(DOCKER_SAISERVER_BFN)_DEPENDS += $(SYNCD) -$(DOCKER_SAISERVER_BFN)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) $(LIBTHRIFT_0_14_1) +$(DOCKER_SAISERVER_BFN)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) $(LIBTHRIFT_0_14_1) $(DOCKER_SAISERVER_BFN)_FILES += $(SYNCD_INIT_COMMON_SCRIPT) # Same dependence as ENABLE_SYNCD_RPC @@ -20,7 +20,7 @@ $(DOCKER_SAISERVER_BFN)_DEPENDS += $(LIBSAITHRIFT_DEV) $(LIBTHRIFT_0_14_1_DEV) # Runtime dependency on sai is set only for syncd #$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) -$(DOCKER_SAISERVER_BFN)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) +$(DOCKER_SAISERVER_BFN)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) $(DOCKER_SAISERVER_BFN)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) diff --git a/platform/barefoot/one-image.mk b/platform/barefoot/one-image.mk index 798a0d678a0d..b3257e8919ed 100644 --- a/platform/barefoot/one-image.mk +++ b/platform/barefoot/one-image.mk @@ -5,16 +5,18 @@ $(SONIC_ONE_IMAGE)_MACHINE = barefoot $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_INSTALLS += $(BFN_MODULE) $(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR) +$(SONIC_ONE_IMAGE)_INSTALLS += $(PDDF_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_NEWPORT_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_NEWPORT_BF_PLATFORM_MODULE) -$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WNC_OSW1800_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WNC_OSW1800_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9180_32X_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9280_64X_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_QS_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_610_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_710_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(UFISPACE_S9180_32X_PLATFORM_MODULE) ifeq ($(INSTALL_DEBUG_TOOLS),y) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES) $(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES)) diff --git a/platform/barefoot/platform-modules-ufispace.mk b/platform/barefoot/platform-modules-ufispace.mk new file mode 100644 index 000000000000..9cdd5ca43ad7 --- /dev/null +++ b/platform/barefoot/platform-modules-ufispace.mk @@ -0,0 +1,14 @@ +# Ufispace S9180-32X Platform modules + +UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION = 1.1.0 + +export UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION + +UFISPACE_S9180_32X_PLATFORM_MODULE = sonic-platform-ufispace-s9180-32x_$(UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION)_amd64.deb +$(UFISPACE_S9180_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ufispace +$(UFISPACE_S9180_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(UFISPACE_S9180_32X_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s9180_32x-r0 +SONIC_DPKG_DEBS += $(UFISPACE_S9180_32X_PLATFORM_MODULE) + +$(eval $(call add_extra_package,$(UFISPACE_S9180_32X_PLATFORM_MODULE))) + diff --git a/platform/barefoot/rules.mk b/platform/barefoot/rules.mk index 58f52f5ffd56..0a4339ce7161 100644 --- a/platform/barefoot/rules.mk +++ b/platform/barefoot/rules.mk @@ -6,6 +6,7 @@ include $(PLATFORM_PATH)/platform-modules-bfn-newport.mk include $(PLATFORM_PATH)/platform-modules-wnc-osw1800.mk include $(PLATFORM_PATH)/platform-modules-ingrasys.mk include $(PLATFORM_PATH)/platform-modules-netberg.mk +include $(PLATFORM_PATH)/platform-modules-ufispace.mk include $(PLATFORM_PATH)/bfn-sai.mk include $(PLATFORM_PATH)/docker-syncd-bfn.mk include $(PLATFORM_PATH)/docker-syncd-bfn-rpc.mk @@ -15,6 +16,7 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/bfn-platform.mk #include $(PLATFORM_PATH)/bfn-platform-wnc.mk #include $(PLATFORM_PATH)/bfn-platform-ingrasys.mk +include $(PLATFORM_PATH)/bfn-platform-ufispace.mk include $(PLATFORM_PATH)/bfn-modules.mk include $(PLATFORM_PATH)/docker-saiserver-bfn.mk @@ -23,7 +25,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT) \ # Inject sai into syncd #$(SYNCD)_DEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) -$(SYNCD)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) +$(SYNCD)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) $(SYNCD)_UNINSTALLS += $(BFN_SAI) ifeq ($(ENABLE_SYNCD_RPC),y) @@ -33,6 +35,6 @@ endif # Runtime dependency on sai is set only for syncd #$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) -$(SYNCD)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) +$(SYNCD)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) export SONIC_BUFFER_MODEL=dynamic diff --git a/platform/barefoot/sonic-platform-modules-ufispace/LICENSE b/platform/barefoot/sonic-platform-modules-ufispace/LICENSE new file mode 100644 index 000000000000..9cecc1d4669e --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/changelog b/platform/barefoot/sonic-platform-modules-ufispace/debian/changelog new file mode 100644 index 000000000000..0b4a98329e16 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/debian/changelog @@ -0,0 +1,5 @@ +sonic-ufispace-platform-modules (1.1.0) unstable; urgency=low + + * Add support for S9180-32X. + + -- Ufispace Tue, 19 Apr 2022 17:10:58 +0800 diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/compat b/platform/barefoot/sonic-platform-modules-ufispace/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/control b/platform/barefoot/sonic-platform-modules-ufispace/debian/control new file mode 100644 index 000000000000..cc98343cf09b --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/debian/control @@ -0,0 +1,10 @@ +Source: sonic-ufispace-platform-modules +Section: main +Priority: extra +Maintainer: Leo Lin , Jason Tsai +Build-Depends: debhelper (>= 9), bzip2 +Standards-Version: 1.0.0 + +Package: sonic-platform-ufispace-s9180-32x +Architecture: amd64 +Description: This package contains s9180-32x platform driver utility for SONiC project. diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/rules b/platform/barefoot/sonic-platform-modules-ufispace/debian/rules new file mode 100755 index 000000000000..552cc61f8f44 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/debian/rules @@ -0,0 +1,88 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +include /usr/share/dpkg/pkg-info.mk + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +export INSTALL_MOD_DIR:=extra + +PYTHON3 ?= python3 + +PACKAGE_PRE_NAME := sonic-platform-ufispace +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= s9180-32x +MODULE_DIR := modules +UTILS_DIR := utils +SERVICE_DIR := service +CONF_DIR := conf + +%: + dh $@ --with systemd,python3 --buildsystem=pybuild + +clean: + dh_testdir + dh_testroot + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + done) + + + +build: + (for mod in $(MODULE_DIRS); do \ + make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + cd -; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + if [ -f sonic_platform_setup.py ]; then \ + $(PYTHON3) sonic_platform_setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}; \ + echo "Finished makig whl package for $$mod"; \ + fi; \ + cd -; \ + done) + +binary: binary-arch binary-indep + +binary-arch: + +binary-indep: + dh_testdir + dh_installdirs + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/$(MODULE_DIR)/*.ko debian/$(PACKAGE_PRE_NAME)-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} usr/local/bin; \ + cp $(MOD_SRC_DIR)/$${mod}/$(UTILS_DIR)/* debian/$(PACKAGE_PRE_NAME)-$${mod}/usr/local/bin; \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} lib/systemd/system; \ + cp $(MOD_SRC_DIR)/$${mod}/$(SERVICE_DIR)/*.service debian/$(PACKAGE_PRE_NAME)-$${mod}/lib/systemd/system; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + cd -; \ + done) + + # Resuming debhelper scripts + dh_testroot + dh_install + dh_installchangelogs + dh_installdocs + dh_systemd_enable + dh_installinit + dh_systemd_start + dh_link + dh_fixperms + dh_compress + dh_strip + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +.PHONY: build binary binary-arch binary-indep clean diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install b/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install new file mode 100644 index 000000000000..b6968a0a3a74 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install @@ -0,0 +1 @@ +s9180-32x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-ufispace_s9180_32x-r0/pddf diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst b/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst new file mode 100644 index 000000000000..c5d8d8f0abc4 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst @@ -0,0 +1,5 @@ +depmod -a +systemctl enable pddf-platform-init.service +systemctl start pddf-platform-init.service +systemctl enable platform-swss-restart.service +systemctl start --no-block platform-swss-restart.service diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile new file mode 100644 index 000000000000..f5b3bc42137e --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile @@ -0,0 +1,5 @@ +MODULE_NAME = x86-64-ufispace-s9180-32x-sys-eeprom.o i2c-smbus.o +obj-m := $(MODULE_NAME) + +CFLAGS_pddf_custom_sysstatus_module.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c new file mode 100644 index 000000000000..6c4e4dca5673 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c @@ -0,0 +1,423 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * i2c-smbus.c - SMBus extensions to the I2C protocol + * + * Copyright (C) 2008 David Brownell + * Copyright (C) 2010-2019 Jean Delvare + */ + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int disable_i2c_register_spd = 1; +module_param(disable_i2c_register_spd, int, 0); + +struct i2c_smbus_alert { + struct work_struct alert; + struct i2c_client *ara; /* Alert response address */ +}; + +struct alert_data { + unsigned short addr; + enum i2c_alert_protocol type; + unsigned int data; +}; + +/* If this is the alerting device, notify its driver */ +static int smbus_do_alert(struct device *dev, void *addrp) +{ + struct i2c_client *client = i2c_verify_client(dev); + struct alert_data *data = addrp; + struct i2c_driver *driver; + + if (!client || client->addr != data->addr) + return 0; + if (client->flags & I2C_CLIENT_TEN) + return 0; + + /* + * Drivers should either disable alerts, or provide at least + * a minimal handler. Lock so the driver won't change. + */ + device_lock(dev); + if (client->dev.driver) { + driver = to_i2c_driver(client->dev.driver); + if (driver->alert) + driver->alert(client, data->type, data->data); + else + dev_warn(&client->dev, "no driver alert()!\n"); + } else + dev_dbg(&client->dev, "alert with no driver\n"); + device_unlock(dev); + + /* Stop iterating after we find the device */ + return -EBUSY; +} + +/* + * The alert IRQ handler needs to hand work off to a task which can issue + * SMBus calls, because those sleeping calls can't be made in IRQ context. + */ +static irqreturn_t smbus_alert(int irq, void *d) +{ + struct i2c_smbus_alert *alert = d; + struct i2c_client *ara; + + ara = alert->ara; + + for (;;) { + s32 status; + struct alert_data data; + + /* + * Devices with pending alerts reply in address order, low + * to high, because of slave transmit arbitration. After + * responding, an SMBus device stops asserting SMBALERT#. + * + * Note that SMBus 2.0 reserves 10-bit addresses for future + * use. We neither handle them, nor try to use PEC here. + */ + status = i2c_smbus_read_byte(ara); + if (status < 0) + break; + + data.data = status & 1; + data.addr = status >> 1; + data.type = I2C_PROTOCOL_SMBUS_ALERT; + + dev_dbg(&ara->dev, "SMBALERT# from dev 0x%02x, flag %d\n", + data.addr, data.data); + + /* Notify driver for the device which issued the alert */ + device_for_each_child(&ara->adapter->dev, &data, + smbus_do_alert); + } + + return IRQ_HANDLED; +} + +static void smbalert_work(struct work_struct *work) +{ + struct i2c_smbus_alert *alert; + + alert = container_of(work, struct i2c_smbus_alert, alert); + + smbus_alert(0, alert); + +} + +/* Setup SMBALERT# infrastructure */ +static int smbalert_probe(struct i2c_client *ara, + const struct i2c_device_id *id) +{ + struct i2c_smbus_alert_setup *setup = dev_get_platdata(&ara->dev); + struct i2c_smbus_alert *alert; + struct i2c_adapter *adapter = ara->adapter; + int res, irq; + + alert = devm_kzalloc(&ara->dev, sizeof(struct i2c_smbus_alert), + GFP_KERNEL); + if (!alert) + return -ENOMEM; + + if (setup) { + irq = setup->irq; + } else { + irq = of_irq_get_byname(adapter->dev.of_node, "smbus_alert"); + if (irq <= 0) + return irq; + } + + INIT_WORK(&alert->alert, smbalert_work); + alert->ara = ara; + + if (irq > 0) { + res = devm_request_threaded_irq(&ara->dev, irq, + NULL, smbus_alert, + IRQF_SHARED | IRQF_ONESHOT, + "smbus_alert", alert); + if (res) + return res; + } + + i2c_set_clientdata(ara, alert); + dev_info(&adapter->dev, "supports SMBALERT#\n"); + + return 0; +} + +/* IRQ and memory resources are managed so they are freed automatically */ +static int smbalert_remove(struct i2c_client *ara) +{ + struct i2c_smbus_alert *alert = i2c_get_clientdata(ara); + + cancel_work_sync(&alert->alert); + return 0; +} + +static const struct i2c_device_id smbalert_ids[] = { + { "smbus_alert", 0 }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, smbalert_ids); + +static struct i2c_driver smbalert_driver = { + .driver = { + .name = "smbus_alert", + }, + .probe = smbalert_probe, + .remove = smbalert_remove, + .id_table = smbalert_ids, +}; + +/** + * i2c_handle_smbus_alert - Handle an SMBus alert + * @ara: the ARA client on the relevant adapter + * Context: can't sleep + * + * Helper function to be called from an I2C bus driver's interrupt + * handler. It will schedule the alert work, in turn calling the + * corresponding I2C device driver's alert function. + * + * It is assumed that ara is a valid i2c client previously returned by + * i2c_new_smbus_alert_device(). + */ +int i2c_handle_smbus_alert(struct i2c_client *ara) +{ + struct i2c_smbus_alert *alert = i2c_get_clientdata(ara); + + return schedule_work(&alert->alert); +} +EXPORT_SYMBOL_GPL(i2c_handle_smbus_alert); + +module_i2c_driver(smbalert_driver); + +#if IS_ENABLED(CONFIG_I2C_SLAVE) +#define SMBUS_HOST_NOTIFY_LEN 3 +struct i2c_slave_host_notify_status { + u8 index; + u8 addr; +}; + +static int i2c_slave_host_notify_cb(struct i2c_client *client, + enum i2c_slave_event event, u8 *val) +{ + struct i2c_slave_host_notify_status *status = client->dev.platform_data; + + switch (event) { + case I2C_SLAVE_WRITE_RECEIVED: + /* We only retrieve the first byte received (addr) + * since there is currently no support to retrieve the data + * parameter from the client. + */ + if (status->index == 0) + status->addr = *val; + if (status->index < U8_MAX) + status->index++; + break; + case I2C_SLAVE_STOP: + if (status->index == SMBUS_HOST_NOTIFY_LEN) + i2c_handle_smbus_host_notify(client->adapter, + status->addr); + fallthrough; + case I2C_SLAVE_WRITE_REQUESTED: + status->index = 0; + break; + case I2C_SLAVE_READ_REQUESTED: + case I2C_SLAVE_READ_PROCESSED: + *val = 0xff; + break; + } + + return 0; +} + +/** + * i2c_new_slave_host_notify_device - get a client for SMBus host-notify support + * @adapter: the target adapter + * Context: can sleep + * + * Setup handling of the SMBus host-notify protocol on a given I2C bus segment. + * + * Handling is done by creating a device and its callback and handling data + * received via the SMBus host-notify address (0x8) + * + * This returns the client, which should be ultimately freed using + * i2c_free_slave_host_notify_device(); or an ERRPTR to indicate an error. + */ +struct i2c_client *i2c_new_slave_host_notify_device(struct i2c_adapter *adapter) +{ + struct i2c_board_info host_notify_board_info = { + I2C_BOARD_INFO("smbus_host_notify", 0x08), + .flags = I2C_CLIENT_SLAVE, + }; + struct i2c_slave_host_notify_status *status; + struct i2c_client *client; + int ret; + + status = kzalloc(sizeof(struct i2c_slave_host_notify_status), + GFP_KERNEL); + if (!status) + return ERR_PTR(-ENOMEM); + + host_notify_board_info.platform_data = status; + + client = i2c_new_client_device(adapter, &host_notify_board_info); + if (IS_ERR(client)) { + kfree(status); + return client; + } + + ret = i2c_slave_register(client, i2c_slave_host_notify_cb); + if (ret) { + i2c_unregister_device(client); + kfree(status); + return ERR_PTR(ret); + } + + return client; +} +EXPORT_SYMBOL_GPL(i2c_new_slave_host_notify_device); + +/** + * i2c_free_slave_host_notify_device - free the client for SMBus host-notify + * support + * @client: the client to free + * Context: can sleep + * + * Free the i2c_client allocated via i2c_new_slave_host_notify_device + */ +void i2c_free_slave_host_notify_device(struct i2c_client *client) +{ + if (IS_ERR_OR_NULL(client)) + return; + + i2c_slave_unregister(client); + kfree(client->dev.platform_data); + i2c_unregister_device(client); +} +EXPORT_SYMBOL_GPL(i2c_free_slave_host_notify_device); +#endif + +/* + * SPD is not part of SMBus but we include it here for convenience as the + * target systems are the same. + * Restrictions to automatic SPD instantiation: + * - Only works if all filled slots have the same memory type + * - Only works for DDR2, DDR3 and DDR4 for now + * - Only works on systems with 1 to 4 memory slots + */ +#if IS_ENABLED(CONFIG_DMI) +void i2c_register_spd(struct i2c_adapter *adap) +{ + int n, slot_count = 0, dimm_count = 0; + u16 handle; + u8 common_mem_type = 0x0, mem_type; + u64 mem_size; + const char *name; + + //disable spd scan to prevent address conflict between spd and sys eeprom + if (disable_i2c_register_spd == 1) { + return; + } + + while ((handle = dmi_memdev_handle(slot_count)) != 0xffff) { + slot_count++; + + /* Skip empty slots */ + mem_size = dmi_memdev_size(handle); + if (!mem_size) + continue; + + /* Skip undefined memory type */ + mem_type = dmi_memdev_type(handle); + if (mem_type <= 0x02) /* Invalid, Other, Unknown */ + continue; + + if (!common_mem_type) { + /* First filled slot */ + common_mem_type = mem_type; + } else { + /* Check that all filled slots have the same type */ + if (mem_type != common_mem_type) { + dev_warn(&adap->dev, + "Different memory types mixed, not instantiating SPD\n"); + return; + } + } + dimm_count++; + } + + /* No useful DMI data, bail out */ + if (!dimm_count) + return; + + dev_info(&adap->dev, "%d/%d memory slots populated (from DMI)\n", + dimm_count, slot_count); + + if (slot_count > 4) { + dev_warn(&adap->dev, + "Systems with more than 4 memory slots not supported yet, not instantiating SPD\n"); + return; + } + + switch (common_mem_type) { + case 0x13: /* DDR2 */ + case 0x18: /* DDR3 */ + case 0x1C: /* LPDDR2 */ + case 0x1D: /* LPDDR3 */ + name = "spd"; + break; + case 0x1A: /* DDR4 */ + case 0x1E: /* LPDDR4 */ + name = "ee1004"; + break; + default: + dev_info(&adap->dev, + "Memory type 0x%02x not supported yet, not instantiating SPD\n", + common_mem_type); + return; + } + + /* + * We don't know in which slots the memory modules are. We could + * try to guess from the slot names, but that would be rather complex + * and unreliable, so better probe all possible addresses until we + * have found all memory modules. + */ + for (n = 0; n < slot_count && dimm_count; n++) { + struct i2c_board_info info; + unsigned short addr_list[2]; + +#ifdef __STDC_LIB_EXT1__ + memset_s(&info, sizeof(struct i2c_board_info), 0, sizeof(struct i2c_board_info)); +#else + memset(&info, 0, sizeof(struct i2c_board_info)); +#endif + strlcpy(info.type, name, I2C_NAME_SIZE); + addr_list[0] = 0x50 + n; + addr_list[1] = I2C_CLIENT_END; + + if (!IS_ERR(i2c_new_scanned_device(adap, &info, addr_list, NULL))) { + dev_info(&adap->dev, + "Successfully instantiated SPD at 0x%hx\n", + addr_list[0]); + dimm_count--; + } + } +} +EXPORT_SYMBOL_GPL(i2c_register_spd); +#endif + +MODULE_AUTHOR("Jean Delvare "); +MODULE_DESCRIPTION("SMBus protocol extensions support"); +MODULE_LICENSE("GPL"); diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c new file mode 100644 index 000000000000..f9f7728deb3d --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c @@ -0,0 +1,272 @@ +/* + * Copyright (C) 1998, 1999 Frodo Looijaard and + * Philip Edelbrock + * Copyright (C) 2003 Greg Kroah-Hartman + * Copyright (C) 2003 IBM Corp. + * Copyright (C) 2004 Jean Delvare + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* enable dev_dbg print out */ +//#define DEBUG + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { /*0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57,*/ I2C_CLIENT_END }; + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 512 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void sys_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, (u8)((addr >> 8) & 0xFF), (u8)(addr & 0xFF)); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t sys_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + sys_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static ssize_t sys_eeprom_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + int ret; + int i; + u8 cmd; + u16 value16; + + dev_dbg(&client->dev, "sys_eeprom_write off=%d, count=%d\n", (int)off, (int)count); + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + mutex_lock(&data->update_lock); + + for(i=0; i < count; i++) { + /* write command */ + cmd = (off >> 8) & 0xff; + value16 = off & 0xff; + value16 |= buf[i] << 8; + ret = i2c_smbus_write_word_data(client, cmd, value16); + + if (ret < 0) { + dev_err(&client->dev, "write address failed at %d \n", (int)off); + goto exit; + } + + off++; + + /* need to wait for write complete */ + udelay(10000); + } +exit: + mutex_unlock(&data->update_lock); + /* force to update client when reading */ + for(i=0; i < SLICE_NUM; i++) { + data->last_updated[i] = 0; + } + + return count; +} + +static struct bin_attribute sys_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO | S_IWUSR, + }, + .size = EEPROM_SIZE, + .read = sys_eeprom_read, + .write = sys_eeprom_write, +}; + +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int sys_eeprom_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = client->adapter; + + /* EDID EEPROMs are often 24C00 EEPROMs, which answer to all + addresses 0x50-0x57, but we only care about 0x51 and 0x55. So decline + attaching to addresses >= 0x56 on DDC buses */ + if (!(adapter->class & I2C_CLASS_SPD) && client->addr >= 0x56) { + return -ENODEV; + } + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE) + && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { + return -ENODEV; + } + + strlcpy(info->type, "eeprom", I2C_NAME_SIZE); + + return 0; +} + +static int sys_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + +#ifdef __STDC_LIB_EXT1__ + memset_s(data->data, EEPROM_SIZE, 0xff, EEPROM_SIZE); +#else + memset(data->data, 0xff, EEPROM_SIZE); +#endif + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &sys_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int sys_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &sys_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id sys_eeprom_id[] = { + { "sys_eeprom", 0 }, + { } +}; + +static struct i2c_driver sys_eeprom_driver = { + .driver = { + .name = "sys_eeprom", + }, + .probe = sys_eeprom_probe, + .remove = sys_eeprom_remove, + .id_table = sys_eeprom_id, + + .class = I2C_CLASS_DDC | I2C_CLASS_SPD, + .detect = sys_eeprom_detect, + .address_list = normal_i2c, +}; + +module_i2c_driver(sys_eeprom_driver); + +MODULE_AUTHOR("Jason "); +MODULE_DESCRIPTION("UfiSpace System EEPROM driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service new file mode 100644 index 000000000000..323a4b827ccd --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service @@ -0,0 +1,13 @@ +[Unit] +Description=SWSS restart service +After=swss.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_swss_restart.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py new file mode 100644 index 000000000000..593867d31c9d --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py @@ -0,0 +1,4 @@ +# All the derived classes for PDDF +__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] +from . import platform + diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py new file mode 100644 index 000000000000..017242de4dd6 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Chassis API +# +############################################################################# + +try: + import time + import subprocess + from sonic_platform_pddf_base.pddf_chassis import PddfChassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_COMPONENT = 2 + +class Chassis(PddfChassis): + """ + PDDF Platform-specific Chassis class + """ + + STATUS_INSERTED = "1" + STATUS_REMOVED = "0" + port_dict = {} + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfChassis.__init__(self, pddf_data, pddf_plugin_data) + self._initialize_components() + + def _initialize_components(self): + from sonic_platform.component import Component + for index in range(NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + # Provide the functions/variables below for which implementation is to be overwritten + def initizalize_system_led(self): + return True + + def get_status_led(self): + return self.get_system_led("SYS_LED") + + def get_system_led(self, led_device_name): + ipmi_cmd_sys_led = "ipmitool raw 0x3c 0x20 0x0" + ipmi_cmd_fantray_led = "ipmitool raw 0x3c 0x21 0x0" + + led_dict = {"SYS_LED": { + "ipmi_cmd": ipmi_cmd_sys_led, + "index": 0}, + "FAN_LED": { + "ipmi_cmd": ipmi_cmd_sys_led, + "index": 1}, + "PSU1_LED": { + "ipmi_cmd": ipmi_cmd_sys_led, + "index": 2}, + "PSU2_LED": { + "ipmi_cmd": ipmi_cmd_sys_led, + "index": 3}, + "FANTRAY1_LED": { + "ipmi_cmd": ipmi_cmd_fantray_led, + "index": 0}, + "FANTRAY2_LED": { + "ipmi_cmd": ipmi_cmd_fantray_led, + "index": 1}, + "FANTRAY3_LED": { + "ipmi_cmd": ipmi_cmd_fantray_led, + "index": 2}, + "FANTRAY4_LED": { + "ipmi_cmd": ipmi_cmd_fantray_led, + "index": 3} + } + color_dict = {0: "off", + 1: "yellow", + 2: "green"} + + if led_device_name not in led_dict.keys(): + status = "[FAILED] " + led_device_name + " is not configured" + return (status) + + ipmi_cmd = led_dict[led_device_name]["ipmi_cmd"] + index = led_dict[led_device_name]["index"] + status, output = subprocess.getstatusoutput(ipmi_cmd) + + if status != 0: + return ("ipmi_cmd error, cmd={}, status={}".format(ipmi_cmd, status)) + + color_raw = int(output.split()[index]) + + if color_raw not in color_dict.keys(): + color = "unknown" + else: + color = color_dict[color_raw] + + return (color) + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + Returns: + (bool, dict): + - bool: True if call successful, False if not; + - dict: A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, where device_id is the device ID + for this device and device_event. + The known devices's device_id and device_event was defined as table below. + ----------------------------------------------------------------- + device | device_id | device_event | annotate + ----------------------------------------------------------------- + 'fan' '' '0' Fan removed + '1' Fan inserted + 'sfp' '' '0' Sfp removed + '1' Sfp inserted + '2' I2C bus stuck + '3' Bad eeprom + '4' Unsupported cable + '5' High Temperature + '6' Bad cable + 'voltage' '' '0' Vout normal + '1' Vout abnormal + -------------------------------------------------------------------- + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'}, + 'voltage':{'U20':'0', 'U21':'1'}} + Indicates that: + fan 0 has been removed, fan 2 has been inserted. + sfp 11 has been removed, sfp 12 has been inserted. + monitored voltage U20 became normal, voltage U21 became abnormal. + Note: For sfp, when event 3-6 happened, the module will not be avalaible, + XCVRD shall stop to read eeprom before SFP recovered from error status. + """ + + change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}} + + start_time = time.time() + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_change_event:Invalid timeout value", timeout) + return False, change_event_dict + + end_time = start_time + timeout + if start_time > end_time: + print( + "get_change_event:" "time wrap / invalid timeout value", + timeout, + ) + return False, change_event_dict # Time wrap or possibly incorrect timeout + try: + while timeout >= 0: + # check for sfp + sfp_change_dict = self.get_transceiver_change_event() + # check for fan + # fan_change_dict = self.get_fan_change_event() + # check for voltage + # voltage_change_dict = self.get_voltage_change_event() + + if sfp_change_dict: + change_event_dict["sfp"] = sfp_change_dict + # change_event_dict["fan"] = fan_change_dict + # change_event_dict["voltage"] = voltage_change_dict + return True, change_event_dict + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_event_dict + except Exception as e: + print(e) + print("get_change_event: Should not reach here.") + return False, change_event_dict + + def get_transceiver_change_event(self): + current_port_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index in range(self.platform_inventory['num_ports']): + if self._sfp_list[index].get_presence(): + current_port_dict[index] = self.STATUS_INSERTED + else: + current_port_dict[index] = self.STATUS_REMOVED + + if len(self.port_dict) == 0: # first time + self.port_dict = current_port_dict + return {} + + if current_port_dict == self.port_dict: + return {} + + # Update reg value + for index, status in current_port_dict.items(): + if self.port_dict[index] != status: + ret_dict[index] = status + #ret_dict[str(index)] = status + self.port_dict = current_port_dict + for index, status in ret_dict.items(): + if int(status) == 1: + pass + #self._sfp_list[int(index)].check_sfp_optoe_type() + return ret_dict diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py new file mode 100644 index 000000000000..0355e0762144 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py @@ -0,0 +1,113 @@ +############################################################################# +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +BMC_CMDS = { + "VER1": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f1", + "VER2": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f2", + "VER3": "echo $((`ipmitool mc info | grep 'Aux Firmware Rev Info' -A 2 | sed -n '2p'` + 0))", +} + +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("BIOS", "Basic Input/Output System"), + ("BMC", "BMC"), + +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + self.index = component_index + self.name = self.get_name() + + def _run_command(self, command): + # Run bash command and print output to stdout + try: + process = subprocess.Popen( + shlex.split(command), stdout=subprocess.PIPE) + while True: + output = process.stdout.readline() + if output == '' and process.poll() is not None: + break + rc = process.poll() + if rc != 0: + return False + except Exception: + return False + return True + + def _get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def _get_bmc_version(self): + # Retrieves the BMC firmware version + bmc_ver = dict() + for ver in BMC_CMDS: + status, value = subprocess.getstatusoutput(BMC_CMDS[ver]) + if not status: + bmc_ver[ver] = int(value.rstrip()) + else: + return None + + bmc_version = "{}.{}.{}".format(bmc_ver["VER1"], bmc_ver["VER2"], bmc_ver["VER3"]) + + return bmc_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self._get_bios_version() + elif self.name == "BMC": + fw_version = self._get_bmc_version() + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py new file mode 100644 index 000000000000..a87ecc9f6feb --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(PddfEeprom): + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py new file mode 100644 index 000000000000..40bfb40a01a8 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan import PddfFan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Fan(PddfFan): + """PDDF Platform-Specific Fan class""" + + def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): + # idx is 0-based + PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten + # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed_percentage = 0 + if self.is_psu_fan: + attr = "psu_fan{}_speed_rpm".format(self.fan_index) + device = "PSU{}".format(self.fans_psu_index) + max_speed = int(self.plugin_data['PSU']['PSU_FAN_MAX_SPEED']) + else: + if self.fan_index == 1: + pos = "f" + max_speed = int(self.plugin_data['FAN']['FAN_F_MAX_SPEED']) + else: + pos = "r" + max_speed = int(self.plugin_data['FAN']['FAN_R_MAX_SPEED']) + attr = "fan{}_{}_speed_rpm".format(self.fantray_index, pos) + device = "FAN-CTRL" + + output = self.pddf_obj.get_attr_name_output(device, attr) + if not output: + return speed_percentage + + output['status'] = output['status'].rstrip() + if output['status'].isalpha(): + return speed_percentage + else: + speed = int(float(output['status'])) + + speed_percentage = round((speed*100)/max_speed) + + return min(speed_percentage, 100) + + def get_speed_rpm(self): + """ + Retrieves the speed of fan in RPM + + Returns: + An integer, Speed of fan in RPM + """ + rpm_speed = 0 + if self.is_psu_fan: + attr = "psu_fan{}_speed_rpm".format(self.fan_index) + device = "PSU{}".format(self.fans_psu_index) + else: + if self.fan_index == 1: + pos = "f" + else: + pos = "r" + attr = "fan{}_{}_speed_rpm".format(self.fantray_index, pos) + device = "FAN-CTRL" + + output = self.pddf_obj.get_attr_name_output(device, attr) + + if output is None: + return rpm_speed + + output['status'] = output['status'].rstrip() + if output['status'].isalpha(): + return rpm_speed + else: + rpm_speed = int(float(output['status'])) + + return rpm_speed + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + + return self.FAN_DIRECTION_EXHAUST + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + presence = False + if self.is_psu_fan: + attr = "psu_present" + device = "PSU{}".format(self.fans_psu_index) + else: + attr = "fan{}_present".format(self.fantray_index) + device = "FAN-CTRL" + + output = self.pddf_obj.get_attr_name_output(device, attr) + if not output: + return presence + + + mode = output['mode'] + val = output['status'].strip() + vmap = self.plugin_data['FAN']['present'][mode]['valmap'] + + if val in vmap: + presence = vmap[val] + + return presence + + def get_status(self): + """ + Retrieves the operational status of the device + + Returns: + A boolean value, True if device is operating properly, False if not + """ + speed = self.get_speed_rpm() + status = True if (speed != 0) else False + return status + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + + return self.get_speed() + diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py new file mode 100644 index 000000000000..406b1179ae1b --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + + +try: + from sonic_platform_pddf_base.pddf_platform import PddfPlatform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PddfPlatform): + """ + PDDF Platform-Specific Platform Class + """ + + def __init__(self): + PddfPlatform.__init__(self) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py new file mode 100644 index 000000000000..3d84a4a39c1b --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_psu import PddfPsu +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Psu(PddfPsu): + """PDDF Platform-Specific PSU class""" + + PLATFORM_PSU_CAPACITY = 550 + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU (or PSU capacity) + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(self.PLATFORM_PSU_CAPACITY) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + + # power is returned in micro watts + return float(self.get_voltage()*self.get_current()) diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py new file mode 100644 index 000000000000..d9b6e491bef4 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_sfp import PddfSfp +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Sfp(PddfSfp): + """ + PDDF Platform-Specific Sfp class + """ + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py new file mode 100644 index 000000000000..77d6ec7ae886 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_thermal import PddfThermal +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + + +class Thermal(PddfThermal): + """PDDF Platform-Specific Thermal class""" + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py new file mode 100644 index 000000000000..88660b1a1faa --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of platform specific watchdog API's +# +############################################################################# + +try: + from sonic_platform_pddf_base.pddf_watchdog import PddfWatchdog +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Watchdog(PddfWatchdog): + """ + PDDF Platform-specific Chassis class + """ + + def __init__(self): + PddfWatchdog.__init__(self) + self.timeout= 180 + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py new file mode 100644 index 000000000000..3661c84a0cd6 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py @@ -0,0 +1,27 @@ +from setuptools import setup + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on ufispace platform', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='Leo Lin', + maintainer_email='leo.yt.lin@ufispace.com', + packages=['sonic_platform'], + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh new file mode 100755 index 000000000000..d54ff14d7151 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# init Host GPIO 0x74 +i2cset -f -y -r 0 0x74 4 0x00 +i2cset -f -y -r 0 0x74 5 0x00 +i2cset -f -y -r 0 0x74 2 0x0F +i2cset -f -y -r 0 0x74 3 0xDF +i2cset -f -y -r 0 0x74 6 0x08 +i2cset -f -y -r 0 0x74 7 0x1F + +gpio_base=511 + +# gpio sysfs active_low - ABS Port 0-31 +# gpio 480-511 +start=$((gpio_base-31)) +end=$gpio_base +for (( i=$start; i<=$end; i++ )) +do + echo 1 > /sys/class/gpio/gpio${i}/active_low +done + +# gpio sysfs active_low - Intr Port 0-31 +# gpio 448-479 +start=$((gpio_base-63)) +end=$((gpio_base-32)) +for (( i=$start; i<=$end; i++ )) +do + echo 1 > /sys/class/gpio/gpio${i}/active_low +done + + +# gpio sysfs active_low - SFP Port +# gpio 432-447 +sfp_active_low_array=(1 1 1 1 0 0 1 1 \ + 0 0 0 0 1 1 1 1) +start=$((gpio_base-79)) +end=$((gpio_base-64)) +for (( i=$start; i<=$end; i++ )) +do + echo ${sfp_active_low_array[$((i-start))]} > /sys/class/gpio/gpio${i}/active_low +done + +# gpio sysfs active_low - LP Mode Mode Port 0-31 +# gpio 400-431 +start=$((gpio_base-111)) +end=$((gpio_base-80)) +for (( i=$start; i<=$end; i++ )) +do + echo 0 > /sys/class/gpio/gpio${i}/active_low +done + +# gpio sysfs active_low - RST Mode Port 0-31 +# gpio 368-399 +start=$((gpio_base-143)) +end=$((gpio_base-112)) +for (( i=$start; i<=$end; i++ )) +do + echo 1 > /sys/class/gpio/gpio${i}/active_low + echo 0 > /sys/class/gpio/gpio${i}/value +done + +# init QSFP port name +qsfp_bus_array=(10 9 12 11 14 13 16 15 18 17 \ + 20 19 22 21 24 23 26 25 28 27 \ + 30 29 32 31 34 33 36 35 38 37 \ + 40 39) +for i in {0..31}; +do + echo $((i + 1)) > /sys/bus/i2c/devices/${qsfp_bus_array[i]}-0050/port_name + #echo "echo $((i + 1)) > /sys/bus/i2c/devices/${qsfp_bus_array[i]}-0050/port_name" +done + +# init SFP port name +sfp_bus_array=(45 46) +for i in {0..1}; +do + echo $((i + 33)) > /sys/bus/i2c/devices/${sfp_bus_array[i]}-0050/port_name +done + +# _mac_vdd_init +# vid to mac vdd value mapping +vdd_val_array=( 0.85 0.82 0.77 0.87 0.74 0.84 0.79 0.89 ) +# vid to rov reg value mapping +rov_reg_array=( 0x24 0x21 0x1C 0x26 0x19 0x23 0x1E 0x28 ) + +reg_val=$(eval "i2cget -f -y 44 0x33 0x42 2>/dev/null") +vid=$(($reg_val & 0x7)) +mac_vdd_val=${vdd_val_array[vid]} +rov_reg=${rov_reg_array[vid]} +i2cset -f -y -r 8 0x22 0x21 ${rov_reg} w 2>/dev/null + +echo "PDDF device post-create completed" + diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh new file mode 100755 index 000000000000..ed2559977e42 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "PDDF driver post-install completed" diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh new file mode 100755 index 000000000000..a82d23333b4f --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh @@ -0,0 +1,5 @@ +#!/bin/bash +#rmmod gpio_ich +modprobe -rq i2c_i801 +modprobe -rq i2c_smbus +echo "PDDF driver pre-install completed" diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py new file mode 100755 index 000000000000..f2b3645ba6c0 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# Script to stop and start the respective platforms default services. +# This will be used while switching the pddf->non-pddf mode and vice versa +import commands + +def check_pddf_support(): + return True + +def stop_platform_svc(): + + ''' + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py deinit") + if status: + print "platform_utility.py deinit command failed %d"%status + return False + ''' + + # HACK , stop the pddf-platform-init service if it is active + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service along with other platform serives failed %d"%status + return False + + return True + +def start_platform_svc(): + + ''' + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py init") + if status: + print "platform_utility.py init command failed %d"%status + return False + + return True + ''' + return True + +def start_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") + if status: + print "Start pddf-platform-init.service failed %d"%status + return False + + return True + +def stop_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service failed %d"%status + return False + + return True + diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh new file mode 100755 index 000000000000..2509e36929af --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +service swss restart +echo "SWSS service restarted" + diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh new file mode 100755 index 000000000000..63a2e205808e --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh @@ -0,0 +1,5 @@ +#!/bin/bash +#rmmod gpio_ich +modprobe -rq i2c_i801 +modprobe -rq i2c_smbus +echo "Pre PDDF init steps completed successully" From 10b65d9826f558ce26ede0fde2a935669baa0183 Mon Sep 17 00:00:00 2001 From: lixiaoyuner <35456895+lixiaoyuner@users.noreply.github.com> Date: Tue, 25 Jul 2023 07:44:59 +0800 Subject: [PATCH 055/145] Add k8s master code new (#15716) Why I did it Currently, k8s master image is generated from a separate branch which we created by ourselves, not release ones. We need to commit these k8s master related code to master branch for a better way to do k8s master image build out. Work item tracking Microsoft ADO (number only): 19998138 How I did it Install k8s dashboard docker images Install geneva mds and mdsd and fluentd docker images and tag them as latest, tagging latest will help create container always with the latest version Install azure-storage-blob and azure-identity, this will help do etcd backup and restore. Install kubernetes python client packages, this will help read worker and container state, we can send these metric to Geneva. Remove mdm debian package, will replace it with the mdm docker image Add k8s master entrance script, this script will be called by rc-local service when system startup. we have some master systemd services in compute-move repo, when VMM service create master VM, VMM will copy all master service files inside VM, the entrance script will setup all services according to the service files. When the entrance script content changed, the PR build will set include_kubernetes_master=y to help do validation for k8s master related code change. The default value of include_kubernetes_master should be always n for public master branch. We will generate master image from internal master branch How to verify it Build with INCLUDE_KUBERNETES_MASTER = y --- .azure-pipelines/azure-pipelines-build.yml | 4 ++ .azure-pipelines/template-skipvstest.yml | 7 +++ build_debian.sh | 9 ---- .../build_templates/sonic_debian_extension.j2 | 20 +++++++-- .../kubernetes_master_entrance.service | 13 ++++++ .../kubernetes/kubernetes_master_entrance.sh | 45 +++++++++++++++++++ rules/config | 13 +++++- slave.mk | 5 +++ 8 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 files/image_config/kubernetes/kubernetes_master_entrance.service diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index 67cfeaca95f4..df51700c4f20 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -130,6 +130,10 @@ jobs: make $BUILD_OPTIONS ENABLE_ASAN=y target/docker-sonic-vs.gz mv target/docker-sonic-vs.gz target/docker-sonic-vs-asan.gz fi + if [ $(K8S_OPTIONS) == 'INCLUDE_KUBERNETES_MASTER=y' ]; then + make $BUILD_OPTIONS $(K8S_OPTIONS) target/sonic-vs.img.gz + mv target/sonic-vs.img.gz target/sonic-vs-k8s.img.gz + fi make $BUILD_OPTIONS target/docker-sonic-vs.gz target/sonic-vs.img.gz target/docker-ptf.gz make $BUILD_OPTIONS target/docker-ptf-sai.gz if [ $(Build.Reason) != 'PullRequest' ];then diff --git a/.azure-pipelines/template-skipvstest.yml b/.azure-pipelines/template-skipvstest.yml index b47f17ce6e81..90d6fb6f7b49 100644 --- a/.azure-pipelines/template-skipvstest.yml +++ b/.azure-pipelines/template-skipvstest.yml @@ -3,6 +3,13 @@ steps: - script: | set -ex tar_branch=origin/$(System.PullRequest.TargetBranch) + # Check if k8s master entrance script is changed + k8s_master_changed=$(git diff $tar_branch..HEAD --name-only | grep -F files/image_config/kubernetes/kubernetes_master_entrance.sh) + if [ -z "$k8s_master_changed" ]; then + echo "##vso[task.setvariable variable=K8S_OPTIONS;]INCLUDE_KUBERNETES_MASTER=n" + else + echo "##vso[task.setvariable variable=K8S_OPTIONS;]INCLUDE_KUBERNETES_MASTER=y" + fi git diff $tar_branch..HEAD --name-only | grep -v -f .azure-pipelines/vstest-exclude && exit 0 git diff $tar_branch..HEAD --name-only | grep -f .azure-pipelines/vstest-include && exit 0 set +x diff --git a/build_debian.sh b/build_debian.sh index f71bdd9fd0fb..d04b8d0b3c17 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -295,17 +295,8 @@ then echo '[INFO] Install kubernetes master' install_kubernetes ${MASTER_KUBERNETES_VERSION} - sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -fsSL \ - https://packages.microsoft.com/keys/microsoft.asc | \ - sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - - sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -fsSL \ - https://packages.microsoft.com/keys/msopentech.asc | \ - sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - - echo "deb [arch=amd64] https://packages.microsoft.com/repos/azurecore-debian $IMAGE_DISTRO main" | \ - sudo tee $FILESYSTEM_ROOT/etc/apt/sources.list.d/azure.list sudo LANG=C chroot $FILESYSTEM_ROOT apt-get update sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install hyperv-daemons gnupg xmlstarlet - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install metricsext2 sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y remove gnupg sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -o /tmp/cri-dockerd.deb -fsSL \ https://github.com/Mirantis/cri-dockerd/releases/download/v${MASTER_CRI_DOCKERD}/cri-dockerd_${MASTER_CRI_DOCKERD}.3-0.debian-${IMAGE_DISTRO}_amd64.deb diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 29510542a2f2..d8399d25cb46 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -790,15 +790,27 @@ sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIV sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/kube-proxy:${MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION} sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/coredns/coredns:${MASTER_COREDNS_VERSION} sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/etcd:${MASTER_ETCD_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull kubernetesui/metrics-scraper:${MASTER_UI_METRIC_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull kubernetesui/dashboard:${MASTER_UI_DASH_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull linuxgeneva-microsoft.azurecr.io/distroless/genevamdm:${MASTER_MDM_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS tag linuxgeneva-microsoft.azurecr.io/distroless/genevamdm:${MASTER_MDM_VERSION} linuxgeneva-microsoft.azurecr.io/distroless/genevamdm:latest +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull linuxgeneva-microsoft.azurecr.io/distroless/genevamdsd:${MASTER_MDS_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS tag linuxgeneva-microsoft.azurecr.io/distroless/genevamdsd:${MASTER_MDS_VERSION} linuxgeneva-microsoft.azurecr.io/distroless/genevamdsd:latest +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull linuxgeneva-microsoft.azurecr.io/distroless/genevafluentd_td-agent:${MASTER_FLUENTD_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS tag linuxgeneva-microsoft.azurecr.io/distroless/genevafluentd_td-agent:${MASTER_FLUENTD_VERSION} linuxgeneva-microsoft.azurecr.io/distroless/genevafluentd_td-agent:latest echo "kubernetes master docker images pull complete" -# Install python package for mdm service usage +# Install python packages for mdm metrics collection service usage sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install psutil sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install statsd -sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable mdm.service +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install kubernetes +# Install python packages to upload and download etcd backup files for backup and restore service usage +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install azure-storage-blob azure-identity sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable kubelet.service # Add kubernetes master entrance -sudo cp files/image_config/kubernetes/kubernetes_master_entrance.sh $FILESYSTEM_ROOT/usr/sbin/ -sudo sed -i '/^exit 0/i\bash /usr/sbin/kubernetes_master_entrance.sh' $FILESYSTEM_ROOT/etc/rc.local +sudo cp files/image_config/kubernetes/kubernetes_master_entrance.service ${FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM}/ +sudo cp files/image_config/kubernetes/kubernetes_master_entrance.sh $FILESYSTEM_ROOT/usr/bin/ +sudo chmod +x $FILESYSTEM_ROOT/usr/bin/kubernetes_master_entrance.sh +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable kubernetes_master_entrance.service {% endif %} {% macro get_install_options(set_owner, enabled) -%} diff --git a/files/image_config/kubernetes/kubernetes_master_entrance.service b/files/image_config/kubernetes/kubernetes_master_entrance.service new file mode 100644 index 000000000000..3f407cf618ae --- /dev/null +++ b/files/image_config/kubernetes/kubernetes_master_entrance.service @@ -0,0 +1,13 @@ +[Unit] +Description=Setup k8s master services +Requires=rc-local.service +After=rc-local.service +Before=sonic.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/bin/kubernetes_master_entrance.sh + +[Install] +WantedBy=multi-user.target diff --git a/files/image_config/kubernetes/kubernetes_master_entrance.sh b/files/image_config/kubernetes/kubernetes_master_entrance.sh index b7695a61cae5..d73f4c4cb13c 100644 --- a/files/image_config/kubernetes/kubernetes_master_entrance.sh +++ b/files/image_config/kubernetes/kubernetes_master_entrance.sh @@ -1,2 +1,47 @@ +#!/bin/bash + # This script is for kubernetes master image usage # Will mount kubernetes master disk and execute kubernetes entrance script + +set -x + +# mount disk from host +mount_point="/from_host" +disk_by_path_dir="/dev/disk/by-path" +# We can't ensure the mounted disk name is sda or sdb +# Currently we specify the disk logic unit number to 2 when create master VM +# We find the correct disk by the disk logic unit number from by-path directory +target_str="lun-2-part1" +disk_path_file=$(ls $disk_by_path_dir | grep $target_str) + +# Check whether the disk path file exists +if [ -z "$disk_path_file" ]; then + echo "Error: Disk path file not found." + exit 1 +fi + +# Check the number of lines returned +line_count=$(echo "$disk_path_file" | wc -l) + +# If there are multiple lines, exit with status 1 +if [ "$line_count" -ne 1 ]; then + echo "Error: multiple disk path files found." + exit 1 +fi + +disk="${disk_by_path_dir}/${disk_path_file}" +mkdir -p $mount_point +mount $disk $mount_point + +# check whether it is the first time to boot +first_boot_flag_file="/from_host/first_boot_flag" +if [ -f $first_boot_flag_file ]; then + exit 0 +fi +touch $first_boot_flag_file + +# execute entrance script +init_file_name="entrance.sh" +init_file=${mount_point}/${init_file_name} +chmod +x $init_file +source $init_file diff --git a/rules/config b/rules/config index 04a5b53584d1..801ab9f79e0f 100644 --- a/rules/config +++ b/rules/config @@ -199,12 +199,23 @@ INCLUDE_KUBERNETES_MASTER ?= n # MASTER_PAUSE_VERSION - version of pause container image # MASTER_COREDNS_VERSION - version of coredns container image # MASTER_ETCD_VERSION = version of etcd container image +# MASTER_CRI_DOCKERD = version of cri-dockerd container image +# MASTER_UI_METRIC_VERSION = version of k8s metrics server container image +# MASTER_UI_DASH_VERSION = version of k8s dashboard container image +# MASTER_MDM_VERSION = version of mdm container image +# MASTER_MDS_VERSION = version of mds container image +# MASTER_FLUENTD_VERSION = version of fluentd container image MASTER_KUBERNETES_VERSION = 1.22.2-00 MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION = v1.22.2 MASTER_PAUSE_VERSION = 3.5 MASTER_COREDNS_VERSION = v1.8.4 MASTER_ETCD_VERSION = 3.5.0-0 -MASTER_CRI_DOCKERD = 0.2.5 +MASTER_CRI_DOCKERD = 0.3.1 +MASTER_UI_METRIC_VERSION = v1.0.8 +MASTER_UI_DASH_VERSION = v2.7.0 +MASTER_MDM_VERSION = 2.2023.505.1124-45da18-20230505t1700 +MASTER_MDS_VERSION = mariner_20230517.1 +MASTER_FLUENTD_VERSION = mariner_20230517.1 # SONIC_ENABLE_IMAGE_SIGNATURE - enable image signature # To not use the auto-generated self-signed certificate, the required files to sign the image as below: diff --git a/slave.mk b/slave.mk index 045b3d076aff..300f6d3ff98b 100644 --- a/slave.mk +++ b/slave.mk @@ -1448,6 +1448,11 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ MASTER_COREDNS_VERSION=$(MASTER_COREDNS_VERSION) \ MASTER_ETCD_VERSION=$(MASTER_ETCD_VERSION) \ MASTER_CRI_DOCKERD=$(MASTER_CRI_DOCKERD) \ + MASTER_UI_METRIC_VERSION=$(MASTER_UI_METRIC_VERSION) \ + MASTER_UI_DASH_VERSION=$(MASTER_UI_DASH_VERSION) \ + MASTER_MDM_VERSION=$(MASTER_MDM_VERSION) \ + MASTER_MDS_VERSION=$(MASTER_MDS_VERSION) \ + MASTER_FLUENTD_VERSION=$(MASTER_FLUENTD_VERSION) \ ./build_debian.sh $(LOG) USERNAME="$(USERNAME)" \ From e0927e28afab044b1669fe4779458734044d2a3d Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 24 Jul 2023 17:05:03 -0700 Subject: [PATCH 056/145] Update sairedis submodule (#15720) This submodule update needs to be manually done due to build changes done in the sairedis submodule. Specifically, Debian build profiles are now being used instead of dpkg build targets, and dbgsym packages are being used instead of dbg packages. Because of this, there needs to be changes on the sonic-buildimage side for this. This submodule update brings in the following changes: ce8f642 [vs] Use boost join to concatenate switch types in config (#1266) d6055a2 [vslib]: Temporaily map DPU switch type to NVDA_MBF2H536C (#1259) e1cdb4d [CodeQL]: Use dependencies with relevant versions in azp template. (#1262) c08f9a2 [CI]: Fix collect log error in azp template. (#1260) eed856c [CodeQL]: Fix syncd compilation in azp template. (#1261) a3f1f1a Reland 'Make changes to building and packaging sairedis (#1116)' (#1194) Signed-off-by: Saikrishna Arcot --- platform/vs/syncd-vs.mk | 10 +++++----- rules/sairedis.mk | 25 ++++++++++++------------- rules/syncd.mk | 20 ++++++++++---------- src/sonic-sairedis | 2 +- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/platform/vs/syncd-vs.mk b/platform/vs/syncd-vs.mk index 22b34fbcaae3..6ff00a3508b9 100644 --- a/platform/vs/syncd-vs.mk +++ b/platform/vs/syncd-vs.mk @@ -1,10 +1,10 @@ -$(LIBSAIREDIS)_DPKG_TARGET = binary-syncd-vs +$(LIBSAIREDIS)_DEB_BUILD_PROFILES += syncd vs SYNCD_VS = syncd-vs_1.0.0_amd64.deb $(SYNCD_VS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBSAIVS) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS))) -SYNCD_VS_DBG = syncd-vs-dbg_1.0.0_amd64.deb -$(SYNCD_VS_DBG)_DEPENDS += $(SYNCD_VS) -$(SYNCD_VS_DBG)_RDEPENDS += $(SYNCD_VS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS_DBG))) +SYNCD_VS_DBGSYM = syncd-vs-dbgsym_1.0.0_amd64.deb +$(SYNCD_VS_DBGSYM)_DEPENDS += $(SYNCD_VS) +$(SYNCD_VS_DBGSYM)_RDEPENDS += $(SYNCD_VS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS_DBGSYM))) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 73ea1366bb92..163e9b797645 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -4,7 +4,6 @@ LIBSAIREDIS_VERSION = 1.0.0 LIBSAIREDIS_NAME = libsairedis LIBSAIREDIS = $(LIBSAIREDIS_NAME)_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIREDIS)_DPKG_TARGET = binary-sairedis $(LIBSAIREDIS)_SRC_PATH = $(SRC_PATH)/sonic-sairedis $(LIBSAIREDIS)_VERSION = $(LIBSAIREDIS_VERSION) $(LIBSAIREDIS)_NAME = $(LIBSAIREDIS_NAME) @@ -30,20 +29,20 @@ LIBSAIMETADATA_DEV = libsaimetadata-dev_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH $(LIBSAIMETADATA_DEV)_DEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DEV))) -LIBSAIREDIS_DBG = $(LIBSAIREDIS_NAME)-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIREDIS_DBG)_DEPENDS += $(LIBSAIREDIS) -$(LIBSAIREDIS_DBG)_RDEPENDS += $(LIBSAIREDIS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBG))) +LIBSAIREDIS_DBGSYM = $(LIBSAIREDIS_NAME)-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIREDIS_DBGSYM)_DEPENDS += $(LIBSAIREDIS) +$(LIBSAIREDIS_DBGSYM)_RDEPENDS += $(LIBSAIREDIS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBGSYM))) -LIBSAIVS_DBG = libsaivs-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIVS_DBG)_DEPENDS += $(LIBSAIVS) -$(LIBSAIVS_DBG)_RDEPENDS += $(LIBSAIVS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBG))) +LIBSAIVS_DBGSYM = libsaivs-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIVS_DBGSYM)_DEPENDS += $(LIBSAIVS) +$(LIBSAIVS_DBGSYM)_RDEPENDS += $(LIBSAIVS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBGSYM))) -LIBSAIMETADATA_DBG = libsaimetadata-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIMETADATA_DBG)_DEPENDS += $(LIBSAIMETADATA) -$(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) +LIBSAIMETADATA_DBGSYM = libsaimetadata-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIMETADATA_DBGSYM)_DEPENDS += $(LIBSAIMETADATA) +$(LIBSAIMETADATA_DBGSYM)_RDEPENDS += $(LIBSAIMETADATA) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBGSYM))) ifeq ($(ENABLE_PY2_MODULES), n) $(LIBSAIREDIS)_DEB_BUILD_PROFILES += nopython2 diff --git a/rules/syncd.mk b/rules/syncd.mk index 6aa3e990843a..2f5cce6cebff 100644 --- a/rules/syncd.mk +++ b/rules/syncd.mk @@ -4,7 +4,7 @@ ifneq ($(CONFIGURED_PLATFORM),vs) SYNCD = syncd_1.0.0_$(CONFIGURED_ARCH).deb $(SYNCD)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) -$(SYNCD)_DPKG_TARGET = binary-syncd +$(SYNCD)_DEB_BUILD_PROFILES += syncd $(SYNCD)_SRC_PATH = $(SRC_PATH)/sonic-sairedis $(SYNCD)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBSAIREDIS) $(SYNCD)_RDEPENDS += $(LIBSWSSCOMMON) @@ -18,19 +18,19 @@ $(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC))) # Inject libthrift build dependency for RPC build $(SYNCD)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBTHRIFT_DEV) -$(SYNCD)_DPKG_TARGET = binary-syncd-rpc +$(SYNCD)_DEB_BUILD_PROFILES += rpc endif -SYNCD_DBG = syncd-dbg_1.0.0_$(CONFIGURED_ARCH).deb -$(SYNCD_DBG)_DEPENDS += $(SYNCD) -$(SYNCD_DBG)_RDEPENDS += $(SYNCD) -$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_DBG))) +SYNCD_DBGSYM = syncd-dbgsym_1.0.0_$(CONFIGURED_ARCH).deb +$(SYNCD_DBGSYM)_DEPENDS += $(SYNCD) +$(SYNCD_DBGSYM)_RDEPENDS += $(SYNCD) +$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_DBGSYM))) ifeq ($(ENABLE_SYNCD_RPC),y) -SYNCD_RPC_DBG = syncd-rpc-dbg_1.0.0_$(CONFIGURED_ARCH).deb -$(SYNCD_RPC_DBG)_DEPENDS += $(SYNCD_RPC) -$(SYNCD_RPC_DBG)_RDEPENDS += $(SYNCD_RPC) -$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBG))) +SYNCD_RPC_DBGSYM = syncd-rpc-dbgsym_1.0.0_$(CONFIGURED_ARCH).deb +$(SYNCD_RPC_DBGSYM)_DEPENDS += $(SYNCD_RPC) +$(SYNCD_RPC_DBGSYM)_RDEPENDS += $(SYNCD_RPC) +$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBGSYM))) endif ifeq ($(ENABLE_PY2_MODULES), n) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 14a863a6d8f2..ce8f642271ce 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 14a863a6d8f2855a7cebf1b7e62bc46dbed76ff6 +Subproject commit ce8f642271cee813805d6879041dbcf0c0dac381 From dc139cfc324cc15e5c0bc8c7c7d81176b04b417d Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Tue, 25 Jul 2023 12:16:49 +0800 Subject: [PATCH 057/145] [monit][dualtor] Periodically check mux neighbors consistency (#15769) Signed-off-by: Longxiang Lyu --- files/image_config/monit/conf.d/sonic-host | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/files/image_config/monit/conf.d/sonic-host b/files/image_config/monit/conf.d/sonic-host index d65325207543..482a992b6df7 100644 --- a/files/image_config/monit/conf.d/sonic-host +++ b/files/image_config/monit/conf.d/sonic-host @@ -31,6 +31,13 @@ check program routeCheck with path "/usr/local/bin/route_check.py" every 5 cycles if status != 0 for 3 cycle then alert repeat every 1 cycles +# dualtor_neighbor_check.py: script to check if the neighbor entries in APPL_DB +# has correct neighbor or tunnel route entries in ASIC_DB based on the mux +# states. +check program dualtorNeighborCheck with path "/usr/local/bin/dualtor_neighbor_check.py -o SYSLOG -s ERROR" + every 5 cycles + if status != 0 for 3 cycle then alert repeat every 1 cycles + # Check if /etc & /home are writable. If not, make them writable. # Raise syslog error message, in case of underlying issues # From 104ae5d185110af8e884fa1bf0d261f4b0cd9798 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Tue, 25 Jul 2023 18:24:57 +0800 Subject: [PATCH 058/145] [ci] Fix pipeline 'Check if vstest is needed.' issue. (#15958) Why I did it Line:7 will exit when k8s file didn't change. Use 'System.PullRequest.TargetBranchName' instead of 'System.PullRequest.TargetBranch'. Because git server in AzDevOps don't support 'System.PullRequest.TargetBranch'. Work item tracking Microsoft ADO (number only): 24636791 How I did it How to verify it --- .azure-pipelines/template-skipvstest.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.azure-pipelines/template-skipvstest.yml b/.azure-pipelines/template-skipvstest.yml index 90d6fb6f7b49..ca968d009c94 100644 --- a/.azure-pipelines/template-skipvstest.yml +++ b/.azure-pipelines/template-skipvstest.yml @@ -2,10 +2,9 @@ steps: - ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: - script: | set -ex - tar_branch=origin/$(System.PullRequest.TargetBranch) + tar_branch=origin/$(System.PullRequest.TargetBranchName) # Check if k8s master entrance script is changed - k8s_master_changed=$(git diff $tar_branch..HEAD --name-only | grep -F files/image_config/kubernetes/kubernetes_master_entrance.sh) - if [ -z "$k8s_master_changed" ]; then + if ! git diff $tar_branch..HEAD --name-only | grep -F files/image_config/kubernetes/kubernetes_master_entrance.sh; then echo "##vso[task.setvariable variable=K8S_OPTIONS;]INCLUDE_KUBERNETES_MASTER=n" else echo "##vso[task.setvariable variable=K8S_OPTIONS;]INCLUDE_KUBERNETES_MASTER=y" From 47742dfc2c0d1fa27198d69c9183ddc044e11b22 Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Wed, 26 Jul 2023 01:03:36 +0800 Subject: [PATCH 059/145] [YANG][vlan-sub-interface] Add `vlan` field (#15838) * [YANG][vlan-sub-interface] Add `vlan` field Signed-off-by: Longxiang Lyu * Fix typo Signed-off-by: Longxiang Lyu * Fix UT Signed-off-by: Longxiang Lyu --------- Signed-off-by: Longxiang Lyu --- .../tests/files/sample_config_db.json | 6 ++- .../tests/vlan_sub_interface.json | 4 ++ .../tests_config/vlan_sub_interface.json | 44 +++++++++++++++++-- .../yang-models/sonic-vlan-sub-interface.yang | 14 ++++++ 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 0bb7a9fbfaee..37296d0d42d9 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1098,12 +1098,14 @@ "Ethernet12.10|10.0.1.56/31": {}, "Ethernet12.10|fc00::1:71/126": {}, "Po0003.10": { - "admin_status": "up" + "admin_status": "up", + "vlan": "10" }, "Po0003.10|10.0.1.58/31": {}, "Po0003.10|fc00::1:75/126": {}, "Eth120.10": { - "admin_status": "up" + "admin_status": "up", + "vlan": "10" }, "Eth120.10|10.0.1.60/31": {}, "Eth120.10|fc00::1:79/126": {} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json index b91c8a94f386..52b3968d5d9f 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json @@ -55,5 +55,9 @@ "desc": "INCORRECT LOOPBACK ACTION IN VLAN_SUB_INTERFACE TABLE.", "eStrKey" : "Pattern", "eStr": ["drop|forward"] + }, + "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_VLAN_CHECK_MUST_CONDITION_FALSE_TEST": { + "desc": "Configure valid short name format vlan sub interface vlan must check condition false.", + "eStrKey": "Must" } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json index 6f200ef4b7ea..bb3ba554e4eb 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json @@ -36,7 +36,8 @@ "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { "VLAN_SUB_INTERFACE_LIST": [ { - "name": "Eth8.10" + "name": "Eth8.10", + "vlan": 10 } ], "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ @@ -132,7 +133,8 @@ "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { "VLAN_SUB_INTERFACE_LIST": [ { - "name": "Eth8.10" + "name": "Eth8.10", + "vlan": 10 } ], "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ @@ -164,7 +166,8 @@ "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { "VLAN_SUB_INTERFACE_LIST": [ { - "name": "Po0001.10" + "name": "Po0001.10", + "vlan": 10 } ], "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ @@ -305,7 +308,8 @@ "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { "VLAN_SUB_INTERFACE_LIST": [ { - "name": "Po0002.10" + "name": "Po0002.10", + "vlan": 10 } ], "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ @@ -533,5 +537,37 @@ ] } } + }, + "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_VLAN_CHECK_MUST_CONDITION_FALSE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "Eth8.10" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "Eth8.10", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "admin_status": "up", + "alias": "Ethernet8/1", + "description": "Ethernet8", + "lanes": "45,46,47,48", + "mtu": 9000, + "speed": 100000 + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang index 5a7f02c75143..37e5f47a104c 100644 --- a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang +++ b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang @@ -37,6 +37,14 @@ module sonic-vlan-sub-interface { description "VLAN_SUB_INTERFACE part of config_db.json with vrf"; + // encap vlan is mandatory for short name subinterfaces + must "(substring-before(name, '.') = /port:sonic-port/port:PORT/port:PORT_LIST/port:name) or " + + "(substring-before(name, '.') = /lag:sonic-portchannel/lag:PORTCHANNEL/lag:PORTCHANNEL_LIST/lag:name) or " + + "vlan" + { + error-message "Must condition not satisfied, no encap vlan provided for short-name format vlan sub interface"; + } + key "name"; leaf name { @@ -70,6 +78,12 @@ module sonic-vlan-sub-interface { description "Packet action when a packet ingress and gets routed on the same IP interface"; type stypes:loopback_action; } + + leaf vlan { + type uint16 { + range 1..4094; + } + } } list VLAN_SUB_INTERFACE_IPPREFIX_LIST { From 30da473fd7af0879504a6f8fe92c799f26fb901e Mon Sep 17 00:00:00 2001 From: pavannaregundi <92989231+pavannaregundi@users.noreply.github.com> Date: Wed, 26 Jul 2023 22:47:39 +0530 Subject: [PATCH 060/145] [Marvell] Fix get_system_mac for system without eeprom (#15376) Why I did it get_system_mac was returning 'None' mac for system without eeprom. get_system_mac for marvell platform checks for mac in eeprom, profile.ini(hwsku file) and eth0. Check for valid mac returned by syseeprom was incorrect. Which was resulting in bypassing mac get from profile.ini and eth0. How I did it get_system_mac already has a logic to get first valid mac. Removed null check for mac returned by eeprom. Corrected the check for profile.ini file by checking if file exist. How to verify it Executed sonic-cfggen to check valid mac address is getting configured in config_db.json with/without profile.ini. Signed-off-by: Pavan Naregundi --- .../sonic_py_common/device_info.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index 2a7713433148..7a4cec81605d 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -713,19 +713,21 @@ def get_system_mac(namespace=None): machine_vars = get_machine_info() (mac, err) = run_command(syseeprom_cmd) hw_mac_entry_outputs.append((mac, err)) - if not mac: - if machine_vars is not None and machine_key in machine_vars: - hwsku = machine_vars[machine_key] - profile_cmd0 = ['cat', HOST_DEVICE_PATH + '/' + platform + '/' + hwsku + '/profile.ini'] + if machine_vars is not None and machine_key in machine_vars: + hwsku = machine_vars[machine_key] + profile_file = HOST_DEVICE_PATH + '/' + platform + '/' + hwsku + '/profile.ini' + if os.path.exists(profile_file): + profile_cmd0 = ['cat', profile_file] profile_cmd1 = ['grep', 'switchMacAddress'] profile_cmd2 = ['cut', '-f2', '-d', '='] (mac, err) = run_command_pipe(profile_cmd0, profile_cmd1, profile_cmd2) - else: - profile_cmd = ["false"] - (mac, err) = run_command(profile_cmd) - hw_mac_entry_outputs.append((mac, err)) - (mac, err) = run_command_pipe(iplink_cmd0, iplink_cmd1, iplink_cmd2) + hw_mac_entry_outputs.append((mac, err)) + else: + profile_cmd = ["false"] + (mac, err) = run_command(profile_cmd) hw_mac_entry_outputs.append((mac, err)) + (mac, err) = run_command_pipe(iplink_cmd0, iplink_cmd1, iplink_cmd2) + hw_mac_entry_outputs.append((mac, err)) elif (version_info['asic_type'] == 'cisco-8000'): # Try to get valid MAC from profile.ini first, else fetch it from syseeprom or eth0 platform = get_platform() From 751e595b937ec65015fece26b87ac16f597c28ea Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:15:51 +0800 Subject: [PATCH 061/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#15967) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 6716bcf4859c..4b547ef24faf 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 6716bcf4859c43bd66946132986960842de09248 +Subproject commit 4b547ef24faf84f27c134d4524933e5e459e7ac9 From 42a13665f8913fba3909f8e0baab83577cf0d95d Mon Sep 17 00:00:00 2001 From: Mohammedz93 <65073859+Mohammedz93@users.noreply.github.com> Date: Thu, 27 Jul 2023 18:30:12 +0300 Subject: [PATCH 062/145] Change build-image licenses to Apache (#15377) * Change build-image licenses to Apache * Delete irrelevant LICENSE files --- LICENSE | 22 ++++++++++------------ src/sonic-device-data/LICENSE | 15 --------------- src/sonic-host-services-data/LICENSE | 15 --------------- 3 files changed, 10 insertions(+), 42 deletions(-) delete mode 100644 src/sonic-device-data/LICENSE delete mode 100644 src/sonic-host-services-data/LICENSE diff --git a/LICENSE b/LICENSE index d15bca6acb81..d45c7ebd6840 100644 --- a/LICENSE +++ b/LICENSE @@ -1,15 +1,13 @@ -Copyright (C) 2016 Microsoft +Copyright (C) 2023 Microsoft -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. +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 -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + http://www.apache.org/licenses/LICENSE-2.0 -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +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. diff --git a/src/sonic-device-data/LICENSE b/src/sonic-device-data/LICENSE deleted file mode 100644 index 2ff086dedcdd..000000000000 --- a/src/sonic-device-data/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -Copyright (C) 2017 Microsoft - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/sonic-host-services-data/LICENSE b/src/sonic-host-services-data/LICENSE deleted file mode 100644 index 6e2e81a75fda..000000000000 --- a/src/sonic-host-services-data/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -Copyright (C) 2020 Microsoft - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. From c8b2d33b89a8f7224bf2db630e38cac22c119c81 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Thu, 27 Jul 2023 16:48:15 -0700 Subject: [PATCH 063/145] [YANG][SNMP]: Add YANG model for SNMP_AGENT_ADDRESS_CONFIG table (#15587) #### Why I did it https://github.com/sonic-net/sonic-utilities/pull/472 Added SNMP_AGENT_ADDRESS_CONFIG table in config db. This PR is to add corresponding YANG model for that table. ##### Work item tracking - Microsoft ADO **(number only)**: #### How I did it Added YANG modesl for SNMP_AGENT_ADDRESS_CONFIG. keys: agent_ip, port number, vrf. CLI implementaion checks if agent_ip, port number already exists in CONFIG_DB table, if it does, then new entry is not added. So added another condition to ensure combination of agent_ip and port is unique. Below is an example of how data looks like in DB: ``` 127.0.0.1:6379[4]> HGETALL "SNMP_AGENT_ADDRESS_CONFIG|10.1.1.1|161|foo" 1) "NULL" 2) "NULL" 127.0.0.1:6379[4]> HGETALL "SNMP_AGENT_ADDRESS_CONFIG|10.1.0.32|161|" 1) "NULL" 2) "NULL" ``` #### How to verify it Added unit-test for various combinations and ensures that it passes. --- .../tests/yang_model_tests/tests/snmp.json | 35 +++++ .../yang_model_tests/tests_config/snmp.json | 121 ++++++++++++++++++ .../yang-models/sonic-snmp.yang | 43 +++++++ 3 files changed, 199 insertions(+) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json b/src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json index 14c387d5effa..95e9b7ba9f80 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json @@ -113,5 +113,40 @@ "SNMP_USER_PRIV_LONG_ENCRYPT_PASS_NEG_TEST": { "desc": "Load SNMP user with user type Priv with long encryption password", "eStrKey": "Range" + }, + "SNMP_AGENT_ADDRESS_CONFIG": { + "desc": "Load SNMP agent address config" + }, + "SNMP_AGENT_ADDRESS_CONFIG_IPV6": { + "desc": "Load SNMP agent address config" + }, + "SNMP_AGENT_ADDRESS_CONFIG_EMPTY_PORT_NUMBER": { + "desc": "Load SNMP agent address config with empty port number" + }, + "SNMP_AGENT_ADDRESS_CONFIG_MGMT_VRF": { + "desc": "Load SNMP agent address config with mgmt vrf" + }, + "SNMP_AGENT_ADDRESS_CONFIG_NO_VRF": { + "desc": "Load SNMP agent address config with no vrf", + "eStr": ["Missing required element"] + }, + "SNMP_AGENT_ADDRESS_CONFIG_INVALID_PORT": { + "desc": "Load SNMP agent address config with invalid port", + "eStrKey": "InvalidValue" + }, + "SNMP_AGENT_ADDRESS_CONFIG_DUPLICATE_IP_PORT": { + "desc": "Load two SNMP agent address config same ip and port", + "eStr": ["Unique data leaf(s)"] + }, + "SNMP_AGENT_ADDRESS_CONFIG_INVALID_IPV4_ADDRESS": { + "desc": "Load SNMP agent address config with invalid IPv4 address", + "eStrKey": "InvalidValue", + "eStr": ["ip"] + }, + "SNMP_AGENT_ADDRESS_CONFIG_INVALID_IPV6_ADDRESS": { + "desc": "Load SNMP agent address config with invalid IPV6 address", + "eStrKey": "InvalidValue", + "eStr": ["ip"] } } + diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json index 3f6d5e6c16c4..d1e82873bdda 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json @@ -502,5 +502,126 @@ ] } } + }, + "SNMP_AGENT_ADDRESS_CONFIG": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "10.0.0.1", + "port": "161", + "vrf_name": "" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_IPV6": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "fd00::1", + "port": "161", + "vrf_name": "" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_EMPTY_PORT_NUMBER": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "10.0.0.1", + "port": "", + "vrf_name": "mgmt" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_MGMT_VRF": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "10.0.0.1", + "port": "161", + "vrf_name": "mgmt" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_NO_VRF": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "10.0.0.1", + "port": "161" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_INVALID_PORT": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "10.0.0.1", + "port": "65536", + "vrf_name": "mgmt" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_DUPLICATE_IP_PORT": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "10.0.0.1", + "port": "161", + "vrf_name": "mgmt" + }, + { + "agent_ip": "10.0.0.1", + "port": "161", + "vrf_name": "" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_INVALID_IPV4_ADDRESS": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "340.1.1.10", + "port": "161", + "vrf_name": "" + } + ] + } + } + }, + "SNMP_AGENT_ADDRESS_CONFIG_INVALID_IPV6_ADDRESS": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_AGENT_ADDRESS_CONFIG": { + "SNMP_AGENT_ADDRESS_LIST": [ + { + "agent_ip": "2001:aa:aa:aa", + "port": "161", + "vrf_name": "" + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-snmp.yang b/src/sonic-yang-models/yang-models/sonic-snmp.yang index f49c28f98050..1579dc1f04d8 100644 --- a/src/sonic-yang-models/yang-models/sonic-snmp.yang +++ b/src/sonic-yang-models/yang-models/sonic-snmp.yang @@ -3,6 +3,12 @@ module sonic-snmp { prefix ssnmp; yang-version 1.1; + import ietf-inet-types { + prefix inet; + } + import sonic-vrf { + prefix vrf; + } organization "SONiC"; @@ -156,5 +162,42 @@ module sonic-snmp { } } } + container SNMP_AGENT_ADDRESS_CONFIG { + list SNMP_AGENT_ADDRESS_LIST { + key "agent_ip port vrf_name"; + unique "agent_ip port"; + description "List of SNMP agent listening IP Addresses and ports."; + + leaf agent_ip { + type inet:ip-address; + description "SNMP agent listening IP"; + } + leaf port { + type union { + type string { + pattern ''; + } + type inet:port-number; + } + default ""; + description "SNMP agent listening port number"; + } + leaf vrf_name { + type union { + type string { + pattern ''; + } + type string { + pattern 'mgmt'; + } + type string { + pattern "Vrf[a-zA-Z0-9_-]+"; + } + } + default ""; + description "VRF name"; + } + } + } } } From 8f81d0f273aefe39014b39750ee1e61ec1b55cb5 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 28 Jul 2023 14:33:01 +0800 Subject: [PATCH 064/145] [submodule] Update submodule sonic-sairedis to the latest HEAD automatically (#15698) #### Why I did it src/sonic-sairedis ``` * ce8f642 - (HEAD -> master, origin/master, origin/HEAD) [vs] Use boost join to concatenate switch types in config (#1266) (6 days ago) [Kamil Cudnik] * d6055a2 - [vslib]: Temporaily map DPU switch type to NVDA_MBF2H536C (#1259) (13 days ago) [prabhataravind] * e1cdb4d - [CodeQL]: Use dependencies with relevant versions in azp template. (#1262) (3 weeks ago) [Nazarii Hnydyn] * c08f9a2 - [CI]: Fix collect log error in azp template. (#1260) (3 weeks ago) [Nazarii Hnydyn] * eed856c - [CodeQL]: Fix syncd compilation in azp template. (#1261) (3 weeks ago) [Nazarii Hnydyn] * a3f1f1a - Reland 'Make changes to building and packaging sairedis (#1116)' (#1194) (3 weeks ago) [Saikrishna Arcot] ``` #### How I did it #### How to verify it #### Description for the changelog From f53b26f97eae3912f4d93ad6e311bf66aab9f362 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 28 Jul 2023 15:10:17 +0800 Subject: [PATCH 065/145] [submodule] Update submodule sonic-swss to the latest HEAD automatically (#15944) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index a2a583656a59..d54c767c6d92 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit a2a583656a592b8b524fe6c5836ea63a2f43d070 +Subproject commit d54c767c6d9210a7c3e88e922a21c291b5a42276 From 5b07f72662fe58926d711c7f4d5d364f33bff674 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 28 Jul 2023 15:11:51 +0800 Subject: [PATCH 066/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#15985) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 4b547ef24faf..5ae17ff067b3 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 4b547ef24faf84f27c134d4524933e5e459e7ac9 +Subproject commit 5ae17ff067b3dbcb56815a8fbdbce10c8a99e4ae From 4f03e3c71b670fa5ccaa0832b1088edb6ec09591 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 28 Jul 2023 16:32:48 +0800 Subject: [PATCH 067/145] [submodule] Update submodule linkmgrd to the latest HEAD automatically (#15952) #### Why I did it src/linkmgrd ``` * aa902a3 - (HEAD -> master, origin/master, origin/HEAD) [link prober] Increase pause/restart probe log verbosity (#213) (3 days ago) [Longxiang Lyu] * 736cdda - [active-standby] Write `unhealthy` is default route `N/A` (#214) (3 days ago) [Longxiang Lyu] * e923e15 - Add ADO to the PR template (#215) (4 days ago) [Longxiang Lyu] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index 6e5cfda88747..aa902a3a3ab3 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 6e5cfda8874735e50c935e5f49268b3ae3be30dc +Subproject commit aa902a3a3ab346b879f9529b8fed6b5181ba057f From a0b3ec2df6ac78b5a21f13bb66f090b30797225d Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 28 Jul 2023 16:54:02 +0800 Subject: [PATCH 068/145] Support FIPS DB configuration (#15632) Why I did it Support FIPS DB configuration Design Doc: sonic-net/SONiC#1372 Work item tracking Microsoft ADO (number only): 24411148 How I did it Add the FIPS Yang model to make FIPS configurable in ConfigDB. How to verify it See TestPlan: sonic-net/sonic-mgmt#9092 Build the image and run the tests: sonic-net/sonic-mgmt#9091 --- build_debian.sh | 4 ++ files/build_templates/docker_image_ctl.j2 | 1 + installer/install.sh | 5 +++ src/sonic-yang-models/doc/Configuration.md | 15 +++++++ src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 6 +++ .../tests/yang_model_tests/tests/fips.json | 10 +++++ .../yang_model_tests/tests_config/fips.json | 21 +++++++++ .../yang-models/sonic-fips.yang | 45 +++++++++++++++++++ 9 files changed, 109 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/fips.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/fips.json create mode 100644 src/sonic-yang-models/yang-models/sonic-fips.yang diff --git a/build_debian.sh b/build_debian.sh index d04b8d0b3c17..11c3e85adb88 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -644,6 +644,10 @@ then fi +## Set FIPS runtime default option +sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "mkdir -p /etc/fips" +sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo 0 > /etc/fips/fips_enable" + # ################# # secure boot # ################# diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 01a52fb7a0d3..a8529f987389 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -596,6 +596,7 @@ start() { -v /usr/share/sonic/device/$PLATFORM/$HWSKU/$DEV:/usr/share/sonic/hwsku:ro \ {%- endif %} $REDIS_MNT \ + -v /etc/fips/fips_enable:/etc/fips/fips_enable:ro \ -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ -v /usr/share/sonic/templates/rsyslog-container.conf.j2:/usr/share/sonic/templates/rsyslog-container.conf.j2:ro \ {%- if sonic_asic_platform != "mellanox" %} diff --git a/installer/install.sh b/installer/install.sh index 51b5a75eb574..7f3feae42b7c 100755 --- a/installer/install.sh +++ b/installer/install.sh @@ -243,6 +243,11 @@ fi echo "ONIE_IMAGE_PART_SIZE=$demo_part_size" extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% +# Inherit the FIPS option, so not necessary to do another reboot after upgraded +if grep -q '\bsonic_fips=1\b' /proc/cmdline && echo " $extra_cmdline_linux" | grep -qv '\bsonic_fips=.\b'; then + extra_cmdline_linux="$extra_cmdline_linux sonic_fips=1" +fi + echo "EXTRA_CMDLINE_LINUX=$extra_cmdline_linux" # Update Bootloader Menu with installed image diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index ce0253d605c0..88778c477fb1 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -2508,6 +2508,21 @@ The DNS_NAMESERVER table introduces static DNS nameservers configuration. } ``` +### FIPS + +The FIPS table introduces FIPS configuration. + +```json +{ + "FIPS": { + "global" : { + "enable": "true", + "enforce": "false" + } + } +} +``` + #### 5.2.3 Update value directly in db memory For Developers diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index b7cc6df95617..e20c10da05db 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -121,6 +121,7 @@ def run(self): './yang-models/sonic-flex_counter.yang', './yang-models/sonic-fine-grained-ecmp.yang', './yang-models/sonic-feature.yang', + './yang-models/sonic-fips.yang', './yang-models/sonic-hash.yang', './yang-models/sonic-system-defaults.yang', './yang-models/sonic-interface.yang', @@ -216,6 +217,7 @@ def run(self): './cvlyang-models/sonic-flex_counter.yang', './cvlyang-models/sonic-feature.yang', './cvlyang-models/sonic-fine-grained-ecmp.yang', + './cvlyang-models/sonic-fips.yang', './cvlyang-models/sonic-hash.yang', './cvlyang-models/sonic-system-defaults.yang', './cvlyang-models/sonic-interface.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 37296d0d42d9..a709f4490181 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -2455,6 +2455,12 @@ "FG_NHG": "nhg2" } }, + "FIPS":{ + "global": { + "enable": "true", + "enforce": "true" + } + }, "FG_NHG_MEMBER": { "192.168.1.1": { "FG_NHG": "nhg1", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/fips.json b/src/sonic-yang-models/tests/yang_model_tests/tests/fips.json new file mode 100644 index 000000000000..74b1d386de12 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/fips.json @@ -0,0 +1,10 @@ +{ + "FIPS_WITH_CORRECT_VALUES_ENABLE": { + "desc": "CONFIG FIPS TABLE WITH ALL THE CORRECT VALUES" + }, + "FIPS_WITH_INVALID_VALUES_ENABLE" : { + "desc": "Configure invalid mode in fips.", + "eStrKey": "Pattern", + "eStr": ["false|true|False|True"] + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/fips.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/fips.json new file mode 100644 index 000000000000..8c7b989aee2c --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/fips.json @@ -0,0 +1,21 @@ +{ + "FIPS_WITH_CORRECT_VALUES_ENABLE": { + "sonic-fips:sonic-fips": { + "sonic-fips:FIPS": { + "sonic-fips:global": { + "enable": "true", + "enforce": "false" + } + } + } + }, + "FIPS_WITH_INVALID_VALUES_ENABLE": { + "sonic-fips:sonic-fips": { + "sonic-fips:FIPS": { + "sonic-fips:global": { + "enable": "Invalid" + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-fips.yang b/src/sonic-yang-models/yang-models/sonic-fips.yang new file mode 100644 index 000000000000..0bf96f7b0f13 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-fips.yang @@ -0,0 +1,45 @@ +module sonic-fips { + + yang-version 1.1; + + namespace "http://github.com/sonic-net/sonic-fips"; + + prefix sonic-fips; + + import sonic-types { + prefix stypes; + } + + description "FIPS YANG Module for SONiC OS"; + + revision 2023-06-20 { + description "First Revision"; + } + + container sonic-fips { + + container FIPS { + + description "FIPS part of config_db.json"; + + container global { + + leaf enable { + description "This configuration identicates whether enable fips"; + type stypes:boolean_type; + default "false"; + } + + leaf enforce { + description "This configuration identicates whether enforce fips"; + type stypes:boolean_type; + default "false"; + } + } + /* end of container global */ + } + /* end of container FIPS */ + } + /* end of top level container */ +} +/* end of module sonic-fips */ From 671346cb83c66e5fe301ee3280f9d29c4f7b6789 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Fri, 28 Jul 2023 18:19:57 +0800 Subject: [PATCH 069/145] [build] Add sonic-utilities to sonic-host-services dependencies list. (#15987) Why I did it sonic-host-services depends on sonic-utilities because of FIPS feature. Add dependency to unblock submodule sonic-host-services HEAD pointer update. Work item tracking Microsoft ADO (number only): 24671218 How I did it --- rules/sonic-host-services.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rules/sonic-host-services.mk b/rules/sonic-host-services.mk index eeb931ce5666..6d204fa41e0a 100644 --- a/rules/sonic-host-services.mk +++ b/rules/sonic-host-services.mk @@ -3,7 +3,8 @@ SONIC_HOST_SERVICES_PY3 = sonic_host_services-1.0-py3-none-any.whl $(SONIC_HOST_SERVICES_PY3)_SRC_PATH = $(SRC_PATH)/sonic-host-services $(SONIC_HOST_SERVICES_PY3)_PYTHON_VERSION = 3 -$(SONIC_HOST_SERVICES_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) +$(SONIC_HOST_SERVICES_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) \ + $(SONIC_UTILITIES_PY3) $(SONIC_HOST_SERVICES_PY3)_DEBS_DEPENDS = $(LIBSWSSCOMMON) \ $(PYTHON3_SWSSCOMMON) SONIC_PYTHON_WHEELS += $(SONIC_HOST_SERVICES_PY3) From e7160af7687796021ad3181e0ca094b32c76b218 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 28 Jul 2023 22:54:26 +0800 Subject: [PATCH 070/145] [submodule] Update submodule sonic-host-services to the latest HEAD automatically (#15937) --- src/sonic-host-services | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-host-services b/src/sonic-host-services index bc08806b6400..11a44d515d5a 160000 --- a/src/sonic-host-services +++ b/src/sonic-host-services @@ -1 +1 @@ -Subproject commit bc08806b64002c506b8401eae5d9e1c760651e49 +Subproject commit 11a44d515d5a05c6df975f12e494085c548fd4f3 From 4c6be287a85a583eaed881838ade4880401c38d2 Mon Sep 17 00:00:00 2001 From: Yevhen Fastiuk Date: Sat, 29 Jul 2023 02:24:10 +0300 Subject: [PATCH 071/145] Add cache for AUDISP TACPLUS (#13033) #### Why I did it Tacplus package has missed cache configuration #### How I did it Defined cache configuration for tacplus package #### How to verify it Build image with cache enabled and make sure you don't see any warnings related to tacplus --- rules/tacacs.dep | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/rules/tacacs.dep b/rules/tacacs.dep index f7e807f9c47c..dedbd9e482b8 100644 --- a/rules/tacacs.dep +++ b/rules/tacacs.dep @@ -1,7 +1,7 @@ #DPKG FRK SPATH := $($(LIBTAC2)_SRC_PATH) -DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/tacacs.mk rules/tacacs.dep +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/tacacs.mk rules/tacacs.dep DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) DEP_FILES += $(shell git ls-files $(SPATH)) @@ -33,3 +33,15 @@ $(BASH_TACPLUS)_CACHE_MODE := GIT_CONTENT_SHA $(BASH_TACPLUS)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(BASH_TACPLUS)_DEP_FILES := $(DEP_FILES) + + + +SPATH := $($(AUDISP_TACPLUS)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/tacacs.mk rules/tacacs.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(SPATH)) + +$(AUDISP_TACPLUS)_CACHE_MODE := GIT_CONTENT_SHA +$(AUDISP_TACPLUS)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(AUDISP_TACPLUS)_DEP_FILES := $(DEP_FILES) + From a3110bc2966d4e29ff3680602266cc744d08fbe9 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 29 Jul 2023 15:18:04 +0800 Subject: [PATCH 072/145] [submodule] Update submodule sonic-snmpagent to the latest HEAD automatically (#15974) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 4948ea34b0f7..005bbc9dcca7 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 4948ea34b0f7e9ac82b2ef308d3e6253b22107f9 +Subproject commit 005bbc9dcca7705287d29e3df9156fa864dc8f86 From 351162a72749c1a8536f4983c33564190a03902d Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 29 Jul 2023 16:09:53 +0800 Subject: [PATCH 073/145] [submodule] Update submodule sonic-platform-common to the latest HEAD automatically (#15984) --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index 465f95eed18c..c99d31164175 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit 465f95eed18cd9a9a598beabb8c02cb5387e199a +Subproject commit c99d31164175bec5f99784bf222d91bf8f2c20c6 From 2a69c6c9a1334ac3e66a26b75268661931419fe7 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 29 Jul 2023 16:32:27 +0800 Subject: [PATCH 074/145] [submodule] Update submodule sonic-gnmi to the latest HEAD automatically (#15991) #### Why I did it src/sonic-gnmi ``` * 2c8e4ab - (HEAD -> master, origin/master, origin/HEAD) Support proto encoding (#140) (22 hours ago) [ganglv] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-gnmi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-gnmi b/src/sonic-gnmi index fb338d50aad1..2c8e4ab783d1 160000 --- a/src/sonic-gnmi +++ b/src/sonic-gnmi @@ -1 +1 @@ -Subproject commit fb338d50aad1e78d2b675000c916c5b5fdecfc0e +Subproject commit 2c8e4ab783d10b7433325653c1c90ad2b7f980b0 From 9b08fe4eb2fdff9d9e9ebed640100abb3b9aeef8 Mon Sep 17 00:00:00 2001 From: mssonicbld Date: Mon, 24 Jul 2023 06:12:31 +0000 Subject: [PATCH 075/145] [ci/build]: Upgrade SONiC package versions --- .../versions-deb-bullseye | 5 ++-- .../versions-py3-all-arm64 | 1 - files/build/versions/default/versions-git | 8 ++--- files/build/versions/default/versions-mirror | 20 ++++++------- files/build/versions/default/versions-web | 2 +- .../dockers/docker-base-bullseye/versions-py3 | 2 +- .../dockers/docker-base-buster/versions-py3 | 2 +- .../docker-platform-monitor/versions-py3 | 4 +-- .../docker-sonic-mgmt-framework/versions-py3 | 2 +- .../dockers/docker-sonic-vs/versions-py3 | 2 +- .../dockers/sonic-slave-bullseye/versions-py3 | 4 +-- .../sonic-slave-buster/versions-deb-buster | 30 +++++++++---------- .../dockers/sonic-slave-buster/versions-py3 | 4 +-- files/build/versions/host-image/versions-py3 | 4 +-- 14 files changed, 45 insertions(+), 45 deletions(-) diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye index 16122658e070..da953843ce6f 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-deb-bullseye @@ -24,6 +24,7 @@ libsairedis==1.0.0 libsairedis-dev==1.0.0 libsaithrift-dev==0.9.4 libsaivs==1.0.0 +libsaivs-dev==1.0.0 libswsscommon==1.0.0 libswsscommon-dev==1.0.0 libtac-dev==1.4.1-1 @@ -33,7 +34,7 @@ libteam-utils==1.30-1 libteam5==1.30-1 libteamdctl0==1.30-1 libthrift-0.11.0==0.11.0-4 -libthrift-dev==0.14.1 +libthrift-dev==0.11.0-4 libthrift0==0.14.1 libyang==1.0.73 libyang-cpp==1.0.73 @@ -73,7 +74,7 @@ sxd-libs==1.mlnx.4.5.5142 sxd-libs-dev==1.mlnx.4.5.5142 syncd==1.0.0 syncd-vs==1.0.0 -thrift-compiler==0.14.1 +thrift-compiler==0.11.0-4 wjh-libs==1.mlnx.4.5.5142 wjh-libs-dev==1.mlnx.4.5.5142 wpasupplicant==2:2.9.0-14 diff --git a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 index 46df813bf748..cd01abdaf741 100644 --- a/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 +++ b/files/build/versions/build/build-sonic-slave-bullseye/versions-py3-all-arm64 @@ -2,4 +2,3 @@ bcrypt==3.2.2 bitarray==1.5.3 click==7.0 requests==2.31.0 -zipp==1.2.0 diff --git a/files/build/versions/default/versions-git b/files/build/versions/default/versions-git index 53dc40a21d41..5257da550715 100644 --- a/files/build/versions/default/versions-git +++ b/files/build/versions/default/versions-git @@ -1,11 +1,11 @@ -https://chromium.googlesource.com/chromium/tools/depot_tools.git==a654ff36bb3dba91a3d4f1ac8a2c6e2055e1f2df +https://chromium.googlesource.com/chromium/tools/depot_tools.git==d411904b84c0d9f539bbdc84e3d63f9f282c658b https://github.com/aristanetworks/swi-tools.git==b5f087e4774168bf536360d43c9c509c8f14ad9f https://github.com/CESNET/libyang.git==ea94c8b9f513f8a6ddc6ce1540fa41eaf4c8922a https://github.com/daveolson53/audisp-tacplus.git==559c9f22edd4f2dea0ecedffb3ad9502b12a75b6 https://github.com/daveolson53/libnss-tacplus.git==19008ab68d9d504aa58eb34d5f564755a1613b8b https://github.com/dyninc/OpenBFDD.git==e35f43ad8d2b3f084e96a84c392528a90d05a287 -https://github.com/flashrom/flashrom.git==e08899fcf4127de5cb2ad2dd134539d41f7e33b0 -https://github.com/FreeRADIUS/freeradius-server.git==54eb782f8b01c98a41208116e0f134a4c1564e4f +https://github.com/flashrom/flashrom.git==2b692d78c2ab8cb1ba68516cb4bd2ceae80d8936 +https://github.com/FreeRADIUS/freeradius-server.git==1be5b1d181b5c51c34dc4b7f8e639082f80d6c87 https://github.com/FreeRADIUS/pam_radius.git==8d373539bb9f13b0abfe8bcae0095a930a00fad0 https://github.com/jeroennijhof/pam_tacplus.git==4284d9016e64def2bb81d5f50f96dc3b59bfdc39 https://github.com/jpirko/libteam.git==7cb5de8b01be132bd4150eff460bfd83296414b6 @@ -21,4 +21,4 @@ https://salsa.debian.org/debian/libteam.git==48142125234a665ad5367b724af36a58fb4 https://salsa.debian.org/kernel-team/ethtool/==d0578651310379629399dde060577d4b9b0bcab1 https://salsa.debian.org/kernel-team/initramfs-tools.git==193dfbb7929e518976f89f6c8dd9201982e56f80 https://salsa.debian.org/sk-guest/monit.git==c9da7ebb1f35dfba17b50b5969a6e75e29cbec0d -https://salsa.debian.org/ssh-team/openssh.git==74d15e80b8730335a9b13469ca6cafe4c1c8e485 +https://salsa.debian.org/ssh-team/openssh.git==d9a514f93f17d22766cfe760e25254ef13cb5eb1 diff --git a/files/build/versions/default/versions-mirror b/files/build/versions/default/versions-mirror index 7ab4e2dd81ec..3615751938ee 100644 --- a/files/build/versions/default/versions-mirror +++ b/files/build/versions/default/versions-mirror @@ -1,15 +1,15 @@ deb.nodesource.com_node%5f14.x_dists_bullseye==2023-02-17T00:35:28Z deb.nodesource.com_node%5f14.x_dists_buster==2023-02-17T00:35:28Z -debian==20230718T000215Z -debian-security==20230718T000622Z +debian==20230723T000130Z +debian-security==20230723T000131Z download.docker.com_linux_debian_dists_bullseye==2023-07-07T20:10:57Z download.docker.com_linux_debian_dists_buster==2023-07-07T20:10:57Z packages.microsoft.com_repos_sonic-dev_dists_jessie==2022-10-31T19:34:29Z -packages.trafficmanager.net_snapshot_debian-security_20230718T000622Z_dists_bullseye-security==2023-07-17T13:53:30Z -packages.trafficmanager.net_snapshot_debian-security_20230718T000622Z_dists_buster_updates==2023-07-17T13:53:30Z -packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_bullseye==2023-06-10T08:52:21Z -packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_bullseye-backports==2023-07-17T20:24:12Z -packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_bullseye-updates==2023-07-17T20:24:12Z -packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_buster==2023-06-10T08:53:33Z -packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_buster-backports==2023-07-17T20:24:12Z -packages.trafficmanager.net_snapshot_debian_20230718T000215Z_dists_buster-updates==2023-06-10T08:55:10Z +packages.trafficmanager.net_snapshot_debian-security_20230723T000131Z_dists_bullseye-security==2023-07-22T08:48:51Z +packages.trafficmanager.net_snapshot_debian-security_20230723T000131Z_dists_buster_updates==2023-07-22T08:48:51Z +packages.trafficmanager.net_snapshot_debian_20230723T000130Z_dists_bullseye==2023-06-10T08:52:21Z +packages.trafficmanager.net_snapshot_debian_20230723T000130Z_dists_bullseye-backports==2023-07-22T20:31:09Z +packages.trafficmanager.net_snapshot_debian_20230723T000130Z_dists_bullseye-updates==2023-07-22T20:31:09Z +packages.trafficmanager.net_snapshot_debian_20230723T000130Z_dists_buster==2023-06-10T08:53:33Z +packages.trafficmanager.net_snapshot_debian_20230723T000130Z_dists_buster-backports==2023-07-22T20:31:09Z +packages.trafficmanager.net_snapshot_debian_20230723T000130Z_dists_buster-updates==2023-06-10T08:55:10Z diff --git a/files/build/versions/default/versions-web b/files/build/versions/default/versions-web index 60567c6a9c2f..f4ff7b5914fb 100644 --- a/files/build/versions/default/versions-web +++ b/files/build/versions/default/versions-web @@ -31,7 +31,7 @@ https://deb.debian.org/debian/pool/main/k/kdump-tools/kdump-tools_1.6.8.4.tar.xz https://deb.nodesource.com/gpgkey/nodesource.gpg.key==003b51a89a133b5db4cca98b2dea3117 https://deb.nodesource.com/node_14.x/dists/bullseye/Release==6b7d50c433d129d4c6fd95bdf56070fa https://deb.nodesource.com/node_14.x/dists/buster/Release==42875141604382f0abb4d047f645dfe1 -https://deb.nodesource.com/setup_14.x==1c9de9348c0acd5f2ee422a6d0c333b3 +https://deb.nodesource.com/setup_14.x==472c9614e7c6dd029f205890ed356a22 https://download.docker.com/linux/debian/gpg==1afae06b34a13c1b3d9cb61a26285a15 https://github.com/aristanetworks/sonic-firmware/raw/446f30ccd8626f904d89d5798da7294948e090a6/phy/phy-credo_1.0_amd64.deb==6c3d6c32477615cbe049b9161ce15bd5 https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/bfnplatform_20221130_sai_1.11.0_deb11.deb==4a77e5f35b75ad7ce062f631581b40e2 diff --git a/files/build/versions/dockers/docker-base-bullseye/versions-py3 b/files/build/versions/dockers/docker-base-bullseye/versions-py3 index 23c54de5fc2e..61ebeea0c4ca 100644 --- a/files/build/versions/dockers/docker-base-bullseye/versions-py3 +++ b/files/build/versions/dockers/docker-base-bullseye/versions-py3 @@ -1,7 +1,7 @@ j2cli==0.3.10 jinja2==3.1.2 markupsafe==2.1.3 -pip==23.2 +pip==23.2.1 setuptools==49.6.0 supervisor==4.2.1 supervisord-dependent-startup==1.4.0 diff --git a/files/build/versions/dockers/docker-base-buster/versions-py3 b/files/build/versions/dockers/docker-base-buster/versions-py3 index 23c54de5fc2e..61ebeea0c4ca 100644 --- a/files/build/versions/dockers/docker-base-buster/versions-py3 +++ b/files/build/versions/dockers/docker-base-buster/versions-py3 @@ -1,7 +1,7 @@ j2cli==0.3.10 jinja2==3.1.2 markupsafe==2.1.3 -pip==23.2 +pip==23.2.1 setuptools==49.6.0 supervisor==4.2.1 supervisord-dependent-startup==1.4.0 diff --git a/files/build/versions/dockers/docker-platform-monitor/versions-py3 b/files/build/versions/dockers/docker-platform-monitor/versions-py3 index bf73e4489323..515fdf285eff 100644 --- a/files/build/versions/dockers/docker-platform-monitor/versions-py3 +++ b/files/build/versions/dockers/docker-platform-monitor/versions-py3 @@ -1,5 +1,5 @@ attrs==20.3.0 -certifi==2023.5.7 +certifi==2023.7.22 charset-normalizer==3.2.0 grpcio==1.39.0 grpcio-tools==1.39.0 @@ -15,5 +15,5 @@ pyrsistent==0.15.5 python_sdk_api==4.5.5142 requests==2.31.0 thrift==0.13.0 -urllib3==2.0.3 +urllib3==2.0.4 zipp==1.0.0 diff --git a/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 b/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 index a43b8ebb7dfd..161ed038506e 100644 --- a/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 +++ b/files/build/versions/dockers/docker-sonic-mgmt-framework/versions-py3 @@ -5,7 +5,7 @@ click==8.1.6 clickclick==20.10.2 connexion==2.7.0 flask==2.2.5 -grpcio==1.56.0 +grpcio==1.56.2 grpcio-tools==1.20.0 idna==3.4 importlib-resources==5.12.0 diff --git a/files/build/versions/dockers/docker-sonic-vs/versions-py3 b/files/build/versions/dockers/docker-sonic-vs/versions-py3 index e52e03bd01dc..cbc33ce14d50 100644 --- a/files/build/versions/dockers/docker-sonic-vs/versions-py3 +++ b/files/build/versions/dockers/docker-sonic-vs/versions-py3 @@ -1,7 +1,7 @@ async-timeout==4.0.2 bcrypt==3.2.2 blessed==1.20.0 -certifi==2023.5.7 +certifi==2023.7.22 cffi==1.15.1 charset-normalizer==3.2.0 click==7.0 diff --git a/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 b/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 index b045fa955642..b50abe043315 100644 --- a/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 +++ b/files/build/versions/dockers/sonic-slave-bullseye/versions-py3 @@ -6,7 +6,7 @@ automat==20.2.0 babel==2.8.0 bcrypt==3.1.7 beautifulsoup4==4.9.3 -bitarray==2.7.6 +bitarray==2.8.0 certifi==2020.6.20 chardet==4.0.0 click==7.1.2 @@ -58,7 +58,7 @@ parameterized==0.8.1 parse==1.6.6 pexpect==4.8.0 pillow==9.4.0 -pip==23.2 +pip==23.2.1 pluggy==0.13.0 ptyprocess==0.7.0 py==1.10.0 diff --git a/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster b/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster index 9b57c5d405db..f73bbd7143db 100644 --- a/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster +++ b/files/build/versions/dockers/sonic-slave-buster/versions-deb-buster @@ -23,7 +23,7 @@ autopoint==0.19.8.1-9 autotools-dev==20180224.1 bash-completion==1:2.8-6 bc==1.07.1-2+b1 -bind9-host==1:9.11.5.P4+dfsg-5.1+deb10u8 +bind9-host==1:9.11.5.P4+dfsg-5.1+deb10u9 binfmt-support==2.2.0-2 binutils==2.31.1-16 binutils-common==2.31.1-16 @@ -85,7 +85,7 @@ distro-info-data==0.41+deb10u7 dkms==2.6.1-4 dmeventd==2:1.02.155-3 dmsetup==2:1.02.155-3 -dnsutils==1:9.11.5.P4+dfsg-5.1+deb10u8 +dnsutils==1:9.11.5.P4+dfsg-5.1+deb10u9 docbook==4.5-6 docbook-dsssl==1.79-9.1 docbook-to-man==1:2.0.0-42 @@ -286,8 +286,8 @@ libbabeltrace-dev==1.5.6-2+deb10u1 libbabeltrace1==1.5.6-2+deb10u1 libbatik-java==1.10-2+deb10u2 libbdplus0==0.1.2-3 -libbind-export-dev==1:9.11.5.P4+dfsg-5.1+deb10u8 -libbind9-161==1:9.11.5.P4+dfsg-5.1+deb10u8 +libbind-export-dev==1:9.11.5.P4+dfsg-5.1+deb10u9 +libbind9-161==1:9.11.5.P4+dfsg-5.1+deb10u9 libbinutils==2.31.1-16 libbison-dev==2:3.3.2.dfsg-1 libbit-vector-perl==7.4-1+b5 @@ -451,8 +451,8 @@ libdist-checkconflicts-perl==0.11-1 libdistro-info-perl==0.21 libdjvulibre-text==3.5.27.1-10+deb10u1 libdjvulibre21==3.5.27.1-10+deb10u1 -libdns-export1104==1:9.11.5.P4+dfsg-5.1+deb10u8 -libdns1104==1:9.11.5.P4+dfsg-5.1+deb10u8 +libdns-export1104==1:9.11.5.P4+dfsg-5.1+deb10u9 +libdns1104==1:9.11.5.P4+dfsg-5.1+deb10u9 libdom4j-java==2.1.1-2 libdouble-conversion1==3.1.0-3 libdoxia-core-java==1.7-2 @@ -669,14 +669,14 @@ libipc-system-simple-perl==1.25-4 libipt2==2.0-2 libiptc-dev==1.8.2-4 libiptc0==1.8.2-4 -libirs-export161==1:9.11.5.P4+dfsg-5.1+deb10u8 -libirs161==1:9.11.5.P4+dfsg-5.1+deb10u8 -libisc-export1100==1:9.11.5.P4+dfsg-5.1+deb10u8 -libisc1100==1:9.11.5.P4+dfsg-5.1+deb10u8 -libisccc-export161==1:9.11.5.P4+dfsg-5.1+deb10u8 -libisccc161==1:9.11.5.P4+dfsg-5.1+deb10u8 -libisccfg-export163==1:9.11.5.P4+dfsg-5.1+deb10u8 -libisccfg163==1:9.11.5.P4+dfsg-5.1+deb10u8 +libirs-export161==1:9.11.5.P4+dfsg-5.1+deb10u9 +libirs161==1:9.11.5.P4+dfsg-5.1+deb10u9 +libisc-export1100==1:9.11.5.P4+dfsg-5.1+deb10u9 +libisc1100==1:9.11.5.P4+dfsg-5.1+deb10u9 +libisccc-export161==1:9.11.5.P4+dfsg-5.1+deb10u9 +libisccc161==1:9.11.5.P4+dfsg-5.1+deb10u9 +libisccfg-export163==1:9.11.5.P4+dfsg-5.1+deb10u9 +libisccfg163==1:9.11.5.P4+dfsg-5.1+deb10u9 libisl19==0.20-2 libitext1-java==1.4-7 libitm1==8.3.0-6 @@ -756,7 +756,7 @@ liblua5.1-0-dev==5.1.5-8.1+b2 liblvm2cmd2.03==2.03.02-3 liblwp-mediatypes-perl==6.02-1 liblwp-protocol-https-perl==6.07-2 -liblwres161==1:9.11.5.P4+dfsg-5.1+deb10u8 +liblwres161==1:9.11.5.P4+dfsg-5.1+deb10u9 liblzma-dev==5.2.4-1+deb10u1 liblzo2-2==2.10-0.1 liblzo2-dev==2.10-0.1 diff --git a/files/build/versions/dockers/sonic-slave-buster/versions-py3 b/files/build/versions/dockers/sonic-slave-buster/versions-py3 index e5ea5676b658..d5db69b79086 100644 --- a/files/build/versions/dockers/sonic-slave-buster/versions-py3 +++ b/files/build/versions/dockers/sonic-slave-buster/versions-py3 @@ -4,7 +4,7 @@ async-timeout==4.0.2 atomicwrites==1.1.5 attrs==18.2.0 babel==2.6.0 -bitarray==2.7.6 +bitarray==2.8.0 certifi==2018.8.24 chardet==3.0.4 cov-core==1.15.0 @@ -41,7 +41,7 @@ parameterized==0.8.1 pbr==4.2.0 pexpect==4.8.0 pillow==9.4.0 -pip==23.2 +pip==23.2.1 pluggy==0.8.0 ptyprocess==0.7.0 py==1.7.0 diff --git a/files/build/versions/host-image/versions-py3 b/files/build/versions/host-image/versions-py3 index 18267c124c8d..556f4825ce42 100644 --- a/files/build/versions/host-image/versions-py3 +++ b/files/build/versions/host-image/versions-py3 @@ -4,7 +4,7 @@ azure-storage==0.36.0 bcrypt==3.2.2 bitarray==1.5.3 blessed==1.20.0 -certifi==2023.5.7 +certifi==2023.7.22 cffi==1.15.1 charset-normalizer==3.2.0 click==7.0 @@ -40,7 +40,7 @@ paramiko==2.11.0 pathtools==0.1.2 pddf-platform==1.0 pexpect==4.8.0 -pip==23.2 +pip==23.2.1 prefixed==0.7.0 prettyprinter==0.18.0 protobuf==3.20.3 From b23078b52b70542d296504c0e34e2e83f7ce332a Mon Sep 17 00:00:00 2001 From: Ikki Zhu <79439153+qnos@users.noreply.github.com> Date: Mon, 31 Jul 2023 00:42:14 +0800 Subject: [PATCH 076/145] [E1031] fix pca9548 initializes failed occasionally (#15712) Why I did it [E1031] fix pca9548 initializes failed occasionally in stress test. When failure happened, ismt i2c bus hang up and need power cycle to recover it. How I did it Add 0.5s delay between setuping and configuring pca9548 i2c mux. How to verify it Reboot stress test at least 100 times without failure. --- .../debian/platform-modules-haliburton.init | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init index 3f6358bf4ab4..aff8503d7543 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init @@ -53,6 +53,7 @@ start) [ $found -eq 0 ] && echo "cannot find iSMT" && exit 1 i2cset -y ${devnum} 0x73 0x10 0x00 0x01 i + sleep 0.5 # Attach PCA9548 0x73 Channel Extender for CPU Board echo pca9548 0x73 > /sys/bus/i2c/devices/i2c-${devnum}/new_device From 2d9be532c152b52721cd9d23f868ab9d36f4779a Mon Sep 17 00:00:00 2001 From: kannansel <80374134+kannansel@users.noreply.github.com> Date: Sun, 30 Jul 2023 22:18:36 +0530 Subject: [PATCH 077/145] Why I did it (#14826) Midstone platform has compilation error in master branch, fixed the same. How I did it Due to bullseye migration i2c_new_dummy API is deprecated modified with i2c_new_dummy_device. How to verify it Verified target/debs/bullseye/platform-modules-midstone-200i_0.2.2_amd64.deb is generated Co-authored-by: Kannan Selvaraj --- .../midstone-200i/modules/mc24lc64t.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c index a391056d09a7..002172f587e8 100755 --- a/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c +++ b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c @@ -94,7 +94,7 @@ static int mc24lc64t_probe(struct i2c_client *client, sizeof(struct mc24lc64t_data), GFP_KERNEL))) return -ENOMEM; - drvdata->fake_client = i2c_new_dummy(client->adapter, client->addr + 1); + drvdata->fake_client = i2c_new_dummy_device(client->adapter, client->addr + 1); if (!drvdata->fake_client) return -ENOMEM; From 141132c94b811370a7c55135611748bc166eb37b Mon Sep 17 00:00:00 2001 From: Santhosh Kumar T <53558409+santhosh-kt@users.noreply.github.com> Date: Sun, 30 Jul 2023 22:22:02 +0530 Subject: [PATCH 078/145] Update the iSMART_64 tool (#15936) Why I did it Updating the iSMART_64 tool for supporting latest debian releases. How I did it On branch new_ismart Changes to be committed: (use "git restore --staged ..." to unstage) modified: platform/broadcom/sonic-platform-modules-dell/s6100/scripts/iSMART_64 How to verify it In s6100, run the iSMART_64 tool. md5sum - 24725730d7649769c7ba50971c1f2955 --- .../s6100/scripts/iSMART_64 | Bin 221840 -> 319088 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/iSMART_64 b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/iSMART_64 index e485a6ee104e320cf8b24c78ed003782d0cf9b4b..0b5cb66bd1abcba10f4086448e92ad6cc0bd5c9d 100755 GIT binary patch literal 319088 zcmeFadwi2c_W1v_5U7GCASfzmRMaY>5kZSu2}(68XuP0!LBbtYE)iO-7c^L+jUjHl z;G!!UcUQ&B?p9Y2aDkvm>pkAuNV6)eUEsIZ+Slp=6jS_^ zDv!;jI)RU6B-aU!n6D28Iym;#*y1B=h{u8^BxF0JZ_yDxS{@z8d@c;8@E81~)NgZ) zPSA?-(VkD$=OIPK(HGa{@X?+RZ4-Q0=L@cK9@{?B`Io#D5heE{|SF!ym8uZCNtk7|JJ)BS@Z)SO@-`^GWrj|C{=Pl<(22bcOObQZ?SP z_{jC01^FmRE3lp4WKQdBs;^i-G$^OAEIzWI9Wi72grf%^F=Nue8PjLg)DEnzIC|jG zgAboO`|v@kX4DJo!0e}-F&eugjf~8w`l1)bF@67U?mBPNqo4IS;?P@1^u0Wu9rMsX zj^;A3PL#nP%+FoS@k$7wjB0=9`>aSwFALc)_~(az<^2}+eRcB7GpCLo@A=nXzV8XB z=+6;Qct--SK#q?1M^JG`yjKw(EK<&6Mfl}K%DJY9d^g};_$Pm+0_aH3(~6Wos0d$K zq@3r9$Ujhozfy$1SET&$MdZIPBEO~xzqd#^|18267vY90=ysL=(-9_}@QiLB2+zbEY&#^_yzpx1ZtOzeFqW`oa z@*z;9qw{EC5q@Bia;_*Me|Zt!T7r2M}Wk)K^eepV6rr;ErR4f0<2Cx3bsvF9#D z%9&S$KUIXE1iXi}w-s7~vqNE?{s#E|QW=Q94gXL+Eac-j~k~&I~1HVyJprT zEOeqSbjp+&HFKv~bF1e}3}0!@4bPcAt9ptxWp;S-EQGTr&J5#m&ctbRppxlxXHOhD zbllvz6UWa2sp`oyX4t5LDiahHuBo02X`s=>OUF%|cImh&9ee< zldHqiCs}hQUojn&f}GW}FSVvjo;?M_GeCoxlV{GIT#a&+YYrqpsgvi-nKgUdjM)>% zS5Kck%bGHG^5jcV7`3gQT@wyZo?}g%F?swP5X8D>*HjnuoT9ZyanN(h#2K^aPPS%_ zp8>^Ty-+4-G;{XlXw`|;SB58#n}AhWv%_HBsn+z_6RT%fbFYLxn2DOzs1}T$1nZ7V zF%DuNK5ME~Gk3=1$zf~C6?3LnPqwDanLK_HC^Z|*0aDe|XHK@pSI?eqVJl{+C|0h_ zJh68CxGB?Tjh`|7s>xQ(tnnZ^_sUsXJKZ19uGwe^>`3bMnd8BtP|IZNl#!>Nc+$8* zhYvb@hzTEMLPriZ!9wWBV+=e7JhYVl>qJK+oegzSsEZ*i-_a5Cb~TcPQVJ#N`pS$9 zoU*Wf!vFM|%?rnxy{7MktF6J92tOsTx;hVzyl&iW`t)7!?DIo9vfFRD1D0Q1twy|eWPitGAHO?`Yl!0T}DQq;n-#?W;F^DJG5g#@4B)ho@2 z;B$$m1fNGdEqI)GR`9!sTTkhFSf2-pdj)@-xL@#<#6yCwCms>}HR373KO&wMyp?!a z+NmeUy@J>7tL4fCznZvD@N0=z2tJ>kD3c>$DJT3S#;!T1-MLZ+;I^tQu8;R!xe}#Bn@OO!~3H}9f zYn{_iej;8bcrUM(^9X(*@jikNA?_9Y9OC7IPb8jibn25oLdU&LPHy>hJSg}c#3O?D zC*B}-{(Jpx`ePj|l!T z@dm-$h-U@gb&#&l^OCb(w!dF+wtrag{!~tb;71V83O=0cec4&>S;YN`G+uI=c zE2K|WaAW^ho%I^~3vTQ$cr%rs5_}W!jNm^Iw_bDB%l7dJUUrn03klwrcv5g5@wDJ4 z5zh;LE^+VcPJKeegMzc2BZ6N^@(qHsowI_oojq?j>t#Fp1!p^l1^*M(n-ctC;u*nL z5x3rS*313k6P)`cBslwRQtK1i01|0MBMw9Q=dHXpx~v0wOmB--ozUO=W#wO zIQOIHZD+lFzW4<{h{_KOejM?X;Aauf2+sXwH9PC&{_+VvmC6YT&i$1Xock*+IG;y( z!TCJ$zT?z~&!eE=d>%yv=kusRa6XT+f*bq)$5}6*M}EQiJPHfW=TS;w z>#Udi#V0uTOIYxE-0y<3{WF5I-&z};^|Igk1YgMgF8EU7Nx`}NwBTHRUhtJvj`uyM zJ}(dt3jQYXND_65A&U)E@ ze1fz8gal{*NeXV}JHgF(n|0R9=dVw2_Med8X1o>LjJJZD@m6p%-hSxR$BegvvtLC7 zXTNF?{3x=2R&aB^f8?x}``0hH8E*wQr-dFN#Z`in}~-5=kk++e@F6Z!FN7J*OwQ3AL8E6ocdG{4+?%h@rdA4 zi8ly-74fX#i-~)3&U(|t{epi$JS;emCn>?%KQn@}e_AchdU-tY3C`n5NN^rcl7jPi zk`|oDlf2+Oo_IfZ>citnQ1D;K4iUk3tI+uy1Rp>=D>#o!o>phQJTCbK=W!`4IFCyy z!FgQD2+re@wb@xOk4rwmd0Yw$&igqj!FeAbBlvK#gY|{8UfzfC34RXAhXkKSJSjN) zPg-!^Psj^y`u$6%KBnIV=lMM%IIm+H1h40Q7o7KnJYPBMy_@9yf;SKk3!WjK5}e1S zjNm*jS$Su@JTCbJ=W!_{_$I11DfrLC(}J@d@`AJ7yk9%@VLJx}?=w`(MFjT~ZxDPM z@vPu6;+`$edjCS)FF5amg$3t*u$16ysGN-8e7;!UIP2x}#V0tQFCoGCd`SxaGS!j^LZB%oX@+Y;O4v&d|&b_ z>qlq3d_MXF=k-ZQaw;b&`02#cf{!7d7o6?y{mH2h_g7GG?w5$*wN!qC;ERc81#cqm z`Po_T*TnsTTgPd+u;6UZl;C@id`57-Ut|5^tk*~KKEVUTLxLYcdL{*DJEsMoOXcJR zj}rI(>eS~>;z7axPCO#`I^qq2ze7ALc%HattFvD2N5A0Qk72>N9~%VU>3CgkR&e%n zk9q>M@ca(BSXA#c} zKApI?)TvKB@u1*KiAMzAK)gZl_lRc&|ADxtle6BQmAb$Df*(RWEci*pQ-WVaJR|rV z;#Oy8y-DIe!T&`(B=}3jlY)OrJT3TE;(5W@KfNxeKJ1@C!P!3}g0p`%2+sbQ6`cLk z)5TdY`=?)U_Rp~3?4K#Y**`OavwvD$o%OPR`UGeH3<=KunG~G;Gc7p#XI^mjPj8u1 zANJ3n;Ow6f!P!3>1ZV%u3eNuN*~wWi`=?)U_Rp~3?4K#Y**`OavwvDUJL_ft^a;+- zIfMk?{RDlUCI$BqPYcfenHSto^4@MveI^nQ3LYUI5!~#v3C`<^tl%js$J5VZnJlpAwwc^BKXLs2pn-XT7{0_6eRP`HzlgYZSEoK< z;z7aLe^SI~f>8zK>J-^^Q z?u7;CaW5q}k9!%xdEB#hbJok_o=SNO1Pg zq~PqIX~Ee)^MbQ~dV4$TW&aEc&i)w@oc*&waQ4rv;Ow8C-JSKafBFSy{|pPx{+SY- z_klBl^FFY(hqGSZ2lffh{u~mV{W&Q(`*T`w_UF9d?9bjlPJP&)gMza^M+9eoZV;UP zIV(8(vu96dz3k6^!P%d~g0nxT1ZRKF2+sa&?d7bO{n;lt`*TQe_UEMF?9XYz*`M=* zvp;+HcIw0a92A`WIU+dwbA#aQ&so9QpFMq@^|C+v1?TZLEI9jTN^thijNt5_RzGLG z?4Lft**`;qvwtQ9Xa7tK&i*w|z3jJs!P#%ag0tVI z1ZTg^2+n?M^>^0Ge(MvQ{Wc^x`)yM2r^s(Jg7bc$b)d6e-VgK%&VCyboc9Bhg0tVI z1!up_3(kJ)J;*evpFF21UVZnJkNeRy5Nk(uU zPpre7_40V)6P(ABkl;L?Bn9X3BrQ0PCwaknJn;^6>citnP;lOFi3ra7Ee(RRe`W<| z|MVR0thbrQE5G1B5f2N_{+SY-{WBvt`=@n;vtIU3pWy7DA;H-XlY;m0>wS;3;Oswn z!P$SjKBqndsGOkSClHSaelGC_!P!r;g0r7^j&#<`{@@p!{UI#4d5%bM?)Qw~d_US6 zm}_a5ccCqq0a_}9cEg1d+7es2)GoOo97 z;lw?Io%N0;?iV~vJS;fx2c`tSisUnb-$L9P;;i?d#C?LlKs+S)yTp@%w-Qea{v+|c z;GIv@cJm(X)Ta;epx}oPPYTX@rUhp`^MbRU-ea8gvYtV~S=OZtO3(vHx+-dX4=BH})6Y*k5pCf5DCYk9XE<>@T>n zzu?CHf*bn_ZtO3(v45pgA7g*Pjr|2T_7~jPUvOjp6P)!L`wMRDFSxP4;Ku%f8~YD) z)@$r9xUs+B#{PmE`wMRDFSxP4->HwWzu?CHf*bn_ZtO3(vHx&qz5VDs@(a#-h6QJR zQi8KS8NrXE@;xUy>*e)>UvPd7IV?D@8&iVwx*{VuKZk6c*=l%)_&i$1Xock*+IQLgxaPBYfDNcR3zk-7E{ep<# ze7~SUaK2xV6`cFs6L8kc{q7f>`#mf;_j^ik?)Qw~-0#+@&U(4ueS({Q7u@u_;HKXN zH~oH^vtHBhf}4I9-1NKPrr!lO{Vura_tTyFn0^^+FZY*EaPF^=;M`wH!MVTEf^&c61?T?qp5fGo`zt6o z_g6%4?ym;H`8>@E&gZG;OlQ4(p85sneh&-I{hkt>`#mE#_q!Ez*313w6P)`!Bslkb zQgGAnf}4In%UQ4Kcfn1+3vT*daMSOCn|>GE^!wRPeN4X#Zu(tt)9-?Fe`N*d{_>pT zte5-CFF5yCSa9yIl;GT78Ns=~taF|9a)0>*H}44w&i$1Xock*+xOq=daPywvXs15r zJwd_EdxCr z3eM#x1?Tm1T5!I8$qUZcFWxaueaw4;f}8gQ1vl>r3U1yL6x_Tgc!9HC^PZsK<~>2d zc|1u8&iJP8TT<3>_&9yij0^SF^0oW~9CMNWNq+z1NJ<3>bq z9yb~U=W#D9IFBcui=FlIc;XkF$CI$&Jf5Tk=kX*XIQN$|)>-c;y8iMBei8AI;8Tew z1;2uLTJZVA^Mc2TdoOY7^C#j#!T(A;BKTv(8wCG1@vPv@#69Dj^=>8Z7rbwkzRn5@ zK9qP$@G-3eJAzndq#S{mL&m`&C$QUQeb3 z=k;Vpa9&SZlbrRkfBFPx{|pJv{+Se<{WC2%`)6Ko_D}C*r#|eTLBZKSBZ9MkHVDrC znH8M<(=)|cFZ-uoaQ4rz;Ow6%!P!4Ef?r5}YfW|5dpU8R;Bn$1!5?D(7rcphTJWEV z=LPS53Y~Y;ocatP9u(Y9JR*3Ac!S`4e=RFGe>cxF-B~Zszkb2_J`8z7UOP%^8$(|v>*?*FPv;U+8 zXaC6y{uq_-o#CwaIpRUVd0dSMp5=ZQydcjpP6r9(Y5y9CH8w6)R z%nHta=m|UPok9Be1vmH81?P2jO7J6SA2=g8+re|0v)+2HSMW6Pu;6XPQ-b?W)&7V0UjE-<@Xt*&n=@JN03I2nx>r5D}dHp+Ru=hpgc251uQW^|C+s1!sQ<3(o$K5}f@ZBRKnm zRqL#m{lO!JA3{kl>!Pv^|r82Z*Nyj}XrbzJj>-I;TE);z7a7&(`%u1ZTf(5S;xsD>(bD zC*rJ^{njry`)yco_S=-;?6(=g*>64bo%Qm1(l0o#55t1<`Ye?%#;u+`kQibN^-q=l=EF=&YCf*DpBtZ&+~d-<06ozZt=~f313Fz1+V(!MT4! zf^+{S1z$n_mKOXC;(5Wh5ckEL`mmpb1ZO`<3eJ9#7M%SgFF5;&_a?c9N*-s*Z zv!65w&VG^=oc+WTch<{(;uqX=jvnX3g8PZ51P>F>2+n?DEp*n)e&Q3H{Ujtf`$W>?e7_xqrP0r#{@jLBY9yBZ71PHVDrBn-!e<*K@P8UhZGN;M~7q!MT4^f^+|7 z1n2&>{^+ci``0Hp_ispW?%$-~+`nnTxqtJ5bN_miPJOt4gMxGaMg-^nZ4jKtfvn&> z4tQ>H*308SQ1BG_b42iF;thg(&ei8jR`39E&#lgSBgFlJuOJ>4JWo6&c=>2uZ$|JC zaqBi`y^D$a1kVr;30`)dEMm#BaAL5Gz??*f(`2NI~3Vty02Eh*_zC!RL ziKhiWns}4o#}Us6?kCxyTJX1sHwpeO z@r>YE;?078LOd(@=frb@e?>em__xH{1pk4!b%)dce( zPw;Bu6@tf!`vw0C@qpkfi3bJG5FaCWj(A9L>q6b$X@d759v0k3yjJi4@rd9d;`M^p z5>E>LN8*bGe}H&O@YTeZ3jPN12Ekj2uMoWSB5jAX;Cm8p65K~TBls!An+3mwcvkQl z;yJ+=63+|%SK@7gKSkVH?DYTFiI)l9O57uO>BZ##g6~D#EBGMd<$|9^+$Z=1;uV5l zMcgm=t;7R@KTJF*_&VZa1aBrD68tOT(**A_R@)&gct7H`f)6Gh5&U%G^@2|zo)r8_ z;)?}O5>E;KAn~PwuO;3f_*=wR2>vDUwBTJX(ROGOydUw5;6sQv3qFc?R`5y0bAn$@ zJTLfd#M=aagt&F5)Bm3)UMBcE#65!NiT4q_>o{!(ui*O-FBg0Wai8ELiB||dk+@&* ztB3~#zm<4U@P~jfW0JSq4j;)?~p zns`d^TZu0f{2}5Ef~SeE5d3Z8X~DlF-XyqdytYF|@V>;G1wV>-R`An_=LDZfJTLfF z#M=bFg}8N>)Bl$eFB5z%agX3{5$_}T7sS1Scb=f_P%il1#C?JfB3>c*X~g}4k0%}! zyq5SF!RHeX34Rmtu;8~5uNC|r;t|0gA)XTaN#aWdUroG0@Mnmx5d1mfX~AD1-X!>& z#502bhj_E#9}~|Co+F+U{0riF!M6}^6a0JP&1{ksAyv2m}Bm)dx_jq98`(P!gY zGtDb(9ChU%zm22q_$OfFs1yGLZM=*j9LL!B&Nd#h@oqLg&BnXic-Y2wvGH0P-_^z= zHtx3ZdK>rHc+$pu*!W@_?`h*H8{f^wm)dwQ8*i}j-Zs9%#&@^zw2kj!<4rc+$Hp@@ zzNd{h+xT8Kp0)A4Z9He=eQi8%#m_uKd(HXg9?Lv1{0;{$AbjEx^=;~^U#Xyemt{BRo& z+xQVSUTfn%8;{udkv3j$%~r+tTv&uiReTScCSPIBuvx`%N4-(xCk&jvHvueiO%yGibkw5{@efTLH<+RQCXO3i(0&ugjV)-uiQ|SAwBN*WBMaJZ;<$kY?Kkm*Rs1p& z$Bis#zlq}p7PQ~QapMZwZ{oON1?@L++^B-~n>cPzLHkV{H>RNdCXO3Y(Egvf{kRbY z{cqy90R`5%HNKK3T-aiuh;|A0^^dB3>!tLqvR_ zh#x58{Y1RCi0>leE)oBwkLZ69|3bt+5%Kp#{7n&mNyMKO@zo-}OvL{#;`fXA5)ofy zk01HPsj*it3B*1M)NRTK&mEa??S4_I6-exI?}d1%TyeH#ZS6e=vV5C_=&S#Qc{bsC z9uGs?s(ZuKdj_Q8)VtHxtb5-GobA>#bOibPl>Csp@NmelfmlAU?#p3;b#0vjB^v^- z{#xA&3OJAoDBGHyqQ(WzkMnb+auMXUY6grB)K!*(q!oyLQr$feuj~Sm+(SQY-I|*O zlidc_Opq%X3wcfbn7`!;NW{Qs$OnrBParn0EfBA23&b{ne(R=|S}RcJ+y^j1fih*N zX{<4qhXFK@7%~*2iOMBLEC3S=h<*L77P}I};;!95>bYlREvx)c?iwr{O7MV4?kQCV z*Ii`_ov7!dSG(#|GnsxI6EAopi1JYJPv)ds5~Z8_+QC`!afLu;y<*5L99 z`{%C_ID)8qxwRneUT_C2yD%DX^@0UmAXb%wSPl~FvL){2>DbfIm*0W@(CnY#pu2pt zt`5Zfozl6kEcdCFd&9`Bx5?FIBMZ{iN9odorI@uYdtG2%wk)ty#{HzOsX>>p%#?6F zl@N&gI|u68wpQ4R6)??lSpKE9C3$$k*MG?{b}Qg2~sjkgt~`UoS_# z({;W>O}_v9pgI6G>+8tZ*O703oo~xzw&Y(5`T9HZ^>^g^6*52%tTOrjP{?w4LEnH&i#bRz1ET2C39=QxnG5BVCKtB?)i?~ zU1V+zIQN4(cZJD)k|Q^qsJ2F{(^gyi2A$6``MMSIL7$c_NZ0IE=;8>D8~fmBp+*XS z2^bJO2vm!v-HX!oRqsaTy=ztPVTK;OvcsXL{2I$@g_(~=B)q^w+ygKaB?hmi@6gG_ z;PvU%TC^})sj6(sm4I^5N;r$%%d6h4%R>~WN*vM9J3SC}wd@1QDxa592IC2Uv)aOm z+~+$%^{xBJ^lMCd%YRWlSI;l?boL{Nul1kkwsILTUCTh2J1H-mA$I#gRN3!fXgy2p zsQq$Rb!fj=0Yg#3e)UR0VZR4Rw21xiY)1S20;fxR`$4L<-}{i0rOtHf#H>0&TVZl3+=;Utw0tLIblfEAdD*F{I9u>2T0v%LS@DlyOW+=V-a% zM(#+PTwzLrY{jOee!7JHO$lFpqxv=rbC4S5cGm*$k7HF{HUeczpobP%Z3O;q1iCAM zUmyjX?`|Wo&xK&uwG+6Y`~1bQg}tQ<q|6IdT^!0?O^22oBY`TP|U}zb%-mzkMR0+|G&M z2gnA7dc@>j?#Nx32q?F6B52aNXPVr#j@*TbfO0!0f_rrCBTVjN9l2>DpscouV4lwR z{a9{sX(69&B2XD=Aft(Z%G$AsVBgC-9LUN5w;#yX=F!Q-K=xjZmXgSZ~Z8o_itkYQdp zLwF*fsC^<;Xh$c452`z~UlZW=_Pb6gDD1a{M9oCtv>%?$I1zjcr%QYLL8`Xjn~>bG z{Z6`=Jt+NUNA^3)q^BSq?DyQK+J29Lw%UF-f+g90Vs3j><)J3wJ~A#No}UZHL}ebX z!gKL2)WDR+F&gLfPNupeA!}pRM#y8e+>be7;*5{p7?}84VBJTZ10}Evp7sRd6&-Qd zFNY+M9|iKy1=f8C@=aPEl7QC$|1PlZQ{Z{v0O8_&T_A=+C4of!)~);E6@S1TSO=H# zz2Q1AUbPXDPL07;^{au{7NzV|Xn`Il7eF)Wsy3FW!u_3xR&8`IJRO%7iOTWV%)f0` z;d?Q>Scf0Q@IoD4iQ$M2Z@_T14!@4!X*!(6@Wnd(1%`t<{3C`(=x|rCUamridtvx6 z9o`SaUL8Ih!@YF)I1HERZ~((Uw<qwF6EM69!b!O8P;t>%vk5T#+;al+H~Zik zB@kQP1j~X+fq3Twaq~9-7pF(28>5>5V*lkPgLy_K?$4{0&JvV`oZclUnGM9&1rk-B zRXVyM5PK!JJBr6X4a7dkb;U7d{(6;|sQe1s+5;R9&;ICUD5q{U{xV zURxgm&C^nD_l-@kyAoF!1BqTy)D5;5y1@_;?_3&K97y!u3atg-I$>)zkXWSkjiSD5 z@FoU2?=F{FR!p_5t`c=TJy4(sik@zZzU565F0MuBsyHsl~tiwuoo z`0~=$cawFiF$j%f2t*O;QUAQs3bvPNMRc3&679KzAF{!&o z%O_`xJXC)FLiu+<`PzlbYW9GN{*D#hWUr`ocfbvZ=h|`cO1ZeMEAj4Bt7|3RlyYhk zdl`+fWR@|kTQ_quRx<~xQ9CNi<6&|D&w~x1H_id~jWy~)>E6$=ag`^b{E0$-u$KRu zU4FKbcX&N0rMhH~f)+7ATKn!bT~~ris6E=YBkez!$=bJ`+o-IK8Jv>p5pHbi;|1Y^ zg$Uk~M3FxhL^>y1OW;gVV~l%20t9p?~|I&e>Q|JD&; zqa(+FjkbOY^Vl!i$U_l)iD0t^BM`iY;9U()Merhm=QX$x!BYs(DrBPSU36d8P?+7+r1tjttkyrFEp@8GlK3J#Q?%gFr`&5Qn3tXLH^NQDVwWfNX zsvdKe)UC#Y``V}Vh0yX%te9v1YAkLm82s8hTX1jhH%v3wKAL7yEpV#nX{P0NC?%PM znLIZsaFm|Vs$IFWp-q9rX#) zR^WMz!m7lGU7!^xC9#`SJ6(T;s6zuk?6^0_YTgLMMmK?NnpRc7ZF94My# zTu3G1xfX-QCMuVX23MN{H!D<*&2{rOTh~Iq&863U1iwpaU<|2z8fBiq8yc~vp#aD> zWIP}Lx6lB_+xV{TJ=MNM<;_@J?Z?=Yl`#yz_z~P&c)uT( z_)PADeeg*47FI#BKD(!B`3q3~ZjcYy?=57E*l;CgySLD2k`B^Ig?kHYOj0*p_GW>&rvw92|M5P}ja(~9K9%}S>kr7U)?{oBrhC!AgkVU)U0R`3j z+cqL`+$k|`sq=mVDnQ;JjBP%%)ya-&s%5|%k&Qa{QzrLAj@*TfNL97GBXy6?Jo4sD=?x}M> z0|#yK#~it7Ba*V(HX^?cDr?70zAFp)Y#Wg(BW*^vI30SJ3sU2Sw(+qVG%T zX-i#R#2RzG#?W?}#&ELXRG$0gd_9{vCqAE2L`;0Ik!WG!Q&q|PQYHGn$}2_gOML{3 zVU^EI?J(PscYryx{Vsdgc3;J$-(b?uf^=A6T=lwMVN3vR^>$hXbUJURq1oU(;q6F@ zs_jUd75o1-E53YQhgN(NFf>OjA3pyNswu3vkVK1E5zlPglza-dAz)KdSP@b^>h9j% zkle8qgJ-f82SD}a?w+xt-=ud_>bVBLrmff)jH<1;1ww2^(WE`>O#)w3KD2T)921pw zqhOHwu34Qp4RK3d5p9Bnm+sRg@8F(f2C|qv$%gpoOh6`!xnUF?n)hYV|buAhEIiX%iYk8b@Mh_)jQYCYX$}0 z)Xf--0_9rxBnqkB2V(dQ9UhF~CLKNr z!~do*meZias; z5L;aj`&8}rky8Mn?G{|yH$X5DUxH%W+(LdG+C|s)Uc8fNwvbOlt&WFXWn2J7abLb} zHU5U(*5!H&8LM#4B%flVl~m{IophjE%|7vj-ql~Eb&8@+de81zC|-;8bl>QOjh48o z$hPG?5;~Q)oN+KSTh6w!)<8xzH0^U1Zla+PTHc0hYuFmIOYs2K7G$Y-6w`6b`9URK zITd>@z}x0`L!uTL8pSYeIb#rvPz_n^sqPymD1yoDx14>j381%}SHPaV(2VznFEN_6 z?2ZaGMp2lyob65FZQ_B23~;kaHkcO!T?r1}-4-fAz!JNw_CVOrYIUWzx@UoA-8q@*fuJssM6D73_wp-#2bvTvJX zdvV)bw|jm2&UTZomleuC6w2qb1-H#l#ERBIL8c;Q?<&L(+c9sOx383olg9Q??ca>* zz}UFMj>diq66rkpBQ8M`m7kslRUffqRf`@}`}I)h{6e9}>OvpJLj6#v-k(uc>!891Gkssjq8ZbIZd<$IHqt009tag9;z7d0LvD*K}rtMC?H46fbO zh!9{cF0pHIWqU1lr}FO~$p&j3uM3ABMY}bg3WbmDxbPBt;eCr29w-z}Tls33=dFB< z+=pBFDsTmC*(wAFAjoJCM9>q#S`E%a zP=eqe8carze;EMWqa+{p)SP4NSb@D6i!Oy~195#&E5%`uPp=f`LTQ{-m+r40BtFh0 zpNo~v(%aQ~1l<0VW@XHjHVREo+tuYAZdd;mlyA3Pjk}xWY9BXWU-d>~)n;fMcIOS~ zDoa?Tkm-%6t-%Y5l88tvnCqUwsKz@3^hB1;-KC2hfe&V5DcGwBaup ze!hce3?HUT--xBph0;N@W(-f&;T(o9(&6qnW}KMRQa-a$IL})D+Fp&5`3` zljEeKIo|oq-twU)M~|X89(3f`-Q@V-1?5w{0OWSl;R7(-Rfh**_^0QU%m@sBrNdzi zf2_lIWB6?d!Zf08v{L15XTU+3`s$6w>t~d0uzI<$ht@D6;O*&8l|HISx7CexD zpyjo!Xu4*7?hCNVcIDi+r(puddx%&;NoIpqv~Uvy7S9h)+wpc?y#uCwt zI*j(L9E-M$H3njDeG|AJiioK3XHh*KV$q;3VvH^#snZtgw2)4lrqfb7ZK+NR>$F;( zrdCk#MJse#M5op3w6xCGq|=f*ZLvZ#w!xZsv zD57=04n%e~B6r$rIl+|SG6J=B0eGAS8jE`V1eLFVwph9ILBPE{>Vmd{dUy%>9i-(V zjSAz0YR2kf{dsk4Mq1qv_f`bx0LHz~tBZ zA7(@_q(u4~kz=*8%OC};0L7HCOkX3jyQ;}&iouX7rneFKW&xV?BUE&fDD z;%(2i)BO`b&{Q(2Q}^fEi!ayWt2!$EuJ+nj%2@1-fGUPt?RMR*F(ARu431^wvy_8tw+bzV4}MID~QIC!-)iK=3!GT*1&e4oI zw406+Rclt^6}fpd;vvu=kf>U<3Y0F;+Z2tqso^oYLKis(Uj2g#^ynWQQ=wu_kfx{J zy0#uQ*MU|#y?!UyM1X?VtkRDrs;9*^VzEY|r+{e!+$VMr-;*hwcg2kGbk~s7GZ2^5&-LFkV;YE{1Si<)vq!)G|mt1qqkA za4ClR!%`|9=(9s&et22-d3_$81$Al1dlD+CQg<5k=W>79@lV$rjh+JTbO9C#?o@)ki zr_e@|o8f`X;bVtiGJKrvvCR3K@$aJBXLr1S-R5;w zi}F9K^~a0qpw}O#87oClq4=UUE%TC1=42ytv6iuZQRTdBlR44IRA`wpE%S;^<^&_t z3uN>(55sBnJ~h%-esC;kdaTy^C=ksZuEUMU_t)XWknaxR#^}GHWSoIp$Hr9{cERe> z@YepqXK{hS44==%rH&dlFbi&$4Sp6g1`@7o-h?qf-nomOLUX1otD%NERVqxO>mk=r z6}e^+OfeOx&TT7|p))w$+^EA|dYP`$#a zz8-2YstbRuKL%9zc)3#3i|V|s!(rqv=G1x@=jrf`$S;F%5o`WNe?8x!=1E4)SD=Ot)ogbaIT|DjSCOzD@X^!ovC)}! zvkYwJ!YX)zvbYZK{sc4^Hhkf^=(?QOakt?o*f1>IZTJ%A8r{=Jp(WsH`8Yf_1iyow z)xlq;u6eUYth*9(4f(r%{HY&Q3YECmz!eZYm-!YdGHHH^6|2g^LmP0b=3W@K>*i&8 z)a;4^m>j#Y#A=0)4e8jk*Q4+zShlN1EWzR_eAd5oBa|XSt9Z?(;jz5ZZLHBPjIEBl z?tE11HXq7@2U{jy=hhEsodvqKgyD(`Ke|+flk9a+1E>O90~osuV(mKOMSz8lFkb?) z_W{0nSe3<(=rmSsQco1%D+tii2sQv;mVxjl-6PG7Rd3)-)_N>hP49>|;kG(Fp1vj% zugb<=b^o&|K6(?T;(Lo!&s z6bbK;?23ubmngxP{NPKlvMIbf32T+cs=RK&x26T~z%xvcsQeYAJltt$w%iNUt!3!H zRWPa+HW&se>+4><1L}=I6R49vdt7-5w1}+n7U~5)qMHddJgY&Do^^w@UlqKnW1e3D z%LEd~m+JD?t%4P-rQR&az4RECEJaH)aZkMJ+e4m?W#XgqcYgmvY#j=z8xVNoBldhf zSW-Qxrd;xS&=2+_;#88kL85O|D3QNGMNqwR(tr+U(KHJi3OoYgb`BH=VY>s(-&_Xj z+pQ1&6G%k8;FzoYc7uM1)g+?+NQo7oz4ON0)=$uK&lnEVgX*Hs6vrFySWqDL4qPAC z!L$ZC>hrr3T9{H3L+0qD+!AOxYyf#MPu*%fK>vOO*ZugKCM<$M9}HTU06#77gYHmD z2;!?E0L-S-U}Y1PClDX;Y#-csi6ucI0NdxP^fY_`V1cU-{8b;g7AjEq+>@qwMOVP^ zVh0Pi!Ho&b#)A+8Ur>?M!E2`Ts$%Pg!wb`iA&X$DG)*tVM%JzOwEVG{K5blf zUE1j5(9);_TEYu&?e!t;l|u26(0+$<=br~U^|k9%jrIbaSbK1#Km7zK7VU%9YK)eV z$zkgf_Jok}`@?XjKt=I<&^;HkpAv_vl2sOXv0QZ(I_fw7fFgz}Jm>FFK9&LIfXCrf zr@hy6^4O{lxzr-QPr;wb%WgM}LFvJ+$sVhwkGB+w49LYbn_MhBk=)&wXak zj&=X&k>8;EXl!VFQH4YI6-U{0|0}kxp!@UR|F7si7E5h!_k)V*&I1CR?++_|^lX6l zE&77CdMXG&ZoG>^Qw1jOY7z%PB2HqCcTqQBVezqTwux+H;_m)d_7{98);v`^a_GjI zuV5f9kFDPL0VKtiW#Ay@y2j{cfcOKW5EQ_3Opb%_c02@?sw+>x5i0ifH-SeQqu)|C zn3+uIXA?qQ@Ml9b2h7?KZPAC%^`R9HIINObt`jr~=KO&$hN6=2Oz9e2R^U*1!nmDS9_{VIbOLR8@b5=!PivX$j5duBSm5tK9-U1xv=5>f+X#4N>g!lGYhe-n}I9 z3W&g6PI!_8`(-u$-uGH~z8V9ETzg^%9eUI|+@ZVSt+Mt#-qQ$dfrWD*t~?%ITZg)b zD^GwMA!Vzfa}&M4Iil18J@0xD&7(YHHU8e}j=qk+mn((!`#v>6_MTdkbC zdWdn4#@v3FmEf~Dc;E6ts3G_81K=wmR3=gRF9dfYI1@l*wK^xN=fW2P(Bd`rVm8e* z#iTITM9j6PF6K!DXCo+6fLyaNcj#=B=_!;s9A!4aW7tslYY6%wcpU&+dpueDx-qbd zN<#BZOO&JU`6CvHp9+kA1}cJ4@Su$1UJ!?J;)|Lqe%%^RV3$!={Rn&}4>e6!HK~CD zUIqeRsavhait0UJIR*uB4prAqaL&}NRwD?eW5AIQ<`}qk2ym{W0WJckQ)m z{e!(|Mvn!5Le@dsDt~aaZEa-1KJfkqcmtJb*3u_J39Sdl7hyZ#GYk$ZsavY|uP(7V zGSDTsaEJBw$B+-y#RIJEQR~>EK6rrXL8tZ6XptS#i+c z)TrOOF9=OBLNKCChc`Aczy9b=BI$>Mq05p=-?vtohr?clhr?I_$mDZmiUd`rTGgz# zR-FtQ!=MG9b}D3o%TxO|Hac;Q10(2&xGyuNED%ee{|91AvUrFGJV5&Z&1ss~)C;s6 zXq%=MY8(&vfK~u4!)R=YM^V2Ymsl8dejrJ;&;E_1Ent(}X)p-!t1a7+e;Vb#ec#Bp z!pBpT-C={iKh!r=McfPV>(4FopogGqH-f(KMNu~d-%~;O3NctJvRX~w?gjWM7$a6a zERa|Nov>ZaD?k(cv{U{CqfAS8@~PIMbALLg#EW21FVC5xjo-DnYJf? z3(7z9o{^777ohjImDEhwUe@z4>ulTt(E7FdwwI$n<~XlV8H^XnPt*tz!Gm6Q+*(-z zwpS}C_kvxN#kAYI)V2e>pnWLJY%r(21*O3if6d8!Ua-I^B(RJG4wM1|N#J%Z;9l?m zS{7a(nD^_}Rd}gjM#a}sPzSu0011$;`dw>z{ex-}I&XVTKJq@a&t`S~L0<#@-noORt=z?9#h4 z+AA?63QB-xH^V`xk*kJ!;qh|VQV@>_dt&o`uABEWyr>wj`WXs;1O#p09|42lOA4{o zBe!Cu%lzuFr~(eLL;!w|h(!m(!M=#sw>CpSSB-(ZriXm@LJ$Ia zv@_Cp6sv=W6iVP(tgb7f5P@%0L+iKJSEUQ7ogwvH6U8S?4=^!*DU268Z>U(ClumPhfPzc!&W2IVbdGxu+=D z8=})8=7q;dF{!E^PIvUOcody;O>}?oQ#y0ryjwljb33dP$3dE{hT}_Wc3#^6k3Zzb z!|4N)g-#!Z59xL1v-G<^%S~Bx4GSm4QfOan^)+8%W0r;C5L;BMB8h2m7#WL(;4mVV zxEK!h^8z<=;gS|86o40-IS#@lEdy7E^XN7W_mhG-lGKrqRIjnT!0V5$&YS_n22 zf-4HabRpPO2xd44kIO?4&a_gn&!7#eLi8=7_-)p8S^Q#*L7f4?PI(mTXzihMK>uSD z8h}GIHWYdrRcnks0l$?EO#x7od%+8O(m>Hwcz*$gt{?jAIiq|TF28Fbr5k>;3Z4z4PF4p6w>ZE~_0ewtv|dqY@HQ+!rMOJ<33M^-CeYP1 zxKJ^*lmJw$nn<1MY6Gisf1Q1R?yuT^>FXL$FdoH|W6kh00%<-WN8E`g^FqLNtMRv0 zeP%B8ClH0px#|(QMJfo>&)s*S(>#+~pa9Kn>Xbbu{Pawk&zi!svM5)V9*~#bx$4Wfp6(!QqP(zp<6Jk^P8}}vDN0YpQzdzcvKqHY|IUZ z`Kw(iXf@P19`QisaQiZ<8p4-|>idiMHO3g+@pB!%tkkOSUW#^vELdg)jxqHa**f*1 zTM0G*QOs;k%D%iwAlPRZTXp>kh1=&p7x zf{V5{!6CM(*lkag!s*u;ZmGfSvQsSjBGemKzfq0G+$&HD_%?O}VQ3)id_mkSAKwKv zwRzMufo6bd;zaC{jtu=Mhzmojc?W81#!E$=hreyDKFSI;;^%GkyGtJOg?ph_TE2zt zB50Goi+ch)kMiJDw4Ho2isbWbC*P1F`TA@pU#ZTg?dnnI=ni|^+Q(HJ zbzXSFL%(RKyj6b{RvYpxHk|%aEZG0DTfroCZQd)6Hc9HEu#j|~PU?C&z6YgD=i;Q} zDA(oOGb!wu3-wNy5>3?i(lPX#Rep6^sco_ikKzggJ*LxdYvRVoY)vfTbGx*r>)Ki< zz16iAPL6GR{vs#=9^WX9C(!5N;#&K76GY$!HMIDeEpU;e#+t}#HR8Az;MbkCx-NJ0 zXmoIGi$*`b$N{_H>mfIW)P{R}8Ad?_OJ0eXUb+B7!vwMlSJ#1|8TTJsA&E+gkLkRP zY{x=2&{WxU;tTp4=FbP}o`y}QQh25ks!4=97fR}|>hJdGxD0sf0mmmS8$NyrI|bz& z!v~FYm)pOyUWVWJsB7CF|5Oa;f>)<05({>&Qwo*MUyXX=x+CnEHTi%VH4Koq=l}`+lLC6B0@FQC?CA z-Ufkh^KMgIeU;ZHuDS!ieGB!^*Y)cW|D>d1mjYW0I>7Ui2((tZGvE;d_0?P$6E4Ja zlm-U0BQ@x7YS1x-toTlga^#L%Bh`a14ab!s)XX;|*9R^1iq>#Ht>JUPw1$~K7Spii zreu5(oj>T4u_R8jt!L-HScr3AVUm1L#bfaNmMZI++=~j(B)L&fl1bDeG34t#@KE_9 z9JE5&L`PHCJz%^Jr>?I-yvWqm?|V$*FK?rx#MGRnU8!3Q4x2e>2fSPYtJ)0(sLq6hMR7=ot5uU+ zSl)4 zI$pcnrIR{ZyIe=PoNJdWcVz9d^WS)G`i*NB??bjG+SV>*!&lbA$kW`8oC#3cTvMxCS#WEENWn}q1PB=aCX5VPOqo9 zjQxs~@&9O11D}{ziyHXAmHXx|f9s;=)%)0Sc4SfWS0nwK7d6u$>;J`~=FlGCTi`24 z)q}76f3T=|)T8Rxqvfm{L5akWJAmmW!x99)ZBcW9E-*KtkoAAIsM$>wNQ;`0TElPM ztl>{L6w|QiqNdLR=LA!x;?M_frSdbm@9R*2CYT5H1oHya2&U<)4wVPOL7S`_+@;}R zpO(RJJ^r_1i<-V5US#P1a65~desD74q6S`}Jq&Lyj<7FMj^SkuKEOp%-BHSxt3Sqz zEp6V}1SNO0v{`jMR@vdwW-ZuB-rRF;7%oQR#a7qCKp0!5{-#oF(KLumvOR6DZxbvA z3P!`drxXQYhZ93!t_CRB%9OGyo*H~!1`C0*utvI} zyy$ZqY0SOz5w3=CtFLY~{>E*pOXnMBMZ4rKQgLwB3E;K38ahn@a@KFOvmU;Sa@N`1 z@laU{2koqvKwq}ZSF53Iv|;2u&ehQEP;Wenzx6g%IT|pgwsHxpZ7S?RvrRP^YSNbM zidTnNTNkrU)xJ+$=w!}5!Hawx81K_7BFtkpiEZC~D{NDtdDLFE!^E@9l1* zn8$Q6t+;1~omJQn-bSW*lnFOOP|U5izjXE;IHxP^s`vbDc}whhcdNm>3ChRxmmtBt zFTEDJp{}h=t?1E(@52>6{P7puMp2@Pdb$CECzyI_fbL^_w-}c;*q~l&zlNkM^omkR zt6PxzMnaR3-kttfkiMO;3U4Q@@zU9L4XPt`Y@7!$rf!BpW$<|tn?j_^AE0#8B|Bi# zmOGU@Y|~}ZAfq=8Z^vrmi?B&?H9ihsfs1x9--!2d-w@}C$Z9oPz?a^j{n{+>rt1;f z7-*VC$bs92_$U7`)M7zee3|+SfZ7z!ZNpndot-cnK%+D$4B zU3rW0vS)HvDnJujEldM&c|W#`n$YfXsR`{tIOqv2adk)23~ed3pJwg>@gmdAv3m8@ zZko~U>#8=0mSUfoEhW_c9s4XQe!&^!^##>4z2W}}PAq%v6JUk)~>n?O{ zy`_X9ocB(=5`A7RhUAvgDPSSkQd$hRPirdznTPZh~lZ(T7#;@{oP@8 zRkbPhbgaq!&!_SJExbO7uP$zag$KUorZfgIe4=%P>#HL(M@pIRU&WUhsWj#9@EUGV zy zcfG(u5iRt(5jq5g)+?b0SZJ;m`iBwfj6(M+q4_K{Q47V4&nC3Fl6jn+cLjL;$!@+qO7EOe?C+RF%qQK*{|`eHVjV3-#AFT}M8PDi0naS88g zVxfUrC}V^ULZNj^=&vl)PYXR_gi288ZY6Xr3w6^%HyELfSAftJO6UR>`WfF*gTG*B zgq}p9vz5?b7W!NZ9dCqgMWKO8$jw5{T4)a=G!upJrHZ)g^I2qqMlG}j;@SiO6#5tz z`El2?EcCb*ddUbKfI@4OP>O|?XrZM>=-10Z=uRbcH4ELKh3bsZJ1A7GgwA83E40uh zM(7C?I#UT9$wHH~&`=}vM-)0#33X?obG1+}BlHIpaw(zDW|9d`(?VZCT$`W@g|e`5 z8h1U-LdR;M=Z%mTg`QGEOIYX-Ep)#T`l$wl?odLtEVRECiWs4{Q0OuxbPfyct%WW! zLXV-)NF{VQ3w6;#M;oDqD0HwA+KGj}K1%sh4=r$!(!$M26&^#mbIttBFLO~X~NehiJ zLjORaQ|Y9c6@KDAZpGbzz}uEwrll#oga6-{|7Qb7cKND#I*^IN1?Zs z&`K8i9$r+0@oAkA+5?5)F%2l`b{6_r3*Bvmw#)&cgc6#~LT_rJD~!-fC^St8oyJ1z zwb0o{XekPvq=XJ+p(nJ^KqFL#Li;Eoi-jK6LS;ti5)^{hq(Jd^r;`cp(n23YT$^Ah z3caC(ma|Y&3#~Ciy-?_%O6V3AifExbjnG$@fzVA#Xa);iu7#?N(DNvSZ&1Sg&qCw1 z(3wW)eiZU6q5WCtY%O%C5sIMD-b(0~Y1F!5TF7ODE<&O2VEqwyHM7uRS||%~ZGxjw z2>-lq-1RRO+EWWXWrTX5(4$J|W)|wMh3+syo5LVDA0OHsjt;+;yE|0a$V19=~RnYF43G4%mk1 z>+l z=w9%HYN+-#^C_0*bW|gQ`U!@@%63|lRCj;ovunaK>HUwv5V?RWoZ|Fq!%u+k3Yv9#ZiU3$#o0y zQ8jZ7yOr3fHRBAsjo6@?(+#`buwx8cMC_;2U94f`#s?xW%5ch{dL!l(g1Ef3*0 ziCM&^-n|{F_kY;?68NU7?EkdoN!d&RkwuiEfNUxX(ISgw2?hqRqAZFFisCZP433F{ z3KY{|<0DcXQQUC`6?bM7DAi($OjB_KMa2=vs-THMt*Ae$qWr(--1}bMdwEG0YIXel z`DpLWUCwsTJ@?%8S;$V1lOQ`mPJ(QWoFN9X6XYbw#?4+PafX3xtR!;U*+h2r#aXmW z=ZNja=bVzs_AS)Y5)!>qPtzoNl5d)xmSADDo~E%d#CN=&rm=9cuUkYp2V{`^V2-yS zTA81b5u0U8k$B=uhoVzu5oCh0gdh`?B?PHa<}wIUqb$#t5TqttqaZcmvLNreD9b^1 zHTD=C2Ty8$gBt228`LmCZbA(c9FPG59I>N~WN4tyGH|4Unq*K7 z4b*s2jepO|a?ofLdl!7cPE97`G{M_Oi(W~ER-zCN4me`}LLu~N9v=BNrgopB?Lg7- zN6#T+L3OS|9lEj?TS#@JsQh7kvDYztw{LnPk(3hSEduU?{_q4!`P|nt zQDz#Y#0gOr5Ye}>Vx3Hga6a6DyBr3vhf<1S1lx^LS{cDId2I>olNV+=Iulsh*OYjv zcncpLLY8#l1t(Z5-)V^yM!VT}9OQQdR)U9L>$y_z`G^5(l4OkmWdvQ2fnM=we@It5y%EJvW|p|Z;&K>E4T>{%1RTHzzvc)Cu!hL z7T{bAZu5BnSA(co6lcpyKh4%U^<5}<3d+S^N-8`+7T&5Cz7mD=s4(5OH$%>ph5sQ6 zAFt(xTsI#pgd7w(ElW>DWwhu}1VQBpfQ(PjN{i+!lQpJ`8UwZ5kZYLC8KJ@IFJSd! zSZ~aP+9@yNFCG30h;LE~cf}u8Ak9l<^`9@+*k6Idq*}4Zg^t#e?(-F;4$V;FI?&tL~au3TC0XfEgs zyocO~Qi{UEsqhy18Q6~IMZ^*BuX3DDt4Pz&&jk+u+Sf`<>@wmV{amE&;&Q5W0qnrS zErsPg>BHsZjs!(1rLQdpm1)4DDXCE5zLJ_dW|3^IM&eMJdoAbs4Dva*mypkSBBy0( zFM;P6#`7h<4HDz6Lz9tsNme>mAk#GS+H0wVxa$J$ z3ukD#Ay*Y$GsRG~g>$@p6FH?aXN{=SvUHHZcRU43=?Mse$}r%I>#PZ6$4F$?iHavB zK+cpP&(}cq5wLnQtgog47Jrj6QR97CV}PhJMavPGA~Ls~$i>M1C}5D%#&t$S$%kag zPtIonw2mkXP?F9-V94+AGaMba?{GvrQgp13bgUCaPxSUo6v#~!=%f`m$p=^`0v5a? z9oCoxtns$6#`ttt<9%jWyQgM3FvYN#oZaGvY4jMK{&JMVloL3WGDK+#x>8h=rX^EW zsX34PC{1l;&i-7{=I?Nhd1{M?*DeG&n&I9wX+}biLarBNt(8ge*2$bD_VAnDd^36~GI zh9P1Y8@%zQ{CE}=zfa1t!?UonTdcfIrN+g_n(X#ih{bv9zoDw}0U+TeMBv_&`feii z&42|&3F@!-%dM(}07q4B!e4)FM`sZ(WpQNLDHu8YwH=&A^e7NTmcfi8LLWx2&GP2O zaMyygGBKBe%P|FaVaa@`=d$T6j-qZv=?UO84#nQXPivK9WtACRh5Y`#Q?eXz3>>ki zY>H>d;{EjEFQGVgi7-(!7AJ%t=zT1%6G0PZ3fl?re?xg}tT|$njpav*^6O;zE$1); zf&M5HQD&hEe0>M6QzvvZeq0I#jnS-P04g1hN_InQ1TDfdRjdeYK^e19K<~LTKrcS@ zO%MKZ!O8f(1PVr!?Pq2=x)3dL;4#VHA<1vU^e2F{k_}-t=4p#dcXM6X4OuAk!ph*{f=Mv*O zmLrr>N+{tEU#iLzoa;p{J$L<$vws*R?$oOwq3Rpw1r^S|2y&DSFpb|hS8NO12r ze8ePimL}rf4@NPT@KfabagUJvDV(jr%i2@-duHS5kf}R78Cx)?F3$A3_h;aRp*9QO zEGaQSTfAo_9KPgr`yb9=pNhWCV7G4nK4oj`_JvePRU*c;Vx(0DF2i5g(903fKN#1i zQHaKZ8s0~}55K4fp9lNL(M<1|uzwuQ@{WW3<7f--FxWqiD&9e`e;hr;+Z*Lh7|UhN3%F)0uG!XixF_UZvoRM^BXhO#$_z*BB(goaFk`LBT-8rNEYID} zz*c~Z1m=PuGLVsgw_yzvIt;JUQEfhHl?fjutS%=Q9vm?YOO(FwR_EK+fi%M)5V4`uOG`C6*u@mC&Zi04e3#Mita zgj-n%@+GDLXH(J5xoA|&6JI^gA`-P8A{qy6A#g~V0Jm89oF_CDT)NlD8wUHQu%YjO1|Vjn0)7DTh$ccaQ?vSOuW~MV z1u_IX?+~WYh;0a>A<&Gy!4l@boC1fl=xWp!PvnM}-iaZc$P-adXddJyzTSwd)|xbN z+L0kNK&Z2sUn$hef>c6%^-Ma5ws8XW^0vNlYWZ_Oq^@0qzxYDflN|6z3DwXl%8_mE z-pbFl^fV&*8ls}xdhu~u{Q%Wh%U9E1OLe;Gmv~-(FWo-Xp8k1E!m+f(UqLCYFPmB- z-WfkxHt70=T*6uOFttM>c_^5VACK<{o(3!%s@YrV^jtS;B-g(WjLIqcU(Z=}K* zC1`^%sP>3=2LU_pUHq~pesuhgS zkc!fpL6J?NV`QO?qL6R4m7dnJ!2PnoXlsG5siD!1)V?HP`b4y7C&~5)vcODHK$AQT zKGvdTvgjaLbda^cqq2Zg7LX$*wPFk_UP%D2m*qbsRYB_|0h}faY?K8gK-y}Ky-n(1 zVJ1(OztvoxhwO)K%6FILFEE!Uy@~m3$~$EF<3)LA(K?$(+uc!!ypJ0yeCT zmLSiPIFl4*pe%5b#M#!+uO?avY$FTPOvG00zUv@_v}=-RdfDMg@~UzyhF^beFPdI= z=jbssy>8FZ-ZZ^Fgrj}P@%nKrl^sBiR}Du8lH;|Tqa%F7rNKyCl-PJ5F^?Ycw>K#a ztRQoTbMy!t-gYQXF)`e!$^#5$kOd4h*`b4(SPwAM8O(8*HnIGfNsf6`^LvVqOfXJh z@YF*Nt@Q@WYl)_{-{NobJYeq_o(J%xF6sOZ9_q)`iT;&MNiHtBt{V9#~2E=Nl^&NRJL~^brN)Mr^o*=B`osnyPrZ# zHbxUoH5oVsgS9hdFn%H026s6rAJxd;SEk~6M|yOvqybN`_N5YJOBF-~}b z?ph?&>g2TY_%E#mE$8Fpys}}mMo35edK|w%NVW$M1r_dE!<5V(UCRcbn_xmWtTE_X zH2~fFqm10WieC-lPM@?2Nsf35GVxt3u2=B7ltIiD)!D&KGRuP(0VoTzHPRhSfAL(I zXa#)13hyE51*Pm{L1-J5E1~8}D|S1=ylqFsK%e*W*uN2IM4F{#BJz;>5-Ih`Ok`Y_ zgJhOJLPig@8RXF7pitB;2U;GKY}lbU6K-sVw9+N0X_zv%S%aWrDKnMI$cC~}nO}xh ziz1qpK`J8Yp{1Nzq=s^JQfbyitv}RR%^ zgKs`yGZ}|^X}tI_GF*XDTPNU)VeABKrJ*{>2?zy5dY}r~5%wf$n8bqeQC$cd- z!=WQ5lg7Jvo-wmUA``xoBYuQ2GZUHcYp5pqMgDSzG4Etmc&xA?hmjqItFGjo0wUGJ zGBKtT7np`-wqnmiOhF$TW2Wg)%!=*^Ls~%wWdpD!18f0+%LTv*xpdt)T*t!Ft_#{}F zkCiHqJX{?`-$mi{epva#K{))o$WqZ;tMEtL)M#*ddh;5lkdyes` z#!TW_X11bC(geLGF)TA%QzmJGo=MzFO@J4#Yr+VdhFj<&O)xfGzG%3w4>2^{iczc( z*9p2SYBS}A*Cwez#Rao~{|b#QNP};vvT_v{T#USWD0(AzDvI>;q*fee~ zR@Ammf`5@#&L6&3lkr`r0Q~@4KQ!OgQZH-Dqwp=y;RlAau8oIY zI&DO0ycdWhxnz1rChca4B+rWCvy~U{79p~+%*Ul_Gq1&ntlW-z@Ep5<6Gam(HG9jl z&p>iqDT7&|B`E5R!2++UoR12a;SNNFafWtEQDJWEIk4uD_DYc}6xA)n^kf5Z3S=E6 zf=K>c!Wt_?9aZ_}WSZUZ0(_LCya4|JM|<#O5$}f6>33>k4VRTqK_EfjVuRLej<5chPW`q^}F5!d%{*B_uq3q>yk*6`rFiDnMg5 z*EbMouA^?OeWGNN1kynQp;;m6L1q3N+GwFDh`e0Tjjto}e$DxN%Q0rhG$+oBZ2;CGkW@*(<}@+1gRh`S}uhf6s-l? z`9K@LAOW`?Y}G)fb+UyUQA|u%z}H>}fT^R00E&rynh0XLh?icC+lZb>eitz2&~Np# zaB;E!#?2B4KtwTpB}-9h28UMyf>V=$VmB(^xeo7KjP4@qZjA;v`9DS{AY#@?V(=(@ z5bq|;uJQ!&k#Mq z3SC<3^D{6Oht_-rqg!8bduAJ??a8V)+I0!E>*zt;dQxkuM)N>ptEOf$Q4O2XedR0( zwP6eLbLqJn0ZCKV6xszf3GVd-3s^l+GtUeNE9i{`w3_kratTK= zv%kTStf9sg{vlmQqF>TKBnOS(u!n>8%!%n7C@vLpZIOQAjtS&I?Ey60ZW6j9g}NuL z1GR_8dx3qZdk;BK3bTK-HoI}8$1Dq+=lg18dE(_vKN0|(@0G^|#R zbWR#jOP$+Awq_lb61r2X&c$f|<}POnDP>D%BskT+I=8`?_n>V{Z5ZhCo` ztZ^;spL~$@^A589@Pn)G8Cfr>kuxkNR_2L7K7Rx|=)+>>)G9#QioQ4|hF5yv>AQRL zVd0sCAi~!g=s^eiB`!JO0L~R*zHp7gD^NJGu9{7~np?AwqGjS*w(FZL(aS4FV!4vx|E%;yNqvj~^qwH}yPp;Bs|CFToT3Z7rXciZECk_;D1v>zYC4C7%K4Q(0`yV9bQ zB3>hx#xDRm>(VtfMSYj9N%*{UjopQvNAMVsho;~$KzW4{)K0HbAinqRJy}Nw^F0Mk z8}mZ){sp@nxP5{~q_d;h2r^*ESuwM0Xr4Q%`^lMTIqXxHUa_L!uGTQBy z`<~9>(3868#)snZ)NY-n@>>Mm-})ESIOfT|n?@A4%aE&1{T9>SATGP`Ms2juY9gy5 zuJA$By4eYOy7=AE4BD3PFNkJ3Z;fF+-2bOt8L`)zOg>+oihi}Q$-u1yxVi<|JmOye zNQ1>)C+Vc&!yogV5pmbh!H9^PzG_-G$9CG#1>^;3o31LDQa?C+HFaExeW<&dmV&AQ-Vr;IJ385NN9<76JO)I)oGvxfA`x(; z>F3l4c@@sUYk(jMr|pOZx$2~9l&ckQlb>4&<{3qrT4WKTb(bQGum^q9F|V6CX^%QJ zs`?lcjaYfBsEG`{Jv~z%?(O`nxGprjEdC*Nd3SZ&#S5xw+;!ec7qV^C;_FTZEdVB^ z+L&Na3$~4V!=&*4TMz>ak4&p2poaYaF+xio<#D8%8kH9eLBjvEmJHe4JX+G>@6D+t zuXMC%NtrRhpe1y$i_~8l4~zT8)58moNT(jvLOt#oE!3lUND~{8Wq>c;q}Wx6tL{b` zk^V$zUFHC8h}npA+Jws#W|TN<6J}S&H%grTzKyAahG(;mydA< zw&^E1g0;bo=q4S(t_FNf`6eT7(S-VsV6BMI1}oo+7wwf#IN9`4hw!(TwWlcE)9~g9 zCz~Hojs1WWlZqZ9Y7D_%Az z_Fb;~cf)kDx$NuCI~%T(sqE|3R<%6aUM-hpThwx)F~Ojg^e8Wx9mB+X5UCez<$#=Y zO30-`u1}>Bp53pBmGE1G5^g&fB_!wDVwG_tz**EdgZuJ2d*!Ud;GWq)-AppL_rQn$ zEjs20{?>5iwl%ojt(tuRo&z+q)+1le$PuF>FZ(#xy-8bW$qP<*(V1%Fg3}UXf~|Xz49YII(KRElEs)r3qo2|`ou;p(8DPkD(rH4| zXQ7RoRMUUu#nvy@u*FF~QEY<6)>m$Au&&r>NqrYvi!cQ;nZ#?12?i~Zn}V8_824Rs zv(u@C+!VZ_N~p#7o=vP4FJRk3^GEp;cJ4+lpPdar4L5-AJZ*0P#R^6iV9FJY^Au?W zokcl%blEtHl6&AR8rDLKE*peYe{D-=(f^@OQDoUsoRaB16nE8}MOdMB#M&UqvgMdwh-)IM*=>_)elNNzJ-aL4RS@B-c zJa}Jv!ou$WJG^Nc>UC(nsiAt=0ciS$YHcNaO7q~o{c(%H+S}nxBe46)@iTVG1EtMk z3f_CnLU=A_=Sd!1T@97I7`kPx4VZNNOMm^BUJO0q<_3?=DgC&!zqj~try#**G4$hF z44lSE%QjlC=9bpq49&noce2yN2`!xF#mGJk^+BP)mAxJ83RW=jQnM9M7OX{ORX3%2*>7 zH2))&F}rgUE92>auQ`yt5VvSX{b$f0(gdi%TVTsq*(>92b_#C=OzA*=1|u)dnN1X1 zU;%nE(q#5;r#VUkHfZtvL}r%`r_sYk;@ArH1^J>+HJw|-HGj^k63?EAI~Rs|Pzw8Q zI_7F9p4?%ol9m+;{~?4zgi!;eAdH^uLRK>p_SxSPgwYdLDF~xCkkSyAB!YyjV$HQC zF}twojK<42;AL8qpa+9(#o$7%lF$WV`Ij$O3W=9qM*OovFy3~5<|vsYAid#K-mBGSa#R^rZXD# z9m^)fEkwQ>XzkR*19S(ezs7cq?7h!o!^MlW$ zr80LT7g9T;GW?$gx_qI#)7g$nIOft1?mRbb=o05rY83h%NA z>|`v>HDoln%Q`jssCfvF+-V{FIjrq9gz%(2&5f9GGz36%Icmpvo6hFm_M>I~;6;LI z{ve)?PkJq0*}OYpg#!*g6wql6rO7wplOB)7cb|+^_%U|N`|Vq7u&^bL z*a39R2tUYASYlhLpX#9H=qQ?%Vt)2Nsft)_ z2oa;GKnfsk)3p5?x~?55$!mj{LptJ<)a6DPd_uncgR-;Mi+1gt{ANg^p0s0wS$x32 z(l{wtRdKB+upgZI`I`%ld41Fn{ZyCN(%-cP21w)2m}~CS_2k0SMXqvlBUx2|NOLZw z6Ow+GEtS}eK5Gq^?Xz7T|0iT)+}v*EjU_{2~yZUO!0qeM?9-$HrW zn9wMH>oVLzOuYy${jH<#65XQ&FReDIzvV}N(EP1gG|svk>2KkShmG*Jjx2!!m{IDA z?hMdj3zNq(>wcSIsObm(o0owqqo*{zdGI=|cqiN8O*Vh}f&S(?!~En`<}ONIA?;Nh zbWYnNbs_XT)0!PUd~F(Y>5VQ`x%j_^epijIT1}SXb8@E;7h_^qHel{*!#UA4Gzmb# ztWUK*hI%FPf+oO-fsadtTo=g2xq%pZB5r!qMO?i@Ie8e3zciWhvD2+|K~rKM>fUPVTwzw&p5s$X63y0>uE_jeCxSg$Ca+@aB?o*&{v^0*~ zpGF$Y&aY47{2$ZNhmPs6^oqc%Hrd1cj76R#Iq~U zTudXS;UR`}%15hs`pnF|-Q*%|cP`D_NB-YdyvMTjNaw9b;g^l`cj@-b#3>ITgSKOo z{(@$?hzsXWu5WA3pXL|YtZ(moKbmTXcNAm^0#C?+#U>e=iKf>o;Q^1s8 zy%R2!54h#R`g3qe`GASD$V=yzH$mT>fd`O^#+I+wR;7gbzvo_U+?z&3zY+JUTUr`_ z8}8M$U#F8}gWaoL27ms4!M(b!CJp<)x_kBBSLvwxwcV>>X{l>~dnJAH#2}Gsw#GyH z1NZ(iF2z+CCwP$5hN`qwboqs-`1Fg0P;vV`zl z!F-L5C(`F@4DD@SxHk%C)KxMuw@Wd)Sw>+$yeZY4yb@r)rZFAQ#@C0`z765)*k7No zMR*&rK793W2w(jg#@BDaCqH63#Lz@O`I_&HKKY&aW%0>#u~fN@ZqgYq1cZ$VhK-O0 z9ip7MRrAf$TnJd#id zHg;d2zHeYnsI;izP-B8Y4I6O&>9uq^sGWamEp*WFSrhBvue=`@!uR`VK*Ri5+fC3H zylwX5wl22O!=~Sl+jos+KQ7Wdco$jmZnVSu8|Zi4&upT8SD*bjGXHOGvh=$OV}haI z)#I@8oGs}(oII?2QCrdBmVMI19d2+I0o;XE21hIhaf|lX|KbhZ7e%Lm#gi*UHgCNp z-!bWawS9+s2K4B!%-xNB@EG5-LD&4vU6VOyu3+IecTFbzmjq$I%+cbcH*oH}!Nwr| z1`NcH6Pw6De1JnUrVV@gGP#X^_|J_N1F_PWU@#CzL(!?*7reKEL9B-+os1cGy^Z2E{Yd<$t3Z|UWXy=>!Ta4GEqI66;r$JC zwA;rwQAexqNbGsu($P*aCKx(e@8phFLyMf4N$tWT*r|`8ajB5&G^ZGW+wJ^)b+mh~ zXi!J{;M!*CXf22;V@KQGJb0I0Zo&JC9p2wSN9#AP89Q1*@|o|gbOT0P0KsfYdC{1# z14G(Yu``L&K{UW^l>?mp&LrPJKmSFo8*WXUQUhrD838(59CCHR1Ig59m+YW!SPJ0c zlp4xOzq2&CbrR>J-KDezD~TEEE~U>1l)`g$#Qf|Czd!(EbQD~5Ga&kkhxQo(;E;#P zUP#8FAA&v#l?jJVkWFFf2$!PV4sqzJ;~eUSCX_t$WMc`f&Poc+V`PGp3)eU8tfds=Oxq)mIBGs1hF?cLG6 z&YVf~M_I8X!?D+SP6ek*A`0jVdJ0Bpb0vXSGE#%Y8Ve)hJDVEEf)TrNv>%cHXe?JZ zBh14LK|8=yp#|&WovU0>HOJYv0yWYp6&BDTvw>my?78;pd%E%&Rdh@uTnAK?qGJ-9 z{R_hURf^5()UfJf#U(xb`zX>!!(j+uOw&jBFa({1eZkZXUvMrBv146|4^xziL+NwL zu?BIbL+St7U^$d-W0_8V)?%4@8xstc38TNAWs>j0^SzNRW$8>(t}scvCkT`D&09@u zlEmCxm?SYbH`xd3Qt8F5oo$eF^Yq#v-hVKdq{55RnWT@Hd6=Xlq)9pfM|0|JlAd2= zZ<3_l!FOAdOp@8sm`qaL-NG1v?=t@8ELhJ;#bYvIl02%Diz z*M&D@dhGtLb(+br+rx2?a}aX9dAcwe;Wx-+z?G3+3{XoiW=FDzVen#hkolBE40Z1y zFJ=dOG5-Smh#ONBcrnWmr?JYgm~CFp+nJ0*_hKdyp`_v(K{kb@7egjhehg{S`D8Lo zDA|j78}vAfCc$Kk;OMfcpq9@zdE1Ymn^(@FLCB1aL~=>P(Y|vYCM9(dOQRimFzH$1 z(QcPIbq8D>*cgNCh!Hq9QGkf{E(FbF?Am%3`=WGL&$DkT<)i~nJKS{P0pqiwq~E<0 z``C8Ub*?MOW?@#Lc&%{8@-{h(aDeYX>}iOr5t4dxW)n-wzo44^0*I_y^|30DUvSG% zh{Wg@KrqrTuwfNF#dB~n`I=;sbp6K$6+1okRf81FJ;g^B4Ngzp%*Dy+*=g#vJDp1} zV5esXoSq%R=@~^%kNM5)L9j-%A2(PdAXBCo6KYADB785lZu3<8&w7}r!Q+H^>iNp= z%RD_j<5w|HrvR;?$J_Vz|8JgPHrh>ZVo9aw!SNx#WAk)q!Xv{C$}x=h?rCd0KH+6L-4bt@rfjDNQV?6y|B-px?21`pXFoX0DOu z=`6fj&==lPuZIlwiT!usEy<=o?y~s6b{vxTd^Nwi|2(C(0og~+# zZ#aWhK7B3Ccd4TkEhO&ps0&amEg7Ni8R{gSP+)buGCJ}&QkXGa;+>@nt;+~5bPYXe z;WoI?Zy~_|pP6CbnC5b(%j^E=AP-PQk9||XFY)*{_nmqEOW!z;`eCXkxLdw?@#zBw z?IGv;ZDWFAbgTb2Jg#{}QzyGM0{IP(*T1JFvPkqkG+dMJ?ElK&@aQ+mVnpo@3Xw*U znn2!CTWw2`My2{-a?1fJ?Tig9o`N34H$1}hdV;neMq2WWF~OiEX+Gz5-l}wJF^E=V zLaymQ2(<{5|Gw0s!ylSQEo%BUr&>IAk3}t37!wR?(Op<)^TJ|9wao?2lmDJhOXLCF ztA7+)av}B!e^16^kEeOGWJ{ms)Dr&+i+U5oa7?CK?kATGGYdmdK6GmgH1?eSbRjD5S?VLarw>fDnbdVP~&NjmWQj zw(!xhG|#U0DgV#Ugf>|p^l$pJh3$zd9ck`x^j)^O3K1KL7T=Su zqj9N_>!nQ5(f;{t6LmCr&gs6&iO$Tsg}?GlpvS1@G1EUC)nLUrh?&5;5{uS6Y)mj{ z4XDCYUfagSX{sy2E2Y*d_xKzm14zDbeirw(fCej*BEk1>EXm>(hLfm32v&Fnj zE;-nAc6}3hF)G(Ni4*5es!3(VQMl~W?9KBtke4%X2Npw!px@j*kTXXLvVU{;KuSj> z2>WI3fi%|$Fa&3fQtT?*siA(_ENKMjZyf>JA;GfoN+ZDMOD%o*J!68QFQ*v+mfVr9 zFUt|&qn4sCKZDOuHmR%iE1US?!72gvEP?k9C}Lg zsKuVcno}(vUSd&;JB$eiwW$9Z;7PZp(-OG`_?o=2H1pBlmzG3_G>?{4;_Z$GdK(8Z zrYtJ5Xvv?A2?i}W+&pa%yIK|13Y|Bm05gJ)OVg=Gu2|jqvV$-p!yo>AsmIGFHII5c zio^8FH>Ev$@6Pj`KKS(nY zr;~xTaU0q2q*r1ti1!>HqCmXoIQ~8zy0*DJo3^-&d&738pp!S7ZA`!2?*AsjR#i|m;s6-j9z3Rn^xLAc?NzRvTh^+xVZScBkmsk!@n3Zc1 zK$CHwpyQsHD3**nn~G%+iMz#r-ve3!rBwfD*j2%Z)&Dblk@!icyKOxyE9#whiMuJ`afB zU#K&kON|ZXNHBdDLnNl3OBACLWrK{x<~9&9pBs*Q0QP(W8!F}3^wW0|IzTaX7gk9U zuhxFwhWH)R1!pB_IaEJFvBSCa7Cv;GeE4AyaK;u8$5B#CK0UAOFeZ>0k`K^gOhMCV z@Bdp?i}}N93j>~hi7e1twi#v-#O&@ z5d9+rJLw|?I7gt|hNc%+iogbT=kdR|k|VNjPh?{d6(vxMzF(!+q7k^(RBJ^dn`T`l?kJvq?9OSy~(mJm%NgzOJ@fwHU`FSakg^+U688KW}_=a~Su$5sZem8wcl zQ}REtKWL;=eB9 z5ka(0N;i;kvxRQm6`}oXl82Yz?KfGP?#+qPb#cI7=U{z~d4aBO7S#MMy$h*X17T;; zsQOjWuB@byqyM8t^7~TtAfX=cJp10$zE=hBscycS;22eywZ2Ig=1ue zoU|3RT#S-^sUUWpxn8h@e$s5y?~W4pqI-h^hiB*}=Tg`=Is}Q|g-lV|vQP4ErT;wp zKK4|6F7B`gOS(wpC?+sLI%*k#E+YYW_U#iR5Ye8CRO<=JU~RE`zjK{?f3dRFm+3Gx zlxOiC2YgbGzilsvDem7h*ApyX@!^33mv~h1u`#mhCx$BnPaqL22C5Nyf`KrCNT3RT z$+w6EUZrfJDinAh(K6^|!udM$M%Y_5L~ylyswKZ@^Vao01JsieKzs!J{*o&*9qMvQ z;-+nZ&*dy9uyS%j@B(39TR~Mu?0y(RKSRh+Iq=tBcx@?A)u2upv8wA?v0{MZ(DNm$R4_y^0>JL5@@$z(1%0)8+}j zyZ32Nu*$O!GAqzng%OW9{`8mQy>lY@E#`SE^AFJp3%PRgnYHLEB${BL6o@?jatd(q z^F#39T&FC%CKF?Tv*=0ujOPJ0wLdX+oP%T_8b?zO{?6Z1;MUkiG^O*X%Ne>>a9bH{ zxnrZyg-G<&`7Ai!%J@uxe1|Zof}D`+GMIhf6Y~FP9?4%r$_2%&HBTUIB^4vyQ3C)< zCvu+mVM9_YAdJrjdu#qm?0Juy7*eu;Xv0r5JqvZZZ48ixT(^v%V8mIcWjF->QB-dL z3V#66Z8#tbUm^;hFADe33m=BU&UM^>JnAHRFrlsX6~D*8$IFQm&A|oHpl?@jYISfD zK59`t%)Rr*ixCFh-^L46_qW5`)xK_G<^X?{J%*?lopJXy-p8YRz!hBR+vGyHrApn| z|EF(psTJ^cE?6C(^^0I|YZw-;Cb|q><>EaBw2lxgFU7>hVr8glkg5$Zfhzi;rFmvh zwZK+RTh8TDe!*0L2`W`{GaY4cO=bTNjd&3W(M{Kp`UEmDyp^Ht62{>%WJJre38@l7 zNu7`#j8vJ=X~NeHRExArMOq#c7Zqt|B26tMg8jAaoq@lx>Wd1Y;#M@pl-TiQ3C#+g zbsM6pR;WXw5IzFdx{RG#u>s$o3X1xa1^xW=RMCM?1^IBaCjtx;5-Q$HzEU!-&*0+5 zd!rch6)L6~i%qdGilGomJd!`?0RHK}u*hrpHPG}cyDLjU*2^>H4LAJ4XHoO%r>gY( zOC}^W(s?t?z9SemECBh@o3sU>>!@e(0#NkrX}C~KD<#p7aeFg{SBD(YpU*{XEXA%q zAF)#@Ryhl?K@#UCGCwRdvMi)n-2mXW@4qiH<^o()r zTZ%pKFk+um>~BvXR!ycZ;m8mh|)_P8%b4N^P3 z0Dsc0LjmgDLJ)eqff$BzM|9XW#IB{7=PkspqSz&GBX%*xzWxtlv}6-K@&m*sQ|!ZP z#Kux=&&P;CCmhik?;$>Il=42F|6di-2@o~}f z>QQ4Q)i^?Gvr4_x*D~7aJ0vR6BGfNImas(V$z*ltbF9YV&VYk5v{KR})KV$!Q^{N) zk4(nxo{RK}4QJ9W21qifO6LzZAYE)974R zSOPnOF#u09!2w>5RS7OrTySMlk!`g}h5nc*D7YZhmc^szSWD*?g?*d$PX3_jCSsN;J_T`!Z0}Cq|t3vrREAo<{O1_34JY_2go|0?Q@}cB0EyJ z3o0kug33nh+R798EPN|zX^>zFe(PcMM>QkKBh01bt*&Is6jwyMjkd}xp zD?qBhwyk#>{y3M7#xE#U(KRUGuWf~w!I4l;hAiD}P^?X(>kf&%0lI;gT8nLrv*>Y= zBKp5rv`Hme3nkR?sl_S_-$sjNsLFSjQPX$#o{4i%96i!IPE|hSXb+$o>Q5lG{qRlBz&r3w{LDpWYzyM5axOzV)EU@F zo}Omz8pQ6v*i8(|$)FB%7Ii~os)~bu<~obo@XxR3kPMD-7VU>dsLIFuvzN2z3;y{Q z|LpB7`Y-?7%s=}$i}0!s3a{m#1Dr)+{`m<19Ox|iC;z;Qe|B{i{hfan^Ut2nB68(a zWj_Br(OFc)KdC4gn-cwZNNRGDi4pfy696i?CQ&n1Ww6FJYRoQmYD_ z&n;cZppGLBd>kF*41A27#&YloL+#I?x)IbK96iDrSk`!`@oB2^?raiDd*9?nQWo!2 z67N_N&nbzwD~Y!*iMK4#zF$wn1i2n$!^G9>q1^eMORK)8B_VwnX? zVddjr7eP^KGTOoYC{!lM5$(kG@(aX_+%Xtz~t5SDhecrQcp5 z9A9$JjE=8D^C&UOCA+>`G00g)z#&!yV%$pdl!zR;Gq@-op^2Cq_v6Op znrF!p_vj@a#nUITmWdL1vcx>SMBjg-#O?&Oxw6DGy~JWSO1y*;;4WjsTREhiogSrP zAy;u<3PyZ?oVEgb+9f|9h~0_85JQF!(=jIOHssS}C_@5m8C`Q8#DBHSzE@^{3^8MY z+}kqx%GJo8!U%T>geMDxodv>T9pUSH_!rbV@KPYHo`UrMy9l)T7u1NP8cO;EN#_0Nd{o{M^lkS9 zr&ej(QMB@+y7$OQl72TlOWUKtYOFupy$mzo#MEpkNKIddwg_wMC_-nc_JjNZ?)|}v z^kqY5X5g5Dih|fJchlmIBR)pOb~CRgeO1uvPz$R9)(3F9AQcamQG)6q3>7IwjBx%bK~R7YcMvN?tCoX zvl8S6%khy109=cey`<&iP=KcGWmtDj$oOq)(2#p;S*|hlMM_lz1cZ0DodNPXWQv;K zi?p*WfZVuJ_7DP@Q%r*-RZ{bFGr~L=h+n;0ZPkAj(>9hGPO81&f z;HDU-JCkmYFr#@csaZanPh22eiadNb5_yC5!fR z?;w)k%DZD1N5?)&PL=}UkB?!(~cK0ZK%$m$G`UM*;N(nQ0< zC~c+T>+_8?oP{mqdGL~g?CJ7+m-Er=iPrjTpghM8K<*(T~p~ z?g;zT6EyMk-) zELti+3`G(>p&Pi5iKV}eg){u+6v<#_M2*plD*FURrJPx zcZ|DuT1ih0GJddGVL$IFX zI)ZsRf-*FrK#-#$$Ylgmtq58qAvo87V44|0XC1*gI)YpcK|Uk+_G}9WpPXqG(f0!r z9DK)dor86#EkslcH5MG?FPyoU+n^B5$2dx?I9^P`vD|>;HZzVXIu5#yn*gn$aUhk^ z^s}N_k%Z=W1DgJ3H1V@ERv<%(hCu6RAVEg62?b4UesvO>$bf{zUgEeeu_7H!CB!4R zp$@!ohK$2RESd=In`uQeAqmYa1Df;9XpYp-#4k?3T{um~v4^~90&whuGMQNElZ0bG zdbOs$wH()3*?`*I_|i}~mxp0mqsAivcg{fPUA&p>so}9RGO>vhJN`X+!SYwJQAf76 z3Zcc;MglvL2w{O#&UdcEVUV@eNK^w{Z(G?-$c1@&4r?|+F77YqO5U;2W2Q^n)&E>! zyE<@!v|ZE)uwCP@mk8Un{%8tDgb@ha)d%!rXDy_>2Ehn(MHC|81th>+Njx^J-wQNg zJrBdWg>}Q|vX+dWh2P4+?PSR+1An6+s(ee9neC@4%rchA57(kcV&PP#_V9I3c@Tgg z)?q0(cC{EVk_W01BF%1~x(*q?@Ia+edxW#7Eqa%~_6X;)35dY4YwfSi@}3bJPRZpY z7>BQADYh@k*Q-I0dT=|VGC+gdrpf>fZY#y$wkAd$8GQ1>Nyyc~!;9by)u1Hej zwKiuF&DD`Y3M*5-Lzx647vUG=ISYZ2CUBh6Ly_|Q!G@&Ly;hQnmH={e=vlI-=T8$o zy)P%oo_-c9L#L~_i@RPsihKGy2t-dGel~jg=;(J-B#ix21&m#sAYn`wF!~A@K>_1- z9Y!tid9Zc>3n)$-dX?xMlvZyGxYox0`O7Jhd~?!A_~xXYDGcDVFcxM5I68W?#!^4Y zQhOsyvjt0+Qs)S{)*Z=Wc@cpSOK*^0V&y3e0Li8eMm-G5g5_8wp($+v2g~t@n#sc9 z_$B&e^33)}0-7|l-A$=#fMA(twv=K&v!xuK*@`0C%vM&AlTt3kGh30a&uqm{eP%0u z>N8vMQ=8e+ui^sp%$Cy3Gh0qc%xndST(WiTBxf|yMfZU496@cqD~i>7zAK8G=DXAk zrupt;XVP)dOOWg@r@#2`OBfqa>$0jkVzMXMIF5)~CV@sfy^i0|IWM5-=J z(sr^aiIp!ckt&HqlCvyH`67`3$wbN*i7i!@k9CIl#u=$+h|u&x*geZ29^pv|wJ4N5 zc?3QbVn;?bDw?N?-vN^tfw5DcW~zv`LT;m`ij_>yLzRJtfIYi1@OK1~iiGWPA*hF=qgFgc_6tumh`w+cMv#e7r-t-!iS*|`5ET;XmjdaP0_i_GGtws! z2&5f!q`(UooX~sJ^J&!Ut{nw_00@#tJ&X|8Pr?ZCB&v|NPu`lb!L%LS4>1F*@;@nL@w!{i0#s2QN-lR3W0~=3sWGLW(Zed zIZ^5GPOA(&OOeXJS`n;AFs3rFLHv4N1kWL8Ul~{@e$nd8+{!>1g87w!7ZCilGEj~H zYO)c*b8&P$<8P=9agX!z_$$_9w$O^RWtH+YG?(F|HC8FXYO)}4R0=>M(GnDgf9;BP zoPG8Rk6?bY;bQu@kp(EdtTT$D>9mT9+=gVX!7R%1sa*LA#wA1MA{w@58kA zej0!c1YxTwxL^;K@v5<>fD0Xyw&EU2rf;T4rB%5Cm|k2L32p-cPcUZJV-#rXgcnhx z%H@2l<+^ulJVByf4>TBDYyCKojf`5%-uw%`&06@M_*76-odA2G06WD9wslIdvuwd; zF8mLGZWTcJ5v_Ij`Ny!SX5&LSY1BgMl3gl3S(*sb#dfpsV=) z@n{+@&AS%?s;*~#h)mo#VaTE7RN134IyFGJ(I|^44L!tAOSI&3;4K)4BHaL;iNmpK zsuX-3)t?4}U|AnZN;*@+9 z!Ct$WfCiVB(hnxZC?Kq^`pcn?U11{}A!LTt1(xAm1S%m`>Xd2W5Op9|4 z#@h33YL5}M&ob8jh&iVQ;HC%>ojOWB;{2D>i4M_P>T+sgP|C%Gbo}L%=9oV|`tUeu z-k+oGZeGg|AhT`xtRv+F(Alhy<(3C=OGh}gf0uC=s1 z6FW&K_D3+r#Kzv`g3HO;s%r^02?xOjQh2f;pWug_Clb&|U0egA<2MOZ85lSfitaJPV{M(**%AkKkY zA=`DMi^PkJ-r#~V#%mdQGNY}`=%;A{&O%FIA5k;##uP2@$GdS`#XFYLkQ8rQ3J$3O zsU3s7%wHD=9>KwKv=Gi-kO3Cj9*K4aCLxi!U~~~M&SV%?DOBeODfAVDCrhCR+TB(P zhsX?r6z-D1-WLMG_FUakpkcZ$4(0$Z8f4iINm6JJOz3q)BJ|G_QL;yno?#Va@MzhIPo=hk#W|W2WGCJz82yq|H{^=6V@9_k5HdL# z{KP8otrAItC#XC-oOWXZD}kyk9|-h8X#(*M-J}fDrNk4F0Vf^lat?zSkp`a%G3p1n zV5z5V)zh}?u^otM+g*sl)UKfb+g%9ADXV09XbyvfLb&A!GAo&u$(4bR@C)wR#|S1> z20lUHt_(yG98wv`si6aZSm(k|_^$XX+^pHvWOzuRSk1;?+V+a(OHqDBtU{FUa)K1) z$3m3_e=#v9r)E0JD;x1AW|;7OH{czHmw?$Xu(4XxJLZ&i}>0$o`S zRG8I&>8zFzz5dNPu}tdmcI&H8QwfYmfNNebT8<1T3etgs235oW1hFc_5J8M)86rkL zq==DEDPrVfYQ71gHp;lKfbOpSw9l7p{LCYB@zJB2EK!QIVuCo~R*?Lh>B0|lVs zxE2AKcv}Mxgg*sID$X5RjzXwF1Erm3nkUp(^j|W?7SWGqI)Sl(8Wp0?GZMa65Pr5G z`~&RnfbdTd2*M|VoL^G(a8~R@-y3KXqQBWCmFHIQM;u(s2~zabMKPhjox8v52*E)w zor7Dztwr?jk^quLpM&H^i~bs>*dqGZhe*QTrd9>v<(wc1Kb)EG^mPl8x$9!AO+fU2 zL?A@J4NS(ml5V1lp+Fl_Dm3HW1dHwuhl|~J6)w07mxr*_)|7ptDB`XHZ8$(mH{5L- zs0hT#267hBdsfkp2TNXKBu4PMjT0oV#|mB*!Rxg!lHhd_0>SHU$c4{gP#+|m;PZ>m zV5DUCn;i9P;Hf?A3t3W$&xd5jaJoW=?i zAFu&&O%^Do>nO@Wj%385(^;fh$vQn86|6cvF?3%q$6O3XhT~Nehwk)!g@hUHz*Mk& z^~I1qc3xH?v>5!dJP2+h{znTc9}L8-A5y%O(1ezUQ5@qm)s~MI&09jtS*1w8<2v~3 zpo2&hiG4s2L|OCr(GQ#i121qD`sD(`*D> zPFz%hnsq@ST4*7OnqkE+QUlq~gDPAXJi@tgIWej-QXVzuzehXQ;ds~NtRL|*1+p}z zm_iy;DFR8{prf!__J4vjrcNF#p9jsc2pb~49(yoi0li3`iM^at=!~nc zD+-*0pWirh@`pH2Py$d*=S^6r0pEcVz{3ptMQW?)H-o5!l!1C(?_~TuQq-L_2nX~Y z_ELFOR8yC)pkJYOKlVoptMlQ0UEPKDVuG8Z7v11+@O7kboaY3nQcM-v@CM3)k^+LZ z+!oqX$-zvnGrtV%zD=G1gU4;(4eGenVcZ?Y`M_03)s-O z9{qvjJz@<4p=XCf*fBawi&h|qtSlb_5`6|LlE+P9<8}5xhVVLn!Ciei`Hihd@+=#4 z^qZY;?i?4s22E#4`T6iW&U$?Y{&2F39O>Z)yg4$8Zt{(@e>k2^jq@dsZ^{#W#c5Dn zY*ZfPxX|2JknOywH*2o41Q|Hmohwu~?|4?-t3~Mm@itjO*UW8_tDK4AB)3Q9m<(|;wc~< zEA>dnju`$r=1&)=dATPB2S|CB5QmWWJWi1E-YsPH?T^HY>&Sg9?>-2Gyq8kj@KN8` zS*%;~Kro@9spOT8Q5&dXur-8#94&hdF$naiSE%3YZnbAcc|g@t%$?Fkl9i zZNMO_(Gg5{dM@RgAL|#!9boU&VjNDt?XQn|H2iut>ybbI0}0L z%AkoUkb93sq!>rRBBNVBj2980X6tZ?5C(s}-b%eePlVBu%JS2UiJ#F(U#S4ElgOa} z>o`FwKpz46TmgEf0DTDpp#WR@VJyL`ys&f3sJZLx2jXC05K&uBe;qW45##hPI$1+J zRU#f?M9eS5ggSjx%RGJj4f7O7AP}EPh~E;fL?IxS$3mO(5qd%);#FmlibD@$@Bo=frM#1)-}R9# zx}U^=7Tv`OvPGwg7AU!DynmWoA7g@_A|Q` z{rrRY*=j3}SX5NQ4WmT2RwgG{fuCcwpV_VG=NMU~3RO_gAI{(_xq%#{dxAMqS!nnm zt$`hR2}G%^Io1*2d$5KPAo^g^2tYR!(07GrV0XL`LS;8nF5QXeDtBYE*>qIghlgjy zD%4Ou0=RJWh8u(gr?Jg)osO3l(B0x=It)KC;!tNHvdo?34e%Ib z|JGkl&M|kEI}o9N(Vo3!oAyN~p*GFo1lgu=2gm?y$BA_qfVDMD(MANKO?!c&*i)jj zBzt`0NQ8EsRMsr(^ldK?(dswEXmo_qjcqH$*mgPf zu(g-qZ_?1FjbKzn&X~ttM2neufsP*4XnaLj(7>hcY5@Oqon|Df_9PsuH*zM zfY*coMzSq;Ilp89bU`2lun;`N?jI$EM2_*uyPxD+19H-}WRQo)GYYJVl^=Bhi)~%gvDMQ4)H$!fbv= zoqbk1%_}f0OdXr70ON}$z2#01oEEJo1UO?RxGG#LRAD(heJqD0KP< z0nYT$4F-%=H0JFrEGL2Cwp8f^pu+Gt2?5qSk(lOI11tpX&wZs2ReZ&o5Do_~8V?kMF1IpBAEsg}x=o>bqitxfn>ky>8DsfKo8vnKqB&-w>1b;~KI#C^h>$_T zf2TH;o{{+$#}0sRwAvALlA*2I9c5`%cG$HV(YakEpVyHtfX@p#LGt+z!KeRoV$jt> z@Yzo1^BNEx`#6=_Ehm=j)b2*g5PmK%%6oC^+s3+0MX~tNntp~nI1VOCokXk(Eu21t zxh5SIpyZKQrBp#7alypy5s(CW-i9C}*+>OUK;k!pX$k^M2nQFIkW{k~nwc<&L)Rx8 z#EqS0i~XC#h!%T_6J(2R5-qlkEum}5C)98wW+D)pSb@uf*p-D~+bfti(?oE=BS$6eE$`!wFI(?+cN< z&PLO9+Q%#s4+0^Qry)M=`Z|quW%(dNU!vKHTutw2_NQm8N5;Y1wn09khSl1W;&e+3 zeS%nj+m_Ivea|Ip(2bp>xct;m5Z50$L5izZi0i>mi85EtM=Y+c2!yy6LA18|P)Rbk z9a8rLd=u-#ct}6BKHPhlWbp6QdSLJtPLK>bTM|p1-eGIzI-!~w%tIg;d;rv@)`u|h zVrQ)$MMkse!{I_7M%6vmC7v8g=)-6D(tybc!B}@yM=7pr(1awenVcZSHBgA_(Os+$ zjt^N}tq=%t{RN`6)rWN?b6b7b1MoKbz;m%ea_ti@mWVBN9NobaQH#h;Tw931Vmr_t zE0JpMxSfHX8j3O;g@%s%Ghv4TM24E5?IG8Ne|SQkwz7g8Tz)u?-4_%jtBzp=F${Ky zRq3%;5knHWFM4dd9@~MK=3XO8U7Ugh_7zAfH6-DBc$Tw>AW~%6Z9wO*%~;eb5T5Uh z`T19-_uANe#NdRZB7%oS@TdqL6TuTAScL#r>jbxW_ybE>qW~Nu)Hnpifk%*!GjXEu z<05!c1WzG=)ATfgulNfO&~C)VOhaS4-b8>-!UYeFkO3zl8&Vk{WLR)8AS;gD%km^- zG>BsggBTdDKgTqNi1uy4EK_B$oR2`TY{?%a@~IdW-heF)c}w`^4wS(|Uid2}F1I~H zz3M*v##vDOrL%5_=g3}lBq}| zlt<{Z2GGQu&{|iW{lG{atjRc#!Y&+>A}ZZ57|Qyu07F;1;~$*KbR| zt-%UbV2j;aS2;~#8b((d}TY?9*>grpmobQ zLAFPkXpc5*#9c$){3hDlG`peEBEydEm=mTw~1Rh2)l0b+Pqy*j)66pC~ zV%>Gp4wk?$1VRE2L0U04{5&Y$Ujfnlm8X}Gi;OU3n6^?M=L~HjnkbeF(Svcx4DWj& z!Cy{)am+&=EFvKCD^W@bcYzQiY(-oLxno~{EYo2uc{i6_P9;5|3EJ14xb#FStu7B^ zg%MI)LxI>U%72Us+bl+Z3&GfSu=kM>;q6D!!B!FF_}7Gs(S_yI?hfzp_+Zi6w41Qu zQ_(tpJhq9}x#JxQM*O6=P8R5jJqkifbMOZiJr_Z7fYzqP%5*`Rm1%S&TA3!Ns1P9@ zDaBu5zTbp|Osxd-J-xM5qYJ2Qp+@64L8?(!Hj&opKWw*M@wb`KZxIMJI=7ANNUWZ; zH9`?A06c^Yv29?r)$am4I@0O~o5oi6g{aK78jDT(tpEB}lDWmC0$}b6PLRxX6U=oI z%pEG2>#Q@k0F=h~lDVDLevtUEv)W6LQ6C2x8cyC6?4XD>Xt9#4_FlUQllke88evou zPlqIoYUQIAqv|^hubgflp5bdN1V~ijK*}lEQiLPXq$I*VoFGLwREY3Rwy>^O-eUdO zjzH+gsStOfImBCz#^p(BpVTk?Jqb)UHn*|E`cFWXT2;1%M28~D_;Jw6$ovO@4Mzg3&u27Y9>xL_Zsw5sqOQ_1d4_j5G z1NM8Wp@O`qM7<4)a_AvafSn*`65vk?B}f5YEd==TyCfsm-?y;_~&Lvdx`T_n;toP6YLGmx8)oSh!cW#(Y%j-|#0w@xFs zLBZ{hY}j4TZDnrD5eRON0ll$@(7*I2*XnV^?0K|8(h)Nl@H<;bx!(^miIM;(NV%5? zO0E`^^cR#2)+xCgRL8raHR)nAT2ue9S-6-5qMadwWtV5jBB+7#BrT8SG}nG0ww&fN z_f?wKLRl=Lhs={V5egt8(^~cX)1yyjNlu@o_6Dc-a)RXaalz?>Y{p&rZ?MeABM>rw z2E@hMV}cuPiRa2O9VNB3?XLeOHtf3VlgRkR{c-A680C$7*TN(9*LF<2(RoJ-=L&h&`JoJS=zkniqdy|yL8D*h1gX*cg+{-|qmAp&ud+s8hd^lb2N~$Qqoa3f zFz%Ny0!A1I1dO17(O;s!DzhL}U{fO(i1ie=xX>LnZR`TXMAxpb|4m#ocmC zRF!N&!O6kRnOP}q<;VygsWm?H$doppc%&UgXRb(Tn=BsxMvwDT+P;g&R^BUcT+39% zLQhG3s{Dcgb<6a~yEG3X3hq-Lcvd)O*WwvlE%)q3@`AW^d%*@tZ-Ff9c@)Si}}9;=3U*jBCgbF(fNXOb5sZ-l8)(F9u6KZYv_^+t zC0MmBVmN^>Sy1Kk^CwoQ^;0cO4^p5HOLWZJ)$ZH*bn}rzRx8x|NC6+FKrmXE5Ae{s zYKMVsTT}ln^_JHw^frM5q~6*^MguQX4zvFV(}CXJ1P~dWMq;=7c13Ou{4;o9AeVE# zdyh^IRYtrS!ItoFCqP8TXl#m5w~r`|GS#*d;o{6KKEsEa9s1!6pMo!8l=yWu{!3UHa6^~OAviqEU zv`xXmcFM!;lphqk{RWjT>8?E85E196A-we|`pXVhTJxe`*R-#sdJ9lSq~6mxK&tor zVU+8m*ZqOj`|7gGr(!S4ad-f?p+S6@me}bIt zX~rrP%CWDs8-W$lCPFfdZzyrTV`&k%rEMp|Q0?CVz?R#;0^qHMet%hb=}Vb~ zKT+u;3r}!>%)*r-3*$r?0j)t$Wkx zTZ=dt85=xs(ta|Zn-|8{Ch3%8*LjZz!5H6BYhAV5Sb5%7A8HlyyfyixZc+mVGDZ7j zcFI_h&vl)_0Wv!y&@!RJdjOpVva{<6&dweHk)64aZO;~}Nqi7<@+%)>d`JRyJV+9? zzaLl;=4JPU^jv1Ef613VFr}c}j#l z=h^Z+1KE*B8ddF?B*bD_#>A3^RG?&;+eelRCCd~k%Q#(@Q-m!4wV8GE{Nt>fmjQ%s zGBsIlN1l~la{848LX%#eyFOAccYG@Kaxd8f^zvUEAoVg)$TC>Sk|Sivvt_vpazigP z=-Y$y*CC7RJnCV0^X$?ogefYqvt(kY>WSrw#BT27jK8>vGyXb&$oN!|*g;C{9%Kg@ z??P8M1_m^b>I1U(6?8)<)T{{$JQtF`U&SCXQp`QqxfL_JtNjzHn4b_+DCUP8AQh7@ zWc`%;fb4NX)-+qz>yR%f1}_|PwL~SM)0cK5q1P$LG>>ziadqWhZORrg-0b?@FR9_6 zfwXfL^4`5tyf2^@67Ovekm6k>#9Jc7TMY%GnWq=dg(^QoR>WDz4{@m_H+)1BFzrZW z`z+))??9^b#p;wb;$4gWPd9!Awt-x(yq!dC8PPu)YEGhhokmd*~ zSo@4+yi?x3o+#yD{>GF?1|_CE-3hKskwv^J<3_I?p4iHf6GVj81A~@5MR`GOr6m#O zM7q-tVV)+$d<}}l4&-z{=7>bjVshfxD3DB@Mn`svE@};xt0U^v2w74dDM(BfvOd`z zP1d5s=&=v{z2M&ulkNL--rf!r)a!1fmd<1AmLOiKEDn+pYzkY6*b* zFy-CI3=r!GftJ>pZoCKtj%gvjD{GI~$w;#I0~9oaAZ zj&<=T0HKRqaO7@g3n%xibKEk#$Y4Jm$%|u%$y}wh@KfIn+}5^@B*`cWUr)kfCnEm3 zzP&mD{BcbBY$a^?BPr}U=$V9F!2wd(&xEk!g|H_GVNbP%y%rhkuHV|WhLUB$*2=r? zV(e(ceQRfiAC23ZWKt^px9#hR!e8|Q8Wk!je}Xs>{C2Wc)mDB$TIJ{ot$YeMUPdKm z$(P@Q(I0D@Mt^hz16cwg;5#PWM><7rL0-^gtc6B2rwEouCP)`uos)>Lx?q zLBXIGp_H{PZCmLMPMHS*<^C+;kda~TjbFc|q@#T;`ZZUH?E45P zSKqtHm!d#64a5^i*JA)oqR8W)abAX~PXU0g?^7gsI(_R?EPTqEo4IJVQ6&7jrwO;H z@T2cwIfi4Z%pD{0LXlvZi*;F^`+!P>I3!%j4p&;%x%^Q@4e^fnkffcq3%1b}0ChX- z6a68pOMH7k`nf(^O|P+&I`@$8QfM}zs3ZAyMBa4Da5CScUwxE7_B{_0nD$rOu; zAYDPE;|1v!L3)KC-ENb93NgCJL)R`5*qe5CuKhAD$pP~rfZ2oV3mO-IfpbPD8jjQ7 zP0&C2u4WPVWV@fo@c8OE4d8h$F^}dG+wi3hJRZR90sk4kt`Lr)1)^gH4vgRl$3AQ> z$9?g>lt+%F@1-FSUp;UB3+{I4-tN}DW4eOqsGd$7qM67dC?o9S{$b^euBYKU<~57o zQ(2%Y-_HTEDtn=7=yd{`8R+#j(Q&1pOzEfP#0wQw4C^cx_Hb|-%uBiIW8vseQAz9Y({akZ>Y=1F%jRC%b=W48!*r} z)P)FV;;2T{&?d@M+ammReN%28${E{U5sYoG_-o*^nvu5rV=TdGwtVH@)o234{Q7J7 z;Ts`Hc>N7j1;QO`0r1V7bpR0sDV9MKTIj93eL%a9rg;V_bdN)IBLay=J z98n9(Br@7YTBSh4PK_D8x8)>^VHs^5Jq=(jODUH3H+SKTjg6odk8AnUQ(M{|rTAO; z#1HacQLglpfp=n*#iCKSqSB~q<*#lTp(?*RV(dJa3@a>*aX4#r6G`Q7&+v!6c$G2X z4S&bwL+ECUzjezHfBUk1{_t`%8$TT4Z~f?if5N}~6SgP3+WOvs&3lraaXau|%!q zln1XJwbgfkvwsDGAlNA8jkX(eCbS7OEdyo3HpLHkqyjvUt(`-o;gO!g4~xW?j8dq> zHB_tb0DV^r$q&!<9Z0$A64Yq<3^6)Jw~>St5H1<5V}t?;gHnk^3Ox#BU&SCsk}SJ~?d|gpt{tUy z8Faov4t!Yn;PgMKMn2pL5MI9xfAt0j-=Ok$wCzHuyPa9^SL!+1$nW4roFx&caBf5@ z5bg6uw?9lt(E2CARvQt>OULlYT||$2X36 zypg^30eYJDTL5&eG=F>t^H{puGZYoMy?Au{yfNYJ37rYsVI>_|&f+c$AWsf@HT<~} zWT7TV_uEpC&na){(%<3$DM$|zfgm+P5bHNANSZCkrx02QvKmb$T2W+}<=TP2XiC*1 zhTaCLhY8?c?ijJ=H5?cD$ekQ(_zzCG?kwv1 zSbXx2P?`r)Qm#IhDvmG|e@DwG@|{({XpmJuK7&bj!UkAu?updiK7mJ#G<^8Pvw*Z91O~@VJp-Z72D{^jP08j1=R0M6nMRg+$t6cb= z9Rx((*bWe0zXN}x)D48XE&U8)iY)i30w+5NrHeAyS-WpM+LSOlQOwY&2b(v(_1VO) zwufI^yXI&PAcCX_f+U?lXp`c$k;rgB!RnPZul-7Cv#4v_U!*oqMOl(IM{G(NfLXyhT`@{qQs6aF;v39T242km~11-FTPhRKg9`$nf35?aIhYx6fNHK!xaEC zOQ`l|sQH+{m}^iBjDr1onfaJZ44LU3 zzv+Cz`)Mo)VCr^^;Jv}-eHeIS21~h(Y-D~05#3%h8kWh=f`;c|xVLWE;(+bs*fbAD=+&!Yq58Ha^A4RHz5KaSM+RO%o^?%n=T#+m7|v*(%zCO=l4< z{N@+_d&P_chG=z_?n5)(Mw1PcGI40<2hBJy1p``OxPS{&jP%!wg8lMtYB3=Uby4|X zhteb-XNFVSNh~y?o-7533PvqxIdBZ4;T02a1SpW zk)IeECvL`uz9Vi<2#pXo<5Jpg1R*4!fqbv!Bjxar&kwZ6ZS_-_^x^ouqgOvgj|RO& zMf10dK1Na(32cJG@+($^ee7^xXDDp0ikl(gnsb01zeyYvdGrH!adqjslfblJ|4LQG zH~)ls%%uZu9|f;rJ0}b~r%6(lnj~EWGR@5Y=hgyyBBjx<>y%H)TqsAjxzK}VF65=h zstry~6{Zq|HXm=oAMQuUP{w>8vGG+|#6zY#QS=y%ynt+?jrigY&h&2NU9>;%zebs+ zG!XMdq>gDP#f;4L4?yS2bq4np=&@bhz<*X#AidF*#vdrBnj-gK(g}maKOtmxpRt8= zi&rto;PGk!89MeWlY#%M`vieSa1`u1pidH3xA?vq zx7D|slz^342xD}&v}1d~t|V+MJgpsHXRdnIU)wpZt@~X6<}Ne5dGkM$!`tZ{bG(Uu zac4EXwGPVksFZ_k%GyqPFN(s;``(TmDSNml~x-HlDpCTC1B%*l4QqayW4%QBZPKUL{#+Uueek$ox0(9FJY;S z6p7CsQPXL3pHKc#OpiwYo`cEL3-4|_EjNb76OK*{!3tjj&B5{c2+Z!auq_6ZqCN9G zz0;pSAJX1Ss55*oU3RO#6|S0;HR~u{++x|Ujc#Ejk5}V{R37&2my)6PCP})p+TnQC z66b^=C_Kw7&o-o$^K5V^5}}#AZ=Xoljb^YML2aqQzyXrAc9uvVIC;Cr2ny=%9w(2RTokygiy9+PclZYh ziU~w9+M#H3D5eXFvxoxzaK)oaQ0(w0uLB14@Zc{9WGDQRNaSlXYf;>Yejw$M>4_*L zIOI`e$q$MMZ;1%o38)AQ5TSdrjFN!1M8$@UVSu#5-?52e%TL?hhp3{mk3+nzzAlJ| zy2zHa=Q`ZOgVfr&0wby&yfBvNA4AlctFJ2&E3KG6FGZiU=O`pCJ>_rq4jztwqZ)t|fb}fKJe}avVg(q(=>cXpHmY-C%`rIAVes^uo6o z_3T5)*0w<)r|@>Z3%40~-r6=qhNe8)){I+p^r>X9=+`D}V(oSu{kNY}s@dORFzo~Y zQD>j{16JQ@BM9PNBjSov;~#BXD;{aex*Lgu;IASChsL8Zd=>%Zia=@zF#ULG>Cv{g z?0``sfE)uvfkWdlas!*zr-+%+l8FTYdNv>!~Cp)7D)n@D#p}j*8Ig^2gF z!d#9RfPvhf%gPEKqqGz{LC{U3f?YO>2D3ya?4lcc12~p=1d^tsfWNMb!o3gblX&ZTiQrd3i z2En(EzUMK#Cgrm~q)ghJa`ojD+JSBd7M=@Ab^polagU9JU`LMiP_FQjjiEZU6kllY!&pZ8dM@y2%FgX|f(_e*5`If~KFD=6#Q zxtCoB*BCiYt_6C+bKxCfA7$yr_SH>b74|(ZIjz1RC8<3 z23S+;s!n4ig`k{qY!gBtj_*mC-(@Ef{_-*SSdp(2ACvOoYf=~bo}{mvgnjpQF9vP$ z&wj?ARq?$<4?mF))X{Rr7IMZ;^F5E)$lZlZHlmTqF68XKj(ElNC;2=M6=d6G8dt8m z@9s+MS2z|T(oHwkdEiu|AuDb$C50dKK6K^urIq1oBz_SUM(guSHQyO5VY+SsGz)s{ zoR&J%<2Ah~xYxJ(c4l}pX~ejT*aOP$pT}wPgMaP5m%_en*c%Y0y}m6k`8$fY`SFS! ztl;%R_~SaVyKW*wlH-+yTi8H$(Yjv8v~#eRqw7l!I{GZ!WATp;)_#2cJn{3xd-c`F z^mp@tv;7lb>D$?Ewzn4}$(OKo75*(bRJn$d>6o?z!#2^f)HC1Y`3Ug0yO#`0pV#Yz zzax1OB5MP}EB8)k>yPy|9;r%r-)N9Xx$Ek{rb~Xsmi)}9*aVCg9P27x;u6%dKE3m_ zPAeI)iovLW7|Hk{*{vjxL?ZSJSMs%TnhWZ^OXgqE(mdk(jK_4mE*z$&q!VQA)Lo>> zhpp2G!Ar0BZJj;@oggiskihtLXW5Z(Bwx#^PAt@4EfzhASWQm2f9v!NJSj3f=C~iH zyC41ZxHaO9X$sqO2^8DT2)RZmUd2m5I}A@MX8-gT&U~>Si*(`SyS;-J+Wl33@V9Or z<`0j?xL>GYy$FBJ-}>w@fBT^A=-Y;%vs26xb!MIZ4(ua}7BM^=bvZ7E3EwQkugeWz zJIhd#x>V9W2wQouM9rD-hf6YAS<{$ciEK?Dl*<7r*RDi+;*^h4)F837na^kZCJJek zKU}_Th)P{6B^YqQ_96dCF@a?fV)iYks4U|usIS8^o}zN`Ls?B%(rRTz(n2$OVNH)& zSeNu$Sl?8Q8WW>NVJiHe)hIBGTBD*djH{sHXBba0>D*9CIZ;Z9Bz4!QoXA2N^8as* zIx$v_I`KcQQD7OpMnz>AS3!Lpmhlvoiyz9$AEm5F+K3wEk6Bn$qa+WlF~x?s9Nr2k zoX%p60M0EFeU?p)&qB6!t{D8epT25&G1(?7&wG0!w3CbD6q?KpR^|D`Z|peVeh zDEtcATiUBC_N?L+&oEs3r7&U?25y=+k@$xc@^(cl6KU68=2pLhAT7Bk=T2XTII<=gHQNp#I~j z6^qe6gdc7K(47{%tx|oTOwjNv5vLE~S0dV4F}cM`eaRDIyMh<{FSfR=1{0{+*fSiD zI6|FR--v}oagqr(h$O&ov91Ym{Nfv5ef+;N5>}~jE;hE?Q~yPv;{rt9;ZH9i_dz>~ zbs^@L9rW>dfB4o>1ls**juv7}*)c|hnj+LhXc|J(L}-Qx%|K`lLUTmubPk<99UebF z-?ouH*k>mN)!lYQ*yc@cyQ5hcCWTK)^W1$x;}vXSCm!LgU6+AgdrW_b{C91S5f*Q} z0N7r6rBAQz1|Ztk6IFW$#l^;P{ACB;i*!5% z{Cg}iyZFQ%dHKYhaP-{{I(GE6-N+0`X*l5(_eiWwBz8pG20RN-AE&u21#fsE2;(Gc z&r7fZY-h)#u~LS!*N?Vk5)TqmIsVcm;pOAu`{NYpoA$&VPCTY$2OTr-UWVAo|MesG z1Gdoz0bF1WsSUo zDc9YAVi#GZ=RIxqBb)v*`w>H2Y&WG!fbFK`P+=}Vq+I(xRIz8SV?43!Z1-=4ogMCw zB6pgdedxBc(PUVT+5P^3|5J8W^=^E2b_VGFZ??1VVO1S&a%DTo*^jM?r}@+*5h4D7#lV&kcZmdq4e}`UVBi~T_m@)joM&r!a`f!!E7WYt;5JU z%RAe+`D5-K>xqv#kSl|U_)Pl8h)BexhV*vWi}rZ(Wam*Hm(|Yg#^Zto&y8A$g=}F` z*3dq=_VuE<=cWceI>j-WyD8Z)ceFiAS%ZJr*-ABtG$~qa9M2^V-4|p-DXU^GmMro` z%{qw0dHYO+Nt-%vp9R~w)v}&}I7Zj+Gswx>mVhJo&&+E%9Jh&l8!EO%6N^S$yEcLp z+Yz#WAo;Kgka!g(jq^M2=bgpJIhfC{6qs8XgD+?G*-S{-RFz2tzE0` zMOuin+{+yUZc=2=POCf`mffIZW2Pw}xCihVMPH-boPokEYgbApMah z*`4m|d|a3>+t%vequ-b0To*dl?P_$Bi+7Xtnlc-am?5kwcc*jzgx9$rgTrl5Xm|q) z@808O30C9Qu1^!`1=*2bp(TbWM#yu3wzCml0OGw z@STsr@=@X)^oGgw1Z;6UPLPh8J_?N3JJXT;x7!npa0v!4zRvd5yU}dm^UNU}M8PWF zHHb#2otqCN!PuE=XLubE5gxk9Y&^>w&yB5iTACx2}4`@bGeq{gCLa1p4&mf z(j;@k*pWTwas)vAQ^^Fu%5*U(-4MZ`J0SBa4onrNjH|3t3f%=D5S60kJ1$<6eo4GK zyN{9_-WA&7bIQpG!&h;9K4*bQ+UH@n-D~)MjTp;cBdiYY( zS%uI7$AVU?|02`D{fCpB`}}us-`A+SaW3W8GU~Cb;xKB+i2DC3#DY;D1JN)gDlq|- zA)a#?lI=(y{EL1~ziUGj)Av(O!M$J87c~XOMKvl)MVR}(&`e}SNW+$MsN)-`2o*nz zu;acJ!FQ>s2%fv6RfNJ@BN+S-D#EF^eXWYHuYKNb?sG`b)QXGu*5*+`Qs*DxI0Q}1U84<= z-n)agF4O1_U2sc@Gg=xtoH_HLN*gV``7{}u!A zlSKWDzAgk|)G=3somVyHn*LoLbIr36va!Brg(#^GloT3keNa{}Q71zkT+{5~+659b zgfZ?x*;+2E)pt^fC5S=UJ*Tpm6oOWn##f`&&XW&+N#m=Oanmu)IPqV33yM0X<6#=A6pgqs)S=k(@RQJK!9|jx}bJmPuM!t+`21Aw2Asbm&2M#ta&`@oZS2iy}N=U?{#|6!` zp@7-c+!zW}g=A!R7*Ul5f`R5`fohXdHiIB-Y&PcB)C9q)wxK!zzd?HRpEDg?Q&HhuZ|rXDErS{kToTo!0v$vo`` zjfEZNW?}~mHZo~adTOdU0(q8f?GP^S=-KQOYLuWDYD3ams$o&cWm+oA1I0CgEQoF| z7ho7T5BrAfXqu5R(KLN4YD1AmZ+L*nM+I!4at^iF)xz)sp_`wIX=F-7vt9mN^rn#o zgjAR!W@uysVQWr98IytVHB>IH3z*d{s9AH%1lE`$(`Xdtq{2-j2Z-X9x=?NUVqr6q zosnxJnpGKz#68Hm9}P@saiCJqzTrXEDT8HYg$3rRW=Ul*xV*8s+B7`KdRY}TvY>Wm ztuC$ySuZ7<>w`en3j%ck)EXDc@F456kVdd+X`ne^hB&KWX$&iY&Vy8K>Y%-;rr~-v zn>0h=MnEcp>y?@2ndF^-I4(sn%8ju#;ldR*G_}ZFgNJysGmj8gp;y*X{a9(9bdqUM z^H3W!8yZ7q)@-w~u69X7eV`%4xH$+6G&Hs>S&FSd*Q zXg!wToa%rM_qW;%TNEWhS%RR7JP#fgd6&C_QRjNO%qOi@qF>}*>T(h)lvhB&sW!Z{^iqN?2F(GD|= z)VUd3>0-naRqJMKwfB=@pkn11C>ljkLudEZDr<&^#!=ias?MaLrjfCRhe}e^wKNrR zf<)0+N}|fodF!m6EMp9^^g7);L9E~akil0C|gH8Qg z9_+F9;<^ueYu~|@ggvtpsNeNixwvkUR~Ghee}eEZ;Jdhz!DBHlYHD+ejjUqB zga6)~*~a9o*+!;!Hq2+Xfk!+cc;X6^Fbp!i3}9XqC{O~E!65~KV5qrqrEzXcZPmr5 zuemZ9Fy@uzrRU8w^JZe~XJ%)3GmL`90yEp|&6w!*rWX?)L!@OZ%{h7V%jTLT>Dk`Q z+;s0`V-66-l?^lv@MOY>1gGZum1bs6M!F~0m{V9*GPk&FUWu8%w6e*}IUTj3Dm2l| zNzcyk=+Sf2Jzk@*v~ZT`$(U>u1eVoS1&rFfhRV8?KSaMJX0jz>c58q~3nrE;rTA6N zE1N=%W`OfDv$44zbA~zdi;elk%PX4$MwyR0yvCN0LBo2^vYC&boeYu2$IEIfO@B$A zK?9X?s0Y1fU6b+ckK-`*9ry<#_%+H_HiRlykb#-!r#CinCp~fE#0wA~$jbVrx&R~7 ztIbK(fn}3|)r*;RRAj@l`anj52QlX|r>TZ%BH~mNF`;%_CbB+*aFxK>WnrdeOjTWp zXR4eDdZ+Sybb`tB%Rw&&Kgu5wB@Sr8x(cMC{FXFVHZ85K62-{48sMDbq#*ufOf~1h zi(wX2hAL%g3OO0;nQG>ew^Zd%yB>F+K=f=AT0TJif2oW@Mx6vLXA++ZM!73fh;xyMP?j=8FNm=A6bse zBu`N>%w=U_hP$*8#KP64#lbB_GdO6f39V-q`%X7A3w@cVvx}|>4ktVp&+?|1FibDO zlspsFO^*jvA|4?S(M&5VE!BIii1ak~olKUCLG$4`!I(NuAmexZdk&88h8dct&%q5d z7A%-!PBMM-3MXgj!Q^%%H>3JZHP7>v(PX=!kyNUFGC1COL5yLt6Ku?A36`&Ha;hC{ zK={#+B7A<8n3_{tCx5_B^wz-l#8_w=Em#oQnNu06#aP`$5wk~XlJZC~Ud49sG6ZhP zKxG}K_x4XFfahUGiOAnT|F7(u12%TD=T*7pdpA#^RPI=!Z~y1 z&i9pOWZ8Gwq|5V3!V63WbQ{k_r_*WD5L63 z5S9flX@RGd7LPcJIgOnYL&^Ey0*_@W485^l;)qWKUW+f%ionbGjvNtqEk37jl+lvS zP_rb^Tm`w{wj65avxh1*I8=(Jvcn=$DLZ)(>A0j;4-zG8l)7MQlkKr7xX?-zg=KiF zr`mtOUc~5wNX>*3XM{0KpbHusglAbi&cs>}dy$(L!z3$GgA*6mHWqG~L-Lj_i9(0azN8c~gZx}JyJ1j95RR~F zk{jwEpBRE@0ZW9i!Ju5~YlFP3h-JQ7rXF@)V+$?#vH!iUamf;dRtC-H#>UXZVaC}@ ztEW~@T|RZ$)WB4%C)7+0PF>P$xJR!6n$(!pN{7*qN)Bn?PBWg?f~=U;G)!hT6C6IE z?T=1psnJzw6D>D0H$OL>&J1*?nfYbKg=9{4C!x&tYeAY7d2({SQwYrP<^be+JXrkttl0y3!yZ~3)gsG>bqP+_=H=~EAI)6I1eblOA^y%kD z6*uKr0?DeLMAa?YALB9uOB$zNaC$112n**r93ngts5s$8VF%sSOgR_ z(?C}YBgHsT5|$O1(nDZUD`pf|uBffYy8jF~-ML0f2HZ4=dw4HaOqA^yb1~5-OoRi! z8a_w#?WjLuNlM8=m09Cu76ocT@QVjlG$FglwGgYQF&LDIX+vSsu3_Z2G&j=7o{VVOhq`+J^!Whafi%mY;=_`Rzp{!Asv2P;*u^1;oDSb?L`Q^W=78B8sIRPTfcY4r zczBXWHV_Il=s{G84O{UfyGuqW)AcO;Ze~$!4OMJPNYkOAax{}VJ|VQokrrU5C1bh; zkb!Khj#x63c^S3&fjV$s8bHyphX-{j5Mi!*g=^yJWE~lvP}c%1jG&QeKyhGsKU8T@ zZcNlVG#X+=Ekd~F@+<~UMw1-hv@wQpFtRs)?zQEFe!_<0y(+E0ZI*o6XKS^`0|Rw#=~Sgf9I5S-oS zq1z?3`(}y%Jejg6N2hwTcxk@M=DL+sy(e&6D6BxB>=K?}2(}{FHZ6BBS68N+Aeui} z5y@o8J0Kfu+Fm0HCvAQs3Jrya$HldE81teDZmz}9N%kf2@|o3AiJ5B%UVd{Xn)0Rb z#uMF(5N3kiT5Dx&6r<)*zv2p$eT^O_GOSnM8c}+B0p*wGyGo)Ay%<|;WEsxMn^V9h zlO~$>)6Hy;cg6%++ZihxfCvJqchOMz$=ApAFM>)#lU+t&iz*R~or+k+#8w_Ntv)z` z6oH8++N4^H1WYujf<}te&{Dq`h1OWZ5reW0>s?Ev6|$r-q=;S{d-o)xf?D+IQv141 zb4}962;gM5r&@)PodH*U8$WMOz8H-K5yu(71eQ@R&BkraD=5x0BTGu^HHtix=dz-F z(XL6dX#GZ1x+r~#n+_8cj5BeU^=Y^n*hVIrntaizxf_5q zto%*5p^OPoS3MSW1Vb)@05@iE`~?iB(3Vx!)w<*|@|V`a2~kp6 zOFKv%LKG~waJ3C03TMKYR~KroRQeYQh(eKy)jGiCq60M30+m&?VTpD`wty*y*_qyA z)D`+^^v%=&$0RP!TgZDgIDe*Ww=fKFg}Y29D2BX3JTYw0+k7Fg-Mv$@P3sXfO6Dl$ z@}<}xN^%y z>|8am3lObOHQEOstIHW=xv`@3m(v)b4wna{6Jq%9d z_>Bu#w^*kHsI8(BVB0dZ643h(=vd6As04i690__hq?pM-ku~XcwGCL;rK)49x+6+U zaInV>umv&j5nBND+QGd}9YmBdkaCOKRdHGiwjH=QglV&hVDiBjQLs zI86b3kZ3csmRoNp3S~P{C<}{6C)_VIplXQn7un>oU=fuw&9p>VSqpE&7UDrwGT81{ zv=SiGAu}Y?u-orgct5<}wBF2ZhTQss@nmdsFsUjQQ91FDEV6qM{lBON&KN>3AT9^f zT|hHdQin`Mhnavv2|f1d6GVG7w}EUWqF7wblGa4`Y0HBK>6oh$skn+e7hT0ty}pJj zjL~Vtr|Hjd=}hhdgU-kWXW9cw$$bUXi1uwUIc4f@C7@~plx-v z)S}B*orOjqEZ&V}^VN*aOrtgs@Mu^RUI4av>$1*&J|B$Ao;UGB_i6VdheLbj5wA=~}(QN^Y$_cc6(<#Bhg% z6k`V?UrbC<*PXD4A_+=yQ5EH&jq)7SY=~a8lU2elIy+lPR&T}Oe!)mW3sK{4Cz~45 z(GC)coiEX6QO+o1vGb+VY-(M+MZ(TlUk#*s`^eC}#(yLYhI zCkjUh8)j8wJ)C+dESFB$w?G3D$G0G3GlpVnr5mMaj0Kg=^+;hc+}^T<5H^5rjXZsF zXvO9rlU|H!!eTq41UOlih;fhH9%R-zZVEvwTZ4eCTlPQzZLsa2YqI?XY;{ zD_u~8?4!*>M}r0xQw#)@GzP^BIBe`rsXeo+dat0Xy&2OE;w~6ybO@UruCw)Tg0HklHYzI=7@{0>Z zO+aqs&&Go{wsT?X5+R^WQ;mbEU_`UbE_E}Ft8g7R_$VlH+}LVmJt!5hS4}h^s4(Po z#Q2it%TT!%r%zF6@tBp-r$M zs~Ma#bVWA?x5JD;UE^{Ss}q6X(nd@x`~0MS%e6Z0TTunS5Sq$-G;6h0$as|aGM@Cx zm0}Euo}G5$6a?VdrP$GbGG1|@8v6qNBI8BTyqlGb=Zt|( zc67LjqCClXY_{_-upqA+99!_3T^xH08u;{$Cv9+ms4^aV*tpDPg|%1GqsT}>dOT4R z;)^Kb*^@_%3R;3Ic_A)FN+MXs6J2mV`J@MuFiJcO-^4;nzezDtriZnaN;u-nmbQed z8<#f>oTiK?>Jd*~2aZDt%6N0^0jQYx7GmL-wg%H=x~LKB9`Jh9>RFfZFj%3571>?$ z)?s)%Ya3$PjErYDCDievA>;m}zlbuPUT@|8E)NYprBkN4Pr9+=dEv}jfku=TG_dT8 zEo6G+*zvG0Q!Iz&`!mdZUxpsb)@Kwsvs66p2J`(ZT#;j^m))3ywu zUc20FyH*vWuO{3fGCdl`(7??#<9AcKpJcp<_S#Jo?Wu1(HD-uL?S#pAqIIAaLADqU zMf5uvPpKn%KDm6{@nt+)pYcYN@pPlI+X;6H?x)!CP`Lg4V#mwuCzfq5QREcctYbyC z*VsbN2rW&FV6em#WoBjLw3!TMx3t^XjwjkPcu?emGPh8D7O=!(GhEeCm$3xaH5axQ zv#^iDZlO{2#q`f#8-z0-U2v3)$PEW^k#Y%$96&anJod|4qvwH#bgITuxD1!&EYcAJ zkGLYrc(iOL>dpY^D71{{EHWv?08qxWm!zfhV}Mw;J&FnK42;3WoG0FRC@JKRcHfCv zO1$yZ(o5WNW&YH>UXF9sN^$IDBjRaB7dsANWV|9cLNIxaJDQ5;#~X8BD`JG4TD|E% zZ5dBnF0%gfI682IC*KbiC=%b1a$=fNMmbT%X3TaG`O_~Xs<8Z$Bp;iW$rgw4o6 zSOz~5HX|>S{(ym(?!373&IA^JyoQ&U;t%d-BCeO%mk}5I@fu}bx+Bi`gGWlJEQ9Wd z75-$=qsJ)DDDfC`@)1@_aq-8CKS1CQ?uY^Y@Eu4fS}CzArPN9(Go_T7Qj+C7Vt_wh z{NYDL!(Ar*$uiC(R``Q3k^p}YMy$@mJAe4&$)G>mz9R&5 zdR}%Gg=NuW7C&aw-DLd9CPX$7XHyt9t>X_pPA2RWdd%TJgw3Tp5`%Jd9_8pf%F%h8 zqcRBeeacoI$x^-`Bg4qeF$*%y+$?iOo{3j@GBV7}3>lm)gJ-&fL7iddDeB3f7F?#7 zx!J^JW{!(XK9PH}%_);9*db>&-pPH!v&{mJ88sY2W_l&PEhMK(!FjG!eI!iZU{FV4 z;)@X+g9(DO%$!I`@-kR7WS;*!8J%JRWee_v`^-F#BccfRRpx?=|G@S5k>`~!x z)~^$uN#V$Cc0_nS@u6@oK8JpanT>LS;+dWmNy%oL9vA_Fozj-lWSM!{x@`z*FrnZ` zCQywx*UWS?nL_L-*iFr9pW>Ag+LHK)nu6Wb*=9}_2WQwNO_B&EN?j35@*(ML`jQq zR57p5Wib>ksuIFAF%gb8yigNS#d30;Dv59+V+)H22OlKrE^NV`Dw9vQ7z*aXreIFS z&a9|oKGMHxWQaPK!~}JYi<(5tGP59JwoXk%2%cf)vE+((9)h#Y{K#O+4>NI7+rc86 ziV5)s6QvauEKHV^6pjX(E0@+b zQgF0ZU66}rI?Kr^1*=9~7!Dh+pr-aX+w4OfD;Ui*sA0r%93XguIyXDnBLzpH zE^tw2p&=60-_>bSaFi|L~f=z#b;-T z#yi}BQ!rO)Ru+OY^C(dYb`K?{kX2EzH-bsDU~r)5P>EAM;0;oW9wQir;-ZGSNi-L= zFTfl9>cbapTFxjd=H)USuh$Y{oVL zxLxT1ud?9$o+hja1r0oVviL7%0=UPd0Dm!@#NQ11n@fLk()04m=w=H2nM{AO=?}-u zH1b2ub!IBwe#2|>g(%I;$$9yG0<$JBERPy!&i6zK_sxkKXcp%Cii%=IQCM&ExaBhz zL`US66!{kRL17#onX~MiD4EF4=}VWpu)MDj7~)4VoE)jWx#c+NO(Q#}c=F^a?q?K| z!)7w(Ci)YGO&L>6cbv&EyvZ54E;rs*^CF;4y_PS{blA%T^;nCrNyRaUDfogX9~~rBAyrOnZRMGzT(0% zjiU@PORxhzMzGL^hAg0iC3P`HKp#4s)q*`ra|(T>rk_ZRbo~vtypQBM>vaDMY=(4?@$yz2jBr{4#Uv79aQ5+AV zN4Ep}(2G*2$g5sPuU}Lx)nZ9=jEbAraB)N9a>MxG`5tT7?|ZCCxXN*@#PxGr&*AFA zHDXJT<;ArC*JZeVfolt{Zd{|b_E_1tzK`n)TzBC51FlbT9ks2;%E5I3uB&j}h3h3; zf5-KmKlE5<;JOG`8?JkBy@G2$u47;5vChI(g=;OY`*B@|cSV1P>oweeg=_4KJyssB z8eHwT9>n!$T>ru~4s->$YH{tr)r0F~ydOG?-Vw$1V_d((^=Dl4c7LUMp^mH;BwyRlwC{54yIggbYlr3L;$*3e zDH-tj8?zzSY_#pO(P7M<;x!8VU_8rX%tAjp%j+=;W_oZU+~f?ylZhw%@fuuZ@CU9j zFJiJevIXMksL4h#7!`w2F&s#F#WRh9*X6DkE$XAe` zMG(&fMLS+-=FiM4D>n-9j!Am{%=Gf~!Z~w|vY8x^?SvHK7IcJ7pX1F+&nqZ1Tw$JU z4xsUh5KEm*Q%}bv>?|aNUmUeq4{@+KlT(Tz|&(F0M(q_TakySuj8 z*NeFRjO$%odvJY07wCI%4Sv4YIs(`6xKeRV!j+3FAJ+n0mAEd()r^bM(XSrx8H}(a zaJ>OMU8xZ?I{ixE@4$60El28 zMr9aP^a?A^kX8FQRD1=gA+M>!-rI_%K!w=*$|w=99v@P5|A^l18!DF7FRyHtul%pZ zSKPME5Y+qfRIJ8e1vd7#tdQMEWIqz%SGCmn11!2-Wtl}pK563_sKlFcd~N~9nG{?} z2M|m`ji*~Wd=5v*$p^73H#G>n2nQty#V>-tkSCST*gy?+R2e}x8{1p(+D@pk(WKpe zwnVO&ljJUB(!j+Pc&jK-jnhK2(dHO#)biTu&{AVkedP+B)Oi;8lKeuP_)$GE!(4%6 zCYi2hnVm@eQgJn7OJzkl>75%J{N`WBr zUQlAS^fr{xA>vKNe?D{qn?;mGS2qTN4d2Bn=PgaN1(XgzBxMexe7NYb3zJ_0G($L1 z!fe0>Dr~2%tgfcnwTK}!5FuYVM*1o(Y*WEeYtM@b*itA^UxAmNs_}&awk|tR*%FO(g7r9?hTHIELD~e2L;j$7a}q7YV>`~IU{$cT zX1Ov;nCT>rF$w#NTLQruEj4tq)mhLqh6GSI&RJT>Dj?m{F&&Y`!$|!cj|hTcIB%mF zi^df}9J|7bkLYxCr0pCgmy^2#o`*b*h{G;K; zDK!<`EgRx67-5=3>NZw~1IeRw#|K|ID8B21mr`>+*(xjQ7DJ-QXVSN@T7i%DjICSZ zoKY=JE+^EgKm`U5^id6oqwpGhmH@j=IE0?7a8yV|5Sys+YhDhOLO<0~KU{o)ic4f; z%{26f!e`Vr28(b=Ma6;=R5KgJH(ELs)%BIoTd1NIC%RP7%ZnB2jVsb;sNx6pwG~U6 zY8xx2I6O!X0) za1k#Ey@);*1Q9=qFM3fG!%Ywif9dGo%zE#K`_2~B=S??^jp%!~&A4RRus3gS`UK(B z9~;KfU_}+&hN}CG>>u3yFGd#;?PsYkub`p;V;G#2)Q6V%N6;@QEiCu-7a@Ya5%Z7= z$S7J^J|HO6(m-7+Z`P05|B_m89vA_6l+wWT^rB7$?T3vPB|Fc39|0`JN@g78d9*n_bc&+fbkR{R(AF4;8{-|9|jbT`_g>6w@@$ukj~ zKpej{4L4G&d17hcBq`C&MLS1oP9vXTth(`-<(99`5p7{V3*HTdZIxguSum+!e!&DD zEO4KPl##4{^pr7w^2Dr(aKI@Sg6>w}YH5!gizi|aa#@ylf+>PDC2;vU^EUTAa zCfuBawkmTL2g0 z9P%dtPsTapI|1K$qQ^Q2_{wYWUmb23v;Ks10oMaA0$lel@(Z|W7vck^y@&XKKLy+g zc-Z@h4|p5kSbS3ZuD>BZU=QFTz_Q(l5BO`qTL9;NfcSt{1MURu1Uv}%FTk-Q3}eHG zh!6NC;3B}0A0a-V5AYVip8-AzSo#^_)AK(OAMlRkUTf?~!?@}2Uh7Q22S@Z;ivZt9 z>9sBcEIYE-x&`o|qkF9<0WTfXYwZL)^7vlsAmFeQ5kCd`G7%r}gi{b7@R`#PA8>v; z;sdsO5Fha5EW`&~kc0SuFHS@JQHHTK5Agxd_8~stnR5{zaQpWWA8^41h!6P6MTif$ zuNv_I&s&Q4M;OMl7b8C4q9()#ye)+IfM=~le86{BAwJ+`S0O&&6Ki@c<4D-k)xDMp zcwlX>H68H8_Fn5Ez=DomYc=4*>w2vXfZadowK@SG{qJ6D7vLXnMEs-RZ@n4u0T14S z_<$$hhWLPazd(Gz$L@sxfbe(qTF(QHy}Q@i4R|KtpwZAj;CR4^_w`x@fO7z=0pGd5 z*IEns72w@~9q`F)18jy*rVH={_z8v_Z5SVJ>9x`TzXJ3FW^L`YmIB_pt=GC1@Z1-A zt@{8szu0TN1n7II*V+qs_p80usP7oY?XUG(S%CMv(Q7RPy!=h*4RFa@&>P@}caU$u zul|aB1Fn4+`98)l8h0VzfIoc?`35}fZ;%^s?T3&XaL#8)7cl$pz1DWX2S4w%_5*%z zf3G!WjA2;+KzRXn9Du$6^Lu)&HGoYP@(buovaFW?iw?7_eSpsov8>U@qMV0WRu152 z!!2tOU`>i;tp@ZSX<2sw&KPZ3+W8E_roXMhg^-Z{&%wgdjQ5cvcg zat`D@0d`b`bOFzri*x~RI~VB^EJM10p8-Azcy_sE?F76Y@F3vbfMZWY{he=FX9B*o z0D1x}IuH2;eCGRz54ih$#0Px40`UR2ABjn%yGa6ENeR8mw*=m-XDUV0Rt`2 z7vSnkp)bIFtB`L%Z<}QeGLg?8S=M;K=K<>gVXFK~_+hD$uwqog@xuoXS(hNfkzFJ0 zRIF7HMZsXyX7mTRvT*G?5#Omw!p+E0Ge?d&C*|1%<(59l=&_KTzE3p zEhs?#D7_G_5`?d&`0__-U5o1%NUw&%d?QC)otQu3u*3@>5$Yv^?!)yF@T*+-5aUgR zy@adayXa5QZrSmDtw~8gOtES90d@Cee6s?5noV=gwMngmlJ*@2DoSTG^8X|BkFn&) z0{&&-uL7;jBXOlIXF2eb&g!xDxbVAd8A8Ax0DdXjcRN1G`TY?#&5fWrv#7^frpq~> zyxe<)RBDcVXcFc{z%e@@+kuChk+ie!o_Po^CG?00iRlj z?|?uiC#}^9#K1(*wZLCjkF_w|+j!(B@nKGaZQw!Bq+_gcxr;}O&0{<8?TuI$(`E2O zCy%ihY`^_VLa*K{(NE*vrXzV89C@aL<{HqPtkaz5 z;4cFHTHpr(+B}l}ok$cWf~XEOt?982AEe>SA@+CPYlpHRluj3D>i(<8dJ|>kqS-RUrWpU>C+3WrYyXqMmEW32%j zn@{4UBEtxxaxMqWo1l5eMe{n-5IzL_4Zn(QlQ#f=)?Gc;6S^Ep53vvweU<{tvSx*z-v!2hlv{6^pt-#~f0_^-41zYhGR zzz@;oOSEkKe&DO#?6Ky%;uqWa(WpB&^@Gm>{*`|4<-jNJ=&^p~;(x2nKLmU`@KbcW zR;O+N{+GZ{)$x~bbS~eGz(3g!{&nEr=qLUCz%Tks?DT1V6zm6|1^hMr;LCyk1@N)- z8v_1K;2#CF?K9~&+>ny}+<@=~%tHz>e{t~Bhmi&dzY+MKcK29AhwFG_xWc~<{OYfI ztS?c{PW-*e3cnxtc|ASWF=z)J{77z-i2rD`5k(fxd3NDXu<=>ImnQUDt6cbyjV}lO zfuvrm0&R}Ne?B*8#6JZ5r-$`ge{jX`wBz3Z{7;AWT0eE+ue0$Rfgd@%*E-=qtWhcI;z+DCG_OTf0JE4S-_ux`Bg0W%7K6AgkCEf z?Ti!u^g&AhA>g;36g&P6z@IffcKnUNm!J zueHL3Z?y5FVRvt19@qmqNB;eG`Hl(D{~_T2 zt0;E*Hvr#_`Q=G2{f)8pw-NZgWxZCdOa6;&`CkV3DcPX|A{o-LqO zLX4ws836yJ#4pw3Csr^6YG-!>zXJTPaq0LF;5_>TyGy*`ehJYLB| z9nRx)&=lX)Yhg<6E@M)sJr>&q{3E}`eiEI(-;vM2T=6d8r|Ebxr8G>0nZQ2} z{Bjrn2B84pNrnQ@9P_(g>sKzCTWuMtfxmTQuhrzjFR}4!fdAxS_*cNo&Z8Vtn+UoC z_;VlWwW{>?p2qj3+~l*I+d#AKiC*j9I*)TPS9wq5mH6xh&5|dvzecxN;`0wK4(2lo zll5~td#%?a`8@9EEDJRM0?i(mUGK8%Mmg}$J%>F%dYMx?X(Aoc*$U9?fKP0JODA(| zo!kg~3VdWg*5ycC%R*56$ADiA{6{YQUv2yj;Ai~-zBd>Dam?RDoCCnmh3~CV$CHc~ zG70NqER5!6_~ovO%*Q2;zNUlbz#n_9EmUdM92|O2y3d(cRTCfh?LLZ3>kTKZwV=7+ zFW94{(@NISZ z4xhV0Q~n9Y40>9`XO2Vj5@_y*U$a-wR~7qAUZb3m%=oYFVv%S&(hiI(fegG|liAf27MpdVa%^X9H-mM_N`(q#af}cKAGKu7-d4C6upS z2VwJxPm4B-%AI`j6OXd2??$He9Ve~f@Vk59mp)P-_miHxh3|;?WPoPe36}Lkoe$No zI)_g=Xj)9mnjfhjpQE1@pt@{U2z4a;jxb z(P@$7T<;Q>z3N(D^6MVF4)q zHsJRGf1E4+5ggwHz6U6y6``+@#VlDkM);S z7k;db4*_pZv#hW5vXBl>(%%ihe}(m$FJ1EQwaaoN@Gs?C*5Nvy>Q0YS20K9WJD+6@ zb;)4ZG8_Q@mYLD(1<5c5%IyIDF^nJWGE914Bq@pTw8oV>4|v?$_{0ZThbDp+0{;~7 z$HUiTOqGe(Y@F>;83VUjT(gZmQjq2cGD-ysbg(!e1N9MZrc4II+IAq^bT zz#$DB(!e1N9MZrc4II*dqXF}7alh*>0qab1b{Gb^BlKUjd90Ok^rI*KZVCq zLL)tI5YY|gYuQJ8Fz_Qc68&~aJhm|KFGRi{{IHzQKe)B{2e+^5C!-n0)8bA>Gp5Ug z;2!56xtiz)7a{*vUn`&rUm-KDMp zBs6|u@Nblari2+1PM5Gm!iywql5n+z>m=MD;e!%(O1NFZT@vn-(DNBz#-KPbB=egrj9Unkr$ogk=&|NvQbRFu_Pnz{9Sv9TNQ}Az>&r z00Yw{4v&vtA}<*Y%r7A&PJZO_jz>PMqQ^yt73a9`+@bCFfu-VhuRNOpb>u)&@MoM1MB%4Z$JL;uE$bMG+s`| zMK(sieUqa1^8$9?^DD{e~+YpXaIWB3+eKHN&mtC^fdpXvQqSK4?wT%=K;xo zZ=CcSCH)|evLqQ00TlmE8Gif#^dvi7&r13!1JEn}znAp>IO+FD`XzDFe=O;*ij#hy zr2l!G^naK1zmAjsb4mZ?0Q8c~21;M5{`_%(_=;ZDhrbO#uk7_6nc{%~=!rkcqUc9@ z`?n{>U)lG!RUbN~{No3ZN0Qk<)jy@LNdv@>%zxeh^u(Xq1EsHX2cRc?>H1wX06ob= zJ{rY;=>YWbhwv}n`bx5sJRjqtU&{deX*(t5S<(L}PWo(~#;bSFy#+s+)gJtg|PB>mU{=#~8U zO8SgA>F<;D`2)}^`%(5>J^($*PS+EX|3w4PEB^7?v*O<+`L7&+|NnM-ruK*Oti~fh z9U#AoUX4fY8Gv5d52ZoB$K#||?d`W!Uv3xT7z4GpD!+G1`sW9bU(u`j_4)wx%HDo0 z`R^WpUg=Zy7yII*SM@hBtN->v@mKZt=s4*+rThbp_rGp^RP-N6{sZ+dBtP}>sy#n- z0QsrB$kr7783WJ{1MT4&{ka3sD|`61>X*_FMB?9)0pwBT`)$`RRbLMEN2+85RONN3 zKXU6uJ$>8tMWv%)WPMl_XZ?wHe5Uw++wJdfWQMMdQ~uvd`n%(#e^}DT+kZSF>ErD` zK9uyE29Sq(FSs11 zRQ#2G2AU5jdZnN54j|9}_VKZ@pS{w42Ac0lG8?G)G|r>nq4BTKgZfK)q3hQ&;D7u0 zH*qkG~bMLRyv-6+-J#+54_n!Nh+0B4Y{=v|Hy-$7z_;-8o#XqaTU+=+}cz7%L z&w21!Ki8G;cYE+fzw9SXt{QuMW&d-35&lPg@VULoe9LRS%UnL>d0V50ezul%d7c6P zOb@>3m-%Iv2VeBR4E@V}@@2narBA-hFNb~dWq$dB2Vd%!%gw1UKQVrg|D`>=Q|Bi# ze~|d_hDUpF^C#Dg-GANu=^lJ(Z^LkKVZJ0S%}ALKNPmB;_v4*+Gh>akalYpDzK_(O z%%8m8ClJ2OpXxo@huCrp4E1`yM)b@4V}XZ$;Y)w+_TbBSCVa2w1w0GwX%`!hpV|McLC z|2Kl~)gFZZ3-G<#oA5V*@25R;9XtX46#e6WILRVJ|1WW^&L{s@;CFlQr9Hd|{v{rK zt}i}>f1?Lq=A$xxyw&fQiT=OA{`)=bk@m*r=JZYcC{wnYn`sCjPzMuHZ_TLP?SNs+K+ycJWcp&_rf#2uTerbOzeez|0ZoN{!{0ZFYCF}eDY;I7xBrL{rnX^`D;IPxg18e0iU2(nq=aWAS`)B&(OT0VVCtu=S(kK5B*fZ#p zFY)m%pZsmm|8t*wncw`uCtv0_dwlX`{!xgZs2B)||NmF>k3#&+?*Bskboxckqy%j%s9?6HqPp{vP*bjV}e;)eDvBy){f0FrUiBG<)-@N9ZqJN0&;#B9M zU+kClTgWG0;^%+|U+j_fo7ekq!oSIw@B90gGXEU%X^+f5z4kA}9+|)Wz^8thk9ob{ zFZyLZ=Jotp_`~qedJlV~J>ZQ zFaCKE_9Q&`|J(TUC7=3Xj`I5cnb;%osxaRZ&lxHHk$B~I|5V~tzWYsu`CfMa7v_6T zzsQ-i&tU+C`JQ;jNb%3!n(sO9Hu8I5g?Q@rjI%xp@pNqe_}zbWzt8aRexF$STOnSL zUBAP)T!`0BKS}%9Tk%@-7vi(i?{X&oDa2>-h*OGx{KjYD7oHC}{U~SRpThGY@rYB3 zf3^XByF4F~_l<`<_9L97Da?=kzTZ`dzwVY}&ZR#T;_ul0k^SJp^LeMAr2WYL?mPAQ z{NGWmd;XX4H{bVP3-1?ZZ%_Z~esAIZ!tDN({`v2I-`8nfVg6E>zc^cjj3=uB7v3+- z?jL!cU3kARyMN^Q^ncp>godQnze!s!%{TR_dq_xxES@f8H318li z`G-&bf7<#l-}RilPcx-%JZd7l5dZJ(_%n>#Pxon$yzlZ!pZtfQzs)CqZ^x6pwLdS< zv!ph?e*Y*yMEP5yoX4xbyY+khe#kUxUIAMZTjJq={y7HwpYR#*;180`E7))(uip=M z+kd5pem8%O2Y(^i(JID}yvKvzO`LWcf0GA4L0rxwX_p6oB|WGal!rBx>Am%~$`Bh~<+;o@@Q?H0gO(9oe$FrcdaM1*b;tVs`d9dV{VV*vnFD;a@H*A2J?$ zz2CYYarqFw*Y6{6eeofDuipc5*KfOr{oHrB%+elKc<{wPQon0`@}+(^`{Yag7R?;H z|44bCqB3x*@!(5&h2QSMm-7DFs8?U~;LCh*EBHe``P;x>?~^a{r$74S%lEhTJ7sKt zN_h+I9~I&f;-5nMcR2>9h4w#o|0=})vHc_cs}TRk?qBcJ`0pNn-|sOV{j2e0Z}~^& z>w8c=CwkcLu0`(uGH2v#Ui%Zmm;K1X-%oRTRQz)*V6XiT;ok?bI-;Wdi zF!+VvLxv+DB)&`ke5-#CS^Up^j8mb189&JX5_@F7{GImqStS0-`>_A+?<+`q8-{}m z{asp`k$bzpJMT97_s>(;Ch(W}Wj-(C-R3;`d-CKT*&sD8o_0#NJ+(gh zo1kW4p8OSg@>l1{U+Y^ua3P*Lo0`;@#NR?Z zb^7P+7Eh(VcnslmmPh<`^OxqyztksR#*sC7^4I6d|7V{3LuQL*#$WFL#Xr2qz-fA( z{JK2(?H+ttkI8)9>-%uRm-+f7_AjrQB02t-{S=w+dVPP6*Z*vb@V);2w)j)_zczT- z!I$z5qf}mhFIx1={J6T*UwiO7pJRKt?Z|xVG>`ps_CNbm_~&@=+5hjd@i%+$ z#Xo-!8fdt|2f|AA>-ztM|&0jzFp(doj&cCR`I9@U;N8H;^ejd7XL_m+2Wz! z&EKa{EHn3W|1b9J&3M6OU4X~;CroKMgL3S`+0xy?GzuSead>b$HPCum-VjK-`|qCTfslqY|4p8TRy^RvG(PyRrj z{B?Qqcjn2THYdOGw&%%TnJ0f!p8Sc;`PpBWC%-RG{@OhG+w$ZGTJkGzAwEc?G}0Y^ z3h`lV{}kfG*#3E^$A^V^#*@K3`RnuKtGW5bx0*cpi9GqM^W<;IlRsr%e&ub=lfNQQ z{&1fB-Ffm$TJtOK+igD9ou~andGZVK_N|S#oAdO4(P{a$&&E9Y19|e-<;mZfCx6=f z{K{L1w_~@@w>sWB?`D2$NcM2}n%DlN?0?99hS&25;ro3a!TZ~6&nh;CQoj3(Uccuj z_S|CBE3e=46W^=>-)nzM?DxALDSX*q^!on0@MV9|>-+Cg-eK79wZF*E7Wf{rpLCW- zf97_;_YnS44?gex@t&CQFZbZf`f4lX;dF-wU-WM`bmjFvjo2@IulH%hKf?EVpGN9S z_7}Z=Pf_@?zv%UQic-JaPB|6&uknNYU+BMMkH^yfr9T$>ue2N^r9bYi{wvQ1VWE3(9xeW3G$j?E35%N;VLC7m1zX^FgB7n>5wIm zm5?8YJQ?y7$R^0SkP9FeLY@n`7_tkp2l70~rI6=C4nSTE`DMr(AlE@|f_xEj59DEs zj2}*boCSFBkR=$isr0@(=J4%r9!HOQMG?}L02ay#U>vyI-v zAxj`!dDAB5ZtxdU>)bB*5j zLsme}fm{sP4><^V3*-ZkzlQuX*N}gLoUqvFoeEh7c`9TOQsy&#IR6~vmtEJtf%9)e-sZY4dPM#Z z*YAUT2=Y34h1wj6 zP2=Oo#QO;y57Kc0EgH*k+)L-Byok(^-b47i>3D#Aw2_X->G&iSsDX|dbUaAs^<2Ol z>0rY7*hu%-M#l?uqzLGzqnC~+==?k;q`2;G&B05f^#B^s{9p z#U&NRrN1=<6!MEZji+x)*JQ=VD-2(bEaT~$(iddq@2iHg;`^!1S@HeV zPF@JR(s+9E)gccyZP&)rj_bCp_<^dA{N+yLsf7<*=0=qouSm&IHvHWxkQINATDvM6 z|GjEBD_*4PZpp?!SoMt??TGPel2S$4@X6}-<=OD}soewF@IzGVkF(*2s)bqc!&G}# zoc>bWz1j2}PK`PneuPrP+3=~V{ad4hz<71!DCbajr&hH~er`T zCcoJE0-dto)VGa=Zad!q|MMoB`UCg@@aur@Ajx)KIBbBIfQ$Xz4;r9b`Y}~dHv9J{ zd>?g$3ZT8o-$@b5}A4tM9 zQJoEZ)zgNz!3Y%u9(~3D&+KR965z9cYtCQX-^iuFi{Tgx{4W6i3OkU}C3Mc|Qs9T~ zGUpE&p;iGu^DhQ?6ngF?Jexo7C!GCR#{(v%l}4zCfp7V#0d|iw`W}b=Q}?A0lrAu^ zdRFr%sntA*p@e3rUIPCS@MTDR9r!lj6L8;&bRYKfA1509??Qt+l<<8hPOgJ~?*E*m zUA=aY;SU?3j)tBezQ+L9V4Nw1p7qcp&Fy6HTc;TQZzdZ3&ERi#@y`PP*bf^11<)S_ ze;fEvqs}KhoBzM0`A4WNKQj(!MR~6PUdIy~O5FZ9-2i;(=LX*b{C402zc6?mopZVe z`0x`3R}dQnf6@T$!2cU~00VXj@V^3Yf7Sp)bk1pCI_37Go;Ubf*mEfG;TH@p`i}-4 z_?^M)Xr9H1=en$?eVf5|8lm{LK#l*=0PSecA>hNW77c|Bm1%Iq^FLuQRyZ_a5MChQXy>tq0!TU~p+a&kEk; z4KCyUe?iZHYyR^9;jHJ9 zD#L%}P@`y*=1)>3apPcFay}3K`7MUuhx@(+{4c=g0)G{F{anNU2dzIj9YFI79yeQ| zf3ktqVT7|ipE%3#k269Y3p~sPq!b6g2KbXMyaD*kbDaG7z`qat8tCZ+KIdG+$1ty! z17GkdgP#HZrNGy?aNgr!`}er;yMUi=89g^c&rgB>130e-I6VcttljWGZeaCi;5{yU z0yQMQ@6EtPe-ZFzp7>D`{k*5b{EJ+88So#w@MhqiZhGI$z( zz8msVi3kHwCo<+d-{hbs4H1OCT432QD(!eKfH~38G|19u1 zI}Cn3@D;#c{)-d89QY->o%nUYr@ditp2u^#8F<$ogG+l@2mCAh7^1ZE4Zy!M-r&N2 z0r-Y}o%k-`JNGyEdGOCZR1fU`;JXZ7WrR8s_|@+=0H*b-8hGengNr>az?V;U;$h%l zKg5YI1HKvx#QrY<-*~v;f4~U!P2hi;YJg?%|E<6~0tPtW?+d6By=1*0_ zu5rJNaIUX2XBvBMHqAxV0e=GyNC0mG9-U?QU%-7Mz;^);p}+SM&h}4BnS#=(P8WgS z#tTeJ|Iq&{^)>KoT>Ni=Kd;5`_eXuL0l(43{~`EioM!mE@5AXK@E5xHPk{f?`G)_J z5$ZYMlTSB5E$V9r^dz8%b})5%1N`QNhJPmfwm&Vj+0UyM8T{+uA4)j;X9e`gzQNJp zSMWlc(u?4i0iSxd!KXq0CxOpA$KY|`&CtIR`eonXEbza7uHk~={t*czi!LJA! z{v$MQak>=zP2kJ??Hb_QT=%^NxZ;H>C26<+1v~&;=DiOAuK`Y{Iz0ir5xDs61&vQt z>(S29Ow>!@w}UVB^&0R2;D0IxFu#-xt z(-gw_zAs~it~dZ#2YK=sAxX65sb)7ycRr zG{(2P@F?`0_zR=waOhcv`)>XsWKo$9n3{0p8l zL`)ymfn+fA+rd8u{HYqBsx~3c)AUKFqX}pGZ`fk=tV4ydx!KBFs`b229e*thhaMK$ z_$L#eM=kgB#8$0`D*0Zgo<-ohpG)>=eDw3p3$-3<1+M3eTXnml$;A-gea z1fHv6+NEv+e$@lU51&Ss?*hMMn!%;N+zWieRR))zqk0VZ%hwzHMX6tnkJurf{s{g# z{2+kR`DiB-XdsiZOt>r$&w-a{yht6n+~|1<_dPiW|J)pSA_snP4*Z%N_#K1??1tm> z2Eq@f=Y#T`7tZ67z>w>F*AH37(nM(U~ zoK^w<Yda2qmT&;4TD==UGma_H~Qfqx+fzA^`XXAb<~9Qf}k z^kggV)0$tT4&euClxk7lmviWO6a3534ypJ$O`-`N$E&&b83onQ^I?sHWD_+x@Hx

cNOAEUk?43<-o5O{SkA+7oqGkGpf=2T@#N|L-0!`umJfhXa3lmr?Lp zl&ci@^OqT75%?z(&i%_B-x@W4v_0qKz|SL`{nPI9&qW%as`^}U=4!2n;wL{KrWArb zcjVCjAo!EMY=| z)F9?3(l0&&e8)0lr_}pNIrOxGf7^M6|5enNMfkyd=OWXJ&u-|s z4iA)OpuYB{P@b({98NgLH+TCvM)Ql*pTBDSDdR#7;Q`dCUChs+zZ-g<-(&O~g?dZ? zzxV+INSy2^{6lud_!l=3d_^j1N&*R{)1D?3Z;BO*cZP57W8$3@q&wICE zy;%dwAE0N^4x?us@a;MDOrQ;iY<^auWIC1Z?d&WLsg7_m+!aZs!$~V0wL(4dSU9CD zt0Qi8^~4tkd#sLhJejhBy?rVak0yG;>2ODJO-WU0c9PW@iAAhnG8yc*!m)I+Uv(yf z(XiFg8;$l;7TcLc%(R0V>meOoR&P%^&q+zZ#s=Sg@u4FtqlBaFPnGU^tBdfl-wPB$HuB>qx zSy|(}Uc0c(slCd6YRyY`hm(?HR(a-AMdnjR->gi{F3gm%ae;Mu20kSmjAb z)im3hU*9yhsbRjgARFdn*C*5AXe1>>oQ|$^xzJo%U0qglx|`qH(>qEBW6qmZmFSji z&26(5%%3kh(4bwY!)4Un!d7EA*pu$IO0A4*op8n}cDVkOGwSEIHOy?3yXlJyTI%O# zTHOfZwAO~7k*O#~#`ojt)+x0MK6q5hCPT2|InS7-t?gaifSbZ;`O&qKY*Bn=HT zv_umch(=m0 zEG2UV;*33!rDQxf=}0sj@71O1(wW5CWH=P3xYp01USFVMr>#*aD->P&GYt%KE`vS0 z%qV9kT8k;NFR>EIcp{$E)uP9rkt>qDGi-cl;=RQKjD<=W4OziVc(q?N!zPeVM|qSO zIiXPkCp=1IKAKS?b81Ej=cz@5xC@Dd!aX$hXYepNuS*XKAf~9HcIsgxlhe_Qfp+My zWIwUAYPnye%SzJRBf`BQ8|GxYVgl6CR6++U=cz4Nxh^C)DrLc(_lhpjqaJwXY_v|` zjxqu3kEUrxWk&Sq5GgC~3QV|_d^t@4b>0k%PLyj^d*ixER#woC9&`g#&{APkQP2iYIkq^h*s3-Ob*|b#g{T$b6e6(G!uCkxiIL>PAxwR^j=$|@`uy@(V)9Td9~ z@;!HfbTG-n%;xlLjaKc%vz4}{hOEtas-}iYYd^EKjG7t>P_zQp(*bftiky(7*;I!` z3(T&VzG0*T6GpnLo=EnDV_o*%SyM?JgKg@GbcR!jV2lUi4i%+IWVaQg9g0+OO=V@d z-ZY>OrvGOa>ty--`j!TZ=CzhZb~<)0I+S(FqPg`gO*5TWXm(4he#@FY_jIeF5gHm# znXjzb>l|H(T>&&05gVX0_GNXl`JwRK}1MO7-eJ6h(8pXeiOIqaJMv$TXP4`Fx9mI*j|Vn*8pkr-{Zgu``pvzwb{%(Tji%Ze)%Eq0^9v_(^PYbNW6TMZnORiZZ? z>JBEIWW8+XS)~)!Q7xF}sb|k(?uX%IG8U(ui4cMDn3Jrl#tG5%K1M}xg2`}{=BQ3g z6Qcn_tQ?<3s0Vx+lagOgTB^{$Pg_%2v6ib{d$MIPXB4JTxVz`#3AER5y-9#AS~a){CJ9EoMW(YH6Nnm9{D8 zd0EYD)u}g+T(>eUNUw674q+ElpL5bJ_CGJxx|dj;!AQ@@Ro%aO-L_E~XgiJCRjg}- z%D$(emnOX~jOw&IOC9m_%q;V$e<#DsA~BZ-xJE`6k0WtoX>?gINeff6S(i?ZR^Q8k z!f6F7GcygHjZZNl#!`@$YG%C}rG3Y6l)A4|K_nhZ+Z@BCr5Os(U3z0&vCf*QEG?U@ z9Y3O-1A?r!5JPn2v3Qr$c`uGA?%u`OGjVRzZe#~7BxyHNPo=`vdAv!eqm7Ae+^yXD z$OEI}ilcRvRaVVbRL?X-x@c z+}3;9ftJ-pft?#)GEMQCwlUjiXP9kI#bu+Emj6`S$t(?s!myqX>Z&z;ID=0+M!aI_t9d8|4t)_W&Z|di4WCstHT(XgFYzxV!b16>Y=`r7}v)t;eu+s4~ zO)m99TceA6BRw5l)UdNHl(kX6h=oQhF-6aeB0NaZyrG9$k(1NeNlU_RC)P60YHnK4 zMm|DROpS_)Y~e@%G`+>_Z;$jQZLnFb*$Uj53Wr@m%h4jr(Wq%dq!)8-yWh#E#VK;4 z9#6Sd>oGAlG9a;KJge3#1KNJpwT+chGE5as;~muk(|Gu|I8d5?4>YqOe8#{fJM=NN~% zFU4KGDUu>D$IL=YFC#50)EDIG4b9w^yY9_>B-BgWR4Fs1vrXfy#bzfEt_Z@u-SB`eSqpBWWqA zuh7~v#T%UV6N|1<%MEe{d`k4BRk7~V#q_bbD^92Ufr5`JPKRlKp_umzi5=G?d~ul8 zuKL+qcL!;cGo!;ib~8ETGw0%)k^*gDFd8AvMi=!zRZLrg^vo?i`gvu(2)_r-k3h{+ zO#0q2o+FEN|6&aumu7DBVfw_6k|lo)@{0^)nC64LHz;rweX!?Wi2Ndt79u2GZ^)oc zuKX7uzsNv_X+F5~pGokmd-lY|{vqTSS%Lg`eUW~l$(e$5%CAsJ{>{iQatbnX8QFJ| zpI(R1DMJ5q7RfKa3nelw7YtqNz(+04qyOnQYBToB??;LJJji0ds1x~Fy8fmuzx>XW z$U)?nIuiQET4f*s2Q2iN{|(B^<(K=*?~=76{}5larGV`-e>{+`vx_8u z=6eXY1A$|?|8f$$rCr`enEn2l?;qUZ%&#-s@{69yl-ZGg82Q#3*(g680R;h31bH}R zW?jgYd7r-VE2gILb@5EDK<1PAa1`!e;=(2WbQjLHa?TAI1-w)~Axnf%APGPq9F{{SHiQ*{6U literal 221840 zcmd>n31AdO_IFRnK!898g5Pc<+4S&Y=PH*>jY!^uiidt8~t~_sP6nU2VxX= z(2sN~`y2fwEd49^$~B9^#ZF$Z*g1}+>%R*`G%cnXN(wr{DN777tCMeUOsqv{)oXNh99?V@o~dgyNNzwPd}@W)kI{7za0EW zJa@u>qyv=yVcELd9(wnaZ~N7>n%nXDQ*S)^!Yx-(-pTlnXs~vr=SW4iPAu&dq&e{4 zfTM2iF}HAf){77S&=Jvu|8h}rqRbC~PL#d}6(&m0PLe(=37wadq+gzdPH7T+TcqdU zzu14*A|Vl0Dtq`#je{fi{@3zOh~PJ-W-B>kQwbe>O=etVMielRO_J^cBZ=C(DhYl-l5{l*otu)Rf0rbE1k!WxU+lln zlhpe-fQk5@nFN1*68!cg_=&*h;J?^^t&-?Tha_~aOp?AON&4wX?;v%PijJJgs@9*Y zpCCr*r7`I@2>iO3bP3O?h4fe&Ax)id{-mk1W-pyRcm6Wh?4{>V8oyxiqS@z9pRr)J zG7vC`7c8DR-8FylB5BUD*|V=8FmdNv z>|U~D_EKr)g4xrT0!Vc&cDqagR69hYZ>PcT9!8lj=XjbJo1^h8q8H1WR{;y0R-29Jm5 z+6|PBPW(${TPDC#dMlC6>1P-yHcTWN`=2C{|CNLP+}-B4CQs`aj92<+1KrEUq@eQ8F0k;OBp zTIR!%?brY5?NFjD}-SJjDI<%bg*Xp>u*XY zA5;G~#FVc4)RdQRN~gN@e-2YR^G`*FVoE2T^nV4WblsLw-egmH8y$?_X{L1Y0rh|L zOzD|=B7T>c($S&DzvZU%_C~5C6`9gyQ+kOhUDpxHE;XfhFyYsk(#_AI^``VAO!y6^ zbeaR`|2CS^JL`$~Ei0M3f)u!}pQ+kal{YX=Kttq{mDZS2=-rbZQGNtQt zQ_8M4r5|O&M@;EGP3h8=QN8VDO3yH*=a|y7OzFK%>Di|ATvK|EDg9_udVf=TA5;1e zQ+i)hdcG;WpDEp8O7Cw4Qw^^GxZ3P3cQa>BpJU zmz&a$H>DSu(ubJROHAoQP3fhk^kJs-b*A*;ru6lu^gL7g22(oudiuYOrgZi=5gBEs z^n4wR-+(FoBvX2|DSebFy~dP2+LT^vN*`lNS3G+&6xIIWlw3*i23+>gi?Ei8XM4u$ zCJ=&$^0onTsPA_Cm3ui5qWC-lX?2J2uWvcU$uw&9CljkpWAVRG9M3>WD`4@Z6em-w zIavI1ij#@ehOqbyij!&8a#;LgijzszvRM3FijyhTBo?1YaWbJ={jW&qJC5RHI<-0$ zKZ)XGGPN2OA4YL9m0EzskEJ-7NNppF=Te+Zqqd&KyHT7>qE^b{9Vt$xP%C2bHWVil zs4ZdfG>Vhy)26ZbPnRN2CQmD1@qH90Q>Qst{9B5XiPMI#_?HwX)28LH_}?i`CQZv? z@f{Q=Q>IBQ{uaf_glYA^Q2V!0Jcr_SEM87=GFe&;i@!i|GF4iD#h;=$nJ8@|i$6?p zGELfg7Qct$WRkQ}7Qc<+WQw#R7Qcz&8HefsE@t$nyiQhN&T)Et zE9Dm|tN+CaRQ}om1QcJrQW-i$u~jMW|LW>&P;0AGlY2>1Ugz}}jrlPR%Hi%%h=QR- z5b%^L``1Xa?PoPrWMM&8@th*L?cv)|&LH+Z6*yEgMf(fNP#6|1OYyCU`07iX2NcyA zQG8Vu{n2<1^-=I%G0=d}_$XR&K!P>QLpIQ73G@Yss`m2{ zd-HXw>pWDJkIJeQpF03t7lB&|T*Yx980v)TD)K3G`Ok+Ag)$$rq1x9&nUB-&--)#n zquvYydor+!-%E=+1bM@Ne8n?Hij0qqjJJ8lSt3I-GG0VRg|r_GXg^U~oPqLeSmCX# zYaxISsGwR1?w!?J$sChZK7yVRRI$@~sN!>m5DUqhBu|~K#Q7PIIQq+*0zT&+&x$>g zJ4>Y57-Dz0hczx@eOT_Ns&kKT+tvwSs-h5oc*nG1jOeux>1|u5Ss~x>7Jv~)i$JIq z$1JpBUN>Ppbw$Mi*YUjaf;1}TsavH~)@3NIYvfm`hHI#_*I>dcN~?}^WZrHiJsNK?z=x6 zIz(zCdmYfP3I({(#Ap*pi8zHNRtjI6Ff}0qb*&W@FrfmWGy~?h!tS=fpc$ghhpn)s z7FfCgd(H|w!veD#u-B}xJ{DL@16E^&{Q?2$BgoM7Z>*SIz-Y7{ToFM=s7A`)I~&R5gp-x8hqnS!F%N`o|0X%dJP_Ux(C7n! zRb?>8c$K|BLc8Tn&d)vdVBOUv$|v;>xcAlqz)JQMc|B;HS5=%~sALONZ#+Fj?sy~j zs{_QG{jWb^x`GyTfy62t<76qc7a{Fq#sf$zd?Eg>A*|MfGTo0JpmgY@U0d9 zMkvE6a9$NzsZuHf{H&N^gI@WEYsU-9h&yK@Y7RkXt6tg|ul(kN%0yk;UORFnV_ z`s?=y?V!-36be)59)!?Up9x*BNdFHKy_9_vg|0;?oP&p)&E2hH1f|SJO3{kllB-R{ z*%ZGBahAWJVjjgOP}%D#bP9#;qfj1&Hc@CGg=#3&8=;~VpGmHqif<|2fyH-A?v_O> zJ|*fcen9Ha^}zR_(DxJ?L7{IDD#heJ|B@-peTDa$1Mf8i@3k)Ij8Iph`E{xUdveQL zh%qm*qJYXi1Wlo_>OAOKad3!S{1mbgl2(4gi;Qv}T#*)jw^Vf=^cT=5jO%IY(K^Lf zn!zj>Gyzs@D^2ieB+tUk%jb-ERzxJ%d2rf2kq2CTJdp=otvr$YUG2k1S6o3{^hFE8 zT`P(yd?bb2R;;IRJJvGQzV<&{uYVzFy-Yc`6UtV~{q?cupQo(e>wp1Nd|S%kZqHKG z^u9ESBp-KZAoLi@o#}s!W^jsnKOul$ax>-EDgH@Wz zl)04#NX4sE^&+H_$h>cZj%N$~mE_`c;AHbid-+BQ5tZeGkvHZ=#$t}8_`OuW)lDCS zW+?u(oG~vkww2aOh>ro7#A;>KCQH8J`-pNoVKSrL!*Ual{qQ@G4SH)aUy^zoFiew&WkSyD66)B3Vu#AnnV)mhJsv< zE#2L?)ZZqlN6;-y>eUcZ_(-1f73F+p&M7TBglblAAryt=)4UY)dFvnxoo-G{liCW- zHXRGjoQyL|mt>0kJ1M_!GR~*{D^6Cl?nIKFLIwBI0I|vveZ%s{P(Jy52}RN>o-i$7 z5#e+yNQWg77JT=g&?lz2KarqbMlTy8^e_=g?zHfyrDfEoJR!{x*d7QhhFw}Fqgrpl zdW?2dvRWsjRxatbdJi6f5fB<-u3qoK!Iaa(oRgdzooH zRDm^}rJTU68CEW?2ve`juD@jLrQF!lT19_Y`&wEU*%@^11rt(5-Op&nd*5Pd;>tVt z(!`Z(jirep2la`I4ER4d-5(0B@kC^V8n*}oukJcY(ns4s=4Qm8vZs&lWuz~(F5tE?mQ8CW_4Vy&vU z3i*6ZVN-ID*8ts`9CU{PT96#{hygl1Ip_rgl$#t>X@GvwlD4kK0M#Z3eQtnWOb+^& z0lFnQ=obStAE1iNUm^PkLkJy1p|unmMLhC4WHHB&@v=AX^I((1*vA&0A zMF>yDCuvCVH72;Z#rKFPjgnhY7LVt8WY;U)w+NB@2zMdeM)53+*zl*G9Jh!v${BL? zXZp-N$OzV~6nSevvElz%@{zFW(^txo;NiHphn_%JG>DV$2w;ROGiz7{wwfx=D0e8} z9bltgGP@Cxp#eqpDhds8uf*0wyaha#!DEwoEQ`mc@mMyG&Ev5g9$Ug=v~U8N%Xw@F zj}`G)K97~~n1fc4N1NwZS}(*xXEVT0RYm$C-At_c zIx00goq&MWu!TcilBJZW%hf(W5a@0YI12>Az2X2T8i2v(8cr7F&oi>yo3k$!*_RvH z-+e_-8E-mT2(~&@tTu8!L{3<)xZ6nBj)aPhh=zXJL$Z-j25tS(06YS~emTpVg^d03 z#es^h(m1J%p8cT`Ud{8onp{O)n}Z;9B%6LfC7+-`N}(xK?~$gg$wt;VQ9&jO&5^%* zQ$DV8X?LoT5?GDPjT*ZEt9nVjy@BOjc?k8~VG#Q_Ys4S}Kp_A&8i1VuKr}BS9ijn= z432o)K)k?63^7Ph2qZ!V;8q40ZU86*K)OwD>=IrFsU8!5j*)W#av=VEBf-g`LWCVE z&Ngxea_C$mp&N(3pi^CG^Wl#PE{v8 z~mEZ(i&TY#04Sl2U!2UJl*g8Fhd1eIe)sFp%Z zWbYz`$9+94DohhCRB_X!0LG2Of=?MD!V&KnhD71^xvJeV-UpvUwainkotUJP(6M6z| z6!qpe=s}^U$(xGpw1`H7Q-@*dD2b`#K7*BOccUj50=l>zB}TExs)u>)_kDueGh3qe z+bG01DxnbLXeB~PILac9Xr)Q7o;dorF&t?inu4P?RC`b2NTLwq=s$ngIogX*5{|MH z$>_6qjvR3^y3ouKwaF@@DCB?qd^8o zxydoFp(HYDtZv0~^fQPW9GQEP*WQC_ zXS&sqLX4vf3Nem;{WvK{jn%Dqj^-!hD9&a34%LhG0ngqcY|YKR(^ps%XRC3p1`8ZH z5WeE);q4zGjKvPsxziKMv94>4#8Bea_%l=hSFE1xp4F=bn8+jI$iPGDTm!V3f$Z0R z%C|(m1^b{XZ^bjuS<5#EKJIJ7u1lR~MIF}j?q$!`nhx&v1R%z~8EBKjnR=}IF$CVD zb9y=G>EZT*YsLoc=$Uv@-FwFR>cQC+24}rEXQADkvjP(Aiaj$|$$Tr4g54Wkfo5Fn%j+6H)ByxEh2eQnf#>NgdA~VpupmPt~)4*9LYTt>(c4b`}ggOI3Kct`2C%{6lF57)u@F#m6>lTY9Ty>x8zM7<*jdFOH+OhfA`ql@@09P zJ8e{MW-SV^Dt3MdvLjz#`aGkcx@nDeINNc;8f}m=E!%OJ`K+im^N!V|ptGLyen97a z>jsE|n7%+Tt$0?{ViBz~t+b=>%3<81C%if^Y4aX+qs2ZjC_4CYFu>a>r0_CH1RB8; zQNyD=Ary4hkQ~A@RA-GvEOm;1bQ-5uSx(Cc>=0S#=AA^jhA*3i6n|z~d_l+)vxox& zw)tvQcm3Tz{90o3IBRGjk7?g7Foy}>EutXXRHTJJz5vG{b5IN5Y!tQO;X0DbWgkS- z&qX*+V`(8KF z`RYzEM2p)rW8#Dq->$7s^IqdaI81%d^R~V$y7NX#^LevSvEtc6Kj_pQG_?zQBfoO@ z20=QHOe|@Cr~dYPrxBw?NH7@vm9?LhQPfl4$i_Cf?7IaBOckj#JfjxmcVy#T8aVRN zRGg9HsWj(^CgU`b4vx^`8j9(eSXJEw8r5(giABKG9F?uLtB=?LYUq09|AgpoZ`v55>WORG*EL8^ z)U-rOdJ)M1Ym6q&TeM7e&f zVCi4byTJ%OV}v$}P?h(7grq9(1N`Sf`hlG)6ZxSWaD)f*K$t_S9cQn$(u1E`eLJlo zE=Pkx*S;+{(00Ll@i2DN%7dJq@(#eF=0uq3NDT7x_kd#odR8 zQTiJt8RO`DjM}+s2RuhVJE|d$x$ONLe8!6zar*}3;-NHph+F0@rCPKxJW~~!L-kA~ z;}sB|xkzLVlfCVc!b_7grICeJRQn_|X%ZchCGAU|IYcKdd&yY}dI`YDS8{+107HEBdpOj!7h9Y%B*j?qNPO*g-fTeN)xf~FztNXmv zkDe{`x7W(nJTPG8xCBD~`g2|ABj8yk0K8!UIx_%MHq}d-HMflvTDod7Tmr}UP)mz`w82Fi{FJQsKJW&n=!Y>S7Y_p+b?x$z zzaCQkBsWpi$BudB?L$pjtR^;oWbdo!8_yOtgs|hZmI8VScI0X~CQ6Dii&$mp-<2of~MgX_5p=( zUv(|DL-G49Qetf#GRr2FBoI(5@R>Nb}JXXtNH9S_w zW3@aM;;}j&tLL#0k41Q_p2sBWO)LoWSO$+t2N*9|JeI*@**uoTV>vvQ&13x$Q@uHe z_`E|9_G}T|`3VL%^dW%mr=thE*}z{94$#e#wh2+yOHpMVdBN3yakcT%aVmZ&=9VC> z=Mf0=+z9lOoB9*0VGY>{n}r4dqj-K`52{rBQ|c94t>Q1O14(ohbw@)R_Btn+wc2TN zAx_d7q@;5gss60VAC;dD(hO%>Nov}!h?&7ptiE9Q42B< zEF#|20!l66!E6Lec`ygTbv)P~!Sy_d1&_5GcrYKqjV$PJkny5m^gN}nQnXr}s>J!- z_d+cov(Q7IL3#P{riSnzK(e9FuwyFlIA!8tJweO1sBaXD$ZPUpikO*4S6_#8Y||-4 zTiCPBb&BG@pN3jPbH4)rhf0n6~7)TCs)-lVEx_z zeg9g@KtAg-&fn6r*|Xw;h8p`A5m>#K`M)^P%QVoa275fDfvbTDeZdddt>w`;5~u=xxokIox5(*q#yO7=76FZki4YEUPR!dVYj zW%*XnNo|}5$BAqZ?!FzqWz>hv#_k%XXyNL}16eM3Bb3#_eGPh#idxS&D@Tqq4CRtkuqYHwMguX=K-?G??NJjK zPb*hD9%w0h*YI%~FX+$Fh!{ab9hjhZlNsclqra-+%|TVDk$&J-vo}>-SwbBiM8{}_ zIG!x}LQ#v@`F@|bKj4BVyqrYKN$V6FO9hl=*0rK{i*-u(6Q#Cslp5&P2|0SVk|yZ2 zS4J`#DAzGbxvU1tebOs&ec26^+rZ0lfwa{-DO2|LPS!~$1(J5siPRyfI!WoBQsp`s zjo^K%*Fu0;qkYg6A2G*N}&b3P$?Ii>~7MCKaLmX zWji*l?7pLTH~YOqAnWqU7#+r7duS_3-?_1zj*}ayDo+iR=a^I7NKGkQFDjzZ4|k+h znHNJKY%hBVKPAqMDa#cY<>cZ=P-9APF9YlvlM)!|p>yMIQ{{ZVOO^A57U8oI>V#0+ zurp=hSFMFX0EIiEa0V-kzt6WsC^f5YgNR)G9kdE>SUvBl#!KhVr>y&QQLM!IVoF?& zfqOY6?#J$25GBr6QsQP{YR;8F{*oqx38(h)&9pLz6Z0j^ zLoC|D{6x8!?gip@7)LL#sf@L;bd&`xNo!5r{xU^HLpD=#x&9K^-B?P)Oqa2yjNB%# z!AwMVHq`7C1*frsl_1JIgP9-blVy5c6i492vnyL=toWB;zlF)sT79?VR4^wtsL(>y zF*-@=5niY1RaZc<=o86x;XQ2bwMuw*MTD_)%(%!{y@dopi-z(o-=H^WHp_hGbok7I zs=tIr3S!jjCOk7?#AIm%EhHl-2zA^c*t63bL9LzC}-`e)uo77 z&II3rR`aY~hVxXBiXfy|1VSsD|I-7w`)&=AeU!bH;BYP#qR*Rr`B7r~?OmY=9OL=v4-KN(b3F=mi6$5a><@ z^6H?U-)D028=#{JbR`2#(?MYlnrDE1eF>m58EBLa+QmWR4bUzE9m7CfbWo6kdK#dY z2$aS^-ckdr{SGtl)q z$jw1F8K4{jEn=W4I%p0D%{D+kzX;F-2Flk#=W&q30DVNDJ`8k(4jRuv-3`$51UiK0 zqiX-xD?$V#Ip{x#a}nH3puaQFn>uI!2fc5A<`U>-26|KnWpmIo2520CN*QRC4(h-` zHyWU$2y_JlU95xJaL^0`6nO!l(-C+ek^Z|i-Gfy-iKRoRPJT0UF7W|t%Yw}7YRlk>^0gQ)Vp zO3oQ-s>g3R-8*2cjVyi^js({0DFX|9(TocyL$&t;F|{aP!6YHlLH1sVeuqz2O||>H zwe%xm{*unY7@TJWJUqeJ@fmwJI*5!YY#rUT2;&CeYozJQ|l@frFzLy_y&0 zRIf$z!qhm{ss57EDBtC##w}7%odLQ#3W^n^6TqN-{`0sL7XPrRHWWXj$GT+%hq0hs zyqYzXsb2KFP>*nAxKlu#GUW(CYC)ddO-A#KX1Fpd4T5(*9Gm*dr9OJ^PFzc zR$nJ_E@wIJR#=>e3vXvqz}j_*eal9g&f7QPrx*g=&zGE;SnMPfIy!Qm?4^;eOTvDu zNT1}!T!4$vew#>};GSxv(UvfkALc&8NW;AfBJD&Y4RH?Tenvl@OP- zp$XY`uQZwxmFVS0nl8~{?hA~xXcOoN3-2Yp3B%pT8EJYGM!35L?K}RO%f31U6FD9n zRXJ=n?Lo3%I)$bRGRj$0kWtQ}g48+7GYL}XEZ-d!q%K^uAa&s~L1v)^U>N<+PTq)y z8*H1@Fe=C>8&P(nY8YiV%0`sks2WDuMSuF9&BZ6cz{Yel8#<};OfAw$O){y5PHFpUsy)a4Z0#Yy%CzFww=xVD6FDKBE0Ks@m+V_~{U`*3fi|;X)lQdu~-guK6i|}J) zEU3&^&*VyUe~z|=%7`BJ1aJqXH2N#|h0&B@loE0~qbVm-ipI7Em}Yqb6Dj3eckd|X z0!j%}Mc1Jsdah~bTPniNoiy5JCflA;>}ImvD5bTTEMqT|$o2(Ub`SI~nAV7T37+mg zC&~p5J(JZuC7Qyj-R>R?`L)GL(dZetJq`pAZ9~x!viC_ugZ8SYb0v0d^gUMcS+Z9n zks1QyRmk2CEUCO2*}Da)dR1;W+QX|ENiCR(D!P+kZa0BuxV!40;qFZIKS0^Y4_~R1 znG;3i6QTzYbb)pF>;#CBg!t*HTznG-2&2`@W$zo9FX=T6mA#t~4ccpfWS3h%fvEN{ z{=m<81&Jm5qU?oOG(ZX;D_&-0Cli<@Wv_*d{@&f1&kJnfBlydFnX9+Z%ej}K{K~hAwy-$^ zc0Oq<6+W7bAD=xNwOBhnU2t6EDO9Up$3%l0~+)2ggDrM&LRw()iI+JY7ohU=s;D@iY7Ag^iI`W#%({ufKJw;ArJ#pviAI+I8az0}@ z@J0I(;moo=^kXmUiyxnT04fZpmtv_uT5y0U_!uvEuAamB?<{g}caa zj{I&L7ta)qY!kG<0wlZVOg(A?720Hf7C)Gm^w#U}=UpgD9iy|2-ZHz;p3w@KT>COs zQZ8<3(FW}+ppz)XHrX4XT>EeorJFp)srCUZ*ur(9YVXN{N4W;6_9Iv@(}j6(1`GCa zby4lVJW9p-y4tGteJt1y8fFh8XbaE7L*O|03!@8IkFwyo?m_x{*0?$fZ|rhMO1!ib zz&#K(O#4p1ycelV9@!J&0{k z?-=>nM}dxNAA-N0NDJ3R__L}FNu!507~{zkk>z6gkf0}$B^P@U(7JFt5p{>~c<5Tm z`*!sMq;_&i2*9BI<41C7OGwgoA&M@w6xkc#Mb2VH=+V6aa6G>x?b!tIDgp0hz^?%u zZiJ+*G{e~*ls|91fIA+D7_=n~l?TwHR;rkfdf}sa+vlML~ zSzakQo2akePU}TtXAJi<*{5UF@0U9`55iOOqb9Y8t|mi279im|N+_iSL>9B$S%}cP zo4DjDuwOnlfQ$=_Vs!Hp607&imsNszy9`GBB7{)^5}XIcEf(0j^11h5+Xrvn9z@$< z!f;@bHfm^l&9+UQvw9;D%TW80NGN{#C<)}uY<^)Gf4Tjy=- z+0%rcN{w0nBDB8#RYY=B?M3Fa5~Njm=i)COfb;M}|6mK}0z}IR8it2zFGP$6^f{`1 zA`7OuPE+ltuwV<m`V7QEDgL_0H;R=0gfHh6)fyQ_kS?ou$y3`^GRgGe4 z@|tVWcGW)bL27JQGRjj}FdLSI5t#NZ#_`9nFRFb!%jr(`Jf8)RBzr!X1-ntvTo&x% z&I-+6h8N8_1NXABtyorjH@@WHCHccY#smNZ2nIY8gQ`^-RfGp>877#bV+S@!rEy_(ir)V8S9*0!Z>2VXB<8noyAzhd;9E_{0_58DpmnByT&4&r z{=Z}x!KJu)kOAl&VZ4R19N2U4OJx*KWhYZO>zqlx$_c)R;`<(QxQxj`oHQAPiVJ)EW|Oc_Moq z5l&zElHxB!L+L0Ed*$bsJDGLwh(4h92puGco%a%Yn&jq*ERb)gh8WSD$Eha&n1}Ea zx&=IAsk;;qoN}NaNiKGww01fZGUNA5KMol9Sy1sWhv-BQCs%|(RY9R?avi{$EabX# zZ8Et&g&aHw?&SmOG_pb(vYPy!d($%0)_!t$q;zafVv`@ z-1QFf;m-8iGf~Ut3z?VFIqg;Ir@Zhc)?Mc#hd1J4fYAp5FwR$~$g<4;EJ0$;?MM{< z#jmJw^nBOZaV4LQ1x;`rYkDsk0}N=IQ|gNAq%IHp5+`COh0VN{=Qbyp4j1s{|7lb0%bOHdj## zs8E3NbkKf`z*tJd1t?1gy_*1ZgaCy}+;DTfPbL8Er_O<3s&r6s0?j^3(EEj+PO5$EIvP5?=?OT31#{>LIFJSV&=W9+ z1^c>3i*AdaMB92F$rue((Rvt)b)Zgf=puDht7esDF}Gn6`4Wg$g% z(z#r$$pup(3JlM9(*xVzYRRQ95hq zi#|=DoK`WKa4Dr|)jD18Qx-9a319T0fgnapV@sikr%rBEsXw~_8!Nrv)=j9zGT0l` z=GA+ramRvO`*@e4@0!Lh&In%%uaSdP&`T2!`iEt-$?Ta9Rmi}@K9gs`9^w)=b7p!p z6W){*?rzRZLna(1A_`v{UNnWIV;`%6XSEX!ahNsKVF&p?4)p>pO9Q9t4Rnw<6K$Y|6GnJ|c#Zs= zXg;-(&C$*ISXwIZIi_F%PNu6$#qy~%3Hk3)7 zZe&txMW@3_HadN1g3h|nN1bl&EQjcksUvyB?nej( zEE#t>_?e~iimo)bV-}n{4>Xq6I7iZu_T$5W13=k0<>!MSkh-y)G{Z<;MyaZOG%35k zgwG*GNpW`XXS@O%^wMeq%3*6C_xrR58kYbeNi0*{k#;ill_x3dO3t@$^ssEKt1wg~ z?J7J`?O)!+yu56*1o_Hr^9kPD4BU%?Wb|3?ALg9o9&2)zL5XyO73 zG@6nrF_XS$H}F}^gd0E`WseXQ1RV>gR?UktSpP&#o(Nm?%x6Ki=sB1Ld$*t#D zpg?A|m}ky|sLgrvg&?s0JcrK^E`=rx!$^`h710(VPdr_LDs4TNB#RmD{_B|(-Px3i zHIK+yq6AAV3^XTJ<1qibV2|6VW+mthqUK=dR!sw!% zC5ovmhDV-p$Bdo%fWgpR)HgmT4PDS#nvF6ns1{MMJO|?*QtfyJ_&`VY>4`=5k2p=t zUma;!XZBV_=1;wo8i%ghy|p_Y&cXm%98{h|aN*#z}C_h1)Am+vU&o>kig5iUiY z1pA~_JRz*y0~f-K5xdrqo#Gpp-Nb_WCw-ey)cB}xv&zz^SewVP{-xihH}@5X4eyOL znO$CNa0l34n!Ptw#tz)8+Vn~{Ir!|S$+g*=Q5*L6`tzA#B`Fl5IoMTgYEw}x-%4dj z^Qb6RDvst+nQWy}&^#*htW>5okIHf@l_kxhQd9zyVIfphL@CYbsiJjpv}h%=d9*gf z(OTbZTC|g5ZR5t~(Nc>7D2P`+n>b+AqV48#(dQI@wozO>r(AaJd7fyp_6?ZoSBk1Z zy;)YM=&fd#e7o5tY5%2p+}1R^dw1i+eLt$%vG53sybb{kGElQV;wOi;`*0m%zi>@skuuZ`^71S^`WeovLq2N`H z7GCAMM_{rjuIR^1kvQRpU+C6-ki$lPfV@@uTop{E;d<>P=Sj40lym2*?QoDcTnDbr z9`jw4pmttIKYU+5y`51V?gXGyuiC%RZVx_yic=?O9i2LXhb`Hh?B)HG+`yP*;CVe} z8}P0H>}OTxnCB?gU0Va%W4=OIF3zK1n1bGG5EQo%Xl)TzQ4K9wQ)@zWt3DUOM(Paq z;el8Ykk6k(=gG@yy+zEpeH}5UYDjjtj?P)vFv^im--Jj_%-;iNwd$nhxIn$34)ZV1 z!M7AtXPpn{G1wwP=&qZYl)*muAD>N^BhYsi@X3QT`Ia!2Pdp2E+O+cyn{=*#@2907 zHgY{cuEBQyVT66GY7urRNt(D9=f0df8CvsjzD1lA_crCXc2sI>tti?u2Eus5m*hPKHxIO);Dr(wVeTfn|Mk<=EjPfUo~ zM>%U~8dd|YCGB`N+SvC$v`nS|#s@5DLpOt(pr|PZ8;$V%O4<82(p3gdWt{v4IqIYu z;6nT**1aF0@eP$CO@RkOjHIBg(y%0plnTa%Wvzq{Z%*2+7S^h6#tTWd57uR2*hsQ` z$T1}_L5fs7cIE_=lF%By zNl8p=R3?X_esL=OsN?$aw~x4ftiWUSuo{sYKwo$$+DwE^U%_db5y>S+Q;%SHII%|L zi5=K%ihg)UKZwG-4LVuWkVQ~&u8}MfJJwkD2}yE%wsxnGdupTe-!M(SVvE-44=A&3 zx+&H+ElgsYo>&^Ac6XW+Oln83q?*)Dw@u;-ZMd|-(6tLwDV>9!ivGM2Lg_MEA7-UH z2lRENI}YI(4QTw6>z~b1x?wfRl};|EjZ@*;`azx@r;)wn;9Av@&8Fkscs!;oN_qNj zu9VioiM;>Vv7x?)l1&={i$!G`c?C@@`*5uoJ?k1SYpedRJlM}zZ5cgbTrbBRJoEUe zz+RH&+5RvR5U7x7oTvRYL`tnr6N8*#f6NTgVru{Gv zpT9vZ_2Glvyyg#|xhUL#mL#y*`|+)mm=TLDvH%+>uGW0Mcyf4o1B7G8Nv~Z({b-4$ ziDkd}P?Y`S82-|g7S&CpxXxI^-#>}r|LcMn#l7F0U{YLqn~Ox3Kymd0AuUEJqKIt&)-akybhnG5=Z$DSX7iK3;nrBz<#Rnx4=_H-!ZN6O%>iXCWySfIB z(jUyB&cDW@%Zcpj;8;!0LIQuHu!R{#Eet8ExAB)uI?9`ND87R1L=MA>HdrH>YKsk)QCkRGTI!RVqqt4 zzW2)Z#5&HGl5tW&;zz{C^BG`Morurg5enN3|M!IVMcF@&;XdOki?Sy++$Y7V`%y^@ z_uN@A>U@DY!KBV~Yfzjz$F6NLA7c2_RJy#LPb1&^fa`MQPls8T|HliU;Yu_<_5AF= zG*3F(WzmxalcYv3fR39Hqa;Jk2__{Gn{c|XY2JkEIVF`=h)uYQMxi3O0#8Q{vsPSy zts~vDJOSaDM{46O+&+7AEZm0`2`!u_(n>D=HwFX(tB#;I8i(UJnOr;xCQqx!?j8d>G&W>>j(YiyNq zjK)qKd+S!;(Od})Z8p1KZ;55MkrJBL>?)Tvw@UgFD!Fsk9*q-kg6WbJS7ltO*iO-~ zO2B-_r|Bus9JT#aP_Pz`t2hC>=e*X;PRVSxgg$#Uw#qn0Vcm1?98g)w7j zUWXnZ$8IC5Y=;jXvTkjLhvk6t$IAY3JS=U2<;fXNxWZWeW6TQU{YXeOVX$8k^YA=y zu_?jy@NCjT&3lC;Haf>#mtdD!EYy74oj*=5{r)gNPXEUXH8+$ce4O%C#^1D1^8&eV zv|IGY(Z)+IZ-h2BdZFg($tLBi!wH8u<^+>A(w$MHUB(FqI*tT|tNgNM^xV^g^HOPH zJzp-|jt^FmQ}@xo4zm^x27TSBYlCpJow_&Uo7@)+LS^Iy9$48AxQJ{QDe2Y z;!Jv6HL;I_T=KO@AN$3zn9MfgN*?T;;)IoAeOZ=XdaM*#OT_!J_59^+G)_M!4wY!i z)cxQ~;IC27@hDs5Y)9WPx3DGNRsPLv&5mO$UeZy9#5=szTo@LH#LJ;E4E=$u!B+dvxyi3=U+Dw-4JfJiP%N9%%bRV8kN9AeENJs6T#+v=@`+*yl()T_l=`@-^XMz zwn4sfaVZ7)yl*n<*Iq;1%0x0F5VPOBM3@n4;l{L}J6d2Z)yOK(Zg!RQO$=+5ag4^A z$>F-09M)V3o!V@6f5e9@n#gXB?qzu5o(PSU?nljLcVg4oeKbHr7!RRlxcAfHs{O$n zsy5RbVKP7XImTpeLW0#~uHKuCL214aAT%@pkE+wzQ6tLl_*FYgl*Vr|ZSdY9)xP5_ z6NLzDwJ2)bI@E2Ujk#2JPedNxmc0sZWYz;0WJlroM1mzWYSY&P`80q3cG$&t?e3L>-AlDt#|B!HD}k0!#ql1x($+At-CDz;_(zm=otWK zflZfezfYRV(MCosxO;(r+LP) zQ{u)qYj|wOlkDX+y=kX}buaGqCQAG)@Xx={aEGI6erfsdr$Q$993zIkxOA3|2XAyy$(FWd|1+V0Vrn7sOASY(%K||w$n)1G@D1cQt^fg$ndepP_32^Yu;uT`;rKWX;|F8%@x|Ww zHl(L9Gi4}RfW3c?+cZjgai82Yj+)U?{N4M*uSH|=UZZu8H-kCSqTfTsAN}MoFh>gX zdob53j=3i54zZBx{r+a5mQCYa+h~8_(}* z5*tVUPHY?-$3|S|ayhJ<#^s>BfCqU1%zvye2S?9%hhR*F4uV}lx#`y!y`~sjJI7+@{AYwG_%a3vRjvt%I;TyEs?C^<2 zGTq_ReW3)4WVX?%{6DcscCZtT9~(Xw-85x#Q1lU@A4|8sKb+A2b5JwP{vS_B z;{Q=5{6G2;{vS@E313v3fH#|T|F0jyNjiqVgxEO$?-LxNOG2jE1O05gI-i6lUjXLY zNZo}Gbs<<_3;1&J0(er|o!lk;)45amIM{4artQsq5E>3a5+OIcX_fTRlmG* zm|AsgQ(85^)T;jz-uG>%H^Tc4{@d(*KZ{tb_uU^0k6OO^UP9egXq zIK^V#8;F1T?b;!_7hV@#g{{+9VZ{!}RZsS2UU&xXs5-1KVf>F@x*vv*x6osQ_Bg~k zt+Alk&4WMAyO*7u7VS&)j!>gtx*v8zjQaI9Cz#Z)QHQ9~k4vR?;t z3GKe8xw7>M9%f}*0bx#G5`faQ!u>>F|H?ati( z`k)I$9Se{aSAx;G0Ds>7U+_Wq-0L((Hed+z?Oou6a%_m}DI7U7ws$wsLZ)D5lyd`J z3AO>FMAGhRK?I*6f|?6q)yW9aJ$CwSKBz;?BA$t_!`O{I0fng!gP{aqG3Yh`SIrMC z?7E2toux|VSg><#-U&32{m!zj?A0->Zpvsm9cjsHpe8-q^S-d_$@XVq|Tj z%LVBZR=jys7tMe0fujxVR4kqLM3y-1DZXAqP7mF<$UktzfpqpW3S{?((^_jBj;vN< z9ByQ9OP`kAr{LSN;Uj5>|NU=qkF?Tyo1VOFpFBCR4_}n6-6v;FqCfUW&#+1RZDlP^o(U_J|nNW2IovX&JDPFZUaAVaw!r@QKRL!$rZUU8=mcxQ`@V@`p4L-JIo0t zdxiBxi5eASufz>d?A6_Cj!tE$a=4*7|1)l=TH<8TVKr2zn+#Q--(sl#!M%gjy1-vU zHyNrS`1nO~L-iwTJPcJfi4omA=aHrus+*jN4VAD)HPN%@hM}_BAB&-C{8%v?mNQOI zU|59pO2mM$IaW(q2NjAnELIDY+^{4!K#gzE|Hp>qoDmHgmN#P!3w@L}&aias8E07N z5ZfhvOqK-wY@cXO2vNre*#XlmZb|g{g?UwlJwow4`d+#rsf&6%Ajv%*34O zQP6u5H(6k-DK)J?O%3u#x3ZDnlA1Pq=p>NA;mNNTP4acXNJ3fWXKE`$dmE|L3wr?=Amt*`nE~$)wGR9%KA4;{We{(derW zv!EJ~dUEH%HNY}pO?3Xx+oHSsTbkBvTht#@vRCL;INcVJ=?QT+NG$GzQY`M=*Fm>E zq3E0pB>0?6EbiPT?$;cE3ns-^Ti78};KanFHh#Wjnv>O%$0xWL<*cPSSuLBB;R~rC zh|~6%ll@Bb23)vElY({fCiV#!R3Ii~yW=Y`CS(Ctl3qp<+#~?A2^r&JQY~MCzQDz_ zJas8@kuf)EfHs>Z(Z^y^5rdZV`uC`Xb*j6TmW%G_hc;tNJlxge+-(ukZh6gj^b(r0 z7H)AZcZ+u*!TPqTXK#OWe;J(t*1I3v+Mh5dfG6E8Zv1t9URhU*L{oKfU7zDl{z&Th zH1#45RY9Za>@ipn9r1tjdnKdkI~?X_#P9a;2ZeQxn-KNezE|SvV=)rH<+{GxJH{x< z_2vYVl62ssNngh?U&gz*T`H{*m+`(OwBjK4Z2nAI(QnBgMJq1LJ#1RBA}dBK7MK%E zTG9BsJtnqIr6l6Dg|F`7rsLzs|6EF9Tl7a!l94%wO-UxVk5Q7-%?Zs?lD@4Qp(N71 zTuEMd^v|UvyRZ18C`qTDhfPUN$c#~vTyug+NsfwtzAUkm8-#8CR;jdtq5OHrKESo& zzK0K!R`5qXb9fV8_>G4cb5{Symk2*T|Bs?IpLIWMTJuZm7_HfBPB3W=6cw`rePah_ zHs%M`3$59eo=R&N%Ae_~>w)tMrtcsoI`=$0_M}|b1SjSCW3qWt%a|cN zz?@(j!YK@Y7h9?!EDZlSkMJS<$bE--2>*`_`#UpZM?;+2{goXlUAfy zg!uMgDygA#7g1{KlMM(u&3}LcH-) zDkTw%5DxK1!?}1c|Cv^*uAA~lQIePB->f8K&!_9ua^PsZ|BFdYNGq^o5e&WSW{nj) z9^w$1b;m=$`GS3r@#%=J8HqML#38gff8`IA{5wc9YT--sm2K48ybTYq-;vl?J0C$m z{GN_)UpK+b?`m0^g@UBzvF7+`_YBce;GzLu`t&Tk&`DQmb%x zPS5T(Nli~9pTlqOfC!Fi9;##FP2O0xnPETWAlkw%3fY_iV&x?Lt&A)>rmUSLP4I0; z%d?{}LX^Y#jKXdO>`WUT@OUwhZoh3*#Z^D2sQ474;s>L!_=>X$W+VQVM_~ovpnNj^ z7|r-TGs@pAKAlR{J6tgROcYV3951p*DLx2_Trh`zGMYh%@@Zz+a#O|Po3ag8{A`pW z5i6f(rr6J@_=YHq5amnEutRN)7Kh!9>W&kmu$Qf5kj-yivHw>#}%Km9%=RBtq-1k zTQnP|IynNR?usV+oDo1HmQw4Y*{oDN;_e0!_as2T)|6)OkzcQjM5Xe0{PB&;1_#LF z3v>PgbPqMHG)f^3GL1uSHXv-7fG5%ynz=}<7uyT+rKP+>Q3EZSL{HvV^5ScZM7?Sor%? zYQY5;Vbg6qRXE!Marqv#LOCh@aMB1s%M|BMl zfUc;H?7l_Rt+@5Dctj(Lkiw;wA<^{It)e%a8mhl>#FQU!8Ue3M-6hm7Wv7t$QQJ_x z{B^0_4ZvW+Ju7P2f#}_8VXf+}K>_B~U5m9{)9fOg@M}A(Vwb39#4J%^q}{jQJT@P~ z&WmMi`c~8ioqN!1DLhtn?(rA2KsPDdDkEvW*D1av9Zwa!ir52>m3@X!@F}dn;v?DO zvGjrBJF_Ok^~kBmWlqzw*PEO69ldf=ITg957xJy#r8A zr12^T+Wx~2{Ba0fE6qWw`6!DoQsO))Z*m?ivH$daZ%Oo#vU+b(4vBh8$>)a-%~I6# zzT`OIi4_?dsPf*6M6|+NhhN3#-H4x{w+w&LJ-Dp<+Vgs`0_hJ&l_-Oa;|LJ{jhHy zM!}}CA5UcJRb{BE9%afUxTA(P4IoyK@m*|27BWI-fEAy2JxZx->8~IG-{Be=edr68 zQ5!?9y+p)MM9h_l_I#}&mz3>pY9p_U+>Z8)_@hMJOMiWg)$l;hG9AMzwiC(G$GdX% zv?`t?d7dR<;QDPQrd4lajOvtwm51;Tz0G)2d>`-otKzFxet^sh^rpf#2c?CJk8{ll zI?|WBsvIp1#{79R+OejE&LYwHyc%jNRVWOq2To;0&`$J4{?)BkIKr%ozsGJ>t zUd#4o`ICf=N*Rz(@?J#-Ds3$kBYcET0Gz(Z@?4LZk`|!C@Juvs|G%htuEA&e?GHm5 zn{R;guJ}98qE7ec<+Y`sF%M+gB;NmzQn`TuUq|2)4nC2CGdTE41AH~W@+LNZ6m?Pr zx0z?Mf#tG?GLa=58{dkM&%MW2Sm&Fx8;_(>&fV9|z^~7FAY7n24~%lwxw~O69Gx_`! z%U8%2;8{d@KKlj#>@AgNkYeCJ68t12gqD1R@p<7$(g~cnbl{>OJvclX925;^9EoWM z$L2>!@F8vL2eW4Db9r1aRmg zEQe_1$cJ1w#jE)#^u;v@(N{%6T~{D<4TY*!A+(r66R$^THieG$B6JCbzPk~jb12jX zFY0S}MN|rDcOf)}LO0?YSK0{_I#`C#01C~=X9Bfe2%&v-Gzv$|Vr{K6%-mTx8l(L} z;uDBYIs&E0kc9>j0v8BNp`ITj^ge|~?m`GRjz}TrCkSn!(6mnxdXYlcevZ(S6nf$d zgdSwMUm>)XLJPh@NTtwn4WZQ(Dh?ky6#h%-;eX<1StxBEeinpUY{k#)&@^F@des{!**l)gj&u)-M&p9XNiE7ItUZTi zJFOj(2g3if|(-Udi*+kpr`qK=maBm#g+izlAD=dU_(Vd?Sg` zqD^uelQyLx!nBFX1|2x<#yT(p;+@)a!J<0!q>w6NbZ~%T`qJMMc;*lbhVz|h z=1-puK_7^Z{Z7Jskp))`@kCm?=Hbt(cIcmC8ra&oAn1u?%Ed)sXUr4$BNx*gUK@#w zF*PhsUyx$KRayL<)8ZSDu5~5ER}8V75cmQY3crY;b`XCWWRqqny3B@XZ#K2aaP3ZB zgbyLPm~JR(Ql&IJs;i1Vgp6&f{XzI{p2(4|zN-BW7VPHgrrLch*uy2O_LVHyPxiKL zOhwcQqqoW4&p;hZRcRVkquNI@B5h^wn}{}v+dl{rENuwxWKl zWWfyT$4xBQTJ}zWo;Qs>tqY2%b{C_NNyO%}pe%dY8_f-kOtZ=l(%xoWbPS^awF)5G zM0T)p19raJLn7%)V*fh}X1o8=G(zEt(0^96y?a~}i*_sxXO)KAm4@4thFg_}(@WVr zJZ8;NUUM40f~8wAdWXHiT68P+6u_>rW4@=K%RLdh%dXwpnDS;>j}A|7us$#W859d>u9!_u^9S((J^u!CP1@w3z zF#qC>uOL61ODRD|Do+s8fY6svfO;DqlCz$VEq%d?t`NBodb49q7ZmJ zilsUR;RcV6As4(_(<3uXUPH9z0ya_|*>v~Oe!3Egitd*?I5NYdsQq8W6FfSGAf{AQ zB+GtvnoZ(GC4F_4mh~}_QGD(?Um;(Q^4V_$(JJR5+7iREq3}sVm{y%^gAWAn;et>3 zv`-<*NFOB9PZsGzM0zig-cO`6w-5MsBE3CNceM#kA>WofWl{1MiPy9j_ZMJh4#aT0 zkEFGVBEA%ew+zI*9YD}iSU-17v{QG)1sf@rHytCdi=D@C?bWDhs8-&c`+E~~ILUNAz1wS@8K z-FlE!ILxR}LWSY}3@LNuUpaCvM-DNNAMK(Es#Bkds`gJm?=2a#wk-50HVE9fO?X8_ z!mSfD)kLp3Y9UL{ih7>J+`z#|5~@Ip@e0lNeD3XvudqzFSfk1AJ9THvxT>uMHvrXe ziE(Lhk8-%cQJ?NA@Rzy_t&)ZsfY7@^dsAX??N4Z+bFU|0^Nqu|lJ??dG<~^pT&jZp z%rv%|Y4c%Etgud*xeso2nPS@~Z|bP5D>>iR!{e;Oq#Kj^(8^6IDfLKGC+)>+c@T1$ z;nVJ>WhUSFEZV3;=~2$@^37%9?KDN)Oohd}^^low3%Try@8xOuiCMx^{9bb5%O{&< z+l_kB@2n}$F{h?es_G>oY)KzyTahhNR7W2Sp;qOXzha_Q{t$jdPDz#l$*~20u@LwO1)T}E!$0ALv@T}fT`$fJL_hB%V`ab%9%zX)bRMqwWfTS!!6Z?Y}TdPki z7FvO90|7-7l953PMj!%pjUhm4NHCeOsBDI@8OKrTPg?h-u63!{iUJxreoX&WX<5^drl;9a}whA%aiq2=Dt9M}Yn*#MGva=i%i zooiQJ?Q8scN8mBEH%yA}#ub4qd3MtgK#YQRYXXfSf$f1!{Sgc1*yXx$;snEe@Yth) zhuY#<3nPL1afjdmQjqyX`2%h5W)1FK+d={RpdY@q9BImIG-@uenC?bZxLLZbdLX9>dXYfm@y~ni*`hCB6RDR7tn)awOff zXK7^BLlE;Fk)6%u_csS_IiNhh0*v6i6};TSbvUkdoV(q)i=*}odd}bj62uff0+xj-N|MSa2urtt^>Vc72!=}l-IUF(b zd#%Vc09fcMWp|&0f(?GVpe!lq9h^8}JasK7D{VpVqT20(-jaJyK{o@77W5ISR13dJLeM{7~NQr2Ba<&oZXY0J9%9|`H*A@?5Xo#&KAvzaKuE)Er|#pNd#SDCgrzpJ>M z)Z#uw4QpiuoZ?u7Qydr;?tY1c9`5qf7T1pEW9!Ctx%Y6l#wqT%5SwzxhQInka}U$9 zW)8IV?BwDy(iS(@Rov{<;;6sEUC;Lu_*b8A?lJ4SW){l&0H{5z{ccw}ZR~;1YP0r7 zx%aSkH?T-q#^7XbY(+=RlRTZJmOFn1Bd~43u<7pi<&9AIG}d<}LuEVafOMwkr?|%eL-sGZhwJdz%AKxaoY^$ zBQ2N1xJ5Rvz%_~2_HdL2F#cCeod+Y~4S0ykm9u$YwQo6%YoJFpekB?vB5*$#UPX7g zb}*?Oo6wW4W4j52{)am@o7%%d=QQ<>%v=vu#l%=8#5=y>+AZ){8V(wujWuyQ!<1>+A#>IFFpXUoE_| z<3Dh}|L2~QOnzwJA=17cOV`F}pf0M@FcC@@5htQa+$KyF{1UXH)lq6PDU-P#O~X}X z6?g*K7b0*|0RH;)T8#8QPeZ`tSe^0`AhYxF=I2ZkzWqgQ!pj9Tw8^<{YN1hu86%l6O5yerUIEow`6M-X$p{e^b*uO!3v~M_fqRCt$Dnp2VJsV?KjYOG%8FmsP8Go9ab_6v zT&QTg6x!4}2))H(q=1YW;PBAHaLYQ=!M*`vSDyj)Po%`_qz1@5CMC{YHoyT1AP$r_ zKpRne;b2Zmm`qHnW#VN~8;JL74UpMQ%0UhgvspHfnKV1*er+J*6-Y!TJL45NFe>s% z9`ySmB^~s8hl0@OwJ>IGMaD=FTb}@g(nFkS#)K#YI^sc1B>I%OrH=v3|=b(oqu6jYg6IHEoLxIS$`u(UnA4Z+Ix@KXrt+rupgpdwErc&rDF&ixFPA@|WRC8Yk- zXV`R;Y=<6hv+WQ>%B}pVLR<=MptIT^wTih=fBeQ)Dj6qb)SVqswnr4|&bTPl>j+e# z?f`OZNP;enfXoF?#uX47u^rEfh?aA&+i<&{tpqVxCW@@ugZa5GEDd0TYH26-)%I^Z zCm7{)TNz9(w!cPRhEMcEDb;^11AFrCGmzR5fU^Ys#MEqH_tWD|v13sLy3O7u>_9_A zFUD6*t3Ekw_3J(5pr$KOEiiG2UyRZv!QGvqrB6|S}h=j4>6{(mOpb

S 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%0Ds#GQE86$Jw`s#spZXx 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 Date: Mon, 31 Jul 2023 16:09:35 +0800 Subject: [PATCH 079/145] Revert "Update sairedis submodule (#15720)" (#15995) This reverts commit e0927e28afab044b1669fe4779458734044d2a3d. Why I did it Reverts #15720 It breaks build for target/debs/bullseye/syncd_1.0.0_amd64.deb make[2]: Entering directory '/sonic/src/sonic-sairedis' dh_install # Note: escape with an extra symbol if [ -f debian/syncd-rpc/usr/bin/syncd_init_common.sh ] ; then /bin/sh: 1: Syntax error: end of file unexpected (expecting "fi") make[2]: *** [debian/rules:65: override_dh_install] Error 2 make[2]: Leaving directory '/sonic/src/sonic-sairedis' make[1]: *** [debian/rules:51: binary] Error 2 make[1]: Leaving directory '/sonic/src/sonic-sairedis' dpkg-buildpackage: error: fakeroot debian/rules binary subprocess returned exit status 2 Work item tracking Microsoft ADO (number only): 24691535 How I did it How to verify it --- platform/vs/syncd-vs.mk | 10 +++++----- rules/sairedis.mk | 25 +++++++++++++------------ rules/syncd.mk | 20 ++++++++++---------- src/sonic-sairedis | 2 +- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/platform/vs/syncd-vs.mk b/platform/vs/syncd-vs.mk index 6ff00a3508b9..22b34fbcaae3 100644 --- a/platform/vs/syncd-vs.mk +++ b/platform/vs/syncd-vs.mk @@ -1,10 +1,10 @@ -$(LIBSAIREDIS)_DEB_BUILD_PROFILES += syncd vs +$(LIBSAIREDIS)_DPKG_TARGET = binary-syncd-vs SYNCD_VS = syncd-vs_1.0.0_amd64.deb $(SYNCD_VS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBSAIVS) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS))) -SYNCD_VS_DBGSYM = syncd-vs-dbgsym_1.0.0_amd64.deb -$(SYNCD_VS_DBGSYM)_DEPENDS += $(SYNCD_VS) -$(SYNCD_VS_DBGSYM)_RDEPENDS += $(SYNCD_VS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS_DBGSYM))) +SYNCD_VS_DBG = syncd-vs-dbg_1.0.0_amd64.deb +$(SYNCD_VS_DBG)_DEPENDS += $(SYNCD_VS) +$(SYNCD_VS_DBG)_RDEPENDS += $(SYNCD_VS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS_DBG))) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 163e9b797645..73ea1366bb92 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -4,6 +4,7 @@ LIBSAIREDIS_VERSION = 1.0.0 LIBSAIREDIS_NAME = libsairedis LIBSAIREDIS = $(LIBSAIREDIS_NAME)_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIREDIS)_DPKG_TARGET = binary-sairedis $(LIBSAIREDIS)_SRC_PATH = $(SRC_PATH)/sonic-sairedis $(LIBSAIREDIS)_VERSION = $(LIBSAIREDIS_VERSION) $(LIBSAIREDIS)_NAME = $(LIBSAIREDIS_NAME) @@ -29,20 +30,20 @@ LIBSAIMETADATA_DEV = libsaimetadata-dev_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH $(LIBSAIMETADATA_DEV)_DEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DEV))) -LIBSAIREDIS_DBGSYM = $(LIBSAIREDIS_NAME)-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIREDIS_DBGSYM)_DEPENDS += $(LIBSAIREDIS) -$(LIBSAIREDIS_DBGSYM)_RDEPENDS += $(LIBSAIREDIS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBGSYM))) +LIBSAIREDIS_DBG = $(LIBSAIREDIS_NAME)-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIREDIS_DBG)_DEPENDS += $(LIBSAIREDIS) +$(LIBSAIREDIS_DBG)_RDEPENDS += $(LIBSAIREDIS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBG))) -LIBSAIVS_DBGSYM = libsaivs-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIVS_DBGSYM)_DEPENDS += $(LIBSAIVS) -$(LIBSAIVS_DBGSYM)_RDEPENDS += $(LIBSAIVS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBGSYM))) +LIBSAIVS_DBG = libsaivs-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIVS_DBG)_DEPENDS += $(LIBSAIVS) +$(LIBSAIVS_DBG)_RDEPENDS += $(LIBSAIVS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBG))) -LIBSAIMETADATA_DBGSYM = libsaimetadata-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIMETADATA_DBGSYM)_DEPENDS += $(LIBSAIMETADATA) -$(LIBSAIMETADATA_DBGSYM)_RDEPENDS += $(LIBSAIMETADATA) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBGSYM))) +LIBSAIMETADATA_DBG = libsaimetadata-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIMETADATA_DBG)_DEPENDS += $(LIBSAIMETADATA) +$(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) ifeq ($(ENABLE_PY2_MODULES), n) $(LIBSAIREDIS)_DEB_BUILD_PROFILES += nopython2 diff --git a/rules/syncd.mk b/rules/syncd.mk index 2f5cce6cebff..6aa3e990843a 100644 --- a/rules/syncd.mk +++ b/rules/syncd.mk @@ -4,7 +4,7 @@ ifneq ($(CONFIGURED_PLATFORM),vs) SYNCD = syncd_1.0.0_$(CONFIGURED_ARCH).deb $(SYNCD)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) -$(SYNCD)_DEB_BUILD_PROFILES += syncd +$(SYNCD)_DPKG_TARGET = binary-syncd $(SYNCD)_SRC_PATH = $(SRC_PATH)/sonic-sairedis $(SYNCD)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBSAIREDIS) $(SYNCD)_RDEPENDS += $(LIBSWSSCOMMON) @@ -18,19 +18,19 @@ $(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC))) # Inject libthrift build dependency for RPC build $(SYNCD)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBTHRIFT_DEV) -$(SYNCD)_DEB_BUILD_PROFILES += rpc +$(SYNCD)_DPKG_TARGET = binary-syncd-rpc endif -SYNCD_DBGSYM = syncd-dbgsym_1.0.0_$(CONFIGURED_ARCH).deb -$(SYNCD_DBGSYM)_DEPENDS += $(SYNCD) -$(SYNCD_DBGSYM)_RDEPENDS += $(SYNCD) -$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_DBGSYM))) +SYNCD_DBG = syncd-dbg_1.0.0_$(CONFIGURED_ARCH).deb +$(SYNCD_DBG)_DEPENDS += $(SYNCD) +$(SYNCD_DBG)_RDEPENDS += $(SYNCD) +$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_DBG))) ifeq ($(ENABLE_SYNCD_RPC),y) -SYNCD_RPC_DBGSYM = syncd-rpc-dbgsym_1.0.0_$(CONFIGURED_ARCH).deb -$(SYNCD_RPC_DBGSYM)_DEPENDS += $(SYNCD_RPC) -$(SYNCD_RPC_DBGSYM)_RDEPENDS += $(SYNCD_RPC) -$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBGSYM))) +SYNCD_RPC_DBG = syncd-rpc-dbg_1.0.0_$(CONFIGURED_ARCH).deb +$(SYNCD_RPC_DBG)_DEPENDS += $(SYNCD_RPC) +$(SYNCD_RPC_DBG)_RDEPENDS += $(SYNCD_RPC) +$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBG))) endif ifeq ($(ENABLE_PY2_MODULES), n) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index ce8f642271ce..14a863a6d8f2 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit ce8f642271cee813805d6879041dbcf0c0dac381 +Subproject commit 14a863a6d8f2855a7cebf1b7e62bc46dbed76ff6 From 5c4ab7a7f4e98eeafdc181421c68a16b5087db90 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Tue, 1 Aug 2023 06:43:00 +0800 Subject: [PATCH 080/145] Use DNS j2 for default DNS configuration (#15901) Why I did it Support default DNS configuration How I did it Use j2 template to generate default DNS configuration. How to verify it Run sonic-config-engine unit test. --- files/build_templates/dns.j2 | 11 ++++++++++ .../build_templates/sonic_debian_extension.j2 | 3 +++ src/sonic-config-engine/minigraph.py | 22 +++++++++++++++++++ src/sonic-config-engine/tests/dns.j2 | 9 ++++++++ src/sonic-config-engine/tests/test_cfggen.py | 5 +++++ 5 files changed, 50 insertions(+) create mode 100644 files/build_templates/dns.j2 create mode 100644 src/sonic-config-engine/tests/dns.j2 diff --git a/files/build_templates/dns.j2 b/files/build_templates/dns.j2 new file mode 100644 index 000000000000..96fb81f9a1f3 --- /dev/null +++ b/files/build_templates/dns.j2 @@ -0,0 +1,11 @@ +{# Please follow below example to add your DNS server +{ + "DNS_NAMESERVER": { + "6.6.6.6": {}, + "2001:4860:4860::64": {} + } +} +#} +{ + "DNS_NAMESERVER": {} +} diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index d8399d25cb46..09a5fe870a16 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -373,6 +373,9 @@ sudo cp $IMAGE_CONFIGS/ntp/ntp-systemd-wrapper $FILESYSTEM_ROOT/usr/lib/ntp/ sudo cp $IMAGE_CONFIGS/ntp/ntp.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM echo "ntp.service" | sudo tee -a $GENERATED_SERVICE_FILE +# Copy DNS templates +sudo cp $BUILD_TEMPLATES/dns.j2 $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ + # Copy warmboot-finalizer files sudo LANG=C cp $IMAGE_CONFIGS/warmboot-finalizer/finalize-warmboot.sh $FILESYSTEM_ROOT/usr/local/bin/finalize-warmboot.sh sudo LANG=C cp $IMAGE_CONFIGS/warmboot-finalizer/warmboot-finalizer.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 0b2f8b0e7640..8f9ec5bbef82 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -5,6 +5,7 @@ import os import sys import json +import jinja2 import subprocess from collections import defaultdict @@ -2010,6 +2011,27 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers) results['DHCP_RELAY'] = dhcp_relay_table results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers) + # Set default DNS nameserver from dns.j2 + results['DNS_NAMESERVER'] = {} + if os.environ.get("CFGGEN_UNIT_TESTING", "0") == "2": + dns_conf = os.path.join(os.path.dirname(__file__), "tests/", "dns.j2") + else: + dns_conf = "/usr/share/sonic/templates/dns.j2" + if os.path.isfile(dns_conf): + text = "" + with open(dns_conf) as template_file: + # Semgrep does not allow to use jinja2 directly, but we do need jinja2 for SONiC + environment = jinja2.Environment(trim_blocks=True) # nosemgrep + dns_template = environment.from_string(template_file.read()) + text = dns_template.render(results) + try: + dns_res = json.loads(text) + except ValueError as e: + sys.exit("Error: fail to load dns configuration, %s" % str(e)) + else: + dns_nameservers = dns_res.get('DNS_NAMESERVER', {}) + for k in dns_nameservers.keys(): + results['DNS_NAMESERVER'][str(k)] = {} results['TACPLUS_SERVER'] = dict((item, {'priority': '1', 'tcp_port': '49'}) for item in tacacs_servers) if len(acl_table_types) > 0: results['ACL_TABLE_TYPE'] = acl_table_types diff --git a/src/sonic-config-engine/tests/dns.j2 b/src/sonic-config-engine/tests/dns.j2 new file mode 100644 index 000000000000..3ee2ab038af6 --- /dev/null +++ b/src/sonic-config-engine/tests/dns.j2 @@ -0,0 +1,9 @@ +{ + "DNS_NAMESERVER": { +{% if DEVICE_METADATA.localhost.cloudtype == "Public" %} + "6.6.6.6": {} +{% else %} + "8.8.8.8": {} +{% endif %} + } +} diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 66635a9f78bb..ef44979558b9 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -696,6 +696,11 @@ def test_metadata_ntp(self): output = self.run_script(argument) self.assertEqual(utils.to_dict(output.strip()), utils.to_dict("{'10.0.10.1': {}, '10.0.10.2': {}}")) + def test_dns_nameserver(self): + argument = ['-m', self.sample_graph_metadata, '-p', self.port_config, '-v', "DNS_NAMESERVER"] + output = self.run_script(argument) + self.assertEqual(utils.to_dict(output.strip()), utils.to_dict("{'6.6.6.6': {}}")) + def test_minigraph_vnet(self, **kwargs): graph_file = kwargs.get('graph_file', self.sample_graph_simple) argument = ['-m', graph_file, '-p', self.port_config, '-v', "VNET"] From 5d91bd14cdfcb3ed0a9c348d9c75eb286ad88596 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Tue, 1 Aug 2023 15:41:20 +0800 Subject: [PATCH 081/145] Fix protoc-dev cache error (#15998) Why I did it The protoc-dev library with the wrong declaration. Work item tracking Microsoft ADO (number only): 24707066 How I did it Revise the wrong declaration from: PROTOC = libprotoc_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb to PROTOC_DEV = libprotoc-dev$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb How to verify it Check Azp log error. --- rules/protobuf.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules/protobuf.mk b/rules/protobuf.mk index 8822d1357498..f21d538e2bf1 100644 --- a/rules/protobuf.mk +++ b/rules/protobuf.mk @@ -17,9 +17,9 @@ $(eval $(call add_derived_package,$(PROTOBUF),$(PROTOBUF_DEV))) PROTOBUF_LITE = libprotobuf-lite32_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(PROTOBUF),$(PROTOBUF_LITE))) -PROTOC = libprotoc_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb -$(PROTOC)_RDEPENDS = $(PROTOBUF) $(PROTOBUF_LITE) -$(eval $(call add_derived_package,$(PROTOBUF),$(PROTOC))) +PROTOC_DEV = libprotoc-dev_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb +$(PROTOC_DEV)_RDEPENDS = $(PROTOBUF) $(PROTOBUF_LITE) +$(eval $(call add_derived_package,$(PROTOBUF),$(PROTOC_DEV))) PROTOC32 = libprotoc32_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(PROTOC32)_RDEPENDS = $(PROTOBUF) $(PROTOBUF_LITE) @@ -27,7 +27,7 @@ $(eval $(call add_derived_package,$(PROTOBUF),$(PROTOC32))) PROTOBUF_COMPILER = protobuf-compiler_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(PROTOBUF_COMPILER)_DEPENDS = $(PROTOC32) -$(PROTOBUF_COMPILER)_RDEPENDS = $(PROTOC) +$(PROTOBUF_COMPILER)_RDEPENDS = $(PROTOC32) $(eval $(call add_derived_package,$(PROTOBUF),$(PROTOBUF_COMPILER))) PYTHON3_PROTOBUF = python3-protobuf_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb From dda6bd11f270a41cd34a64829b79635bc4450749 Mon Sep 17 00:00:00 2001 From: lerry-lee <39114813+lerry-lee@users.noreply.github.com> Date: Tue, 1 Aug 2023 16:18:35 +0800 Subject: [PATCH 082/145] [CI/CD] Use remote PR test template from sonic-mgmt master to run PR test (#15975) Why I did it Use remote PR test template from sonic-mgmt master to run PR test. How I did it Modify PR test azure pipeline yml file. How to verify it PR test executing normally. Signed-off-by: Chun'ang Li --- azure-pipelines.yml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e7d8c3f3b011..cdb98e0cc3c0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -28,6 +28,7 @@ resources: - repository: sonic-mgmt type: github name: sonic-net/sonic-mgmt + ref: master endpoint: sonic-net - repository: buildimage type: github @@ -152,12 +153,12 @@ stages: timeoutInMinutes: 240 continueOnError: false steps: - - template: .azure-pipelines/run-test-scheduler-template.yml + - template: .azure-pipelines/run-test-elastictest-template.yml@sonic-mgmt parameters: TOPOLOGY: t0 MIN_WORKER: $(T0_INSTANCE_NUM) MAX_WORKER: $(T0_INSTANCE_NUM) - MGMT_BRANCH: master + MGMT_BRANCH: "master" - job: t0_2vlans_elastictest pool: ubuntu-20.04 @@ -165,13 +166,13 @@ stages: timeoutInMinutes: 240 continueOnError: false steps: - - template: .azure-pipelines/run-test-scheduler-template.yml + - template: .azure-pipelines/run-test-elastictest-template.yml@sonic-mgmt parameters: TOPOLOGY: t0 TEST_SET: t0-2vlans MIN_WORKER: $(T0_2VLANS_INSTANCE_NUM) MAX_WORKER: $(T0_2VLANS_INSTANCE_NUM) - MGMT_BRANCH: master + MGMT_BRANCH: "master" DEPLOY_MG_EXTRA_PARAMS: "-e vlan_config=two_vlan_a" - job: t1_lag_elastictest @@ -180,12 +181,12 @@ stages: timeoutInMinutes: 240 continueOnError: false steps: - - template: .azure-pipelines/run-test-scheduler-template.yml + - template: .azure-pipelines/run-test-elastictest-template.yml@sonic-mgmt parameters: TOPOLOGY: t1-lag MIN_WORKER: $(T1_LAG_INSTANCE_NUM) MAX_WORKER: $(T1_LAG_INSTANCE_NUM) - MGMT_BRANCH: master + MGMT_BRANCH: "master" - job: multi_asic_elastictest displayName: "kvmtest-multi-asic-t1-lag by Elastictest" @@ -193,14 +194,14 @@ stages: timeoutInMinutes: 240 continueOnError: false steps: - - template: .azure-pipelines/run-test-scheduler-template.yml + - template: .azure-pipelines/run-test-elastictest-template.yml@sonic-mgmt parameters: TOPOLOGY: t1-8-lag TEST_SET: multi-asic-t1-lag MIN_WORKER: $(MULTI_ASIC_INSTANCE_NUM) MAX_WORKER: $(MULTI_ASIC_INSTANCE_NUM) NUM_ASIC: 4 - MGMT_BRANCH: master + MGMT_BRANCH: "master" - job: dualtor_elastictest pool: ubuntu-20.04 @@ -208,12 +209,12 @@ stages: timeoutInMinutes: 240 continueOnError: false steps: - - template: .azure-pipelines/run-test-scheduler-template.yml + - template: .azure-pipelines/run-test-elastictest-template.yml@sonic-mgmt parameters: TOPOLOGY: dualtor MIN_WORKER: $(T0_DUALTOR_INSTANCE_NUM) MAX_WORKER: $(T0_DUALTOR_INSTANCE_NUM) - MGMT_BRANCH: master + MGMT_BRANCH: "master" COMMON_EXTRA_PARAMS: "--disable_loganalyzer " - job: sonic_t0_elastictest @@ -222,13 +223,13 @@ stages: timeoutInMinutes: 240 continueOnError: false steps: - - template: .azure-pipelines/run-test-scheduler-template.yml + - template: .azure-pipelines/run-test-elastictest-template.yml@sonic-mgmt parameters: TOPOLOGY: t0-64-32 MIN_WORKER: $(T0_SONIC_INSTANCE_NUM) MAX_WORKER: $(T0_SONIC_INSTANCE_NUM) TEST_SET: t0-sonic - MGMT_BRANCH: master + MGMT_BRANCH: "master" COMMON_EXTRA_PARAMS: "--neighbor_type=sonic " VM_TYPE: vsonic From 70c1bdf5f141ef3091fa27ccdb241177e7a722bf Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Tue, 1 Aug 2023 16:32:29 +0800 Subject: [PATCH 083/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#16005) #### Why I did it src/sonic-utilities ``` * a56b11b6 - (HEAD -> master, origin/master, origin/HEAD) revert unit test tests/test_clear_tag (#2934) (10 hours ago) [Mai Bui] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 5ae17ff067b3..a56b11b6d075 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 5ae17ff067b3dbcb56815a8fbdbce10c8a99e4ae +Subproject commit a56b11b6d0751a56c49d591560f31a8173170707 From ea34cb2f0a92b32149369c2f61bf33c3fa25ada4 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Tue, 1 Aug 2023 21:03:49 +0800 Subject: [PATCH 084/145] [ci] Add PR checker for rpc target and debug target. (#15997) Why I did it Enable rpc target in PR checker to avoid build break for rpc target. Work item tracking Microsoft ADO (number only): 24708372 How I did it How to verify it --- azure-pipelines.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cdb98e0cc3c0..88b0cd01cb3e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -56,8 +56,6 @@ stages: - stage: Build pool: sonicbld - variables: - INSTALL_DEBUG_TOOLS: y dependsOn: [] jobs: - template: .azure-pipelines/azure-pipelines-build.yml @@ -68,6 +66,10 @@ stages: variables: swi_image: yes - name: mellanox + variables: + dbg_image: yes + docker_syncd_rpc_image: yes + platform_rpc: mlnx - name: marvell-arm64 pool: sonicbld-arm64 variables: From 0474c296b1a2c1115a8429726a84ac4737a046a3 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:17:12 +0800 Subject: [PATCH 085/145] [submodule] Update submodule sonic-swss-common to the latest HEAD automatically (#15786) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 00db81f68b55..7ff768a72e6f 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 00db81f68b5520df6b32acab9d5834b0320eae3a +Subproject commit 7ff768a72e6fbfc02ac1052b00e49690fc9d4f1b From 72ac5ccf1a89a67e63fd5ffef078aad9fac13d59 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Wed, 2 Aug 2023 16:32:24 +0800 Subject: [PATCH 086/145] [submodule] Update submodule sonic-gnmi to the latest HEAD automatically (#16014) #### Why I did it src/sonic-gnmi ``` * 58a7b20 - (HEAD -> master, origin/master, origin/HEAD) Add delete field to On change response when key is deleted (#139) (8 hours ago) [Zain Budhwani] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-gnmi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-gnmi b/src/sonic-gnmi index 2c8e4ab783d1..58a7b20b7605 160000 --- a/src/sonic-gnmi +++ b/src/sonic-gnmi @@ -1 +1 @@ -Subproject commit 2c8e4ab783d10b7433325653c1c90ad2b7f980b0 +Subproject commit 58a7b20b760561dd4d1156e1e91d7addc434dc39 From a8501757767354810c174c3dd96636fe814b35f8 Mon Sep 17 00:00:00 2001 From: Pavan-Nokia <120486223+Pavan-Nokia@users.noreply.github.com> Date: Wed, 2 Aug 2023 12:08:15 -0400 Subject: [PATCH 087/145] [Nokia-7215-A1] Update Nokia-7215-A1 platform (#15342) Update Nokia-7215-A1 platform to address UT and OC test failures --- .../Nokia-7215-A1/ASK-Board-AC5X-xb.md5 | 2 +- .../Nokia-7215-A1/ASK-Board-AC5X-xb.xml | 379 +++++++++++++++++- .../Nokia-7215-A1/ASK-L1-AC5X-xb.md5 | 2 +- .../Nokia-7215-A1/ASK-L1-AC5X-xb.xml | 2 +- .../Nokia-7215-A1/ASK-PP-AC5X-xb.md5 | 2 +- .../Nokia-7215-A1/ASK-PP-AC5X-xb.xml | 2 +- .../Nokia-7215-A1/SAI-AC5X-xb.md5 | 2 +- .../Nokia-7215-A1/SAI-AC5X-xb.xml | 2 +- .../arm64-nokia_ixs7215_52xb-r0/platform.json | 50 ++- .../platform_reboot | 0 .../plugins/led_control.py | 119 ++++++ .../pmon_daemon_control.json | 3 + .../thermal_policy.json | 4 +- platform/marvell-arm64/platform.conf | 5 +- .../7215/modules/Makefile | 2 +- .../7215/modules/ac5_thermal_sensor.c | 218 ++++++++++ .../7215/scripts/nokia-7215-init.sh | 72 +++- .../7215/sonic_platform/chassis.py | 52 +-- .../7215/sonic_platform/component.py | 21 +- .../7215/sonic_platform/eeprom.py | 54 +-- .../7215/sonic_platform/fan.py | 34 +- .../7215/sonic_platform/psu.py | 8 +- .../7215/sonic_platform/sfp.py | 50 ++- .../7215/sonic_platform/sfp_event.py | 43 +- .../7215/sonic_platform/test/test-eeprom.py | 2 +- .../7215/sonic_platform/thermal.py | 14 +- .../7215/sonic_platform/thermal_actions.py | 42 +- .../7215/sonic_platform/thermal_infos.py | 101 +++-- .../7215/sonic_platform/watchdog.py | 4 + .../7215/utils/sonic_ssd.py | 4 +- platform/marvell-arm64/sonic_fit.its | 20 + 31 files changed, 1097 insertions(+), 218 deletions(-) mode change 100755 => 100644 device/nokia/arm64-nokia_ixs7215_52xb-r0/platform_reboot create mode 100644 device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/led_control.py create mode 100644 device/nokia/arm64-nokia_ixs7215_52xb-r0/pmon_daemon_control.json create mode 100644 platform/marvell-arm64/sonic-platform-nokia/7215/modules/ac5_thermal_sensor.c diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.md5 b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.md5 index 16326740c24b..64cb21addf3a 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.md5 +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.md5 @@ -1 +1 @@ -8668dc21ae107bff2d5e4242fe532e38 \ No newline at end of file +ee44e299ca857b9f0abf2e804ec4850f \ No newline at end of file diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.xml b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.xml index 839af3d55daf..08936c1339e4 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.xml +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-Board-AC5X-xb.xml @@ -1,5 +1,5 @@ - + @@ -677,7 +677,7 @@ lowercase characters. 0 ASK-PP-AC5X-xb.xml ASK-L1-AC5X-xb.xml - na + sip6 0 @@ -694,6 +694,10 @@ lowercase characters. 0 + + 63 + false + 1 @@ -711,6 +715,10 @@ lowercase characters. 0 + + 63 + false + 2 @@ -728,6 +736,10 @@ lowercase characters. 0 + + 63 + false + 3 @@ -745,6 +757,10 @@ lowercase characters. 0 + + 63 + false + 4 @@ -762,6 +778,10 @@ lowercase characters. 0 + + 63 + false + 5 @@ -779,6 +799,10 @@ lowercase characters. 0 + + 63 + false + 6 @@ -796,6 +820,10 @@ lowercase characters. 0 + + 63 + false + 7 @@ -813,6 +841,10 @@ lowercase characters. 0 + + 63 + false + 8 @@ -830,6 +862,10 @@ lowercase characters. 0 + + 63 + false + 9 @@ -847,6 +883,10 @@ lowercase characters. 0 + + 63 + false + 10 @@ -864,6 +904,10 @@ lowercase characters. 0 + + 63 + false + 11 @@ -881,6 +925,10 @@ lowercase characters. 0 + + 63 + false + 12 @@ -898,6 +946,10 @@ lowercase characters. 0 + + 63 + false + 13 @@ -915,6 +967,10 @@ lowercase characters. 0 + + 63 + false + 14 @@ -932,6 +988,10 @@ lowercase characters. 0 + + 63 + false + 15 @@ -949,6 +1009,10 @@ lowercase characters. 0 + + 63 + false + 16 @@ -966,6 +1030,10 @@ lowercase characters. 0 + + 63 + false + 17 @@ -983,6 +1051,10 @@ lowercase characters. 0 + + 63 + false + 18 @@ -1000,6 +1072,10 @@ lowercase characters. 0 + + 63 + false + 19 @@ -1017,6 +1093,10 @@ lowercase characters. 0 + + 63 + false + 20 @@ -1034,6 +1114,10 @@ lowercase characters. 0 + + 63 + false + 21 @@ -1051,6 +1135,10 @@ lowercase characters. 0 + + 63 + false + 22 @@ -1068,6 +1156,10 @@ lowercase characters. 0 + + 63 + false + 23 @@ -1085,6 +1177,10 @@ lowercase characters. 0 + + 63 + false + 24 @@ -1102,6 +1198,10 @@ lowercase characters. 1 + + 63 + false + 25 @@ -1119,6 +1219,10 @@ lowercase characters. 1 + + 63 + false + 26 @@ -1136,6 +1240,10 @@ lowercase characters. 1 + + 63 + false + 27 @@ -1153,6 +1261,10 @@ lowercase characters. 1 + + 63 + false + 28 @@ -1170,6 +1282,10 @@ lowercase characters. 1 + + 63 + false + 29 @@ -1187,6 +1303,10 @@ lowercase characters. 1 + + 63 + false + 30 @@ -1204,6 +1324,10 @@ lowercase characters. 1 + + 63 + false + 31 @@ -1221,6 +1345,10 @@ lowercase characters. 1 + + 63 + false + 32 @@ -1238,6 +1366,10 @@ lowercase characters. 1 + + 63 + false + 33 @@ -1255,6 +1387,10 @@ lowercase characters. 1 + + 63 + false + 34 @@ -1272,6 +1408,10 @@ lowercase characters. 1 + + 63 + false + 35 @@ -1289,6 +1429,10 @@ lowercase characters. 1 + + 63 + false + 36 @@ -1306,6 +1450,10 @@ lowercase characters. 1 + + 63 + false + 37 @@ -1323,6 +1471,10 @@ lowercase characters. 1 + + 63 + false + 38 @@ -1340,6 +1492,10 @@ lowercase characters. 1 + + 63 + false + 39 @@ -1357,6 +1513,10 @@ lowercase characters. 1 + + 63 + false + 40 @@ -1374,6 +1534,10 @@ lowercase characters. 1 + + 63 + false + 41 @@ -1391,6 +1555,10 @@ lowercase characters. 1 + + 63 + false + 42 @@ -1408,6 +1576,10 @@ lowercase characters. 1 + + 63 + false + 43 @@ -1425,6 +1597,10 @@ lowercase characters. 1 + + 63 + false + 44 @@ -1442,6 +1618,10 @@ lowercase characters. 1 + + 63 + false + 45 @@ -1459,6 +1639,10 @@ lowercase characters. 1 + + 63 + false + 46 @@ -1476,6 +1660,10 @@ lowercase characters. 1 + + 63 + false + 47 @@ -1493,6 +1681,10 @@ lowercase characters. 1 + + 63 + false + 48 @@ -1507,6 +1699,14 @@ lowercase characters. NA + + 0 + + 2 + false + + false + 49 @@ -1521,6 +1721,14 @@ lowercase characters. NA + + 1 + + 2 + false + + false + 50 @@ -1535,6 +1743,14 @@ lowercase characters. NA + + 0 + + 2 + false + + false + 51 @@ -1549,6 +1765,14 @@ lowercase characters. NA + + 1 + + 2 + false + + false + 60 @@ -1570,6 +1794,157 @@ lowercase characters. NETWORK + + 0 + false + false + + + 1 + false + false + + + 2 + false + false + + + 3 + false + false + + + 4 + false + false + + + 5 + false + false + + + 6 + true + false + + + 7 + false + false + + + 8 + true + false + + + 9 + false + false + + + 10 + false + false + + + 11 + false + false + + + 0 + + ORDER_MODE_BY_PORT + BLINK_DUTY_CYCLE_1 + BLINK_DURATION_2 + BLINK_DUTY_CYCLE_1 + BLINK_DURATION_2 + PULSE_STRETCH_1 + false + 1627 + true + + 1 + true + + + 2 + true + + + 3 + true + + + 4 + 0 + 15 + false + + + 5 + 0 + 15 + false + + + 6 + true + + + 7 + true + + + 8 + true + + + 9 + true + + + 10 + true + + + 11 + true + + + 12 + true + + + 13 + true + + + 14 + true + + + 15 + true + + + 16 + true + + + + 2 + PORT_TYPE_XG + true + BLINK_SELECT_1 + false + false + true + + . diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.md5 b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.md5 index 5205acca39e0..e8daa7b6f38b 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.md5 +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.md5 @@ -1 +1 @@ -6d7161d3d4fdf922d5f26243642d8110 \ No newline at end of file +8d006b7a29c75f81b641df68102a6aa3 \ No newline at end of file diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.xml b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.xml index 2e612d014eba..534b218554f1 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.xml +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-L1-AC5X-xb.xml @@ -1,5 +1,5 @@ - + diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.md5 b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.md5 index e0b9509d1dab..de23afe95536 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.md5 +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.md5 @@ -1 +1 @@ -75737f56687883d181ea3da8d1c24da6 \ No newline at end of file +b42f2a2be9da6c7752c0807f9dee48bf \ No newline at end of file diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.xml b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.xml index 50daefc694d6..ad457fe7db03 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.xml +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/ASK-PP-AC5X-xb.xml @@ -1,5 +1,5 @@ - + diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.md5 b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.md5 index ee93b73e2534..951dd3007b76 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.md5 +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.md5 @@ -1 +1 @@ -ac4217e114fbd773ddbc6e0053948000 \ No newline at end of file +b43a871130f9e59ac21a74940574558f \ No newline at end of file diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.xml b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.xml index 6f45980f2c74..5e374fdb06b1 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.xml +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/SAI-AC5X-xb.xml @@ -1,5 +1,5 @@ - + diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/platform.json b/device/nokia/arm64-nokia_ixs7215_52xb-r0/platform.json index 633d92d7b522..0ddd1f39583a 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/platform.json +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/platform.json @@ -11,28 +11,46 @@ ], "fans": [ { - "name": "Fan1" + "name": "Fan1", + "status_led": { + "controllable": false + } }, { - "name": "Fan2" + "name": "Fan2", + "status_led": { + "controllable": false + } } ], "fan_drawers": [ { "name": "drawer1", + "status_led": { + "controllable": false + }, "max_consumed_power": false, "fans": [ { - "name": "Fan1" + "name": "Fan1", + "status_led": { + "controllable": false + } } ] }, { "name": "drawer2", + "status_led": { + "controllable": false + }, "max_consumed_power": false, "fans": [ { - "name": "Fan2" + "name": "Fan2", + "status_led": { + "controllable": false + } } ] } @@ -40,6 +58,9 @@ "psus": [ { "name": "PSU1", + "status_led": { + "controllable": false + }, "current": false, "power": false, "max_power": false, @@ -49,6 +70,9 @@ }, { "name": "PSU2", + "status_led": { + "controllable": false + }, "current": false, "power": false, "max_power": false, @@ -73,12 +97,18 @@ "high-crit-threshold": false }, { - "name": "CPU Core", + "name": "AC5X CORE", "controllable": false, "low-threshold": false, - "high-threshold": false, "low-crit-threshold": false, "high-crit-threshold": false + }, + { + "name": "OOB PHY", + "controllable": false, + "low-threshold": false, + "high-threshold": false, + "low-crit-threshold": false } ], "sfps": [ @@ -227,16 +257,16 @@ "name": "Ethernet47" }, { - "name": "Ethernet48" + "name": "SFP48" }, { - "name": "Ethernet49" + "name": "SFP49" }, { - "name": "Ethernet50" + "name": "SFP50" }, { - "name": "Ethernet51" + "name": "SFP51" } ] }, diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/platform_reboot b/device/nokia/arm64-nokia_ixs7215_52xb-r0/platform_reboot old mode 100755 new mode 100644 diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/led_control.py b/device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/led_control.py new file mode 100644 index 000000000000..0a2dfdd7fc93 --- /dev/null +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/led_control.py @@ -0,0 +1,119 @@ +# +# led_control.py +# +# Platform-specific LED control functionality for SONiC +# + +try: + from sonic_led.led_control_base import LedControlBase + import os + import time + import syslog + import sonic_platform.platform + import sonic_platform.chassis +except ImportError as e: + raise ImportError(str(e) + " - required module not found") + +CPLD_DIR = "/sys/bus/i2c/devices/0-0041/" + +def DBG_PRINT(str): + syslog.openlog("nokia-led") + syslog.syslog(syslog.LOG_INFO, str) + syslog.closelog() + + +class LedControl(LedControlBase): + """Platform specific LED control class""" + + # Constructor + def __init__(self): + self.chassis = sonic_platform.platform.Platform().get_chassis() + self._initDefaultConfig() + + def _initDefaultConfig(self): + # The fan tray leds and system led managed by new chassis class API + # leaving only a couple other front panel leds to be done old style + DBG_PRINT("starting system leds") + self._initSystemLed() + DBG_PRINT(" led done") + + def _read_sysfs_file(self, sysfs_file): + # On successful read, returns the value read from given + # reg_name and on failure returns 'ERR' + rv = 'ERR' + + if (not os.path.isfile(sysfs_file)): + return rv + try: + with open(sysfs_file, 'r') as fd: + rv = fd.read() + except Exception as e: + rv = 'ERR' + + rv = rv.rstrip('\r\n') + rv = rv.lstrip(" ") + return rv + + def _write_sysfs_file(self, sysfs_file, value): + # On successful write, the value read will be written on + # reg_name and on failure returns 'ERR' + rv = 'ERR' + + if (not os.path.isfile(sysfs_file)): + return rv + try: + with open(sysfs_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception as e: + rv = 'ERR' + + return rv + + def _initSystemLed(self): + # Front Panel System LEDs setting + oldfan = 0xf # 0=amber, 1=green + oldpsu = 0xf # 0=amber, 1=green + + # Write sys led + status = self._write_sysfs_file(CPLD_DIR+"system_led", "green") + if status == "ERR": + DBG_PRINT(" System LED NOT set correctly") + else: + DBG_PRINT(" System LED set O.K. ") + + # Timer loop to monitor and set front panel Status, Fan, and PSU LEDs + while True: + # Front Panel FAN Panel LED setting + if (self.chassis.get_fan(0).get_status() == self.chassis.get_fan(1).get_status() == True): + if (os.path.isfile(CPLD_DIR+"fan_led")): + if oldfan != 0x1: + self._write_sysfs_file(CPLD_DIR+"fan_led", "green") + oldfan = 0x1 + else: + oldfan = 0xf + else: + if (os.path.isfile(CPLD_DIR+"fan_led")): + if oldfan != 0x0: + self._write_sysfs_file(CPLD_DIR+"fan_led", "amber") + oldfan = 0x0 + else: + oldfan = 0xf + + # Front Panel PSU Panel LED setting + if (self.chassis.get_psu(0).get_status() == self.chassis.get_psu(1).get_status() == True): + if (os.path.isfile(CPLD_DIR+"psu_led")): + if oldpsu != 0x1: + self._write_sysfs_file(CPLD_DIR+"psu_led", "green") + oldpsu = 0x1 + else: + oldpsu = 0xf + else: + if (os.path.isfile(CPLD_DIR+"psu_led")): + if oldpsu != 0x0: + status = self._write_sysfs_file(CPLD_DIR+"psu_led", "amber") + oldpsu = 0x0 + else: + oldpsu = 0xf + + time.sleep(6) + diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/pmon_daemon_control.json b/device/nokia/arm64-nokia_ixs7215_52xb-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..f6445f875922 --- /dev/null +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_pcied": true +} diff --git a/device/nokia/arm64-nokia_ixs7215_52xb-r0/thermal_policy.json b/device/nokia/arm64-nokia_ixs7215_52xb-r0/thermal_policy.json index fb6e044e266c..d20c3b817add 100644 --- a/device/nokia/arm64-nokia_ixs7215_52xb-r0/thermal_policy.json +++ b/device/nokia/arm64-nokia_ixs7215_52xb-r0/thermal_policy.json @@ -43,7 +43,9 @@ "actions": [ { "type": "thermal.temp_check_and_set_all_fan_speed", - "default_speed": "50", + "default_speed": "25", + "threshold1_speed": "40", + "threshold2_speed": "75", "hightemp_speed": "100" } ] diff --git a/platform/marvell-arm64/platform.conf b/platform/marvell-arm64/platform.conf index 4de0dadd28e9..2fa347b68b0d 100644 --- a/platform/marvell-arm64/platform.conf +++ b/platform/marvell-arm64/platform.conf @@ -37,11 +37,11 @@ if [ $PLATFORM_AC5X -eq 1 ]; then fit_addr=0x210000000 initrd_addr=0x206000000 - fdt_fname="/boot/ac5x.dtb" + fdt_fname="/usr/lib/linux-image-${kernel_version}/marvell/7215-ixs-a1.dtb" FW_ENV_DEFAULT='/dev/mtd0 0x400000 0x10000 0x10000' demo_part=2 - fit_conf_name="#conf_ac5x" + fit_conf_name="#conf_7215_a1" mmc_bus="mmc0:0001" else fdt_addr=0x1000000 @@ -205,6 +205,7 @@ prepare_boot_menu() { fw_setenv ${FW_ARG} kernel_addr $kernel_addr > /dev/null fw_setenv ${FW_ARG} fdt_addr $fdt_addr > /dev/null fw_setenv ${FW_ARG} fit_addr $fit_addr > /dev/null + fw_setenv ${FW_ARG} fit_conf_name $fit_conf_name > /dev/null fw_setenv ${FW_ARG} initrd_addr $initrd_addr > /dev/null MMC_LOAD='ext4load mmc 0:'$demo_part' $fit_addr $fit_name' fw_setenv ${FW_ARG} sonic_boot_load "$MMC_LOAD" > /dev/null diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/modules/Makefile b/platform/marvell-arm64/sonic-platform-nokia/7215/modules/Makefile index 47e1492f1572..73d6e5f38876 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/modules/Makefile +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/modules/Makefile @@ -1 +1 @@ -obj-m:= nokia_7215_ixs_a1_cpld.o +obj-m:= nokia_7215_ixs_a1_cpld.o ac5_thermal_sensor.o diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/modules/ac5_thermal_sensor.c b/platform/marvell-arm64/sonic-platform-nokia/7215/modules/ac5_thermal_sensor.c new file mode 100644 index 000000000000..faf4402ffe61 --- /dev/null +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/modules/ac5_thermal_sensor.c @@ -0,0 +1,218 @@ +/* + * HWMON Driver for AC5x thermal sensor + * + * Author: Natarajan Subbiramani + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define AC5_DEFAULT_TEMP_CRIT 100000 +#define AC5_DEFAULT_TEMP_MAX 110000 + +#define AC5_TEMP_BASE_ADDR 0x944F80D0 +static unsigned long thermal_base_addr=AC5_TEMP_BASE_ADDR; +module_param(thermal_base_addr, ulong, 0444); +MODULE_PARM_DESC(thermal_base_addr, + "Initialize the base address of the thermal sensor"); + +struct ac5_thermal_data { + struct device *dev; + struct device *hwmon_dev; + uint8_t * __iomem temp_base; + int temp_input; + int temp_crit; + int temp_max; +}; + +static long ac5_thermal_read_reg_in_mcelcius(struct device *dev, struct ac5_thermal_data *data) +{ + volatile uint8_t * __iomem temp_base = data->temp_base; + uint32_t regval; + long output=data->temp_max; + + //STOP MEASUREMENT + writel(0xF0F01034, temp_base); + + //delay for 1ms + mdelay(1); + + //Read thermal value + regval = readl(temp_base+0xC); + + //RE-START MEASUREMENT + writel(0xF0F01035, temp_base); + + //Validate data + if(regval & 0x10000) { + //Calibrate it to milli-celcius + output = (regval>> 6) & 0x3FF; + output = ((output*42)-27250)*10; + } + + return output; +} +static int ac5_thermal_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + struct ac5_thermal_data *data = dev_get_drvdata(dev); + + switch (type) { + case hwmon_temp: + switch (attr) { + case hwmon_temp_input: + *val = ac5_thermal_read_reg_in_mcelcius(dev, data); + break; + case hwmon_temp_crit: + *val = data->temp_crit; + break; + case hwmon_temp_max: + *val = data->temp_max; + break; + default: + return -EINVAL; + } + break; + default: + return -EINVAL; + } + return 0; +} + +static int ac5_thermal_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + struct ac5_thermal_data *data = dev_get_drvdata(dev); + switch (type) { + case hwmon_temp: + switch (attr) { + case hwmon_temp_crit: + data->temp_crit = val; + break; + case hwmon_temp_max: + data->temp_max = val; + break; + default: + return -EINVAL; + } + break; + default: + return -EINVAL; + } + return 0; +} + + +static umode_t ac5_thermal_is_visible(const void *data, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + case hwmon_temp: + switch (attr) { + case hwmon_temp_input: + return 0444; + case hwmon_temp_crit: + case hwmon_temp_max: + return 0644; + } + break; + default: + break; + } + return 0; +} + +static const struct hwmon_channel_info *ac5_thermal_info[] = { + HWMON_CHANNEL_INFO(temp, + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT), + NULL +}; + +static const struct hwmon_ops ac5_thermal_hwmon_ops = { + .is_visible = ac5_thermal_is_visible, + .read = ac5_thermal_read, + .write = ac5_thermal_write, +}; + +static const struct hwmon_chip_info ac5_thermal_chip_info = { + .ops = &ac5_thermal_hwmon_ops, + .info = ac5_thermal_info, +}; + +static const struct file_operations fops = { + .owner = THIS_MODULE, +}; + +struct miscdevice ac5_thermal_misc_device = { + .minor = TEMP_MINOR, + .name = "ac5_thermal", + .fops = &fops, +}; + +static int __init ac5_thermal_init_misc_driver(void) +{ + struct device *dev; + struct ac5_thermal_data *thermal_data; + int err; + void * __iomem reg; + + err = misc_register(&ac5_thermal_misc_device); + if (err) { + pr_err("ac5_thermal misc_register failed!!!\n"); + return err; + } + + dev = ac5_thermal_misc_device.this_device; + thermal_data = devm_kzalloc(dev, sizeof(struct ac5_thermal_data), GFP_KERNEL); + if (!thermal_data) + return -ENOMEM; + + thermal_data->dev = dev; + thermal_data->temp_crit = AC5_DEFAULT_TEMP_CRIT; + thermal_data->temp_max = AC5_DEFAULT_TEMP_MAX; + + thermal_data->hwmon_dev = devm_hwmon_device_register_with_info(dev, ac5_thermal_misc_device.name, + thermal_data, &ac5_thermal_chip_info, + NULL); + if (IS_ERR(thermal_data->hwmon_dev)) { + dev_err(dev, "%s: hwmon registration failed.\n", ac5_thermal_misc_device.name); + return PTR_ERR(thermal_data->hwmon_dev); + } + + reg = devm_ioremap(dev, thermal_base_addr, 16); + if (IS_ERR(reg)) { + dev_err(dev, "%s: base addr remap failed\n", ac5_thermal_misc_device.name); + return PTR_ERR(reg); + } + thermal_data->temp_base = reg; + /*Enable measurement*/ + writel(0xF0F01035, thermal_data->temp_base); + writel(0x0584e680, thermal_data->temp_base+8); + + dev_info(dev, "%s: initialized. base_addr: 0x%lx\n", dev_name(thermal_data->hwmon_dev), thermal_base_addr); + + return 0; +} + +static void __exit ac5_thermal_exit_misc_driver(void) +{ + misc_deregister(&ac5_thermal_misc_device); +} + +module_init(ac5_thermal_init_misc_driver); +module_exit(ac5_thermal_exit_misc_driver); + +MODULE_AUTHOR("Natarajan Subbiramani "); +MODULE_DESCRIPTION("AC5 Thermal sensor Driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/scripts/nokia-7215-init.sh b/platform/marvell-arm64/sonic-platform-nokia/7215/scripts/nokia-7215-init.sh index 9659bee7c715..b105c0f711c4 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/scripts/nokia-7215-init.sh +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/scripts/nokia-7215-init.sh @@ -4,9 +4,9 @@ # Load required kernel-mode drivers load_kernel_drivers() { -#placeholder for now - echo "Loading Kernel Drivers" + echo "Loading Kernel Drivers" sudo insmod /lib/modules/5.10.0-18-2-arm64/nokia_7215_ixs_a1_cpld.ko + sudo insmod /lib/modules/5.10.0-18-2-arm64/ac5_thermal_sensor.ko } nokia_7215_profile() @@ -16,23 +16,28 @@ nokia_7215_profile() sudo ifconfig eth0 hw ether $MAC_ADDR echo "Nokia-7215-A1: Updating switch mac address ${MAC_ADDR}" } +file_exists() { + # Wait 10 seconds max till file exists + for((i=0; i<10; i++)); + do + if [ -f $1 ]; then + return 1 + fi + sleep 1 + done + return 0 + } # - Main entry # Install kernel drivers required for i2c bus access load_kernel_drivers +# Enumerate RTC +echo m41t11 0x68 > /sys/bus/i2c/devices/i2c-0/new_device -# LOGIC to enumerate SFP eeprom devices - send 0x50 to kernel i2c driver - initialize devices -# the mux may be enumerated at number 4 or 5 so we check for the mux and skip if needed -# Get list of the mux channels # Enumerate the SFP eeprom device on each mux channel -#echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-0/new_device - -# Enumerate system eeprom -echo 24c64 0x53 > /sys/class/i2c-adapter/i2c-0/new_device -sleep 2 -chmod 644 /sys/class/i2c-adapter/i2c-0/0-0053/eeprom +echo pca9546 0x70> /sys/bus/i2c/devices/i2c-1/new_device # Enumerate power monitor echo ina230 0x40 > /sys/bus/i2c/devices/i2c-0/new_device @@ -40,17 +45,52 @@ echo ina230 0x40 > /sys/bus/i2c/devices/i2c-0/new_device # Enumerate fan echo emc2305 0x2e > /sys/bus/i2c/devices/i2c-0/new_device -# Enumerate RTC -echo m41t11 0x68 > /sys/bus/i2c/devices/i2c-0/new_device - # Enumerate Thermals - echo tmp75 0x48 > /sys/bus/i2c/devices/i2c-0/new_device echo tmp75 0x49 > /sys/bus/i2c/devices/i2c-0/new_device +#Enumerate CPLD echo nokia_7215_a1_cpld 0x41 > /sys/bus/i2c/devices/i2c-0/new_device +# Enumerate system eeprom +echo 24c64 0x53 > /sys/class/i2c-adapter/i2c-0/new_device + +file_exists /sys/class/i2c-adapter/i2c-0/0-0053/eeprom +status=$? +if [ "$status" == "1" ]; then + chmod 644 /sys/class/i2c-adapter/i2c-0/0-0053/eeprom +else + echo "SYSEEPROM file not foud" +fi + +# Get list of the mux channels +for((i=0; i<10; i++)); + do + ismux_bus=$(i2cdetect -l|grep mux|cut -f1) + if [[ $ismux_bus ]]; then + break; + fi + sleep 1 + done + +# Enumerate the SFP eeprom device on each mux channel +for mux in ${ismux_bus} +do + echo optoe2 0x50 > /sys/class/i2c-adapter/${mux}/new_device +done + +# Enable optical SFP Tx +for i in {49..52} +do + echo 0 > /sys/bus/i2c/devices/0-0041/sfp${i}_tx_disable +done + +#slow down fan speed to 50 untill thermal algorithm kicks in% +i2c_path="/sys/bus/i2c/devices/0-002e/hwmon/hwmon?" +echo 128 > $i2c_path/pwm1 +echo 128 > $i2c_path/pwm2 + # Ensure switch is programmed with base MAC addr nokia_7215_profile -exit 0 \ No newline at end of file +exit 0 diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/chassis.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/chassis.py index c5f3c1db18b4..11eeb15106af 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/chassis.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/chassis.py @@ -35,7 +35,7 @@ MAX_7215_FAN_DRAWERS = 2 MAX_7215_FANS_PER_DRAWER = 1 MAX_7215_PSU = 2 -MAX_7215_THERMAL = 3 +MAX_7215_THERMAL = 4 CPLD_DIR = "/sys/bus/i2c/devices/0-0041/" SYSLOG_IDENTIFIER = "chassis" @@ -64,11 +64,10 @@ def __init__(self): sfp_node = Sfp(index, 'COPPER', 'N/A', 'N/A') self._sfp_list.append(sfp_node) - """ # Verify optoe2 driver SFP eeprom devices were enumerated and exist # then create the sfp nodes eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" - mux_dev = sorted(glob.glob("/sys/class/i2c-adapter/i2c-0/i2c-[0-9]")) + mux_dev = sorted(glob.glob("/sys/class/i2c-adapter/i2c-1/i2c-[0-9]")) y = 0 for index in range(self.SFP_PORT_START, self.SFP_PORT_END+1): mux_dev_num = mux_dev[y] @@ -80,7 +79,6 @@ def __init__(self): sfp_node = Sfp(index, 'SFP', port_eeprom_path, port_i2c_map) self._sfp_list.append(sfp_node) self.sfp_event_initialized = False - """ # Instantiate system eeprom object self._eeprom = Eeprom() @@ -196,11 +194,11 @@ def get_model(self): def get_serial(self): """ - Retrieves the serial number of the chassis (Service tag) + Retrieves the serial number of the chassis Returns: string: Serial number of chassis """ - return self._eeprom.serial_str() + return self._eeprom.serial_number_str() def get_status(self): """ @@ -221,15 +219,13 @@ def get_base_mac(self): """ return self._eeprom.base_mac_addr() - def get_serial_number(self): + def get_service_tag(self): """ - Retrieves the hardware serial number for the chassis - + Retrieves the Service Tag of the chassis Returns: - A string containing the hardware serial number for this - chassis. + string: Service Tag of chassis """ - return self._eeprom.serial_number_str() + return self._eeprom.service_tag_str() def get_revision(self): """ @@ -275,6 +271,13 @@ def get_watchdog(self): Returns: An object derived from WatchdogBase representing the hardware watchdog device + + Note: + We overload this method to ensure that watchdog is only initialized + when it is referenced. Currently, only one daemon can open the + watchdog. To initialize watchdog in the constructor causes multiple + daemon try opening watchdog when loading and constructing a chassis + object and fail. By doing so we can eliminate that risk. """ try: if self._watchdog is None: @@ -405,31 +408,6 @@ def get_status_led(self): return color - def get_watchdog(self): - """ - Retrieves hardware watchdog device on this chassis - - Returns: - An object derived from WatchdogBase representing the hardware - watchdog device - - Note: - We overload this method to ensure that watchdog is only initialized - when it is referenced. Currently, only one daemon can open the - watchdog. To initialize watchdog in the constructor causes multiple - daemon try opening watchdog when loading and constructing a chassis - object and fail. By doing so we can eliminate that risk. - """ - try: - if self._watchdog is None: - from sonic_platform.watchdog import WatchdogImplBase - watchdog_device_path = "/dev/watchdog0" - self._watchdog = WatchdogImplBase(watchdog_device_path) - except Exception as e: - sonic_logger.log_warning(" Fail to load watchdog {}".format(repr(e))) - - return self._watchdog - def get_position_in_parent(self): """ Retrieves 1-based relative physical position in parent device. If the agent diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/component.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/component.py index f510bde8043f..cda5abc3c223 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/component.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/component.py @@ -34,10 +34,7 @@ class Component(ComponentBase): ["System-CPLD", "Used for managing SFPs, LEDs, PSUs and FANs "], ["U-Boot", "Performs initialization during booting"], ] - CPLD_UPDATE_COMMAND1 = ['cp', '/usr/sbin/vme', '/tmp'] - CPLD_UPDATE_COMMAND2 = ['cp', '', '/tmp'] - CPLD_UPDATE_COMMAND3 = ['cd', '/tmp'] - CPLD_UPDATE_COMMAND4 = ['./vme', ''] + CPLD_UPDATE_COMMAND = ['./cpldupd_A1', ''] def __init__(self, component_index): self.index = component_index @@ -192,23 +189,25 @@ def install_firmware(self, image_path): A boolean, True if install was successful, False if not """ image_name = ntpath.basename(image_path) - print(" ixs7215 - install cpld {}".format(image_name)) + print(" ixs-7215-A1 - install cpld {}".format(image_name)) # check whether the image file exists if not os.path.isfile(image_path): print("ERROR: the cpld image {} doesn't exist ".format(image_path)) return False - self.CPLD_UPDATE_COMMAND2[1] = image_path - self.CPLD_UPDATE_COMMAND4[1] = image_name + # check whether the cpld exe exists + if not os.path.isfile('/tmp/cpldupd_A1'): + print("ERROR: the cpld exe {} doesn't exist ".format('/tmp/cpldupd_A1')) + return False + + self.CPLD_UPDATE_COMMAND[1] = image_name success_flag = False try: - subprocess.check_call(self.CPLD_UPDATE_COMMAND1, stderr=subprocess.STDOUT) - subprocess.check_call(self.CPLD_UPDATE_COMMAND2, stderr=subprocess.STDOUT) - subprocess.check_call(self.CPLD_UPDATE_COMMAND3, stderr=subprocess.STDOUT) - subprocess.check_call(self.CPLD_UPDATE_COMMAND4, stderr=subprocess.STDOUT) + subprocess.check_call(self.CPLD_UPDATE_COMMAND, stderr=subprocess.STDOUT) + success_flag = True except subprocess.CalledProcessError as e: print("ERROR: Failed to upgrade CPLD: rc={}".format(e.returncode)) diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/eeprom.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/eeprom.py index ada5e979ee41..4abfad47be9f 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/eeprom.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/eeprom.py @@ -27,23 +27,28 @@ def __init__(self, is_psu=False, psu_index=0, is_fan=False, fan_index=0): self.is_psu_eeprom = is_psu self.is_fan_eeprom = is_fan self.is_sys_eeprom = not (is_psu | is_fan) + + if self.is_sys_eeprom: + self.start_offset = 0 + self.eeprom_path = self.I2C_DIR + "i2c-0/0-0053/eeprom" + # System EEPROM is in ONIE TlvInfo EEPROM format + super(Eeprom, self).__init__(self.eeprom_path, + self.start_offset, '', True) + self._load_system_eeprom() + + else: + if self.is_psu_eeprom: + self.index = psu_index + self.part_number = '1' + self.model_str = 'PJT-12V100WBBA' + self.serial_number = 'NA' + self.serial_number = 'NA' - self.start_offset = 0 - self.eeprom_path = self.I2C_DIR + "i2c-0/0-0053/eeprom" - # System EEPROM is in ONIE TlvInfo EEPROM format - super(Eeprom, self).__init__(self.eeprom_path, - self.start_offset, '', True) - self._load_system_eeprom() - - if self.is_psu_eeprom: - self.index = psu_index - self.part_number = '1' - self.model_str = 'PJT-12V100WBBA' - - if self.is_fan_eeprom: - self.index = fan_index - self.part_number = '1' - self.model_str = 'FFB0412UHN-BC2EA12' + if self.is_fan_eeprom: + self.index = fan_index + self.part_number = '1' + self.model_str = 'FFB0412UHN-BC2EA12' + self.serial_number = 'NA' def _load_system_eeprom(self): @@ -61,7 +66,7 @@ def _load_system_eeprom(self): self.serial_number = 'NA' self.part_number = 'NA' self.model_str = 'NA' - self.serial = 'NA' + self.service_tag = 'NA' self.eeprom_tlv_dict = dict() else: eeprom = self.eeprom_data @@ -73,7 +78,7 @@ def _load_system_eeprom(self): self.serial_number = 'NA' self.part_number = 'NA' self.model_str = 'NA' - self.serial = 'NA' + self.service_tag = 'NA' return total_length = (eeprom[9] << 8) | eeprom[10] @@ -88,12 +93,7 @@ def _load_system_eeprom(self): + eeprom[tlv_index + 1]] code = "0x%02X" % (tlv[0]) - if tlv[0] == self._TLV_CODE_VENDOR_EXT: - value = str((tlv[2] << 24) | (tlv[3] << 16) | - (tlv[4]<< 8) | tlv[5]) - value += str(tlv[6:6 + tlv[1]]) - else: - name, value = self.decoder(None, tlv) + name, value = self.decoder(None, tlv) self.eeprom_tlv_dict[code] = value if eeprom[tlv_index] == self._TLV_CODE_CRC_32: @@ -109,7 +109,7 @@ def _load_system_eeprom(self): "0x%X" % (self._TLV_CODE_PART_NUMBER), 'NA') self.model_str = self.eeprom_tlv_dict.get( "0x%X" % (self._TLV_CODE_PRODUCT_NAME), 'NA') - self.serial = self.eeprom_tlv_dict.get( + self.service_tag = self.eeprom_tlv_dict.get( "0x%X" % (self._TLV_CODE_SERVICE_TAG), 'NA') def _get_eeprom_field(self, field_name): @@ -160,11 +160,11 @@ def modelstr(self): """ return self.model_str - def serial_str(self): + def service_tag_str(self): """ Returns the servicetag number. """ - return self.serial + return self.service_tag def system_eeprom_info(self): """ diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/fan.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/fan.py index f03122686f03..aa4a51a95d31 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/fan.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/fan.py @@ -16,8 +16,9 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") -MAX_IXS7215_FAN_SPEED = 23000 -WORKING_IXS7215_FAN_SPEED = 2300 +MAX_IXS7215_FAN_SPEED = 24000 +WORKING_IXS7215_FAN_SPEED = 2400 + sonic_logger = logger.Logger('fan') @@ -27,9 +28,11 @@ class Fan(FanBase): def __init__(self, fan_index, fan_drawer, psu_fan=False, dependency=None): self.is_psu_fan = psu_fan + EMC2302_DIR = " " i2c_path = "/sys/bus/i2c/devices/0-002e/hwmon/" - hwmon_node = os.listdir(i2c_path)[0] - EMC2302_DIR = i2c_path + hwmon_node + '/' + if(os.path.exists(i2c_path)): + hwmon_node = os.listdir(i2c_path)[0] + EMC2302_DIR = i2c_path + hwmon_node + '/' if not self.is_psu_fan: # Fan is 1-based in Nokia platforms @@ -140,7 +143,7 @@ def get_service_tag(self): Returns: string: Service Tag of Fan """ - return self.eeprom.serial_str() + return self.eeprom.service_tag_str() def get_status(self): """ @@ -217,7 +220,7 @@ def get_speed_tolerance(self): """ if self.get_presence(): # The tolerance value is fixed as 25% for this platform - tolerance = 25 + tolerance = 50 else: tolerance = 0 @@ -235,17 +238,16 @@ def set_speed(self, speed): if self.is_psu_fan: return False - # Set current fan duty cycle - # - 0x00 : fan off - # - 0x40 : 25% duty cycle - # - 0x80 : 50% duty cycle (default) - # - 0xff : 100% duty cycle (full speed) if speed in range(0, 6): fandutycycle = 0x00 - elif speed in range(6, 41): + elif speed in range(6, 26): fandutycycle = 64 - elif speed in range(41, 76): + elif speed in range(26, 41): + fandutycycle = 102 + elif speed in range(41, 52): fandutycycle = 128 + elif speed in range(52, 76): + fandutycycle = 192 elif speed in range(76, 101): fandutycycle = 255 else: @@ -300,9 +302,13 @@ def get_target_speed(self): speed = 0 elif dutyspeed == 64: speed = 25 + elif dutyspeed == 102: + speed = 40 elif dutyspeed == 128: speed = 50 + elif dutyspeed == 192: + speed = 75 elif dutyspeed == 255: speed = 100 - return speed \ No newline at end of file + return speed diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/psu.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/psu.py index bd45ed054636..eb8aeeaedfb1 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/psu.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/psu.py @@ -167,11 +167,11 @@ def get_voltage(self): e.g. 12.1 """ if(self.get_status()): - psu_voltage = self._read_sysfs_file(INA230_DIR+"in_voltage1_scale") + psu_voltage = self._read_sysfs_file(INA230_DIR+"in_voltage1_raw") else: psu_voltage = 0.0 - psu_voltage = float(psu_voltage)*10 + psu_voltage = (float(psu_voltage)*1.25)/1000 return psu_voltage @@ -184,8 +184,8 @@ def get_current(self): """ num_psus = self._get_active_psus() if(self.get_status()): - psu_current = self._read_sysfs_file(INA230_DIR+"in_current3_scale") - psu_current = (float(psu_current)*10)/num_psus + psu_current = self._read_sysfs_file(INA230_DIR+"in_current3_raw") + psu_current = ((float(psu_current)*0.5)/1000)/num_psus else: psu_current = 0.0 diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp.py index c7b659c00feb..4cb96ed47046 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp.py @@ -1,13 +1,14 @@ # Name: sfp.py, version: 1.0 # # Description: Module contains the definitions of SFP related APIs -# for Nokia IXR 7250 platform. +# for Nokia IXS 7215 platform. # # Copyright (c) 2023, Nokia # All rights reserved. # try: + import os from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase from sonic_py_common.logger import Logger from sonic_py_common import device_info @@ -18,20 +19,13 @@ import subprocess as cmd -smbus_present = 1 - -try: - import smbus -except ImportError as e: - smbus_present = 0 - COPPER_TYPE = "COPPER" SFP_TYPE = "SFP" # SFP PORT numbers SFP_PORT_START = 49 SFP_PORT_END = 52 - +CPLD_DIR = "/sys/bus/i2c/devices/0-0041/" logger = Logger() class Sfp(SfpOptoeBase): @@ -71,7 +65,24 @@ def __init__(self, index, sfp_type, eeprom_path, port_i2c_map): logger.log_debug("Sfp __init__ index {} setting name to {} and eeprom_path to {}".format(index, self.name, self.eeprom_path)) Sfp.instances.append(self) - + + def _read_sysfs_file(self, sysfs_file): + # On successful read, returns the value read from given + # reg_name and on failure returns 'ERR' + rv = 'ERR' + + if (not os.path.isfile(sysfs_file)): + return rv + try: + with open(sysfs_file, 'r') as fd: + rv = fd.read() + except Exception as e: + rv = 'ERR' + + rv = rv.rstrip('\r\n') + rv = rv.lstrip(" ") + return rv + def get_eeprom_path(self): return self.eeprom_path @@ -83,22 +94,8 @@ def get_presence(self): """ if self.sfp_type == COPPER_TYPE: return False - - if smbus_present == 0: # if called from sfputil outside of pmon - # cmdstatus, sfpstatus = cmd.getstatusoutput('sudo i2cget -y 0 0x41 0x3') - cmdstatus, sfpstatus = getstatusoutput_noshell(['sudo', 'i2cget', '-y', '0', '0x41', '0x3']) - sfpstatus = int(sfpstatus, 16) - else: - bus = smbus.SMBus(0) - DEVICE_ADDRESS = 0x41 - DEVICE_REG = 0x3 - sfpstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG) - - pos = [1, 2, 4, 8] - bit_pos = pos[self.index-SFP_PORT_START] - sfpstatus = sfpstatus & (bit_pos) - - if sfpstatus == 0: + sfpstatus = self._read_sysfs_file(CPLD_DIR+"sfp{}_present".format(self.index)) + if sfpstatus == '1': return True return False @@ -157,7 +154,6 @@ def get_error_description(self): error_description = self.SFP_STATUS_OK return error_description - # return NotImplementedError def get_reset_status(self): """ diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp_event.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp_event.py index 34fc2bc6ae5d..92f759b97895 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp_event.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/sfp_event.py @@ -1,17 +1,11 @@ ''' listen for the SFP change event and return to chassis. ''' +import os import time from sonic_py_common import logger from sonic_py_common.general import getstatusoutput_noshell -smbus_present = 1 - -try: - import smbus -except ImportError as e: - smbus_present = 0 - # system level event/error EVENT_ON_ALL_SFP = '-1' SYSTEM_NOT_READY = 'system_not_ready' @@ -21,6 +15,7 @@ # SFP PORT numbers SFP_PORT_START = 49 SFP_PORT_END = 52 +CPLD_DIR = "/sys/bus/i2c/devices/0-0041/" SYSLOG_IDENTIFIER = "sfp_event" sonic_logger = logger.Logger(SYSLOG_IDENTIFIER) @@ -32,6 +27,23 @@ class sfp_event: def __init__(self): self.handle = None + def _read_sysfs_file(self, sysfs_file): + # On successful read, returns the value read from given + # reg_name and on failure returns 'ERR' + rv = 'ERR' + + if (not os.path.isfile(sysfs_file)): + return rv + try: + with open(sysfs_file, 'r') as fd: + rv = fd.read() + except Exception as e: + rv = 'ERR' + + rv = rv.rstrip('\r\n') + rv = rv.lstrip(" ") + return rv + def initialize(self): self.modprs_register = 0 # Get Transceiver status @@ -44,18 +56,13 @@ def deinitialize(self): return def _get_transceiver_status(self): - if smbus_present == 0: - sonic_logger.log_info(" PMON - smbus ERROR - DEBUG sfp_event ") - cmdstatus, sfpstatus = getstatusoutput_noshell(['sudo', 'i2cget', '-y', '0', '0x41', '0x3']) - sfpstatus = int(sfpstatus, 16) - else: - bus = smbus.SMBus(0) - DEVICE_ADDRESS = 0x41 - DEVICE_REG = 0x3 - sfpstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG) - sfpstatus = ~sfpstatus - sfpstatus = sfpstatus & 0xF + pos = [1, 2, 4, 8] + sfpstatus = 0 + for port in range (SFP_PORT_START,SFP_PORT_END+1): + status = self._read_sysfs_file(CPLD_DIR+"sfp{}_present".format(port)) + bit_pos = pos[port-SFP_PORT_START] + sfpstatus = sfpstatus + (bit_pos * (int(status))) return sfpstatus diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/test/test-eeprom.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/test/test-eeprom.py index f63dd0241201..bee72e022e88 100755 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/test/test-eeprom.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/test/test-eeprom.py @@ -13,7 +13,7 @@ def main(): eeprom = chassis.get_eeprom() print(" Model: {}, Service Tag: {}".format(eeprom.modelstr(), - eeprom.serial_str())) + eeprom. service_tag_str())) print(" Part#: {}, Serial#: {}".format(eeprom.part_number_str(), eeprom.serial_number_str())) print(" Base MAC: {}".format(eeprom.base_mac_addr())) diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal.py index 4af8fce144f5..5a8a084cfc7c 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal.py @@ -24,8 +24,9 @@ class Thermal(ThermalBase): ['i2c-0/0-0049/hwmon/', 1]) HWMON_CLASS_DIR = "/sys/class/hwmon/hwmon0/" + AC5X_THERMAL_DIR = "/sys/class/hwmon/hwmon1/" - THERMAL_NAME = ("PCB BACK", "PCB FRONT", "CPU Core") + THERMAL_NAME = ("PCB BACK", "PCB FRONT", "AC5X CORE", "OOB PHY") def __init__(self, thermal_index): ThermalBase.__init__(self) @@ -39,12 +40,19 @@ def __init__(self, thermal_index): if self.index < 3: i2c_path = self.I2C_CLASS_DIR + self.I2C_DEV_MAPPING[self.index - 1][0] sensor_index = self.I2C_DEV_MAPPING[self.index - 1][1] - sensor_high_suffix = None - sensor_high_crit_suffix = "max" + sensor_high_suffix = "max" + sensor_high_crit_suffix = None hwmon_node = os.listdir(i2c_path)[0] self.SENSOR_DIR = i2c_path + hwmon_node + '/' # SOC temperature sensor + elif self.index == 3: + dev_path = self.AC5X_THERMAL_DIR + sensor_index = 1 + sensor_high_suffix = "max" + sensor_high_crit_suffix = None + self.SENSOR_DIR = dev_path + # else: dev_path = self.HWMON_CLASS_DIR sensor_index = 1 diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_actions.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_actions.py index a829fd80a5ba..4dc9b6ab5b48 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_actions.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_actions.py @@ -13,13 +13,17 @@ class SetFanSpeedAction(ThermalPolicyActionBase): # JSON field definition JSON_FIELD_SPEED = 'speed' JSON_FIELD_DEFAULT_SPEED = 'default_speed' + JSON_FIELD_THRESHOLD1_SPEED = 'threshold1_speed' + JSON_FIELD_THRESHOLD2_SPEED = 'threshold2_speed' JSON_FIELD_HIGHTEMP_SPEED = 'hightemp_speed' def __init__(self): """ Constructor of SetFanSpeedAction """ - self.default_speed = 50 + self.default_speed = 25 + self.threshold1_speed=40 + self.threshold2_speed=75 self.hightemp_speed = 100 self.speed = self.default_speed @@ -77,7 +81,9 @@ def load_from_json(self, json_obj): Construct ThermalRecoverAction via JSON. JSON example: { "type": "thermal.temp_check_and_set_all_fan_speed" - "default_speed": "50" + "default_speed": "25", + "threshold1_speed": "40", + "threshold2_speed": "75", "hightemp_speed": "100" } :param json_obj: A JSON object representing a ThermalRecoverAction action. @@ -93,6 +99,26 @@ def load_from_json(self, json_obj): raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'. format(SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED)) + if SetFanSpeedAction.JSON_FIELD_THRESHOLD1_SPEED in json_obj: + threshold1_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_THRESHOLD1_SPEED]) + if threshold1_speed < 0 or threshold1_speed > 100: + raise ValueError('SetFanSpeedAction invalid default speed value {} in JSON policy file, valid value should be [0, 100]'. + format(threshold1_speed)) + self.threshold1_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_THRESHOLD1_SPEED]) + else: + raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'. + format(SetFanSpeedAction.JSON_FIELD_THRESHOLD1_SPEED)) + + if SetFanSpeedAction.JSON_FIELD_THRESHOLD2_SPEED in json_obj: + threshold2_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_THRESHOLD2_SPEED]) + if threshold2_speed < 0 or threshold2_speed > 100: + raise ValueError('SetFanSpeedAction invalid default speed value {} in JSON policy file, valid value should be [0, 100]'. + format(threshold2_speed)) + self.threshold2_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_THRESHOLD2_SPEED]) + else: + raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'. + format(SetFanSpeedAction.JSON_FIELD_THRESHOLD2_SPEED)) + if SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED in json_obj: hightemp_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED]) if hightemp_speed < 0 or hightemp_speed > 100: @@ -103,7 +129,7 @@ def load_from_json(self, json_obj): raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'. format(SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED)) - sonic_logger.log_warning("ThermalRecoverAction: default: {}, hightemp: {}".format(self.default_speed, self.hightemp_speed)) + sonic_logger.log_warning("ThermalRecoverAction: default: {}, threshold1: {}, threshold2: {}, hightemp: {}".format(self.default_speed, self.threshold1_speed, self.threshold2_speed, self.hightemp_speed)) def execute(self, thermal_info_dict): """ @@ -116,9 +142,13 @@ def execute(self, thermal_info_dict): isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo): thermal_info_obj = thermal_info_dict[ThermalInfo.INFO_NAME] - if thermal_info_obj.is_warm_up_and_over_high_threshold(): - ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.hightemp_speed) - elif thermal_info_obj.is_cool_down_and_below_low_threshold(): + if thermal_info_obj.is_set_fan_high_temp_speed(): + ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.hightemp_speed) + elif thermal_info_obj.is_set_fan_threshold_two_speed(): + ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.threshold2_speed) + elif thermal_info_obj.is_set_fan_threshold_one_speed(): + ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.threshold1_speed) + elif thermal_info_obj.is_set_fan_default_speed(): ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.default_speed) diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_infos.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_infos.py index cd0a0591cd2a..cf9b0cdee6de 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_infos.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/thermal_infos.py @@ -1,6 +1,8 @@ from sonic_platform_base.sonic_thermal_control.thermal_info_base import ThermalPolicyInfoBase from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object +from sonic_py_common.logger import Logger +logger = Logger() @thermal_json_object('fan_info') class FanInfo(ThermalPolicyInfoBase): @@ -67,12 +69,17 @@ class ThermalInfo(ThermalPolicyInfoBase): INFO_NAME = 'thermal_info' def __init__(self): - self.init = False - self._old_avg_temp = 0 - self._current_avg_temp = 0 + self._old_threshold_level = -1 + self._current_threshold_level = 0 + self._num_fan_levels = 3 self._high_crital_threshold = 75 - self._high_threshold = 45 - self._low_threshold = 40 + self._level_up_threshold = [[31,39,58,46], + [39,46,65,54], + [51,57,77,68]] + + self._level_down_threshold = [[24,31,47,40], + [31,38,53,46], + [48,54,72,63]] def collect(self, chassis): """ @@ -82,46 +89,84 @@ def collect(self, chassis): """ self._temps = [] self._over_high_critical_threshold = False - self._warm_up_and_over_high_threshold = False - self._cool_down_and_below_low_threshold = False + self._set_fan_default_speed = False + self._set_fan_threshold_one_speed = False + self._set_fan_threshold_two_speed = False + self._set_fan_high_temp_speed = False # Calculate average temp within the device - temp = 0 num_of_thermals = chassis.get_num_thermals() for index in range(num_of_thermals): self._temps.insert(index, chassis.get_thermal(index).get_temperature()) - temp += self._temps[index] + - self._current_avg_temp = temp / num_of_thermals - - # Special case if first time - if self.init is False: - self._old_avg_temp = self._current_avg_temp - self.init = True + # Find current required threshold level + max_level =0 + min_level = [self._num_fan_levels for i in range(num_of_thermals)] + for index in range(num_of_thermals): + for level in range(self._num_fan_levels): + + if self._temps[index]>self._level_up_threshold[level][index]: + if max_levellevel: + min_level[index]=level + + max_of_min_level=max(min_level) + + #compare with running threshold level + if max_of_min_level > self._old_threshold_level: + max_of_min_level=self._old_threshold_level + + self._current_threshold_level = max(max_of_min_level,max_level) + + #set fan to max speed if one fan is down + for fan in chassis.get_all_fans(): + if not fan.get_status() : + self._current_threshold_level = 3 + + # Decide fan speed based on threshold level - # Check if new average temp exceeds high threshold value - if self._current_avg_temp >= self._old_avg_temp and self._current_avg_temp >= self._high_threshold: - self._warm_up_and_over_high_threshold = True + if self._current_threshold_level != self._old_threshold_level: + if self._current_threshold_level == 0: + self._set_fan_default_speed = True + elif self._current_threshold_level == 1: + self._set_fan_threshold_one_speed = True + elif self._current_threshold_level == 2: + self._set_fan_threshold_two_speed = True + elif self._current_threshold_level == 3: + self._set_fan_high_temp_speed = True - # Check if new average temp exceeds low threshold value - if self._current_avg_temp <= self._old_avg_temp and self._current_avg_temp <= self._low_threshold: - self._cool_down_and_below_low_threshold = True + self._old_threshold_level=self._current_threshold_level - self._old_avg_temp = self._current_avg_temp + def is_set_fan_default_speed(self): + """ + Retrieves if the temperature is warm up and over high threshold + :return: True if the temperature is warm up and over high threshold else False + """ + return self._set_fan_default_speed - def is_warm_up_and_over_high_threshold(self): + def is_set_fan_threshold_one_speed(self): """ Retrieves if the temperature is warm up and over high threshold :return: True if the temperature is warm up and over high threshold else False """ - return self._warm_up_and_over_high_threshold + return self._set_fan_threshold_one_speed + + def is_set_fan_threshold_two_speed(self): + """ + Retrieves if the temperature is warm up and over high threshold + :return: True if the temperature is warm up and over high threshold else False + """ + return self._set_fan_threshold_two_speed - def is_cool_down_and_below_low_threshold(self): + def is_set_fan_high_temp_speed(self): """ - Retrieves if the temperature is cold down and below low threshold - :return: True if the temperature is cold down and below low threshold else False + Retrieves if the temperature is warm up and over high threshold + :return: True if the temperature is warm up and over high threshold else False """ - return self._cool_down_and_below_low_threshold + return self._set_fan_high_temp_speed def is_over_high_critical_threshold(self): """ diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/watchdog.py b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/watchdog.py index e351c90fe52e..cf655448d6df 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/watchdog.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/sonic_platform/watchdog.py @@ -11,6 +11,7 @@ from sonic_py_common import logger """ ioctl constants """ +IO_WRITE = 0x40000000 IO_READ = 0x80000000 IO_SIZE_INT = 0x00040000 IO_READ_WRITE = 0xC0000000 @@ -24,6 +25,8 @@ WDIOC_KEEPALIVE = 5 | WDR_INT WDIOC_SETTIMEOUT = 6 | WDWR_INT WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT WDIOC_GETTIMELEFT = 10 | WDR_INT """ Watchdog status constants """ @@ -49,6 +52,7 @@ def __init__(self, wd_device_path): Open a watchdog handle @param wd_device_path Path to watchdog device """ + super(WatchdogImplBase, self).__init__() self.watchdog_path = wd_device_path self.watchdog = os.open(self.watchdog_path, os.O_WRONLY) diff --git a/platform/marvell-arm64/sonic-platform-nokia/7215/utils/sonic_ssd.py b/platform/marvell-arm64/sonic-platform-nokia/7215/utils/sonic_ssd.py index 5065b470867c..563a0b22ce2d 100644 --- a/platform/marvell-arm64/sonic-platform-nokia/7215/utils/sonic_ssd.py +++ b/platform/marvell-arm64/sonic-platform-nokia/7215/utils/sonic_ssd.py @@ -44,6 +44,4 @@ def get_vendor_output(self): return '' def SsdUtil(diskdev): - if os.path.basename(diskdev).startswith('mmcblk'): - return EmmcUtil(diskdev) - return SsdUtilDefault(diskdev) + return EmmcUtil('/dev/mmcblk0') diff --git a/platform/marvell-arm64/sonic_fit.its b/platform/marvell-arm64/sonic_fit.its index b70877b27767..1671dd19ef6c 100644 --- a/platform/marvell-arm64/sonic_fit.its +++ b/platform/marvell-arm64/sonic_fit.its @@ -29,6 +29,17 @@ algo = "sha1"; }; }; + fdt_7215_a1 { + description = "Flattened Device Tree blob for 7215_IXS_A1"; + data = /incbin/("/usr/lib/linux-image-5.10.0-18-2-arm64/marvell/7215-ixs-a1.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x2 0x1000000>; + hash@1 { + algo = "sha1"; + }; + }; ramdisk_ac5x { description = "ramdisk for AC5x"; data = /incbin/("/boot/initrd.img-5.10.0-18-2-arm64"); @@ -54,5 +65,14 @@ algo = "sha1"; }; }; + conf_7215_a1 { + description = "Boot Linux kernel with FDT blob + ramdisk for 7125_IXS_A1"; + kernel = "kernel_ac5x"; + fdt = "fdt_7215_a1"; + ramdisk = "ramdisk_ac5x"; + hash@1 { + algo = "sha1"; + }; + }; }; }; From b23ec06a87fc58d0d60a75e6c390edbf3bcaddc2 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Wed, 2 Aug 2023 14:41:48 -0700 Subject: [PATCH 088/145] add service_mgmt (#15927) Adding yang model for CONFIG_DB table MUX_LINKMGR|SERVICE_MGMT. sign-off: Jing Zhang zhangjing@microsoft.com --- src/sonic-yang-models/doc/Configuration.md | 3 +++ .../tests/files/sample_config_db.json | 3 +++ .../tests/yang_model_tests/tests/mux-linkmgr.json | 3 +++ .../yang_model_tests/tests_config/mux-linkmgr.json | 10 ++++++++++ .../yang-models/sonic-mux-linkmgr.yang | 14 ++++++++++++++ 5 files changed, 33 insertions(+) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 88778c477fb1..9e1f709300dd 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -1449,6 +1449,9 @@ The **MUX_LINKMGR** table is used for dualtor device configuration. }, "MUXLOGGER": { "log_verbosity": "debug" + }, + "SERVICE_MGMT": { + "kill_radv": "True" } } } diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index a709f4490181..1e01dcbdba66 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -2175,6 +2175,9 @@ }, "MUXLOGGER": { "log_verbosity": "debug" + }, + "SERVICE_MGMT": { + "kill_radv": "False" } }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json b/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json index 6358ec5e6ee3..7c4aeadffddc 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/mux-linkmgr.json @@ -7,5 +7,8 @@ }, "MUX_LINKMGR_MUXLOGGER_CHANGE_VERBOSITY_LEVEL": { "desc": "Consume verbosity level config changes. " + }, + "MUX_LINKMGR_SERVICE_MGMT_KILL_RADV_DISABLED": { + "desc": "Disable feature to kill radv." } } \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json index c57a2c297b6c..1feff4f44038 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux-linkmgr.json @@ -32,5 +32,15 @@ } } } + }, + "MUX_LINKMGR_SERVICE_MGMT_KILL_RADV_DISABLED": { + "sonic-mux-linkmgr:sonic-mux-linkmgr": { + "sonic-mux-linkmgr:MUX_LINKMGR": { + "sonic-mux-linkmgr:SERVICE_MGMT": + { + "kill_radv": "False" + } + } + } } } \ No newline at end of file diff --git a/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang b/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang index a310cebf417b..d7b07ed7335b 100644 --- a/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang +++ b/src/sonic-yang-models/yang-models/sonic-mux-linkmgr.yang @@ -98,6 +98,20 @@ module sonic-mux-linkmgr { description "Linkmgrd log verbosity level. "; } } + + container SERVICE_MGMT { + + leaf kill_radv { + type enumeration { + enum True; + enum False; + } + + default True; + + description "Kill radv service instead of gracefully stopping it. "; + } + } } } } \ No newline at end of file From 9a7eb495c2ad04323e5fd2946b62f209a73421f7 Mon Sep 17 00:00:00 2001 From: Ikki Zhu <79439153+qnos@users.noreply.github.com> Date: Thu, 3 Aug 2023 08:20:53 +0800 Subject: [PATCH 089/145] [E1031] add platform specific reboot command support (#15889) * [E1031] add platform specific reboot command support Why I did it E1031: add platform specific cold reboot support How I did it Use the CPLD to trigger board level power cycle when cold reboot How to verify it Do reboot stress test and check the reboot cause history * [E1031] try to umount filesystem before power cycle reboot * [E1031] remove fstrim in customized reboot script --- device/celestica/x86_64-cel_e1031-r0/platform_reboot | 9 +++++++++ .../x86_64-cel_e1031-r0/platform_update_reboot_cause | 8 ++++++++ 2 files changed, 17 insertions(+) create mode 100755 device/celestica/x86_64-cel_e1031-r0/platform_reboot create mode 100755 device/celestica/x86_64-cel_e1031-r0/platform_update_reboot_cause diff --git a/device/celestica/x86_64-cel_e1031-r0/platform_reboot b/device/celestica/x86_64-cel_e1031-r0/platform_reboot new file mode 100755 index 000000000000..3bcaf6a8af09 --- /dev/null +++ b/device/celestica/x86_64-cel_e1031-r0/platform_reboot @@ -0,0 +1,9 @@ +#!/bin/bash + +declare -r CPLD_SETREG_PATH="/sys/bus/platform/devices/e1031.smc/setreg" + +sync ; sync +umount -fa > /dev/null 2&>1 + +# Board level power cycle +echo "0x0113 0xAA" > ${CPLD_SETREG_PATH} diff --git a/device/celestica/x86_64-cel_e1031-r0/platform_update_reboot_cause b/device/celestica/x86_64-cel_e1031-r0/platform_update_reboot_cause new file mode 100755 index 000000000000..9ffb2129c87f --- /dev/null +++ b/device/celestica/x86_64-cel_e1031-r0/platform_update_reboot_cause @@ -0,0 +1,8 @@ +#!/bin/bash + +REBOOT_USER=$(logname) +REBOOT_TIME=$(date) +declare -r REBOOT_CAUSE_FILE="/host/reboot-cause/reboot-cause.txt" + +echo "User issued 'reboot' with platform-specific command [User: ${REBOOT_USER}, Time: ${REBOOT_TIME}]" > ${REBOOT_CAUSE_FILE} +sync From 13f081e92622c47fd4c2e814c74cc42e17b089b0 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 3 Aug 2023 16:32:31 +0800 Subject: [PATCH 090/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#16025) #### Why I did it src/sonic-utilities ``` * cd882cc8 - (HEAD -> master, origin/master, origin/HEAD) Input check for timeout in generate_dump (#2925) (4 hours ago) [ycoheNvidia] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index a56b11b6d075..cd882cc8cefc 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit a56b11b6d0751a56c49d591560f31a8173170707 +Subproject commit cd882cc8cefc2a0e0c6a016d01f20eb482672c5c From 9cc2b2badda586cb88a90ef502dfe81ff6a6c22a Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 3 Aug 2023 16:32:37 +0800 Subject: [PATCH 091/145] [submodule] Update submodule sonic-gnmi to the latest HEAD automatically (#16024) #### Why I did it src/sonic-gnmi ``` * c548cc2 - (HEAD -> master, origin/master, origin/HEAD) Support empty protobytes (#141) (2 hours ago) [ganglv] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-gnmi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-gnmi b/src/sonic-gnmi index 58a7b20b7605..c548cc208862 160000 --- a/src/sonic-gnmi +++ b/src/sonic-gnmi @@ -1 +1 @@ -Subproject commit 58a7b20b760561dd4d1156e1e91d7addc434dc39 +Subproject commit c548cc2088625c6a2ec3d4bea7f41a080f25cb0e From 521a86b2debac8e163c782373c357b258316cc25 Mon Sep 17 00:00:00 2001 From: Vadym Hlushko <62022266+vadymhlushko-mlnx@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:36:58 +0300 Subject: [PATCH 092/145] [Mellanox] Add mlxtrace to techsupport (#15961) - Why I did it Added the fwtrace config files in order to be able to call the mlxstrace utility during the show techsupport dump. Work item tracking Microsoft ADO (number only): - How I did it Added fwtrace config files. Added path to these files to sai.profile for each mlnx device. - How to verify it Execute the show techsupport command and check if mlxstrace output is in system dump. Signed-off-by: vadymhlushko-mlnx --- .../ACS-MSN3420/sai.profile | 1 + .../ACS-MSN3700/sai.profile | 1 + .../ACS-MSN3700C/sai.profile | 1 + .../ACS-MSN3800/sai.profile | 1 + .../Mellanox-SN3800-C64/sai.profile | 1 + .../Mellanox-SN3800-D100C12S2/sai.profile | 3 + .../Mellanox-SN3800-D112C8/sai.profile | 1 + .../Mellanox-SN3800-D24C52/sai.profile | 1 + .../Mellanox-SN3800-D28C49S1/sai.profile | 1 + .../Mellanox-SN3800-D28C50/sai.profile | 1 + .../ACS-MSN4410/sai.profile | 1 + .../ACS-MSN4600/sai.profile | 1 + .../ACS-MSN4600C/sai.profile | 1 + .../Mellanox-SN4600C-C64/sai.profile | 1 + .../Mellanox-SN4600C-D100C12S2/sai.profile | 1 + .../Mellanox-SN4600C-D112C8/sai.profile | 1 + .../Mellanox-SN4600C-D48C40/sai.profile | 1 + .../ACS-MSN4700/sai.profile | 1 + .../Mellanox-SN4700-A96C8V8/sai.profile | 1 + .../Mellanox-SN4700-C128/sai.profile | 1 + .../Mellanox-SN4700-O8C48/sai.profile | 1 + .../Mellanox-SN4700-V48C32/sai.profile | 1 + .../ACS-SN4800/sai.profile | 1 + .../ACS-SN5600/sai.profile | 1 + .../ACS-SN5600/sai.profile | 1 + platform/mellanox/docker-syncd-mlnx.mk | 4 +- platform/mellanox/mft-fwtrace-cfg.dep | 10 + platform/mellanox/mft-fwtrace-cfg.mk | 22 + .../mellanox/mft-fwtrace-cfg/DEBIAN/changelog | 5 + .../mellanox/mft-fwtrace-cfg/DEBIAN/control | 7 + platform/mellanox/mft-fwtrace-cfg/Makefile | 25 + .../mlxtrace_spectrum2_itrace.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc0.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc1.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc2.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc3.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc4.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc5.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc6.cfg.ext | 2570 +++ .../mlxtrace_spectrum2_itrace_irisc7.cfg.ext | 2570 +++ .../mlxtrace_spectrum3_itrace.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc0.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc1.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc2.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc3.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc4.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc5.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc6.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc7.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc8.cfg.ext | 3890 ++++ .../mlxtrace_spectrum3_itrace_irisc9.cfg.ext | 3890 ++++ .../mlxtrace_spectrum4_itrace.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc0.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc1.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc2.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc3.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc4.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc5.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc6.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc7.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc8.cfg.ext | 15814 ++++++++++++++++ .../mlxtrace_spectrum4_itrace_irisc9.cfg.ext | 15814 ++++++++++++++++ platform/mellanox/one-image.mk | 4 +- platform/mellanox/rules.mk | 3 +- 64 files changed, 239976 insertions(+), 5 deletions(-) create mode 100644 platform/mellanox/mft-fwtrace-cfg.dep create mode 100644 platform/mellanox/mft-fwtrace-cfg.mk create mode 100644 platform/mellanox/mft-fwtrace-cfg/DEBIAN/changelog create mode 100755 platform/mellanox/mft-fwtrace-cfg/DEBIAN/control create mode 100644 platform/mellanox/mft-fwtrace-cfg/Makefile create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc0.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc1.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc2.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc3.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc4.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc5.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc6.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc7.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc0.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc1.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc2.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc3.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc4.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc5.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc6.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc7.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc8.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc9.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc0.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc1.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc2.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc3.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc4.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc5.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc6.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc7.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc8.cfg.ext create mode 100644 platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc9.cfg.ext diff --git a/device/mellanox/x86_64-mlnx_msn3420-r0/ACS-MSN3420/sai.profile b/device/mellanox/x86_64-mlnx_msn3420-r0/ACS-MSN3420/sai.profile index 74228eb6446c..9b50bab67670 100644 --- a/device/mellanox/x86_64-mlnx_msn3420-r0/ACS-MSN3420/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3420-r0/ACS-MSN3420/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3420.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/sai.profile b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/sai.profile index a2f615568e59..a040416bf51b 100644 --- a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3700.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3700c-r0/ACS-MSN3700C/sai.profile b/device/mellanox/x86_64-mlnx_msn3700c-r0/ACS-MSN3700C/sai.profile index 21afbfe5c6d3..1b1b4bbe2477 100644 --- a/device/mellanox/x86_64-mlnx_msn3700c-r0/ACS-MSN3700C/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3700c-r0/ACS-MSN3700C/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3700c.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/sai.profile index 9c74ce166084..5fe089467374 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai.profile index 9c74ce166084..5fe089467374 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai.profile index 2d6c6ad4acc8..5a8b32f589b8 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai.profile @@ -1 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_2x10g_100x50g_12x100g.xml +SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps +SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile index 181ced0f1269..a2c98b0402c8 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_112x50g_8x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/sai.profile index 6580208c68de..56d838caad12 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_24x50g_52x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai.profile index bd07d661025d..1e4875e52a2d 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_1x10g_28x50g_49x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile index ef03ceff837e..be194b72c731 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_28x50g_52x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/sai.profile b/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/sai.profile index 1fd5ba39f3af..09cacbed000d 100644 --- a/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4410.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4600-r0/ACS-MSN4600/sai.profile b/device/mellanox/x86_64-mlnx_msn4600-r0/ACS-MSN4600/sai.profile index 8dc29d810f8e..f9d5172456a1 100644 --- a/device/mellanox/x86_64-mlnx_msn4600-r0/ACS-MSN4600/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4600-r0/ACS-MSN4600/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4600.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/ACS-MSN4600C/sai.profile b/device/mellanox/x86_64-mlnx_msn4600c-r0/ACS-MSN4600C/sai.profile index 33f195e4a17f..6dfcaf49bf66 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/ACS-MSN4600C/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/ACS-MSN4600C/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4600C.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/sai.profile b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/sai.profile index 33f195e4a17f..6dfcaf49bf66 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4600C.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D100C12S2/sai.profile b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D100C12S2/sai.profile index 2b9929123105..4987094a5454 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D100C12S2/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D100C12S2/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4600c_100x50g_12x100g_2x10g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D112C8/sai.profile b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D112C8/sai.profile index eef447eba2f4..21d8fe5a9239 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D112C8/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D112C8/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4600c_112x50g_8x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D48C40/sai.profile b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D48C40/sai.profile index c255886841ba..1970e7030832 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D48C40/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-D48C40/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4600c_48x50g_40x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai.profile b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai.profile index c6fb815168fe..8c76d4ca1bbc 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4700.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-A96C8V8/sai.profile b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-A96C8V8/sai.profile index 377656b4ca8f..b90eb55a9ba3 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-A96C8V8/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-A96C8V8/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4700_8x200g_8x100g_96x25g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/sonic/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile index d20b5e46b843..cd04cc332c5d 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4700_128x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/sonic/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-O8C48/sai.profile b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-O8C48/sai.profile index 6834ab76afc0..4fab1773b390 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-O8C48/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-O8C48/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4700_8x400g_48x100g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/sonic/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-V48C32/sai.profile b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-V48C32/sai.profile index 42518df9d9e2..27e1cdad33b5 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-V48C32/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-V48C32/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4700_32x100g_48x200g.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/sonic/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-nvidia_sn4800-r0/ACS-SN4800/sai.profile b/device/mellanox/x86_64-nvidia_sn4800-r0/ACS-SN4800/sai.profile index c00fc21f89c5..2ce406ef0185 100644 --- a/device/mellanox/x86_64-nvidia_sn4800-r0/ACS-SN4800/sai.profile +++ b/device/mellanox/x86_64-nvidia_sn4800-r0/ACS-SN4800/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4800.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-nvidia_sn5600-r0/ACS-SN5600/sai.profile b/device/mellanox/x86_64-nvidia_sn5600-r0/ACS-SN5600/sai.profile index b37ca8c3ed0c..00ef9280e0fe 100644 --- a/device/mellanox/x86_64-nvidia_sn5600-r0/ACS-SN5600/sai.profile +++ b/device/mellanox/x86_64-nvidia_sn5600-r0/ACS-SN5600/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_5600.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai.profile b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai.profile index b37ca8c3ed0c..00ef9280e0fe 100644 --- a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai.profile +++ b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai.profile @@ -1,3 +1,4 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_5600.xml SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps SAI_DUMP_STORE_AMOUNT=10 +SAI_DUMP_MFT_CFG_PATH=/etc/mft/fwtrace_cfg diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index 144a571c308a..678a45fa8b0e 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,7 +19,7 @@ DOCKER_SYNCD_PLATFORM_CODE = mlnx include $(PLATFORM_PATH)/../template/docker-syncd-bullseye.mk -$(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) $(PYTHON_SDK_API) $(MFT) $(IPROUTE2_MLNX) +$(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) $(PYTHON_SDK_API) $(MFT) $(MFT_FWTRACE_CFG) $(IPROUTE2_MLNX) ifeq ($(ENABLE_ASAN), y) $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD_DBG) diff --git a/platform/mellanox/mft-fwtrace-cfg.dep b/platform/mellanox/mft-fwtrace-cfg.dep new file mode 100644 index 000000000000..1dd698e3bb02 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg.dep @@ -0,0 +1,10 @@ +# DPKG FRK + +SPATH := $($(MFT_FWTRACE_CFG)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) $(PLATFORM_PATH)/mft-fwtrace-cfg.mk $(PLATFORM_PATH)/mft-fwtrace-cfg.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files -- $(SPATH)) + +$(MFT_FWTRACE_CFG)_CACHE_MODE := GIT_CONTENT_SHA +$(MFT_FWTRACE_CFG)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(MFT_FWTRACE_CFG)_DEP_FILES := $(DEP_FILES) diff --git a/platform/mellanox/mft-fwtrace-cfg.mk b/platform/mellanox/mft-fwtrace-cfg.mk new file mode 100644 index 000000000000..9857fb063b5e --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg.mk @@ -0,0 +1,22 @@ +# +# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# 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. +# + +MFT_FWTRACE_CFG = mft-fwtrace-cfg-$(MFT_VERSION)-$(MFT_REVISION).deb +$(MFT_FWTRACE_CFG)_SRC_PATH = $(PLATFORM_PATH)/mft-fwtrace-cfg +SONIC_MAKE_DEBS += $(MFT_FWTRACE_CFG) + +export MFT_FWTRACE_CFG diff --git a/platform/mellanox/mft-fwtrace-cfg/DEBIAN/changelog b/platform/mellanox/mft-fwtrace-cfg/DEBIAN/changelog new file mode 100644 index 000000000000..d4bd60ef10ee --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/DEBIAN/changelog @@ -0,0 +1,5 @@ +mft-fwtrace-cfg (1.0.0) STABLE; urgency=low + + * Initial release. + + -- Vadym Hlushko Mon, 24 Jul 2023 12:03:04 +0300 diff --git a/platform/mellanox/mft-fwtrace-cfg/DEBIAN/control b/platform/mellanox/mft-fwtrace-cfg/DEBIAN/control new file mode 100755 index 000000000000..f71a8c72a5a9 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/DEBIAN/control @@ -0,0 +1,7 @@ +Package: mft-fwtrace-cfg +Version: 1.0.0 +Section: utils +Priority: optional +Architecture: all +Maintainer: Vadym Hlushko +Description: fwtrace_cfg files for the mlxtrace utility from the MFT debian package diff --git a/platform/mellanox/mft-fwtrace-cfg/Makefile b/platform/mellanox/mft-fwtrace-cfg/Makefile new file mode 100644 index 000000000000..2862042174b5 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/Makefile @@ -0,0 +1,25 @@ +# +# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# 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. +# +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = $(MFT_FWTRACE_CFG) + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + dpkg -b . $(MAIN_TARGET) + mv $(MAIN_TARGET) $(DEST)/ diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace.cfg.ext new file mode 100644 index 000000000000..99e9445e4925 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 1 +OP4 ITRACE1 1 +OP4 ITRACE2 1 +OP4 ITRACE3 1 +OP4 ITRACE4 1 +OP4 ITRACE5 1 +OP4 ITRACE6 1 +OP4 ITRACE7 1 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc0.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc0.cfg.ext new file mode 100644 index 000000000000..24f8a91a7276 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc0.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 1 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc1.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc1.cfg.ext new file mode 100644 index 000000000000..f5df804d8285 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc1.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 0 +OP4 ITRACE1 1 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc2.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc2.cfg.ext new file mode 100644 index 000000000000..e7edd0795752 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc2.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 1 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc3.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc3.cfg.ext new file mode 100644 index 000000000000..044a59991f94 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc3.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 1 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc4.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc4.cfg.ext new file mode 100644 index 000000000000..11e1a14745c0 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc4.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 1 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc5.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc5.cfg.ext new file mode 100644 index 000000000000..c70f5e004b18 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc5.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 1 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc6.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc6.cfg.ext new file mode 100644 index 000000000000..0cfac0813957 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc6.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 1 +OP4 ITRACE7 0 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc7.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc7.cfg.ext new file mode 100644 index 000000000000..573ca052cbb5 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum2_itrace_irisc7.cfg.ext @@ -0,0 +1,2570 @@ +OP1 Spectrum2 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 1 +OP4 Main_PhyUC 0 +OP4 E00009 0 +OP4 E0000A 0 +OP4 E0000B 0 +OP4 E0000C 0 +OP4 E0000D 0 +OP4 E0000E 0 +OP4 E0000F 0 +OP4 E00010 0 +OP4 E00011 0 +OP4 E00012 0 +OP4 E00013 0 +OP4 E00014 0 +OP4 E00015 0 +OP4 E00016 0 +OP4 E00017 0 +OP4 E00018 0 +OP4 E00019 0 +OP4 E0001A 0 +OP4 E0001B 0 +OP4 E0001C 0 +OP4 E0001D 0 +OP4 E0001E 0 +OP4 E0001F 0 +OP4 E00020 0 +OP4 E00021 0 +OP4 E00022 0 +OP4 E00023 0 +OP4 E00024 0 +OP4 E00025 0 +OP4 E00026 0 +OP4 E00027 0 +OP4 E00028 0 +OP4 E00029 0 +OP4 E0002A 0 +OP4 E0002B 0 +OP4 E0002C 0 +OP4 E0002D 0 +OP4 E0002E 0 +OP4 E0002F 0 +OP4 E00030 0 +OP4 E00031 0 +OP4 E00032 0 +OP4 E00033 0 +OP4 E00034 0 +OP4 E00035 0 +OP4 E00036 0 +OP4 E00037 0 +OP4 E00038 0 +OP4 E00039 0 +OP4 E0003A 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace.cfg.ext new file mode 100644 index 000000000000..14ee84c82970 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 1 +OP4 ITRACE1 1 +OP4 ITRACE2 1 +OP4 ITRACE3 1 +OP4 ITRACE4 1 +OP4 ITRACE5 1 +OP4 ITRACE6 1 +OP4 ITRACE7 1 +OP4 ITRACE8 1 +OP4 ITRACE9 1 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc0.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc0.cfg.ext new file mode 100644 index 000000000000..c64287d78034 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc0.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 1 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc1.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc1.cfg.ext new file mode 100644 index 000000000000..130a610a7e93 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc1.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 1 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc2.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc2.cfg.ext new file mode 100644 index 000000000000..6133ffb67640 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc2.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 1 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc3.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc3.cfg.ext new file mode 100644 index 000000000000..0527209426d8 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc3.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 1 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc4.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc4.cfg.ext new file mode 100644 index 000000000000..a8b034cbfef4 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc4.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 1 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc5.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc5.cfg.ext new file mode 100644 index 000000000000..0b5c4434a32f --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc5.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 1 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc6.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc6.cfg.ext new file mode 100644 index 000000000000..7b8d3a5a33fc --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc6.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 1 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc7.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc7.cfg.ext new file mode 100644 index 000000000000..a6384fecb728 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc7.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 1 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc8.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc8.cfg.ext new file mode 100644 index 000000000000..2b7751023c6a --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc8.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 1 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc9.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc9.cfg.ext new file mode 100644 index 000000000000..8ff37d42e8e8 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum3_itrace_irisc9.cfg.ext @@ -0,0 +1,3890 @@ +OP1 Spectrum3 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 1 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace.cfg.ext new file mode 100644 index 000000000000..ab21020d6f4e --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 1 +OP4 ITRACE1 1 +OP4 ITRACE2 1 +OP4 ITRACE3 1 +OP4 ITRACE4 1 +OP4 ITRACE5 1 +OP4 ITRACE6 1 +OP4 ITRACE7 1 +OP4 ITRACE8 1 +OP4 ITRACE9 1 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc0.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc0.cfg.ext new file mode 100644 index 000000000000..9c46e5549906 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc0.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 1 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc1.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc1.cfg.ext new file mode 100644 index 000000000000..161041664e5c --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc1.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 1 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc2.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc2.cfg.ext new file mode 100644 index 000000000000..c5b04f09a951 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc2.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 1 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc3.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc3.cfg.ext new file mode 100644 index 000000000000..f709219258b2 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc3.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 1 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc4.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc4.cfg.ext new file mode 100644 index 000000000000..d5d67c815a76 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc4.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 1 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc5.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc5.cfg.ext new file mode 100644 index 000000000000..c966914c6de0 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc5.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 1 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc6.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc6.cfg.ext new file mode 100644 index 000000000000..5c1cfe1e8b9b --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc6.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 1 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc7.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc7.cfg.ext new file mode 100644 index 000000000000..e7485ae3a586 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc7.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 1 +OP4 ITRACE8 0 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc8.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc8.cfg.ext new file mode 100644 index 000000000000..0f40a4ae74f1 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc8.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 1 +OP4 ITRACE9 0 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc9.cfg.ext b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc9.cfg.ext new file mode 100644 index 000000000000..a7aa8b4515d0 --- /dev/null +++ b/platform/mellanox/mft-fwtrace-cfg/etc/mft/fwtrace_cfg/mlxtrace_spectrum4_itrace_irisc9.cfg.ext @@ -0,0 +1,15814 @@ +OP1 Spectrum4 +OP4 ITRACE0 0 +OP4 ITRACE1 0 +OP4 ITRACE2 0 +OP4 ITRACE3 0 +OP4 ITRACE4 0 +OP4 ITRACE5 0 +OP4 ITRACE6 0 +OP4 ITRACE7 0 +OP4 ITRACE8 0 +OP4 ITRACE9 1 +OP4 Main_PhyUC 0 +OP4 TILE0_ITRACE0 0 +OP4 TILE0_ITRACE1 0 +OP4 TILE0_ITRACE2 0 +OP4 TILE0_ITRACE3 0 +OP4 TILE0_ITRACE4 0 +OP4 TILE0_PhyUC 0 +OP4 TILE1_ITRACE0 0 +OP4 TILE1_ITRACE1 0 +OP4 TILE1_ITRACE2 0 +OP4 TILE1_ITRACE3 0 +OP4 TILE1_ITRACE4 0 +OP4 TILE1_PhyUC 0 +OP4 TILE2_ITRACE0 0 +OP4 TILE2_ITRACE1 0 +OP4 TILE2_ITRACE2 0 +OP4 TILE2_ITRACE3 0 +OP4 TILE2_ITRACE4 0 +OP4 TILE2_PhyUC 0 +OP4 TILE3_ITRACE0 0 +OP4 TILE3_ITRACE1 0 +OP4 TILE3_ITRACE2 0 +OP4 TILE3_ITRACE3 0 +OP4 TILE3_ITRACE4 0 +OP4 TILE3_PhyUC 0 +OP4 TILE4_ITRACE0 0 +OP4 TILE4_ITRACE1 0 +OP4 TILE4_ITRACE2 0 +OP4 TILE4_ITRACE3 0 +OP4 TILE4_ITRACE4 0 +OP4 TILE4_PhyUC 0 +OP4 TILE5_ITRACE0 0 +OP4 TILE5_ITRACE1 0 +OP4 TILE5_ITRACE2 0 +OP4 TILE5_ITRACE3 0 +OP4 TILE5_ITRACE4 0 +OP4 TILE5_PhyUC 0 +OP4 TILE6_ITRACE0 0 +OP4 TILE6_ITRACE1 0 +OP4 TILE6_ITRACE2 0 +OP4 TILE6_ITRACE3 0 +OP4 TILE6_ITRACE4 0 +OP4 TILE6_PhyUC 0 +OP4 TILE7_ITRACE0 0 +OP4 TILE7_ITRACE1 0 +OP4 TILE7_ITRACE2 0 +OP4 TILE7_ITRACE3 0 +OP4 TILE7_ITRACE4 0 +OP4 TILE7_PhyUC 0 +OP4 E0003B 0 +OP4 E0003C 0 +OP4 E0003D 0 +OP4 E0003E 0 +OP4 E0003F 0 +OP4 E00040 0 +OP4 E00041 0 +OP4 E00042 0 +OP4 E00043 0 +OP4 E00044 0 +OP4 E00045 0 +OP4 E00046 0 +OP4 E00047 0 +OP4 E00048 0 +OP4 E00049 0 +OP4 E0004A 0 +OP4 E0004B 0 +OP4 E0004C 0 +OP4 E0004D 0 +OP4 E0004E 0 +OP4 E0004F 0 +OP4 E00050 0 +OP4 E00051 0 +OP4 E00052 0 +OP4 E00053 0 +OP4 E00054 0 +OP4 E00055 0 +OP4 E00056 0 +OP4 E00057 0 +OP4 E00058 0 +OP4 E00059 0 +OP4 E0005A 0 +OP4 E0005B 0 +OP4 E0005C 0 +OP4 E0005D 0 +OP4 E0005E 0 +OP4 E0005F 0 +OP4 E00060 0 +OP4 E00061 0 +OP4 E00062 0 +OP4 E00063 0 +OP4 E00064 0 +OP4 E00065 0 +OP4 E00066 0 +OP4 E00067 0 +OP4 E00068 0 +OP4 E00069 0 +OP4 E0006A 0 +OP4 E0006B 0 +OP4 E0006C 0 +OP4 E0006D 0 +OP4 E0006E 0 +OP4 E0006F 0 +OP4 E00070 0 +OP4 E00071 0 +OP4 E00072 0 +OP4 E00073 0 +OP4 E00074 0 +OP4 E00075 0 +OP4 E00076 0 +OP4 E00077 0 +OP4 E00078 0 +OP4 E00079 0 +OP4 E0007A 0 +OP4 E0007B 0 +OP4 E0007C 0 +OP4 E0007D 0 +OP4 E0007E 0 +OP4 E0007F 0 +OP4 E00080 0 +OP4 E00081 0 +OP4 E00082 0 +OP4 E00083 0 +OP4 E00084 0 +OP4 E00085 0 +OP4 E00086 0 +OP4 E00087 0 +OP4 E00088 0 +OP4 E00089 0 +OP4 E0008A 0 +OP4 E0008B 0 +OP4 E0008C 0 +OP4 E0008D 0 +OP4 E0008E 0 +OP4 E0008F 0 +OP4 E00090 0 +OP4 E00091 0 +OP4 E00092 0 +OP4 E00093 0 +OP4 E00094 0 +OP4 E00095 0 +OP4 E00096 0 +OP4 E00097 0 +OP4 E00098 0 +OP4 E00099 0 +OP4 E0009A 0 +OP4 E0009B 0 +OP4 E0009C 0 +OP4 E0009D 0 +OP4 E0009E 0 +OP4 E0009F 0 +OP4 E000A0 0 +OP4 E000A1 0 +OP4 E000A2 0 +OP4 E000A3 0 +OP4 E000A4 0 +OP4 E000A5 0 +OP4 E000A6 0 +OP4 E000A7 0 +OP4 E000A8 0 +OP4 E000A9 0 +OP4 E000AA 0 +OP4 E000AB 0 +OP4 E000AC 0 +OP4 E000AD 0 +OP4 E000AE 0 +OP4 E000AF 0 +OP4 E000B0 0 +OP4 E000B1 0 +OP4 E000B2 0 +OP4 E000B3 0 +OP4 E000B4 0 +OP4 E000B5 0 +OP4 E000B6 0 +OP4 E000B7 0 +OP4 E000B8 0 +OP4 E000B9 0 +OP4 E000BA 0 +OP4 E000BB 0 +OP4 E000BC 0 +OP4 E000BD 0 +OP4 E000BE 0 +OP4 E000BF 0 +OP4 E000C0 0 +OP4 E000C1 0 +OP4 E000C2 0 +OP4 E000C3 0 +OP4 E000C4 0 +OP4 E000C5 0 +OP4 E000C6 0 +OP4 E000C7 0 +OP4 E000C8 0 +OP4 E000C9 0 +OP4 E000CA 0 +OP4 E000CB 0 +OP4 E000CC 0 +OP4 E000CD 0 +OP4 E000CE 0 +OP4 E000CF 0 +OP4 E000D0 0 +OP4 E000D1 0 +OP4 E000D2 0 +OP4 E000D3 0 +OP4 E000D4 0 +OP4 E000D5 0 +OP4 E000D6 0 +OP4 E000D7 0 +OP4 E000D8 0 +OP4 E000D9 0 +OP4 E000DA 0 +OP4 E000DB 0 +OP4 E000DC 0 +OP4 E000DD 0 +OP4 E000DE 0 +OP4 E000DF 0 +OP4 E000E0 0 +OP4 E000E1 0 +OP4 E000E2 0 +OP4 E000E3 0 +OP4 E000E4 0 +OP4 E000E5 0 +OP4 E000E6 0 +OP4 E000E7 0 +OP4 E000E8 0 +OP4 E000E9 0 +OP4 E000EA 0 +OP4 E000EB 0 +OP4 E000EC 0 +OP4 E000ED 0 +OP4 E000EE 0 +OP4 E000EF 0 +OP4 E000F0 0 +OP4 E000F1 0 +OP4 E000F2 0 +OP4 E000F3 0 +OP4 E000F4 0 +OP4 E000F5 0 +OP4 E000F6 0 +OP4 E000F7 0 +OP4 E000F8 0 +OP4 E000F9 0 +OP4 E000FA 0 +OP4 E000FB 0 +OP4 E000FC 0 +OP4 E000FD 0 +OP4 E000FE 0 +OP4 E000FF 0 +OP4 E00100 0 +OP4 E00101 0 +OP4 E00102 0 +OP4 E00103 0 +OP4 E00104 0 +OP4 E00105 0 +OP4 E00106 0 +OP4 E00107 0 +OP4 E00108 0 +OP4 E00109 0 +OP4 E0010A 0 +OP4 E0010B 0 +OP4 E0010C 0 +OP4 E0010D 0 +OP4 E0010E 0 +OP4 E0010F 0 +OP4 E00110 0 +OP4 E00111 0 +OP4 E00112 0 +OP4 E00113 0 +OP4 E00114 0 +OP4 E00115 0 +OP4 E00116 0 +OP4 E00117 0 +OP4 E00118 0 +OP4 E00119 0 +OP4 E0011A 0 +OP4 E0011B 0 +OP4 E0011C 0 +OP4 E0011D 0 +OP4 E0011E 0 +OP4 E0011F 0 +OP4 E00120 0 +OP4 E00121 0 +OP4 E00122 0 +OP4 E00123 0 +OP4 E00124 0 +OP4 E00125 0 +OP4 E00126 0 +OP4 E00127 0 +OP4 E00128 0 +OP4 E00129 0 +OP4 E0012A 0 +OP4 E0012B 0 +OP4 E0012C 0 +OP4 E0012D 0 +OP4 E0012E 0 +OP4 E0012F 0 +OP4 E00130 0 +OP4 E00131 0 +OP4 E00132 0 +OP4 E00133 0 +OP4 E00134 0 +OP4 E00135 0 +OP4 E00136 0 +OP4 E00137 0 +OP4 E00138 0 +OP4 E00139 0 +OP4 E0013A 0 +OP4 E0013B 0 +OP4 E0013C 0 +OP4 E0013D 0 +OP4 E0013E 0 +OP4 E0013F 0 +OP4 E00140 0 +OP4 E00141 0 +OP4 E00142 0 +OP4 E00143 0 +OP4 E00144 0 +OP4 E00145 0 +OP4 E00146 0 +OP4 E00147 0 +OP4 E00148 0 +OP4 E00149 0 +OP4 E0014A 0 +OP4 E0014B 0 +OP4 E0014C 0 +OP4 E0014D 0 +OP4 E0014E 0 +OP4 E0014F 0 +OP4 E00150 0 +OP4 E00151 0 +OP4 E00152 0 +OP4 E00153 0 +OP4 E00154 0 +OP4 E00155 0 +OP4 E00156 0 +OP4 E00157 0 +OP4 E00158 0 +OP4 E00159 0 +OP4 E0015A 0 +OP4 E0015B 0 +OP4 E0015C 0 +OP4 E0015D 0 +OP4 E0015E 0 +OP4 E0015F 0 +OP4 E00160 0 +OP4 E00161 0 +OP4 E00162 0 +OP4 E00163 0 +OP4 E00164 0 +OP4 E00165 0 +OP4 E00166 0 +OP4 E00167 0 +OP4 E00168 0 +OP4 E00169 0 +OP4 E0016A 0 +OP4 E0016B 0 +OP4 E0016C 0 +OP4 E0016D 0 +OP4 E0016E 0 +OP4 E0016F 0 +OP4 E00170 0 +OP4 E00171 0 +OP4 E00172 0 +OP4 E00173 0 +OP4 E00174 0 +OP4 E00175 0 +OP4 E00176 0 +OP4 E00177 0 +OP4 E00178 0 +OP4 E00179 0 +OP4 E0017A 0 +OP4 E0017B 0 +OP4 E0017C 0 +OP4 E0017D 0 +OP4 E0017E 0 +OP4 E0017F 0 +OP4 E00180 0 +OP4 E00181 0 +OP4 E00182 0 +OP4 E00183 0 +OP4 E00184 0 +OP4 E00185 0 +OP4 E00186 0 +OP4 E00187 0 +OP4 E00188 0 +OP4 E00189 0 +OP4 E0018A 0 +OP4 E0018B 0 +OP4 E0018C 0 +OP4 E0018D 0 +OP4 E0018E 0 +OP4 E0018F 0 +OP4 E00190 0 +OP4 E00191 0 +OP4 E00192 0 +OP4 E00193 0 +OP4 E00194 0 +OP4 E00195 0 +OP4 E00196 0 +OP4 E00197 0 +OP4 E00198 0 +OP4 E00199 0 +OP4 E0019A 0 +OP4 E0019B 0 +OP4 E0019C 0 +OP4 E0019D 0 +OP4 E0019E 0 +OP4 E0019F 0 +OP4 E001A0 0 +OP4 E001A1 0 +OP4 E001A2 0 +OP4 E001A3 0 +OP4 E001A4 0 +OP4 E001A5 0 +OP4 E001A6 0 +OP4 E001A7 0 +OP4 E001A8 0 +OP4 E001A9 0 +OP4 E001AA 0 +OP4 E001AB 0 +OP4 E001AC 0 +OP4 E001AD 0 +OP4 E001AE 0 +OP4 E001AF 0 +OP4 E001B0 0 +OP4 E001B1 0 +OP4 E001B2 0 +OP4 E001B3 0 +OP4 E001B4 0 +OP4 E001B5 0 +OP4 E001B6 0 +OP4 E001B7 0 +OP4 E001B8 0 +OP4 E001B9 0 +OP4 E001BA 0 +OP4 E001BB 0 +OP4 E001BC 0 +OP4 E001BD 0 +OP4 E001BE 0 +OP4 E001BF 0 +OP4 E001C0 0 +OP4 E001C1 0 +OP4 E001C2 0 +OP4 E001C3 0 +OP4 E001C4 0 +OP4 E001C5 0 +OP4 E001C6 0 +OP4 E001C7 0 +OP4 E001C8 0 +OP4 E001C9 0 +OP4 E001CA 0 +OP4 E001CB 0 +OP4 E001CC 0 +OP4 E001CD 0 +OP4 E001CE 0 +OP4 E001CF 0 +OP4 E001D0 0 +OP4 E001D1 0 +OP4 E001D2 0 +OP4 E001D3 0 +OP4 E001D4 0 +OP4 E001D5 0 +OP4 E001D6 0 +OP4 E001D7 0 +OP4 E001D8 0 +OP4 E001D9 0 +OP4 E001DA 0 +OP4 E001DB 0 +OP4 E001DC 0 +OP4 E001DD 0 +OP4 E001DE 0 +OP4 E001DF 0 +OP4 E001E0 0 +OP4 E001E1 0 +OP4 E001E2 0 +OP4 E001E3 0 +OP4 E001E4 0 +OP4 E001E5 0 +OP4 E001E6 0 +OP4 E001E7 0 +OP4 E001E8 0 +OP4 E001E9 0 +OP4 E001EA 0 +OP4 E001EB 0 +OP4 E001EC 0 +OP4 E001ED 0 +OP4 E001EE 0 +OP4 E001EF 0 +OP4 E001F0 0 +OP4 E001F1 0 +OP4 E001F2 0 +OP4 E001F3 0 +OP4 E001F4 0 +OP4 E001F5 0 +OP4 E001F6 0 +OP4 E001F7 0 +OP4 E001F8 0 +OP4 E001F9 0 +OP4 E001FA 0 +OP4 E001FB 0 +OP4 E001FC 0 +OP4 E001FD 0 +OP4 E001FE 0 +OP4 E001FF 0 +OP4 E00200 0 +OP4 E00201 0 +OP4 E00202 0 +OP4 E00203 0 +OP4 E00204 0 +OP4 E00205 0 +OP4 E00206 0 +OP4 E00207 0 +OP4 E00208 0 +OP4 E00209 0 +OP4 E0020A 0 +OP4 E0020B 0 +OP4 E0020C 0 +OP4 E0020D 0 +OP4 E0020E 0 +OP4 E0020F 0 +OP4 E00210 0 +OP4 E00211 0 +OP4 E00212 0 +OP4 E00213 0 +OP4 E00214 0 +OP4 E00215 0 +OP4 E00216 0 +OP4 E00217 0 +OP4 E00218 0 +OP4 E00219 0 +OP4 E0021A 0 +OP4 E0021B 0 +OP4 E0021C 0 +OP4 E0021D 0 +OP4 E0021E 0 +OP4 E0021F 0 +OP4 E00220 0 +OP4 E00221 0 +OP4 E00222 0 +OP4 E00223 0 +OP4 E00224 0 +OP4 E00225 0 +OP4 E00226 0 +OP4 E00227 0 +OP4 E00228 0 +OP4 E00229 0 +OP4 E0022A 0 +OP4 E0022B 0 +OP4 E0022C 0 +OP4 E0022D 0 +OP4 E0022E 0 +OP4 E0022F 0 +OP4 E00230 0 +OP4 E00231 0 +OP4 E00232 0 +OP4 E00233 0 +OP4 E00234 0 +OP4 E00235 0 +OP4 E00236 0 +OP4 E00237 0 +OP4 E00238 0 +OP4 E00239 0 +OP4 E0023A 0 +OP4 E0023B 0 +OP4 E0023C 0 +OP4 E0023D 0 +OP4 E0023E 0 +OP4 E0023F 0 +OP4 E00240 0 +OP4 E00241 0 +OP4 E00242 0 +OP4 E00243 0 +OP4 E00244 0 +OP4 E00245 0 +OP4 E00246 0 +OP4 E00247 0 +OP4 E00248 0 +OP4 E00249 0 +OP4 E0024A 0 +OP4 E0024B 0 +OP4 E0024C 0 +OP4 E0024D 0 +OP4 E0024E 0 +OP4 E0024F 0 +OP4 E00250 0 +OP4 E00251 0 +OP4 E00252 0 +OP4 E00253 0 +OP4 E00254 0 +OP4 E00255 0 +OP4 E00256 0 +OP4 E00257 0 +OP4 E00258 0 +OP4 E00259 0 +OP4 E0025A 0 +OP4 E0025B 0 +OP4 E0025C 0 +OP4 E0025D 0 +OP4 E0025E 0 +OP4 E0025F 0 +OP4 E00260 0 +OP4 E00261 0 +OP4 E00262 0 +OP4 E00263 0 +OP4 E00264 0 +OP4 E00265 0 +OP4 E00266 0 +OP4 E00267 0 +OP4 E00268 0 +OP4 E00269 0 +OP4 E0026A 0 +OP4 E0026B 0 +OP4 E0026C 0 +OP4 E0026D 0 +OP4 E0026E 0 +OP4 E0026F 0 +OP4 E00270 0 +OP4 E00271 0 +OP4 E00272 0 +OP4 E00273 0 +OP4 E00274 0 +OP4 E00275 0 +OP4 E00276 0 +OP4 E00277 0 +OP4 E00278 0 +OP4 E00279 0 +OP4 E0027A 0 +OP4 E0027B 0 +OP4 E0027C 0 +OP4 E0027D 0 +OP4 E0027E 0 +OP4 E0027F 0 +OP4 E00280 0 +OP4 E00281 0 +OP4 E00282 0 +OP4 E00283 0 +OP4 E00284 0 +OP4 E00285 0 +OP4 E00286 0 +OP4 E00287 0 +OP4 E00288 0 +OP4 E00289 0 +OP4 E0028A 0 +OP4 E0028B 0 +OP4 E0028C 0 +OP4 E0028D 0 +OP4 E0028E 0 +OP4 E0028F 0 +OP4 E00290 0 +OP4 E00291 0 +OP4 E00292 0 +OP4 E00293 0 +OP4 E00294 0 +OP4 E00295 0 +OP4 E00296 0 +OP4 E00297 0 +OP4 E00298 0 +OP4 E00299 0 +OP4 E0029A 0 +OP4 E0029B 0 +OP4 E0029C 0 +OP4 E0029D 0 +OP4 E0029E 0 +OP4 E0029F 0 +OP4 E002A0 0 +OP4 E002A1 0 +OP4 E002A2 0 +OP4 E002A3 0 +OP4 E002A4 0 +OP4 E002A5 0 +OP4 E002A6 0 +OP4 E002A7 0 +OP4 E002A8 0 +OP4 E002A9 0 +OP4 E002AA 0 +OP4 E002AB 0 +OP4 E002AC 0 +OP4 E002AD 0 +OP4 E002AE 0 +OP4 E002AF 0 +OP4 E002B0 0 +OP4 E002B1 0 +OP4 E002B2 0 +OP4 E002B3 0 +OP4 E002B4 0 +OP4 E002B5 0 +OP4 E002B6 0 +OP4 E002B7 0 +OP4 E002B8 0 +OP4 E002B9 0 +OP4 E002BA 0 +OP4 E002BB 0 +OP4 E002BC 0 +OP4 E002BD 0 +OP4 E002BE 0 +OP4 E002BF 0 +OP4 E002C0 0 +OP4 E002C1 0 +OP4 E002C2 0 +OP4 E002C3 0 +OP4 E002C4 0 +OP4 E002C5 0 +OP4 E002C6 0 +OP4 E002C7 0 +OP4 E002C8 0 +OP4 E002C9 0 +OP4 E002CA 0 +OP4 E002CB 0 +OP4 E002CC 0 +OP4 E002CD 0 +OP4 E002CE 0 +OP4 E002CF 0 +OP4 E002D0 0 +OP4 E002D1 0 +OP4 E002D2 0 +OP4 E002D3 0 +OP4 E002D4 0 +OP4 E002D5 0 +OP4 E002D6 0 +OP4 E002D7 0 +OP4 E002D8 0 +OP4 E002D9 0 +OP4 E002DA 0 +OP4 E002DB 0 +OP4 E002DC 0 +OP4 E002DD 0 +OP4 E002DE 0 +OP4 E002DF 0 +OP4 E002E0 0 +OP4 E002E1 0 +OP4 E002E2 0 +OP4 E002E3 0 +OP4 E002E4 0 +OP4 E002E5 0 +OP4 E002E6 0 +OP4 E002E7 0 +OP4 E002E8 0 +OP4 E002E9 0 +OP4 E002EA 0 +OP4 E002EB 0 +OP4 E002EC 0 +OP4 E002ED 0 +OP4 E002EE 0 +OP4 E002EF 0 +OP4 E002F0 0 +OP4 E002F1 0 +OP4 E002F2 0 +OP4 E002F3 0 +OP4 E002F4 0 +OP4 E002F5 0 +OP4 E002F6 0 +OP4 E002F7 0 +OP4 E002F8 0 +OP4 E002F9 0 +OP4 E002FA 0 +OP4 E002FB 0 +OP4 E002FC 0 +OP4 E002FD 0 +OP4 E002FE 0 +OP4 E002FF 0 +OP4 E00300 0 +OP4 E00301 0 +OP4 E00302 0 +OP4 E00303 0 +OP4 E00304 0 +OP4 E00305 0 +OP4 E00306 0 +OP4 E00307 0 +OP4 E00308 0 +OP4 E00309 0 +OP4 E0030A 0 +OP4 E0030B 0 +OP4 E0030C 0 +OP4 E0030D 0 +OP4 E0030E 0 +OP4 E0030F 0 +OP4 E00310 0 +OP4 E00311 0 +OP4 E00312 0 +OP4 E00313 0 +OP4 E00314 0 +OP4 E00315 0 +OP4 E00316 0 +OP4 E00317 0 +OP4 E00318 0 +OP4 E00319 0 +OP4 E0031A 0 +OP4 E0031B 0 +OP4 E0031C 0 +OP4 E0031D 0 +OP4 E0031E 0 +OP4 E0031F 0 +OP4 E00320 0 +OP4 E00321 0 +OP4 E00322 0 +OP4 E00323 0 +OP4 E00324 0 +OP4 E00325 0 +OP4 E00326 0 +OP4 E00327 0 +OP4 E00328 0 +OP4 E00329 0 +OP4 E0032A 0 +OP4 E0032B 0 +OP4 E0032C 0 +OP4 E0032D 0 +OP4 E0032E 0 +OP4 E0032F 0 +OP4 E00330 0 +OP4 E00331 0 +OP4 E00332 0 +OP4 E00333 0 +OP4 E00334 0 +OP4 E00335 0 +OP4 E00336 0 +OP4 E00337 0 +OP4 E00338 0 +OP4 E00339 0 +OP4 E0033A 0 +OP4 E0033B 0 +OP4 E0033C 0 +OP4 E0033D 0 +OP4 E0033E 0 +OP4 E0033F 0 +OP4 E00340 0 +OP4 E00341 0 +OP4 E00342 0 +OP4 E00343 0 +OP4 E00344 0 +OP4 E00345 0 +OP4 E00346 0 +OP4 E00347 0 +OP4 E00348 0 +OP4 E00349 0 +OP4 E0034A 0 +OP4 E0034B 0 +OP4 E0034C 0 +OP4 E0034D 0 +OP4 E0034E 0 +OP4 E0034F 0 +OP4 E00350 0 +OP4 E00351 0 +OP4 E00352 0 +OP4 E00353 0 +OP4 E00354 0 +OP4 E00355 0 +OP4 E00356 0 +OP4 E00357 0 +OP4 E00358 0 +OP4 E00359 0 +OP4 E0035A 0 +OP4 E0035B 0 +OP4 E0035C 0 +OP4 E0035D 0 +OP4 E0035E 0 +OP4 E0035F 0 +OP4 E00360 0 +OP4 E00361 0 +OP4 E00362 0 +OP4 E00363 0 +OP4 E00364 0 +OP4 E00365 0 +OP4 E00366 0 +OP4 E00367 0 +OP4 E00368 0 +OP4 E00369 0 +OP4 E0036A 0 +OP4 E0036B 0 +OP4 E0036C 0 +OP4 E0036D 0 +OP4 E0036E 0 +OP4 E0036F 0 +OP4 E00370 0 +OP4 E00371 0 +OP4 E00372 0 +OP4 E00373 0 +OP4 E00374 0 +OP4 E00375 0 +OP4 E00376 0 +OP4 E00377 0 +OP4 E00378 0 +OP4 E00379 0 +OP4 E0037A 0 +OP4 E0037B 0 +OP4 E0037C 0 +OP4 E0037D 0 +OP4 E0037E 0 +OP4 E0037F 0 +OP4 E00380 0 +OP4 E00381 0 +OP4 E00382 0 +OP4 E00383 0 +OP4 E00384 0 +OP4 E00385 0 +OP4 E00386 0 +OP4 E00387 0 +OP4 E00388 0 +OP4 E00389 0 +OP4 E0038A 0 +OP4 E0038B 0 +OP4 E0038C 0 +OP4 E0038D 0 +OP4 E0038E 0 +OP4 E0038F 0 +OP4 E00390 0 +OP4 E00391 0 +OP4 E00392 0 +OP4 E00393 0 +OP4 E00394 0 +OP4 E00395 0 +OP4 E00396 0 +OP4 E00397 0 +OP4 E00398 0 +OP4 E00399 0 +OP4 E0039A 0 +OP4 E0039B 0 +OP4 E0039C 0 +OP4 E0039D 0 +OP4 E0039E 0 +OP4 E0039F 0 +OP4 E003A0 0 +OP4 E003A1 0 +OP4 E003A2 0 +OP4 E003A3 0 +OP4 E003A4 0 +OP4 E003A5 0 +OP4 E003A6 0 +OP4 E003A7 0 +OP4 E003A8 0 +OP4 E003A9 0 +OP4 E003AA 0 +OP4 E003AB 0 +OP4 E003AC 0 +OP4 E003AD 0 +OP4 E003AE 0 +OP4 E003AF 0 +OP4 E003B0 0 +OP4 E003B1 0 +OP4 E003B2 0 +OP4 E003B3 0 +OP4 E003B4 0 +OP4 E003B5 0 +OP4 E003B6 0 +OP4 E003B7 0 +OP4 E003B8 0 +OP4 E003B9 0 +OP4 E003BA 0 +OP4 E003BB 0 +OP4 E003BC 0 +OP4 E003BD 0 +OP4 E003BE 0 +OP4 E003BF 0 +OP4 E003C0 0 +OP4 E003C1 0 +OP4 E003C2 0 +OP4 E003C3 0 +OP4 E003C4 0 +OP4 E003C5 0 +OP4 E003C6 0 +OP4 E003C7 0 +OP4 E003C8 0 +OP4 E003C9 0 +OP4 E003CA 0 +OP4 E003CB 0 +OP4 E003CC 0 +OP4 E003CD 0 +OP4 E003CE 0 +OP4 E003CF 0 +OP4 E003D0 0 +OP4 E003D1 0 +OP4 E003D2 0 +OP4 E003D3 0 +OP4 E003D4 0 +OP4 E003D5 0 +OP4 E003D6 0 +OP4 E003D7 0 +OP4 E003D8 0 +OP4 E003D9 0 +OP4 E003DA 0 +OP4 E003DB 0 +OP4 E003DC 0 +OP4 E003DD 0 +OP4 E003DE 0 +OP4 E003DF 0 +OP4 E003E0 0 +OP4 E003E1 0 +OP4 E003E2 0 +OP4 E003E3 0 +OP4 E003E4 0 +OP4 E003E5 0 +OP4 E003E6 0 +OP4 E003E7 0 +OP4 E003E8 0 +OP4 E003E9 0 +OP4 E003EA 0 +OP4 E003EB 0 +OP4 E003EC 0 +OP4 E003ED 0 +OP4 E003EE 0 +OP4 E003EF 0 +OP4 E003F0 0 +OP4 E003F1 0 +OP4 E003F2 0 +OP4 E003F3 0 +OP4 E003F4 0 +OP4 E003F5 0 +OP4 E003F6 0 +OP4 E003F7 0 +OP4 E003F8 0 +OP4 E003F9 0 +OP4 E003FA 0 +OP4 E003FB 0 +OP4 E003FC 0 +OP4 E003FD 0 +OP4 E003FE 0 +OP4 E003FF 0 +OP4 E00400 0 +OP4 E00401 0 +OP4 E00402 0 +OP4 E00403 0 +OP4 E00404 0 +OP4 E00405 0 +OP4 E00406 0 +OP4 E00407 0 +OP4 E00408 0 +OP4 E00409 0 +OP4 E0040A 0 +OP4 E0040B 0 +OP4 E0040C 0 +OP4 E0040D 0 +OP4 E0040E 0 +OP4 E0040F 0 +OP4 E00410 0 +OP4 E00411 0 +OP4 E00412 0 +OP4 E00413 0 +OP4 E00414 0 +OP4 E00415 0 +OP4 E00416 0 +OP4 E00417 0 +OP4 E00418 0 +OP4 E00419 0 +OP4 E0041A 0 +OP4 E0041B 0 +OP4 E0041C 0 +OP4 E0041D 0 +OP4 E0041E 0 +OP4 E0041F 0 +OP4 E00420 0 +OP4 E00421 0 +OP4 E00422 0 +OP4 E00423 0 +OP4 E00424 0 +OP4 E00425 0 +OP4 E00426 0 +OP4 E00427 0 +OP4 E00428 0 +OP4 E00429 0 +OP4 E0042A 0 +OP4 E0042B 0 +OP4 E0042C 0 +OP4 E0042D 0 +OP4 E0042E 0 +OP4 E0042F 0 +OP4 E00430 0 +OP4 E00431 0 +OP4 E00432 0 +OP4 E00433 0 +OP4 E00434 0 +OP4 E00435 0 +OP4 E00436 0 +OP4 E00437 0 +OP4 E00438 0 +OP4 E00439 0 +OP4 E0043A 0 +OP4 E0043B 0 +OP4 E0043C 0 +OP4 E0043D 0 +OP4 E0043E 0 +OP4 E0043F 0 +OP4 E00440 0 +OP4 E00441 0 +OP4 E00442 0 +OP4 E00443 0 +OP4 E00444 0 +OP4 E00445 0 +OP4 E00446 0 +OP4 E00447 0 +OP4 E00448 0 +OP4 E00449 0 +OP4 E0044A 0 +OP4 E0044B 0 +OP4 E0044C 0 +OP4 E0044D 0 +OP4 E0044E 0 +OP4 E0044F 0 +OP4 E00450 0 +OP4 E00451 0 +OP4 E00452 0 +OP4 E00453 0 +OP4 E00454 0 +OP4 E00455 0 +OP4 E00456 0 +OP4 E00457 0 +OP4 E00458 0 +OP4 E00459 0 +OP4 E0045A 0 +OP4 E0045B 0 +OP4 E0045C 0 +OP4 E0045D 0 +OP4 E0045E 0 +OP4 E0045F 0 +OP4 E00460 0 +OP4 E00461 0 +OP4 E00462 0 +OP4 E00463 0 +OP4 E00464 0 +OP4 E00465 0 +OP4 E00466 0 +OP4 E00467 0 +OP4 E00468 0 +OP4 E00469 0 +OP4 E0046A 0 +OP4 E0046B 0 +OP4 E0046C 0 +OP4 E0046D 0 +OP4 E0046E 0 +OP4 E0046F 0 +OP4 E00470 0 +OP4 E00471 0 +OP4 E00472 0 +OP4 E00473 0 +OP4 E00474 0 +OP4 E00475 0 +OP4 E00476 0 +OP4 E00477 0 +OP4 E00478 0 +OP4 E00479 0 +OP4 E0047A 0 +OP4 E0047B 0 +OP4 E0047C 0 +OP4 E0047D 0 +OP4 E0047E 0 +OP4 E0047F 0 +OP4 E00480 0 +OP4 E00481 0 +OP4 E00482 0 +OP4 E00483 0 +OP4 E00484 0 +OP4 E00485 0 +OP4 E00486 0 +OP4 E00487 0 +OP4 E00488 0 +OP4 E00489 0 +OP4 E0048A 0 +OP4 E0048B 0 +OP4 E0048C 0 +OP4 E0048D 0 +OP4 E0048E 0 +OP4 E0048F 0 +OP4 E00490 0 +OP4 E00491 0 +OP4 E00492 0 +OP4 E00493 0 +OP4 E00494 0 +OP4 E00495 0 +OP4 E00496 0 +OP4 E00497 0 +OP4 E00498 0 +OP4 E00499 0 +OP4 E0049A 0 +OP4 E0049B 0 +OP4 E0049C 0 +OP4 E0049D 0 +OP4 E0049E 0 +OP4 E0049F 0 +OP4 E004A0 0 +OP4 E004A1 0 +OP4 E004A2 0 +OP4 E004A3 0 +OP4 E004A4 0 +OP4 E004A5 0 +OP4 E004A6 0 +OP4 E004A7 0 +OP4 E004A8 0 +OP4 E004A9 0 +OP4 E004AA 0 +OP4 E004AB 0 +OP4 E004AC 0 +OP4 E004AD 0 +OP4 E004AE 0 +OP4 E004AF 0 +OP4 E004B0 0 +OP4 E004B1 0 +OP4 E004B2 0 +OP4 E004B3 0 +OP4 E004B4 0 +OP4 E004B5 0 +OP4 E004B6 0 +OP4 E004B7 0 +OP4 E004B8 0 +OP4 E004B9 0 +OP4 E004BA 0 +OP4 E004BB 0 +OP4 E004BC 0 +OP4 E004BD 0 +OP4 E004BE 0 +OP4 E004BF 0 +OP4 E004C0 0 +OP4 E004C1 0 +OP4 E004C2 0 +OP4 E004C3 0 +OP4 E004C4 0 +OP4 E004C5 0 +OP4 E004C6 0 +OP4 E004C7 0 +OP4 E004C8 0 +OP4 E004C9 0 +OP4 E004CA 0 +OP4 E004CB 0 +OP4 E004CC 0 +OP4 E004CD 0 +OP4 E004CE 0 +OP4 E004CF 0 +OP4 E004D0 0 +OP4 E004D1 0 +OP4 E004D2 0 +OP4 E004D3 0 +OP4 E004D4 0 +OP4 E004D5 0 +OP4 E004D6 0 +OP4 E004D7 0 +OP4 E004D8 0 +OP4 E004D9 0 +OP4 E004DA 0 +OP4 E004DB 0 +OP4 E004DC 0 +OP4 E004DD 0 +OP4 E004DE 0 +OP4 E004DF 0 +OP4 E004E0 0 +OP4 E004E1 0 +OP4 E004E2 0 +OP4 E004E3 0 +OP4 E004E4 0 +OP4 E004E5 0 +OP4 E004E6 0 +OP4 E004E7 0 +OP4 E004E8 0 +OP4 E004E9 0 +OP4 E004EA 0 +OP4 E004EB 0 +OP4 E004EC 0 +OP4 E004ED 0 +OP4 E004EE 0 +OP4 E004EF 0 +OP4 E004F0 0 +OP4 E004F1 0 +OP4 E004F2 0 +OP4 E004F3 0 +OP4 E004F4 0 +OP4 E004F5 0 +OP4 E004F6 0 +OP4 E004F7 0 +OP4 E004F8 0 +OP4 E004F9 0 +OP4 E004FA 0 +OP4 E004FB 0 +OP4 E004FC 0 +OP4 E004FD 0 +OP4 E004FE 0 +OP4 E004FF 0 +OP4 E00500 0 +OP4 E00501 0 +OP4 E00502 0 +OP4 E00503 0 +OP4 E00504 0 +OP4 E00505 0 +OP4 E00506 0 +OP4 E00507 0 +OP4 E00508 0 +OP4 E00509 0 +OP4 E0050A 0 +OP4 E0050B 0 +OP4 E0050C 0 +OP4 E0050D 0 +OP4 E0050E 0 +OP4 E0050F 0 +OP4 E00510 0 +OP4 E00511 0 +OP4 E00512 0 +OP4 E00513 0 +OP4 E00514 0 +OP4 E00515 0 +OP4 E00516 0 +OP4 E00517 0 +OP4 E00518 0 +OP4 E00519 0 +OP4 E0051A 0 +OP4 E0051B 0 +OP4 E0051C 0 +OP4 E0051D 0 +OP4 E0051E 0 +OP4 E0051F 0 +OP4 E00520 0 +OP4 E00521 0 +OP4 E00522 0 +OP4 E00523 0 +OP4 E00524 0 +OP4 E00525 0 +OP4 E00526 0 +OP4 E00527 0 +OP4 E00528 0 +OP4 E00529 0 +OP4 E0052A 0 +OP4 E0052B 0 +OP4 E0052C 0 +OP4 E0052D 0 +OP4 E0052E 0 +OP4 E0052F 0 +OP4 E00530 0 +OP4 E00531 0 +OP4 E00532 0 +OP4 E00533 0 +OP4 E00534 0 +OP4 E00535 0 +OP4 E00536 0 +OP4 E00537 0 +OP4 E00538 0 +OP4 E00539 0 +OP4 E0053A 0 +OP4 E0053B 0 +OP4 E0053C 0 +OP4 E0053D 0 +OP4 E0053E 0 +OP4 E0053F 0 +OP4 E00540 0 +OP4 E00541 0 +OP4 E00542 0 +OP4 E00543 0 +OP4 E00544 0 +OP4 E00545 0 +OP4 E00546 0 +OP4 E00547 0 +OP4 E00548 0 +OP4 E00549 0 +OP4 E0054A 0 +OP4 E0054B 0 +OP4 E0054C 0 +OP4 E0054D 0 +OP4 E0054E 0 +OP4 E0054F 0 +OP4 E00550 0 +OP4 E00551 0 +OP4 E00552 0 +OP4 E00553 0 +OP4 E00554 0 +OP4 E00555 0 +OP4 E00556 0 +OP4 E00557 0 +OP4 E00558 0 +OP4 E00559 0 +OP4 E0055A 0 +OP4 E0055B 0 +OP4 E0055C 0 +OP4 E0055D 0 +OP4 E0055E 0 +OP4 E0055F 0 +OP4 E00560 0 +OP4 E00561 0 +OP4 E00562 0 +OP4 E00563 0 +OP4 E00564 0 +OP4 E00565 0 +OP4 E00566 0 +OP4 E00567 0 +OP4 E00568 0 +OP4 E00569 0 +OP4 E0056A 0 +OP4 E0056B 0 +OP4 E0056C 0 +OP4 E0056D 0 +OP4 E0056E 0 +OP4 E0056F 0 +OP4 E00570 0 +OP4 E00571 0 +OP4 E00572 0 +OP4 E00573 0 +OP4 E00574 0 +OP4 E00575 0 +OP4 E00576 0 +OP4 E00577 0 +OP4 E00578 0 +OP4 E00579 0 +OP4 E0057A 0 +OP4 E0057B 0 +OP4 E0057C 0 +OP4 E0057D 0 +OP4 E0057E 0 +OP4 E0057F 0 +OP4 E00580 0 +OP4 E00581 0 +OP4 E00582 0 +OP4 E00583 0 +OP4 E00584 0 +OP4 E00585 0 +OP4 E00586 0 +OP4 E00587 0 +OP4 E00588 0 +OP4 E00589 0 +OP4 E0058A 0 +OP4 E0058B 0 +OP4 E0058C 0 +OP4 E0058D 0 +OP4 E0058E 0 +OP4 E0058F 0 +OP4 E00590 0 +OP4 E00591 0 +OP4 E00592 0 +OP4 E00593 0 +OP4 E00594 0 +OP4 E00595 0 +OP4 E00596 0 +OP4 E00597 0 +OP4 E00598 0 +OP4 E00599 0 +OP4 E0059A 0 +OP4 E0059B 0 +OP4 E0059C 0 +OP4 E0059D 0 +OP4 E0059E 0 +OP4 E0059F 0 +OP4 E005A0 0 +OP4 E005A1 0 +OP4 E005A2 0 +OP4 E005A3 0 +OP4 E005A4 0 +OP4 E005A5 0 +OP4 E005A6 0 +OP4 E005A7 0 +OP4 E005A8 0 +OP4 E005A9 0 +OP4 E005AA 0 +OP4 E005AB 0 +OP4 E005AC 0 +OP4 E005AD 0 +OP4 E005AE 0 +OP4 E005AF 0 +OP4 E005B0 0 +OP4 E005B1 0 +OP4 E005B2 0 +OP4 E005B3 0 +OP4 E005B4 0 +OP4 E005B5 0 +OP4 E005B6 0 +OP4 E005B7 0 +OP4 E005B8 0 +OP4 E005B9 0 +OP4 E005BA 0 +OP4 E005BB 0 +OP4 E005BC 0 +OP4 E005BD 0 +OP4 E005BE 0 +OP4 E005BF 0 +OP4 E005C0 0 +OP4 E005C1 0 +OP4 E005C2 0 +OP4 E005C3 0 +OP4 E005C4 0 +OP4 E005C5 0 +OP4 E005C6 0 +OP4 E005C7 0 +OP4 E005C8 0 +OP4 E005C9 0 +OP4 E005CA 0 +OP4 E005CB 0 +OP4 E005CC 0 +OP4 E005CD 0 +OP4 E005CE 0 +OP4 E005CF 0 +OP4 E005D0 0 +OP4 E005D1 0 +OP4 E005D2 0 +OP4 E005D3 0 +OP4 E005D4 0 +OP4 E005D5 0 +OP4 E005D6 0 +OP4 E005D7 0 +OP4 E005D8 0 +OP4 E005D9 0 +OP4 E005DA 0 +OP4 E005DB 0 +OP4 E005DC 0 +OP4 E005DD 0 +OP4 E005DE 0 +OP4 E005DF 0 +OP4 E005E0 0 +OP4 E005E1 0 +OP4 E005E2 0 +OP4 E005E3 0 +OP4 E005E4 0 +OP4 E005E5 0 +OP4 E005E6 0 +OP4 E005E7 0 +OP4 E005E8 0 +OP4 E005E9 0 +OP4 E005EA 0 +OP4 E005EB 0 +OP4 E005EC 0 +OP4 E005ED 0 +OP4 E005EE 0 +OP4 E005EF 0 +OP4 E005F0 0 +OP4 E005F1 0 +OP4 E005F2 0 +OP4 E005F3 0 +OP4 E005F4 0 +OP4 E005F5 0 +OP4 E005F6 0 +OP4 E005F7 0 +OP4 E005F8 0 +OP4 E005F9 0 +OP4 E005FA 0 +OP4 E005FB 0 +OP4 E005FC 0 +OP4 E005FD 0 +OP4 E005FE 0 +OP4 E005FF 0 +OP4 E00600 0 +OP4 E00601 0 +OP4 E00602 0 +OP4 E00603 0 +OP4 E00604 0 +OP4 E00605 0 +OP4 E00606 0 +OP4 E00607 0 +OP4 E00608 0 +OP4 E00609 0 +OP4 E0060A 0 +OP4 E0060B 0 +OP4 E0060C 0 +OP4 E0060D 0 +OP4 E0060E 0 +OP4 E0060F 0 +OP4 E00610 0 +OP4 E00611 0 +OP4 E00612 0 +OP4 E00613 0 +OP4 E00614 0 +OP4 E00615 0 +OP4 E00616 0 +OP4 E00617 0 +OP4 E00618 0 +OP4 E00619 0 +OP4 E0061A 0 +OP4 E0061B 0 +OP4 E0061C 0 +OP4 E0061D 0 +OP4 E0061E 0 +OP4 E0061F 0 +OP4 E00620 0 +OP4 E00621 0 +OP4 E00622 0 +OP4 E00623 0 +OP4 E00624 0 +OP4 E00625 0 +OP4 E00626 0 +OP4 E00627 0 +OP4 E00628 0 +OP4 E00629 0 +OP4 E0062A 0 +OP4 E0062B 0 +OP4 E0062C 0 +OP4 E0062D 0 +OP4 E0062E 0 +OP4 E0062F 0 +OP4 E00630 0 +OP4 E00631 0 +OP4 E00632 0 +OP4 E00633 0 +OP4 E00634 0 +OP4 E00635 0 +OP4 E00636 0 +OP4 E00637 0 +OP4 E00638 0 +OP4 E00639 0 +OP4 E0063A 0 +OP4 E0063B 0 +OP4 E0063C 0 +OP4 E0063D 0 +OP4 E0063E 0 +OP4 E0063F 0 +OP4 E00640 0 +OP4 E00641 0 +OP4 E00642 0 +OP4 E00643 0 +OP4 E00644 0 +OP4 E00645 0 +OP4 E00646 0 +OP4 E00647 0 +OP4 E00648 0 +OP4 E00649 0 +OP4 E0064A 0 +OP4 E0064B 0 +OP4 E0064C 0 +OP4 E0064D 0 +OP4 E0064E 0 +OP4 E0064F 0 +OP4 E00650 0 +OP4 E00651 0 +OP4 E00652 0 +OP4 E00653 0 +OP4 E00654 0 +OP4 E00655 0 +OP4 E00656 0 +OP4 E00657 0 +OP4 E00658 0 +OP4 E00659 0 +OP4 E0065A 0 +OP4 E0065B 0 +OP4 E0065C 0 +OP4 E0065D 0 +OP4 E0065E 0 +OP4 E0065F 0 +OP4 E00660 0 +OP4 E00661 0 +OP4 E00662 0 +OP4 E00663 0 +OP4 E00664 0 +OP4 E00665 0 +OP4 E00666 0 +OP4 E00667 0 +OP4 E00668 0 +OP4 E00669 0 +OP4 E0066A 0 +OP4 E0066B 0 +OP4 E0066C 0 +OP4 E0066D 0 +OP4 E0066E 0 +OP4 E0066F 0 +OP4 E00670 0 +OP4 E00671 0 +OP4 E00672 0 +OP4 E00673 0 +OP4 E00674 0 +OP4 E00675 0 +OP4 E00676 0 +OP4 E00677 0 +OP4 E00678 0 +OP4 E00679 0 +OP4 E0067A 0 +OP4 E0067B 0 +OP4 E0067C 0 +OP4 E0067D 0 +OP4 E0067E 0 +OP4 E0067F 0 +OP4 E00680 0 +OP4 E00681 0 +OP4 E00682 0 +OP4 E00683 0 +OP4 E00684 0 +OP4 E00685 0 +OP4 E00686 0 +OP4 E00687 0 +OP4 E00688 0 +OP4 E00689 0 +OP4 E0068A 0 +OP4 E0068B 0 +OP4 E0068C 0 +OP4 E0068D 0 +OP4 E0068E 0 +OP4 E0068F 0 +OP4 E00690 0 +OP4 E00691 0 +OP4 E00692 0 +OP4 E00693 0 +OP4 E00694 0 +OP4 E00695 0 +OP4 E00696 0 +OP4 E00697 0 +OP4 E00698 0 +OP4 E00699 0 +OP4 E0069A 0 +OP4 E0069B 0 +OP4 E0069C 0 +OP4 E0069D 0 +OP4 E0069E 0 +OP4 E0069F 0 +OP4 E006A0 0 +OP4 E006A1 0 +OP4 E006A2 0 +OP4 E006A3 0 +OP4 E006A4 0 +OP4 E006A5 0 +OP4 E006A6 0 +OP4 E006A7 0 +OP4 E006A8 0 +OP4 E006A9 0 +OP4 E006AA 0 +OP4 E006AB 0 +OP4 E006AC 0 +OP4 E006AD 0 +OP4 E006AE 0 +OP4 E006AF 0 +OP4 E006B0 0 +OP4 E006B1 0 +OP4 E006B2 0 +OP4 E006B3 0 +OP4 E006B4 0 +OP4 E006B5 0 +OP4 E006B6 0 +OP4 E006B7 0 +OP4 E006B8 0 +OP4 E006B9 0 +OP4 E006BA 0 +OP4 E006BB 0 +OP4 E006BC 0 +OP4 E006BD 0 +OP4 E006BE 0 +OP4 E006BF 0 +OP4 E006C0 0 +OP4 E006C1 0 +OP4 E006C2 0 +OP4 E006C3 0 +OP4 E006C4 0 +OP4 E006C5 0 +OP4 E006C6 0 +OP4 E006C7 0 +OP4 E006C8 0 +OP4 E006C9 0 +OP4 E006CA 0 +OP4 E006CB 0 +OP4 E006CC 0 +OP4 E006CD 0 +OP4 E006CE 0 +OP4 E006CF 0 +OP4 E006D0 0 +OP4 E006D1 0 +OP4 E006D2 0 +OP4 E006D3 0 +OP4 E006D4 0 +OP4 E006D5 0 +OP4 E006D6 0 +OP4 E006D7 0 +OP4 E006D8 0 +OP4 E006D9 0 +OP4 E006DA 0 +OP4 E006DB 0 +OP4 E006DC 0 +OP4 E006DD 0 +OP4 E006DE 0 +OP4 E006DF 0 +OP4 E006E0 0 +OP4 E006E1 0 +OP4 E006E2 0 +OP4 E006E3 0 +OP4 E006E4 0 +OP4 E006E5 0 +OP4 E006E6 0 +OP4 E006E7 0 +OP4 E006E8 0 +OP4 E006E9 0 +OP4 E006EA 0 +OP4 E006EB 0 +OP4 E006EC 0 +OP4 E006ED 0 +OP4 E006EE 0 +OP4 E006EF 0 +OP4 E006F0 0 +OP4 E006F1 0 +OP4 E006F2 0 +OP4 E006F3 0 +OP4 E006F4 0 +OP4 E006F5 0 +OP4 E006F6 0 +OP4 E006F7 0 +OP4 E006F8 0 +OP4 E006F9 0 +OP4 E006FA 0 +OP4 E006FB 0 +OP4 E006FC 0 +OP4 E006FD 0 +OP4 E006FE 0 +OP4 E006FF 0 +OP4 E00700 0 +OP4 E00701 0 +OP4 E00702 0 +OP4 E00703 0 +OP4 E00704 0 +OP4 E00705 0 +OP4 E00706 0 +OP4 E00707 0 +OP4 E00708 0 +OP4 E00709 0 +OP4 E0070A 0 +OP4 E0070B 0 +OP4 E0070C 0 +OP4 E0070D 0 +OP4 E0070E 0 +OP4 E0070F 0 +OP4 E00710 0 +OP4 E00711 0 +OP4 E00712 0 +OP4 E00713 0 +OP4 E00714 0 +OP4 E00715 0 +OP4 E00716 0 +OP4 E00717 0 +OP4 E00718 0 +OP4 E00719 0 +OP4 E0071A 0 +OP4 E0071B 0 +OP4 E0071C 0 +OP4 E0071D 0 +OP4 E0071E 0 +OP4 E0071F 0 +OP4 E00720 0 +OP4 E00721 0 +OP4 E00722 0 +OP4 E00723 0 +OP4 E00724 0 +OP4 E00725 0 +OP4 E00726 0 +OP4 E00727 0 +OP4 E00728 0 +OP4 E00729 0 +OP4 E0072A 0 +OP4 E0072B 0 +OP4 E0072C 0 +OP4 E0072D 0 +OP4 E0072E 0 +OP4 E0072F 0 +OP4 E00730 0 +OP4 E00731 0 +OP4 E00732 0 +OP4 E00733 0 +OP4 E00734 0 +OP4 E00735 0 +OP4 E00736 0 +OP4 E00737 0 +OP4 E00738 0 +OP4 E00739 0 +OP4 E0073A 0 +OP4 E0073B 0 +OP4 E0073C 0 +OP4 E0073D 0 +OP4 E0073E 0 +OP4 E0073F 0 +OP4 E00740 0 +OP4 E00741 0 +OP4 E00742 0 +OP4 E00743 0 +OP4 E00744 0 +OP4 E00745 0 +OP4 E00746 0 +OP4 E00747 0 +OP4 E00748 0 +OP4 E00749 0 +OP4 E0074A 0 +OP4 E0074B 0 +OP4 E0074C 0 +OP4 E0074D 0 +OP4 E0074E 0 +OP4 E0074F 0 +OP4 E00750 0 +OP4 E00751 0 +OP4 E00752 0 +OP4 E00753 0 +OP4 E00754 0 +OP4 E00755 0 +OP4 E00756 0 +OP4 E00757 0 +OP4 E00758 0 +OP4 E00759 0 +OP4 E0075A 0 +OP4 E0075B 0 +OP4 E0075C 0 +OP4 E0075D 0 +OP4 E0075E 0 +OP4 E0075F 0 +OP4 E00760 0 +OP4 E00761 0 +OP4 E00762 0 +OP4 E00763 0 +OP4 E00764 0 +OP4 E00765 0 +OP4 E00766 0 +OP4 E00767 0 +OP4 E00768 0 +OP4 E00769 0 +OP4 E0076A 0 +OP4 E0076B 0 +OP4 E0076C 0 +OP4 E0076D 0 +OP4 E0076E 0 +OP4 E0076F 0 +OP4 E00770 0 +OP4 E00771 0 +OP4 E00772 0 +OP4 E00773 0 +OP4 E00774 0 +OP4 E00775 0 +OP4 E00776 0 +OP4 E00777 0 +OP4 E00778 0 +OP4 E00779 0 +OP4 E0077A 0 +OP4 E0077B 0 +OP4 E0077C 0 +OP4 E0077D 0 +OP4 E0077E 0 +OP4 E0077F 0 +OP4 E00780 0 +OP4 E00781 0 +OP4 E00782 0 +OP4 E00783 0 +OP4 E00784 0 +OP4 E00785 0 +OP4 E00786 0 +OP4 E00787 0 +OP4 E00788 0 +OP4 E00789 0 +OP4 E0078A 0 +OP4 E0078B 0 +OP4 E0078C 0 +OP4 E0078D 0 +OP4 E0078E 0 +OP4 E0078F 0 +OP4 E00790 0 +OP4 E00791 0 +OP4 E00792 0 +OP4 E00793 0 +OP4 E00794 0 +OP4 E00795 0 +OP4 E00796 0 +OP4 E00797 0 +OP4 E00798 0 +OP4 E00799 0 +OP4 E0079A 0 +OP4 E0079B 0 +OP4 E0079C 0 +OP4 E0079D 0 +OP4 E0079E 0 +OP4 E0079F 0 +OP4 E007A0 0 +OP4 E007A1 0 +OP4 E007A2 0 +OP4 E007A3 0 +OP4 E007A4 0 +OP4 E007A5 0 +OP4 E007A6 0 +OP4 E007A7 0 +OP4 E007A8 0 +OP4 E007A9 0 +OP4 E007AA 0 +OP4 E007AB 0 +OP4 E007AC 0 +OP4 E007AD 0 +OP4 E007AE 0 +OP4 E007AF 0 +OP4 E007B0 0 +OP4 E007B1 0 +OP4 E007B2 0 +OP4 E007B3 0 +OP4 E007B4 0 +OP4 E007B5 0 +OP4 E007B6 0 +OP4 E007B7 0 +OP4 E007B8 0 +OP4 E007B9 0 +OP4 E007BA 0 +OP4 E007BB 0 +OP4 E007BC 0 +OP4 E007BD 0 +OP4 E007BE 0 +OP4 E007BF 0 +OP4 E007C0 0 +OP4 E007C1 0 +OP4 E007C2 0 +OP4 E007C3 0 +OP4 E007C4 0 +OP4 E007C5 0 +OP4 E007C6 0 +OP4 E007C7 0 +OP4 E007C8 0 +OP4 E007C9 0 +OP4 E007CA 0 +OP4 E007CB 0 +OP4 E007CC 0 +OP4 E007CD 0 +OP4 E007CE 0 +OP4 E007CF 0 +OP4 E007D0 0 +OP4 E007D1 0 +OP4 E007D2 0 +OP4 E007D3 0 +OP4 E007D4 0 +OP4 E007D5 0 +OP4 E007D6 0 +OP4 E007D7 0 +OP4 E007D8 0 +OP4 E007D9 0 +OP4 E007DA 0 +OP4 E007DB 0 +OP4 E007DC 0 +OP4 E007DD 0 +OP4 E007DE 0 +OP4 E007DF 0 +OP4 E007E0 0 +OP4 E007E1 0 +OP4 E007E2 0 +OP4 E007E3 0 +OP4 E007E4 0 +OP4 E007E5 0 +OP4 E007E6 0 +OP4 E007E7 0 +OP4 E007E8 0 +OP4 E007E9 0 +OP4 E007EA 0 +OP4 E007EB 0 +OP4 E007EC 0 +OP4 E007ED 0 +OP4 E007EE 0 +OP4 E007EF 0 +OP4 E007F0 0 +OP4 E007F1 0 +OP4 E007F2 0 +OP4 E007F3 0 +OP4 E007F4 0 +OP4 E007F5 0 +OP4 E007F6 0 +OP4 E007F7 0 +OP4 E007F8 0 +OP4 E007F9 0 +OP4 E007FA 0 +OP4 E007FB 0 +OP4 E007FC 0 +OP4 E007FD 0 +OP4 E007FE 0 +OP4 E007FF 0 +OP4 E00800 0 +OP4 E00801 0 +OP4 E00802 0 +OP4 E00803 0 +OP4 E00804 0 +OP4 E00805 0 +OP4 E00806 0 +OP4 E00807 0 +OP4 E00808 0 +OP4 E00809 0 +OP4 E0080A 0 +OP4 E0080B 0 +OP4 E0080C 0 +OP4 E0080D 0 +OP4 E0080E 0 +OP4 E0080F 0 +OP4 E00810 0 +OP4 E00811 0 +OP4 E00812 0 +OP4 E00813 0 +OP4 E00814 0 +OP4 E00815 0 +OP4 E00816 0 +OP4 E00817 0 +OP4 E00818 0 +OP4 E00819 0 +OP4 E0081A 0 +OP4 E0081B 0 +OP4 E0081C 0 +OP4 E0081D 0 +OP4 E0081E 0 +OP4 E0081F 0 +OP4 E00820 0 +OP4 E00821 0 +OP4 E00822 0 +OP4 E00823 0 +OP4 E00824 0 +OP4 E00825 0 +OP4 E00826 0 +OP4 E00827 0 +OP4 E00828 0 +OP4 E00829 0 +OP4 E0082A 0 +OP4 E0082B 0 +OP4 E0082C 0 +OP4 E0082D 0 +OP4 E0082E 0 +OP4 E0082F 0 +OP4 E00830 0 +OP4 E00831 0 +OP4 E00832 0 +OP4 E00833 0 +OP4 E00834 0 +OP4 E00835 0 +OP4 E00836 0 +OP4 E00837 0 +OP4 E00838 0 +OP4 E00839 0 +OP4 E0083A 0 +OP4 E0083B 0 +OP4 E0083C 0 +OP4 E0083D 0 +OP4 E0083E 0 +OP4 E0083F 0 +OP4 E00840 0 +OP4 E00841 0 +OP4 E00842 0 +OP4 E00843 0 +OP4 E00844 0 +OP4 E00845 0 +OP4 E00846 0 +OP4 E00847 0 +OP4 E00848 0 +OP4 E00849 0 +OP4 E0084A 0 +OP4 E0084B 0 +OP4 E0084C 0 +OP4 E0084D 0 +OP4 E0084E 0 +OP4 E0084F 0 +OP4 E00850 0 +OP4 E00851 0 +OP4 E00852 0 +OP4 E00853 0 +OP4 E00854 0 +OP4 E00855 0 +OP4 E00856 0 +OP4 E00857 0 +OP4 E00858 0 +OP4 E00859 0 +OP4 E0085A 0 +OP4 E0085B 0 +OP4 E0085C 0 +OP4 E0085D 0 +OP4 E0085E 0 +OP4 E0085F 0 +OP4 E00860 0 +OP4 E00861 0 +OP4 E00862 0 +OP4 E00863 0 +OP4 E00864 0 +OP4 E00865 0 +OP4 E00866 0 +OP4 E00867 0 +OP4 E00868 0 +OP4 E00869 0 +OP4 E0086A 0 +OP4 E0086B 0 +OP4 E0086C 0 +OP4 E0086D 0 +OP4 E0086E 0 +OP4 E0086F 0 +OP4 E00870 0 +OP4 E00871 0 +OP4 E00872 0 +OP4 E00873 0 +OP4 E00874 0 +OP4 E00875 0 +OP4 E00876 0 +OP4 E00877 0 +OP4 E00878 0 +OP4 E00879 0 +OP4 E0087A 0 +OP4 E0087B 0 +OP4 E0087C 0 +OP4 E0087D 0 +OP4 E0087E 0 +OP4 E0087F 0 +OP4 E00880 0 +OP4 E00881 0 +OP4 E00882 0 +OP4 E00883 0 +OP4 E00884 0 +OP4 E00885 0 +OP4 E00886 0 +OP4 E00887 0 +OP4 E00888 0 +OP4 E00889 0 +OP4 E0088A 0 +OP4 E0088B 0 +OP4 E0088C 0 +OP4 E0088D 0 +OP4 E0088E 0 +OP4 E0088F 0 +OP4 E00890 0 +OP4 E00891 0 +OP4 E00892 0 +OP4 E00893 0 +OP4 E00894 0 +OP4 E00895 0 +OP4 E00896 0 +OP4 E00897 0 +OP4 E00898 0 +OP4 E00899 0 +OP4 E0089A 0 +OP4 E0089B 0 +OP4 E0089C 0 +OP4 E0089D 0 +OP4 E0089E 0 +OP4 E0089F 0 +OP4 E008A0 0 +OP4 E008A1 0 +OP4 E008A2 0 +OP4 E008A3 0 +OP4 E008A4 0 +OP4 E008A5 0 +OP4 E008A6 0 +OP4 E008A7 0 +OP4 E008A8 0 +OP4 E008A9 0 +OP4 E008AA 0 +OP4 E008AB 0 +OP4 E008AC 0 +OP4 E008AD 0 +OP4 E008AE 0 +OP4 E008AF 0 +OP4 E008B0 0 +OP4 E008B1 0 +OP4 E008B2 0 +OP4 E008B3 0 +OP4 E008B4 0 +OP4 E008B5 0 +OP4 E008B6 0 +OP4 E008B7 0 +OP4 E008B8 0 +OP4 E008B9 0 +OP4 E008BA 0 +OP4 E008BB 0 +OP4 E008BC 0 +OP4 E008BD 0 +OP4 E008BE 0 +OP4 E008BF 0 +OP4 E008C0 0 +OP4 E008C1 0 +OP4 E008C2 0 +OP4 E008C3 0 +OP4 E008C4 0 +OP4 E008C5 0 +OP4 E008C6 0 +OP4 E008C7 0 +OP4 E008C8 0 +OP4 E008C9 0 +OP4 E008CA 0 +OP4 E008CB 0 +OP4 E008CC 0 +OP4 E008CD 0 +OP4 E008CE 0 +OP4 E008CF 0 +OP4 E008D0 0 +OP4 E008D1 0 +OP4 E008D2 0 +OP4 E008D3 0 +OP4 E008D4 0 +OP4 E008D5 0 +OP4 E008D6 0 +OP4 E008D7 0 +OP4 E008D8 0 +OP4 E008D9 0 +OP4 E008DA 0 +OP4 E008DB 0 +OP4 E008DC 0 +OP4 E008DD 0 +OP4 E008DE 0 +OP4 E008DF 0 +OP4 E008E0 0 +OP4 E008E1 0 +OP4 E008E2 0 +OP4 E008E3 0 +OP4 E008E4 0 +OP4 E008E5 0 +OP4 E008E6 0 +OP4 E008E7 0 +OP4 E008E8 0 +OP4 E008E9 0 +OP4 E008EA 0 +OP4 E008EB 0 +OP4 E008EC 0 +OP4 E008ED 0 +OP4 E008EE 0 +OP4 E008EF 0 +OP4 E008F0 0 +OP4 E008F1 0 +OP4 E008F2 0 +OP4 E008F3 0 +OP4 E008F4 0 +OP4 E008F5 0 +OP4 E008F6 0 +OP4 E008F7 0 +OP4 E008F8 0 +OP4 E008F9 0 +OP4 E008FA 0 +OP4 E008FB 0 +OP4 E008FC 0 +OP4 E008FD 0 +OP4 E008FE 0 +OP4 E008FF 0 +OP4 E00900 0 +OP4 E00901 0 +OP4 E00902 0 +OP4 E00903 0 +OP4 E00904 0 +OP4 E00905 0 +OP4 E00906 0 +OP4 E00907 0 +OP4 E00908 0 +OP4 E00909 0 +OP4 E0090A 0 +OP4 E0090B 0 +OP4 E0090C 0 +OP4 E0090D 0 +OP4 E0090E 0 +OP4 E0090F 0 +OP4 E00910 0 +OP4 E00911 0 +OP4 E00912 0 +OP4 E00913 0 +OP4 E00914 0 +OP4 E00915 0 +OP4 E00916 0 +OP4 E00917 0 +OP4 E00918 0 +OP4 E00919 0 +OP4 E0091A 0 +OP4 E0091B 0 +OP4 E0091C 0 +OP4 E0091D 0 +OP4 E0091E 0 +OP4 E0091F 0 +OP4 E00920 0 +OP4 E00921 0 +OP4 E00922 0 +OP4 E00923 0 +OP4 E00924 0 +OP4 E00925 0 +OP4 E00926 0 +OP4 E00927 0 +OP4 E00928 0 +OP4 E00929 0 +OP4 E0092A 0 +OP4 E0092B 0 +OP4 E0092C 0 +OP4 E0092D 0 +OP4 E0092E 0 +OP4 E0092F 0 +OP4 E00930 0 +OP4 E00931 0 +OP4 E00932 0 +OP4 E00933 0 +OP4 E00934 0 +OP4 E00935 0 +OP4 E00936 0 +OP4 E00937 0 +OP4 E00938 0 +OP4 E00939 0 +OP4 E0093A 0 +OP4 E0093B 0 +OP4 E0093C 0 +OP4 E0093D 0 +OP4 E0093E 0 +OP4 E0093F 0 +OP4 E00940 0 +OP4 E00941 0 +OP4 E00942 0 +OP4 E00943 0 +OP4 E00944 0 +OP4 E00945 0 +OP4 E00946 0 +OP4 E00947 0 +OP4 E00948 0 +OP4 E00949 0 +OP4 E0094A 0 +OP4 E0094B 0 +OP4 E0094C 0 +OP4 E0094D 0 +OP4 E0094E 0 +OP4 E0094F 0 +OP4 E00950 0 +OP4 E00951 0 +OP4 E00952 0 +OP4 E00953 0 +OP4 E00954 0 +OP4 E00955 0 +OP4 E00956 0 +OP4 E00957 0 +OP4 E00958 0 +OP4 E00959 0 +OP4 E0095A 0 +OP4 E0095B 0 +OP4 E0095C 0 +OP4 E0095D 0 +OP4 E0095E 0 +OP4 E0095F 0 +OP4 E00960 0 +OP4 E00961 0 +OP4 E00962 0 +OP4 E00963 0 +OP4 E00964 0 +OP4 E00965 0 +OP4 E00966 0 +OP4 E00967 0 +OP4 E00968 0 +OP4 E00969 0 +OP4 E0096A 0 +OP4 E0096B 0 +OP4 E0096C 0 +OP4 E0096D 0 +OP4 E0096E 0 +OP4 E0096F 0 +OP4 E00970 0 +OP4 E00971 0 +OP4 E00972 0 +OP4 E00973 0 +OP4 E00974 0 +OP4 E00975 0 +OP4 E00976 0 +OP4 E00977 0 +OP4 E00978 0 +OP4 E00979 0 +OP4 E0097A 0 +OP4 E0097B 0 +OP4 E0097C 0 +OP4 E0097D 0 +OP4 E0097E 0 +OP4 E0097F 0 +OP4 E00980 0 +OP4 E00981 0 +OP4 E00982 0 +OP4 E00983 0 +OP4 E00984 0 +OP4 E00985 0 +OP4 E00986 0 +OP4 E00987 0 +OP4 E00988 0 +OP4 E00989 0 +OP4 E0098A 0 +OP4 E0098B 0 +OP4 E0098C 0 +OP4 E0098D 0 +OP4 E0098E 0 +OP4 E0098F 0 +OP4 E00990 0 +OP4 E00991 0 +OP4 E00992 0 +OP4 E00993 0 +OP4 E00994 0 +OP4 E00995 0 +OP4 E00996 0 +OP4 E00997 0 +OP4 E00998 0 +OP4 E00999 0 +OP4 E0099A 0 +OP4 E0099B 0 +OP4 E0099C 0 +OP4 E0099D 0 +OP4 E0099E 0 +OP4 E0099F 0 +OP4 E009A0 0 +OP4 E009A1 0 +OP4 E009A2 0 +OP4 E009A3 0 +OP4 E009A4 0 +OP4 E009A5 0 +OP4 E009A6 0 +OP4 E009A7 0 +OP4 E009A8 0 +OP4 E009A9 0 +OP4 E009AA 0 +OP4 E009AB 0 +OP4 E009AC 0 +OP4 E009AD 0 +OP4 E009AE 0 +OP4 E009AF 0 +OP4 E009B0 0 +OP4 E009B1 0 +OP4 E009B2 0 +OP4 E009B3 0 +OP4 E009B4 0 +OP4 E009B5 0 +OP4 E009B6 0 +OP4 E009B7 0 +OP4 E009B8 0 +OP4 E009B9 0 +OP4 E009BA 0 +OP4 E009BB 0 +OP4 E009BC 0 +OP4 E009BD 0 +OP4 E009BE 0 +OP4 E009BF 0 +OP4 E009C0 0 +OP4 E009C1 0 +OP4 E009C2 0 +OP4 E009C3 0 +OP4 E009C4 0 +OP4 E009C5 0 +OP4 E009C6 0 +OP4 E009C7 0 +OP4 E009C8 0 +OP4 E009C9 0 +OP4 E009CA 0 +OP4 E009CB 0 +OP4 E009CC 0 +OP4 E009CD 0 +OP4 E009CE 0 +OP4 E009CF 0 +OP4 E009D0 0 +OP4 E009D1 0 +OP4 E009D2 0 +OP4 E009D3 0 +OP4 E009D4 0 +OP4 E009D5 0 +OP4 E009D6 0 +OP4 E009D7 0 +OP4 E009D8 0 +OP4 E009D9 0 +OP4 E009DA 0 +OP4 E009DB 0 +OP4 E009DC 0 +OP4 E009DD 0 +OP4 E009DE 0 +OP4 E009DF 0 +OP4 E009E0 0 +OP4 E009E1 0 +OP4 E009E2 0 +OP4 E009E3 0 +OP4 E009E4 0 +OP4 E009E5 0 +OP4 E009E6 0 +OP4 E009E7 0 +OP4 E009E8 0 +OP4 E009E9 0 +OP4 E009EA 0 +OP4 E009EB 0 +OP4 E009EC 0 +OP4 E009ED 0 +OP4 E009EE 0 +OP4 E009EF 0 +OP4 E009F0 0 +OP4 E009F1 0 +OP4 E009F2 0 +OP4 E009F3 0 +OP4 E009F4 0 +OP4 E009F5 0 +OP4 E009F6 0 +OP4 E009F7 0 +OP4 E009F8 0 +OP4 E009F9 0 +OP4 E009FA 0 +OP4 E009FB 0 +OP4 E009FC 0 +OP4 E009FD 0 +OP4 E009FE 0 +OP4 E009FF 0 +OP4 E00A00 0 +OP4 E00A01 0 +OP4 E00A02 0 +OP4 E00A03 0 +OP4 E00A04 0 +OP4 E00A05 0 +OP4 E00A06 0 +OP4 E00A07 0 +OP4 E00A08 0 +OP4 E00A09 0 +OP4 E00A0A 0 +OP4 E00A0B 0 +OP4 E00A0C 0 +OP4 E00A0D 0 +OP4 E00A0E 0 +OP4 E00A0F 0 +OP4 E00A10 0 +OP4 E00A11 0 +OP4 E00A12 0 +OP4 E00A13 0 +OP4 E00A14 0 +OP4 E00A15 0 +OP4 E00A16 0 +OP4 E00A17 0 +OP4 E00A18 0 +OP4 E00A19 0 +OP4 E00A1A 0 +OP4 E00A1B 0 +OP4 E00A1C 0 +OP4 E00A1D 0 +OP4 E00A1E 0 +OP4 E00A1F 0 +OP4 E00A20 0 +OP4 E00A21 0 +OP4 E00A22 0 +OP4 E00A23 0 +OP4 E00A24 0 +OP4 E00A25 0 +OP4 E00A26 0 +OP4 E00A27 0 +OP4 E00A28 0 +OP4 E00A29 0 +OP4 E00A2A 0 +OP4 E00A2B 0 +OP4 E00A2C 0 +OP4 E00A2D 0 +OP4 E00A2E 0 +OP4 E00A2F 0 +OP4 E00A30 0 +OP4 E00A31 0 +OP4 E00A32 0 +OP4 E00A33 0 +OP4 E00A34 0 +OP4 E00A35 0 +OP4 E00A36 0 +OP4 E00A37 0 +OP4 E00A38 0 +OP4 E00A39 0 +OP4 E00A3A 0 +OP4 E00A3B 0 +OP4 E00A3C 0 +OP4 E00A3D 0 +OP4 E00A3E 0 +OP4 E00A3F 0 +OP4 E00A40 0 +OP4 E00A41 0 +OP4 E00A42 0 +OP4 E00A43 0 +OP4 E00A44 0 +OP4 E00A45 0 +OP4 E00A46 0 +OP4 E00A47 0 +OP4 E00A48 0 +OP4 E00A49 0 +OP4 E00A4A 0 +OP4 E00A4B 0 +OP4 E00A4C 0 +OP4 E00A4D 0 +OP4 E00A4E 0 +OP4 E00A4F 0 +OP4 E00A50 0 +OP4 E00A51 0 +OP4 E00A52 0 +OP4 E00A53 0 +OP4 E00A54 0 +OP4 E00A55 0 +OP4 E00A56 0 +OP4 E00A57 0 +OP4 E00A58 0 +OP4 E00A59 0 +OP4 E00A5A 0 +OP4 E00A5B 0 +OP4 E00A5C 0 +OP4 E00A5D 0 +OP4 E00A5E 0 +OP4 E00A5F 0 +OP4 E00A60 0 +OP4 E00A61 0 +OP4 E00A62 0 +OP4 E00A63 0 +OP4 E00A64 0 +OP4 E00A65 0 +OP4 E00A66 0 +OP4 E00A67 0 +OP4 E00A68 0 +OP4 E00A69 0 +OP4 E00A6A 0 +OP4 E00A6B 0 +OP4 E00A6C 0 +OP4 E00A6D 0 +OP4 E00A6E 0 +OP4 E00A6F 0 +OP4 E00A70 0 +OP4 E00A71 0 +OP4 E00A72 0 +OP4 E00A73 0 +OP4 E00A74 0 +OP4 E00A75 0 +OP4 E00A76 0 +OP4 E00A77 0 +OP4 E00A78 0 +OP4 E00A79 0 +OP4 E00A7A 0 +OP4 E00A7B 0 +OP4 E00A7C 0 +OP4 E00A7D 0 +OP4 E00A7E 0 +OP4 E00A7F 0 +OP4 E00A80 0 +OP4 E00A81 0 +OP4 E00A82 0 +OP4 E00A83 0 +OP4 E00A84 0 +OP4 E00A85 0 +OP4 E00A86 0 +OP4 E00A87 0 +OP4 E00A88 0 +OP4 E00A89 0 +OP4 E00A8A 0 +OP4 E00A8B 0 +OP4 E00A8C 0 +OP4 E00A8D 0 +OP4 E00A8E 0 +OP4 E00A8F 0 +OP4 E00A90 0 +OP4 E00A91 0 +OP4 E00A92 0 +OP4 E00A93 0 +OP4 E00A94 0 +OP4 E00A95 0 +OP4 E00A96 0 +OP4 E00A97 0 +OP4 E00A98 0 +OP4 E00A99 0 +OP4 E00A9A 0 +OP4 E00A9B 0 +OP4 E00A9C 0 +OP4 E00A9D 0 +OP4 E00A9E 0 +OP4 E00A9F 0 +OP4 E00AA0 0 +OP4 E00AA1 0 +OP4 E00AA2 0 +OP4 E00AA3 0 +OP4 E00AA4 0 +OP4 E00AA5 0 +OP4 E00AA6 0 +OP4 E00AA7 0 +OP4 E00AA8 0 +OP4 E00AA9 0 +OP4 E00AAA 0 +OP4 E00AAB 0 +OP4 E00AAC 0 +OP4 E00AAD 0 +OP4 E00AAE 0 +OP4 E00AAF 0 +OP4 E00AB0 0 +OP4 E00AB1 0 +OP4 E00AB2 0 +OP4 E00AB3 0 +OP4 E00AB4 0 +OP4 E00AB5 0 +OP4 E00AB6 0 +OP4 E00AB7 0 +OP4 E00AB8 0 +OP4 E00AB9 0 +OP4 E00ABA 0 +OP4 E00ABB 0 +OP4 E00ABC 0 +OP4 E00ABD 0 +OP4 E00ABE 0 +OP4 E00ABF 0 +OP4 E00AC0 0 +OP4 E00AC1 0 +OP4 E00AC2 0 +OP4 E00AC3 0 +OP4 E00AC4 0 +OP4 E00AC5 0 +OP4 E00AC6 0 +OP4 E00AC7 0 +OP4 E00AC8 0 +OP4 E00AC9 0 +OP4 E00ACA 0 +OP4 E00ACB 0 +OP4 E00ACC 0 +OP4 E00ACD 0 +OP4 E00ACE 0 +OP4 E00ACF 0 +OP4 E00AD0 0 +OP4 E00AD1 0 +OP4 E00AD2 0 +OP4 E00AD3 0 +OP4 E00AD4 0 +OP4 E00AD5 0 +OP4 E00AD6 0 +OP4 E00AD7 0 +OP4 E00AD8 0 +OP4 E00AD9 0 +OP4 E00ADA 0 +OP4 E00ADB 0 +OP4 E00ADC 0 +OP4 E00ADD 0 +OP4 E00ADE 0 +OP4 E00ADF 0 +OP4 E00AE0 0 +OP4 E00AE1 0 +OP4 E00AE2 0 +OP4 E00AE3 0 +OP4 E00AE4 0 +OP4 E00AE5 0 +OP4 E00AE6 0 +OP4 E00AE7 0 +OP4 E00AE8 0 +OP4 E00AE9 0 +OP4 E00AEA 0 +OP4 E00AEB 0 +OP4 E00AEC 0 +OP4 E00AED 0 +OP4 E00AEE 0 +OP4 E00AEF 0 +OP4 E00AF0 0 +OP4 E00AF1 0 +OP4 E00AF2 0 +OP4 E00AF3 0 +OP4 E00AF4 0 +OP4 E00AF5 0 +OP4 E00AF6 0 +OP4 E00AF7 0 +OP4 E00AF8 0 +OP4 E00AF9 0 +OP4 E00AFA 0 +OP4 E00AFB 0 +OP4 E00AFC 0 +OP4 E00AFD 0 +OP4 E00AFE 0 +OP4 E00AFF 0 +OP4 E00B00 0 +OP4 E00B01 0 +OP4 E00B02 0 +OP4 E00B03 0 +OP4 E00B04 0 +OP4 E00B05 0 +OP4 E00B06 0 +OP4 E00B07 0 +OP4 E00B08 0 +OP4 E00B09 0 +OP4 E00B0A 0 +OP4 E00B0B 0 +OP4 E00B0C 0 +OP4 E00B0D 0 +OP4 E00B0E 0 +OP4 E00B0F 0 +OP4 E00B10 0 +OP4 E00B11 0 +OP4 E00B12 0 +OP4 E00B13 0 +OP4 E00B14 0 +OP4 E00B15 0 +OP4 E00B16 0 +OP4 E00B17 0 +OP4 E00B18 0 +OP4 E00B19 0 +OP4 E00B1A 0 +OP4 E00B1B 0 +OP4 E00B1C 0 +OP4 E00B1D 0 +OP4 E00B1E 0 +OP4 E00B1F 0 +OP4 E00B20 0 +OP4 E00B21 0 +OP4 E00B22 0 +OP4 E00B23 0 +OP4 E00B24 0 +OP4 E00B25 0 +OP4 E00B26 0 +OP4 E00B27 0 +OP4 E00B28 0 +OP4 E00B29 0 +OP4 E00B2A 0 +OP4 E00B2B 0 +OP4 E00B2C 0 +OP4 E00B2D 0 +OP4 E00B2E 0 +OP4 E00B2F 0 +OP4 E00B30 0 +OP4 E00B31 0 +OP4 E00B32 0 +OP4 E00B33 0 +OP4 E00B34 0 +OP4 E00B35 0 +OP4 E00B36 0 +OP4 E00B37 0 +OP4 E00B38 0 +OP4 E00B39 0 +OP4 E00B3A 0 +OP4 E00B3B 0 +OP4 E00B3C 0 +OP4 E00B3D 0 +OP4 E00B3E 0 +OP4 E00B3F 0 +OP4 E00B40 0 +OP4 E00B41 0 +OP4 E00B42 0 +OP4 E00B43 0 +OP4 E00B44 0 +OP4 E00B45 0 +OP4 E00B46 0 +OP4 E00B47 0 +OP4 E00B48 0 +OP4 E00B49 0 +OP4 E00B4A 0 +OP4 E00B4B 0 +OP4 E00B4C 0 +OP4 E00B4D 0 +OP4 E00B4E 0 +OP4 E00B4F 0 +OP4 E00B50 0 +OP4 E00B51 0 +OP4 E00B52 0 +OP4 E00B53 0 +OP4 E00B54 0 +OP4 E00B55 0 +OP4 E00B56 0 +OP4 E00B57 0 +OP4 E00B58 0 +OP4 E00B59 0 +OP4 E00B5A 0 +OP4 E00B5B 0 +OP4 E00B5C 0 +OP4 E00B5D 0 +OP4 E00B5E 0 +OP4 E00B5F 0 +OP4 E00B60 0 +OP4 E00B61 0 +OP4 E00B62 0 +OP4 E00B63 0 +OP4 E00B64 0 +OP4 E00B65 0 +OP4 E00B66 0 +OP4 E00B67 0 +OP4 E00B68 0 +OP4 E00B69 0 +OP4 E00B6A 0 +OP4 E00B6B 0 +OP4 E00B6C 0 +OP4 E00B6D 0 +OP4 E00B6E 0 +OP4 E00B6F 0 +OP4 E00B70 0 +OP4 E00B71 0 +OP4 E00B72 0 +OP4 E00B73 0 +OP4 E00B74 0 +OP4 E00B75 0 +OP4 E00B76 0 +OP4 E00B77 0 +OP4 E00B78 0 +OP4 E00B79 0 +OP4 E00B7A 0 +OP4 E00B7B 0 +OP4 E00B7C 0 +OP4 E00B7D 0 +OP4 E00B7E 0 +OP4 E00B7F 0 +OP4 E00B80 0 +OP4 E00B81 0 +OP4 E00B82 0 +OP4 E00B83 0 +OP4 E00B84 0 +OP4 E00B85 0 +OP4 E00B86 0 +OP4 E00B87 0 +OP4 E00B88 0 +OP4 E00B89 0 +OP4 E00B8A 0 +OP4 E00B8B 0 +OP4 E00B8C 0 +OP4 E00B8D 0 +OP4 E00B8E 0 +OP4 E00B8F 0 +OP4 E00B90 0 +OP4 E00B91 0 +OP4 E00B92 0 +OP4 E00B93 0 +OP4 E00B94 0 +OP4 E00B95 0 +OP4 E00B96 0 +OP4 E00B97 0 +OP4 E00B98 0 +OP4 E00B99 0 +OP4 E00B9A 0 +OP4 E00B9B 0 +OP4 E00B9C 0 +OP4 E00B9D 0 +OP4 E00B9E 0 +OP4 E00B9F 0 +OP4 E00BA0 0 +OP4 E00BA1 0 +OP4 E00BA2 0 +OP4 E00BA3 0 +OP4 E00BA4 0 +OP4 E00BA5 0 +OP4 E00BA6 0 +OP4 E00BA7 0 +OP4 E00BA8 0 +OP4 E00BA9 0 +OP4 E00BAA 0 +OP4 E00BAB 0 +OP4 E00BAC 0 +OP4 E00BAD 0 +OP4 E00BAE 0 +OP4 E00BAF 0 +OP4 E00BB0 0 +OP4 E00BB1 0 +OP4 E00BB2 0 +OP4 E00BB3 0 +OP4 E00BB4 0 +OP4 E00BB5 0 +OP4 E00BB6 0 +OP4 E00BB7 0 +OP4 E00BB8 0 +OP4 E00BB9 0 +OP4 E00BBA 0 +OP4 E00BBB 0 +OP4 E00BBC 0 +OP4 E00BBD 0 +OP4 E00BBE 0 +OP4 E00BBF 0 +OP4 E00BC0 0 +OP4 E00BC1 0 +OP4 E00BC2 0 +OP4 E00BC3 0 +OP4 E00BC4 0 +OP4 E00BC5 0 +OP4 E00BC6 0 +OP4 E00BC7 0 +OP4 E00BC8 0 +OP4 E00BC9 0 +OP4 E00BCA 0 +OP4 E00BCB 0 +OP4 E00BCC 0 +OP4 E00BCD 0 +OP4 E00BCE 0 +OP4 E00BCF 0 +OP4 E00BD0 0 +OP4 E00BD1 0 +OP4 E00BD2 0 +OP4 E00BD3 0 +OP4 E00BD4 0 +OP4 E00BD5 0 +OP4 E00BD6 0 +OP4 E00BD7 0 +OP4 E00BD8 0 +OP4 E00BD9 0 +OP4 E00BDA 0 +OP4 E00BDB 0 +OP4 E00BDC 0 +OP4 E00BDD 0 +OP4 E00BDE 0 +OP4 E00BDF 0 +OP4 E00BE0 0 +OP4 E00BE1 0 +OP4 E00BE2 0 +OP4 E00BE3 0 +OP4 E00BE4 0 +OP4 E00BE5 0 +OP4 E00BE6 0 +OP4 E00BE7 0 +OP4 E00BE8 0 +OP4 E00BE9 0 +OP4 E00BEA 0 +OP4 E00BEB 0 +OP4 E00BEC 0 +OP4 E00BED 0 +OP4 E00BEE 0 +OP4 E00BEF 0 +OP4 E00BF0 0 +OP4 E00BF1 0 +OP4 E00BF2 0 +OP4 E00BF3 0 +OP4 E00BF4 0 +OP4 E00BF5 0 +OP4 E00BF6 0 +OP4 E00BF7 0 +OP4 E00BF8 0 +OP4 E00BF9 0 +OP4 E00BFA 0 +OP4 E00BFB 0 +OP4 E00BFC 0 +OP4 E00BFD 0 +OP4 E00BFE 0 +OP4 E00BFF 0 +OP4 E00C00 0 +OP4 E00C01 0 +OP4 E00C02 0 +OP4 E00C03 0 +OP4 E00C04 0 +OP4 E00C05 0 +OP4 E00C06 0 +OP4 E00C07 0 +OP4 E00C08 0 +OP4 E00C09 0 +OP4 E00C0A 0 +OP4 E00C0B 0 +OP4 E00C0C 0 +OP4 E00C0D 0 +OP4 E00C0E 0 +OP4 E00C0F 0 +OP4 E00C10 0 +OP4 E00C11 0 +OP4 E00C12 0 +OP4 E00C13 0 +OP4 E00C14 0 +OP4 E00C15 0 +OP4 E00C16 0 +OP4 E00C17 0 +OP4 E00C18 0 +OP4 E00C19 0 +OP4 E00C1A 0 +OP4 E00C1B 0 +OP4 E00C1C 0 +OP4 E00C1D 0 +OP4 E00C1E 0 +OP4 E00C1F 0 +OP4 E00C20 0 +OP4 E00C21 0 +OP4 E00C22 0 +OP4 E00C23 0 +OP4 E00C24 0 +OP4 E00C25 0 +OP4 E00C26 0 +OP4 E00C27 0 +OP4 E00C28 0 +OP4 E00C29 0 +OP4 E00C2A 0 +OP4 E00C2B 0 +OP4 E00C2C 0 +OP4 E00C2D 0 +OP4 E00C2E 0 +OP4 E00C2F 0 +OP4 E00C30 0 +OP4 E00C31 0 +OP4 E00C32 0 +OP4 E00C33 0 +OP4 E00C34 0 +OP4 E00C35 0 +OP4 E00C36 0 +OP4 E00C37 0 +OP4 E00C38 0 +OP4 E00C39 0 +OP4 E00C3A 0 +OP4 E00C3B 0 +OP4 E00C3C 0 +OP4 E00C3D 0 +OP4 E00C3E 0 +OP4 E00C3F 0 +OP4 E00C40 0 +OP4 E00C41 0 +OP4 E00C42 0 +OP4 E00C43 0 +OP4 E00C44 0 +OP4 E00C45 0 +OP4 E00C46 0 +OP4 E00C47 0 +OP4 E00C48 0 +OP4 E00C49 0 +OP4 E00C4A 0 +OP4 E00C4B 0 +OP4 E00C4C 0 +OP4 E00C4D 0 +OP4 E00C4E 0 +OP4 E00C4F 0 +OP4 E00C50 0 +OP4 E00C51 0 +OP4 E00C52 0 +OP4 E00C53 0 +OP4 E00C54 0 +OP4 E00C55 0 +OP4 E00C56 0 +OP4 E00C57 0 +OP4 E00C58 0 +OP4 E00C59 0 +OP4 E00C5A 0 +OP4 E00C5B 0 +OP4 E00C5C 0 +OP4 E00C5D 0 +OP4 E00C5E 0 +OP4 E00C5F 0 +OP4 E00C60 0 +OP4 E00C61 0 +OP4 E00C62 0 +OP4 E00C63 0 +OP4 E00C64 0 +OP4 E00C65 0 +OP4 E00C66 0 +OP4 E00C67 0 +OP4 E00C68 0 +OP4 E00C69 0 +OP4 E00C6A 0 +OP4 E00C6B 0 +OP4 E00C6C 0 +OP4 E00C6D 0 +OP4 E00C6E 0 +OP4 E00C6F 0 +OP4 E00C70 0 +OP4 E00C71 0 +OP4 E00C72 0 +OP4 E00C73 0 +OP4 E00C74 0 +OP4 E00C75 0 +OP4 E00C76 0 +OP4 E00C77 0 +OP4 E00C78 0 +OP4 E00C79 0 +OP4 E00C7A 0 +OP4 E00C7B 0 +OP4 E00C7C 0 +OP4 E00C7D 0 +OP4 E00C7E 0 +OP4 E00C7F 0 +OP4 E00C80 0 +OP4 E00C81 0 +OP4 E00C82 0 +OP4 E00C83 0 +OP4 E00C84 0 +OP4 E00C85 0 +OP4 E00C86 0 +OP4 E00C87 0 +OP4 E00C88 0 +OP4 E00C89 0 +OP4 E00C8A 0 +OP4 E00C8B 0 +OP4 E00C8C 0 +OP4 E00C8D 0 +OP4 E00C8E 0 +OP4 E00C8F 0 +OP4 E00C90 0 +OP4 E00C91 0 +OP4 E00C92 0 +OP4 E00C93 0 +OP4 E00C94 0 +OP4 E00C95 0 +OP4 E00C96 0 +OP4 E00C97 0 +OP4 E00C98 0 +OP4 E00C99 0 +OP4 E00C9A 0 +OP4 E00C9B 0 +OP4 E00C9C 0 +OP4 E00C9D 0 +OP4 E00C9E 0 +OP4 E00C9F 0 +OP4 E00CA0 0 +OP4 E00CA1 0 +OP4 E00CA2 0 +OP4 E00CA3 0 +OP4 E00CA4 0 +OP4 E00CA5 0 +OP4 E00CA6 0 +OP4 E00CA7 0 +OP4 E00CA8 0 +OP4 E00CA9 0 +OP4 E00CAA 0 +OP4 E00CAB 0 +OP4 E00CAC 0 +OP4 E00CAD 0 +OP4 E00CAE 0 +OP4 E00CAF 0 +OP4 E00CB0 0 +OP4 E00CB1 0 +OP4 E00CB2 0 +OP4 E00CB3 0 +OP4 E00CB4 0 +OP4 E00CB5 0 +OP4 E00CB6 0 +OP4 E00CB7 0 +OP4 E00CB8 0 +OP4 E00CB9 0 +OP4 E00CBA 0 +OP4 E00CBB 0 +OP4 E00CBC 0 +OP4 E00CBD 0 +OP4 E00CBE 0 +OP4 E00CBF 0 +OP4 E00CC0 0 +OP4 E00CC1 0 +OP4 E00CC2 0 +OP4 E00CC3 0 +OP4 E00CC4 0 +OP4 E00CC5 0 +OP4 E00CC6 0 +OP4 E00CC7 0 +OP4 E00CC8 0 +OP4 E00CC9 0 +OP4 E00CCA 0 +OP4 E00CCB 0 +OP4 E00CCC 0 +OP4 E00CCD 0 +OP4 E00CCE 0 +OP4 E00CCF 0 +OP4 E00CD0 0 +OP4 E00CD1 0 +OP4 E00CD2 0 +OP4 E00CD3 0 +OP4 E00CD4 0 +OP4 E00CD5 0 +OP4 E00CD6 0 +OP4 E00CD7 0 +OP4 E00CD8 0 +OP4 E00CD9 0 +OP4 E00CDA 0 +OP4 E00CDB 0 +OP4 E00CDC 0 +OP4 E00CDD 0 +OP4 E00CDE 0 +OP4 E00CDF 0 +OP4 E00CE0 0 +OP4 E00CE1 0 +OP4 E00CE2 0 +OP4 E00CE3 0 +OP4 E00CE4 0 +OP4 E00CE5 0 +OP4 E00CE6 0 +OP4 E00CE7 0 +OP4 E00CE8 0 +OP4 E00CE9 0 +OP4 E00CEA 0 +OP4 E00CEB 0 +OP4 E00CEC 0 +OP4 E00CED 0 +OP4 E00CEE 0 +OP4 E00CEF 0 +OP4 E00CF0 0 +OP4 E00CF1 0 +OP4 E00CF2 0 +OP4 E00CF3 0 +OP4 E00CF4 0 +OP4 E00CF5 0 +OP4 E00CF6 0 +OP4 E00CF7 0 +OP4 E00CF8 0 +OP4 E00CF9 0 +OP4 E00CFA 0 +OP4 E00CFB 0 +OP4 E00CFC 0 +OP4 E00CFD 0 +OP4 E00CFE 0 +OP4 E00CFF 0 +OP4 E00D00 0 +OP4 E00D01 0 +OP4 E00D02 0 +OP4 E00D03 0 +OP4 E00D04 0 +OP4 E00D05 0 +OP4 E00D06 0 +OP4 E00D07 0 +OP4 E00D08 0 +OP4 E00D09 0 +OP4 E00D0A 0 +OP4 E00D0B 0 +OP4 E00D0C 0 +OP4 E00D0D 0 +OP4 E00D0E 0 +OP4 E00D0F 0 +OP4 E00D10 0 +OP4 E00D11 0 +OP4 E00D12 0 +OP4 E00D13 0 +OP4 E00D14 0 +OP4 E00D15 0 +OP4 E00D16 0 +OP4 E00D17 0 +OP4 E00D18 0 +OP4 E00D19 0 +OP4 E00D1A 0 +OP4 E00D1B 0 +OP4 E00D1C 0 +OP4 E00D1D 0 +OP4 E00D1E 0 +OP4 E00D1F 0 +OP4 E00D20 0 +OP4 E00D21 0 +OP4 E00D22 0 +OP4 E00D23 0 +OP4 E00D24 0 +OP4 E00D25 0 +OP4 E00D26 0 +OP4 E00D27 0 +OP4 E00D28 0 +OP4 E00D29 0 +OP4 E00D2A 0 +OP4 E00D2B 0 +OP4 E00D2C 0 +OP4 E00D2D 0 +OP4 E00D2E 0 +OP4 E00D2F 0 +OP4 E00D30 0 +OP4 E00D31 0 +OP4 E00D32 0 +OP4 E00D33 0 +OP4 E00D34 0 +OP4 E00D35 0 +OP4 E00D36 0 +OP4 E00D37 0 +OP4 E00D38 0 +OP4 E00D39 0 +OP4 E00D3A 0 +OP4 E00D3B 0 +OP4 E00D3C 0 +OP4 E00D3D 0 +OP4 E00D3E 0 +OP4 E00D3F 0 +OP4 E00D40 0 +OP4 E00D41 0 +OP4 E00D42 0 +OP4 E00D43 0 +OP4 E00D44 0 +OP4 E00D45 0 +OP4 E00D46 0 +OP4 E00D47 0 +OP4 E00D48 0 +OP4 E00D49 0 +OP4 E00D4A 0 +OP4 E00D4B 0 +OP4 E00D4C 0 +OP4 E00D4D 0 +OP4 E00D4E 0 +OP4 E00D4F 0 +OP4 E00D50 0 +OP4 E00D51 0 +OP4 E00D52 0 +OP4 E00D53 0 +OP4 E00D54 0 +OP4 E00D55 0 +OP4 E00D56 0 +OP4 E00D57 0 +OP4 E00D58 0 +OP4 E00D59 0 +OP4 E00D5A 0 +OP4 E00D5B 0 +OP4 E00D5C 0 +OP4 E00D5D 0 +OP4 E00D5E 0 +OP4 E00D5F 0 +OP4 E00D60 0 +OP4 E00D61 0 +OP4 E00D62 0 +OP4 E00D63 0 +OP4 E00D64 0 +OP4 E00D65 0 +OP4 E00D66 0 +OP4 E00D67 0 +OP4 E00D68 0 +OP4 E00D69 0 +OP4 E00D6A 0 +OP4 E00D6B 0 +OP4 E00D6C 0 +OP4 E00D6D 0 +OP4 E00D6E 0 +OP4 E00D6F 0 +OP4 E00D70 0 +OP4 E00D71 0 +OP4 E00D72 0 +OP4 E00D73 0 +OP4 E00D74 0 +OP4 E00D75 0 +OP4 E00D76 0 +OP4 E00D77 0 +OP4 E00D78 0 +OP4 E00D79 0 +OP4 E00D7A 0 +OP4 E00D7B 0 +OP4 E00D7C 0 +OP4 E00D7D 0 +OP4 E00D7E 0 +OP4 E00D7F 0 +OP4 E00D80 0 +OP4 E00D81 0 +OP4 E00D82 0 +OP4 E00D83 0 +OP4 E00D84 0 +OP4 E00D85 0 +OP4 E00D86 0 +OP4 E00D87 0 +OP4 E00D88 0 +OP4 E00D89 0 +OP4 E00D8A 0 +OP4 E00D8B 0 +OP4 E00D8C 0 +OP4 E00D8D 0 +OP4 E00D8E 0 +OP4 E00D8F 0 +OP4 E00D90 0 +OP4 E00D91 0 +OP4 E00D92 0 +OP4 E00D93 0 +OP4 E00D94 0 +OP4 E00D95 0 +OP4 E00D96 0 +OP4 E00D97 0 +OP4 E00D98 0 +OP4 E00D99 0 +OP4 E00D9A 0 +OP4 E00D9B 0 +OP4 E00D9C 0 +OP4 E00D9D 0 +OP4 E00D9E 0 +OP4 E00D9F 0 +OP4 E00DA0 0 +OP4 E00DA1 0 +OP4 E00DA2 0 +OP4 E00DA3 0 +OP4 E00DA4 0 +OP4 E00DA5 0 +OP4 E00DA6 0 +OP4 E00DA7 0 +OP4 E00DA8 0 +OP4 E00DA9 0 +OP4 E00DAA 0 +OP4 E00DAB 0 +OP4 E00DAC 0 +OP4 E00DAD 0 +OP4 E00DAE 0 +OP4 E00DAF 0 +OP4 E00DB0 0 +OP4 E00DB1 0 +OP4 E00DB2 0 +OP4 E00DB3 0 +OP4 E00DB4 0 +OP4 E00DB5 0 +OP4 E00DB6 0 +OP4 E00DB7 0 +OP4 E00DB8 0 +OP4 E00DB9 0 +OP4 E00DBA 0 +OP4 E00DBB 0 +OP4 E00DBC 0 +OP4 E00DBD 0 +OP4 E00DBE 0 +OP4 E00DBF 0 +OP4 E00DC0 0 +OP4 E00DC1 0 +OP4 E00DC2 0 +OP4 E00DC3 0 +OP4 E00DC4 0 +OP4 E00DC5 0 +OP4 E00DC6 0 +OP4 E00DC7 0 +OP4 E00DC8 0 +OP4 E00DC9 0 +OP4 E00DCA 0 +OP4 E00DCB 0 +OP4 E00DCC 0 +OP4 E00DCD 0 +OP4 E00DCE 0 +OP4 E00DCF 0 +OP4 E00DD0 0 +OP4 E00DD1 0 +OP4 E00DD2 0 +OP4 E00DD3 0 +OP4 E00DD4 0 +OP4 E00DD5 0 +OP4 E00DD6 0 +OP4 E00DD7 0 +OP4 E00DD8 0 +OP4 E00DD9 0 +OP4 E00DDA 0 +OP4 E00DDB 0 +OP4 E00DDC 0 +OP4 E00DDD 0 +OP4 E00DDE 0 +OP4 E00DDF 0 +OP4 E00DE0 0 +OP4 E00DE1 0 +OP4 E00DE2 0 +OP4 E00DE3 0 +OP4 E00DE4 0 +OP4 E00DE5 0 +OP4 E00DE6 0 +OP4 E00DE7 0 +OP4 E00DE8 0 +OP4 E00DE9 0 +OP4 E00DEA 0 +OP4 E00DEB 0 +OP4 E00DEC 0 +OP4 E00DED 0 +OP4 E00DEE 0 +OP4 E00DEF 0 +OP4 E00DF0 0 +OP4 E00DF1 0 +OP4 E00DF2 0 +OP4 E00DF3 0 +OP4 E00DF4 0 +OP4 E00DF5 0 +OP4 E00DF6 0 +OP4 E00DF7 0 +OP4 E00DF8 0 +OP4 E00DF9 0 +OP4 E00DFA 0 +OP4 E00DFB 0 +OP4 E00DFC 0 +OP4 E00DFD 0 +OP4 E00DFE 0 +OP4 E00DFF 0 +OP4 E00E00 0 +OP4 E00E01 0 +OP4 E00E02 0 +OP4 E00E03 0 +OP4 E00E04 0 +OP4 E00E05 0 +OP4 E00E06 0 +OP4 E00E07 0 +OP4 E00E08 0 +OP4 E00E09 0 +OP4 E00E0A 0 +OP4 E00E0B 0 +OP4 E00E0C 0 +OP4 E00E0D 0 +OP4 E00E0E 0 +OP4 E00E0F 0 +OP4 E00E10 0 +OP4 E00E11 0 +OP4 E00E12 0 +OP4 E00E13 0 +OP4 E00E14 0 +OP4 E00E15 0 +OP4 E00E16 0 +OP4 E00E17 0 +OP4 E00E18 0 +OP4 E00E19 0 +OP4 E00E1A 0 +OP4 E00E1B 0 +OP4 E00E1C 0 +OP4 E00E1D 0 +OP4 E00E1E 0 +OP4 E00E1F 0 +OP4 E00E20 0 +OP4 E00E21 0 +OP4 E00E22 0 +OP4 E00E23 0 +OP4 E00E24 0 +OP4 E00E25 0 +OP4 E00E26 0 +OP4 E00E27 0 +OP4 E00E28 0 +OP4 E00E29 0 +OP4 E00E2A 0 +OP4 E00E2B 0 +OP4 E00E2C 0 +OP4 E00E2D 0 +OP4 E00E2E 0 +OP4 E00E2F 0 +OP4 E00E30 0 +OP4 E00E31 0 +OP4 E00E32 0 +OP4 E00E33 0 +OP4 E00E34 0 +OP4 E00E35 0 +OP4 E00E36 0 +OP4 E00E37 0 +OP4 E00E38 0 +OP4 E00E39 0 +OP4 E00E3A 0 +OP4 E00E3B 0 +OP4 E00E3C 0 +OP4 E00E3D 0 +OP4 E00E3E 0 +OP4 E00E3F 0 +OP4 E00E40 0 +OP4 E00E41 0 +OP4 E00E42 0 +OP4 E00E43 0 +OP4 E00E44 0 +OP4 E00E45 0 +OP4 E00E46 0 +OP4 E00E47 0 +OP4 E00E48 0 +OP4 E00E49 0 +OP4 E00E4A 0 +OP4 E00E4B 0 +OP4 E00E4C 0 +OP4 E00E4D 0 +OP4 E00E4E 0 +OP4 E00E4F 0 +OP4 E00E50 0 +OP4 E00E51 0 +OP4 E00E52 0 +OP4 E00E53 0 +OP4 E00E54 0 +OP4 E00E55 0 +OP4 E00E56 0 +OP4 E00E57 0 +OP4 E00E58 0 +OP4 E00E59 0 +OP4 E00E5A 0 +OP4 E00E5B 0 +OP4 E00E5C 0 +OP4 E00E5D 0 +OP4 E00E5E 0 +OP4 E00E5F 0 +OP4 E00E60 0 +OP4 E00E61 0 +OP4 E00E62 0 +OP4 E00E63 0 +OP4 E00E64 0 +OP4 E00E65 0 +OP4 E00E66 0 +OP4 E00E67 0 +OP4 E00E68 0 +OP4 E00E69 0 +OP4 E00E6A 0 +OP4 E00E6B 0 +OP4 E00E6C 0 +OP4 E00E6D 0 +OP4 E00E6E 0 +OP4 E00E6F 0 +OP4 E00E70 0 +OP4 E00E71 0 +OP4 E00E72 0 +OP4 E00E73 0 +OP4 E00E74 0 +OP4 E00E75 0 +OP4 E00E76 0 +OP4 E00E77 0 +OP4 E00E78 0 +OP4 E00E79 0 +OP4 E00E7A 0 +OP4 E00E7B 0 +OP4 E00E7C 0 +OP4 E00E7D 0 +OP4 E00E7E 0 +OP4 E00E7F 0 +OP4 E00E80 0 +OP4 E00E81 0 +OP4 E00E82 0 +OP4 E00E83 0 +OP4 E00E84 0 +OP4 E00E85 0 +OP4 E00E86 0 +OP4 E00E87 0 +OP4 E00E88 0 +OP4 E00E89 0 +OP4 E00E8A 0 +OP4 E00E8B 0 +OP4 E00E8C 0 +OP4 E00E8D 0 +OP4 E00E8E 0 +OP4 E00E8F 0 +OP4 E00E90 0 +OP4 E00E91 0 +OP4 E00E92 0 +OP4 E00E93 0 +OP4 E00E94 0 +OP4 E00E95 0 +OP4 E00E96 0 +OP4 E00E97 0 +OP4 E00E98 0 +OP4 E00E99 0 +OP4 E00E9A 0 +OP4 E00E9B 0 +OP4 E00E9C 0 +OP4 E00E9D 0 +OP4 E00E9E 0 +OP4 E00E9F 0 +OP4 E00EA0 0 +OP4 E00EA1 0 +OP4 E00EA2 0 +OP4 E00EA3 0 +OP4 E00EA4 0 +OP4 E00EA5 0 +OP4 E00EA6 0 +OP4 E00EA7 0 +OP4 E00EA8 0 +OP4 E00EA9 0 +OP4 E00EAA 0 +OP4 E00EAB 0 +OP4 E00EAC 0 +OP4 E00EAD 0 +OP4 E00EAE 0 +OP4 E00EAF 0 +OP4 E00EB0 0 +OP4 E00EB1 0 +OP4 E00EB2 0 +OP4 E00EB3 0 +OP4 E00EB4 0 +OP4 E00EB5 0 +OP4 E00EB6 0 +OP4 E00EB7 0 +OP4 E00EB8 0 +OP4 E00EB9 0 +OP4 E00EBA 0 +OP4 E00EBB 0 +OP4 E00EBC 0 +OP4 E00EBD 0 +OP4 E00EBE 0 +OP4 E00EBF 0 +OP4 E00EC0 0 +OP4 E00EC1 0 +OP4 E00EC2 0 +OP4 E00EC3 0 +OP4 E00EC4 0 +OP4 E00EC5 0 +OP4 E00EC6 0 +OP4 E00EC7 0 +OP4 E00EC8 0 +OP4 E00EC9 0 +OP4 E00ECA 0 +OP4 E00ECB 0 +OP4 E00ECC 0 +OP4 E00ECD 0 +OP4 E00ECE 0 +OP4 E00ECF 0 +OP4 E00ED0 0 +OP4 E00ED1 0 +OP4 E00ED2 0 +OP4 E00ED3 0 +OP4 E00ED4 0 +OP4 E00ED5 0 +OP4 E00ED6 0 +OP4 E00ED7 0 +OP4 E00ED8 0 +OP4 E00ED9 0 +OP4 E00EDA 0 +OP4 E00EDB 0 +OP4 E00EDC 0 +OP4 E00EDD 0 +OP4 E00EDE 0 +OP4 E00EDF 0 +OP4 E00EE0 0 +OP4 E00EE1 0 +OP4 E00EE2 0 +OP4 E00EE3 0 +OP4 E00EE4 0 +OP4 E00EE5 0 +OP4 E00EE6 0 +OP4 E00EE7 0 +OP4 E00EE8 0 +OP4 E00EE9 0 +OP4 E00EEA 0 +OP4 E00EEB 0 +OP4 E00EEC 0 +OP4 E00EED 0 +OP4 E00EEE 0 +OP4 E00EEF 0 +OP4 E00EF0 0 +OP4 E00EF1 0 +OP4 E00EF2 0 +OP4 E00EF3 0 +OP4 E00EF4 0 +OP4 E00EF5 0 +OP4 E00EF6 0 +OP4 E00EF7 0 +OP4 E00EF8 0 +OP4 E00EF9 0 +OP4 E00EFA 0 +OP4 E00EFB 0 +OP4 E00EFC 0 +OP4 E00EFD 0 +OP4 E00EFE 0 +OP4 E00EFF 0 +OP4 E00F00 0 +OP4 E00F01 0 +OP4 E00F02 0 +OP4 E00F03 0 +OP4 E00F04 0 +OP4 E00F05 0 +OP4 E00F06 0 +OP4 E00F07 0 +OP4 E00F08 0 +OP4 E00F09 0 +OP4 E00F0A 0 +OP4 E00F0B 0 +OP4 E00F0C 0 +OP4 E00F0D 0 +OP4 E00F0E 0 +OP4 E00F0F 0 +OP4 E00F10 0 +OP4 E00F11 0 +OP4 E00F12 0 +OP4 E00F13 0 +OP4 E00F14 0 +OP4 E00F15 0 +OP4 E00F16 0 +OP4 E00F17 0 +OP4 E00F18 0 +OP4 E00F19 0 +OP4 E00F1A 0 +OP4 E00F1B 0 +OP4 E00F1C 0 +OP4 E00F1D 0 +OP4 E00F1E 0 +OP4 E00F1F 0 +OP4 E00F20 0 +OP4 E00F21 0 +OP4 E00F22 0 +OP4 E00F23 0 +OP4 E00F24 0 +OP4 E00F25 0 +OP4 E00F26 0 +OP4 E00F27 0 +OP4 E00F28 0 +OP4 E00F29 0 +OP4 E00F2A 0 +OP4 E00F2B 0 +OP4 E00F2C 0 +OP4 E00F2D 0 +OP4 E00F2E 0 +OP4 E00F2F 0 +OP4 E00F30 0 +OP4 E00F31 0 +OP4 E00F32 0 +OP4 E00F33 0 +OP4 E00F34 0 +OP4 E00F35 0 +OP4 E00F36 0 +OP4 E00F37 0 +OP4 E00F38 0 +OP4 E00F39 0 +OP4 E00F3A 0 +OP4 E00F3B 0 +OP4 E00F3C 0 +OP4 E00F3D 0 +OP4 E00F3E 0 +OP4 E00F3F 0 +OP4 E00F40 0 +OP4 E00F41 0 +OP4 E00F42 0 +OP4 E00F43 0 +OP4 E00F44 0 +OP4 E00F45 0 +OP4 E00F46 0 +OP4 E00F47 0 +OP4 E00F48 0 +OP4 E00F49 0 +OP4 E00F4A 0 +OP4 E00F4B 0 +OP4 E00F4C 0 +OP4 E00F4D 0 +OP4 E00F4E 0 +OP4 E00F4F 0 +OP4 E00F50 0 +OP4 E00F51 0 +OP4 E00F52 0 +OP4 E00F53 0 +OP4 E00F54 0 +OP4 E00F55 0 +OP4 E00F56 0 +OP4 E00F57 0 +OP4 E00F58 0 +OP4 E00F59 0 +OP4 E00F5A 0 +OP4 E00F5B 0 +OP4 E00F5C 0 +OP4 E00F5D 0 +OP4 E00F5E 0 +OP4 E00F5F 0 +OP4 E00F60 0 +OP4 E00F61 0 +OP4 E00F62 0 +OP4 E00F63 0 +OP4 E00F64 0 +OP4 E00F65 0 +OP4 E00F66 0 +OP4 E00F67 0 +OP4 E00F68 0 +OP4 E00F69 0 +OP4 E00F6A 0 +OP4 E00F6B 0 +OP4 E00F6C 0 +OP4 E00F6D 0 +OP4 E00F6E 0 +OP4 E00F6F 0 +OP4 E00F70 0 +OP4 E00F71 0 +OP4 E00F72 0 +OP4 E00F73 0 +OP4 E00F74 0 +OP4 E00F75 0 +OP4 E00F76 0 +OP4 E00F77 0 +OP4 E00F78 0 +OP4 E00F79 0 +OP4 E00F7A 0 +OP4 E00F7B 0 +OP4 E00F7C 0 +OP4 E00F7D 0 +OP4 E00F7E 0 +OP4 E00F7F 0 +OP4 E00F80 0 +OP4 E00F81 0 +OP4 E00F82 0 +OP4 E00F83 0 +OP4 E00F84 0 +OP4 E00F85 0 +OP4 E00F86 0 +OP4 E00F87 0 +OP4 E00F88 0 +OP4 E00F89 0 +OP4 E00F8A 0 +OP4 E00F8B 0 +OP4 E00F8C 0 +OP4 E00F8D 0 +OP4 E00F8E 0 +OP4 E00F8F 0 +OP4 E00F90 0 +OP4 E00F91 0 +OP4 E00F92 0 +OP4 E00F93 0 +OP4 E00F94 0 +OP4 E00F95 0 +OP4 E00F96 0 +OP4 E00F97 0 +OP4 E00F98 0 +OP4 E00F99 0 +OP4 E00F9A 0 +OP4 E00F9B 0 +OP4 E00F9C 0 +OP4 E00F9D 0 +OP4 E00F9E 0 +OP4 E00F9F 0 +OP4 E00FA0 0 +OP4 E00FA1 0 +OP4 E00FA2 0 +OP4 E00FA3 0 +OP4 E00FA4 0 +OP4 E00FA5 0 +OP4 E00FA6 0 +OP4 E00FA7 0 +OP4 E00FA8 0 +OP4 E00FA9 0 +OP4 E00FAA 0 +OP4 E00FAB 0 +OP4 E00FAC 0 +OP4 E00FAD 0 +OP4 E00FAE 0 +OP4 E00FAF 0 +OP4 E00FB0 0 +OP4 E00FB1 0 +OP4 E00FB2 0 +OP4 E00FB3 0 +OP4 E00FB4 0 +OP4 E00FB5 0 +OP4 E00FB6 0 +OP4 E00FB7 0 +OP4 E00FB8 0 +OP4 E00FB9 0 +OP4 E00FBA 0 +OP4 E00FBB 0 +OP4 E00FBC 0 +OP4 E00FBD 0 +OP4 E00FBE 0 +OP4 E00FBF 0 +OP4 E00FC0 0 +OP4 E00FC1 0 +OP4 E00FC2 0 +OP4 E00FC3 0 +OP4 E00FC4 0 +OP4 E00FC5 0 +OP4 E00FC6 0 +OP4 E00FC7 0 +OP4 E00FC8 0 +OP4 E00FC9 0 +OP4 E00FCA 0 +OP4 E00FCB 0 +OP4 E00FCC 0 +OP4 E00FCD 0 +OP4 E00FCE 0 +OP4 E00FCF 0 +OP4 E00FD0 0 +OP4 E00FD1 0 +OP4 E00FD2 0 +OP4 E00FD3 0 +OP4 E00FD4 0 +OP4 E00FD5 0 +OP4 E00FD6 0 +OP4 E00FD7 0 +OP4 E00FD8 0 +OP4 E00FD9 0 +OP4 E00FDA 0 +OP4 E00FDB 0 +OP4 E00FDC 0 +OP4 E00FDD 0 +OP4 E00FDE 0 +OP4 E00FDF 0 +OP4 E00FE0 0 +OP4 E00FE1 0 +OP4 E00FE2 0 +OP4 E00FE3 0 +OP4 E00FE4 0 +OP4 E00FE5 0 +OP4 E00FE6 0 +OP4 E00FE7 0 +OP4 E00FE8 0 +OP4 E00FE9 0 +OP4 E00FEA 0 +OP4 E00FEB 0 +OP4 E00FEC 0 +OP4 E00FED 0 +OP4 E00FEE 0 +OP4 E00FEF 0 +OP4 E00FF0 0 +OP4 E00FF1 0 +OP4 E00FF2 0 +OP4 E00FF3 0 +OP4 E00FF4 0 +OP4 E00FF5 0 +OP4 E00FF6 0 +OP4 E00FF7 0 +OP4 E00FF8 0 +OP4 E00FF9 0 +OP4 E00FFA 0 +OP4 E00FFB 0 +OP4 E00FFC 0 +OP4 E00FFD 0 +OP4 E00FFE 0 +OP4 E00FFF 0 +OP4 E01000 0 +OP4 E01001 0 +OP4 E01002 0 +OP4 E01003 0 +OP4 E01004 0 +OP4 E01005 0 +OP4 E01006 0 +OP4 E01007 0 +OP4 E01008 0 +OP4 E01009 0 +OP4 E0100A 0 +OP4 E0100B 0 +OP4 E0100C 0 +OP4 E0100D 0 +OP4 E0100E 0 +OP4 E0100F 0 +OP4 E01010 0 +OP4 E01011 0 +OP4 E01012 0 +OP4 E01013 0 +OP4 E01014 0 +OP4 E01015 0 +OP4 E01016 0 +OP4 E01017 0 +OP4 E01018 0 +OP4 E01019 0 +OP4 E0101A 0 +OP4 E0101B 0 +OP4 E0101C 0 +OP4 E0101D 0 +OP4 E0101E 0 +OP4 E0101F 0 +OP4 E01020 0 +OP4 E01021 0 +OP4 E01022 0 +OP4 E01023 0 +OP4 E01024 0 +OP4 E01025 0 +OP4 E01026 0 +OP4 E01027 0 +OP4 E01028 0 +OP4 E01029 0 +OP4 E0102A 0 +OP4 E0102B 0 +OP4 E0102C 0 +OP4 E0102D 0 +OP4 E0102E 0 +OP4 E0102F 0 +OP4 E01030 0 +OP4 E01031 0 +OP4 E01032 0 +OP4 E01033 0 +OP4 E01034 0 +OP4 E01035 0 +OP4 E01036 0 +OP4 E01037 0 +OP4 E01038 0 +OP4 E01039 0 +OP4 E0103A 0 +OP4 E0103B 0 +OP4 E0103C 0 +OP4 E0103D 0 +OP4 E0103E 0 +OP4 E0103F 0 +OP4 E01040 0 +OP4 E01041 0 +OP4 E01042 0 +OP4 E01043 0 +OP4 E01044 0 +OP4 E01045 0 +OP4 E01046 0 +OP4 E01047 0 +OP4 E01048 0 +OP4 E01049 0 +OP4 E0104A 0 +OP4 E0104B 0 +OP4 E0104C 0 +OP4 E0104D 0 +OP4 E0104E 0 +OP4 E0104F 0 +OP4 E01050 0 +OP4 E01051 0 +OP4 E01052 0 +OP4 E01053 0 +OP4 E01054 0 +OP4 E01055 0 +OP4 E01056 0 +OP4 E01057 0 +OP4 E01058 0 +OP4 E01059 0 +OP4 E0105A 0 +OP4 E0105B 0 +OP4 E0105C 0 +OP4 E0105D 0 +OP4 E0105E 0 +OP4 E0105F 0 +OP4 E01060 0 +OP4 E01061 0 +OP4 E01062 0 +OP4 E01063 0 +OP4 E01064 0 +OP4 E01065 0 +OP4 E01066 0 +OP4 E01067 0 +OP4 E01068 0 +OP4 E01069 0 +OP4 E0106A 0 +OP4 E0106B 0 +OP4 E0106C 0 +OP4 E0106D 0 +OP4 E0106E 0 +OP4 E0106F 0 +OP4 E01070 0 +OP4 E01071 0 +OP4 E01072 0 +OP4 E01073 0 +OP4 E01074 0 +OP4 E01075 0 +OP4 E01076 0 +OP4 E01077 0 +OP4 E01078 0 +OP4 E01079 0 +OP4 E0107A 0 +OP4 E0107B 0 +OP4 E0107C 0 +OP4 E0107D 0 +OP4 E0107E 0 +OP4 E0107F 0 +OP4 E01080 0 +OP4 E01081 0 +OP4 E01082 0 +OP4 E01083 0 +OP4 E01084 0 +OP4 E01085 0 +OP4 E01086 0 +OP4 E01087 0 +OP4 E01088 0 +OP4 E01089 0 +OP4 E0108A 0 +OP4 E0108B 0 +OP4 E0108C 0 +OP4 E0108D 0 +OP4 E0108E 0 +OP4 E0108F 0 +OP4 E01090 0 +OP4 E01091 0 +OP4 E01092 0 +OP4 E01093 0 +OP4 E01094 0 +OP4 E01095 0 +OP4 E01096 0 +OP4 E01097 0 +OP4 E01098 0 +OP4 E01099 0 +OP4 E0109A 0 +OP4 E0109B 0 +OP4 E0109C 0 +OP4 E0109D 0 +OP4 E0109E 0 +OP4 E0109F 0 +OP4 E010A0 0 +OP4 E010A1 0 +OP4 E010A2 0 +OP4 E010A3 0 +OP4 E010A4 0 +OP4 E010A5 0 +OP4 E010A6 0 +OP4 E010A7 0 +OP4 E010A8 0 +OP4 E010A9 0 +OP4 E010AA 0 +OP4 E010AB 0 +OP4 E010AC 0 +OP4 E010AD 0 +OP4 E010AE 0 +OP4 E010AF 0 +OP4 E010B0 0 +OP4 E010B1 0 +OP4 E010B2 0 +OP4 E010B3 0 +OP4 E010B4 0 +OP4 E010B5 0 +OP4 E010B6 0 +OP4 E010B7 0 +OP4 E010B8 0 +OP4 E010B9 0 +OP4 E010BA 0 +OP4 E010BB 0 +OP4 E010BC 0 +OP4 E010BD 0 +OP4 E010BE 0 +OP4 E010BF 0 +OP4 E010C0 0 +OP4 E010C1 0 +OP4 E010C2 0 +OP4 E010C3 0 +OP4 E010C4 0 +OP4 E010C5 0 +OP4 E010C6 0 +OP4 E010C7 0 +OP4 E010C8 0 +OP4 E010C9 0 +OP4 E010CA 0 +OP4 E010CB 0 +OP4 E010CC 0 +OP4 E010CD 0 +OP4 E010CE 0 +OP4 E010CF 0 +OP4 E010D0 0 +OP4 E010D1 0 +OP4 E010D2 0 +OP4 E010D3 0 +OP4 E010D4 0 +OP4 E010D5 0 +OP4 E010D6 0 +OP4 E010D7 0 +OP4 E010D8 0 +OP4 E010D9 0 +OP4 E010DA 0 +OP4 E010DB 0 +OP4 E010DC 0 +OP4 E010DD 0 +OP4 E010DE 0 +OP4 E010DF 0 +OP4 E010E0 0 +OP4 E010E1 0 +OP4 E010E2 0 +OP4 E010E3 0 +OP4 E010E4 0 +OP4 E010E5 0 +OP4 E010E6 0 +OP4 E010E7 0 +OP4 E010E8 0 +OP4 E010E9 0 +OP4 E010EA 0 +OP4 E010EB 0 +OP4 E010EC 0 +OP4 E010ED 0 +OP4 E010EE 0 +OP4 E010EF 0 +OP4 E010F0 0 +OP4 E010F1 0 +OP4 E010F2 0 +OP4 E010F3 0 +OP4 E010F4 0 +OP4 E010F5 0 +OP4 E010F6 0 +OP4 E010F7 0 +OP4 E010F8 0 +OP4 E010F9 0 +OP4 E010FA 0 +OP4 E010FB 0 +OP4 E010FC 0 +OP4 E010FD 0 +OP4 E010FE 0 +OP4 E010FF 0 +OP4 E01100 0 +OP4 E01101 0 +OP4 E01102 0 +OP4 E01103 0 +OP4 E01104 0 +OP4 E01105 0 +OP4 E01106 0 +OP4 E01107 0 +OP4 E01108 0 +OP4 E01109 0 +OP4 E0110A 0 +OP4 E0110B 0 +OP4 E0110C 0 +OP4 E0110D 0 +OP4 E0110E 0 +OP4 E0110F 0 +OP4 E01110 0 +OP4 E01111 0 +OP4 E01112 0 +OP4 E01113 0 +OP4 E01114 0 +OP4 E01115 0 +OP4 E01116 0 +OP4 E01117 0 +OP4 E01118 0 +OP4 E01119 0 +OP4 E0111A 0 +OP4 E0111B 0 +OP4 E0111C 0 +OP4 E0111D 0 +OP4 E0111E 0 +OP4 E0111F 0 +OP4 E01120 0 +OP4 E01121 0 +OP4 E01122 0 +OP4 E01123 0 +OP4 E01124 0 +OP4 E01125 0 +OP4 E01126 0 +OP4 E01127 0 +OP4 E01128 0 +OP4 E01129 0 +OP4 E0112A 0 +OP4 E0112B 0 +OP4 E0112C 0 +OP4 E0112D 0 +OP4 E0112E 0 +OP4 E0112F 0 +OP4 E01130 0 +OP4 E01131 0 +OP4 E01132 0 +OP4 E01133 0 +OP4 E01134 0 +OP4 E01135 0 +OP4 E01136 0 +OP4 E01137 0 +OP4 E01138 0 +OP4 E01139 0 +OP4 E0113A 0 +OP4 E0113B 0 +OP4 E0113C 0 +OP4 E0113D 0 +OP4 E0113E 0 +OP4 E0113F 0 +OP4 E01140 0 +OP4 E01141 0 +OP4 E01142 0 +OP4 E01143 0 +OP4 E01144 0 +OP4 E01145 0 +OP4 E01146 0 +OP4 E01147 0 +OP4 E01148 0 +OP4 E01149 0 +OP4 E0114A 0 +OP4 E0114B 0 +OP4 E0114C 0 +OP4 E0114D 0 +OP4 E0114E 0 +OP4 E0114F 0 +OP4 E01150 0 +OP4 E01151 0 +OP4 E01152 0 +OP4 E01153 0 +OP4 E01154 0 +OP4 E01155 0 +OP4 E01156 0 +OP4 E01157 0 +OP4 E01158 0 +OP4 E01159 0 +OP4 E0115A 0 +OP4 E0115B 0 +OP4 E0115C 0 +OP4 E0115D 0 +OP4 E0115E 0 +OP4 E0115F 0 +OP4 E01160 0 +OP4 E01161 0 +OP4 E01162 0 +OP4 E01163 0 +OP4 E01164 0 +OP4 E01165 0 +OP4 E01166 0 +OP4 E01167 0 +OP4 E01168 0 +OP4 E01169 0 +OP4 E0116A 0 +OP4 E0116B 0 +OP4 E0116C 0 +OP4 E0116D 0 +OP4 E0116E 0 +OP4 E0116F 0 +OP4 E01170 0 +OP4 E01171 0 +OP4 E01172 0 +OP4 E01173 0 +OP4 E01174 0 +OP4 E01175 0 +OP4 E01176 0 +OP4 E01177 0 +OP4 E01178 0 +OP4 E01179 0 +OP4 E0117A 0 +OP4 E0117B 0 +OP4 E0117C 0 +OP4 E0117D 0 +OP4 E0117E 0 +OP4 E0117F 0 +OP4 E01180 0 +OP4 E01181 0 +OP4 E01182 0 +OP4 E01183 0 +OP4 E01184 0 +OP4 E01185 0 +OP4 E01186 0 +OP4 E01187 0 +OP4 E01188 0 +OP4 E01189 0 +OP4 E0118A 0 +OP4 E0118B 0 +OP4 E0118C 0 +OP4 E0118D 0 +OP4 E0118E 0 +OP4 E0118F 0 +OP4 E01190 0 +OP4 E01191 0 +OP4 E01192 0 +OP4 E01193 0 +OP4 E01194 0 +OP4 E01195 0 +OP4 E01196 0 +OP4 E01197 0 +OP4 E01198 0 +OP4 E01199 0 +OP4 E0119A 0 +OP4 E0119B 0 +OP4 E0119C 0 +OP4 E0119D 0 +OP4 E0119E 0 +OP4 E0119F 0 +OP4 E011A0 0 +OP4 E011A1 0 +OP4 E011A2 0 +OP4 E011A3 0 +OP4 E011A4 0 +OP4 E011A5 0 +OP4 E011A6 0 +OP4 E011A7 0 +OP4 E011A8 0 +OP4 E011A9 0 +OP4 E011AA 0 +OP4 E011AB 0 +OP4 E011AC 0 +OP4 E011AD 0 +OP4 E011AE 0 +OP4 E011AF 0 +OP4 E011B0 0 +OP4 E011B1 0 +OP4 E011B2 0 +OP4 E011B3 0 +OP4 E011B4 0 +OP4 E011B5 0 +OP4 E011B6 0 +OP4 E011B7 0 +OP4 E011B8 0 +OP4 E011B9 0 +OP4 E011BA 0 +OP4 E011BB 0 +OP4 E011BC 0 +OP4 E011BD 0 +OP4 E011BE 0 +OP4 E011BF 0 +OP4 E011C0 0 +OP4 E011C1 0 +OP4 E011C2 0 +OP4 E011C3 0 +OP4 E011C4 0 +OP4 E011C5 0 +OP4 E011C6 0 +OP4 E011C7 0 +OP4 E011C8 0 +OP4 E011C9 0 +OP4 E011CA 0 +OP4 E011CB 0 +OP4 E011CC 0 +OP4 E011CD 0 +OP4 E011CE 0 +OP4 E011CF 0 +OP4 E011D0 0 +OP4 E011D1 0 +OP4 E011D2 0 +OP4 E011D3 0 +OP4 E011D4 0 +OP4 E011D5 0 +OP4 E011D6 0 +OP4 E011D7 0 +OP4 E011D8 0 +OP4 E011D9 0 +OP4 E011DA 0 +OP4 E011DB 0 +OP4 E011DC 0 +OP4 E011DD 0 +OP4 E011DE 0 +OP4 E011DF 0 +OP4 E011E0 0 +OP4 E011E1 0 +OP4 E011E2 0 +OP4 E011E3 0 +OP4 E011E4 0 +OP4 E011E5 0 +OP4 E011E6 0 +OP4 E011E7 0 +OP4 E011E8 0 +OP4 E011E9 0 +OP4 E011EA 0 +OP4 E011EB 0 +OP4 E011EC 0 +OP4 E011ED 0 +OP4 E011EE 0 +OP4 E011EF 0 +OP4 E011F0 0 +OP4 E011F1 0 +OP4 E011F2 0 +OP4 E011F3 0 +OP4 E011F4 0 +OP4 E011F5 0 +OP4 E011F6 0 +OP4 E011F7 0 +OP4 E011F8 0 +OP4 E011F9 0 +OP4 E011FA 0 +OP4 E011FB 0 +OP4 E011FC 0 +OP4 E011FD 0 +OP4 E011FE 0 +OP4 E011FF 0 +OP4 E01200 0 +OP4 E01201 0 +OP4 E01202 0 +OP4 E01203 0 +OP4 E01204 0 +OP4 E01205 0 +OP4 E01206 0 +OP4 E01207 0 +OP4 E01208 0 +OP4 E01209 0 +OP4 E0120A 0 +OP4 E0120B 0 +OP4 E0120C 0 +OP4 E0120D 0 +OP4 E0120E 0 +OP4 E0120F 0 +OP4 E01210 0 +OP4 E01211 0 +OP4 E01212 0 +OP4 E01213 0 +OP4 E01214 0 +OP4 E01215 0 +OP4 E01216 0 +OP4 E01217 0 +OP4 E01218 0 +OP4 E01219 0 +OP4 E0121A 0 +OP4 E0121B 0 +OP4 E0121C 0 +OP4 E0121D 0 +OP4 E0121E 0 +OP4 E0121F 0 +OP4 E01220 0 +OP4 E01221 0 +OP4 E01222 0 +OP4 E01223 0 +OP4 E01224 0 +OP4 E01225 0 +OP4 E01226 0 +OP4 E01227 0 +OP4 E01228 0 +OP4 E01229 0 +OP4 E0122A 0 +OP4 E0122B 0 +OP4 E0122C 0 +OP4 E0122D 0 +OP4 E0122E 0 +OP4 E0122F 0 +OP4 E01230 0 +OP4 E01231 0 +OP4 E01232 0 +OP4 E01233 0 +OP4 E01234 0 +OP4 E01235 0 +OP4 E01236 0 +OP4 E01237 0 +OP4 E01238 0 +OP4 E01239 0 +OP4 E0123A 0 +OP4 E0123B 0 +OP4 E0123C 0 +OP4 E0123D 0 +OP4 E0123E 0 +OP4 E0123F 0 +OP4 E01240 0 +OP4 E01241 0 +OP4 E01242 0 +OP4 E01243 0 +OP4 E01244 0 +OP4 E01245 0 +OP4 E01246 0 +OP4 E01247 0 +OP4 E01248 0 +OP4 E01249 0 +OP4 E0124A 0 +OP4 E0124B 0 +OP4 E0124C 0 +OP4 E0124D 0 +OP4 E0124E 0 +OP4 E0124F 0 +OP4 E01250 0 +OP4 E01251 0 +OP4 E01252 0 +OP4 E01253 0 +OP4 E01254 0 +OP4 E01255 0 +OP4 E01256 0 +OP4 E01257 0 +OP4 E01258 0 +OP4 E01259 0 +OP4 E0125A 0 +OP4 E0125B 0 +OP4 E0125C 0 +OP4 E0125D 0 +OP4 E0125E 0 +OP4 E0125F 0 +OP4 E01260 0 +OP4 E01261 0 +OP4 E01262 0 +OP4 E01263 0 +OP4 E01264 0 +OP4 E01265 0 +OP4 E01266 0 +OP4 E01267 0 +OP4 E01268 0 +OP4 E01269 0 +OP4 E0126A 0 +OP4 E0126B 0 +OP4 E0126C 0 +OP4 E0126D 0 +OP4 E0126E 0 +OP4 E0126F 0 +OP4 E01270 0 +OP4 E01271 0 +OP4 E01272 0 +OP4 E01273 0 +OP4 E01274 0 +OP4 E01275 0 +OP4 E01276 0 +OP4 E01277 0 +OP4 E01278 0 +OP4 E01279 0 +OP4 E0127A 0 +OP4 E0127B 0 +OP4 E0127C 0 +OP4 E0127D 0 +OP4 E0127E 0 +OP4 E0127F 0 +OP4 E01280 0 +OP4 E01281 0 +OP4 E01282 0 +OP4 E01283 0 +OP4 E01284 0 +OP4 E01285 0 +OP4 E01286 0 +OP4 E01287 0 +OP4 E01288 0 +OP4 E01289 0 +OP4 E0128A 0 +OP4 E0128B 0 +OP4 E0128C 0 +OP4 E0128D 0 +OP4 E0128E 0 +OP4 E0128F 0 +OP4 E01290 0 +OP4 E01291 0 +OP4 E01292 0 +OP4 E01293 0 +OP4 E01294 0 +OP4 E01295 0 +OP4 E01296 0 +OP4 E01297 0 +OP4 E01298 0 +OP4 E01299 0 +OP4 E0129A 0 +OP4 E0129B 0 +OP4 E0129C 0 +OP4 E0129D 0 +OP4 E0129E 0 +OP4 E0129F 0 +OP4 E012A0 0 +OP4 E012A1 0 +OP4 E012A2 0 +OP4 E012A3 0 +OP4 E012A4 0 +OP4 E012A5 0 +OP4 E012A6 0 +OP4 E012A7 0 +OP4 E012A8 0 +OP4 E012A9 0 +OP4 E012AA 0 +OP4 E012AB 0 +OP4 E012AC 0 +OP4 E012AD 0 +OP4 E012AE 0 +OP4 E012AF 0 +OP4 E012B0 0 +OP4 E012B1 0 +OP4 E012B2 0 +OP4 E012B3 0 +OP4 E012B4 0 +OP4 E012B5 0 +OP4 E012B6 0 +OP4 E012B7 0 +OP4 E012B8 0 +OP4 E012B9 0 +OP4 E012BA 0 +OP4 E012BB 0 +OP4 E012BC 0 +OP4 E012BD 0 +OP4 E012BE 0 +OP4 E012BF 0 +OP4 E012C0 0 +OP4 E012C1 0 +OP4 E012C2 0 +OP4 E012C3 0 +OP4 E012C4 0 +OP4 E012C5 0 +OP4 E012C6 0 +OP4 E012C7 0 +OP4 E012C8 0 +OP4 E012C9 0 +OP4 E012CA 0 +OP4 E012CB 0 +OP4 E012CC 0 +OP4 E012CD 0 +OP4 E012CE 0 +OP4 E012CF 0 +OP4 E012D0 0 +OP4 E012D1 0 +OP4 E012D2 0 +OP4 E012D3 0 +OP4 E012D4 0 +OP4 E012D5 0 +OP4 E012D6 0 +OP4 E012D7 0 +OP4 E012D8 0 +OP4 E012D9 0 +OP4 E012DA 0 +OP4 E012DB 0 +OP4 E012DC 0 +OP4 E012DD 0 +OP4 E012DE 0 +OP4 E012DF 0 +OP4 E012E0 0 +OP4 E012E1 0 +OP4 E012E2 0 +OP4 E012E3 0 +OP4 E012E4 0 +OP4 E012E5 0 +OP4 E012E6 0 +OP4 E012E7 0 +OP4 E012E8 0 +OP4 E012E9 0 +OP4 E012EA 0 +OP4 E012EB 0 +OP4 E012EC 0 +OP4 E012ED 0 +OP4 E012EE 0 +OP4 E012EF 0 +OP4 E012F0 0 +OP4 E012F1 0 +OP4 E012F2 0 +OP4 E012F3 0 +OP4 E012F4 0 +OP4 E012F5 0 +OP4 E012F6 0 +OP4 E012F7 0 +OP4 E012F8 0 +OP4 E012F9 0 +OP4 E012FA 0 +OP4 E012FB 0 +OP4 E012FC 0 +OP4 E012FD 0 +OP4 E012FE 0 +OP4 E012FF 0 +OP4 E01300 0 +OP4 E01301 0 +OP4 E01302 0 +OP4 E01303 0 +OP4 E01304 0 +OP4 E01305 0 +OP4 E01306 0 +OP4 E01307 0 +OP4 E01308 0 +OP4 E01309 0 +OP4 E0130A 0 +OP4 E0130B 0 +OP4 E0130C 0 +OP4 E0130D 0 +OP4 E0130E 0 +OP4 E0130F 0 +OP4 E01310 0 +OP4 E01311 0 +OP4 E01312 0 +OP4 E01313 0 +OP4 E01314 0 +OP4 E01315 0 +OP4 E01316 0 +OP4 E01317 0 +OP4 E01318 0 +OP4 E01319 0 +OP4 E0131A 0 +OP4 E0131B 0 +OP4 E0131C 0 +OP4 E0131D 0 +OP4 E0131E 0 +OP4 E0131F 0 +OP4 E01320 0 +OP4 E01321 0 +OP4 E01322 0 +OP4 E01323 0 +OP4 E01324 0 +OP4 E01325 0 +OP4 E01326 0 +OP4 E01327 0 +OP4 E01328 0 +OP4 E01329 0 +OP4 E0132A 0 +OP4 E0132B 0 +OP4 E0132C 0 +OP4 E0132D 0 +OP4 E0132E 0 +OP4 E0132F 0 +OP4 E01330 0 +OP4 E01331 0 +OP4 E01332 0 +OP4 E01333 0 +OP4 E01334 0 +OP4 E01335 0 +OP4 E01336 0 +OP4 E01337 0 +OP4 E01338 0 +OP4 E01339 0 +OP4 E0133A 0 +OP4 E0133B 0 +OP4 E0133C 0 +OP4 E0133D 0 +OP4 E0133E 0 +OP4 E0133F 0 +OP4 E01340 0 +OP4 E01341 0 +OP4 E01342 0 +OP4 E01343 0 +OP4 E01344 0 +OP4 E01345 0 +OP4 E01346 0 +OP4 E01347 0 +OP4 E01348 0 +OP4 E01349 0 +OP4 E0134A 0 +OP4 E0134B 0 +OP4 E0134C 0 +OP4 E0134D 0 +OP4 E0134E 0 +OP4 E0134F 0 +OP4 E01350 0 +OP4 E01351 0 +OP4 E01352 0 +OP4 E01353 0 +OP4 E01354 0 +OP4 E01355 0 +OP4 E01356 0 +OP4 E01357 0 +OP4 E01358 0 +OP4 E01359 0 +OP4 E0135A 0 +OP4 E0135B 0 +OP4 E0135C 0 +OP4 E0135D 0 +OP4 E0135E 0 +OP4 E0135F 0 +OP4 E01360 0 +OP4 E01361 0 +OP4 E01362 0 +OP4 E01363 0 +OP4 E01364 0 +OP4 E01365 0 +OP4 E01366 0 +OP4 E01367 0 +OP4 E01368 0 +OP4 E01369 0 +OP4 E0136A 0 +OP4 E0136B 0 +OP4 E0136C 0 +OP4 E0136D 0 +OP4 E0136E 0 +OP4 E0136F 0 +OP4 E01370 0 +OP4 E01371 0 +OP4 E01372 0 +OP4 E01373 0 +OP4 E01374 0 +OP4 E01375 0 +OP4 E01376 0 +OP4 E01377 0 +OP4 E01378 0 +OP4 E01379 0 +OP4 E0137A 0 +OP4 E0137B 0 +OP4 E0137C 0 +OP4 E0137D 0 +OP4 E0137E 0 +OP4 E0137F 0 +OP4 E01380 0 +OP4 E01381 0 +OP4 E01382 0 +OP4 E01383 0 +OP4 E01384 0 +OP4 E01385 0 +OP4 E01386 0 +OP4 E01387 0 +OP4 E01388 0 +OP4 E01389 0 +OP4 E0138A 0 +OP4 E0138B 0 +OP4 E0138C 0 +OP4 E0138D 0 +OP4 E0138E 0 +OP4 E0138F 0 +OP4 E01390 0 +OP4 E01391 0 +OP4 E01392 0 +OP4 E01393 0 +OP4 E01394 0 +OP4 E01395 0 +OP4 E01396 0 +OP4 E01397 0 +OP4 E01398 0 +OP4 E01399 0 +OP4 E0139A 0 +OP4 E0139B 0 +OP4 E0139C 0 +OP4 E0139D 0 +OP4 E0139E 0 +OP4 E0139F 0 +OP4 E013A0 0 +OP4 E013A1 0 +OP4 E013A2 0 +OP4 E013A3 0 +OP4 E013A4 0 +OP4 E013A5 0 +OP4 E013A6 0 +OP4 E013A7 0 +OP4 E013A8 0 +OP4 E013A9 0 +OP4 E013AA 0 +OP4 E013AB 0 +OP4 E013AC 0 +OP4 E013AD 0 +OP4 E013AE 0 +OP4 E013AF 0 +OP4 E013B0 0 +OP4 E013B1 0 +OP4 E013B2 0 +OP4 E013B3 0 +OP4 E013B4 0 +OP4 E013B5 0 +OP4 E013B6 0 +OP4 E013B7 0 +OP4 E013B8 0 +OP4 E013B9 0 +OP4 E013BA 0 +OP4 E013BB 0 +OP4 E013BC 0 +OP4 E013BD 0 +OP4 E013BE 0 +OP4 E013BF 0 +OP4 E013C0 0 +OP4 E013C1 0 +OP4 E013C2 0 +OP4 E013C3 0 +OP4 E013C4 0 +OP4 E013C5 0 +OP4 E013C6 0 +OP4 E013C7 0 +OP4 E013C8 0 +OP4 E013C9 0 +OP4 E013CA 0 +OP4 E013CB 0 +OP4 E013CC 0 +OP4 E013CD 0 +OP4 E013CE 0 +OP4 E013CF 0 +OP4 E013D0 0 +OP4 E013D1 0 +OP4 E013D2 0 +OP4 E013D3 0 +OP4 E013D4 0 +OP4 E013D5 0 +OP4 E013D6 0 +OP4 E013D7 0 +OP4 E013D8 0 +OP4 E013D9 0 +OP4 E013DA 0 +OP4 E013DB 0 +OP4 E013DC 0 +OP4 E013DD 0 +OP4 E013DE 0 +OP4 E013DF 0 +OP4 E013E0 0 +OP4 E013E1 0 +OP4 E013E2 0 +OP4 E013E3 0 +OP4 E013E4 0 +OP4 E013E5 0 +OP4 E013E6 0 +OP4 E013E7 0 +OP4 E013E8 0 +OP4 E013E9 0 +OP4 E013EA 0 +OP4 E013EB 0 +OP4 E013EC 0 +OP4 E013ED 0 +OP4 E013EE 0 +OP4 E013EF 0 +OP4 E013F0 0 +OP4 E013F1 0 +OP4 E013F2 0 +OP4 E013F3 0 +OP4 E013F4 0 +OP4 E013F5 0 +OP4 E013F6 0 +OP4 E013F7 0 +OP4 E013F8 0 +OP4 E013F9 0 +OP4 E013FA 0 +OP4 E013FB 0 +OP4 E013FC 0 +OP4 E013FD 0 +OP4 E013FE 0 +OP4 E013FF 0 +OP4 E01400 0 +OP4 E01401 0 +OP4 E01402 0 +OP4 E01403 0 +OP4 E01404 0 +OP4 E01405 0 +OP4 E01406 0 +OP4 E01407 0 +OP4 E01408 0 +OP4 E01409 0 +OP4 E0140A 0 +OP4 E0140B 0 +OP4 E0140C 0 +OP4 E0140D 0 +OP4 E0140E 0 +OP4 E0140F 0 +OP4 E01410 0 +OP4 E01411 0 +OP4 E01412 0 +OP4 E01413 0 +OP4 E01414 0 +OP4 E01415 0 +OP4 E01416 0 +OP4 E01417 0 +OP4 E01418 0 +OP4 E01419 0 +OP4 E0141A 0 +OP4 E0141B 0 +OP4 E0141C 0 +OP4 E0141D 0 +OP4 E0141E 0 +OP4 E0141F 0 +OP4 E01420 0 +OP4 E01421 0 +OP4 E01422 0 +OP4 E01423 0 +OP4 E01424 0 +OP4 E01425 0 +OP4 E01426 0 +OP4 E01427 0 +OP4 E01428 0 +OP4 E01429 0 +OP4 E0142A 0 +OP4 E0142B 0 +OP4 E0142C 0 +OP4 E0142D 0 +OP4 E0142E 0 +OP4 E0142F 0 +OP4 E01430 0 +OP4 E01431 0 +OP4 E01432 0 +OP4 E01433 0 +OP4 E01434 0 +OP4 E01435 0 +OP4 E01436 0 +OP4 E01437 0 +OP4 E01438 0 +OP4 E01439 0 +OP4 E0143A 0 +OP4 E0143B 0 +OP4 E0143C 0 +OP4 E0143D 0 +OP4 E0143E 0 +OP4 E0143F 0 +OP4 E01440 0 +OP4 E01441 0 +OP4 E01442 0 +OP4 E01443 0 +OP4 E01444 0 +OP4 E01445 0 +OP4 E01446 0 +OP4 E01447 0 +OP4 E01448 0 +OP4 E01449 0 +OP4 E0144A 0 +OP4 E0144B 0 +OP4 E0144C 0 +OP4 E0144D 0 +OP4 E0144E 0 +OP4 E0144F 0 +OP4 E01450 0 +OP4 E01451 0 +OP4 E01452 0 +OP4 E01453 0 +OP4 E01454 0 +OP4 E01455 0 +OP4 E01456 0 +OP4 E01457 0 +OP4 E01458 0 +OP4 E01459 0 +OP4 E0145A 0 +OP4 E0145B 0 +OP4 E0145C 0 +OP4 E0145D 0 +OP4 E0145E 0 +OP4 E0145F 0 +OP4 E01460 0 +OP4 E01461 0 +OP4 E01462 0 +OP4 E01463 0 +OP4 E01464 0 +OP4 E01465 0 +OP4 E01466 0 +OP4 E01467 0 +OP4 E01468 0 +OP4 E01469 0 +OP4 E0146A 0 +OP4 E0146B 0 +OP4 E0146C 0 +OP4 E0146D 0 +OP4 E0146E 0 +OP4 E0146F 0 +OP4 E01470 0 +OP4 E01471 0 +OP4 E01472 0 +OP4 E01473 0 +OP4 E01474 0 +OP4 E01475 0 +OP4 E01476 0 +OP4 E01477 0 +OP4 E01478 0 +OP4 E01479 0 +OP4 E0147A 0 +OP4 E0147B 0 +OP4 E0147C 0 +OP4 E0147D 0 +OP4 E0147E 0 +OP4 E0147F 0 +OP4 E01480 0 +OP4 E01481 0 +OP4 E01482 0 +OP4 E01483 0 +OP4 E01484 0 +OP4 E01485 0 +OP4 E01486 0 +OP4 E01487 0 +OP4 E01488 0 +OP4 E01489 0 +OP4 E0148A 0 +OP4 E0148B 0 +OP4 E0148C 0 +OP4 E0148D 0 +OP4 E0148E 0 +OP4 E0148F 0 +OP4 E01490 0 +OP4 E01491 0 +OP4 E01492 0 +OP4 E01493 0 +OP4 E01494 0 +OP4 E01495 0 +OP4 E01496 0 +OP4 E01497 0 +OP4 E01498 0 +OP4 E01499 0 +OP4 E0149A 0 +OP4 E0149B 0 +OP4 E0149C 0 +OP4 E0149D 0 +OP4 E0149E 0 +OP4 E0149F 0 +OP4 E014A0 0 +OP4 E014A1 0 +OP4 E014A2 0 +OP4 E014A3 0 +OP4 E014A4 0 +OP4 E014A5 0 +OP4 E014A6 0 +OP4 E014A7 0 +OP4 E014A8 0 +OP4 E014A9 0 +OP4 E014AA 0 +OP4 E014AB 0 +OP4 E014AC 0 +OP4 E014AD 0 +OP4 E014AE 0 +OP4 E014AF 0 +OP4 E014B0 0 +OP4 E014B1 0 +OP4 E014B2 0 +OP4 E014B3 0 +OP4 E014B4 0 +OP4 E014B5 0 +OP4 E014B6 0 +OP4 E014B7 0 +OP4 E014B8 0 +OP4 E014B9 0 +OP4 E014BA 0 +OP4 E014BB 0 +OP4 E014BC 0 +OP4 E014BD 0 +OP4 E014BE 0 +OP4 E014BF 0 +OP4 E014C0 0 +OP4 E014C1 0 +OP4 E014C2 0 +OP4 E014C3 0 +OP4 E014C4 0 +OP4 E014C5 0 +OP4 E014C6 0 +OP4 E014C7 0 +OP4 E014C8 0 +OP4 E014C9 0 +OP4 E014CA 0 +OP4 E014CB 0 +OP4 E014CC 0 +OP4 E014CD 0 +OP4 E014CE 0 +OP4 E014CF 0 +OP4 E014D0 0 +OP4 E014D1 0 +OP4 E014D2 0 +OP4 E014D3 0 +OP4 E014D4 0 +OP4 E014D5 0 +OP4 E014D6 0 +OP4 E014D7 0 +OP4 E014D8 0 +OP4 E014D9 0 +OP4 E014DA 0 +OP4 E014DB 0 +OP4 E014DC 0 +OP4 E014DD 0 +OP4 E014DE 0 +OP4 E014DF 0 +OP4 E014E0 0 +OP4 E014E1 0 +OP4 E014E2 0 +OP4 E014E3 0 +OP4 E014E4 0 +OP4 E014E5 0 +OP4 E014E6 0 +OP4 E014E7 0 +OP4 E014E8 0 +OP4 E014E9 0 +OP4 E014EA 0 +OP4 E014EB 0 +OP4 E014EC 0 +OP4 E014ED 0 +OP4 E014EE 0 +OP4 E014EF 0 +OP4 E014F0 0 +OP4 E014F1 0 +OP4 E014F2 0 +OP4 E014F3 0 +OP4 E014F4 0 +OP4 E014F5 0 +OP4 E014F6 0 +OP4 E014F7 0 +OP4 E014F8 0 +OP4 E014F9 0 +OP4 E014FA 0 +OP4 E014FB 0 +OP4 E014FC 0 +OP4 E014FD 0 +OP4 E014FE 0 +OP4 E014FF 0 +OP4 E01500 0 +OP4 E01501 0 +OP4 E01502 0 +OP4 E01503 0 +OP4 E01504 0 +OP4 E01505 0 +OP4 E01506 0 +OP4 E01507 0 +OP4 E01508 0 +OP4 E01509 0 +OP4 E0150A 0 +OP4 E0150B 0 +OP4 E0150C 0 +OP4 E0150D 0 +OP4 E0150E 0 +OP4 E0150F 0 +OP4 E01510 0 +OP4 E01511 0 +OP4 E01512 0 +OP4 E01513 0 +OP4 E01514 0 +OP4 E01515 0 +OP4 E01516 0 +OP4 E01517 0 +OP4 E01518 0 +OP4 E01519 0 +OP4 E0151A 0 +OP4 E0151B 0 +OP4 E0151C 0 +OP4 E0151D 0 +OP4 E0151E 0 +OP4 E0151F 0 +OP4 E01520 0 +OP4 E01521 0 +OP4 E01522 0 +OP4 E01523 0 +OP4 E01524 0 +OP4 E01525 0 +OP4 E01526 0 +OP4 E01527 0 +OP4 E01528 0 +OP4 E01529 0 +OP4 E0152A 0 +OP4 E0152B 0 +OP4 E0152C 0 +OP4 E0152D 0 +OP4 E0152E 0 +OP4 E0152F 0 +OP4 E01530 0 +OP4 E01531 0 +OP4 E01532 0 +OP4 E01533 0 +OP4 E01534 0 +OP4 E01535 0 +OP4 E01536 0 +OP4 E01537 0 +OP4 E01538 0 +OP4 E01539 0 +OP4 E0153A 0 +OP4 E0153B 0 +OP4 E0153C 0 +OP4 E0153D 0 +OP4 E0153E 0 +OP4 E0153F 0 +OP4 E01540 0 +OP4 E01541 0 +OP4 E01542 0 +OP4 E01543 0 +OP4 E01544 0 +OP4 E01545 0 +OP4 E01546 0 +OP4 E01547 0 +OP4 E01548 0 +OP4 E01549 0 +OP4 E0154A 0 +OP4 E0154B 0 +OP4 E0154C 0 +OP4 E0154D 0 +OP4 E0154E 0 +OP4 E0154F 0 +OP4 E01550 0 +OP4 E01551 0 +OP4 E01552 0 +OP4 E01553 0 +OP4 E01554 0 +OP4 E01555 0 +OP4 E01556 0 +OP4 E01557 0 +OP4 E01558 0 +OP4 E01559 0 +OP4 E0155A 0 +OP4 E0155B 0 +OP4 E0155C 0 +OP4 E0155D 0 +OP4 E0155E 0 +OP4 E0155F 0 +OP4 E01560 0 +OP4 E01561 0 +OP4 E01562 0 +OP4 E01563 0 +OP4 E01564 0 +OP4 E01565 0 +OP4 E01566 0 +OP4 E01567 0 +OP4 E01568 0 +OP4 E01569 0 +OP4 E0156A 0 +OP4 E0156B 0 +OP4 E0156C 0 +OP4 E0156D 0 +OP4 E0156E 0 +OP4 E0156F 0 +OP4 E01570 0 +OP4 E01571 0 +OP4 E01572 0 +OP4 E01573 0 +OP4 E01574 0 +OP4 E01575 0 +OP4 E01576 0 +OP4 E01577 0 +OP4 E01578 0 +OP4 E01579 0 +OP4 E0157A 0 +OP4 E0157B 0 +OP4 E0157C 0 +OP4 E0157D 0 +OP4 E0157E 0 +OP4 E0157F 0 +OP4 E01580 0 +OP4 E01581 0 +OP4 E01582 0 +OP4 E01583 0 +OP4 E01584 0 +OP4 E01585 0 +OP4 E01586 0 +OP4 E01587 0 +OP4 E01588 0 +OP4 E01589 0 +OP4 E0158A 0 +OP4 E0158B 0 +OP4 E0158C 0 +OP4 E0158D 0 +OP4 E0158E 0 +OP4 E0158F 0 +OP4 E01590 0 +OP4 E01591 0 +OP4 E01592 0 +OP4 E01593 0 +OP4 E01594 0 +OP4 E01595 0 +OP4 E01596 0 +OP4 E01597 0 +OP4 E01598 0 +OP4 E01599 0 +OP4 E0159A 0 +OP4 E0159B 0 +OP4 E0159C 0 +OP4 E0159D 0 +OP4 E0159E 0 +OP4 E0159F 0 +OP4 E015A0 0 +OP4 E015A1 0 +OP4 E015A2 0 +OP4 E015A3 0 +OP4 E015A4 0 +OP4 E015A5 0 +OP4 E015A6 0 +OP4 E015A7 0 +OP4 E015A8 0 +OP4 E015A9 0 +OP4 E015AA 0 +OP4 E015AB 0 +OP4 E015AC 0 +OP4 E015AD 0 +OP4 E015AE 0 +OP4 E015AF 0 +OP4 E015B0 0 +OP4 E015B1 0 +OP4 E015B2 0 +OP4 E015B3 0 +OP4 E015B4 0 +OP4 E015B5 0 +OP4 E015B6 0 +OP4 E015B7 0 +OP4 E015B8 0 +OP4 E015B9 0 +OP4 E015BA 0 +OP4 E015BB 0 +OP4 E015BC 0 +OP4 E015BD 0 +OP4 E015BE 0 +OP4 E015BF 0 +OP4 E015C0 0 +OP4 E015C1 0 +OP4 E015C2 0 +OP4 E015C3 0 +OP4 E015C4 0 +OP4 E015C5 0 +OP4 E015C6 0 +OP4 E015C7 0 +OP4 E015C8 0 +OP4 E015C9 0 +OP4 E015CA 0 +OP4 E015CB 0 +OP4 E015CC 0 +OP4 E015CD 0 +OP4 E015CE 0 +OP4 E015CF 0 +OP4 E015D0 0 +OP4 E015D1 0 +OP4 E015D2 0 +OP4 E015D3 0 +OP4 E015D4 0 +OP4 E015D5 0 +OP4 E015D6 0 +OP4 E015D7 0 +OP4 E015D8 0 +OP4 E015D9 0 +OP4 E015DA 0 +OP4 E015DB 0 +OP4 E015DC 0 +OP4 E015DD 0 +OP4 E015DE 0 +OP4 E015DF 0 +OP4 E015E0 0 +OP4 E015E1 0 +OP4 E015E2 0 +OP4 E015E3 0 +OP4 E015E4 0 +OP4 E015E5 0 +OP4 E015E6 0 +OP4 E015E7 0 +OP4 E015E8 0 +OP4 E015E9 0 +OP4 E015EA 0 +OP4 E015EB 0 +OP4 E015EC 0 +OP4 E015ED 0 +OP4 E015EE 0 +OP4 E015EF 0 +OP4 E015F0 0 +OP4 E015F1 0 +OP4 E015F2 0 +OP4 E015F3 0 +OP4 E015F4 0 +OP4 E015F5 0 +OP4 E015F6 0 +OP4 E015F7 0 +OP4 E015F8 0 +OP4 E015F9 0 +OP4 E015FA 0 +OP4 E015FB 0 +OP4 E015FC 0 +OP4 E015FD 0 +OP4 E015FE 0 +OP4 E015FF 0 +OP4 E01600 0 +OP4 E01601 0 +OP4 E01602 0 +OP4 E01603 0 +OP4 E01604 0 +OP4 E01605 0 +OP4 E01606 0 +OP4 E01607 0 +OP4 E01608 0 +OP4 E01609 0 +OP4 E0160A 0 +OP4 E0160B 0 +OP4 E0160C 0 +OP4 E0160D 0 +OP4 E0160E 0 +OP4 E0160F 0 +OP4 E01610 0 +OP4 E01611 0 +OP4 E01612 0 +OP4 E01613 0 +OP4 E01614 0 +OP4 E01615 0 +OP4 E01616 0 +OP4 E01617 0 +OP4 E01618 0 +OP4 E01619 0 +OP4 E0161A 0 +OP4 E0161B 0 +OP4 E0161C 0 +OP4 E0161D 0 +OP4 E0161E 0 +OP4 E0161F 0 +OP4 E01620 0 +OP4 E01621 0 +OP4 E01622 0 +OP4 E01623 0 +OP4 E01624 0 +OP4 E01625 0 +OP4 E01626 0 +OP4 E01627 0 +OP4 E01628 0 +OP4 E01629 0 +OP4 E0162A 0 +OP4 E0162B 0 +OP4 E0162C 0 +OP4 E0162D 0 +OP4 E0162E 0 +OP4 E0162F 0 +OP4 E01630 0 +OP4 E01631 0 +OP4 E01632 0 +OP4 E01633 0 +OP4 E01634 0 +OP4 E01635 0 +OP4 E01636 0 +OP4 E01637 0 +OP4 E01638 0 +OP4 E01639 0 +OP4 E0163A 0 +OP4 E0163B 0 +OP4 E0163C 0 +OP4 E0163D 0 +OP4 E0163E 0 +OP4 E0163F 0 +OP4 E01640 0 +OP4 E01641 0 +OP4 E01642 0 +OP4 E01643 0 +OP4 E01644 0 +OP4 E01645 0 +OP4 E01646 0 +OP4 E01647 0 +OP4 E01648 0 +OP4 E01649 0 +OP4 E0164A 0 +OP4 E0164B 0 +OP4 E0164C 0 +OP4 E0164D 0 +OP4 E0164E 0 +OP4 E0164F 0 +OP4 E01650 0 +OP4 E01651 0 +OP4 E01652 0 +OP4 E01653 0 +OP4 E01654 0 +OP4 E01655 0 +OP4 E01656 0 +OP4 E01657 0 +OP4 E01658 0 +OP4 E01659 0 +OP4 E0165A 0 +OP4 E0165B 0 +OP4 E0165C 0 +OP4 E0165D 0 +OP4 E0165E 0 +OP4 E0165F 0 +OP4 E01660 0 +OP4 E01661 0 +OP4 E01662 0 +OP4 E01663 0 +OP4 E01664 0 +OP4 E01665 0 +OP4 E01666 0 +OP4 E01667 0 +OP4 E01668 0 +OP4 E01669 0 +OP4 E0166A 0 +OP4 E0166B 0 +OP4 E0166C 0 +OP4 E0166D 0 +OP4 E0166E 0 +OP4 E0166F 0 +OP4 E01670 0 +OP4 E01671 0 +OP4 E01672 0 +OP4 E01673 0 +OP4 E01674 0 +OP4 E01675 0 +OP4 E01676 0 +OP4 E01677 0 +OP4 E01678 0 +OP4 E01679 0 +OP4 E0167A 0 +OP4 E0167B 0 +OP4 E0167C 0 +OP4 E0167D 0 +OP4 E0167E 0 +OP4 E0167F 0 +OP4 E01680 0 +OP4 E01681 0 +OP4 E01682 0 +OP4 E01683 0 +OP4 E01684 0 +OP4 E01685 0 +OP4 E01686 0 +OP4 E01687 0 +OP4 E01688 0 +OP4 E01689 0 +OP4 E0168A 0 +OP4 E0168B 0 +OP4 E0168C 0 +OP4 E0168D 0 +OP4 E0168E 0 +OP4 E0168F 0 +OP4 E01690 0 +OP4 E01691 0 +OP4 E01692 0 +OP4 E01693 0 +OP4 E01694 0 +OP4 E01695 0 +OP4 E01696 0 +OP4 E01697 0 +OP4 E01698 0 +OP4 E01699 0 +OP4 E0169A 0 +OP4 E0169B 0 +OP4 E0169C 0 +OP4 E0169D 0 +OP4 E0169E 0 +OP4 E0169F 0 +OP4 E016A0 0 +OP4 E016A1 0 +OP4 E016A2 0 +OP4 E016A3 0 +OP4 E016A4 0 +OP4 E016A5 0 +OP4 E016A6 0 +OP4 E016A7 0 +OP4 E016A8 0 +OP4 E016A9 0 +OP4 E016AA 0 +OP4 E016AB 0 +OP4 E016AC 0 +OP4 E016AD 0 +OP4 E016AE 0 +OP4 E016AF 0 +OP4 E016B0 0 +OP4 E016B1 0 +OP4 E016B2 0 +OP4 E016B3 0 +OP4 E016B4 0 +OP4 E016B5 0 +OP4 E016B6 0 +OP4 E016B7 0 +OP4 E016B8 0 +OP4 E016B9 0 +OP4 E016BA 0 +OP4 E016BB 0 +OP4 E016BC 0 +OP4 E016BD 0 +OP4 E016BE 0 +OP4 E016BF 0 +OP4 E016C0 0 +OP4 E016C1 0 +OP4 E016C2 0 +OP4 E016C3 0 +OP4 E016C4 0 +OP4 E016C5 0 +OP4 E016C6 0 +OP4 E016C7 0 +OP4 E016C8 0 +OP4 E016C9 0 +OP4 E016CA 0 +OP4 E016CB 0 +OP4 E016CC 0 +OP4 E016CD 0 +OP4 E016CE 0 +OP4 E016CF 0 +OP4 E016D0 0 +OP4 E016D1 0 +OP4 E016D2 0 +OP4 E016D3 0 +OP4 E016D4 0 +OP4 E016D5 0 +OP4 E016D6 0 +OP4 E016D7 0 +OP4 E016D8 0 +OP4 E016D9 0 +OP4 E016DA 0 +OP4 E016DB 0 +OP4 E016DC 0 +OP4 E016DD 0 +OP4 E016DE 0 +OP4 E016DF 0 +OP4 E016E0 0 +OP4 E016E1 0 +OP4 E016E2 0 +OP4 E016E3 0 +OP4 E016E4 0 +OP4 E016E5 0 +OP4 E016E6 0 +OP4 E016E7 0 +OP4 E016E8 0 +OP4 E016E9 0 +OP4 E016EA 0 +OP4 E016EB 0 +OP4 E016EC 0 +OP4 E016ED 0 +OP4 E016EE 0 +OP4 E016EF 0 +OP4 E016F0 0 +OP4 E016F1 0 +OP4 E016F2 0 +OP4 E016F3 0 +OP4 E016F4 0 +OP4 E016F5 0 +OP4 E016F6 0 +OP4 E016F7 0 +OP4 E016F8 0 +OP4 E016F9 0 +OP4 E016FA 0 +OP4 E016FB 0 +OP4 E016FC 0 +OP4 E016FD 0 +OP4 E016FE 0 +OP4 E016FF 0 +OP4 E01700 0 +OP4 E01701 0 +OP4 E01702 0 +OP4 E01703 0 +OP4 E01704 0 +OP4 E01705 0 +OP4 E01706 0 +OP4 E01707 0 +OP4 E01708 0 +OP4 E01709 0 +OP4 E0170A 0 +OP4 E0170B 0 +OP4 E0170C 0 +OP4 E0170D 0 +OP4 E0170E 0 +OP4 E0170F 0 +OP4 E01710 0 +OP4 E01711 0 +OP4 E01712 0 +OP4 E01713 0 +OP4 E01714 0 +OP4 E01715 0 +OP4 E01716 0 +OP4 E01717 0 +OP4 E01718 0 +OP4 E01719 0 +OP4 E0171A 0 +OP4 E0171B 0 +OP4 E0171C 0 +OP4 E0171D 0 +OP4 E0171E 0 +OP4 E0171F 0 +OP4 E01720 0 +OP4 E01721 0 +OP4 E01722 0 +OP4 E01723 0 +OP4 E01724 0 +OP4 E01725 0 +OP4 E01726 0 +OP4 E01727 0 +OP4 E01728 0 +OP4 E01729 0 +OP4 E0172A 0 +OP4 E0172B 0 +OP4 E0172C 0 +OP4 E0172D 0 +OP4 E0172E 0 +OP4 E0172F 0 +OP4 E01730 0 +OP4 E01731 0 +OP4 E01732 0 +OP4 E01733 0 +OP4 E01734 0 +OP4 E01735 0 +OP4 E01736 0 +OP4 E01737 0 +OP4 E01738 0 +OP4 E01739 0 +OP4 E0173A 0 +OP4 E0173B 0 +OP4 E0173C 0 +OP4 E0173D 0 +OP4 E0173E 0 +OP4 E0173F 0 +OP4 E01740 0 +OP4 E01741 0 +OP4 E01742 0 +OP4 E01743 0 +OP4 E01744 0 +OP4 E01745 0 +OP4 E01746 0 +OP4 E01747 0 +OP4 E01748 0 +OP4 E01749 0 +OP4 E0174A 0 +OP4 E0174B 0 +OP4 E0174C 0 +OP4 E0174D 0 +OP4 E0174E 0 +OP4 E0174F 0 +OP4 E01750 0 +OP4 E01751 0 +OP4 E01752 0 +OP4 E01753 0 +OP4 E01754 0 +OP4 E01755 0 +OP4 E01756 0 +OP4 E01757 0 +OP4 E01758 0 +OP4 E01759 0 +OP4 E0175A 0 +OP4 E0175B 0 +OP4 E0175C 0 +OP4 E0175D 0 +OP4 E0175E 0 +OP4 E0175F 0 +OP4 E01760 0 +OP4 E01761 0 +OP4 E01762 0 +OP4 E01763 0 +OP4 E01764 0 +OP4 E01765 0 +OP4 E01766 0 +OP4 E01767 0 +OP4 E01768 0 +OP4 E01769 0 +OP4 E0176A 0 +OP4 E0176B 0 +OP4 E0176C 0 +OP4 E0176D 0 +OP4 E0176E 0 +OP4 E0176F 0 +OP4 E01770 0 +OP4 E01771 0 +OP4 E01772 0 +OP4 E01773 0 +OP4 E01774 0 +OP4 E01775 0 +OP4 E01776 0 +OP4 E01777 0 +OP4 E01778 0 +OP4 E01779 0 +OP4 E0177A 0 +OP4 E0177B 0 +OP4 E0177C 0 +OP4 E0177D 0 +OP4 E0177E 0 +OP4 E0177F 0 +OP4 E01780 0 +OP4 E01781 0 +OP4 E01782 0 +OP4 E01783 0 +OP4 E01784 0 +OP4 E01785 0 +OP4 E01786 0 +OP4 E01787 0 +OP4 E01788 0 +OP4 E01789 0 +OP4 E0178A 0 +OP4 E0178B 0 +OP4 E0178C 0 +OP4 E0178D 0 +OP4 E0178E 0 +OP4 E0178F 0 +OP4 E01790 0 +OP4 E01791 0 +OP4 E01792 0 +OP4 E01793 0 +OP4 E01794 0 +OP4 E01795 0 +OP4 E01796 0 +OP4 E01797 0 +OP4 E01798 0 +OP4 E01799 0 +OP4 E0179A 0 +OP4 E0179B 0 +OP4 E0179C 0 +OP4 E0179D 0 +OP4 E0179E 0 +OP4 E0179F 0 +OP4 E017A0 0 +OP4 E017A1 0 +OP4 E017A2 0 +OP4 E017A3 0 +OP4 E017A4 0 +OP4 E017A5 0 +OP4 E017A6 0 +OP4 E017A7 0 +OP4 E017A8 0 +OP4 E017A9 0 +OP4 E017AA 0 +OP4 E017AB 0 +OP4 E017AC 0 +OP4 E017AD 0 +OP4 E017AE 0 +OP4 E017AF 0 +OP4 E017B0 0 +OP4 E017B1 0 +OP4 E017B2 0 +OP4 E017B3 0 +OP4 E017B4 0 +OP4 E017B5 0 +OP4 E017B6 0 +OP4 E017B7 0 +OP4 E017B8 0 +OP4 E017B9 0 +OP4 E017BA 0 +OP4 E017BB 0 +OP4 E017BC 0 +OP4 E017BD 0 +OP4 E017BE 0 +OP4 E017BF 0 +OP4 E017C0 0 +OP4 E017C1 0 +OP4 E017C2 0 +OP4 E017C3 0 +OP4 E017C4 0 +OP4 E017C5 0 +OP4 E017C6 0 +OP4 E017C7 0 +OP4 E017C8 0 +OP4 E017C9 0 +OP4 E017CA 0 +OP4 E017CB 0 +OP4 E017CC 0 +OP4 E017CD 0 +OP4 E017CE 0 +OP4 E017CF 0 +OP4 E017D0 0 +OP4 E017D1 0 +OP4 E017D2 0 +OP4 E017D3 0 +OP4 E017D4 0 +OP4 E017D5 0 +OP4 E017D6 0 +OP4 E017D7 0 +OP4 E017D8 0 +OP4 E017D9 0 +OP4 E017DA 0 +OP4 E017DB 0 +OP4 E017DC 0 +OP4 E017DD 0 +OP4 E017DE 0 +OP4 E017DF 0 +OP4 E017E0 0 +OP4 E017E1 0 +OP4 E017E2 0 +OP4 E017E3 0 +OP4 E017E4 0 +OP4 E017E5 0 +OP4 E017E6 0 +OP4 E017E7 0 +OP4 E017E8 0 +OP4 E017E9 0 +OP4 E017EA 0 +OP4 E017EB 0 +OP4 E017EC 0 +OP4 E017ED 0 +OP4 E017EE 0 +OP4 E017EF 0 +OP4 E017F0 0 +OP4 E017F1 0 +OP4 E017F2 0 +OP4 E017F3 0 +OP4 E017F4 0 +OP4 E017F5 0 +OP4 E017F6 0 +OP4 E017F7 0 +OP4 E017F8 0 +OP4 E017F9 0 +OP4 E017FA 0 +OP4 E017FB 0 +OP4 E017FC 0 +OP4 E017FD 0 +OP4 E017FE 0 +OP4 E017FF 0 +OP4 E01800 0 +OP4 E01801 0 +OP4 E01802 0 +OP4 E01803 0 +OP4 E01804 0 +OP4 E01805 0 +OP4 E01806 0 +OP4 E01807 0 +OP4 E01808 0 +OP4 E01809 0 +OP4 E0180A 0 +OP4 E0180B 0 +OP4 E0180C 0 +OP4 E0180D 0 +OP4 E0180E 0 +OP4 E0180F 0 +OP4 E01810 0 +OP4 E01811 0 +OP4 E01812 0 +OP4 E01813 0 +OP4 E01814 0 +OP4 E01815 0 +OP4 E01816 0 +OP4 E01817 0 +OP4 E01818 0 +OP4 E01819 0 +OP4 E0181A 0 +OP4 E0181B 0 +OP4 E0181C 0 +OP4 E0181D 0 +OP4 E0181E 0 +OP4 E0181F 0 +OP4 E01820 0 +OP4 E01821 0 +OP4 E01822 0 +OP4 E01823 0 +OP4 E01824 0 +OP4 E01825 0 +OP4 E01826 0 +OP4 E01827 0 +OP4 E01828 0 +OP4 E01829 0 +OP4 E0182A 0 +OP4 E0182B 0 +OP4 E0182C 0 +OP4 E0182D 0 +OP4 E0182E 0 +OP4 E0182F 0 +OP4 E01830 0 +OP4 E01831 0 +OP4 E01832 0 +OP4 E01833 0 +OP4 E01834 0 +OP4 E01835 0 +OP4 E01836 0 +OP4 E01837 0 +OP4 E01838 0 +OP4 E01839 0 +OP4 E0183A 0 +OP4 E0183B 0 +OP4 E0183C 0 +OP4 E0183D 0 +OP4 E0183E 0 +OP4 E0183F 0 +OP4 E01840 0 +OP4 E01841 0 +OP4 E01842 0 +OP4 E01843 0 +OP4 E01844 0 +OP4 E01845 0 +OP4 E01846 0 +OP4 E01847 0 +OP4 E01848 0 +OP4 E01849 0 +OP4 E0184A 0 +OP4 E0184B 0 +OP4 E0184C 0 +OP4 E0184D 0 +OP4 E0184E 0 +OP4 E0184F 0 +OP4 E01850 0 +OP4 E01851 0 +OP4 E01852 0 +OP4 E01853 0 +OP4 E01854 0 +OP4 E01855 0 +OP4 E01856 0 +OP4 E01857 0 +OP4 E01858 0 +OP4 E01859 0 +OP4 E0185A 0 +OP4 E0185B 0 +OP4 E0185C 0 +OP4 E0185D 0 +OP4 E0185E 0 +OP4 E0185F 0 +OP4 E01860 0 +OP4 E01861 0 +OP4 E01862 0 +OP4 E01863 0 +OP4 E01864 0 +OP4 E01865 0 +OP4 E01866 0 +OP4 E01867 0 +OP4 E01868 0 +OP4 E01869 0 +OP4 E0186A 0 +OP4 E0186B 0 +OP4 E0186C 0 +OP4 E0186D 0 +OP4 E0186E 0 +OP4 E0186F 0 +OP4 E01870 0 +OP4 E01871 0 +OP4 E01872 0 +OP4 E01873 0 +OP4 E01874 0 +OP4 E01875 0 +OP4 E01876 0 +OP4 E01877 0 +OP4 E01878 0 +OP4 E01879 0 +OP4 E0187A 0 +OP4 E0187B 0 +OP4 E0187C 0 +OP4 E0187D 0 +OP4 E0187E 0 +OP4 E0187F 0 +OP4 E01880 0 +OP4 E01881 0 +OP4 E01882 0 +OP4 E01883 0 +OP4 E01884 0 +OP4 E01885 0 +OP4 E01886 0 +OP4 E01887 0 +OP4 E01888 0 +OP4 E01889 0 +OP4 E0188A 0 +OP4 E0188B 0 +OP4 E0188C 0 +OP4 E0188D 0 +OP4 E0188E 0 +OP4 E0188F 0 +OP4 E01890 0 +OP4 E01891 0 +OP4 E01892 0 +OP4 E01893 0 +OP4 E01894 0 +OP4 E01895 0 +OP4 E01896 0 +OP4 E01897 0 +OP4 E01898 0 +OP4 E01899 0 +OP4 E0189A 0 +OP4 E0189B 0 +OP4 E0189C 0 +OP4 E0189D 0 +OP4 E0189E 0 +OP4 E0189F 0 +OP4 E018A0 0 +OP4 E018A1 0 +OP4 E018A2 0 +OP4 E018A3 0 +OP4 E018A4 0 +OP4 E018A5 0 +OP4 E018A6 0 +OP4 E018A7 0 +OP4 E018A8 0 +OP4 E018A9 0 +OP4 E018AA 0 +OP4 E018AB 0 +OP4 E018AC 0 +OP4 E018AD 0 +OP4 E018AE 0 +OP4 E018AF 0 +OP4 E018B0 0 +OP4 E018B1 0 +OP4 E018B2 0 +OP4 E018B3 0 +OP4 E018B4 0 +OP4 E018B5 0 +OP4 E018B6 0 +OP4 E018B7 0 +OP4 E018B8 0 +OP4 E018B9 0 +OP4 E018BA 0 +OP4 E018BB 0 +OP4 E018BC 0 +OP4 E018BD 0 +OP4 E018BE 0 +OP4 E018BF 0 +OP4 E018C0 0 +OP4 E018C1 0 +OP4 E018C2 0 +OP4 E018C3 0 +OP4 E018C4 0 +OP4 E018C5 0 +OP4 E018C6 0 +OP4 E018C7 0 +OP4 E018C8 0 +OP4 E018C9 0 +OP4 E018CA 0 +OP4 E018CB 0 +OP4 E018CC 0 +OP4 E018CD 0 +OP4 E018CE 0 +OP4 E018CF 0 +OP4 E018D0 0 +OP4 E018D1 0 +OP4 E018D2 0 +OP4 E018D3 0 +OP4 E018D4 0 +OP4 E018D5 0 +OP4 E018D6 0 +OP4 E018D7 0 +OP4 E018D8 0 +OP4 E018D9 0 +OP4 E018DA 0 +OP4 E018DB 0 +OP4 E018DC 0 +OP4 E018DD 0 +OP4 E018DE 0 +OP4 E018DF 0 +OP4 E018E0 0 +OP4 E018E1 0 +OP4 E018E2 0 +OP4 E018E3 0 +OP4 E018E4 0 +OP4 E018E5 0 +OP4 E018E6 0 +OP4 E018E7 0 +OP4 E018E8 0 +OP4 E018E9 0 +OP4 E018EA 0 +OP4 E018EB 0 +OP4 E018EC 0 +OP4 E018ED 0 +OP4 E018EE 0 +OP4 E018EF 0 +OP4 E018F0 0 +OP4 E018F1 0 +OP4 E018F2 0 +OP4 E018F3 0 +OP4 E018F4 0 +OP4 E018F5 0 +OP4 E018F6 0 +OP4 E018F7 0 +OP4 E018F8 0 +OP4 E018F9 0 +OP4 E018FA 0 +OP4 E018FB 0 +OP4 E018FC 0 +OP4 E018FD 0 +OP4 E018FE 0 +OP4 E018FF 0 +OP4 E01900 0 +OP4 E01901 0 +OP4 E01902 0 +OP4 E01903 0 +OP4 E01904 0 +OP4 E01905 0 +OP4 E01906 0 +OP4 E01907 0 +OP4 E01908 0 +OP4 E01909 0 +OP4 E0190A 0 +OP4 E0190B 0 +OP4 E0190C 0 +OP4 E0190D 0 +OP4 E0190E 0 +OP4 E0190F 0 +OP4 E01910 0 +OP4 E01911 0 +OP4 E01912 0 +OP4 E01913 0 +OP4 E01914 0 +OP4 E01915 0 +OP4 E01916 0 +OP4 E01917 0 +OP4 E01918 0 +OP4 E01919 0 +OP4 E0191A 0 +OP4 E0191B 0 +OP4 E0191C 0 +OP4 E0191D 0 +OP4 E0191E 0 +OP4 E0191F 0 +OP4 E01920 0 +OP4 E01921 0 +OP4 E01922 0 +OP4 E01923 0 +OP4 E01924 0 +OP4 E01925 0 +OP4 E01926 0 +OP4 E01927 0 +OP4 E01928 0 +OP4 E01929 0 +OP4 E0192A 0 +OP4 E0192B 0 +OP4 E0192C 0 +OP4 E0192D 0 +OP4 E0192E 0 +OP4 E0192F 0 +OP4 E01930 0 +OP4 E01931 0 +OP4 E01932 0 +OP4 E01933 0 +OP4 E01934 0 +OP4 E01935 0 +OP4 E01936 0 +OP4 E01937 0 +OP4 E01938 0 +OP4 E01939 0 +OP4 E0193A 0 +OP4 E0193B 0 +OP4 E0193C 0 +OP4 E0193D 0 +OP4 E0193E 0 +OP4 E0193F 0 +OP4 E01940 0 +OP4 E01941 0 +OP4 E01942 0 +OP4 E01943 0 +OP4 E01944 0 +OP4 E01945 0 +OP4 E01946 0 +OP4 E01947 0 +OP4 E01948 0 +OP4 E01949 0 +OP4 E0194A 0 +OP4 E0194B 0 +OP4 E0194C 0 +OP4 E0194D 0 +OP4 E0194E 0 +OP4 E0194F 0 +OP4 E01950 0 +OP4 E01951 0 +OP4 E01952 0 +OP4 E01953 0 +OP4 E01954 0 +OP4 E01955 0 +OP4 E01956 0 +OP4 E01957 0 +OP4 E01958 0 +OP4 E01959 0 +OP4 E0195A 0 +OP4 E0195B 0 +OP4 E0195C 0 +OP4 E0195D 0 +OP4 E0195E 0 +OP4 E0195F 0 +OP4 E01960 0 +OP4 E01961 0 +OP4 E01962 0 +OP4 E01963 0 +OP4 E01964 0 +OP4 E01965 0 +OP4 E01966 0 +OP4 E01967 0 +OP4 E01968 0 +OP4 E01969 0 +OP4 E0196A 0 +OP4 E0196B 0 +OP4 E0196C 0 +OP4 E0196D 0 +OP4 E0196E 0 +OP4 E0196F 0 +OP4 E01970 0 +OP4 E01971 0 +OP4 E01972 0 +OP4 E01973 0 +OP4 E01974 0 +OP4 E01975 0 +OP4 E01976 0 +OP4 E01977 0 +OP4 E01978 0 +OP4 E01979 0 +OP4 E0197A 0 +OP4 E0197B 0 +OP4 E0197C 0 +OP4 E0197D 0 +OP4 E0197E 0 +OP4 E0197F 0 +OP4 E01980 0 +OP4 E01981 0 +OP4 E01982 0 +OP4 E01983 0 +OP4 E01984 0 +OP4 E01985 0 +OP4 E01986 0 +OP4 E01987 0 +OP4 E01988 0 +OP4 E01989 0 +OP4 E0198A 0 +OP4 E0198B 0 +OP4 E0198C 0 +OP4 E0198D 0 +OP4 E0198E 0 +OP4 E0198F 0 +OP4 E01990 0 +OP4 E01991 0 +OP4 E01992 0 +OP4 E01993 0 +OP4 E01994 0 +OP4 E01995 0 +OP4 E01996 0 +OP4 E01997 0 +OP4 E01998 0 +OP4 E01999 0 +OP4 E0199A 0 +OP4 E0199B 0 +OP4 E0199C 0 +OP4 E0199D 0 +OP4 E0199E 0 +OP4 E0199F 0 +OP4 E019A0 0 +OP4 E019A1 0 +OP4 E019A2 0 +OP4 E019A3 0 +OP4 E019A4 0 +OP4 E019A5 0 +OP4 E019A6 0 +OP4 E019A7 0 +OP4 E019A8 0 +OP4 E019A9 0 +OP4 E019AA 0 +OP4 E019AB 0 +OP4 E019AC 0 +OP4 E019AD 0 +OP4 E019AE 0 +OP4 E019AF 0 +OP4 E019B0 0 +OP4 E019B1 0 +OP4 E019B2 0 +OP4 E019B3 0 +OP4 E019B4 0 +OP4 E019B5 0 +OP4 E019B6 0 +OP4 E019B7 0 +OP4 E019B8 0 +OP4 E019B9 0 +OP4 E019BA 0 +OP4 E019BB 0 +OP4 E019BC 0 +OP4 E019BD 0 +OP4 E019BE 0 +OP4 E019BF 0 +OP4 E019C0 0 +OP4 E019C1 0 +OP4 E019C2 0 +OP4 E019C3 0 +OP4 E019C4 0 +OP4 E019C5 0 +OP4 E019C6 0 +OP4 E019C7 0 +OP4 E019C8 0 +OP4 E019C9 0 +OP4 E019CA 0 +OP4 E019CB 0 +OP4 E019CC 0 +OP4 E019CD 0 +OP4 E019CE 0 +OP4 E019CF 0 +OP4 E019D0 0 +OP4 E019D1 0 +OP4 E019D2 0 +OP4 E019D3 0 +OP4 E019D4 0 +OP4 E019D5 0 +OP4 E019D6 0 +OP4 E019D7 0 +OP4 E019D8 0 +OP4 E019D9 0 +OP4 E019DA 0 +OP4 E019DB 0 +OP4 E019DC 0 +OP4 E019DD 0 +OP4 E019DE 0 +OP4 E019DF 0 +OP4 E019E0 0 +OP4 E019E1 0 +OP4 E019E2 0 +OP4 E019E3 0 +OP4 E019E4 0 +OP4 E019E5 0 +OP4 E019E6 0 +OP4 E019E7 0 +OP4 E019E8 0 +OP4 E019E9 0 +OP4 E019EA 0 +OP4 E019EB 0 +OP4 E019EC 0 +OP4 E019ED 0 +OP4 E019EE 0 +OP4 E019EF 0 +OP4 E019F0 0 +OP4 E019F1 0 +OP4 E019F2 0 +OP4 E019F3 0 +OP4 E019F4 0 +OP4 E019F5 0 +OP4 E019F6 0 +OP4 E019F7 0 +OP4 E019F8 0 +OP4 E019F9 0 +OP4 E019FA 0 +OP4 E019FB 0 +OP4 E019FC 0 +OP4 E019FD 0 +OP4 E019FE 0 +OP4 E019FF 0 +OP4 E01A00 0 +OP4 E01A01 0 +OP4 E01A02 0 +OP4 E01A03 0 +OP4 E01A04 0 +OP4 E01A05 0 +OP4 E01A06 0 +OP4 E01A07 0 +OP4 E01A08 0 +OP4 E01A09 0 +OP4 E01A0A 0 +OP4 E01A0B 0 +OP4 E01A0C 0 +OP4 E01A0D 0 +OP4 E01A0E 0 +OP4 E01A0F 0 +OP4 E01A10 0 +OP4 E01A11 0 +OP4 E01A12 0 +OP4 E01A13 0 +OP4 E01A14 0 +OP4 E01A15 0 +OP4 E01A16 0 +OP4 E01A17 0 +OP4 E01A18 0 +OP4 E01A19 0 +OP4 E01A1A 0 +OP4 E01A1B 0 +OP4 E01A1C 0 +OP4 E01A1D 0 +OP4 E01A1E 0 +OP4 E01A1F 0 +OP4 E01A20 0 +OP4 E01A21 0 +OP4 E01A22 0 +OP4 E01A23 0 +OP4 E01A24 0 +OP4 E01A25 0 +OP4 E01A26 0 +OP4 E01A27 0 +OP4 E01A28 0 +OP4 E01A29 0 +OP4 E01A2A 0 +OP4 E01A2B 0 +OP4 E01A2C 0 +OP4 E01A2D 0 +OP4 E01A2E 0 +OP4 E01A2F 0 +OP4 E01A30 0 +OP4 E01A31 0 +OP4 E01A32 0 +OP4 E01A33 0 +OP4 E01A34 0 +OP4 E01A35 0 +OP4 E01A36 0 +OP4 E01A37 0 +OP4 E01A38 0 +OP4 E01A39 0 +OP4 E01A3A 0 +OP4 E01A3B 0 +OP4 E01A3C 0 +OP4 E01A3D 0 +OP4 E01A3E 0 +OP4 E01A3F 0 +OP4 E01A40 0 +OP4 E01A41 0 +OP4 E01A42 0 +OP4 E01A43 0 +OP4 E01A44 0 +OP4 E01A45 0 +OP4 E01A46 0 +OP4 E01A47 0 +OP4 E01A48 0 +OP4 E01A49 0 +OP4 E01A4A 0 +OP4 E01A4B 0 +OP4 E01A4C 0 +OP4 E01A4D 0 +OP4 E01A4E 0 +OP4 E01A4F 0 +OP4 E01A50 0 +OP4 E01A51 0 +OP4 E01A52 0 +OP4 E01A53 0 +OP4 E01A54 0 +OP4 E01A55 0 +OP4 E01A56 0 +OP4 E01A57 0 +OP4 E01A58 0 +OP4 E01A59 0 +OP4 E01A5A 0 +OP4 E01A5B 0 +OP4 E01A5C 0 +OP4 E01A5D 0 +OP4 E01A5E 0 +OP4 E01A5F 0 +OP4 E01A60 0 +OP4 E01A61 0 +OP4 E01A62 0 +OP4 E01A63 0 +OP4 E01A64 0 +OP4 E01A65 0 +OP4 E01A66 0 +OP4 E01A67 0 +OP4 E01A68 0 +OP4 E01A69 0 +OP4 E01A6A 0 +OP4 E01A6B 0 +OP4 E01A6C 0 +OP4 E01A6D 0 +OP4 E01A6E 0 +OP4 E01A6F 0 +OP4 E01A70 0 +OP4 E01A71 0 +OP4 E01A72 0 +OP4 E01A73 0 +OP4 E01A74 0 +OP4 E01A75 0 +OP4 E01A76 0 +OP4 E01A77 0 +OP4 E01A78 0 +OP4 E01A79 0 +OP4 E01A7A 0 +OP4 E01A7B 0 +OP4 E01A7C 0 +OP4 E01A7D 0 +OP4 E01A7E 0 +OP4 E01A7F 0 +OP4 E01A80 0 +OP4 E01A81 0 +OP4 E01A82 0 +OP4 E01A83 0 +OP4 E01A84 0 +OP4 E01A85 0 +OP4 E01A86 0 +OP4 E01A87 0 +OP4 E01A88 0 +OP4 E01A89 0 +OP4 E01A8A 0 +OP4 E01A8B 0 +OP4 E01A8C 0 +OP4 E01A8D 0 +OP4 E01A8E 0 +OP4 E01A8F 0 +OP4 E01A90 0 +OP4 E01A91 0 +OP4 E01A92 0 +OP4 E01A93 0 +OP4 E01A94 0 +OP4 E01A95 0 +OP4 E01A96 0 +OP4 E01A97 0 +OP4 E01A98 0 +OP4 E01A99 0 +OP4 E01A9A 0 +OP4 E01A9B 0 +OP4 E01A9C 0 +OP4 E01A9D 0 +OP4 E01A9E 0 +OP4 E01A9F 0 +OP4 E01AA0 0 +OP4 E01AA1 0 +OP4 E01AA2 0 +OP4 E01AA3 0 +OP4 E01AA4 0 +OP4 E01AA5 0 +OP4 E01AA6 0 +OP4 E01AA7 0 +OP4 E01AA8 0 +OP4 E01AA9 0 +OP4 E01AAA 0 +OP4 E01AAB 0 +OP4 E01AAC 0 +OP4 E01AAD 0 +OP4 E01AAE 0 +OP4 E01AAF 0 +OP4 E01AB0 0 +OP4 E01AB1 0 +OP4 E01AB2 0 +OP4 E01AB3 0 +OP4 E01AB4 0 +OP4 E01AB5 0 +OP4 E01AB6 0 +OP4 E01AB7 0 +OP4 E01AB8 0 +OP4 E01AB9 0 +OP4 E01ABA 0 +OP4 E01ABB 0 +OP4 E01ABC 0 +OP4 E01ABD 0 +OP4 E01ABE 0 +OP4 E01ABF 0 +OP4 E01AC0 0 +OP4 E01AC1 0 +OP4 E01AC2 0 +OP4 E01AC3 0 +OP4 E01AC4 0 +OP4 E01AC5 0 +OP4 E01AC6 0 +OP4 E01AC7 0 +OP4 E01AC8 0 +OP4 E01AC9 0 +OP4 E01ACA 0 +OP4 E01ACB 0 +OP4 E01ACC 0 +OP4 E01ACD 0 +OP4 E01ACE 0 +OP4 E01ACF 0 +OP4 E01AD0 0 +OP4 E01AD1 0 +OP4 E01AD2 0 +OP4 E01AD3 0 +OP4 E01AD4 0 +OP4 E01AD5 0 +OP4 E01AD6 0 +OP4 E01AD7 0 +OP4 E01AD8 0 +OP4 E01AD9 0 +OP4 E01ADA 0 +OP4 E01ADB 0 +OP4 E01ADC 0 +OP4 E01ADD 0 +OP4 E01ADE 0 +OP4 E01ADF 0 +OP4 E01AE0 0 +OP4 E01AE1 0 +OP4 E01AE2 0 +OP4 E01AE3 0 +OP4 E01AE4 0 +OP4 E01AE5 0 +OP4 E01AE6 0 +OP4 E01AE7 0 +OP4 E01AE8 0 +OP4 E01AE9 0 +OP4 E01AEA 0 +OP4 E01AEB 0 +OP4 E01AEC 0 +OP4 E01AED 0 +OP4 E01AEE 0 +OP4 E01AEF 0 +OP4 E01AF0 0 +OP4 E01AF1 0 +OP4 E01AF2 0 +OP4 E01AF3 0 +OP4 E01AF4 0 +OP4 E01AF5 0 +OP4 E01AF6 0 +OP4 E01AF7 0 +OP4 E01AF8 0 +OP4 E01AF9 0 +OP4 E01AFA 0 +OP4 E01AFB 0 +OP4 E01AFC 0 +OP4 E01AFD 0 +OP4 E01AFE 0 +OP4 E01AFF 0 +OP4 E01B00 0 +OP4 E01B01 0 +OP4 E01B02 0 +OP4 E01B03 0 +OP4 E01B04 0 +OP4 E01B05 0 +OP4 E01B06 0 +OP4 E01B07 0 +OP4 E01B08 0 +OP4 E01B09 0 +OP4 E01B0A 0 +OP4 E01B0B 0 +OP4 E01B0C 0 +OP4 E01B0D 0 +OP4 E01B0E 0 +OP4 E01B0F 0 +OP4 E01B10 0 +OP4 E01B11 0 +OP4 E01B12 0 +OP4 E01B13 0 +OP4 E01B14 0 +OP4 E01B15 0 +OP4 E01B16 0 +OP4 E01B17 0 +OP4 E01B18 0 +OP4 E01B19 0 +OP4 E01B1A 0 +OP4 E01B1B 0 +OP4 E01B1C 0 +OP4 E01B1D 0 +OP4 E01B1E 0 +OP4 E01B1F 0 +OP4 E01B20 0 +OP4 E01B21 0 +OP4 E01B22 0 +OP4 E01B23 0 +OP4 E01B24 0 +OP4 E01B25 0 +OP4 E01B26 0 +OP4 E01B27 0 +OP4 E01B28 0 +OP4 E01B29 0 +OP4 E01B2A 0 +OP4 E01B2B 0 +OP4 E01B2C 0 +OP4 E01B2D 0 +OP4 E01B2E 0 +OP4 E01B2F 0 +OP4 E01B30 0 +OP4 E01B31 0 +OP4 E01B32 0 +OP4 E01B33 0 +OP4 E01B34 0 +OP4 E01B35 0 +OP4 E01B36 0 +OP4 E01B37 0 +OP4 E01B38 0 +OP4 E01B39 0 +OP4 E01B3A 0 +OP4 E01B3B 0 +OP4 E01B3C 0 +OP4 E01B3D 0 +OP4 E01B3E 0 +OP4 E01B3F 0 +OP4 E01B40 0 +OP4 E01B41 0 +OP4 E01B42 0 +OP4 E01B43 0 +OP4 E01B44 0 +OP4 E01B45 0 +OP4 E01B46 0 +OP4 E01B47 0 +OP4 E01B48 0 +OP4 E01B49 0 +OP4 E01B4A 0 +OP4 E01B4B 0 +OP4 E01B4C 0 +OP4 E01B4D 0 +OP4 E01B4E 0 +OP4 E01B4F 0 +OP4 E01B50 0 +OP4 E01B51 0 +OP4 E01B52 0 +OP4 E01B53 0 +OP4 E01B54 0 +OP4 E01B55 0 +OP4 E01B56 0 +OP4 E01B57 0 +OP4 E01B58 0 +OP4 E01B59 0 +OP4 E01B5A 0 +OP4 E01B5B 0 +OP4 E01B5C 0 +OP4 E01B5D 0 +OP4 E01B5E 0 +OP4 E01B5F 0 +OP4 E01B60 0 +OP4 E01B61 0 +OP4 E01B62 0 +OP4 E01B63 0 +OP4 E01B64 0 +OP4 E01B65 0 +OP4 E01B66 0 +OP4 E01B67 0 +OP4 E01B68 0 +OP4 E01B69 0 +OP4 E01B6A 0 +OP4 E01B6B 0 +OP4 E01B6C 0 +OP4 E01B6D 0 +OP4 E01B6E 0 +OP4 E01B6F 0 +OP4 E01B70 0 +OP4 E01B71 0 +OP4 E01B72 0 +OP4 E01B73 0 +OP4 E01B74 0 +OP4 E01B75 0 +OP4 E01B76 0 +OP4 E01B77 0 +OP4 E01B78 0 +OP4 E01B79 0 +OP4 E01B7A 0 +OP4 E01B7B 0 +OP4 E01B7C 0 +OP4 E01B7D 0 +OP4 E01B7E 0 +OP4 E01B7F 0 +OP4 E01B80 0 +OP4 E01B81 0 +OP4 E01B82 0 +OP4 E01B83 0 +OP4 E01B84 0 +OP4 E01B85 0 +OP4 E01B86 0 +OP4 E01B87 0 +OP4 E01B88 0 +OP4 E01B89 0 +OP4 E01B8A 0 +OP4 E01B8B 0 +OP4 E01B8C 0 +OP4 E01B8D 0 +OP4 E01B8E 0 +OP4 E01B8F 0 +OP4 E01B90 0 +OP4 E01B91 0 +OP4 E01B92 0 +OP4 E01B93 0 +OP4 E01B94 0 +OP4 E01B95 0 +OP4 E01B96 0 +OP4 E01B97 0 +OP4 E01B98 0 +OP4 E01B99 0 +OP4 E01B9A 0 +OP4 E01B9B 0 +OP4 E01B9C 0 +OP4 E01B9D 0 +OP4 E01B9E 0 +OP4 E01B9F 0 +OP4 E01BA0 0 +OP4 E01BA1 0 +OP4 E01BA2 0 +OP4 E01BA3 0 +OP4 E01BA4 0 +OP4 E01BA5 0 +OP4 E01BA6 0 +OP4 E01BA7 0 +OP4 E01BA8 0 +OP4 E01BA9 0 +OP4 E01BAA 0 +OP4 E01BAB 0 +OP4 E01BAC 0 +OP4 E01BAD 0 +OP4 E01BAE 0 +OP4 E01BAF 0 +OP4 E01BB0 0 +OP4 E01BB1 0 +OP4 E01BB2 0 +OP4 E01BB3 0 +OP4 E01BB4 0 +OP4 E01BB5 0 +OP4 E01BB6 0 +OP4 E01BB7 0 +OP4 E01BB8 0 +OP4 E01BB9 0 +OP4 E01BBA 0 +OP4 E01BBB 0 +OP4 E01BBC 0 +OP4 E01BBD 0 +OP4 E01BBE 0 +OP4 E01BBF 0 +OP4 E01BC0 0 +OP4 E01BC1 0 +OP4 E01BC2 0 +OP4 E01BC3 0 +OP4 E01BC4 0 +OP4 E01BC5 0 +OP4 E01BC6 0 +OP4 E01BC7 0 +OP4 E01BC8 0 +OP4 E01BC9 0 +OP4 E01BCA 0 +OP4 E01BCB 0 +OP4 E01BCC 0 +OP4 E01BCD 0 +OP4 E01BCE 0 +OP4 E01BCF 0 +OP4 E01BD0 0 +OP4 E01BD1 0 +OP4 E01BD2 0 +OP4 E01BD3 0 +OP4 E01BD4 0 +OP4 E01BD5 0 +OP4 E01BD6 0 +OP4 E01BD7 0 +OP4 E01BD8 0 +OP4 E01BD9 0 +OP4 E01BDA 0 +OP4 E01BDB 0 +OP4 E01BDC 0 +OP4 E01BDD 0 +OP4 E01BDE 0 +OP4 E01BDF 0 +OP4 E01BE0 0 +OP4 E01BE1 0 +OP4 E01BE2 0 +OP4 E01BE3 0 +OP4 E01BE4 0 +OP4 E01BE5 0 +OP4 E01BE6 0 +OP4 E01BE7 0 +OP4 E01BE8 0 +OP4 E01BE9 0 +OP4 E01BEA 0 +OP4 E01BEB 0 +OP4 E01BEC 0 +OP4 E01BED 0 +OP4 E01BEE 0 +OP4 E01BEF 0 +OP4 E01BF0 0 +OP4 E01BF1 0 +OP4 E01BF2 0 +OP4 E01BF3 0 +OP4 E01BF4 0 +OP4 E01BF5 0 +OP4 E01BF6 0 +OP4 E01BF7 0 +OP4 E01BF8 0 +OP4 E01BF9 0 +OP4 E01BFA 0 +OP4 E01BFB 0 +OP4 E01BFC 0 +OP4 E01BFD 0 +OP4 E01BFE 0 +OP4 E01BFF 0 +OP4 E01C00 0 +OP4 E01C01 0 +OP4 E01C02 0 +OP4 E01C03 0 +OP4 E01C04 0 +OP4 E01C05 0 +OP4 E01C06 0 +OP4 E01C07 0 +OP4 E01C08 0 +OP4 E01C09 0 +OP4 E01C0A 0 +OP4 E01C0B 0 +OP4 E01C0C 0 +OP4 E01C0D 0 +OP4 E01C0E 0 +OP4 E01C0F 0 +OP4 E01C10 0 +OP4 E01C11 0 +OP4 E01C12 0 +OP4 E01C13 0 +OP4 E01C14 0 +OP4 E01C15 0 +OP4 E01C16 0 +OP4 E01C17 0 +OP4 E01C18 0 +OP4 E01C19 0 +OP4 E01C1A 0 +OP4 E01C1B 0 +OP4 E01C1C 0 +OP4 E01C1D 0 +OP4 E01C1E 0 +OP4 E01C1F 0 +OP4 E01C20 0 +OP4 E01C21 0 +OP4 E01C22 0 +OP4 E01C23 0 +OP4 E01C24 0 +OP4 E01C25 0 +OP4 E01C26 0 +OP4 E01C27 0 +OP4 E01C28 0 +OP4 E01C29 0 +OP4 E01C2A 0 +OP4 E01C2B 0 +OP4 E01C2C 0 +OP4 E01C2D 0 +OP4 E01C2E 0 +OP4 E01C2F 0 +OP4 E01C30 0 +OP4 E01C31 0 +OP4 E01C32 0 +OP4 E01C33 0 +OP4 E01C34 0 +OP4 E01C35 0 +OP4 E01C36 0 +OP4 E01C37 0 +OP4 E01C38 0 +OP4 E01C39 0 +OP4 E01C3A 0 +OP4 E01C3B 0 +OP4 E01C3C 0 +OP4 E01C3D 0 +OP4 E01C3E 0 +OP4 E01C3F 0 +OP4 E01C40 0 +OP4 E01C41 0 +OP4 E01C42 0 +OP4 E01C43 0 +OP4 E01C44 0 +OP4 E01C45 0 +OP4 E01C46 0 +OP4 E01C47 0 +OP4 E01C48 0 +OP4 E01C49 0 +OP4 E01C4A 0 +OP4 E01C4B 0 +OP4 E01C4C 0 +OP4 E01C4D 0 +OP4 E01C4E 0 +OP4 E01C4F 0 +OP4 E01C50 0 +OP4 E01C51 0 +OP4 E01C52 0 +OP4 E01C53 0 +OP4 E01C54 0 +OP4 E01C55 0 +OP4 E01C56 0 +OP4 E01C57 0 +OP4 E01C58 0 +OP4 E01C59 0 +OP4 E01C5A 0 +OP4 E01C5B 0 +OP4 E01C5C 0 +OP4 E01C5D 0 +OP4 E01C5E 0 +OP4 E01C5F 0 +OP4 E01C60 0 +OP4 E01C61 0 +OP4 E01C62 0 +OP4 E01C63 0 +OP4 E01C64 0 +OP4 E01C65 0 +OP4 E01C66 0 +OP4 E01C67 0 +OP4 E01C68 0 +OP4 E01C69 0 +OP4 E01C6A 0 +OP4 E01C6B 0 +OP4 E01C6C 0 +OP4 E01C6D 0 +OP4 E01C6E 0 +OP4 E01C6F 0 +OP4 E01C70 0 +OP4 E01C71 0 +OP4 E01C72 0 +OP4 E01C73 0 +OP4 E01C74 0 +OP4 E01C75 0 +OP4 E01C76 0 +OP4 E01C77 0 +OP4 E01C78 0 +OP4 E01C79 0 +OP4 E01C7A 0 +OP4 E01C7B 0 +OP4 E01C7C 0 +OP4 E01C7D 0 +OP4 E01C7E 0 +OP4 E01C7F 0 +OP4 E01C80 0 +OP4 E01C81 0 +OP4 E01C82 0 +OP4 E01C83 0 +OP4 E01C84 0 +OP4 E01C85 0 +OP4 E01C86 0 +OP4 E01C87 0 +OP4 E01C88 0 +OP4 E01C89 0 +OP4 E01C8A 0 +OP4 E01C8B 0 +OP4 E01C8C 0 +OP4 E01C8D 0 +OP4 E01C8E 0 +OP4 E01C8F 0 +OP4 E01C90 0 +OP4 E01C91 0 +OP4 E01C92 0 +OP4 E01C93 0 +OP4 E01C94 0 +OP4 E01C95 0 +OP4 E01C96 0 +OP4 E01C97 0 +OP4 E01C98 0 +OP4 E01C99 0 +OP4 E01C9A 0 +OP4 E01C9B 0 +OP4 E01C9C 0 +OP4 E01C9D 0 +OP4 E01C9E 0 +OP4 E01C9F 0 +OP4 E01CA0 0 +OP4 E01CA1 0 +OP4 E01CA2 0 +OP4 E01CA3 0 +OP4 E01CA4 0 +OP4 E01CA5 0 +OP4 E01CA6 0 +OP4 E01CA7 0 +OP4 E01CA8 0 +OP4 E01CA9 0 +OP4 E01CAA 0 +OP4 E01CAB 0 +OP4 E01CAC 0 +OP4 E01CAD 0 +OP4 E01CAE 0 +OP4 E01CAF 0 +OP4 E01CB0 0 +OP4 E01CB1 0 +OP4 E01CB2 0 +OP4 E01CB3 0 +OP4 E01CB4 0 +OP4 E01CB5 0 +OP4 E01CB6 0 +OP4 E01CB7 0 +OP4 E01CB8 0 +OP4 E01CB9 0 +OP4 E01CBA 0 +OP4 E01CBB 0 +OP4 E01CBC 0 +OP4 E01CBD 0 +OP4 E01CBE 0 +OP4 E01CBF 0 +OP4 E01CC0 0 +OP4 E01CC1 0 +OP4 E01CC2 0 +OP4 E01CC3 0 +OP4 E01CC4 0 +OP4 E01CC5 0 +OP4 E01CC6 0 +OP4 E01CC7 0 +OP4 E01CC8 0 +OP4 E01CC9 0 +OP4 E01CCA 0 +OP4 E01CCB 0 +OP4 E01CCC 0 +OP4 E01CCD 0 +OP4 E01CCE 0 +OP4 E01CCF 0 +OP4 E01CD0 0 +OP4 E01CD1 0 +OP4 E01CD2 0 +OP4 E01CD3 0 +OP4 E01CD4 0 +OP4 E01CD5 0 +OP4 E01CD6 0 +OP4 E01CD7 0 +OP4 E01CD8 0 +OP4 E01CD9 0 +OP4 E01CDA 0 +OP4 E01CDB 0 +OP4 E01CDC 0 +OP4 E01CDD 0 +OP4 E01CDE 0 +OP4 E01CDF 0 +OP4 E01CE0 0 +OP4 E01CE1 0 +OP4 E01CE2 0 +OP4 E01CE3 0 +OP4 E01CE4 0 +OP4 E01CE5 0 +OP4 E01CE6 0 +OP4 E01CE7 0 +OP4 E01CE8 0 +OP4 E01CE9 0 +OP4 E01CEA 0 +OP4 E01CEB 0 +OP4 E01CEC 0 +OP4 E01CED 0 +OP4 E01CEE 0 +OP4 E01CEF 0 +OP4 E01CF0 0 +OP4 E01CF1 0 +OP4 E01CF2 0 +OP4 E01CF3 0 +OP4 E01CF4 0 +OP4 E01CF5 0 +OP4 E01CF6 0 +OP4 E01CF7 0 +OP4 E01CF8 0 +OP4 E01CF9 0 +OP4 E01CFA 0 +OP4 E01CFB 0 +OP4 E01CFC 0 +OP4 E01CFD 0 +OP4 E01CFE 0 +OP4 E01CFF 0 +OP4 E01D00 0 +OP4 E01D01 0 +OP4 E01D02 0 +OP4 E01D03 0 +OP4 E01D04 0 +OP4 E01D05 0 +OP4 E01D06 0 +OP4 E01D07 0 +OP4 E01D08 0 +OP4 E01D09 0 +OP4 E01D0A 0 +OP4 E01D0B 0 +OP4 E01D0C 0 +OP4 E01D0D 0 +OP4 E01D0E 0 +OP4 E01D0F 0 +OP4 E01D10 0 +OP4 E01D11 0 +OP4 E01D12 0 +OP4 E01D13 0 +OP4 E01D14 0 +OP4 E01D15 0 +OP4 E01D16 0 +OP4 E01D17 0 +OP4 E01D18 0 +OP4 E01D19 0 +OP4 E01D1A 0 +OP4 E01D1B 0 +OP4 E01D1C 0 +OP4 E01D1D 0 +OP4 E01D1E 0 +OP4 E01D1F 0 +OP4 E01D20 0 +OP4 E01D21 0 +OP4 E01D22 0 +OP4 E01D23 0 +OP4 E01D24 0 +OP4 E01D25 0 +OP4 E01D26 0 +OP4 E01D27 0 +OP4 E01D28 0 +OP4 E01D29 0 +OP4 E01D2A 0 +OP4 E01D2B 0 +OP4 E01D2C 0 +OP4 E01D2D 0 +OP4 E01D2E 0 +OP4 E01D2F 0 +OP4 E01D30 0 +OP4 E01D31 0 +OP4 E01D32 0 +OP4 E01D33 0 +OP4 E01D34 0 +OP4 E01D35 0 +OP4 E01D36 0 +OP4 E01D37 0 +OP4 E01D38 0 +OP4 E01D39 0 +OP4 E01D3A 0 +OP4 E01D3B 0 +OP4 E01D3C 0 +OP4 E01D3D 0 +OP4 E01D3E 0 +OP4 E01D3F 0 +OP4 E01D40 0 +OP4 E01D41 0 +OP4 E01D42 0 +OP4 E01D43 0 +OP4 E01D44 0 +OP4 E01D45 0 +OP4 E01D46 0 +OP4 E01D47 0 +OP4 E01D48 0 +OP4 E01D49 0 +OP4 E01D4A 0 +OP4 E01D4B 0 +OP4 E01D4C 0 +OP4 E01D4D 0 +OP4 E01D4E 0 +OP4 E01D4F 0 +OP4 E01D50 0 +OP4 E01D51 0 +OP4 E01D52 0 +OP4 E01D53 0 +OP4 E01D54 0 +OP4 E01D55 0 +OP4 E01D56 0 +OP4 E01D57 0 +OP4 E01D58 0 +OP4 E01D59 0 +OP4 E01D5A 0 +OP4 E01D5B 0 +OP4 E01D5C 0 +OP4 E01D5D 0 +OP4 E01D5E 0 +OP4 E01D5F 0 +OP4 E01D60 0 +OP4 E01D61 0 +OP4 E01D62 0 +OP4 E01D63 0 +OP4 E01D64 0 +OP4 E01D65 0 +OP4 E01D66 0 +OP4 E01D67 0 +OP4 E01D68 0 +OP4 E01D69 0 +OP4 E01D6A 0 +OP4 E01D6B 0 +OP4 E01D6C 0 +OP4 E01D6D 0 +OP4 E01D6E 0 +OP4 E01D6F 0 +OP4 E01D70 0 +OP4 E01D71 0 +OP4 E01D72 0 +OP4 E01D73 0 +OP4 E01D74 0 +OP4 E01D75 0 +OP4 E01D76 0 +OP4 E01D77 0 +OP4 E01D78 0 +OP4 E01D79 0 +OP4 E01D7A 0 +OP4 E01D7B 0 +OP4 E01D7C 0 +OP4 E01D7D 0 +OP4 E01D7E 0 +OP4 E01D7F 0 +OP4 E01D80 0 +OP4 E01D81 0 +OP4 E01D82 0 +OP4 E01D83 0 +OP4 E01D84 0 +OP4 E01D85 0 +OP4 E01D86 0 +OP4 E01D87 0 +OP4 E01D88 0 +OP4 E01D89 0 +OP4 E01D8A 0 +OP4 E01D8B 0 +OP4 E01D8C 0 +OP4 E01D8D 0 +OP4 E01D8E 0 +OP4 E01D8F 0 +OP4 E01D90 0 +OP4 E01D91 0 +OP4 E01D92 0 +OP4 E01D93 0 +OP4 E01D94 0 +OP4 E01D95 0 +OP4 E01D96 0 +OP4 E01D97 0 +OP4 E01D98 0 +OP4 E01D99 0 +OP4 E01D9A 0 +OP4 E01D9B 0 +OP4 E01D9C 0 +OP4 E01D9D 0 +OP4 E01D9E 0 +OP4 E01D9F 0 +OP4 E01DA0 0 +OP4 E01DA1 0 +OP4 E01DA2 0 +OP4 E01DA3 0 +OP4 E01DA4 0 +OP4 E01DA5 0 +OP4 E01DA6 0 +OP4 E01DA7 0 +OP4 E01DA8 0 +OP4 E01DA9 0 +OP4 E01DAA 0 +OP4 E01DAB 0 +OP4 E01DAC 0 +OP4 E01DAD 0 +OP4 E01DAE 0 +OP4 E01DAF 0 +OP4 E01DB0 0 +OP4 E01DB1 0 +OP4 E01DB2 0 +OP4 E01DB3 0 +OP4 E01DB4 0 +OP4 E01DB5 0 +OP4 E01DB6 0 +OP4 E01DB7 0 +OP4 E01DB8 0 +OP4 E01DB9 0 +OP4 E01DBA 0 +OP4 E01DBB 0 +OP4 E01DBC 0 +OP4 E01DBD 0 +OP4 E01DBE 0 +OP4 E01DBF 0 +OP4 E01DC0 0 +OP4 E01DC1 0 +OP4 E01DC2 0 +OP4 E01DC3 0 +OP4 E01DC4 0 +OP4 E01DC5 0 +OP4 E01DC6 0 +OP4 E01DC7 0 +OP4 E01DC8 0 +OP4 E01DC9 0 +OP4 E01DCA 0 +OP4 E01DCB 0 +OP4 E01DCC 0 +OP4 E01DCD 0 +OP4 E01DCE 0 +OP4 E01DCF 0 +OP4 E01DD0 0 +OP4 E01DD1 0 +OP4 E01DD2 0 +OP4 E01DD3 0 +OP4 E01DD4 0 +OP4 E01DD5 0 +OP4 E01DD6 0 +OP4 E01DD7 0 +OP4 E01DD8 0 +OP4 E01DD9 0 +OP4 E01DDA 0 +OP4 E01DDB 0 +OP4 E01DDC 0 +OP4 E01DDD 0 +OP4 E01DDE 0 +OP4 E01DDF 0 +OP4 E01DE0 0 +OP4 E01DE1 0 +OP4 E01DE2 0 +OP4 E01DE3 0 +OP4 E01DE4 0 +OP4 E01DE5 0 +OP4 E01DE6 0 +OP4 E01DE7 0 +OP4 E01DE8 0 +OP4 E01DE9 0 +OP4 E01DEA 0 +OP4 E01DEB 0 +OP4 E01DEC 0 +OP4 E01DED 0 +OP4 E01DEE 0 +OP4 E01DEF 0 +OP4 E01DF0 0 +OP4 E01DF1 0 +OP4 E01DF2 0 +OP4 E01DF3 0 +OP4 E01DF4 0 +OP4 E01DF5 0 +OP4 E01DF6 0 +OP4 E01DF7 0 +OP4 E01DF8 0 +OP4 E01DF9 0 +OP4 E01DFA 0 +OP4 E01DFB 0 +OP4 E01DFC 0 +OP4 E01DFD 0 +OP4 E01DFE 0 +OP4 E01DFF 0 +OP4 E01E00 0 +OP4 E01E01 0 +OP4 E01E02 0 +OP4 E01E03 0 +OP4 E01E04 0 +OP4 E01E05 0 +OP4 E01E06 0 +OP4 E01E07 0 +OP4 E01E08 0 +OP4 E01E09 0 +OP4 E01E0A 0 +OP4 E01E0B 0 +OP4 E01E0C 0 +OP4 E01E0D 0 +OP4 E01E0E 0 +OP4 E01E0F 0 +OP4 E01E10 0 +OP4 E01E11 0 +OP4 E01E12 0 +OP4 E01E13 0 +OP4 E01E14 0 +OP4 E01E15 0 +OP4 E01E16 0 +OP4 E01E17 0 +OP4 E01E18 0 +OP4 E01E19 0 +OP4 E01E1A 0 +OP4 E01E1B 0 +OP4 E01E1C 0 +OP4 E01E1D 0 +OP4 E01E1E 0 +OP4 E01E1F 0 +OP4 E01E20 0 +OP4 E01E21 0 +OP4 E01E22 0 +OP4 E01E23 0 +OP4 E01E24 0 +OP4 E01E25 0 +OP4 E01E26 0 +OP4 E01E27 0 +OP4 E01E28 0 +OP4 E01E29 0 +OP4 E01E2A 0 +OP4 E01E2B 0 +OP4 E01E2C 0 +OP4 E01E2D 0 +OP4 E01E2E 0 +OP4 E01E2F 0 +OP4 E01E30 0 +OP4 E01E31 0 +OP4 E01E32 0 +OP4 E01E33 0 +OP4 E01E34 0 +OP4 E01E35 0 +OP4 E01E36 0 +OP4 E01E37 0 +OP4 E01E38 0 +OP4 E01E39 0 +OP4 E01E3A 0 +OP4 E01E3B 0 +OP4 E01E3C 0 +OP4 E01E3D 0 +OP4 E01E3E 0 +OP4 E01E3F 0 +OP4 E01E40 0 +OP4 E01E41 0 +OP4 E01E42 0 +OP4 E01E43 0 +OP4 E01E44 0 +OP4 E01E45 0 +OP4 E01E46 0 +OP4 E01E47 0 +OP4 E01E48 0 +OP4 E01E49 0 +OP4 E01E4A 0 +OP4 E01E4B 0 +OP4 E01E4C 0 +OP4 E01E4D 0 +OP4 E01E4E 0 +OP4 E01E4F 0 +OP4 E01E50 0 +OP4 E01E51 0 +OP4 E01E52 0 +OP4 E01E53 0 +OP4 E01E54 0 +OP4 E01E55 0 +OP4 E01E56 0 +OP4 E01E57 0 +OP4 E01E58 0 +OP4 E01E59 0 +OP4 E01E5A 0 +OP4 E01E5B 0 +OP4 E01E5C 0 +OP4 E01E5D 0 +OP4 E01E5E 0 +OP4 E01E5F 0 +OP4 E01E60 0 +OP4 E01E61 0 +OP4 E01E62 0 +OP4 E01E63 0 +OP4 E01E64 0 +OP4 E01E65 0 +OP4 E01E66 0 +OP4 E01E67 0 +OP4 E01E68 0 +OP4 E01E69 0 +OP4 E01E6A 0 +OP4 E01E6B 0 +OP4 E01E6C 0 +OP4 E01E6D 0 +OP4 E01E6E 0 +OP4 E01E6F 0 +OP4 E01E70 0 +OP4 E01E71 0 +OP4 E01E72 0 +OP4 E01E73 0 +OP4 E01E74 0 +OP4 E01E75 0 +OP4 E01E76 0 +OP4 E01E77 0 +OP4 E01E78 0 +OP4 E01E79 0 +OP4 E01E7A 0 +OP4 E01E7B 0 +OP4 E01E7C 0 +OP4 E01E7D 0 +OP4 E01E7E 0 +OP4 E01E7F 0 +OP4 E01E80 0 +OP4 E01E81 0 +OP4 E01E82 0 +OP4 E01E83 0 +OP4 E01E84 0 +OP4 E01E85 0 +OP4 E01E86 0 +OP4 E01E87 0 +OP4 E01E88 0 +OP4 E01E89 0 +OP4 E01E8A 0 +OP4 E01E8B 0 +OP4 E01E8C 0 +OP4 E01E8D 0 +OP4 E01E8E 0 +OP4 E01E8F 0 +OP4 E01E90 0 +OP4 E01E91 0 +OP4 E01E92 0 +OP4 E01E93 0 +OP4 E01E94 0 +OP4 E01E95 0 +OP4 E01E96 0 +OP4 E01E97 0 +OP4 E01E98 0 +OP4 E01E99 0 +OP4 E01E9A 0 +OP4 E01E9B 0 +OP4 E01E9C 0 +OP4 E01E9D 0 +OP4 E01E9E 0 +OP4 E01E9F 0 +OP4 E01EA0 0 +OP4 E01EA1 0 +OP4 E01EA2 0 +OP4 E01EA3 0 +OP4 E01EA4 0 +OP4 E01EA5 0 +OP4 E01EA6 0 +OP4 E01EA7 0 +OP4 E01EA8 0 +OP4 E01EA9 0 +OP4 E01EAA 0 +OP4 E01EAB 0 +OP4 E01EAC 0 +OP4 E01EAD 0 +OP4 E01EAE 0 +OP4 E01EAF 0 +OP4 E01EB0 0 +OP4 E01EB1 0 +OP4 E01EB2 0 +OP4 E01EB3 0 +OP4 E01EB4 0 +OP4 E01EB5 0 +OP4 E01EB6 0 +OP4 E01EB7 0 +OP4 E01EB8 0 +OP4 E01EB9 0 +OP4 E01EBA 0 +OP4 E01EBB 0 +OP4 E01EBC 0 +OP4 E01EBD 0 +OP4 E01EBE 0 +OP4 E01EBF 0 +OP4 E01EC0 0 +OP4 E01EC1 0 +OP4 E01EC2 0 +OP4 E01EC3 0 +OP4 E01EC4 0 +OP4 E01EC5 0 +OP4 E01EC6 0 +OP4 E01EC7 0 +OP4 E01EC8 0 +OP4 E01EC9 0 +OP4 E01ECA 0 +OP4 E01ECB 0 +OP4 E01ECC 0 +OP4 E01ECD 0 +OP4 E01ECE 0 +OP4 E01ECF 0 +OP4 E01ED0 0 +OP4 E01ED1 0 +OP4 E01ED2 0 +OP4 E01ED3 0 +OP4 E01ED4 0 +OP4 E01ED5 0 +OP4 E01ED6 0 +OP4 E01ED7 0 +OP4 E01ED8 0 +OP4 E01ED9 0 +OP4 E01EDA 0 +OP4 E01EDB 0 +OP4 E01EDC 0 +OP4 E01EDD 0 +OP4 E01EDE 0 +OP4 E01EDF 0 +OP4 E01EE0 0 +OP4 E01EE1 0 +OP4 E01EE2 0 +OP4 E01EE3 0 +OP4 E01EE4 0 +OP4 E01EE5 0 +OP4 E01EE6 0 +OP4 E01EE7 0 +OP4 E01EE8 0 +OP4 E01EE9 0 +OP4 E01EEA 0 +OP4 E01EEB 0 +OP4 E01EEC 0 +OP4 E01EED 0 +OP4 E01EEE 0 +OP4 E01EEF 0 +OP4 E01EF0 0 +OP4 E01EF1 0 +OP4 E01EF2 0 +OP4 E01EF3 0 +OP4 E01EF4 0 +OP4 E01EF5 0 +OP4 E01EF6 0 +OP4 E01EF7 0 +OP4 E01EF8 0 +OP4 E01EF9 0 +OP4 E01EFA 0 +OP4 E01EFB 0 +OP4 E01EFC 0 +OP4 E01EFD 0 +OP4 E01EFE 0 +OP4 E01EFF 0 +OP4 E01F00 0 +OP4 E01F01 0 +OP4 E01F02 0 +OP4 E01F03 0 +OP4 E01F04 0 +OP4 E01F05 0 +OP4 E01F06 0 +OP4 E01F07 0 +OP4 E01F08 0 +OP4 E01F09 0 +OP4 E01F0A 0 +OP4 E01F0B 0 +OP4 E01F0C 0 +OP4 E01F0D 0 +OP4 E01F0E 0 +OP4 E01F0F 0 +OP4 E01F10 0 +OP4 E01F11 0 +OP4 E01F12 0 +OP4 E01F13 0 +OP4 E01F14 0 +OP4 E01F15 0 +OP4 E01F16 0 +OP4 E01F17 0 +OP4 E01F18 0 +OP4 E01F19 0 +OP4 E01F1A 0 +OP4 E01F1B 0 +OP4 E01F1C 0 +OP4 E01F1D 0 +OP4 E01F1E 0 +OP4 E01F1F 0 +OP4 E01F20 0 +OP4 E01F21 0 +OP4 E01F22 0 +OP4 E01F23 0 +OP4 E01F24 0 +OP4 E01F25 0 +OP4 E01F26 0 +OP4 E01F27 0 +OP4 E01F28 0 +OP4 E01F29 0 +OP4 E01F2A 0 +OP4 E01F2B 0 +OP4 E01F2C 0 +OP4 E01F2D 0 +OP4 E01F2E 0 +OP4 E01F2F 0 +OP4 E01F30 0 +OP4 E01F31 0 +OP4 E01F32 0 +OP4 E01F33 0 +OP4 E01F34 0 +OP4 E01F35 0 +OP4 E01F36 0 +OP4 E01F37 0 +OP4 E01F38 0 +OP4 E01F39 0 +OP4 E01F3A 0 +OP4 E01F3B 0 +OP4 E01F3C 0 +OP4 E01F3D 0 +OP4 E01F3E 0 +OP4 E01F3F 0 +OP4 E01F40 0 +OP4 E01F41 0 +OP4 E01F42 0 +OP4 E01F43 0 +OP4 E01F44 0 +OP4 E01F45 0 +OP4 E01F46 0 +OP4 E01F47 0 +OP4 E01F48 0 +OP4 E01F49 0 +OP4 E01F4A 0 +OP4 E01F4B 0 +OP4 E01F4C 0 +OP4 E01F4D 0 +OP4 E01F4E 0 +OP4 E01F4F 0 +OP4 E01F50 0 +OP4 E01F51 0 +OP4 E01F52 0 +OP4 E01F53 0 +OP4 E01F54 0 +OP4 E01F55 0 +OP4 E01F56 0 +OP4 E01F57 0 +OP4 E01F58 0 +OP4 E01F59 0 +OP4 E01F5A 0 +OP4 E01F5B 0 +OP4 E01F5C 0 +OP4 E01F5D 0 +OP4 E01F5E 0 +OP4 E01F5F 0 +OP4 E01F60 0 +OP4 E01F61 0 +OP4 E01F62 0 +OP4 E01F63 0 +OP4 E01F64 0 +OP4 E01F65 0 +OP4 E01F66 0 +OP4 E01F67 0 +OP4 E01F68 0 +OP4 E01F69 0 +OP4 E01F6A 0 +OP4 E01F6B 0 +OP4 E01F6C 0 +OP4 E01F6D 0 +OP4 E01F6E 0 +OP4 E01F6F 0 +OP4 E01F70 0 +OP4 E01F71 0 +OP4 E01F72 0 +OP4 E01F73 0 +OP4 E01F74 0 +OP4 E01F75 0 +OP4 E01F76 0 +OP4 E01F77 0 +OP4 E01F78 0 +OP4 E01F79 0 +OP4 E01F7A 0 +OP4 E01F7B 0 +OP4 E01F7C 0 +OP4 E01F7D 0 +OP4 E01F7E 0 +OP4 E01F7F 0 +OP4 E01F80 0 +OP4 E01F81 0 +OP4 E01F82 0 +OP4 E01F83 0 +OP4 E01F84 0 +OP4 E01F85 0 +OP4 E01F86 0 +OP4 E01F87 0 +OP4 E01F88 0 +OP4 E01F89 0 +OP4 E01F8A 0 +OP4 E01F8B 0 +OP4 E01F8C 0 +OP4 E01F8D 0 +OP4 E01F8E 0 +OP4 E01F8F 0 +OP4 E01F90 0 +OP4 E01F91 0 +OP4 E01F92 0 +OP4 E01F93 0 +OP4 E01F94 0 +OP4 E01F95 0 +OP4 E01F96 0 +OP4 E01F97 0 +OP4 E01F98 0 +OP4 E01F99 0 +OP4 E01F9A 0 +OP4 E01F9B 0 +OP4 E01F9C 0 +OP4 E01F9D 0 +OP4 E01F9E 0 +OP4 E01F9F 0 +OP4 E01FA0 0 +OP4 E01FA1 0 +OP4 E01FA2 0 +OP4 E01FA3 0 +OP4 E01FA4 0 +OP4 E01FA5 0 +OP4 E01FA6 0 +OP4 E01FA7 0 +OP4 E01FA8 0 +OP4 E01FA9 0 +OP4 E01FAA 0 +OP4 E01FAB 0 +OP4 E01FAC 0 +OP4 E01FAD 0 +OP4 E01FAE 0 +OP4 E01FAF 0 +OP4 E01FB0 0 +OP4 E01FB1 0 +OP4 E01FB2 0 +OP4 E01FB3 0 +OP4 E01FB4 0 +OP4 E01FB5 0 +OP4 E01FB6 0 +OP4 E01FB7 0 +OP4 E01FB8 0 +OP4 E01FB9 0 +OP4 E01FBA 0 +OP4 E01FBB 0 +OP4 E01FBC 0 +OP4 E01FBD 0 +OP4 E01FBE 0 +OP4 E01FBF 0 +OP4 E01FC0 0 +OP4 E01FC1 0 +OP4 E01FC2 0 +OP4 E01FC3 0 +OP4 E01FC4 0 +OP4 E01FC5 0 +OP4 E01FC6 0 +OP4 E01FC7 0 +OP4 E01FC8 0 +OP4 E01FC9 0 +OP4 E01FCA 0 +OP4 E01FCB 0 +OP4 E01FCC 0 +OP4 E01FCD 0 +OP4 E01FCE 0 +OP4 E01FCF 0 +OP4 E01FD0 0 +OP4 E01FD1 0 +OP4 E01FD2 0 +OP4 E01FD3 0 +OP4 E01FD4 0 +OP4 E01FD5 0 +OP4 E01FD6 0 +OP4 E01FD7 0 +OP4 E01FD8 0 +OP4 E01FD9 0 +OP4 E01FDA 0 +OP4 E01FDB 0 +OP4 E01FDC 0 +OP4 E01FDD 0 +OP4 E01FDE 0 +OP4 E01FDF 0 +OP4 E01FE0 0 +OP4 E01FE1 0 +OP4 E01FE2 0 +OP4 E01FE3 0 +OP4 E01FE4 0 +OP4 E01FE5 0 +OP4 E01FE6 0 +OP4 E01FE7 0 +OP4 E01FE8 0 +OP4 E01FE9 0 +OP4 E01FEA 0 +OP4 E01FEB 0 +OP4 E01FEC 0 +OP4 E01FED 0 +OP4 E01FEE 0 +OP4 E01FEF 0 +OP4 E01FF0 0 +OP4 E01FF1 0 +OP4 E01FF2 0 +OP4 E01FF3 0 +OP4 E01FF4 0 +OP4 E01FF5 0 +OP4 E01FF6 0 +OP4 E01FF7 0 +OP4 E01FF8 0 +OP4 E01FF9 0 +OP4 E01FFA 0 +OP4 E01FFB 0 +OP4 E01FFC 0 +OP4 E01FFD 0 +OP4 E01FFE 0 +OP4 E01FFF 0 +OP4 E02000 0 +OP4 E02001 0 +OP4 E02002 0 +OP4 E02003 0 +OP4 E02004 0 +OP4 E02005 0 +OP4 E02006 0 +OP4 E02007 0 +OP4 E02008 0 +OP4 E02009 0 +OP4 E0200A 0 +OP4 E0200B 0 +OP4 E0200C 0 +OP4 E0200D 0 +OP4 E0200E 0 +OP4 E0200F 0 +OP4 E02010 0 +OP4 E02011 0 +OP4 E02012 0 +OP4 E02013 0 +OP4 E02014 0 +OP4 E02015 0 +OP4 E02016 0 +OP4 E02017 0 +OP4 E02018 0 +OP4 E02019 0 +OP4 E0201A 0 +OP4 E0201B 0 +OP4 E0201C 0 +OP4 E0201D 0 +OP4 E0201E 0 +OP4 E0201F 0 +OP4 E02020 0 +OP4 E02021 0 +OP4 E02022 0 +OP4 E02023 0 +OP4 E02024 0 +OP4 E02025 0 +OP4 E02026 0 +OP4 E02027 0 +OP4 E02028 0 +OP4 E02029 0 +OP4 E0202A 0 +OP4 E0202B 0 +OP4 E0202C 0 +OP4 E0202D 0 +OP4 E0202E 0 +OP4 E0202F 0 +OP4 E02030 0 +OP4 E02031 0 +OP4 E02032 0 +OP4 E02033 0 +OP4 E02034 0 +OP4 E02035 0 +OP4 E02036 0 +OP4 E02037 0 +OP4 E02038 0 +OP4 E02039 0 +OP4 E0203A 0 +OP4 E0203B 0 +OP4 E0203C 0 +OP4 E0203D 0 +OP4 E0203E 0 +OP4 E0203F 0 +OP4 E02040 0 +OP4 E02041 0 +OP4 E02042 0 +OP4 E02043 0 +OP4 E02044 0 +OP4 E02045 0 +OP4 E02046 0 +OP4 E02047 0 +OP4 E02048 0 +OP4 E02049 0 +OP4 E0204A 0 +OP4 E0204B 0 +OP4 E0204C 0 +OP4 E0204D 0 +OP4 E0204E 0 +OP4 E0204F 0 +OP4 E02050 0 +OP4 E02051 0 +OP4 E02052 0 +OP4 E02053 0 +OP4 E02054 0 +OP4 E02055 0 +OP4 E02056 0 +OP4 E02057 0 +OP4 E02058 0 +OP4 E02059 0 +OP4 E0205A 0 +OP4 E0205B 0 +OP4 E0205C 0 +OP4 E0205D 0 +OP4 E0205E 0 +OP4 E0205F 0 +OP4 E02060 0 +OP4 E02061 0 +OP4 E02062 0 +OP4 E02063 0 +OP4 E02064 0 +OP4 E02065 0 +OP4 E02066 0 +OP4 E02067 0 +OP4 E02068 0 +OP4 E02069 0 +OP4 E0206A 0 +OP4 E0206B 0 +OP4 E0206C 0 +OP4 E0206D 0 +OP4 E0206E 0 +OP4 E0206F 0 +OP4 E02070 0 +OP4 E02071 0 +OP4 E02072 0 +OP4 E02073 0 +OP4 E02074 0 +OP4 E02075 0 +OP4 E02076 0 +OP4 E02077 0 +OP4 E02078 0 +OP4 E02079 0 +OP4 E0207A 0 +OP4 E0207B 0 +OP4 E0207C 0 +OP4 E0207D 0 +OP4 E0207E 0 +OP4 E0207F 0 +OP4 E02080 0 +OP4 E02081 0 +OP4 E02082 0 +OP4 E02083 0 +OP4 E02084 0 +OP4 E02085 0 +OP4 E02086 0 +OP4 E02087 0 +OP4 E02088 0 +OP4 E02089 0 +OP4 E0208A 0 +OP4 E0208B 0 +OP4 E0208C 0 +OP4 E0208D 0 +OP4 E0208E 0 +OP4 E0208F 0 +OP4 E02090 0 +OP4 E02091 0 +OP4 E02092 0 +OP4 E02093 0 +OP4 E02094 0 +OP4 E02095 0 +OP4 E02096 0 +OP4 E02097 0 +OP4 E02098 0 +OP4 E02099 0 +OP4 E0209A 0 +OP4 E0209B 0 +OP4 E0209C 0 +OP4 E0209D 0 +OP4 E0209E 0 +OP4 E0209F 0 +OP4 E020A0 0 +OP4 E020A1 0 +OP4 E020A2 0 +OP4 E020A3 0 +OP4 E020A4 0 +OP4 E020A5 0 +OP4 E020A6 0 +OP4 E020A7 0 +OP4 E020A8 0 +OP4 E020A9 0 +OP4 E020AA 0 +OP4 E020AB 0 +OP4 E020AC 0 +OP4 E020AD 0 +OP4 E020AE 0 +OP4 E020AF 0 +OP4 E020B0 0 +OP4 E020B1 0 +OP4 E020B2 0 +OP4 E020B3 0 +OP4 E020B4 0 +OP4 E020B5 0 +OP4 E020B6 0 +OP4 E020B7 0 +OP4 E020B8 0 +OP4 E020B9 0 +OP4 E020BA 0 +OP4 E020BB 0 +OP4 E020BC 0 +OP4 E020BD 0 +OP4 E020BE 0 +OP4 E020BF 0 +OP4 E020C0 0 +OP4 E020C1 0 +OP4 E020C2 0 +OP4 E020C3 0 +OP4 E020C4 0 +OP4 E020C5 0 +OP4 E020C6 0 +OP4 E020C7 0 +OP4 E020C8 0 +OP4 E020C9 0 +OP4 E020CA 0 +OP4 E020CB 0 +OP4 E020CC 0 +OP4 E020CD 0 +OP4 E020CE 0 +OP4 E020CF 0 +OP4 E020D0 0 +OP4 E020D1 0 +OP4 E020D2 0 +OP4 E020D3 0 +OP4 E020D4 0 +OP4 E020D5 0 +OP4 E020D6 0 +OP4 E020D7 0 +OP4 E020D8 0 +OP4 E020D9 0 +OP4 E020DA 0 +OP4 E020DB 0 +OP4 E020DC 0 +OP4 E020DD 0 +OP4 E020DE 0 +OP4 E020DF 0 +OP4 E020E0 0 +OP4 E020E1 0 +OP4 E020E2 0 +OP4 E020E3 0 +OP4 E020E4 0 +OP4 E020E5 0 +OP4 E020E6 0 +OP4 E020E7 0 +OP4 E020E8 0 +OP4 E020E9 0 +OP4 E020EA 0 +OP4 E020EB 0 +OP4 E020EC 0 +OP4 E020ED 0 +OP4 E020EE 0 +OP4 E020EF 0 +OP4 E020F0 0 +OP4 E020F1 0 +OP4 E020F2 0 +OP4 E020F3 0 +OP4 E020F4 0 +OP4 E020F5 0 +OP4 E020F6 0 +OP4 E020F7 0 +OP4 E020F8 0 +OP4 E020F9 0 +OP4 E020FA 0 +OP4 E020FB 0 +OP4 E020FC 0 +OP4 E020FD 0 +OP4 E020FE 0 +OP4 E020FF 0 +OP4 E02100 0 +OP4 E02101 0 +OP4 E02102 0 +OP4 E02103 0 +OP4 E02104 0 +OP4 E02105 0 +OP4 E02106 0 +OP4 E02107 0 +OP4 E02108 0 +OP4 E02109 0 +OP4 E0210A 0 +OP4 E0210B 0 +OP4 E0210C 0 +OP4 E0210D 0 +OP4 E0210E 0 +OP4 E0210F 0 +OP4 E02110 0 +OP4 E02111 0 +OP4 E02112 0 +OP4 E02113 0 +OP4 E02114 0 +OP4 E02115 0 +OP4 E02116 0 +OP4 E02117 0 +OP4 E02118 0 +OP4 E02119 0 +OP4 E0211A 0 +OP4 E0211B 0 +OP4 E0211C 0 +OP4 E0211D 0 +OP4 E0211E 0 +OP4 E0211F 0 +OP4 E02120 0 +OP4 E02121 0 +OP4 E02122 0 +OP4 E02123 0 +OP4 E02124 0 +OP4 E02125 0 +OP4 E02126 0 +OP4 E02127 0 +OP4 E02128 0 +OP4 E02129 0 +OP4 E0212A 0 +OP4 E0212B 0 +OP4 E0212C 0 +OP4 E0212D 0 +OP4 E0212E 0 +OP4 E0212F 0 +OP4 E02130 0 +OP4 E02131 0 +OP4 E02132 0 +OP4 E02133 0 +OP4 E02134 0 +OP4 E02135 0 +OP4 E02136 0 +OP4 E02137 0 +OP4 E02138 0 +OP4 E02139 0 +OP4 E0213A 0 +OP4 E0213B 0 +OP4 E0213C 0 +OP4 E0213D 0 +OP4 E0213E 0 +OP4 E0213F 0 +OP4 E02140 0 +OP4 E02141 0 +OP4 E02142 0 +OP4 E02143 0 +OP4 E02144 0 +OP4 E02145 0 +OP4 E02146 0 +OP4 E02147 0 +OP4 E02148 0 +OP4 E02149 0 +OP4 E0214A 0 +OP4 E0214B 0 +OP4 E0214C 0 +OP4 E0214D 0 +OP4 E0214E 0 +OP4 E0214F 0 +OP4 E02150 0 +OP4 E02151 0 +OP4 E02152 0 +OP4 E02153 0 +OP4 E02154 0 +OP4 E02155 0 +OP4 E02156 0 +OP4 E02157 0 +OP4 E02158 0 +OP4 E02159 0 +OP4 E0215A 0 +OP4 E0215B 0 +OP4 E0215C 0 +OP4 E0215D 0 +OP4 E0215E 0 +OP4 E0215F 0 +OP4 E02160 0 +OP4 E02161 0 +OP4 E02162 0 +OP4 E02163 0 +OP4 E02164 0 +OP4 E02165 0 +OP4 E02166 0 +OP4 E02167 0 +OP4 E02168 0 +OP4 E02169 0 +OP4 E0216A 0 +OP4 E0216B 0 +OP4 E0216C 0 +OP4 E0216D 0 +OP4 E0216E 0 +OP4 E0216F 0 +OP4 E02170 0 +OP4 E02171 0 +OP4 E02172 0 +OP4 E02173 0 +OP4 E02174 0 +OP4 E02175 0 +OP4 E02176 0 +OP4 E02177 0 +OP4 E02178 0 +OP4 E02179 0 +OP4 E0217A 0 +OP4 E0217B 0 +OP4 E0217C 0 +OP4 E0217D 0 +OP4 E0217E 0 +OP4 E0217F 0 +OP4 E02180 0 +OP4 E02181 0 +OP4 E02182 0 +OP4 E02183 0 +OP4 E02184 0 +OP4 E02185 0 +OP4 E02186 0 +OP4 E02187 0 +OP4 E02188 0 +OP4 E02189 0 +OP4 E0218A 0 +OP4 E0218B 0 +OP4 E0218C 0 +OP4 E0218D 0 +OP4 E0218E 0 +OP4 E0218F 0 +OP4 E02190 0 +OP4 E02191 0 +OP4 E02192 0 +OP4 E02193 0 +OP4 E02194 0 +OP4 E02195 0 +OP4 E02196 0 +OP4 E02197 0 +OP4 E02198 0 +OP4 E02199 0 +OP4 E0219A 0 +OP4 E0219B 0 +OP4 E0219C 0 +OP4 E0219D 0 +OP4 E0219E 0 +OP4 E0219F 0 +OP4 E021A0 0 +OP4 E021A1 0 +OP4 E021A2 0 +OP4 E021A3 0 +OP4 E021A4 0 +OP4 E021A5 0 +OP4 E021A6 0 +OP4 E021A7 0 +OP4 E021A8 0 +OP4 E021A9 0 +OP4 E021AA 0 +OP4 E021AB 0 +OP4 E021AC 0 +OP4 E021AD 0 +OP4 E021AE 0 +OP4 E021AF 0 +OP4 E021B0 0 +OP4 E021B1 0 +OP4 E021B2 0 +OP4 E021B3 0 +OP4 E021B4 0 +OP4 E021B5 0 +OP4 E021B6 0 +OP4 E021B7 0 +OP4 E021B8 0 +OP4 E021B9 0 +OP4 E021BA 0 +OP4 E021BB 0 +OP4 E021BC 0 +OP4 E021BD 0 +OP4 E021BE 0 +OP4 E021BF 0 +OP4 E021C0 0 +OP4 E021C1 0 +OP4 E021C2 0 +OP4 E021C3 0 +OP4 E021C4 0 +OP4 E021C5 0 +OP4 E021C6 0 +OP4 E021C7 0 +OP4 E021C8 0 +OP4 E021C9 0 +OP4 E021CA 0 +OP4 E021CB 0 +OP4 E021CC 0 +OP4 E021CD 0 +OP4 E021CE 0 +OP4 E021CF 0 +OP4 E021D0 0 +OP4 E021D1 0 +OP4 E021D2 0 +OP4 E021D3 0 +OP4 E021D4 0 +OP4 E021D5 0 +OP4 E021D6 0 +OP4 E021D7 0 +OP4 E021D8 0 +OP4 E021D9 0 +OP4 E021DA 0 +OP4 E021DB 0 +OP4 E021DC 0 +OP4 E021DD 0 +OP4 E021DE 0 +OP4 E021DF 0 +OP4 E021E0 0 +OP4 E021E1 0 +OP4 E021E2 0 +OP4 E021E3 0 +OP4 E021E4 0 +OP4 E021E5 0 +OP4 E021E6 0 +OP4 E021E7 0 +OP4 E021E8 0 +OP4 E021E9 0 +OP4 E021EA 0 +OP4 E021EB 0 +OP4 E021EC 0 +OP4 E021ED 0 +OP4 E021EE 0 +OP4 E021EF 0 +OP4 E021F0 0 +OP4 E021F1 0 +OP4 E021F2 0 +OP4 E021F3 0 +OP4 E021F4 0 +OP4 E021F5 0 +OP4 E021F6 0 +OP4 E021F7 0 +OP4 E021F8 0 +OP4 E021F9 0 +OP4 E021FA 0 +OP4 E021FB 0 +OP4 E021FC 0 +OP4 E021FD 0 +OP4 E021FE 0 +OP4 E021FF 0 +OP4 E02200 0 +OP4 E02201 0 +OP4 E02202 0 +OP4 E02203 0 +OP4 E02204 0 +OP4 E02205 0 +OP4 E02206 0 +OP4 E02207 0 +OP4 E02208 0 +OP4 E02209 0 +OP4 E0220A 0 +OP4 E0220B 0 +OP4 E0220C 0 +OP4 E0220D 0 +OP4 E0220E 0 +OP4 E0220F 0 +OP4 E02210 0 +OP4 E02211 0 +OP4 E02212 0 +OP4 E02213 0 +OP4 E02214 0 +OP4 E02215 0 +OP4 E02216 0 +OP4 E02217 0 +OP4 E02218 0 +OP4 E02219 0 +OP4 E0221A 0 +OP4 E0221B 0 +OP4 E0221C 0 +OP4 E0221D 0 +OP4 E0221E 0 +OP4 E0221F 0 +OP4 E02220 0 +OP4 E02221 0 +OP4 E02222 0 +OP4 E02223 0 +OP4 E02224 0 +OP4 E02225 0 +OP4 E02226 0 +OP4 E02227 0 +OP4 E02228 0 +OP4 E02229 0 +OP4 E0222A 0 +OP4 E0222B 0 +OP4 E0222C 0 +OP4 E0222D 0 +OP4 E0222E 0 +OP4 E0222F 0 +OP4 E02230 0 +OP4 E02231 0 +OP4 E02232 0 +OP4 E02233 0 +OP4 E02234 0 +OP4 E02235 0 +OP4 E02236 0 +OP4 E02237 0 +OP4 E02238 0 +OP4 E02239 0 +OP4 E0223A 0 +OP4 E0223B 0 +OP4 E0223C 0 +OP4 E0223D 0 +OP4 E0223E 0 +OP4 E0223F 0 +OP4 E02240 0 +OP4 E02241 0 +OP4 E02242 0 +OP4 E02243 0 +OP4 E02244 0 +OP4 E02245 0 +OP4 E02246 0 +OP4 E02247 0 +OP4 E02248 0 +OP4 E02249 0 +OP4 E0224A 0 +OP4 E0224B 0 +OP4 E0224C 0 +OP4 E0224D 0 +OP4 E0224E 0 +OP4 E0224F 0 +OP4 E02250 0 +OP4 E02251 0 +OP4 E02252 0 +OP4 E02253 0 +OP4 E02254 0 +OP4 E02255 0 +OP4 E02256 0 +OP4 E02257 0 +OP4 E02258 0 +OP4 E02259 0 +OP4 E0225A 0 +OP4 E0225B 0 +OP4 E0225C 0 +OP4 E0225D 0 +OP4 E0225E 0 +OP4 E0225F 0 +OP4 E02260 0 +OP4 E02261 0 +OP4 E02262 0 +OP4 E02263 0 +OP4 E02264 0 +OP4 E02265 0 +OP4 E02266 0 +OP4 E02267 0 +OP4 E02268 0 +OP4 E02269 0 +OP4 E0226A 0 +OP4 E0226B 0 +OP4 E0226C 0 +OP4 E0226D 0 +OP4 E0226E 0 +OP4 E0226F 0 +OP4 E02270 0 +OP4 E02271 0 +OP4 E02272 0 +OP4 E02273 0 +OP4 E02274 0 +OP4 E02275 0 +OP4 E02276 0 +OP4 E02277 0 +OP4 E02278 0 +OP4 E02279 0 +OP4 E0227A 0 +OP4 E0227B 0 +OP4 E0227C 0 +OP4 E0227D 0 +OP4 E0227E 0 +OP4 E0227F 0 +OP4 E02280 0 +OP4 E02281 0 +OP4 E02282 0 +OP4 E02283 0 +OP4 E02284 0 +OP4 E02285 0 +OP4 E02286 0 +OP4 E02287 0 +OP4 E02288 0 +OP4 E02289 0 +OP4 E0228A 0 +OP4 E0228B 0 +OP4 E0228C 0 +OP4 E0228D 0 +OP4 E0228E 0 +OP4 E0228F 0 +OP4 E02290 0 +OP4 E02291 0 +OP4 E02292 0 +OP4 E02293 0 +OP4 E02294 0 +OP4 E02295 0 +OP4 E02296 0 +OP4 E02297 0 +OP4 E02298 0 +OP4 E02299 0 +OP4 E0229A 0 +OP4 E0229B 0 +OP4 E0229C 0 +OP4 E0229D 0 +OP4 E0229E 0 +OP4 E0229F 0 +OP4 E022A0 0 +OP4 E022A1 0 +OP4 E022A2 0 +OP4 E022A3 0 +OP4 E022A4 0 +OP4 E022A5 0 +OP4 E022A6 0 +OP4 E022A7 0 +OP4 E022A8 0 +OP4 E022A9 0 +OP4 E022AA 0 +OP4 E022AB 0 +OP4 E022AC 0 +OP4 E022AD 0 +OP4 E022AE 0 +OP4 E022AF 0 +OP4 E022B0 0 +OP4 E022B1 0 +OP4 E022B2 0 +OP4 E022B3 0 +OP4 E022B4 0 +OP4 E022B5 0 +OP4 E022B6 0 +OP4 E022B7 0 +OP4 E022B8 0 +OP4 E022B9 0 +OP4 E022BA 0 +OP4 E022BB 0 +OP4 E022BC 0 +OP4 E022BD 0 +OP4 E022BE 0 +OP4 E022BF 0 +OP4 E022C0 0 +OP4 E022C1 0 +OP4 E022C2 0 +OP4 E022C3 0 +OP4 E022C4 0 +OP4 E022C5 0 +OP4 E022C6 0 +OP4 E022C7 0 +OP4 E022C8 0 +OP4 E022C9 0 +OP4 E022CA 0 +OP4 E022CB 0 +OP4 E022CC 0 +OP4 E022CD 0 +OP4 E022CE 0 +OP4 E022CF 0 +OP4 E022D0 0 +OP4 E022D1 0 +OP4 E022D2 0 +OP4 E022D3 0 +OP4 E022D4 0 +OP4 E022D5 0 +OP4 E022D6 0 +OP4 E022D7 0 +OP4 E022D8 0 +OP4 E022D9 0 +OP4 E022DA 0 +OP4 E022DB 0 +OP4 E022DC 0 +OP4 E022DD 0 +OP4 E022DE 0 +OP4 E022DF 0 +OP4 E022E0 0 +OP4 E022E1 0 +OP4 E022E2 0 +OP4 E022E3 0 +OP4 E022E4 0 +OP4 E022E5 0 +OP4 E022E6 0 +OP4 E022E7 0 +OP4 E022E8 0 +OP4 E022E9 0 +OP4 E022EA 0 +OP4 E022EB 0 +OP4 E022EC 0 +OP4 E022ED 0 +OP4 E022EE 0 +OP4 E022EF 0 +OP4 E022F0 0 +OP4 E022F1 0 +OP4 E022F2 0 +OP4 E022F3 0 +OP4 E022F4 0 +OP4 E022F5 0 +OP4 E022F6 0 +OP4 E022F7 0 +OP4 E022F8 0 +OP4 E022F9 0 +OP4 E022FA 0 +OP4 E022FB 0 +OP4 E022FC 0 +OP4 E022FD 0 +OP4 E022FE 0 +OP4 E022FF 0 +OP4 E02300 0 +OP4 E02301 0 +OP4 E02302 0 +OP4 E02303 0 +OP4 E02304 0 +OP4 E02305 0 +OP4 E02306 0 +OP4 E02307 0 +OP4 E02308 0 +OP4 E02309 0 +OP4 E0230A 0 +OP4 E0230B 0 +OP4 E0230C 0 +OP4 E0230D 0 +OP4 E0230E 0 +OP4 E0230F 0 +OP4 E02310 0 +OP4 E02311 0 +OP4 E02312 0 +OP4 E02313 0 +OP4 E02314 0 +OP4 E02315 0 +OP4 E02316 0 +OP4 E02317 0 +OP4 E02318 0 +OP4 E02319 0 +OP4 E0231A 0 +OP4 E0231B 0 +OP4 E0231C 0 +OP4 E0231D 0 +OP4 E0231E 0 +OP4 E0231F 0 +OP4 E02320 0 +OP4 E02321 0 +OP4 E02322 0 +OP4 E02323 0 +OP4 E02324 0 +OP4 E02325 0 +OP4 E02326 0 +OP4 E02327 0 +OP4 E02328 0 +OP4 E02329 0 +OP4 E0232A 0 +OP4 E0232B 0 +OP4 E0232C 0 +OP4 E0232D 0 +OP4 E0232E 0 +OP4 E0232F 0 +OP4 E02330 0 +OP4 E02331 0 +OP4 E02332 0 +OP4 E02333 0 +OP4 E02334 0 +OP4 E02335 0 +OP4 E02336 0 +OP4 E02337 0 +OP4 E02338 0 +OP4 E02339 0 +OP4 E0233A 0 +OP4 E0233B 0 +OP4 E0233C 0 +OP4 E0233D 0 +OP4 E0233E 0 +OP4 E0233F 0 +OP4 E02340 0 +OP4 E02341 0 +OP4 E02342 0 +OP4 E02343 0 +OP4 E02344 0 +OP4 E02345 0 +OP4 E02346 0 +OP4 E02347 0 +OP4 E02348 0 +OP4 E02349 0 +OP4 E0234A 0 +OP4 E0234B 0 +OP4 E0234C 0 +OP4 E0234D 0 +OP4 E0234E 0 +OP4 E0234F 0 +OP4 E02350 0 +OP4 E02351 0 +OP4 E02352 0 +OP4 E02353 0 +OP4 E02354 0 +OP4 E02355 0 +OP4 E02356 0 +OP4 E02357 0 +OP4 E02358 0 +OP4 E02359 0 +OP4 E0235A 0 +OP4 E0235B 0 +OP4 E0235C 0 +OP4 E0235D 0 +OP4 E0235E 0 +OP4 E0235F 0 +OP4 E02360 0 +OP4 E02361 0 +OP4 E02362 0 +OP4 E02363 0 +OP4 E02364 0 +OP4 E02365 0 +OP4 E02366 0 +OP4 E02367 0 +OP4 E02368 0 +OP4 E02369 0 +OP4 E0236A 0 +OP4 E0236B 0 +OP4 E0236C 0 +OP4 E0236D 0 +OP4 E0236E 0 +OP4 E0236F 0 +OP4 E02370 0 +OP4 E02371 0 +OP4 E02372 0 +OP4 E02373 0 +OP4 E02374 0 +OP4 E02375 0 +OP4 E02376 0 +OP4 E02377 0 +OP4 E02378 0 +OP4 E02379 0 +OP4 E0237A 0 +OP4 E0237B 0 +OP4 E0237C 0 +OP4 E0237D 0 +OP4 E0237E 0 +OP4 E0237F 0 +OP4 E02380 0 +OP4 E02381 0 +OP4 E02382 0 +OP4 E02383 0 +OP4 E02384 0 +OP4 E02385 0 +OP4 E02386 0 +OP4 E02387 0 +OP4 E02388 0 +OP4 E02389 0 +OP4 E0238A 0 +OP4 E0238B 0 +OP4 E0238C 0 +OP4 E0238D 0 +OP4 E0238E 0 +OP4 E0238F 0 +OP4 E02390 0 +OP4 E02391 0 +OP4 E02392 0 +OP4 E02393 0 +OP4 E02394 0 +OP4 E02395 0 +OP4 E02396 0 +OP4 E02397 0 +OP4 E02398 0 +OP4 E02399 0 +OP4 E0239A 0 +OP4 E0239B 0 +OP4 E0239C 0 +OP4 E0239D 0 +OP4 E0239E 0 +OP4 E0239F 0 +OP4 E023A0 0 +OP4 E023A1 0 +OP4 E023A2 0 +OP4 E023A3 0 +OP4 E023A4 0 +OP4 E023A5 0 +OP4 E023A6 0 +OP4 E023A7 0 +OP4 E023A8 0 +OP4 E023A9 0 +OP4 E023AA 0 +OP4 E023AB 0 +OP4 E023AC 0 +OP4 E023AD 0 +OP4 E023AE 0 +OP4 E023AF 0 +OP4 E023B0 0 +OP4 E023B1 0 +OP4 E023B2 0 +OP4 E023B3 0 +OP4 E023B4 0 +OP4 E023B5 0 +OP4 E023B6 0 +OP4 E023B7 0 +OP4 E023B8 0 +OP4 E023B9 0 +OP4 E023BA 0 +OP4 E023BB 0 +OP4 E023BC 0 +OP4 E023BD 0 +OP4 E023BE 0 +OP4 E023BF 0 +OP4 E023C0 0 +OP4 E023C1 0 +OP4 E023C2 0 +OP4 E023C3 0 +OP4 E023C4 0 +OP4 E023C5 0 +OP4 E023C6 0 +OP4 E023C7 0 +OP4 E023C8 0 +OP4 E023C9 0 +OP4 E023CA 0 +OP4 E023CB 0 +OP4 E023CC 0 +OP4 E023CD 0 +OP4 E023CE 0 +OP4 E023CF 0 +OP4 E023D0 0 +OP4 E023D1 0 +OP4 E023D2 0 +OP4 E023D3 0 +OP4 E023D4 0 +OP4 E023D5 0 +OP4 E023D6 0 +OP4 E023D7 0 +OP4 E023D8 0 +OP4 E023D9 0 +OP4 E023DA 0 +OP4 E023DB 0 +OP4 E023DC 0 +OP4 E023DD 0 +OP4 E023DE 0 +OP4 E023DF 0 +OP4 E023E0 0 +OP4 E023E1 0 +OP4 E023E2 0 +OP4 E023E3 0 +OP4 E023E4 0 +OP4 E023E5 0 +OP4 E023E6 0 +OP4 E023E7 0 +OP4 E023E8 0 +OP4 E023E9 0 +OP4 E023EA 0 +OP4 E023EB 0 +OP4 E023EC 0 +OP4 E023ED 0 +OP4 E023EE 0 +OP4 E023EF 0 +OP4 E023F0 0 +OP4 E023F1 0 +OP4 E023F2 0 +OP4 E023F3 0 +OP4 E023F4 0 +OP4 E023F5 0 +OP4 E023F6 0 +OP4 E023F7 0 +OP4 E023F8 0 +OP4 E023F9 0 +OP4 E023FA 0 +OP4 E023FB 0 +OP4 E023FC 0 +OP4 E023FD 0 +OP4 E023FE 0 +OP4 E023FF 0 +OP4 E02400 0 +OP4 E02401 0 +OP4 E02402 0 +OP4 E02403 0 +OP4 E02404 0 +OP4 E02405 0 +OP4 E02406 0 +OP4 E02407 0 +OP4 E02408 0 +OP4 E02409 0 +OP4 E0240A 0 +OP4 E0240B 0 +OP4 E0240C 0 +OP4 E0240D 0 +OP4 E0240E 0 +OP4 E0240F 0 +OP4 E02410 0 +OP4 E02411 0 +OP4 E02412 0 +OP4 E02413 0 +OP4 E02414 0 +OP4 E02415 0 +OP4 E02416 0 +OP4 E02417 0 +OP4 E02418 0 +OP4 E02419 0 +OP4 E0241A 0 +OP4 E0241B 0 +OP4 E0241C 0 +OP4 E0241D 0 +OP4 E0241E 0 +OP4 E0241F 0 +OP4 E02420 0 +OP4 E02421 0 +OP4 E02422 0 +OP4 E02423 0 +OP4 E02424 0 +OP4 E02425 0 +OP4 E02426 0 +OP4 E02427 0 +OP4 E02428 0 +OP4 E02429 0 +OP4 E0242A 0 +OP4 E0242B 0 +OP4 E0242C 0 +OP4 E0242D 0 +OP4 E0242E 0 +OP4 E0242F 0 +OP4 E02430 0 +OP4 E02431 0 +OP4 E02432 0 +OP4 E02433 0 +OP4 E02434 0 +OP4 E02435 0 +OP4 E02436 0 +OP4 E02437 0 +OP4 E02438 0 +OP4 E02439 0 +OP4 E0243A 0 +OP4 E0243B 0 +OP4 E0243C 0 +OP4 E0243D 0 +OP4 E0243E 0 +OP4 E0243F 0 +OP4 E02440 0 +OP4 E02441 0 +OP4 E02442 0 +OP4 E02443 0 +OP4 E02444 0 +OP4 E02445 0 +OP4 E02446 0 +OP4 E02447 0 +OP4 E02448 0 +OP4 E02449 0 +OP4 E0244A 0 +OP4 E0244B 0 +OP4 E0244C 0 +OP4 E0244D 0 +OP4 E0244E 0 +OP4 E0244F 0 +OP4 E02450 0 +OP4 E02451 0 +OP4 E02452 0 +OP4 E02453 0 +OP4 E02454 0 +OP4 E02455 0 +OP4 E02456 0 +OP4 E02457 0 +OP4 E02458 0 +OP4 E02459 0 +OP4 E0245A 0 +OP4 E0245B 0 +OP4 E0245C 0 +OP4 E0245D 0 +OP4 E0245E 0 +OP4 E0245F 0 +OP4 E02460 0 +OP4 E02461 0 +OP4 E02462 0 +OP4 E02463 0 +OP4 E02464 0 +OP4 E02465 0 +OP4 E02466 0 +OP4 E02467 0 +OP4 E02468 0 +OP4 E02469 0 +OP4 E0246A 0 +OP4 E0246B 0 +OP4 E0246C 0 +OP4 E0246D 0 +OP4 E0246E 0 +OP4 E0246F 0 +OP4 E02470 0 +OP4 E02471 0 +OP4 E02472 0 +OP4 E02473 0 +OP4 E02474 0 +OP4 E02475 0 +OP4 E02476 0 +OP4 E02477 0 +OP4 E02478 0 +OP4 E02479 0 +OP4 E0247A 0 +OP4 E0247B 0 +OP4 E0247C 0 +OP4 E0247D 0 +OP4 E0247E 0 +OP4 E0247F 0 +OP4 E02480 0 +OP4 E02481 0 +OP4 E02482 0 +OP4 E02483 0 +OP4 E02484 0 +OP4 E02485 0 +OP4 E02486 0 +OP4 E02487 0 +OP4 E02488 0 +OP4 E02489 0 +OP4 E0248A 0 +OP4 E0248B 0 +OP4 E0248C 0 +OP4 E0248D 0 +OP4 E0248E 0 +OP4 E0248F 0 +OP4 E02490 0 +OP4 E02491 0 +OP4 E02492 0 +OP4 E02493 0 +OP4 E02494 0 +OP4 E02495 0 +OP4 E02496 0 +OP4 E02497 0 +OP4 E02498 0 +OP4 E02499 0 +OP4 E0249A 0 +OP4 E0249B 0 +OP4 E0249C 0 +OP4 E0249D 0 +OP4 E0249E 0 +OP4 E0249F 0 +OP4 E024A0 0 +OP4 E024A1 0 +OP4 E024A2 0 +OP4 E024A3 0 +OP4 E024A4 0 +OP4 E024A5 0 +OP4 E024A6 0 +OP4 E024A7 0 +OP4 E024A8 0 +OP4 E024A9 0 +OP4 E024AA 0 +OP4 E024AB 0 +OP4 E024AC 0 +OP4 E024AD 0 +OP4 E024AE 0 +OP4 E024AF 0 +OP4 E024B0 0 +OP4 E024B1 0 +OP4 E024B2 0 +OP4 E024B3 0 +OP4 E024B4 0 +OP4 E024B5 0 +OP4 E024B6 0 +OP4 E024B7 0 +OP4 E024B8 0 +OP4 E024B9 0 +OP4 E024BA 0 +OP4 E024BB 0 +OP4 E024BC 0 +OP4 E024BD 0 +OP4 E024BE 0 +OP4 E024BF 0 +OP4 E024C0 0 +OP4 E024C1 0 +OP4 E024C2 0 +OP4 E024C3 0 +OP4 E024C4 0 +OP4 E024C5 0 +OP4 E024C6 0 +OP4 E024C7 0 +OP4 E024C8 0 +OP4 E024C9 0 +OP4 E024CA 0 +OP4 E024CB 0 +OP4 E024CC 0 +OP4 E024CD 0 +OP4 E024CE 0 +OP4 E024CF 0 +OP4 E024D0 0 +OP4 E024D1 0 +OP4 E024D2 0 +OP4 E024D3 0 +OP4 E024D4 0 +OP4 E024D5 0 +OP4 E024D6 0 +OP4 E024D7 0 +OP4 E024D8 0 +OP4 E024D9 0 +OP4 E024DA 0 +OP4 E024DB 0 +OP4 E024DC 0 +OP4 E024DD 0 +OP4 E024DE 0 +OP4 E024DF 0 +OP4 E024E0 0 +OP4 E024E1 0 +OP4 E024E2 0 +OP4 E024E3 0 +OP4 E024E4 0 +OP4 E024E5 0 +OP4 E024E6 0 +OP4 E024E7 0 +OP4 E024E8 0 +OP4 E024E9 0 +OP4 E024EA 0 +OP4 E024EB 0 +OP4 E024EC 0 +OP4 E024ED 0 +OP4 E024EE 0 +OP4 E024EF 0 +OP4 E024F0 0 +OP4 E024F1 0 +OP4 E024F2 0 +OP4 E024F3 0 +OP4 E024F4 0 +OP4 E024F5 0 +OP4 E024F6 0 +OP4 E024F7 0 +OP4 E024F8 0 +OP4 E024F9 0 +OP4 E024FA 0 +OP4 E024FB 0 +OP4 E024FC 0 +OP4 E024FD 0 +OP4 E024FE 0 +OP4 E024FF 0 +OP4 E02500 0 +OP4 E02501 0 +OP4 E02502 0 +OP4 E02503 0 +OP4 E02504 0 +OP4 E02505 0 +OP4 E02506 0 +OP4 E02507 0 +OP4 E02508 0 +OP4 E02509 0 +OP4 E0250A 0 +OP4 E0250B 0 +OP4 E0250C 0 +OP4 E0250D 0 +OP4 E0250E 0 +OP4 E0250F 0 +OP4 E02510 0 +OP4 E02511 0 +OP4 E02512 0 +OP4 E02513 0 +OP4 E02514 0 +OP4 E02515 0 +OP4 E02516 0 +OP4 E02517 0 +OP4 E02518 0 +OP4 E02519 0 +OP4 E0251A 0 +OP4 E0251B 0 +OP4 E0251C 0 +OP4 E0251D 0 +OP4 E0251E 0 +OP4 E0251F 0 +OP4 E02520 0 +OP4 E02521 0 +OP4 E02522 0 +OP4 E02523 0 +OP4 E02524 0 +OP4 E02525 0 +OP4 E02526 0 +OP4 E02527 0 +OP4 E02528 0 +OP4 E02529 0 +OP4 E0252A 0 +OP4 E0252B 0 +OP4 E0252C 0 +OP4 E0252D 0 +OP4 E0252E 0 +OP4 E0252F 0 +OP4 E02530 0 +OP4 E02531 0 +OP4 E02532 0 +OP4 E02533 0 +OP4 E02534 0 +OP4 E02535 0 +OP4 E02536 0 +OP4 E02537 0 +OP4 E02538 0 +OP4 E02539 0 +OP4 E0253A 0 +OP4 E0253B 0 +OP4 E0253C 0 +OP4 E0253D 0 +OP4 E0253E 0 +OP4 E0253F 0 +OP4 E02540 0 +OP4 E02541 0 +OP4 E02542 0 +OP4 E02543 0 +OP4 E02544 0 +OP4 E02545 0 +OP4 E02546 0 +OP4 E02547 0 +OP4 E02548 0 +OP4 E02549 0 +OP4 E0254A 0 +OP4 E0254B 0 +OP4 E0254C 0 +OP4 E0254D 0 +OP4 E0254E 0 +OP4 E0254F 0 +OP4 E02550 0 +OP4 E02551 0 +OP4 E02552 0 +OP4 E02553 0 +OP4 E02554 0 +OP4 E02555 0 +OP4 E02556 0 +OP4 E02557 0 +OP4 E02558 0 +OP4 E02559 0 +OP4 E0255A 0 +OP4 E0255B 0 +OP4 E0255C 0 +OP4 E0255D 0 +OP4 E0255E 0 +OP4 E0255F 0 +OP4 E02560 0 +OP4 E02561 0 +OP4 E02562 0 +OP4 E02563 0 +OP4 E02564 0 +OP4 E02565 0 +OP4 E02566 0 +OP4 E02567 0 +OP4 E02568 0 +OP4 E02569 0 +OP4 E0256A 0 +OP4 E0256B 0 +OP4 E0256C 0 +OP4 E0256D 0 +OP4 E0256E 0 +OP4 E0256F 0 +OP4 E02570 0 +OP4 E02571 0 +OP4 E02572 0 +OP4 E02573 0 +OP4 E02574 0 +OP4 E02575 0 +OP4 E02576 0 +OP4 E02577 0 +OP4 E02578 0 +OP4 E02579 0 +OP4 E0257A 0 +OP4 E0257B 0 +OP4 E0257C 0 +OP4 E0257D 0 +OP4 E0257E 0 +OP4 E0257F 0 +OP4 E02580 0 +OP4 E02581 0 +OP4 E02582 0 +OP4 E02583 0 +OP4 E02584 0 +OP4 E02585 0 +OP4 E02586 0 +OP4 E02587 0 +OP4 E02588 0 +OP4 E02589 0 +OP4 E0258A 0 +OP4 E0258B 0 +OP4 E0258C 0 +OP4 E0258D 0 +OP4 E0258E 0 +OP4 E0258F 0 +OP4 E02590 0 +OP4 E02591 0 +OP4 E02592 0 +OP4 E02593 0 +OP4 E02594 0 +OP4 E02595 0 +OP4 E02596 0 +OP4 E02597 0 +OP4 E02598 0 +OP4 E02599 0 +OP4 E0259A 0 +OP4 E0259B 0 +OP4 E0259C 0 +OP4 E0259D 0 +OP4 E0259E 0 +OP4 E0259F 0 +OP4 E025A0 0 +OP4 E025A1 0 +OP4 E025A2 0 +OP4 E025A3 0 +OP4 E025A4 0 +OP4 E025A5 0 +OP4 E025A6 0 +OP4 E025A7 0 +OP4 E025A8 0 +OP4 E025A9 0 +OP4 E025AA 0 +OP4 E025AB 0 +OP4 E025AC 0 +OP4 E025AD 0 +OP4 E025AE 0 +OP4 E025AF 0 +OP4 E025B0 0 +OP4 E025B1 0 +OP4 E025B2 0 +OP4 E025B3 0 +OP4 E025B4 0 +OP4 E025B5 0 +OP4 E025B6 0 +OP4 E025B7 0 +OP4 E025B8 0 +OP4 E025B9 0 +OP4 E025BA 0 +OP4 E025BB 0 +OP4 E025BC 0 +OP4 E025BD 0 +OP4 E025BE 0 +OP4 E025BF 0 +OP4 E025C0 0 +OP4 E025C1 0 +OP4 E025C2 0 +OP4 E025C3 0 +OP4 E025C4 0 +OP4 E025C5 0 +OP4 E025C6 0 +OP4 E025C7 0 +OP4 E025C8 0 +OP4 E025C9 0 +OP4 E025CA 0 +OP4 E025CB 0 +OP4 E025CC 0 +OP4 E025CD 0 +OP4 E025CE 0 +OP4 E025CF 0 +OP4 E025D0 0 +OP4 E025D1 0 +OP4 E025D2 0 +OP4 E025D3 0 +OP4 E025D4 0 +OP4 E025D5 0 +OP4 E025D6 0 +OP4 E025D7 0 +OP4 E025D8 0 +OP4 E025D9 0 +OP4 E025DA 0 +OP4 E025DB 0 +OP4 E025DC 0 +OP4 E025DD 0 +OP4 E025DE 0 +OP4 E025DF 0 +OP4 E025E0 0 +OP4 E025E1 0 +OP4 E025E2 0 +OP4 E025E3 0 +OP4 E025E4 0 +OP4 E025E5 0 +OP4 E025E6 0 +OP4 E025E7 0 +OP4 E025E8 0 +OP4 E025E9 0 +OP4 E025EA 0 +OP4 E025EB 0 +OP4 E025EC 0 +OP4 E025ED 0 +OP4 E025EE 0 +OP4 E025EF 0 +OP4 E025F0 0 +OP4 E025F1 0 +OP4 E025F2 0 +OP4 E025F3 0 +OP4 E025F4 0 +OP4 E025F5 0 +OP4 E025F6 0 +OP4 E025F7 0 +OP4 E025F8 0 +OP4 E025F9 0 +OP4 E025FA 0 +OP4 E025FB 0 +OP4 E025FC 0 +OP4 E025FD 0 +OP4 E025FE 0 +OP4 E025FF 0 +OP4 E02600 0 +OP4 E02601 0 +OP4 E02602 0 +OP4 E02603 0 +OP4 E02604 0 +OP4 E02605 0 +OP4 E02606 0 +OP4 E02607 0 +OP4 E02608 0 +OP4 E02609 0 +OP4 E0260A 0 +OP4 E0260B 0 +OP4 E0260C 0 +OP4 E0260D 0 +OP4 E0260E 0 +OP4 E0260F 0 +OP4 E02610 0 +OP4 E02611 0 +OP4 E02612 0 +OP4 E02613 0 +OP4 E02614 0 +OP4 E02615 0 +OP4 E02616 0 +OP4 E02617 0 +OP4 E02618 0 +OP4 E02619 0 +OP4 E0261A 0 +OP4 E0261B 0 +OP4 E0261C 0 +OP4 E0261D 0 +OP4 E0261E 0 +OP4 E0261F 0 +OP4 E02620 0 +OP4 E02621 0 +OP4 E02622 0 +OP4 E02623 0 +OP4 E02624 0 +OP4 E02625 0 +OP4 E02626 0 +OP4 E02627 0 +OP4 E02628 0 +OP4 E02629 0 +OP4 E0262A 0 +OP4 E0262B 0 +OP4 E0262C 0 +OP4 E0262D 0 +OP4 E0262E 0 +OP4 E0262F 0 +OP4 E02630 0 +OP4 E02631 0 +OP4 E02632 0 +OP4 E02633 0 +OP4 E02634 0 +OP4 E02635 0 +OP4 E02636 0 +OP4 E02637 0 +OP4 E02638 0 +OP4 E02639 0 +OP4 E0263A 0 +OP4 E0263B 0 +OP4 E0263C 0 +OP4 E0263D 0 +OP4 E0263E 0 +OP4 E0263F 0 +OP4 E02640 0 +OP4 E02641 0 +OP4 E02642 0 +OP4 E02643 0 +OP4 E02644 0 +OP4 E02645 0 +OP4 E02646 0 +OP4 E02647 0 +OP4 E02648 0 +OP4 E02649 0 +OP4 E0264A 0 +OP4 E0264B 0 +OP4 E0264C 0 +OP4 E0264D 0 +OP4 E0264E 0 +OP4 E0264F 0 +OP4 E02650 0 +OP4 E02651 0 +OP4 E02652 0 +OP4 E02653 0 +OP4 E02654 0 +OP4 E02655 0 +OP4 E02656 0 +OP4 E02657 0 +OP4 E02658 0 +OP4 E02659 0 +OP4 E0265A 0 +OP4 E0265B 0 +OP4 E0265C 0 +OP4 E0265D 0 +OP4 E0265E 0 +OP4 E0265F 0 +OP4 E02660 0 +OP4 E02661 0 +OP4 E02662 0 +OP4 E02663 0 +OP4 E02664 0 +OP4 E02665 0 +OP4 E02666 0 +OP4 E02667 0 +OP4 E02668 0 +OP4 E02669 0 +OP4 E0266A 0 +OP4 E0266B 0 +OP4 E0266C 0 +OP4 E0266D 0 +OP4 E0266E 0 +OP4 E0266F 0 +OP4 E02670 0 +OP4 E02671 0 +OP4 E02672 0 +OP4 E02673 0 +OP4 E02674 0 +OP4 E02675 0 +OP4 E02676 0 +OP4 E02677 0 +OP4 E02678 0 +OP4 E02679 0 +OP4 E0267A 0 +OP4 E0267B 0 +OP4 E0267C 0 +OP4 E0267D 0 +OP4 E0267E 0 +OP4 E0267F 0 +OP4 E02680 0 +OP4 E02681 0 +OP4 E02682 0 +OP4 E02683 0 +OP4 E02684 0 +OP4 E02685 0 +OP4 E02686 0 +OP4 E02687 0 +OP4 E02688 0 +OP4 E02689 0 +OP4 E0268A 0 +OP4 E0268B 0 +OP4 E0268C 0 +OP4 E0268D 0 +OP4 E0268E 0 +OP4 E0268F 0 +OP4 E02690 0 +OP4 E02691 0 +OP4 E02692 0 +OP4 E02693 0 +OP4 E02694 0 +OP4 E02695 0 +OP4 E02696 0 +OP4 E02697 0 +OP4 E02698 0 +OP4 E02699 0 +OP4 E0269A 0 +OP4 E0269B 0 +OP4 E0269C 0 +OP4 E0269D 0 +OP4 E0269E 0 +OP4 E0269F 0 +OP4 E026A0 0 +OP4 E026A1 0 +OP4 E026A2 0 +OP4 E026A3 0 +OP4 E026A4 0 +OP4 E026A5 0 +OP4 E026A6 0 +OP4 E026A7 0 +OP4 E026A8 0 +OP4 E026A9 0 +OP4 E026AA 0 +OP4 E026AB 0 +OP4 E026AC 0 +OP4 E026AD 0 +OP4 E026AE 0 +OP4 E026AF 0 +OP4 E026B0 0 +OP4 E026B1 0 +OP4 E026B2 0 +OP4 E026B3 0 +OP4 E026B4 0 +OP4 E026B5 0 +OP4 E026B6 0 +OP4 E026B7 0 +OP4 E026B8 0 +OP4 E026B9 0 +OP4 E026BA 0 +OP4 E026BB 0 +OP4 E026BC 0 +OP4 E026BD 0 +OP4 E026BE 0 +OP4 E026BF 0 +OP4 E026C0 0 +OP4 E026C1 0 +OP4 E026C2 0 +OP4 E026C3 0 +OP4 E026C4 0 +OP4 E026C5 0 +OP4 E026C6 0 +OP4 E026C7 0 +OP4 E026C8 0 +OP4 E026C9 0 +OP4 E026CA 0 +OP4 E026CB 0 +OP4 E026CC 0 +OP4 E026CD 0 +OP4 E026CE 0 +OP4 E026CF 0 +OP4 E026D0 0 +OP4 E026D1 0 +OP4 E026D2 0 +OP4 E026D3 0 +OP4 E026D4 0 +OP4 E026D5 0 +OP4 E026D6 0 +OP4 E026D7 0 +OP4 E026D8 0 +OP4 E026D9 0 +OP4 E026DA 0 +OP4 E026DB 0 +OP4 E026DC 0 +OP4 E026DD 0 +OP4 E026DE 0 +OP4 E026DF 0 +OP4 E026E0 0 +OP4 E026E1 0 +OP4 E026E2 0 +OP4 E026E3 0 +OP4 E026E4 0 +OP4 E026E5 0 +OP4 E026E6 0 +OP4 E026E7 0 +OP4 E026E8 0 +OP4 E026E9 0 +OP4 E026EA 0 +OP4 E026EB 0 +OP4 E026EC 0 +OP4 E026ED 0 +OP4 E026EE 0 +OP4 E026EF 0 +OP4 E026F0 0 +OP4 E026F1 0 +OP4 E026F2 0 +OP4 E026F3 0 +OP4 E026F4 0 +OP4 E026F5 0 +OP4 E026F6 0 +OP4 E026F7 0 +OP4 E026F8 0 +OP4 E026F9 0 +OP4 E026FA 0 +OP4 E026FB 0 +OP4 E026FC 0 +OP4 E026FD 0 +OP4 E026FE 0 +OP4 E026FF 0 +OP4 E02700 0 +OP4 E02701 0 +OP4 E02702 0 +OP4 E02703 0 +OP4 E02704 0 +OP4 E02705 0 +OP4 E02706 0 +OP4 E02707 0 +OP4 E02708 0 +OP4 E02709 0 +OP4 E0270A 0 +OP4 E0270B 0 +OP4 E0270C 0 +OP4 E0270D 0 +OP4 E0270E 0 +OP4 E0270F 0 +OP4 E02710 0 +OP4 E02711 0 +OP4 E02712 0 +OP4 E02713 0 +OP4 E02714 0 +OP4 E02715 0 +OP4 E02716 0 +OP4 E02717 0 +OP4 E02718 0 +OP4 E02719 0 +OP4 E0271A 0 +OP4 E0271B 0 +OP4 E0271C 0 +OP4 E0271D 0 +OP4 E0271E 0 +OP4 E0271F 0 +OP4 E02720 0 +OP4 E02721 0 +OP4 E02722 0 +OP4 E02723 0 +OP4 E02724 0 +OP4 E02725 0 +OP4 E02726 0 +OP4 E02727 0 +OP4 E02728 0 +OP4 E02729 0 +OP4 E0272A 0 +OP4 E0272B 0 +OP4 E0272C 0 +OP4 E0272D 0 +OP4 E0272E 0 +OP4 E0272F 0 +OP4 E02730 0 +OP4 E02731 0 +OP4 E02732 0 +OP4 E02733 0 +OP4 E02734 0 +OP4 E02735 0 +OP4 E02736 0 +OP4 E02737 0 +OP4 E02738 0 +OP4 E02739 0 +OP4 E0273A 0 +OP4 E0273B 0 +OP4 E0273C 0 +OP4 E0273D 0 +OP4 E0273E 0 +OP4 E0273F 0 +OP4 E02740 0 +OP4 E02741 0 +OP4 E02742 0 +OP4 E02743 0 +OP4 E02744 0 +OP4 E02745 0 +OP4 E02746 0 +OP4 E02747 0 +OP4 E02748 0 +OP4 E02749 0 +OP4 E0274A 0 +OP4 E0274B 0 +OP4 E0274C 0 +OP4 E0274D 0 +OP4 E0274E 0 +OP4 E0274F 0 +OP4 E02750 0 +OP4 E02751 0 +OP4 E02752 0 +OP4 E02753 0 +OP4 E02754 0 +OP4 E02755 0 +OP4 E02756 0 +OP4 E02757 0 +OP4 E02758 0 +OP4 E02759 0 +OP4 E0275A 0 +OP4 E0275B 0 +OP4 E0275C 0 +OP4 E0275D 0 +OP4 E0275E 0 +OP4 E0275F 0 +OP4 E02760 0 +OP4 E02761 0 +OP4 E02762 0 +OP4 E02763 0 +OP4 E02764 0 +OP4 E02765 0 +OP4 E02766 0 +OP4 E02767 0 +OP4 E02768 0 +OP4 E02769 0 +OP4 E0276A 0 +OP4 E0276B 0 +OP4 E0276C 0 +OP4 E0276D 0 +OP4 E0276E 0 +OP4 E0276F 0 +OP4 E02770 0 +OP4 E02771 0 +OP4 E02772 0 +OP4 E02773 0 +OP4 E02774 0 +OP4 E02775 0 +OP4 E02776 0 +OP4 E02777 0 +OP4 E02778 0 +OP4 E02779 0 +OP4 E0277A 0 +OP4 E0277B 0 +OP4 E0277C 0 +OP4 E0277D 0 +OP4 E0277E 0 +OP4 E0277F 0 +OP4 E02780 0 +OP4 E02781 0 +OP4 E02782 0 +OP4 E02783 0 +OP4 E02784 0 +OP4 E02785 0 +OP4 E02786 0 +OP4 E02787 0 +OP4 E02788 0 +OP4 E02789 0 +OP4 E0278A 0 +OP4 E0278B 0 +OP4 E0278C 0 +OP4 E0278D 0 +OP4 E0278E 0 +OP4 E0278F 0 +OP4 E02790 0 +OP4 E02791 0 +OP4 E02792 0 +OP4 E02793 0 +OP4 E02794 0 +OP4 E02795 0 +OP4 E02796 0 +OP4 E02797 0 +OP4 E02798 0 +OP4 E02799 0 +OP4 E0279A 0 +OP4 E0279B 0 +OP4 E0279C 0 +OP4 E0279D 0 +OP4 E0279E 0 +OP4 E0279F 0 +OP4 E027A0 0 +OP4 E027A1 0 +OP4 E027A2 0 +OP4 E027A3 0 +OP4 E027A4 0 +OP4 E027A5 0 +OP4 E027A6 0 +OP4 E027A7 0 +OP4 E027A8 0 +OP4 E027A9 0 +OP4 E027AA 0 +OP4 E027AB 0 +OP4 E027AC 0 +OP4 E027AD 0 +OP4 E027AE 0 +OP4 E027AF 0 +OP4 E027B0 0 +OP4 E027B1 0 +OP4 E027B2 0 +OP4 E027B3 0 +OP4 E027B4 0 +OP4 E027B5 0 +OP4 E027B6 0 +OP4 E027B7 0 +OP4 E027B8 0 +OP4 E027B9 0 +OP4 E027BA 0 +OP4 E027BB 0 +OP4 E027BC 0 +OP4 E027BD 0 +OP4 E027BE 0 +OP4 E027BF 0 +OP4 E027C0 0 +OP4 E027C1 0 +OP4 E027C2 0 +OP4 E027C3 0 +OP4 E027C4 0 +OP4 E027C5 0 +OP4 E027C6 0 +OP4 E027C7 0 +OP4 E027C8 0 +OP4 E027C9 0 +OP4 E027CA 0 +OP4 E027CB 0 +OP4 E027CC 0 +OP4 E027CD 0 +OP4 E027CE 0 +OP4 E027CF 0 +OP4 E027D0 0 +OP4 E027D1 0 +OP4 E027D2 0 +OP4 E027D3 0 +OP4 E027D4 0 +OP4 E027D5 0 +OP4 E027D6 0 +OP4 E027D7 0 +OP4 E027D8 0 +OP4 E027D9 0 +OP4 E027DA 0 +OP4 E027DB 0 +OP4 E027DC 0 +OP4 E027DD 0 +OP4 E027DE 0 +OP4 E027DF 0 +OP4 E027E0 0 +OP4 E027E1 0 +OP4 E027E2 0 +OP4 E027E3 0 +OP4 E027E4 0 +OP4 E027E5 0 +OP4 E027E6 0 +OP4 E027E7 0 +OP4 E027E8 0 +OP4 E027E9 0 +OP4 E027EA 0 +OP4 E027EB 0 +OP4 E027EC 0 +OP4 E027ED 0 +OP4 E027EE 0 +OP4 E027EF 0 +OP4 E027F0 0 +OP4 E027F1 0 +OP4 E027F2 0 +OP4 E027F3 0 +OP4 E027F4 0 +OP4 E027F5 0 +OP4 E027F6 0 +OP4 E027F7 0 +OP4 E027F8 0 +OP4 E027F9 0 +OP4 E027FA 0 +OP4 E027FB 0 +OP4 E027FC 0 +OP4 E027FD 0 +OP4 E027FE 0 +OP4 E027FF 0 +OP4 E02800 0 +OP4 E02801 0 +OP4 E02802 0 +OP4 E02803 0 +OP4 E02804 0 +OP4 E02805 0 +OP4 E02806 0 +OP4 E02807 0 +OP4 E02808 0 +OP4 E02809 0 +OP4 E0280A 0 +OP4 E0280B 0 +OP4 E0280C 0 +OP4 E0280D 0 +OP4 E0280E 0 +OP4 E0280F 0 +OP4 E02810 0 +OP4 E02811 0 +OP4 E02812 0 +OP4 E02813 0 +OP4 E02814 0 +OP4 E02815 0 +OP4 E02816 0 +OP4 E02817 0 +OP4 E02818 0 +OP4 E02819 0 +OP4 E0281A 0 +OP4 E0281B 0 +OP4 E0281C 0 +OP4 E0281D 0 +OP4 E0281E 0 +OP4 E0281F 0 +OP4 E02820 0 +OP4 E02821 0 +OP4 E02822 0 +OP4 E02823 0 +OP4 E02824 0 +OP4 E02825 0 +OP4 E02826 0 +OP4 E02827 0 +OP4 E02828 0 +OP4 E02829 0 +OP4 E0282A 0 +OP4 E0282B 0 +OP4 E0282C 0 +OP4 E0282D 0 +OP4 E0282E 0 +OP4 E0282F 0 +OP4 E02830 0 +OP4 E02831 0 +OP4 E02832 0 +OP4 E02833 0 +OP4 E02834 0 +OP4 E02835 0 +OP4 E02836 0 +OP4 E02837 0 +OP4 E02838 0 +OP4 E02839 0 +OP4 E0283A 0 +OP4 E0283B 0 +OP4 E0283C 0 +OP4 E0283D 0 +OP4 E0283E 0 +OP4 E0283F 0 +OP4 E02840 0 +OP4 E02841 0 +OP4 E02842 0 +OP4 E02843 0 +OP4 E02844 0 +OP4 E02845 0 +OP4 E02846 0 +OP4 E02847 0 +OP4 E02848 0 +OP4 E02849 0 +OP4 E0284A 0 +OP4 E0284B 0 +OP4 E0284C 0 +OP4 E0284D 0 +OP4 E0284E 0 +OP4 E0284F 0 +OP4 E02850 0 +OP4 E02851 0 +OP4 E02852 0 +OP4 E02853 0 +OP4 E02854 0 +OP4 E02855 0 +OP4 E02856 0 +OP4 E02857 0 +OP4 E02858 0 +OP4 E02859 0 +OP4 E0285A 0 +OP4 E0285B 0 +OP4 E0285C 0 +OP4 E0285D 0 +OP4 E0285E 0 +OP4 E0285F 0 +OP4 E02860 0 +OP4 E02861 0 +OP4 E02862 0 +OP4 E02863 0 +OP4 E02864 0 +OP4 E02865 0 +OP4 E02866 0 +OP4 E02867 0 +OP4 E02868 0 +OP4 E02869 0 +OP4 E0286A 0 +OP4 E0286B 0 +OP4 E0286C 0 +OP4 E0286D 0 +OP4 E0286E 0 +OP4 E0286F 0 +OP4 E02870 0 +OP4 E02871 0 +OP4 E02872 0 +OP4 E02873 0 +OP4 E02874 0 +OP4 E02875 0 +OP4 E02876 0 +OP4 E02877 0 +OP4 E02878 0 +OP4 E02879 0 +OP4 E0287A 0 +OP4 E0287B 0 +OP4 E0287C 0 +OP4 E0287D 0 +OP4 E0287E 0 +OP4 E0287F 0 +OP4 E02880 0 +OP4 E02881 0 +OP4 E02882 0 +OP4 E02883 0 +OP4 E02884 0 +OP4 E02885 0 +OP4 E02886 0 +OP4 E02887 0 +OP4 E02888 0 +OP4 E02889 0 +OP4 E0288A 0 +OP4 E0288B 0 +OP4 E0288C 0 +OP4 E0288D 0 +OP4 E0288E 0 +OP4 E0288F 0 +OP4 E02890 0 +OP4 E02891 0 +OP4 E02892 0 +OP4 E02893 0 +OP4 E02894 0 +OP4 E02895 0 +OP4 E02896 0 +OP4 E02897 0 +OP4 E02898 0 +OP4 E02899 0 +OP4 E0289A 0 +OP4 E0289B 0 +OP4 E0289C 0 +OP4 E0289D 0 +OP4 E0289E 0 +OP4 E0289F 0 +OP4 E028A0 0 +OP4 E028A1 0 +OP4 E028A2 0 +OP4 E028A3 0 +OP4 E028A4 0 +OP4 E028A5 0 +OP4 E028A6 0 +OP4 E028A7 0 +OP4 E028A8 0 +OP4 E028A9 0 +OP4 E028AA 0 +OP4 E028AB 0 +OP4 E028AC 0 +OP4 E028AD 0 +OP4 E028AE 0 +OP4 E028AF 0 +OP4 E028B0 0 +OP4 E028B1 0 +OP4 E028B2 0 +OP4 E028B3 0 +OP4 E028B4 0 +OP4 E028B5 0 +OP4 E028B6 0 +OP4 E028B7 0 +OP4 E028B8 0 +OP4 E028B9 0 +OP4 E028BA 0 +OP4 E028BB 0 +OP4 E028BC 0 +OP4 E028BD 0 +OP4 E028BE 0 +OP4 E028BF 0 +OP4 E028C0 0 +OP4 E028C1 0 +OP4 E028C2 0 +OP4 E028C3 0 +OP4 E028C4 0 +OP4 E028C5 0 +OP4 E028C6 0 +OP4 E028C7 0 +OP4 E028C8 0 +OP4 E028C9 0 +OP4 E028CA 0 +OP4 E028CB 0 +OP4 E028CC 0 +OP4 E028CD 0 +OP4 E028CE 0 +OP4 E028CF 0 +OP4 E028D0 0 +OP4 E028D1 0 +OP4 E028D2 0 +OP4 E028D3 0 +OP4 E028D4 0 +OP4 E028D5 0 +OP4 E028D6 0 +OP4 E028D7 0 +OP4 E028D8 0 +OP4 E028D9 0 +OP4 E028DA 0 +OP4 E028DB 0 +OP4 E028DC 0 +OP4 E028DD 0 +OP4 E028DE 0 +OP4 E028DF 0 +OP4 E028E0 0 +OP4 E028E1 0 +OP4 E028E2 0 +OP4 E028E3 0 +OP4 E028E4 0 +OP4 E028E5 0 +OP4 E028E6 0 +OP4 E028E7 0 +OP4 E028E8 0 +OP4 E028E9 0 +OP4 E028EA 0 +OP4 E028EB 0 +OP4 E028EC 0 +OP4 E028ED 0 +OP4 E028EE 0 +OP4 E028EF 0 +OP4 E028F0 0 +OP4 E028F1 0 +OP4 E028F2 0 +OP4 E028F3 0 +OP4 E028F4 0 +OP4 E028F5 0 +OP4 E028F6 0 +OP4 E028F7 0 +OP4 E028F8 0 +OP4 E028F9 0 +OP4 E028FA 0 +OP4 E028FB 0 +OP4 E028FC 0 +OP4 E028FD 0 +OP4 E028FE 0 +OP4 E028FF 0 +OP4 E02900 0 +OP4 E02901 0 +OP4 E02902 0 +OP4 E02903 0 +OP4 E02904 0 +OP4 E02905 0 +OP4 E02906 0 +OP4 E02907 0 +OP4 E02908 0 +OP4 E02909 0 +OP4 E0290A 0 +OP4 E0290B 0 +OP4 E0290C 0 +OP4 E0290D 0 +OP4 E0290E 0 +OP4 E0290F 0 +OP4 E02910 0 +OP4 E02911 0 +OP4 E02912 0 +OP4 E02913 0 +OP4 E02914 0 +OP4 E02915 0 +OP4 E02916 0 +OP4 E02917 0 +OP4 E02918 0 +OP4 E02919 0 +OP4 E0291A 0 +OP4 E0291B 0 +OP4 E0291C 0 +OP4 E0291D 0 +OP4 E0291E 0 +OP4 E0291F 0 +OP4 E02920 0 +OP4 E02921 0 +OP4 E02922 0 +OP4 E02923 0 +OP4 E02924 0 +OP4 E02925 0 +OP4 E02926 0 +OP4 E02927 0 +OP4 E02928 0 +OP4 E02929 0 +OP4 E0292A 0 +OP4 E0292B 0 +OP4 E0292C 0 +OP4 E0292D 0 +OP4 E0292E 0 +OP4 E0292F 0 +OP4 E02930 0 +OP4 E02931 0 +OP4 E02932 0 +OP4 E02933 0 +OP4 E02934 0 +OP4 E02935 0 +OP4 E02936 0 +OP4 E02937 0 +OP4 E02938 0 +OP4 E02939 0 +OP4 E0293A 0 +OP4 E0293B 0 +OP4 E0293C 0 +OP4 E0293D 0 +OP4 E0293E 0 +OP4 E0293F 0 +OP4 E02940 0 +OP4 E02941 0 +OP4 E02942 0 +OP4 E02943 0 +OP4 E02944 0 +OP4 E02945 0 +OP4 E02946 0 +OP4 E02947 0 +OP4 E02948 0 +OP4 E02949 0 +OP4 E0294A 0 +OP4 E0294B 0 +OP4 E0294C 0 +OP4 E0294D 0 +OP4 E0294E 0 +OP4 E0294F 0 +OP4 E02950 0 +OP4 E02951 0 +OP4 E02952 0 +OP4 E02953 0 +OP4 E02954 0 +OP4 E02955 0 +OP4 E02956 0 +OP4 E02957 0 +OP4 E02958 0 +OP4 E02959 0 +OP4 E0295A 0 +OP4 E0295B 0 +OP4 E0295C 0 +OP4 E0295D 0 +OP4 E0295E 0 +OP4 E0295F 0 +OP4 E02960 0 +OP4 E02961 0 +OP4 E02962 0 +OP4 E02963 0 +OP4 E02964 0 +OP4 E02965 0 +OP4 E02966 0 +OP4 E02967 0 +OP4 E02968 0 +OP4 E02969 0 +OP4 E0296A 0 +OP4 E0296B 0 +OP4 E0296C 0 +OP4 E0296D 0 +OP4 E0296E 0 +OP4 E0296F 0 +OP4 E02970 0 +OP4 E02971 0 +OP4 E02972 0 +OP4 E02973 0 +OP4 E02974 0 +OP4 E02975 0 +OP4 E02976 0 +OP4 E02977 0 +OP4 E02978 0 +OP4 E02979 0 +OP4 E0297A 0 +OP4 E0297B 0 +OP4 E0297C 0 +OP4 E0297D 0 +OP4 E0297E 0 +OP4 E0297F 0 +OP4 E02980 0 +OP4 E02981 0 +OP4 E02982 0 +OP4 E02983 0 +OP4 E02984 0 +OP4 E02985 0 +OP4 E02986 0 +OP4 E02987 0 +OP4 E02988 0 +OP4 E02989 0 +OP4 E0298A 0 +OP4 E0298B 0 +OP4 E0298C 0 +OP4 E0298D 0 +OP4 E0298E 0 +OP4 E0298F 0 +OP4 E02990 0 +OP4 E02991 0 +OP4 E02992 0 +OP4 E02993 0 +OP4 E02994 0 +OP4 E02995 0 +OP4 E02996 0 +OP4 E02997 0 +OP4 E02998 0 +OP4 E02999 0 +OP4 E0299A 0 +OP4 E0299B 0 +OP4 E0299C 0 +OP4 E0299D 0 +OP4 E0299E 0 +OP4 E0299F 0 +OP4 E029A0 0 +OP4 E029A1 0 +OP4 E029A2 0 +OP4 E029A3 0 +OP4 E029A4 0 +OP4 E029A5 0 +OP4 E029A6 0 +OP4 E029A7 0 +OP4 E029A8 0 +OP4 E029A9 0 +OP4 E029AA 0 +OP4 E029AB 0 +OP4 E029AC 0 +OP4 E029AD 0 +OP4 E029AE 0 +OP4 E029AF 0 +OP4 E029B0 0 +OP4 E029B1 0 +OP4 E029B2 0 +OP4 E029B3 0 +OP4 E029B4 0 +OP4 E029B5 0 +OP4 E029B6 0 +OP4 E029B7 0 +OP4 E029B8 0 +OP4 E029B9 0 +OP4 E029BA 0 +OP4 E029BB 0 +OP4 E029BC 0 +OP4 E029BD 0 +OP4 E029BE 0 +OP4 E029BF 0 +OP4 E029C0 0 +OP4 E029C1 0 +OP4 E029C2 0 +OP4 E029C3 0 +OP4 E029C4 0 +OP4 E029C5 0 +OP4 E029C6 0 +OP4 E029C7 0 +OP4 E029C8 0 +OP4 E029C9 0 +OP4 E029CA 0 +OP4 E029CB 0 +OP4 E029CC 0 +OP4 E029CD 0 +OP4 E029CE 0 +OP4 E029CF 0 +OP4 E029D0 0 +OP4 E029D1 0 +OP4 E029D2 0 +OP4 E029D3 0 +OP4 E029D4 0 +OP4 E029D5 0 +OP4 E029D6 0 +OP4 E029D7 0 +OP4 E029D8 0 +OP4 E029D9 0 +OP4 E029DA 0 +OP4 E029DB 0 +OP4 E029DC 0 +OP4 E029DD 0 +OP4 E029DE 0 +OP4 E029DF 0 +OP4 E029E0 0 +OP4 E029E1 0 +OP4 E029E2 0 +OP4 E029E3 0 +OP4 E029E4 0 +OP4 E029E5 0 +OP4 E029E6 0 +OP4 E029E7 0 +OP4 E029E8 0 +OP4 E029E9 0 +OP4 E029EA 0 +OP4 E029EB 0 +OP4 E029EC 0 +OP4 E029ED 0 +OP4 E029EE 0 +OP4 E029EF 0 +OP4 E029F0 0 +OP4 E029F1 0 +OP4 E029F2 0 +OP4 E029F3 0 +OP4 E029F4 0 +OP4 E029F5 0 +OP4 E029F6 0 +OP4 E029F7 0 +OP4 E029F8 0 +OP4 E029F9 0 +OP4 E029FA 0 +OP4 E029FB 0 +OP4 E029FC 0 +OP4 E029FD 0 +OP4 E029FE 0 +OP4 E029FF 0 +OP4 E02A00 0 +OP4 E02A01 0 +OP4 E02A02 0 +OP4 E02A03 0 +OP4 E02A04 0 +OP4 E02A05 0 +OP4 E02A06 0 +OP4 E02A07 0 +OP4 E02A08 0 +OP4 E02A09 0 +OP4 E02A0A 0 +OP4 E02A0B 0 +OP4 E02A0C 0 +OP4 E02A0D 0 +OP4 E02A0E 0 +OP4 E02A0F 0 +OP4 E02A10 0 +OP4 E02A11 0 +OP4 E02A12 0 +OP4 E02A13 0 +OP4 E02A14 0 +OP4 E02A15 0 +OP4 E02A16 0 +OP4 E02A17 0 +OP4 E02A18 0 +OP4 E02A19 0 +OP4 E02A1A 0 +OP4 E02A1B 0 +OP4 E02A1C 0 +OP4 E02A1D 0 +OP4 E02A1E 0 +OP4 E02A1F 0 +OP4 E02A20 0 +OP4 E02A21 0 +OP4 E02A22 0 +OP4 E02A23 0 +OP4 E02A24 0 +OP4 E02A25 0 +OP4 E02A26 0 +OP4 E02A27 0 +OP4 E02A28 0 +OP4 E02A29 0 +OP4 E02A2A 0 +OP4 E02A2B 0 +OP4 E02A2C 0 +OP4 E02A2D 0 +OP4 E02A2E 0 +OP4 E02A2F 0 +OP4 E02A30 0 +OP4 E02A31 0 +OP4 E02A32 0 +OP4 E02A33 0 +OP4 E02A34 0 +OP4 E02A35 0 +OP4 E02A36 0 +OP4 E02A37 0 +OP4 E02A38 0 +OP4 E02A39 0 +OP4 E02A3A 0 +OP4 E02A3B 0 +OP4 E02A3C 0 +OP4 E02A3D 0 +OP4 E02A3E 0 +OP4 E02A3F 0 +OP4 E02A40 0 +OP4 E02A41 0 +OP4 E02A42 0 +OP4 E02A43 0 +OP4 E02A44 0 +OP4 E02A45 0 +OP4 E02A46 0 +OP4 E02A47 0 +OP4 E02A48 0 +OP4 E02A49 0 +OP4 E02A4A 0 +OP4 E02A4B 0 +OP4 E02A4C 0 +OP4 E02A4D 0 +OP4 E02A4E 0 +OP4 E02A4F 0 +OP4 E02A50 0 +OP4 E02A51 0 +OP4 E02A52 0 +OP4 E02A53 0 +OP4 E02A54 0 +OP4 E02A55 0 +OP4 E02A56 0 +OP4 E02A57 0 +OP4 E02A58 0 +OP4 E02A59 0 +OP4 E02A5A 0 +OP4 E02A5B 0 +OP4 E02A5C 0 +OP4 E02A5D 0 +OP4 E02A5E 0 +OP4 E02A5F 0 +OP4 E02A60 0 +OP4 E02A61 0 +OP4 E02A62 0 +OP4 E02A63 0 +OP4 E02A64 0 +OP4 E02A65 0 +OP4 E02A66 0 +OP4 E02A67 0 +OP4 E02A68 0 +OP4 E02A69 0 +OP4 E02A6A 0 +OP4 E02A6B 0 +OP4 E02A6C 0 +OP4 E02A6D 0 +OP4 E02A6E 0 +OP4 E02A6F 0 +OP4 E02A70 0 +OP4 E02A71 0 +OP4 E02A72 0 +OP4 E02A73 0 +OP4 E02A74 0 +OP4 E02A75 0 +OP4 E02A76 0 +OP4 E02A77 0 +OP4 E02A78 0 +OP4 E02A79 0 +OP4 E02A7A 0 +OP4 E02A7B 0 +OP4 E02A7C 0 +OP4 E02A7D 0 +OP4 E02A7E 0 +OP4 E02A7F 0 +OP4 E02A80 0 +OP4 E02A81 0 +OP4 E02A82 0 +OP4 E02A83 0 +OP4 E02A84 0 +OP4 E02A85 0 +OP4 E02A86 0 +OP4 E02A87 0 +OP4 E02A88 0 +OP4 E02A89 0 +OP4 E02A8A 0 +OP4 E02A8B 0 +OP4 E02A8C 0 +OP4 E02A8D 0 +OP4 E02A8E 0 +OP4 E02A8F 0 +OP4 E02A90 0 +OP4 E02A91 0 +OP4 E02A92 0 +OP4 E02A93 0 +OP4 E02A94 0 +OP4 E02A95 0 +OP4 E02A96 0 +OP4 E02A97 0 +OP4 E02A98 0 +OP4 E02A99 0 +OP4 E02A9A 0 +OP4 E02A9B 0 +OP4 E02A9C 0 +OP4 E02A9D 0 +OP4 E02A9E 0 +OP4 E02A9F 0 +OP4 E02AA0 0 +OP4 E02AA1 0 +OP4 E02AA2 0 +OP4 E02AA3 0 +OP4 E02AA4 0 +OP4 E02AA5 0 +OP4 E02AA6 0 +OP4 E02AA7 0 +OP4 E02AA8 0 +OP4 E02AA9 0 +OP4 E02AAA 0 +OP4 E02AAB 0 +OP4 E02AAC 0 +OP4 E02AAD 0 +OP4 E02AAE 0 +OP4 E02AAF 0 +OP4 E02AB0 0 +OP4 E02AB1 0 +OP4 E02AB2 0 +OP4 E02AB3 0 +OP4 E02AB4 0 +OP4 E02AB5 0 +OP4 E02AB6 0 +OP4 E02AB7 0 +OP4 E02AB8 0 +OP4 E02AB9 0 +OP4 E02ABA 0 +OP4 E02ABB 0 +OP4 E02ABC 0 +OP4 E02ABD 0 +OP4 E02ABE 0 +OP4 E02ABF 0 +OP4 E02AC0 0 +OP4 E02AC1 0 +OP4 E02AC2 0 +OP4 E02AC3 0 +OP4 E02AC4 0 +OP4 E02AC5 0 +OP4 E02AC6 0 +OP4 E02AC7 0 +OP4 E02AC8 0 +OP4 E02AC9 0 +OP4 E02ACA 0 +OP4 E02ACB 0 +OP4 E02ACC 0 +OP4 E02ACD 0 +OP4 E02ACE 0 +OP4 E02ACF 0 +OP4 E02AD0 0 +OP4 E02AD1 0 +OP4 E02AD2 0 +OP4 E02AD3 0 +OP4 E02AD4 0 +OP4 E02AD5 0 +OP4 E02AD6 0 +OP4 E02AD7 0 +OP4 E02AD8 0 +OP4 E02AD9 0 +OP4 E02ADA 0 +OP4 E02ADB 0 +OP4 E02ADC 0 +OP4 E02ADD 0 +OP4 E02ADE 0 +OP4 E02ADF 0 +OP4 E02AE0 0 +OP4 E02AE1 0 +OP4 E02AE2 0 +OP4 E02AE3 0 +OP4 E02AE4 0 +OP4 E02AE5 0 +OP4 E02AE6 0 +OP4 E02AE7 0 +OP4 E02AE8 0 +OP4 E02AE9 0 +OP4 E02AEA 0 +OP4 E02AEB 0 +OP4 E02AEC 0 +OP4 E02AED 0 +OP4 E02AEE 0 +OP4 E02AEF 0 +OP4 E02AF0 0 +OP4 E02AF1 0 +OP4 E02AF2 0 +OP4 E02AF3 0 +OP4 E02AF4 0 +OP4 E02AF5 0 +OP4 E02AF6 0 +OP4 E02AF7 0 +OP4 E02AF8 0 +OP4 E02AF9 0 +OP4 E02AFA 0 +OP4 E02AFB 0 +OP4 E02AFC 0 +OP4 E02AFD 0 +OP4 E02AFE 0 +OP4 E02AFF 0 +OP4 E02B00 0 +OP4 E02B01 0 +OP4 E02B02 0 +OP4 E02B03 0 +OP4 E02B04 0 +OP4 E02B05 0 +OP4 E02B06 0 +OP4 E02B07 0 +OP4 E02B08 0 +OP4 E02B09 0 +OP4 E02B0A 0 +OP4 E02B0B 0 +OP4 E02B0C 0 +OP4 E02B0D 0 +OP4 E02B0E 0 +OP4 E02B0F 0 +OP4 E02B10 0 +OP4 E02B11 0 +OP4 E02B12 0 +OP4 E02B13 0 +OP4 E02B14 0 +OP4 E02B15 0 +OP4 E02B16 0 +OP4 E02B17 0 +OP4 E02B18 0 +OP4 E02B19 0 +OP4 E02B1A 0 +OP4 E02B1B 0 +OP4 E02B1C 0 +OP4 E02B1D 0 +OP4 E02B1E 0 +OP4 E02B1F 0 +OP4 E02B20 0 +OP4 E02B21 0 +OP4 E02B22 0 +OP4 E02B23 0 +OP4 E02B24 0 +OP4 E02B25 0 +OP4 E02B26 0 +OP4 E02B27 0 +OP4 E02B28 0 +OP4 E02B29 0 +OP4 E02B2A 0 +OP4 E02B2B 0 +OP4 E02B2C 0 +OP4 E02B2D 0 +OP4 E02B2E 0 +OP4 E02B2F 0 +OP4 E02B30 0 +OP4 E02B31 0 +OP4 E02B32 0 +OP4 E02B33 0 +OP4 E02B34 0 +OP4 E02B35 0 +OP4 E02B36 0 +OP4 E02B37 0 +OP4 E02B38 0 +OP4 E02B39 0 +OP4 E02B3A 0 +OP4 E02B3B 0 +OP4 E02B3C 0 +OP4 E02B3D 0 +OP4 E02B3E 0 +OP4 E02B3F 0 +OP4 E02B40 0 +OP4 E02B41 0 +OP4 E02B42 0 +OP4 E02B43 0 +OP4 E02B44 0 +OP4 E02B45 0 +OP4 E02B46 0 +OP4 E02B47 0 +OP4 E02B48 0 +OP4 E02B49 0 +OP4 E02B4A 0 +OP4 E02B4B 0 +OP4 E02B4C 0 +OP4 E02B4D 0 +OP4 E02B4E 0 +OP4 E02B4F 0 +OP4 E02B50 0 +OP4 E02B51 0 +OP4 E02B52 0 +OP4 E02B53 0 +OP4 E02B54 0 +OP4 E02B55 0 +OP4 E02B56 0 +OP4 E02B57 0 +OP4 E02B58 0 +OP4 E02B59 0 +OP4 E02B5A 0 +OP4 E02B5B 0 +OP4 E02B5C 0 +OP4 E02B5D 0 +OP4 E02B5E 0 +OP4 E02B5F 0 +OP4 E02B60 0 +OP4 E02B61 0 +OP4 E02B62 0 +OP4 E02B63 0 +OP4 E02B64 0 +OP4 E02B65 0 +OP4 E02B66 0 +OP4 E02B67 0 +OP4 E02B68 0 +OP4 E02B69 0 +OP4 E02B6A 0 +OP4 E02B6B 0 +OP4 E02B6C 0 +OP4 E02B6D 0 +OP4 E02B6E 0 +OP4 E02B6F 0 +OP4 E02B70 0 +OP4 E02B71 0 +OP4 E02B72 0 +OP4 E02B73 0 +OP4 E02B74 0 +OP4 E02B75 0 +OP4 E02B76 0 +OP4 E02B77 0 +OP4 E02B78 0 +OP4 E02B79 0 +OP4 E02B7A 0 +OP4 E02B7B 0 +OP4 E02B7C 0 +OP4 E02B7D 0 +OP4 E02B7E 0 +OP4 E02B7F 0 +OP4 E02B80 0 +OP4 E02B81 0 +OP4 E02B82 0 +OP4 E02B83 0 +OP4 E02B84 0 +OP4 E02B85 0 +OP4 E02B86 0 +OP4 E02B87 0 +OP4 E02B88 0 +OP4 E02B89 0 +OP4 E02B8A 0 +OP4 E02B8B 0 +OP4 E02B8C 0 +OP4 E02B8D 0 +OP4 E02B8E 0 +OP4 E02B8F 0 +OP4 E02B90 0 +OP4 E02B91 0 +OP4 E02B92 0 +OP4 E02B93 0 +OP4 E02B94 0 +OP4 E02B95 0 +OP4 E02B96 0 +OP4 E02B97 0 +OP4 E02B98 0 +OP4 E02B99 0 +OP4 E02B9A 0 +OP4 E02B9B 0 +OP4 E02B9C 0 +OP4 E02B9D 0 +OP4 E02B9E 0 +OP4 E02B9F 0 +OP4 E02BA0 0 +OP4 E02BA1 0 +OP4 E02BA2 0 +OP4 E02BA3 0 +OP4 E02BA4 0 +OP4 E02BA5 0 +OP4 E02BA6 0 +OP4 E02BA7 0 +OP4 E02BA8 0 +OP4 E02BA9 0 +OP4 E02BAA 0 +OP4 E02BAB 0 +OP4 E02BAC 0 +OP4 E02BAD 0 +OP4 E02BAE 0 +OP4 E02BAF 0 +OP4 E02BB0 0 +OP4 E02BB1 0 +OP4 E02BB2 0 +OP4 E02BB3 0 +OP4 E02BB4 0 +OP4 E02BB5 0 +OP4 E02BB6 0 +OP4 E02BB7 0 +OP4 E02BB8 0 +OP4 E02BB9 0 +OP4 E02BBA 0 +OP4 E02BBB 0 +OP4 E02BBC 0 +OP4 E02BBD 0 +OP4 E02BBE 0 +OP4 E02BBF 0 +OP4 E02BC0 0 +OP4 E02BC1 0 +OP4 E02BC2 0 +OP4 E02BC3 0 +OP4 E02BC4 0 +OP4 E02BC5 0 +OP4 E02BC6 0 +OP4 E02BC7 0 +OP4 E02BC8 0 +OP4 E02BC9 0 +OP4 E02BCA 0 +OP4 E02BCB 0 +OP4 E02BCC 0 +OP4 E02BCD 0 +OP4 E02BCE 0 +OP4 E02BCF 0 +OP4 E02BD0 0 +OP4 E02BD1 0 +OP4 E02BD2 0 +OP4 E02BD3 0 +OP4 E02BD4 0 +OP4 E02BD5 0 +OP4 E02BD6 0 +OP4 E02BD7 0 +OP4 E02BD8 0 +OP4 E02BD9 0 +OP4 E02BDA 0 +OP4 E02BDB 0 +OP4 E02BDC 0 +OP4 E02BDD 0 +OP4 E02BDE 0 +OP4 E02BDF 0 +OP4 E02BE0 0 +OP4 E02BE1 0 +OP4 E02BE2 0 +OP4 E02BE3 0 +OP4 E02BE4 0 +OP4 E02BE5 0 +OP4 E02BE6 0 +OP4 E02BE7 0 +OP4 E02BE8 0 +OP4 E02BE9 0 +OP4 E02BEA 0 +OP4 E02BEB 0 +OP4 E02BEC 0 +OP4 E02BED 0 +OP4 E02BEE 0 +OP4 E02BEF 0 +OP4 E02BF0 0 +OP4 E02BF1 0 +OP4 E02BF2 0 +OP4 E02BF3 0 +OP4 E02BF4 0 +OP4 E02BF5 0 +OP4 E02BF6 0 +OP4 E02BF7 0 +OP4 E02BF8 0 +OP4 E02BF9 0 +OP4 E02BFA 0 +OP4 E02BFB 0 +OP4 E02BFC 0 +OP4 E02BFD 0 +OP4 E02BFE 0 +OP4 E02BFF 0 +OP4 E02C00 0 +OP4 E02C01 0 +OP4 E02C02 0 +OP4 E02C03 0 +OP4 E02C04 0 +OP4 E02C05 0 +OP4 E02C06 0 +OP4 E02C07 0 +OP4 E02C08 0 +OP4 E02C09 0 +OP4 E02C0A 0 +OP4 E02C0B 0 +OP4 E02C0C 0 +OP4 E02C0D 0 +OP4 E02C0E 0 +OP4 E02C0F 0 +OP4 E02C10 0 +OP4 E02C11 0 +OP4 E02C12 0 +OP4 E02C13 0 +OP4 E02C14 0 +OP4 E02C15 0 +OP4 E02C16 0 +OP4 E02C17 0 +OP4 E02C18 0 +OP4 E02C19 0 +OP4 E02C1A 0 +OP4 E02C1B 0 +OP4 E02C1C 0 +OP4 E02C1D 0 +OP4 E02C1E 0 +OP4 E02C1F 0 +OP4 E02C20 0 +OP4 E02C21 0 +OP4 E02C22 0 +OP4 E02C23 0 +OP4 E02C24 0 +OP4 E02C25 0 +OP4 E02C26 0 +OP4 E02C27 0 +OP4 E02C28 0 +OP4 E02C29 0 +OP4 E02C2A 0 +OP4 E02C2B 0 +OP4 E02C2C 0 +OP4 E02C2D 0 +OP4 E02C2E 0 +OP4 E02C2F 0 +OP4 E02C30 0 +OP4 E02C31 0 +OP4 E02C32 0 +OP4 E02C33 0 +OP4 E02C34 0 +OP4 E02C35 0 +OP4 E02C36 0 +OP4 E02C37 0 +OP4 E02C38 0 +OP4 E02C39 0 +OP4 E02C3A 0 +OP4 E02C3B 0 +OP4 E02C3C 0 +OP4 E02C3D 0 +OP4 E02C3E 0 +OP4 E02C3F 0 +OP4 E02C40 0 +OP4 E02C41 0 +OP4 E02C42 0 +OP4 E02C43 0 +OP4 E02C44 0 +OP4 E02C45 0 +OP4 E02C46 0 +OP4 E02C47 0 +OP4 E02C48 0 +OP4 E02C49 0 +OP4 E02C4A 0 +OP4 E02C4B 0 +OP4 E02C4C 0 +OP4 E02C4D 0 +OP4 E02C4E 0 +OP4 E02C4F 0 +OP4 E02C50 0 +OP4 E02C51 0 +OP4 E02C52 0 +OP4 E02C53 0 +OP4 E02C54 0 +OP4 E02C55 0 +OP4 E02C56 0 +OP4 E02C57 0 +OP4 E02C58 0 +OP4 E02C59 0 +OP4 E02C5A 0 +OP4 E02C5B 0 +OP4 E02C5C 0 +OP4 E02C5D 0 +OP4 E02C5E 0 +OP4 E02C5F 0 +OP4 E02C60 0 +OP4 E02C61 0 +OP4 E02C62 0 +OP4 E02C63 0 +OP4 E02C64 0 +OP4 E02C65 0 +OP4 E02C66 0 +OP4 E02C67 0 +OP4 E02C68 0 +OP4 E02C69 0 +OP4 E02C6A 0 +OP4 E02C6B 0 +OP4 E02C6C 0 +OP4 E02C6D 0 +OP4 E02C6E 0 +OP4 E02C6F 0 +OP4 E02C70 0 +OP4 E02C71 0 +OP4 E02C72 0 +OP4 E02C73 0 +OP4 E02C74 0 +OP4 E02C75 0 +OP4 E02C76 0 +OP4 E02C77 0 +OP4 E02C78 0 +OP4 E02C79 0 +OP4 E02C7A 0 +OP4 E02C7B 0 +OP4 E02C7C 0 +OP4 E02C7D 0 +OP4 E02C7E 0 +OP4 E02C7F 0 +OP4 E02C80 0 +OP4 E02C81 0 +OP4 E02C82 0 +OP4 E02C83 0 +OP4 E02C84 0 +OP4 E02C85 0 +OP4 E02C86 0 +OP4 E02C87 0 +OP4 E02C88 0 +OP4 E02C89 0 +OP4 E02C8A 0 +OP4 E02C8B 0 +OP4 E02C8C 0 +OP4 E02C8D 0 +OP4 E02C8E 0 +OP4 E02C8F 0 +OP4 E02C90 0 +OP4 E02C91 0 +OP4 E02C92 0 +OP4 E02C93 0 +OP4 E02C94 0 +OP4 E02C95 0 +OP4 E02C96 0 +OP4 E02C97 0 +OP4 E02C98 0 +OP4 E02C99 0 +OP4 E02C9A 0 +OP4 E02C9B 0 +OP4 E02C9C 0 +OP4 E02C9D 0 +OP4 E02C9E 0 +OP4 E02C9F 0 +OP4 E02CA0 0 +OP4 E02CA1 0 +OP4 E02CA2 0 +OP4 E02CA3 0 +OP4 E02CA4 0 +OP4 E02CA5 0 +OP4 E02CA6 0 +OP4 E02CA7 0 +OP4 E02CA8 0 +OP4 E02CA9 0 +OP4 E02CAA 0 +OP4 E02CAB 0 +OP4 E02CAC 0 +OP4 E02CAD 0 +OP4 E02CAE 0 +OP4 E02CAF 0 +OP4 E02CB0 0 +OP4 E02CB1 0 +OP4 E02CB2 0 +OP4 E02CB3 0 +OP4 E02CB4 0 +OP4 E02CB5 0 +OP4 E02CB6 0 +OP4 E02CB7 0 +OP4 E02CB8 0 +OP4 E02CB9 0 +OP4 E02CBA 0 +OP4 E02CBB 0 +OP4 E02CBC 0 +OP4 E02CBD 0 +OP4 E02CBE 0 +OP4 E02CBF 0 +OP4 E02CC0 0 +OP4 E02CC1 0 +OP4 E02CC2 0 +OP4 E02CC3 0 +OP4 E02CC4 0 +OP4 E02CC5 0 +OP4 E02CC6 0 +OP4 E02CC7 0 +OP4 E02CC8 0 +OP4 E02CC9 0 +OP4 E02CCA 0 +OP4 E02CCB 0 +OP4 E02CCC 0 +OP4 E02CCD 0 +OP4 E02CCE 0 +OP4 E02CCF 0 +OP4 E02CD0 0 +OP4 E02CD1 0 +OP4 E02CD2 0 +OP4 E02CD3 0 +OP4 E02CD4 0 +OP4 E02CD5 0 +OP4 E02CD6 0 +OP4 E02CD7 0 +OP4 E02CD8 0 +OP4 E02CD9 0 +OP4 E02CDA 0 +OP4 E02CDB 0 +OP4 E02CDC 0 +OP4 E02CDD 0 +OP4 E02CDE 0 +OP4 E02CDF 0 +OP4 E02CE0 0 +OP4 E02CE1 0 +OP4 E02CE2 0 +OP4 E02CE3 0 +OP4 E02CE4 0 +OP4 E02CE5 0 +OP4 E02CE6 0 +OP4 E02CE7 0 +OP4 E02CE8 0 +OP4 E02CE9 0 +OP4 E02CEA 0 +OP4 E02CEB 0 +OP4 E02CEC 0 +OP4 E02CED 0 +OP4 E02CEE 0 +OP4 E02CEF 0 +OP4 E02CF0 0 +OP4 E02CF1 0 +OP4 E02CF2 0 +OP4 E02CF3 0 +OP4 E02CF4 0 +OP4 E02CF5 0 +OP4 E02CF6 0 +OP4 E02CF7 0 +OP4 E02CF8 0 +OP4 E02CF9 0 +OP4 E02CFA 0 +OP4 E02CFB 0 +OP4 E02CFC 0 +OP4 E02CFD 0 +OP4 E02CFE 0 +OP4 E02CFF 0 +OP4 E02D00 0 +OP4 E02D01 0 +OP4 E02D02 0 +OP4 E02D03 0 +OP4 E02D04 0 +OP4 E02D05 0 +OP4 E02D06 0 +OP4 E02D07 0 +OP4 E02D08 0 +OP4 E02D09 0 +OP4 E02D0A 0 +OP4 E02D0B 0 +OP4 E02D0C 0 +OP4 E02D0D 0 +OP4 E02D0E 0 +OP4 E02D0F 0 +OP4 E02D10 0 +OP4 E02D11 0 +OP4 E02D12 0 +OP4 E02D13 0 +OP4 E02D14 0 +OP4 E02D15 0 +OP4 E02D16 0 +OP4 E02D17 0 +OP4 E02D18 0 +OP4 E02D19 0 +OP4 E02D1A 0 +OP4 E02D1B 0 +OP4 E02D1C 0 +OP4 E02D1D 0 +OP4 E02D1E 0 +OP4 E02D1F 0 +OP4 E02D20 0 +OP4 E02D21 0 +OP4 E02D22 0 +OP4 E02D23 0 +OP4 E02D24 0 +OP4 E02D25 0 +OP4 E02D26 0 +OP4 E02D27 0 +OP4 E02D28 0 +OP4 E02D29 0 +OP4 E02D2A 0 +OP4 E02D2B 0 +OP4 E02D2C 0 +OP4 E02D2D 0 +OP4 E02D2E 0 +OP4 E02D2F 0 +OP4 E02D30 0 +OP4 E02D31 0 +OP4 E02D32 0 +OP4 E02D33 0 +OP4 E02D34 0 +OP4 E02D35 0 +OP4 E02D36 0 +OP4 E02D37 0 +OP4 E02D38 0 +OP4 E02D39 0 +OP4 E02D3A 0 +OP4 E02D3B 0 +OP4 E02D3C 0 +OP4 E02D3D 0 +OP4 E02D3E 0 +OP4 E02D3F 0 +OP4 E02D40 0 +OP4 E02D41 0 +OP4 E02D42 0 +OP4 E02D43 0 +OP4 E02D44 0 +OP4 E02D45 0 +OP4 E02D46 0 +OP4 E02D47 0 +OP4 E02D48 0 +OP4 E02D49 0 +OP4 E02D4A 0 +OP4 E02D4B 0 +OP4 E02D4C 0 +OP4 E02D4D 0 +OP4 E02D4E 0 +OP4 E02D4F 0 +OP4 E02D50 0 +OP4 E02D51 0 +OP4 E02D52 0 +OP4 E02D53 0 +OP4 E02D54 0 +OP4 E02D55 0 +OP4 E02D56 0 +OP4 E02D57 0 +OP4 E02D58 0 +OP4 E02D59 0 +OP4 E02D5A 0 +OP4 E02D5B 0 +OP4 E02D5C 0 +OP4 E02D5D 0 +OP4 E02D5E 0 +OP4 E02D5F 0 +OP4 E02D60 0 +OP4 E02D61 0 +OP4 E02D62 0 +OP4 E02D63 0 +OP4 E02D64 0 +OP4 E02D65 0 +OP4 E02D66 0 +OP4 E02D67 0 +OP4 E02D68 0 +OP4 E02D69 0 +OP4 E02D6A 0 +OP4 E02D6B 0 +OP4 E02D6C 0 +OP4 E02D6D 0 +OP4 E02D6E 0 +OP4 E02D6F 0 +OP4 E02D70 0 +OP4 E02D71 0 +OP4 E02D72 0 +OP4 E02D73 0 +OP4 E02D74 0 +OP4 E02D75 0 +OP4 E02D76 0 +OP4 E02D77 0 +OP4 E02D78 0 +OP4 E02D79 0 +OP4 E02D7A 0 +OP4 E02D7B 0 +OP4 E02D7C 0 +OP4 E02D7D 0 +OP4 E02D7E 0 +OP4 E02D7F 0 +OP4 E02D80 0 +OP4 E02D81 0 +OP4 E02D82 0 +OP4 E02D83 0 +OP4 E02D84 0 +OP4 E02D85 0 +OP4 E02D86 0 +OP4 E02D87 0 +OP4 E02D88 0 +OP4 E02D89 0 +OP4 E02D8A 0 +OP4 E02D8B 0 +OP4 E02D8C 0 +OP4 E02D8D 0 +OP4 E02D8E 0 +OP4 E02D8F 0 +OP4 E02D90 0 +OP4 E02D91 0 +OP4 E02D92 0 +OP4 E02D93 0 +OP4 E02D94 0 +OP4 E02D95 0 +OP4 E02D96 0 +OP4 E02D97 0 +OP4 E02D98 0 +OP4 E02D99 0 +OP4 E02D9A 0 +OP4 E02D9B 0 +OP4 E02D9C 0 +OP4 E02D9D 0 +OP4 E02D9E 0 +OP4 E02D9F 0 +OP4 E02DA0 0 +OP4 E02DA1 0 +OP4 E02DA2 0 +OP4 E02DA3 0 +OP4 E02DA4 0 +OP4 E02DA5 0 +OP4 E02DA6 0 +OP4 E02DA7 0 +OP4 E02DA8 0 +OP4 E02DA9 0 +OP4 E02DAA 0 +OP4 E02DAB 0 +OP4 E02DAC 0 +OP4 E02DAD 0 +OP4 E02DAE 0 +OP4 E02DAF 0 +OP4 E02DB0 0 +OP4 E02DB1 0 +OP4 E02DB2 0 +OP4 E02DB3 0 +OP4 E02DB4 0 +OP4 E02DB5 0 +OP4 E02DB6 0 +OP4 E02DB7 0 +OP4 E02DB8 0 +OP4 E02DB9 0 +OP4 E02DBA 0 +OP4 E02DBB 0 +OP4 E02DBC 0 +OP4 E02DBD 0 +OP4 E02DBE 0 +OP4 E02DBF 0 +OP4 E02DC0 0 +OP4 E02DC1 0 +OP4 E02DC2 0 +OP4 E02DC3 0 +OP4 E02DC4 0 +OP4 E02DC5 0 +OP4 E02DC6 0 +OP4 E02DC7 0 +OP4 E02DC8 0 +OP4 E02DC9 0 +OP4 E02DCA 0 +OP4 E02DCB 0 +OP4 E02DCC 0 +OP4 E02DCD 0 +OP4 E02DCE 0 +OP4 E02DCF 0 +OP4 E02DD0 0 +OP4 E02DD1 0 +OP4 E02DD2 0 +OP4 E02DD3 0 +OP4 E02DD4 0 +OP4 E02DD5 0 +OP4 E02DD6 0 +OP4 E02DD7 0 +OP4 E02DD8 0 +OP4 E02DD9 0 +OP4 E02DDA 0 +OP4 E02DDB 0 +OP4 E02DDC 0 +OP4 E02DDD 0 +OP4 E02DDE 0 +OP4 E02DDF 0 +OP4 E02DE0 0 +OP4 E02DE1 0 +OP4 E02DE2 0 +OP4 E02DE3 0 +OP4 E02DE4 0 +OP4 E02DE5 0 +OP4 E02DE6 0 +OP4 E02DE7 0 +OP4 E02DE8 0 +OP4 E02DE9 0 +OP4 E02DEA 0 +OP4 E02DEB 0 +OP4 E02DEC 0 +OP4 E02DED 0 +OP4 E02DEE 0 +OP4 E02DEF 0 +OP4 E02DF0 0 +OP4 E02DF1 0 +OP4 E02DF2 0 +OP4 E02DF3 0 +OP4 E02DF4 0 +OP4 E02DF5 0 +OP4 E02DF6 0 +OP4 E02DF7 0 +OP4 E02DF8 0 +OP4 E02DF9 0 +OP4 E02DFA 0 +OP4 E02DFB 0 +OP4 E02DFC 0 +OP4 E02DFD 0 +OP4 E02DFE 0 +OP4 E02DFF 0 +OP4 E02E00 0 +OP4 E02E01 0 +OP4 E02E02 0 +OP4 E02E03 0 +OP4 E02E04 0 +OP4 E02E05 0 +OP4 E02E06 0 +OP4 E02E07 0 +OP4 E02E08 0 +OP4 E02E09 0 +OP4 E02E0A 0 +OP4 E02E0B 0 +OP4 E02E0C 0 +OP4 E02E0D 0 +OP4 E02E0E 0 +OP4 E02E0F 0 +OP4 E02E10 0 +OP4 E02E11 0 +OP4 E02E12 0 +OP4 E02E13 0 +OP4 E02E14 0 +OP4 E02E15 0 +OP4 E02E16 0 +OP4 E02E17 0 +OP4 E02E18 0 +OP4 E02E19 0 +OP4 E02E1A 0 +OP4 E02E1B 0 +OP4 E02E1C 0 +OP4 E02E1D 0 +OP4 E02E1E 0 +OP4 E02E1F 0 +OP4 E02E20 0 +OP4 E02E21 0 +OP4 E02E22 0 +OP4 E02E23 0 +OP4 E02E24 0 +OP4 E02E25 0 +OP4 E02E26 0 +OP4 E02E27 0 +OP4 E02E28 0 +OP4 E02E29 0 +OP4 E02E2A 0 +OP4 E02E2B 0 +OP4 E02E2C 0 +OP4 E02E2D 0 +OP4 E02E2E 0 +OP4 E02E2F 0 +OP4 E02E30 0 +OP4 E02E31 0 +OP4 E02E32 0 +OP4 E02E33 0 +OP4 E02E34 0 +OP4 E02E35 0 +OP4 E02E36 0 +OP4 E02E37 0 +OP4 E02E38 0 +OP4 E02E39 0 +OP4 E02E3A 0 +OP4 E02E3B 0 +OP4 E02E3C 0 +OP4 E02E3D 0 +OP4 E02E3E 0 +OP4 E02E3F 0 +OP4 E02E40 0 +OP4 E02E41 0 +OP4 E02E42 0 +OP4 E02E43 0 +OP4 E02E44 0 +OP4 E02E45 0 +OP4 E02E46 0 +OP4 E02E47 0 +OP4 E02E48 0 +OP4 E02E49 0 +OP4 E02E4A 0 +OP4 E02E4B 0 +OP4 E02E4C 0 +OP4 E02E4D 0 +OP4 E02E4E 0 +OP4 E02E4F 0 +OP4 E02E50 0 +OP4 E02E51 0 +OP4 E02E52 0 +OP4 E02E53 0 +OP4 E02E54 0 +OP4 E02E55 0 +OP4 E02E56 0 +OP4 E02E57 0 +OP4 E02E58 0 +OP4 E02E59 0 +OP4 E02E5A 0 +OP4 E02E5B 0 +OP4 E02E5C 0 +OP4 E02E5D 0 +OP4 E02E5E 0 +OP4 E02E5F 0 +OP4 E02E60 0 +OP4 E02E61 0 +OP4 E02E62 0 +OP4 E02E63 0 +OP4 E02E64 0 +OP4 E02E65 0 +OP4 E02E66 0 +OP4 E02E67 0 +OP4 E02E68 0 +OP4 E02E69 0 +OP4 E02E6A 0 +OP4 E02E6B 0 +OP4 E02E6C 0 +OP4 E02E6D 0 +OP4 E02E6E 0 +OP4 E02E6F 0 +OP4 E02E70 0 +OP4 E02E71 0 +OP4 E02E72 0 +OP4 E02E73 0 +OP4 E02E74 0 +OP4 E02E75 0 +OP4 E02E76 0 +OP4 E02E77 0 +OP4 E02E78 0 +OP4 E02E79 0 +OP4 E02E7A 0 +OP4 E02E7B 0 +OP4 E02E7C 0 +OP4 E02E7D 0 +OP4 E02E7E 0 +OP4 E02E7F 0 +OP4 E02E80 0 +OP4 E02E81 0 +OP4 E02E82 0 +OP4 E02E83 0 +OP4 E02E84 0 +OP4 E02E85 0 +OP4 E02E86 0 +OP4 E02E87 0 +OP4 E02E88 0 +OP4 E02E89 0 +OP4 E02E8A 0 +OP4 E02E8B 0 +OP4 E02E8C 0 +OP4 E02E8D 0 +OP4 E02E8E 0 +OP4 E02E8F 0 +OP4 E02E90 0 +OP4 E02E91 0 +OP4 E02E92 0 +OP4 E02E93 0 +OP4 E02E94 0 +OP4 E02E95 0 +OP4 E02E96 0 +OP4 E02E97 0 +OP4 E02E98 0 +OP4 E02E99 0 +OP4 E02E9A 0 +OP4 E02E9B 0 +OP4 E02E9C 0 +OP4 E02E9D 0 +OP4 E02E9E 0 +OP4 E02E9F 0 +OP4 E02EA0 0 +OP4 E02EA1 0 +OP4 E02EA2 0 +OP4 E02EA3 0 +OP4 E02EA4 0 +OP4 E02EA5 0 +OP4 E02EA6 0 +OP4 E02EA7 0 +OP4 E02EA8 0 +OP4 E02EA9 0 +OP4 E02EAA 0 +OP4 E02EAB 0 +OP4 E02EAC 0 +OP4 E02EAD 0 +OP4 E02EAE 0 +OP4 E02EAF 0 +OP4 E02EB0 0 +OP4 E02EB1 0 +OP4 E02EB2 0 +OP4 E02EB3 0 +OP4 E02EB4 0 +OP4 E02EB5 0 +OP4 E02EB6 0 +OP4 E02EB7 0 +OP4 E02EB8 0 +OP4 E02EB9 0 +OP4 E02EBA 0 +OP4 E02EBB 0 +OP4 E02EBC 0 +OP4 E02EBD 0 +OP4 E02EBE 0 +OP4 E02EBF 0 +OP4 E02EC0 0 +OP4 E02EC1 0 +OP4 E02EC2 0 +OP4 E02EC3 0 +OP4 E02EC4 0 +OP4 E02EC5 0 +OP4 E02EC6 0 +OP4 E02EC7 0 +OP4 E02EC8 0 +OP4 E02EC9 0 +OP4 E02ECA 0 +OP4 E02ECB 0 +OP4 E02ECC 0 +OP4 E02ECD 0 +OP4 E02ECE 0 +OP4 E02ECF 0 +OP4 E02ED0 0 +OP4 E02ED1 0 +OP4 E02ED2 0 +OP4 E02ED3 0 +OP4 E02ED4 0 +OP4 E02ED5 0 +OP4 E02ED6 0 +OP4 E02ED7 0 +OP4 E02ED8 0 +OP4 E02ED9 0 +OP4 E02EDA 0 +OP4 E02EDB 0 +OP4 E02EDC 0 +OP4 E02EDD 0 +OP4 E02EDE 0 +OP4 E02EDF 0 +OP4 E02EE0 0 +OP4 E02EE1 0 +OP4 E02EE2 0 +OP4 E02EE3 0 +OP4 E02EE4 0 +OP4 E02EE5 0 +OP4 E02EE6 0 +OP4 E02EE7 0 +OP4 E02EE8 0 +OP4 E02EE9 0 +OP4 E02EEA 0 +OP4 E02EEB 0 +OP4 E02EEC 0 +OP4 E02EED 0 +OP4 E02EEE 0 +OP4 E02EEF 0 +OP4 E02EF0 0 +OP4 E02EF1 0 +OP4 E02EF2 0 +OP4 E02EF3 0 +OP4 E02EF4 0 +OP4 E02EF5 0 +OP4 E02EF6 0 +OP4 E02EF7 0 +OP4 E02EF8 0 +OP4 E02EF9 0 +OP4 E02EFA 0 +OP4 E02EFB 0 +OP4 E02EFC 0 +OP4 E02EFD 0 +OP4 E02EFE 0 +OP4 E02EFF 0 +OP4 E02F00 0 +OP4 E02F01 0 +OP4 E02F02 0 +OP4 E02F03 0 +OP4 E02F04 0 +OP4 E02F05 0 +OP4 E02F06 0 +OP4 E02F07 0 +OP4 E02F08 0 +OP4 E02F09 0 +OP4 E02F0A 0 +OP4 E02F0B 0 +OP4 E02F0C 0 +OP4 E02F0D 0 +OP4 E02F0E 0 +OP4 E02F0F 0 +OP4 E02F10 0 +OP4 E02F11 0 +OP4 E02F12 0 +OP4 E02F13 0 +OP4 E02F14 0 +OP4 E02F15 0 +OP4 E02F16 0 +OP4 E02F17 0 +OP4 E02F18 0 +OP4 E02F19 0 +OP4 E02F1A 0 +OP4 E02F1B 0 +OP4 E02F1C 0 +OP4 E02F1D 0 +OP4 E02F1E 0 +OP4 E02F1F 0 +OP4 E02F20 0 +OP4 E02F21 0 +OP4 E02F22 0 +OP4 E02F23 0 +OP4 E02F24 0 +OP4 E02F25 0 +OP4 E02F26 0 +OP4 E02F27 0 +OP4 E02F28 0 +OP4 E02F29 0 +OP4 E02F2A 0 +OP4 E02F2B 0 +OP4 E02F2C 0 +OP4 E02F2D 0 +OP4 E02F2E 0 +OP4 E02F2F 0 +OP4 E02F30 0 +OP4 E02F31 0 +OP4 E02F32 0 +OP4 E02F33 0 +OP4 E02F34 0 +OP4 E02F35 0 +OP4 E02F36 0 +OP4 E02F37 0 +OP4 E02F38 0 +OP4 E02F39 0 +OP4 E02F3A 0 +OP4 E02F3B 0 +OP4 E02F3C 0 +OP4 E02F3D 0 +OP4 E02F3E 0 +OP4 E02F3F 0 +OP4 E02F40 0 +OP4 E02F41 0 +OP4 E02F42 0 +OP4 E02F43 0 +OP4 E02F44 0 +OP4 E02F45 0 +OP4 E02F46 0 +OP4 E02F47 0 +OP4 E02F48 0 +OP4 E02F49 0 +OP4 E02F4A 0 +OP4 E02F4B 0 +OP4 E02F4C 0 +OP4 E02F4D 0 +OP4 E02F4E 0 +OP4 E02F4F 0 +OP4 E02F50 0 +OP4 E02F51 0 +OP4 E02F52 0 +OP4 E02F53 0 +OP4 E02F54 0 +OP4 E02F55 0 +OP4 E02F56 0 +OP4 E02F57 0 +OP4 E02F58 0 +OP4 E02F59 0 +OP4 E02F5A 0 +OP4 E02F5B 0 +OP4 E02F5C 0 +OP4 E02F5D 0 +OP4 E02F5E 0 +OP4 E02F5F 0 +OP4 E02F60 0 +OP4 E02F61 0 +OP4 E02F62 0 +OP4 E02F63 0 +OP4 E02F64 0 +OP4 E02F65 0 +OP4 E02F66 0 +OP4 E02F67 0 +OP4 E02F68 0 +OP4 E02F69 0 +OP4 E02F6A 0 +OP4 E02F6B 0 +OP4 E02F6C 0 +OP4 E02F6D 0 +OP4 E02F6E 0 +OP4 E02F6F 0 +OP4 E02F70 0 +OP4 E02F71 0 +OP4 E02F72 0 +OP4 E02F73 0 +OP4 E02F74 0 +OP4 E02F75 0 +OP4 E02F76 0 +OP4 E02F77 0 +OP4 E02F78 0 +OP4 E02F79 0 +OP4 E02F7A 0 +OP4 E02F7B 0 +OP4 E02F7C 0 +OP4 E02F7D 0 +OP4 E02F7E 0 +OP4 E02F7F 0 +OP4 E02F80 0 +OP4 E02F81 0 +OP4 E02F82 0 +OP4 E02F83 0 +OP4 E02F84 0 +OP4 E02F85 0 +OP4 E02F86 0 +OP4 E02F87 0 +OP4 E02F88 0 +OP4 E02F89 0 +OP4 E02F8A 0 +OP4 E02F8B 0 +OP4 E02F8C 0 +OP4 E02F8D 0 +OP4 E02F8E 0 +OP4 E02F8F 0 +OP4 E02F90 0 +OP4 E02F91 0 +OP4 E02F92 0 +OP4 E02F93 0 +OP4 E02F94 0 +OP4 E02F95 0 +OP4 E02F96 0 +OP4 E02F97 0 +OP4 E02F98 0 +OP4 E02F99 0 +OP4 E02F9A 0 +OP4 E02F9B 0 +OP4 E02F9C 0 +OP4 E02F9D 0 +OP4 E02F9E 0 +OP4 E02F9F 0 +OP4 E02FA0 0 +OP4 E02FA1 0 +OP4 E02FA2 0 +OP4 E02FA3 0 +OP4 E02FA4 0 +OP4 E02FA5 0 +OP4 E02FA6 0 +OP4 E02FA7 0 +OP4 E02FA8 0 +OP4 E02FA9 0 +OP4 E02FAA 0 +OP4 E02FAB 0 +OP4 E02FAC 0 +OP4 E02FAD 0 +OP4 E02FAE 0 +OP4 E02FAF 0 +OP4 E02FB0 0 +OP4 E02FB1 0 +OP4 E02FB2 0 +OP4 E02FB3 0 +OP4 E02FB4 0 +OP4 E02FB5 0 +OP4 E02FB6 0 +OP4 E02FB7 0 +OP4 E02FB8 0 +OP4 E02FB9 0 +OP4 E02FBA 0 +OP4 E02FBB 0 +OP4 E02FBC 0 +OP4 E02FBD 0 +OP4 E02FBE 0 +OP4 E02FBF 0 +OP4 E02FC0 0 +OP4 E02FC1 0 +OP4 E02FC2 0 +OP4 E02FC3 0 +OP4 E02FC4 0 +OP4 E02FC5 0 +OP4 E02FC6 0 +OP4 E02FC7 0 +OP4 E02FC8 0 +OP4 E02FC9 0 +OP4 E02FCA 0 +OP4 E02FCB 0 +OP4 E02FCC 0 +OP4 E02FCD 0 +OP4 E02FCE 0 +OP4 E02FCF 0 +OP4 E02FD0 0 +OP4 E02FD1 0 +OP4 E02FD2 0 +OP4 E02FD3 0 +OP4 E02FD4 0 +OP4 E02FD5 0 +OP4 E02FD6 0 +OP4 E02FD7 0 +OP4 E02FD8 0 +OP4 E02FD9 0 +OP4 E02FDA 0 +OP4 E02FDB 0 +OP4 E02FDC 0 +OP4 E02FDD 0 +OP4 E02FDE 0 +OP4 E02FDF 0 +OP4 E02FE0 0 +OP4 E02FE1 0 +OP4 E02FE2 0 +OP4 E02FE3 0 +OP4 E02FE4 0 +OP4 E02FE5 0 +OP4 E02FE6 0 +OP4 E02FE7 0 +OP4 E02FE8 0 +OP4 E02FE9 0 +OP4 E02FEA 0 +OP4 E02FEB 0 +OP4 E02FEC 0 +OP4 E02FED 0 +OP4 E02FEE 0 +OP4 E02FEF 0 +OP4 E02FF0 0 +OP4 E02FF1 0 +OP4 E02FF2 0 +OP4 E02FF3 0 +OP4 E02FF4 0 +OP4 E02FF5 0 +OP4 E02FF6 0 +OP4 E02FF7 0 +OP4 E02FF8 0 +OP4 E02FF9 0 +OP4 E02FFA 0 +OP4 E02FFB 0 +OP4 E02FFC 0 +OP4 E02FFD 0 +OP4 E02FFE 0 +OP4 E02FFF 0 +OP4 E03000 0 +OP4 E03001 0 +OP4 E03002 0 +OP4 E03003 0 +OP4 E03004 0 +OP4 E03005 0 +OP4 E03006 0 +OP4 E03007 0 +OP4 E03008 0 +OP4 E03009 0 +OP4 E0300A 0 +OP4 E0300B 0 +OP4 E0300C 0 +OP4 E0300D 0 +OP4 E0300E 0 +OP4 E0300F 0 +OP4 E03010 0 +OP4 E03011 0 +OP4 E03012 0 +OP4 E03013 0 +OP4 E03014 0 +OP4 E03015 0 +OP4 E03016 0 +OP4 E03017 0 +OP4 E03018 0 +OP4 E03019 0 +OP4 E0301A 0 +OP4 E0301B 0 +OP4 E0301C 0 +OP4 E0301D 0 +OP4 E0301E 0 +OP4 E0301F 0 +OP4 E03020 0 +OP4 E03021 0 +OP4 E03022 0 +OP4 E03023 0 +OP4 E03024 0 +OP4 E03025 0 +OP4 E03026 0 +OP4 E03027 0 +OP4 E03028 0 +OP4 E03029 0 +OP4 E0302A 0 +OP4 E0302B 0 +OP4 E0302C 0 +OP4 E0302D 0 +OP4 E0302E 0 +OP4 E0302F 0 +OP4 E03030 0 +OP4 E03031 0 +OP4 E03032 0 +OP4 E03033 0 +OP4 E03034 0 +OP4 E03035 0 +OP4 E03036 0 +OP4 E03037 0 +OP4 E03038 0 +OP4 E03039 0 +OP4 E0303A 0 +OP4 E0303B 0 +OP4 E0303C 0 +OP4 E0303D 0 +OP4 E0303E 0 +OP4 E0303F 0 +OP4 E03040 0 +OP4 E03041 0 +OP4 E03042 0 +OP4 E03043 0 +OP4 E03044 0 +OP4 E03045 0 +OP4 E03046 0 +OP4 E03047 0 +OP4 E03048 0 +OP4 E03049 0 +OP4 E0304A 0 +OP4 E0304B 0 +OP4 E0304C 0 +OP4 E0304D 0 +OP4 E0304E 0 +OP4 E0304F 0 +OP4 E03050 0 +OP4 E03051 0 +OP4 E03052 0 +OP4 E03053 0 +OP4 E03054 0 +OP4 E03055 0 +OP4 E03056 0 +OP4 E03057 0 +OP4 E03058 0 +OP4 E03059 0 +OP4 E0305A 0 +OP4 E0305B 0 +OP4 E0305C 0 +OP4 E0305D 0 +OP4 E0305E 0 +OP4 E0305F 0 +OP4 E03060 0 +OP4 E03061 0 +OP4 E03062 0 +OP4 E03063 0 +OP4 E03064 0 +OP4 E03065 0 +OP4 E03066 0 +OP4 E03067 0 +OP4 E03068 0 +OP4 E03069 0 +OP4 E0306A 0 +OP4 E0306B 0 +OP4 E0306C 0 +OP4 E0306D 0 +OP4 E0306E 0 +OP4 E0306F 0 +OP4 E03070 0 +OP4 E03071 0 +OP4 E03072 0 +OP4 E03073 0 +OP4 E03074 0 +OP4 E03075 0 +OP4 E03076 0 +OP4 E03077 0 +OP4 E03078 0 +OP4 E03079 0 +OP4 E0307A 0 +OP4 E0307B 0 +OP4 E0307C 0 +OP4 E0307D 0 +OP4 E0307E 0 +OP4 E0307F 0 +OP4 E03080 0 +OP4 E03081 0 +OP4 E03082 0 +OP4 E03083 0 +OP4 E03084 0 +OP4 E03085 0 +OP4 E03086 0 +OP4 E03087 0 +OP4 E03088 0 +OP4 E03089 0 +OP4 E0308A 0 +OP4 E0308B 0 +OP4 E0308C 0 +OP4 E0308D 0 +OP4 E0308E 0 +OP4 E0308F 0 +OP4 E03090 0 +OP4 E03091 0 +OP4 E03092 0 +OP4 E03093 0 +OP4 E03094 0 +OP4 E03095 0 +OP4 E03096 0 +OP4 E03097 0 +OP4 E03098 0 +OP4 E03099 0 +OP4 E0309A 0 +OP4 E0309B 0 +OP4 E0309C 0 +OP4 E0309D 0 +OP4 E0309E 0 +OP4 E0309F 0 +OP4 E030A0 0 +OP4 E030A1 0 +OP4 E030A2 0 +OP4 E030A3 0 +OP4 E030A4 0 +OP4 E030A5 0 +OP4 E030A6 0 +OP4 E030A7 0 +OP4 E030A8 0 +OP4 E030A9 0 +OP4 E030AA 0 +OP4 E030AB 0 +OP4 E030AC 0 +OP4 E030AD 0 +OP4 E030AE 0 +OP4 E030AF 0 +OP4 E030B0 0 +OP4 E030B1 0 +OP4 E030B2 0 +OP4 E030B3 0 +OP4 E030B4 0 +OP4 E030B5 0 +OP4 E030B6 0 +OP4 E030B7 0 +OP4 E030B8 0 +OP4 E030B9 0 +OP4 E030BA 0 +OP4 E030BB 0 +OP4 E030BC 0 +OP4 E030BD 0 +OP4 E030BE 0 +OP4 E030BF 0 +OP4 E030C0 0 +OP4 E030C1 0 +OP4 E030C2 0 +OP4 E030C3 0 +OP4 E030C4 0 +OP4 E030C5 0 +OP4 E030C6 0 +OP4 E030C7 0 +OP4 E030C8 0 +OP4 E030C9 0 +OP4 E030CA 0 +OP4 E030CB 0 +OP4 E030CC 0 +OP4 E030CD 0 +OP4 E030CE 0 +OP4 E030CF 0 +OP4 E030D0 0 +OP4 E030D1 0 +OP4 E030D2 0 +OP4 E030D3 0 +OP4 E030D4 0 +OP4 E030D5 0 +OP4 E030D6 0 +OP4 E030D7 0 +OP4 E030D8 0 +OP4 E030D9 0 +OP4 E030DA 0 +OP4 E030DB 0 +OP4 E030DC 0 +OP4 E030DD 0 +OP4 E030DE 0 +OP4 E030DF 0 +OP4 E030E0 0 +OP4 E030E1 0 +OP4 E030E2 0 +OP4 E030E3 0 +OP4 E030E4 0 +OP4 E030E5 0 +OP4 E030E6 0 +OP4 E030E7 0 +OP4 E030E8 0 +OP4 E030E9 0 +OP4 E030EA 0 +OP4 E030EB 0 +OP4 E030EC 0 +OP4 E030ED 0 +OP4 E030EE 0 +OP4 E030EF 0 +OP4 E030F0 0 +OP4 E030F1 0 +OP4 E030F2 0 +OP4 E030F3 0 +OP4 E030F4 0 +OP4 E030F5 0 +OP4 E030F6 0 +OP4 E030F7 0 +OP4 E030F8 0 +OP4 E030F9 0 +OP4 E030FA 0 +OP4 E030FB 0 +OP4 E030FC 0 +OP4 E030FD 0 +OP4 E030FE 0 +OP4 E030FF 0 +OP4 E03100 0 +OP4 E03101 0 +OP4 E03102 0 +OP4 E03103 0 +OP4 E03104 0 +OP4 E03105 0 +OP4 E03106 0 +OP4 E03107 0 +OP4 E03108 0 +OP4 E03109 0 +OP4 E0310A 0 +OP4 E0310B 0 +OP4 E0310C 0 +OP4 E0310D 0 +OP4 E0310E 0 +OP4 E0310F 0 +OP4 E03110 0 +OP4 E03111 0 +OP4 E03112 0 +OP4 E03113 0 +OP4 E03114 0 +OP4 E03115 0 +OP4 E03116 0 +OP4 E03117 0 +OP4 E03118 0 +OP4 E03119 0 +OP4 E0311A 0 +OP4 E0311B 0 +OP4 E0311C 0 +OP4 E0311D 0 +OP4 E0311E 0 +OP4 E0311F 0 +OP4 E03120 0 +OP4 E03121 0 +OP4 E03122 0 +OP4 E03123 0 +OP4 E03124 0 +OP4 E03125 0 +OP4 E03126 0 +OP4 E03127 0 +OP4 E03128 0 +OP4 E03129 0 +OP4 E0312A 0 +OP4 E0312B 0 +OP4 E0312C 0 +OP4 E0312D 0 +OP4 E0312E 0 +OP4 E0312F 0 +OP4 E03130 0 +OP4 E03131 0 +OP4 E03132 0 +OP4 E03133 0 +OP4 E03134 0 +OP4 E03135 0 +OP4 E03136 0 +OP4 E03137 0 +OP4 E03138 0 +OP4 E03139 0 +OP4 E0313A 0 +OP4 E0313B 0 +OP4 E0313C 0 +OP4 E0313D 0 +OP4 E0313E 0 +OP4 E0313F 0 +OP4 E03140 0 +OP4 E03141 0 +OP4 E03142 0 +OP4 E03143 0 +OP4 E03144 0 +OP4 E03145 0 +OP4 E03146 0 +OP4 E03147 0 +OP4 E03148 0 +OP4 E03149 0 +OP4 E0314A 0 +OP4 E0314B 0 +OP4 E0314C 0 +OP4 E0314D 0 +OP4 E0314E 0 +OP4 E0314F 0 +OP4 E03150 0 +OP4 E03151 0 +OP4 E03152 0 +OP4 E03153 0 +OP4 E03154 0 +OP4 E03155 0 +OP4 E03156 0 +OP4 E03157 0 +OP4 E03158 0 +OP4 E03159 0 +OP4 E0315A 0 +OP4 E0315B 0 +OP4 E0315C 0 +OP4 E0315D 0 +OP4 E0315E 0 +OP4 E0315F 0 +OP4 E03160 0 +OP4 E03161 0 +OP4 E03162 0 +OP4 E03163 0 +OP4 E03164 0 +OP4 E03165 0 +OP4 E03166 0 +OP4 E03167 0 +OP4 E03168 0 +OP4 E03169 0 +OP4 E0316A 0 +OP4 E0316B 0 +OP4 E0316C 0 +OP4 E0316D 0 +OP4 E0316E 0 +OP4 E0316F 0 +OP4 E03170 0 +OP4 E03171 0 +OP4 E03172 0 +OP4 E03173 0 +OP4 E03174 0 +OP4 E03175 0 +OP4 E03176 0 +OP4 E03177 0 +OP4 E03178 0 +OP4 E03179 0 +OP4 E0317A 0 +OP4 E0317B 0 +OP4 E0317C 0 +OP4 E0317D 0 +OP4 E0317E 0 +OP4 E0317F 0 +OP4 E03180 0 +OP4 E03181 0 +OP4 E03182 0 +OP4 E03183 0 +OP4 E03184 0 +OP4 E03185 0 +OP4 E03186 0 +OP4 E03187 0 +OP4 E03188 0 +OP4 E03189 0 +OP4 E0318A 0 +OP4 E0318B 0 +OP4 E0318C 0 +OP4 E0318D 0 +OP4 E0318E 0 +OP4 E0318F 0 +OP4 E03190 0 +OP4 E03191 0 +OP4 E03192 0 +OP4 E03193 0 +OP4 E03194 0 +OP4 E03195 0 +OP4 E03196 0 +OP4 E03197 0 +OP4 E03198 0 +OP4 E03199 0 +OP4 E0319A 0 +OP4 E0319B 0 +OP4 E0319C 0 +OP4 E0319D 0 +OP4 E0319E 0 +OP4 E0319F 0 +OP4 E031A0 0 +OP4 E031A1 0 +OP4 E031A2 0 +OP4 E031A3 0 +OP4 E031A4 0 +OP4 E031A5 0 +OP4 E031A6 0 +OP4 E031A7 0 +OP4 E031A8 0 +OP4 E031A9 0 +OP4 E031AA 0 +OP4 E031AB 0 +OP4 E031AC 0 +OP4 E031AD 0 +OP4 E031AE 0 +OP4 E031AF 0 +OP4 E031B0 0 +OP4 E031B1 0 +OP4 E031B2 0 +OP4 E031B3 0 +OP4 E031B4 0 +OP4 E031B5 0 +OP4 E031B6 0 +OP4 E031B7 0 +OP4 E031B8 0 +OP4 E031B9 0 +OP4 E031BA 0 +OP4 E031BB 0 +OP4 E031BC 0 +OP4 E031BD 0 +OP4 E031BE 0 +OP4 E031BF 0 +OP4 E031C0 0 +OP4 E031C1 0 +OP4 E031C2 0 +OP4 E031C3 0 +OP4 E031C4 0 +OP4 E031C5 0 +OP4 E031C6 0 +OP4 E031C7 0 +OP4 E031C8 0 +OP4 E031C9 0 +OP4 E031CA 0 +OP4 E031CB 0 +OP4 E031CC 0 +OP4 E031CD 0 +OP4 E031CE 0 +OP4 E031CF 0 +OP4 E031D0 0 +OP4 E031D1 0 +OP4 E031D2 0 +OP4 E031D3 0 +OP4 E031D4 0 +OP4 E031D5 0 +OP4 E031D6 0 +OP4 E031D7 0 +OP4 E031D8 0 +OP4 E031D9 0 +OP4 E031DA 0 +OP4 E031DB 0 +OP4 E031DC 0 +OP4 E031DD 0 +OP4 E031DE 0 +OP4 E031DF 0 +OP4 E031E0 0 +OP4 E031E1 0 +OP4 E031E2 0 +OP4 E031E3 0 +OP4 E031E4 0 +OP4 E031E5 0 +OP4 E031E6 0 +OP4 E031E7 0 +OP4 E031E8 0 +OP4 E031E9 0 +OP4 E031EA 0 +OP4 E031EB 0 +OP4 E031EC 0 +OP4 E031ED 0 +OP4 E031EE 0 +OP4 E031EF 0 +OP4 E031F0 0 +OP4 E031F1 0 +OP4 E031F2 0 +OP4 E031F3 0 +OP4 E031F4 0 +OP4 E031F5 0 +OP4 E031F6 0 +OP4 E031F7 0 +OP4 E031F8 0 +OP4 E031F9 0 +OP4 E031FA 0 +OP4 E031FB 0 +OP4 E031FC 0 +OP4 E031FD 0 +OP4 E031FE 0 +OP4 E031FF 0 +OP4 E03200 0 +OP4 E03201 0 +OP4 E03202 0 +OP4 E03203 0 +OP4 E03204 0 +OP4 E03205 0 +OP4 E03206 0 +OP4 E03207 0 +OP4 E03208 0 +OP4 E03209 0 +OP4 E0320A 0 +OP4 E0320B 0 +OP4 E0320C 0 +OP4 E0320D 0 +OP4 E0320E 0 +OP4 E0320F 0 +OP4 E03210 0 +OP4 E03211 0 +OP4 E03212 0 +OP4 E03213 0 +OP4 E03214 0 +OP4 E03215 0 +OP4 E03216 0 +OP4 E03217 0 +OP4 E03218 0 +OP4 E03219 0 +OP4 E0321A 0 +OP4 E0321B 0 +OP4 E0321C 0 +OP4 E0321D 0 +OP4 E0321E 0 +OP4 E0321F 0 +OP4 E03220 0 +OP4 E03221 0 +OP4 E03222 0 +OP4 E03223 0 +OP4 E03224 0 +OP4 E03225 0 +OP4 E03226 0 +OP4 E03227 0 +OP4 E03228 0 +OP4 E03229 0 +OP4 E0322A 0 +OP4 E0322B 0 +OP4 E0322C 0 +OP4 E0322D 0 +OP4 E0322E 0 +OP4 E0322F 0 +OP4 E03230 0 +OP4 E03231 0 +OP4 E03232 0 +OP4 E03233 0 +OP4 E03234 0 +OP4 E03235 0 +OP4 E03236 0 +OP4 E03237 0 +OP4 E03238 0 +OP4 E03239 0 +OP4 E0323A 0 +OP4 E0323B 0 +OP4 E0323C 0 +OP4 E0323D 0 +OP4 E0323E 0 +OP4 E0323F 0 +OP4 E03240 0 +OP4 E03241 0 +OP4 E03242 0 +OP4 E03243 0 +OP4 E03244 0 +OP4 E03245 0 +OP4 E03246 0 +OP4 E03247 0 +OP4 E03248 0 +OP4 E03249 0 +OP4 E0324A 0 +OP4 E0324B 0 +OP4 E0324C 0 +OP4 E0324D 0 +OP4 E0324E 0 +OP4 E0324F 0 +OP4 E03250 0 +OP4 E03251 0 +OP4 E03252 0 +OP4 E03253 0 +OP4 E03254 0 +OP4 E03255 0 +OP4 E03256 0 +OP4 E03257 0 +OP4 E03258 0 +OP4 E03259 0 +OP4 E0325A 0 +OP4 E0325B 0 +OP4 E0325C 0 +OP4 E0325D 0 +OP4 E0325E 0 +OP4 E0325F 0 +OP4 E03260 0 +OP4 E03261 0 +OP4 E03262 0 +OP4 E03263 0 +OP4 E03264 0 +OP4 E03265 0 +OP4 E03266 0 +OP4 E03267 0 +OP4 E03268 0 +OP4 E03269 0 +OP4 E0326A 0 +OP4 E0326B 0 +OP4 E0326C 0 +OP4 E0326D 0 +OP4 E0326E 0 +OP4 E0326F 0 +OP4 E03270 0 +OP4 E03271 0 +OP4 E03272 0 +OP4 E03273 0 +OP4 E03274 0 +OP4 E03275 0 +OP4 E03276 0 +OP4 E03277 0 +OP4 E03278 0 +OP4 E03279 0 +OP4 E0327A 0 +OP4 E0327B 0 +OP4 E0327C 0 +OP4 E0327D 0 +OP4 E0327E 0 +OP4 E0327F 0 +OP4 E03280 0 +OP4 E03281 0 +OP4 E03282 0 +OP4 E03283 0 +OP4 E03284 0 +OP4 E03285 0 +OP4 E03286 0 +OP4 E03287 0 +OP4 E03288 0 +OP4 E03289 0 +OP4 E0328A 0 +OP4 E0328B 0 +OP4 E0328C 0 +OP4 E0328D 0 +OP4 E0328E 0 +OP4 E0328F 0 +OP4 E03290 0 +OP4 E03291 0 +OP4 E03292 0 +OP4 E03293 0 +OP4 E03294 0 +OP4 E03295 0 +OP4 E03296 0 +OP4 E03297 0 +OP4 E03298 0 +OP4 E03299 0 +OP4 E0329A 0 +OP4 E0329B 0 +OP4 E0329C 0 +OP4 E0329D 0 +OP4 E0329E 0 +OP4 E0329F 0 +OP4 E032A0 0 +OP4 E032A1 0 +OP4 E032A2 0 +OP4 E032A3 0 +OP4 E032A4 0 +OP4 E032A5 0 +OP4 E032A6 0 +OP4 E032A7 0 +OP4 E032A8 0 +OP4 E032A9 0 +OP4 E032AA 0 +OP4 E032AB 0 +OP4 E032AC 0 +OP4 E032AD 0 +OP4 E032AE 0 +OP4 E032AF 0 +OP4 E032B0 0 +OP4 E032B1 0 +OP4 E032B2 0 +OP4 E032B3 0 +OP4 E032B4 0 +OP4 E032B5 0 +OP4 E032B6 0 +OP4 E032B7 0 +OP4 E032B8 0 +OP4 E032B9 0 +OP4 E032BA 0 +OP4 E032BB 0 +OP4 E032BC 0 +OP4 E032BD 0 +OP4 E032BE 0 +OP4 E032BF 0 +OP4 E032C0 0 +OP4 E032C1 0 +OP4 E032C2 0 +OP4 E032C3 0 +OP4 E032C4 0 +OP4 E032C5 0 +OP4 E032C6 0 +OP4 E032C7 0 +OP4 E032C8 0 +OP4 E032C9 0 +OP4 E032CA 0 +OP4 E032CB 0 +OP4 E032CC 0 +OP4 E032CD 0 +OP4 E032CE 0 +OP4 E032CF 0 +OP4 E032D0 0 +OP4 E032D1 0 +OP4 E032D2 0 +OP4 E032D3 0 +OP4 E032D4 0 +OP4 E032D5 0 +OP4 E032D6 0 +OP4 E032D7 0 +OP4 E032D8 0 +OP4 E032D9 0 +OP4 E032DA 0 +OP4 E032DB 0 +OP4 E032DC 0 +OP4 E032DD 0 +OP4 E032DE 0 +OP4 E032DF 0 +OP4 E032E0 0 +OP4 E032E1 0 +OP4 E032E2 0 +OP4 E032E3 0 +OP4 E032E4 0 +OP4 E032E5 0 +OP4 E032E6 0 +OP4 E032E7 0 +OP4 E032E8 0 +OP4 E032E9 0 +OP4 E032EA 0 +OP4 E032EB 0 +OP4 E032EC 0 +OP4 E032ED 0 +OP4 E032EE 0 +OP4 E032EF 0 +OP4 E032F0 0 +OP4 E032F1 0 +OP4 E032F2 0 +OP4 E032F3 0 +OP4 E032F4 0 +OP4 E032F5 0 +OP4 E032F6 0 +OP4 E032F7 0 +OP4 E032F8 0 +OP4 E032F9 0 +OP4 E032FA 0 +OP4 E032FB 0 +OP4 E032FC 0 +OP4 E032FD 0 +OP4 E032FE 0 +OP4 E032FF 0 +OP4 E03300 0 +OP4 E03301 0 +OP4 E03302 0 +OP4 E03303 0 +OP4 E03304 0 +OP4 E03305 0 +OP4 E03306 0 +OP4 E03307 0 +OP4 E03308 0 +OP4 E03309 0 +OP4 E0330A 0 +OP4 E0330B 0 +OP4 E0330C 0 +OP4 E0330D 0 +OP4 E0330E 0 +OP4 E0330F 0 +OP4 E03310 0 +OP4 E03311 0 +OP4 E03312 0 +OP4 E03313 0 +OP4 E03314 0 +OP4 E03315 0 +OP4 E03316 0 +OP4 E03317 0 +OP4 E03318 0 +OP4 E03319 0 +OP4 E0331A 0 +OP4 E0331B 0 +OP4 E0331C 0 +OP4 E0331D 0 +OP4 E0331E 0 +OP4 E0331F 0 +OP4 E03320 0 +OP4 E03321 0 +OP4 E03322 0 +OP4 E03323 0 +OP4 E03324 0 +OP4 E03325 0 +OP4 E03326 0 +OP4 E03327 0 +OP4 E03328 0 +OP4 E03329 0 +OP4 E0332A 0 +OP4 E0332B 0 +OP4 E0332C 0 +OP4 E0332D 0 +OP4 E0332E 0 +OP4 E0332F 0 +OP4 E03330 0 +OP4 E03331 0 +OP4 E03332 0 +OP4 E03333 0 +OP4 E03334 0 +OP4 E03335 0 +OP4 E03336 0 +OP4 E03337 0 +OP4 E03338 0 +OP4 E03339 0 +OP4 E0333A 0 +OP4 E0333B 0 +OP4 E0333C 0 +OP4 E0333D 0 +OP4 E0333E 0 +OP4 E0333F 0 +OP4 E03340 0 +OP4 E03341 0 +OP4 E03342 0 +OP4 E03343 0 +OP4 E03344 0 +OP4 E03345 0 +OP4 E03346 0 +OP4 E03347 0 +OP4 E03348 0 +OP4 E03349 0 +OP4 E0334A 0 +OP4 E0334B 0 +OP4 E0334C 0 +OP4 E0334D 0 +OP4 E0334E 0 +OP4 E0334F 0 +OP4 E03350 0 +OP4 E03351 0 +OP4 E03352 0 +OP4 E03353 0 +OP4 E03354 0 +OP4 E03355 0 +OP4 E03356 0 +OP4 E03357 0 +OP4 E03358 0 +OP4 E03359 0 +OP4 E0335A 0 +OP4 E0335B 0 +OP4 E0335C 0 +OP4 E0335D 0 +OP4 E0335E 0 +OP4 E0335F 0 +OP4 E03360 0 +OP4 E03361 0 +OP4 E03362 0 +OP4 E03363 0 +OP4 E03364 0 +OP4 E03365 0 +OP4 E03366 0 +OP4 E03367 0 +OP4 E03368 0 +OP4 E03369 0 +OP4 E0336A 0 +OP4 E0336B 0 +OP4 E0336C 0 +OP4 E0336D 0 +OP4 E0336E 0 +OP4 E0336F 0 +OP4 E03370 0 +OP4 E03371 0 +OP4 E03372 0 +OP4 E03373 0 +OP4 E03374 0 +OP4 E03375 0 +OP4 E03376 0 +OP4 E03377 0 +OP4 E03378 0 +OP4 E03379 0 +OP4 E0337A 0 +OP4 E0337B 0 +OP4 E0337C 0 +OP4 E0337D 0 +OP4 E0337E 0 +OP4 E0337F 0 +OP4 E03380 0 +OP4 E03381 0 +OP4 E03382 0 +OP4 E03383 0 +OP4 E03384 0 +OP4 E03385 0 +OP4 E03386 0 +OP4 E03387 0 +OP4 E03388 0 +OP4 E03389 0 +OP4 E0338A 0 +OP4 E0338B 0 +OP4 E0338C 0 +OP4 E0338D 0 +OP4 E0338E 0 +OP4 E0338F 0 +OP4 E03390 0 +OP4 E03391 0 +OP4 E03392 0 +OP4 E03393 0 +OP4 E03394 0 +OP4 E03395 0 +OP4 E03396 0 +OP4 E03397 0 +OP4 E03398 0 +OP4 E03399 0 +OP4 E0339A 0 +OP4 E0339B 0 +OP4 E0339C 0 +OP4 E0339D 0 +OP4 E0339E 0 +OP4 E0339F 0 +OP4 E033A0 0 +OP4 E033A1 0 +OP4 E033A2 0 +OP4 E033A3 0 +OP4 E033A4 0 +OP4 E033A5 0 +OP4 E033A6 0 +OP4 E033A7 0 +OP4 E033A8 0 +OP4 E033A9 0 +OP4 E033AA 0 +OP4 E033AB 0 +OP4 E033AC 0 +OP4 E033AD 0 +OP4 E033AE 0 +OP4 E033AF 0 +OP4 E033B0 0 +OP4 E033B1 0 +OP4 E033B2 0 +OP4 E033B3 0 +OP4 E033B4 0 +OP4 E033B5 0 +OP4 E033B6 0 +OP4 E033B7 0 +OP4 E033B8 0 +OP4 E033B9 0 +OP4 E033BA 0 +OP4 E033BB 0 +OP4 E033BC 0 +OP4 E033BD 0 +OP4 E033BE 0 +OP4 E033BF 0 +OP4 E033C0 0 +OP4 E033C1 0 +OP4 E033C2 0 +OP4 E033C3 0 +OP4 E033C4 0 +OP4 E033C5 0 +OP4 E033C6 0 +OP4 E033C7 0 +OP4 E033C8 0 +OP4 E033C9 0 +OP4 E033CA 0 +OP4 E033CB 0 +OP4 E033CC 0 +OP4 E033CD 0 +OP4 E033CE 0 +OP4 E033CF 0 +OP4 E033D0 0 +OP4 E033D1 0 +OP4 E033D2 0 +OP4 E033D3 0 +OP4 E033D4 0 +OP4 E033D5 0 +OP4 E033D6 0 +OP4 E033D7 0 +OP4 E033D8 0 +OP4 E033D9 0 +OP4 E033DA 0 +OP4 E033DB 0 +OP4 E033DC 0 +OP4 E033DD 0 +OP4 E033DE 0 +OP4 E033DF 0 +OP4 E033E0 0 +OP4 E033E1 0 +OP4 E033E2 0 +OP4 E033E3 0 +OP4 E033E4 0 +OP4 E033E5 0 +OP4 E033E6 0 +OP4 E033E7 0 +OP4 E033E8 0 +OP4 E033E9 0 +OP4 E033EA 0 +OP4 E033EB 0 +OP4 E033EC 0 +OP4 E033ED 0 +OP4 E033EE 0 +OP4 E033EF 0 +OP4 E033F0 0 +OP4 E033F1 0 +OP4 E033F2 0 +OP4 E033F3 0 +OP4 E033F4 0 +OP4 E033F5 0 +OP4 E033F6 0 +OP4 E033F7 0 +OP4 E033F8 0 +OP4 E033F9 0 +OP4 E033FA 0 +OP4 E033FB 0 +OP4 E033FC 0 +OP4 E033FD 0 +OP4 E033FE 0 +OP4 E033FF 0 +OP4 E03400 0 +OP4 E03401 0 +OP4 E03402 0 +OP4 E03403 0 +OP4 E03404 0 +OP4 E03405 0 +OP4 E03406 0 +OP4 E03407 0 +OP4 E03408 0 +OP4 E03409 0 +OP4 E0340A 0 +OP4 E0340B 0 +OP4 E0340C 0 +OP4 E0340D 0 +OP4 E0340E 0 +OP4 E0340F 0 +OP4 E03410 0 +OP4 E03411 0 +OP4 E03412 0 +OP4 E03413 0 +OP4 E03414 0 +OP4 E03415 0 +OP4 E03416 0 +OP4 E03417 0 +OP4 E03418 0 +OP4 E03419 0 +OP4 E0341A 0 +OP4 E0341B 0 +OP4 E0341C 0 +OP4 E0341D 0 +OP4 E0341E 0 +OP4 E0341F 0 +OP4 E03420 0 +OP4 E03421 0 +OP4 E03422 0 +OP4 E03423 0 +OP4 E03424 0 +OP4 E03425 0 +OP4 E03426 0 +OP4 E03427 0 +OP4 E03428 0 +OP4 E03429 0 +OP4 E0342A 0 +OP4 E0342B 0 +OP4 E0342C 0 +OP4 E0342D 0 +OP4 E0342E 0 +OP4 E0342F 0 +OP4 E03430 0 +OP4 E03431 0 +OP4 E03432 0 +OP4 E03433 0 +OP4 E03434 0 +OP4 E03435 0 +OP4 E03436 0 +OP4 E03437 0 +OP4 E03438 0 +OP4 E03439 0 +OP4 E0343A 0 +OP4 E0343B 0 +OP4 E0343C 0 +OP4 E0343D 0 +OP4 E0343E 0 +OP4 E0343F 0 +OP4 E03440 0 +OP4 E03441 0 +OP4 E03442 0 +OP4 E03443 0 +OP4 E03444 0 +OP4 E03445 0 +OP4 E03446 0 +OP4 E03447 0 +OP4 E03448 0 +OP4 E03449 0 +OP4 E0344A 0 +OP4 E0344B 0 +OP4 E0344C 0 +OP4 E0344D 0 +OP4 E0344E 0 +OP4 E0344F 0 +OP4 E03450 0 +OP4 E03451 0 +OP4 E03452 0 +OP4 E03453 0 +OP4 E03454 0 +OP4 E03455 0 +OP4 E03456 0 +OP4 E03457 0 +OP4 E03458 0 +OP4 E03459 0 +OP4 E0345A 0 +OP4 E0345B 0 +OP4 E0345C 0 +OP4 E0345D 0 +OP4 E0345E 0 +OP4 E0345F 0 +OP4 E03460 0 +OP4 E03461 0 +OP4 E03462 0 +OP4 E03463 0 +OP4 E03464 0 +OP4 E03465 0 +OP4 E03466 0 +OP4 E03467 0 +OP4 E03468 0 +OP4 E03469 0 +OP4 E0346A 0 +OP4 E0346B 0 +OP4 E0346C 0 +OP4 E0346D 0 +OP4 E0346E 0 +OP4 E0346F 0 +OP4 E03470 0 +OP4 E03471 0 +OP4 E03472 0 +OP4 E03473 0 +OP4 E03474 0 +OP4 E03475 0 +OP4 E03476 0 +OP4 E03477 0 +OP4 E03478 0 +OP4 E03479 0 +OP4 E0347A 0 +OP4 E0347B 0 +OP4 E0347C 0 +OP4 E0347D 0 +OP4 E0347E 0 +OP4 E0347F 0 +OP4 E03480 0 +OP4 E03481 0 +OP4 E03482 0 +OP4 E03483 0 +OP4 E03484 0 +OP4 E03485 0 +OP4 E03486 0 +OP4 E03487 0 +OP4 E03488 0 +OP4 E03489 0 +OP4 E0348A 0 +OP4 E0348B 0 +OP4 E0348C 0 +OP4 E0348D 0 +OP4 E0348E 0 +OP4 E0348F 0 +OP4 E03490 0 +OP4 E03491 0 +OP4 E03492 0 +OP4 E03493 0 +OP4 E03494 0 +OP4 E03495 0 +OP4 E03496 0 +OP4 E03497 0 +OP4 E03498 0 +OP4 E03499 0 +OP4 E0349A 0 +OP4 E0349B 0 +OP4 E0349C 0 +OP4 E0349D 0 +OP4 E0349E 0 +OP4 E0349F 0 +OP4 E034A0 0 +OP4 E034A1 0 +OP4 E034A2 0 +OP4 E034A3 0 +OP4 E034A4 0 +OP4 E034A5 0 +OP4 E034A6 0 +OP4 E034A7 0 +OP4 E034A8 0 +OP4 E034A9 0 +OP4 E034AA 0 +OP4 E034AB 0 +OP4 E034AC 0 +OP4 E034AD 0 +OP4 E034AE 0 +OP4 E034AF 0 +OP4 E034B0 0 +OP4 E034B1 0 +OP4 E034B2 0 +OP4 E034B3 0 +OP4 E034B4 0 +OP4 E034B5 0 +OP4 E034B6 0 +OP4 E034B7 0 +OP4 E034B8 0 +OP4 E034B9 0 +OP4 E034BA 0 +OP4 E034BB 0 +OP4 E034BC 0 +OP4 E034BD 0 +OP4 E034BE 0 +OP4 E034BF 0 +OP4 E034C0 0 +OP4 E034C1 0 +OP4 E034C2 0 +OP4 E034C3 0 +OP4 E034C4 0 +OP4 E034C5 0 +OP4 E034C6 0 +OP4 E034C7 0 +OP4 E034C8 0 +OP4 E034C9 0 +OP4 E034CA 0 +OP4 E034CB 0 +OP4 E034CC 0 +OP4 E034CD 0 +OP4 E034CE 0 +OP4 E034CF 0 +OP4 E034D0 0 +OP4 E034D1 0 +OP4 E034D2 0 +OP4 E034D3 0 +OP4 E034D4 0 +OP4 E034D5 0 +OP4 E034D6 0 +OP4 E034D7 0 +OP4 E034D8 0 +OP4 E034D9 0 +OP4 E034DA 0 +OP4 E034DB 0 +OP4 E034DC 0 +OP4 E034DD 0 +OP4 E034DE 0 +OP4 E034DF 0 +OP4 E034E0 0 +OP4 E034E1 0 +OP4 E034E2 0 +OP4 E034E3 0 +OP4 E034E4 0 +OP4 E034E5 0 +OP4 E034E6 0 +OP4 E034E7 0 +OP4 E034E8 0 +OP4 E034E9 0 +OP4 E034EA 0 +OP4 E034EB 0 +OP4 E034EC 0 +OP4 E034ED 0 +OP4 E034EE 0 +OP4 E034EF 0 +OP4 E034F0 0 +OP4 E034F1 0 +OP4 E034F2 0 +OP4 E034F3 0 +OP4 E034F4 0 +OP4 E034F5 0 +OP4 E034F6 0 +OP4 E034F7 0 +OP4 E034F8 0 +OP4 E034F9 0 +OP4 E034FA 0 +OP4 E034FB 0 +OP4 E034FC 0 +OP4 E034FD 0 +OP4 E034FE 0 +OP4 E034FF 0 +OP4 E03500 0 +OP4 E03501 0 +OP4 E03502 0 +OP4 E03503 0 +OP4 E03504 0 +OP4 E03505 0 +OP4 E03506 0 +OP4 E03507 0 +OP4 E03508 0 +OP4 E03509 0 +OP4 E0350A 0 +OP4 E0350B 0 +OP4 E0350C 0 +OP4 E0350D 0 +OP4 E0350E 0 +OP4 E0350F 0 +OP4 E03510 0 +OP4 E03511 0 +OP4 E03512 0 +OP4 E03513 0 +OP4 E03514 0 +OP4 E03515 0 +OP4 E03516 0 +OP4 E03517 0 +OP4 E03518 0 +OP4 E03519 0 +OP4 E0351A 0 +OP4 E0351B 0 +OP4 E0351C 0 +OP4 E0351D 0 +OP4 E0351E 0 +OP4 E0351F 0 +OP4 E03520 0 +OP4 E03521 0 +OP4 E03522 0 +OP4 E03523 0 +OP4 E03524 0 +OP4 E03525 0 +OP4 E03526 0 +OP4 E03527 0 +OP4 E03528 0 +OP4 E03529 0 +OP4 E0352A 0 +OP4 E0352B 0 +OP4 E0352C 0 +OP4 E0352D 0 +OP4 E0352E 0 +OP4 E0352F 0 +OP4 E03530 0 +OP4 E03531 0 +OP4 E03532 0 +OP4 E03533 0 +OP4 E03534 0 +OP4 E03535 0 +OP4 E03536 0 +OP4 E03537 0 +OP4 E03538 0 +OP4 E03539 0 +OP4 E0353A 0 +OP4 E0353B 0 +OP4 E0353C 0 +OP4 E0353D 0 +OP4 E0353E 0 +OP4 E0353F 0 +OP4 E03540 0 +OP4 E03541 0 +OP4 E03542 0 +OP4 E03543 0 +OP4 E03544 0 +OP4 E03545 0 +OP4 E03546 0 +OP4 E03547 0 +OP4 E03548 0 +OP4 E03549 0 +OP4 E0354A 0 +OP4 E0354B 0 +OP4 E0354C 0 +OP4 E0354D 0 +OP4 E0354E 0 +OP4 E0354F 0 +OP4 E03550 0 +OP4 E03551 0 +OP4 E03552 0 +OP4 E03553 0 +OP4 E03554 0 +OP4 E03555 0 +OP4 E03556 0 +OP4 E03557 0 +OP4 E03558 0 +OP4 E03559 0 +OP4 E0355A 0 +OP4 E0355B 0 +OP4 E0355C 0 +OP4 E0355D 0 +OP4 E0355E 0 +OP4 E0355F 0 +OP4 E03560 0 +OP4 E03561 0 +OP4 E03562 0 +OP4 E03563 0 +OP4 E03564 0 +OP4 E03565 0 +OP4 E03566 0 +OP4 E03567 0 +OP4 E03568 0 +OP4 E03569 0 +OP4 E0356A 0 +OP4 E0356B 0 +OP4 E0356C 0 +OP4 E0356D 0 +OP4 E0356E 0 +OP4 E0356F 0 +OP4 E03570 0 +OP4 E03571 0 +OP4 E03572 0 +OP4 E03573 0 +OP4 E03574 0 +OP4 E03575 0 +OP4 E03576 0 +OP4 E03577 0 +OP4 E03578 0 +OP4 E03579 0 +OP4 E0357A 0 +OP4 E0357B 0 +OP4 E0357C 0 +OP4 E0357D 0 +OP4 E0357E 0 +OP4 E0357F 0 +OP4 E03580 0 +OP4 E03581 0 +OP4 E03582 0 +OP4 E03583 0 +OP4 E03584 0 +OP4 E03585 0 +OP4 E03586 0 +OP4 E03587 0 +OP4 E03588 0 +OP4 E03589 0 +OP4 E0358A 0 +OP4 E0358B 0 +OP4 E0358C 0 +OP4 E0358D 0 +OP4 E0358E 0 +OP4 E0358F 0 +OP4 E03590 0 +OP4 E03591 0 +OP4 E03592 0 +OP4 E03593 0 +OP4 E03594 0 +OP4 E03595 0 +OP4 E03596 0 +OP4 E03597 0 +OP4 E03598 0 +OP4 E03599 0 +OP4 E0359A 0 +OP4 E0359B 0 +OP4 E0359C 0 +OP4 E0359D 0 +OP4 E0359E 0 +OP4 E0359F 0 +OP4 E035A0 0 +OP4 E035A1 0 +OP4 E035A2 0 +OP4 E035A3 0 +OP4 E035A4 0 +OP4 E035A5 0 +OP4 E035A6 0 +OP4 E035A7 0 +OP4 E035A8 0 +OP4 E035A9 0 +OP4 E035AA 0 +OP4 E035AB 0 +OP4 E035AC 0 +OP4 E035AD 0 +OP4 E035AE 0 +OP4 E035AF 0 +OP4 E035B0 0 +OP4 E035B1 0 +OP4 E035B2 0 +OP4 E035B3 0 +OP4 E035B4 0 +OP4 E035B5 0 +OP4 E035B6 0 +OP4 E035B7 0 +OP4 E035B8 0 +OP4 E035B9 0 +OP4 E035BA 0 +OP4 E035BB 0 +OP4 E035BC 0 +OP4 E035BD 0 +OP4 E035BE 0 +OP4 E035BF 0 +OP4 E035C0 0 +OP4 E035C1 0 +OP4 E035C2 0 +OP4 E035C3 0 +OP4 E035C4 0 +OP4 E035C5 0 +OP4 E035C6 0 +OP4 E035C7 0 +OP4 E035C8 0 +OP4 E035C9 0 +OP4 E035CA 0 +OP4 E035CB 0 +OP4 E035CC 0 +OP4 E035CD 0 +OP4 E035CE 0 +OP4 E035CF 0 +OP4 E035D0 0 +OP4 E035D1 0 +OP4 E035D2 0 +OP4 E035D3 0 +OP4 E035D4 0 +OP4 E035D5 0 +OP4 E035D6 0 +OP4 E035D7 0 +OP4 E035D8 0 +OP4 E035D9 0 +OP4 E035DA 0 +OP4 E035DB 0 +OP4 E035DC 0 +OP4 E035DD 0 +OP4 E035DE 0 +OP4 E035DF 0 +OP4 E035E0 0 +OP4 E035E1 0 +OP4 E035E2 0 +OP4 E035E3 0 +OP4 E035E4 0 +OP4 E035E5 0 +OP4 E035E6 0 +OP4 E035E7 0 +OP4 E035E8 0 +OP4 E035E9 0 +OP4 E035EA 0 +OP4 E035EB 0 +OP4 E035EC 0 +OP4 E035ED 0 +OP4 E035EE 0 +OP4 E035EF 0 +OP4 E035F0 0 +OP4 E035F1 0 +OP4 E035F2 0 +OP4 E035F3 0 +OP4 E035F4 0 +OP4 E035F5 0 +OP4 E035F6 0 +OP4 E035F7 0 +OP4 E035F8 0 +OP4 E035F9 0 +OP4 E035FA 0 +OP4 E035FB 0 +OP4 E035FC 0 +OP4 E035FD 0 +OP4 E035FE 0 +OP4 E035FF 0 +OP4 E03600 0 +OP4 E03601 0 +OP4 E03602 0 +OP4 E03603 0 +OP4 E03604 0 +OP4 E03605 0 +OP4 E03606 0 +OP4 E03607 0 +OP4 E03608 0 +OP4 E03609 0 +OP4 E0360A 0 +OP4 E0360B 0 +OP4 E0360C 0 +OP4 E0360D 0 +OP4 E0360E 0 +OP4 E0360F 0 +OP4 E03610 0 +OP4 E03611 0 +OP4 E03612 0 +OP4 E03613 0 +OP4 E03614 0 +OP4 E03615 0 +OP4 E03616 0 +OP4 E03617 0 +OP4 E03618 0 +OP4 E03619 0 +OP4 E0361A 0 +OP4 E0361B 0 +OP4 E0361C 0 +OP4 E0361D 0 +OP4 E0361E 0 +OP4 E0361F 0 +OP4 E03620 0 +OP4 E03621 0 +OP4 E03622 0 +OP4 E03623 0 +OP4 E03624 0 +OP4 E03625 0 +OP4 E03626 0 +OP4 E03627 0 +OP4 E03628 0 +OP4 E03629 0 +OP4 E0362A 0 +OP4 E0362B 0 +OP4 E0362C 0 +OP4 E0362D 0 +OP4 E0362E 0 +OP4 E0362F 0 +OP4 E03630 0 +OP4 E03631 0 +OP4 E03632 0 +OP4 E03633 0 +OP4 E03634 0 +OP4 E03635 0 +OP4 E03636 0 +OP4 E03637 0 +OP4 E03638 0 +OP4 E03639 0 +OP4 E0363A 0 +OP4 E0363B 0 +OP4 E0363C 0 +OP4 E0363D 0 +OP4 E0363E 0 +OP4 E0363F 0 +OP4 E03640 0 +OP4 E03641 0 +OP4 E03642 0 +OP4 E03643 0 +OP4 E03644 0 +OP4 E03645 0 +OP4 E03646 0 +OP4 E03647 0 +OP4 E03648 0 +OP4 E03649 0 +OP4 E0364A 0 +OP4 E0364B 0 +OP4 E0364C 0 +OP4 E0364D 0 +OP4 E0364E 0 +OP4 E0364F 0 +OP4 E03650 0 +OP4 E03651 0 +OP4 E03652 0 +OP4 E03653 0 +OP4 E03654 0 +OP4 E03655 0 +OP4 E03656 0 +OP4 E03657 0 +OP4 E03658 0 +OP4 E03659 0 +OP4 E0365A 0 +OP4 E0365B 0 +OP4 E0365C 0 +OP4 E0365D 0 +OP4 E0365E 0 +OP4 E0365F 0 +OP4 E03660 0 +OP4 E03661 0 +OP4 E03662 0 +OP4 E03663 0 +OP4 E03664 0 +OP4 E03665 0 +OP4 E03666 0 +OP4 E03667 0 +OP4 E03668 0 +OP4 E03669 0 +OP4 E0366A 0 +OP4 E0366B 0 +OP4 E0366C 0 +OP4 E0366D 0 +OP4 E0366E 0 +OP4 E0366F 0 +OP4 E03670 0 +OP4 E03671 0 +OP4 E03672 0 +OP4 E03673 0 +OP4 E03674 0 +OP4 E03675 0 +OP4 E03676 0 +OP4 E03677 0 +OP4 E03678 0 +OP4 E03679 0 +OP4 E0367A 0 +OP4 E0367B 0 +OP4 E0367C 0 +OP4 E0367D 0 +OP4 E0367E 0 +OP4 E0367F 0 +OP4 E03680 0 +OP4 E03681 0 +OP4 E03682 0 +OP4 E03683 0 +OP4 E03684 0 +OP4 E03685 0 +OP4 E03686 0 +OP4 E03687 0 +OP4 E03688 0 +OP4 E03689 0 +OP4 E0368A 0 +OP4 E0368B 0 +OP4 E0368C 0 +OP4 E0368D 0 +OP4 E0368E 0 +OP4 E0368F 0 +OP4 E03690 0 +OP4 E03691 0 +OP4 E03692 0 +OP4 E03693 0 +OP4 E03694 0 +OP4 E03695 0 +OP4 E03696 0 +OP4 E03697 0 +OP4 E03698 0 +OP4 E03699 0 +OP4 E0369A 0 +OP4 E0369B 0 +OP4 E0369C 0 +OP4 E0369D 0 +OP4 E0369E 0 +OP4 E0369F 0 +OP4 E036A0 0 +OP4 E036A1 0 +OP4 E036A2 0 +OP4 E036A3 0 +OP4 E036A4 0 +OP4 E036A5 0 +OP4 E036A6 0 +OP4 E036A7 0 +OP4 E036A8 0 +OP4 E036A9 0 +OP4 E036AA 0 +OP4 E036AB 0 +OP4 E036AC 0 +OP4 E036AD 0 +OP4 E036AE 0 +OP4 E036AF 0 +OP4 E036B0 0 +OP4 E036B1 0 +OP4 E036B2 0 +OP4 E036B3 0 +OP4 E036B4 0 +OP4 E036B5 0 +OP4 E036B6 0 +OP4 E036B7 0 +OP4 E036B8 0 +OP4 E036B9 0 +OP4 E036BA 0 +OP4 E036BB 0 +OP4 E036BC 0 +OP4 E036BD 0 +OP4 E036BE 0 +OP4 E036BF 0 +OP4 E036C0 0 +OP4 E036C1 0 +OP4 E036C2 0 +OP4 E036C3 0 +OP4 E036C4 0 +OP4 E036C5 0 +OP4 E036C6 0 +OP4 E036C7 0 +OP4 E036C8 0 +OP4 E036C9 0 +OP4 E036CA 0 +OP4 E036CB 0 +OP4 E036CC 0 +OP4 E036CD 0 +OP4 E036CE 0 +OP4 E036CF 0 +OP4 E036D0 0 +OP4 E036D1 0 +OP4 E036D2 0 +OP4 E036D3 0 +OP4 E036D4 0 +OP4 E036D5 0 +OP4 E036D6 0 +OP4 E036D7 0 +OP4 E036D8 0 +OP4 E036D9 0 +OP4 E036DA 0 +OP4 E036DB 0 +OP4 E036DC 0 +OP4 E036DD 0 +OP4 E036DE 0 +OP4 E036DF 0 +OP4 E036E0 0 +OP4 E036E1 0 +OP4 E036E2 0 +OP4 E036E3 0 +OP4 E036E4 0 +OP4 E036E5 0 +OP4 E036E6 0 +OP4 E036E7 0 +OP4 E036E8 0 +OP4 E036E9 0 +OP4 E036EA 0 +OP4 E036EB 0 +OP4 E036EC 0 +OP4 E036ED 0 +OP4 E036EE 0 +OP4 E036EF 0 +OP4 E036F0 0 +OP4 E036F1 0 +OP4 E036F2 0 +OP4 E036F3 0 +OP4 E036F4 0 +OP4 E036F5 0 +OP4 E036F6 0 +OP4 E036F7 0 +OP4 E036F8 0 +OP4 E036F9 0 +OP4 E036FA 0 +OP4 E036FB 0 +OP4 E036FC 0 +OP4 E036FD 0 +OP4 E036FE 0 +OP4 E036FF 0 +OP4 E03700 0 +OP4 E03701 0 +OP4 E03702 0 +OP4 E03703 0 +OP4 E03704 0 +OP4 E03705 0 +OP4 E03706 0 +OP4 E03707 0 +OP4 E03708 0 +OP4 E03709 0 +OP4 E0370A 0 +OP4 E0370B 0 +OP4 E0370C 0 +OP4 E0370D 0 +OP4 E0370E 0 +OP4 E0370F 0 +OP4 E03710 0 +OP4 E03711 0 +OP4 E03712 0 +OP4 E03713 0 +OP4 E03714 0 +OP4 E03715 0 +OP4 E03716 0 +OP4 E03717 0 +OP4 E03718 0 +OP4 E03719 0 +OP4 E0371A 0 +OP4 E0371B 0 +OP4 E0371C 0 +OP4 E0371D 0 +OP4 E0371E 0 +OP4 E0371F 0 +OP4 E03720 0 +OP4 E03721 0 +OP4 E03722 0 +OP4 E03723 0 +OP4 E03724 0 +OP4 E03725 0 +OP4 E03726 0 +OP4 E03727 0 +OP4 E03728 0 +OP4 E03729 0 +OP4 E0372A 0 +OP4 E0372B 0 +OP4 E0372C 0 +OP4 E0372D 0 +OP4 E0372E 0 +OP4 E0372F 0 +OP4 E03730 0 +OP4 E03731 0 +OP4 E03732 0 +OP4 E03733 0 +OP4 E03734 0 +OP4 E03735 0 +OP4 E03736 0 +OP4 E03737 0 +OP4 E03738 0 +OP4 E03739 0 +OP4 E0373A 0 +OP4 E0373B 0 +OP4 E0373C 0 +OP4 E0373D 0 +OP4 E0373E 0 +OP4 E0373F 0 +OP4 E03740 0 +OP4 E03741 0 +OP4 E03742 0 +OP4 E03743 0 +OP4 E03744 0 +OP4 E03745 0 +OP4 E03746 0 +OP4 E03747 0 +OP4 E03748 0 +OP4 E03749 0 +OP4 E0374A 0 +OP4 E0374B 0 +OP4 E0374C 0 +OP4 E0374D 0 +OP4 E0374E 0 +OP4 E0374F 0 +OP4 E03750 0 +OP4 E03751 0 +OP4 E03752 0 +OP4 E03753 0 +OP4 E03754 0 +OP4 E03755 0 +OP4 E03756 0 +OP4 E03757 0 +OP4 E03758 0 +OP4 E03759 0 +OP4 E0375A 0 +OP4 E0375B 0 +OP4 E0375C 0 +OP4 E0375D 0 +OP4 E0375E 0 +OP4 E0375F 0 +OP4 E03760 0 +OP4 E03761 0 +OP4 E03762 0 +OP4 E03763 0 +OP4 E03764 0 +OP4 E03765 0 +OP4 E03766 0 +OP4 E03767 0 +OP4 E03768 0 +OP4 E03769 0 +OP4 E0376A 0 +OP4 E0376B 0 +OP4 E0376C 0 +OP4 E0376D 0 +OP4 E0376E 0 +OP4 E0376F 0 +OP4 E03770 0 +OP4 E03771 0 +OP4 E03772 0 +OP4 E03773 0 +OP4 E03774 0 +OP4 E03775 0 +OP4 E03776 0 +OP4 E03777 0 +OP4 E03778 0 +OP4 E03779 0 +OP4 E0377A 0 +OP4 E0377B 0 +OP4 E0377C 0 +OP4 E0377D 0 +OP4 E0377E 0 +OP4 E0377F 0 +OP4 E03780 0 +OP4 E03781 0 +OP4 E03782 0 +OP4 E03783 0 +OP4 E03784 0 +OP4 E03785 0 +OP4 E03786 0 +OP4 E03787 0 +OP4 E03788 0 +OP4 E03789 0 +OP4 E0378A 0 +OP4 E0378B 0 +OP4 E0378C 0 +OP4 E0378D 0 +OP4 E0378E 0 +OP4 E0378F 0 +OP4 E03790 0 +OP4 E03791 0 +OP4 E03792 0 +OP4 E03793 0 +OP4 E03794 0 +OP4 E03795 0 +OP4 E03796 0 +OP4 E03797 0 +OP4 E03798 0 +OP4 E03799 0 +OP4 E0379A 0 +OP4 E0379B 0 +OP4 E0379C 0 +OP4 E0379D 0 +OP4 E0379E 0 +OP4 E0379F 0 +OP4 E037A0 0 +OP4 E037A1 0 +OP4 E037A2 0 +OP4 E037A3 0 +OP4 E037A4 0 +OP4 E037A5 0 +OP4 E037A6 0 +OP4 E037A7 0 +OP4 E037A8 0 +OP4 E037A9 0 +OP4 E037AA 0 +OP4 E037AB 0 +OP4 E037AC 0 +OP4 E037AD 0 +OP4 E037AE 0 +OP4 E037AF 0 +OP4 E037B0 0 +OP4 E037B1 0 +OP4 E037B2 0 +OP4 E037B3 0 +OP4 E037B4 0 +OP4 E037B5 0 +OP4 E037B6 0 +OP4 E037B7 0 +OP4 E037B8 0 +OP4 E037B9 0 +OP4 E037BA 0 +OP4 E037BB 0 +OP4 E037BC 0 +OP4 E037BD 0 +OP4 E037BE 0 +OP4 E037BF 0 +OP4 E037C0 0 +OP4 E037C1 0 +OP4 E037C2 0 +OP4 E037C3 0 +OP4 E037C4 0 +OP4 E037C5 0 +OP4 E037C6 0 +OP4 E037C7 0 +OP4 E037C8 0 +OP4 E037C9 0 +OP4 E037CA 0 +OP4 E037CB 0 +OP4 E037CC 0 +OP4 E037CD 0 +OP4 E037CE 0 +OP4 E037CF 0 +OP4 E037D0 0 +OP4 E037D1 0 +OP4 E037D2 0 +OP4 E037D3 0 +OP4 E037D4 0 +OP4 E037D5 0 +OP4 E037D6 0 +OP4 E037D7 0 +OP4 E037D8 0 +OP4 E037D9 0 +OP4 E037DA 0 +OP4 E037DB 0 +OP4 E037DC 0 +OP4 E037DD 0 +OP4 E037DE 0 +OP4 E037DF 0 +OP4 E037E0 0 +OP4 E037E1 0 +OP4 E037E2 0 +OP4 E037E3 0 +OP4 E037E4 0 +OP4 E037E5 0 +OP4 E037E6 0 +OP4 E037E7 0 +OP4 E037E8 0 +OP4 E037E9 0 +OP4 E037EA 0 +OP4 E037EB 0 +OP4 E037EC 0 +OP4 E037ED 0 +OP4 E037EE 0 +OP4 E037EF 0 +OP4 E037F0 0 +OP4 E037F1 0 +OP4 E037F2 0 +OP4 E037F3 0 +OP4 E037F4 0 +OP4 E037F5 0 +OP4 E037F6 0 +OP4 E037F7 0 +OP4 E037F8 0 +OP4 E037F9 0 +OP4 E037FA 0 +OP4 E037FB 0 +OP4 E037FC 0 +OP4 E037FD 0 +OP4 E037FE 0 +OP4 E037FF 0 +OP4 E03800 0 +OP4 E03801 0 +OP4 E03802 0 +OP4 E03803 0 +OP4 E03804 0 +OP4 E03805 0 +OP4 E03806 0 +OP4 E03807 0 +OP4 E03808 0 +OP4 E03809 0 +OP4 E0380A 0 +OP4 E0380B 0 +OP4 E0380C 0 +OP4 E0380D 0 +OP4 E0380E 0 +OP4 E0380F 0 +OP4 E03810 0 +OP4 E03811 0 +OP4 E03812 0 +OP4 E03813 0 +OP4 E03814 0 +OP4 E03815 0 +OP4 E03816 0 +OP4 E03817 0 +OP4 E03818 0 +OP4 E03819 0 +OP4 E0381A 0 +OP4 E0381B 0 +OP4 E0381C 0 +OP4 E0381D 0 +OP4 E0381E 0 +OP4 E0381F 0 +OP4 E03820 0 +OP4 E03821 0 +OP4 E03822 0 +OP4 E03823 0 +OP4 E03824 0 +OP4 E03825 0 +OP4 E03826 0 +OP4 E03827 0 +OP4 E03828 0 +OP4 E03829 0 +OP4 E0382A 0 +OP4 E0382B 0 +OP4 E0382C 0 +OP4 E0382D 0 +OP4 E0382E 0 +OP4 E0382F 0 +OP4 E03830 0 +OP4 E03831 0 +OP4 E03832 0 +OP4 E03833 0 +OP4 E03834 0 +OP4 E03835 0 +OP4 E03836 0 +OP4 E03837 0 +OP4 E03838 0 +OP4 E03839 0 +OP4 E0383A 0 +OP4 E0383B 0 +OP4 E0383C 0 +OP4 E0383D 0 +OP4 E0383E 0 +OP4 E0383F 0 +OP4 E03840 0 +OP4 E03841 0 +OP4 E03842 0 +OP4 E03843 0 +OP4 E03844 0 +OP4 E03845 0 +OP4 E03846 0 +OP4 E03847 0 +OP4 E03848 0 +OP4 E03849 0 +OP4 E0384A 0 +OP4 E0384B 0 +OP4 E0384C 0 +OP4 E0384D 0 +OP4 E0384E 0 +OP4 E0384F 0 +OP4 E03850 0 +OP4 E03851 0 +OP4 E03852 0 +OP4 E03853 0 +OP4 E03854 0 +OP4 E03855 0 +OP4 E03856 0 +OP4 E03857 0 +OP4 E03858 0 +OP4 E03859 0 +OP4 E0385A 0 +OP4 E0385B 0 +OP4 E0385C 0 +OP4 E0385D 0 +OP4 E0385E 0 +OP4 E0385F 0 +OP4 E03860 0 +OP4 E03861 0 +OP4 E03862 0 +OP4 E03863 0 +OP4 E03864 0 +OP4 E03865 0 +OP4 E03866 0 +OP4 E03867 0 +OP4 E03868 0 +OP4 E03869 0 +OP4 E0386A 0 +OP4 E0386B 0 +OP4 E0386C 0 +OP4 E0386D 0 +OP4 E0386E 0 +OP4 E0386F 0 +OP4 E03870 0 +OP4 E03871 0 +OP4 E03872 0 +OP4 E03873 0 +OP4 E03874 0 +OP4 E03875 0 +OP4 E03876 0 +OP4 E03877 0 +OP4 E03878 0 +OP4 E03879 0 +OP4 E0387A 0 +OP4 E0387B 0 +OP4 E0387C 0 +OP4 E0387D 0 +OP4 E0387E 0 +OP4 E0387F 0 +OP4 E03880 0 +OP4 E03881 0 +OP4 E03882 0 +OP4 E03883 0 +OP4 E03884 0 +OP4 E03885 0 +OP4 E03886 0 +OP4 E03887 0 +OP4 E03888 0 +OP4 E03889 0 +OP4 E0388A 0 +OP4 E0388B 0 +OP4 E0388C 0 +OP4 E0388D 0 +OP4 E0388E 0 +OP4 E0388F 0 +OP4 E03890 0 +OP4 E03891 0 +OP4 E03892 0 +OP4 E03893 0 +OP4 E03894 0 +OP4 E03895 0 +OP4 E03896 0 +OP4 E03897 0 +OP4 E03898 0 +OP4 E03899 0 +OP4 E0389A 0 +OP4 E0389B 0 +OP4 E0389C 0 +OP4 E0389D 0 +OP4 E0389E 0 +OP4 E0389F 0 +OP4 E038A0 0 +OP4 E038A1 0 +OP4 E038A2 0 +OP4 E038A3 0 +OP4 E038A4 0 +OP4 E038A5 0 +OP4 E038A6 0 +OP4 E038A7 0 +OP4 E038A8 0 +OP4 E038A9 0 +OP4 E038AA 0 +OP4 E038AB 0 +OP4 E038AC 0 +OP4 E038AD 0 +OP4 E038AE 0 +OP4 E038AF 0 +OP4 E038B0 0 +OP4 E038B1 0 +OP4 E038B2 0 +OP4 E038B3 0 +OP4 E038B4 0 +OP4 E038B5 0 +OP4 E038B6 0 +OP4 E038B7 0 +OP4 E038B8 0 +OP4 E038B9 0 +OP4 E038BA 0 +OP4 E038BB 0 +OP4 E038BC 0 +OP4 E038BD 0 +OP4 E038BE 0 +OP4 E038BF 0 +OP4 E038C0 0 +OP4 E038C1 0 +OP4 E038C2 0 +OP4 E038C3 0 +OP4 E038C4 0 +OP4 E038C5 0 +OP4 E038C6 0 +OP4 E038C7 0 +OP4 E038C8 0 +OP4 E038C9 0 +OP4 E038CA 0 +OP4 E038CB 0 +OP4 E038CC 0 +OP4 E038CD 0 +OP4 E038CE 0 +OP4 E038CF 0 +OP4 E038D0 0 +OP4 E038D1 0 +OP4 E038D2 0 +OP4 E038D3 0 +OP4 E038D4 0 +OP4 E038D5 0 +OP4 E038D6 0 +OP4 E038D7 0 +OP4 E038D8 0 +OP4 E038D9 0 +OP4 E038DA 0 +OP4 E038DB 0 +OP4 E038DC 0 +OP4 E038DD 0 +OP4 E038DE 0 +OP4 E038DF 0 +OP4 E038E0 0 +OP4 E038E1 0 +OP4 E038E2 0 +OP4 E038E3 0 +OP4 E038E4 0 +OP4 E038E5 0 +OP4 E038E6 0 +OP4 E038E7 0 +OP4 E038E8 0 +OP4 E038E9 0 +OP4 E038EA 0 +OP4 E038EB 0 +OP4 E038EC 0 +OP4 E038ED 0 +OP4 E038EE 0 +OP4 E038EF 0 +OP4 E038F0 0 +OP4 E038F1 0 +OP4 E038F2 0 +OP4 E038F3 0 +OP4 E038F4 0 +OP4 E038F5 0 +OP4 E038F6 0 +OP4 E038F7 0 +OP4 E038F8 0 +OP4 E038F9 0 +OP4 E038FA 0 +OP4 E038FB 0 +OP4 E038FC 0 +OP4 E038FD 0 +OP4 E038FE 0 +OP4 E038FF 0 +OP4 E03900 0 +OP4 E03901 0 +OP4 E03902 0 +OP4 E03903 0 +OP4 E03904 0 +OP4 E03905 0 +OP4 E03906 0 +OP4 E03907 0 +OP4 E03908 0 +OP4 E03909 0 +OP4 E0390A 0 +OP4 E0390B 0 +OP4 E0390C 0 +OP4 E0390D 0 +OP4 E0390E 0 +OP4 E0390F 0 +OP4 E03910 0 +OP4 E03911 0 +OP4 E03912 0 +OP4 E03913 0 +OP4 E03914 0 +OP4 E03915 0 +OP4 E03916 0 +OP4 E03917 0 +OP4 E03918 0 +OP4 E03919 0 +OP4 E0391A 0 +OP4 E0391B 0 +OP4 E0391C 0 +OP4 E0391D 0 +OP4 E0391E 0 +OP4 E0391F 0 +OP4 E03920 0 +OP4 E03921 0 +OP4 E03922 0 +OP4 E03923 0 +OP4 E03924 0 +OP4 E03925 0 +OP4 E03926 0 +OP4 E03927 0 +OP4 E03928 0 +OP4 E03929 0 +OP4 E0392A 0 +OP4 E0392B 0 +OP4 E0392C 0 +OP4 E0392D 0 +OP4 E0392E 0 +OP4 E0392F 0 +OP4 E03930 0 +OP4 E03931 0 +OP4 E03932 0 +OP4 E03933 0 +OP4 E03934 0 +OP4 E03935 0 +OP4 E03936 0 +OP4 E03937 0 +OP4 E03938 0 +OP4 E03939 0 +OP4 E0393A 0 +OP4 E0393B 0 +OP4 E0393C 0 +OP4 E0393D 0 +OP4 E0393E 0 +OP4 E0393F 0 +OP4 E03940 0 +OP4 E03941 0 +OP4 E03942 0 +OP4 E03943 0 +OP4 E03944 0 +OP4 E03945 0 +OP4 E03946 0 +OP4 E03947 0 +OP4 E03948 0 +OP4 E03949 0 +OP4 E0394A 0 +OP4 E0394B 0 +OP4 E0394C 0 +OP4 E0394D 0 +OP4 E0394E 0 +OP4 E0394F 0 +OP4 E03950 0 +OP4 E03951 0 +OP4 E03952 0 +OP4 E03953 0 +OP4 E03954 0 +OP4 E03955 0 +OP4 E03956 0 +OP4 E03957 0 +OP4 E03958 0 +OP4 E03959 0 +OP4 E0395A 0 +OP4 E0395B 0 +OP4 E0395C 0 +OP4 E0395D 0 +OP4 E0395E 0 +OP4 E0395F 0 +OP4 E03960 0 +OP4 E03961 0 +OP4 E03962 0 +OP4 E03963 0 +OP4 E03964 0 +OP4 E03965 0 +OP4 E03966 0 +OP4 E03967 0 +OP4 E03968 0 +OP4 E03969 0 +OP4 E0396A 0 +OP4 E0396B 0 +OP4 E0396C 0 +OP4 E0396D 0 +OP4 E0396E 0 +OP4 E0396F 0 +OP4 E03970 0 +OP4 E03971 0 +OP4 E03972 0 +OP4 E03973 0 +OP4 E03974 0 +OP4 E03975 0 +OP4 E03976 0 +OP4 E03977 0 +OP4 E03978 0 +OP4 E03979 0 +OP4 E0397A 0 +OP4 E0397B 0 +OP4 E0397C 0 +OP4 E0397D 0 +OP4 E0397E 0 +OP4 E0397F 0 +OP4 E03980 0 +OP4 E03981 0 +OP4 E03982 0 +OP4 E03983 0 +OP4 E03984 0 +OP4 E03985 0 +OP4 E03986 0 +OP4 E03987 0 +OP4 E03988 0 +OP4 E03989 0 +OP4 E0398A 0 +OP4 E0398B 0 +OP4 E0398C 0 +OP4 E0398D 0 +OP4 E0398E 0 +OP4 E0398F 0 +OP4 E03990 0 +OP4 E03991 0 +OP4 E03992 0 +OP4 E03993 0 +OP4 E03994 0 +OP4 E03995 0 +OP4 E03996 0 +OP4 E03997 0 +OP4 E03998 0 +OP4 E03999 0 +OP4 E0399A 0 +OP4 E0399B 0 +OP4 E0399C 0 +OP4 E0399D 0 +OP4 E0399E 0 +OP4 E0399F 0 +OP4 E039A0 0 +OP4 E039A1 0 +OP4 E039A2 0 +OP4 E039A3 0 +OP4 E039A4 0 +OP4 E039A5 0 +OP4 E039A6 0 +OP4 E039A7 0 +OP4 E039A8 0 +OP4 E039A9 0 +OP4 E039AA 0 +OP4 E039AB 0 +OP4 E039AC 0 +OP4 E039AD 0 +OP4 E039AE 0 +OP4 E039AF 0 +OP4 E039B0 0 +OP4 E039B1 0 +OP4 E039B2 0 +OP4 E039B3 0 +OP4 E039B4 0 +OP4 E039B5 0 +OP4 E039B6 0 +OP4 E039B7 0 +OP4 E039B8 0 +OP4 E039B9 0 +OP4 E039BA 0 +OP4 E039BB 0 +OP4 E039BC 0 +OP4 E039BD 0 +OP4 E039BE 0 +OP4 E039BF 0 +OP4 E039C0 0 +OP4 E039C1 0 +OP4 E039C2 0 +OP4 E039C3 0 +OP4 E039C4 0 +OP4 E039C5 0 +OP4 E039C6 0 +OP4 E039C7 0 +OP4 E039C8 0 +OP4 E039C9 0 +OP4 E039CA 0 +OP4 E039CB 0 +OP4 E039CC 0 +OP4 E039CD 0 +OP4 E039CE 0 +OP4 E039CF 0 +OP4 E039D0 0 +OP4 E039D1 0 +OP4 E039D2 0 +OP4 E039D3 0 +OP4 E039D4 0 +OP4 E039D5 0 +OP4 E039D6 0 +OP4 E039D7 0 +OP4 E039D8 0 +OP4 E039D9 0 +OP4 E039DA 0 +OP4 E039DB 0 +OP4 E039DC 0 +OP4 E039DD 0 +OP4 E039DE 0 +OP4 E039DF 0 +OP4 E039E0 0 +OP4 E039E1 0 +OP4 E039E2 0 +OP4 E039E3 0 +OP4 E039E4 0 +OP4 E039E5 0 +OP4 E039E6 0 +OP4 E039E7 0 +OP4 E039E8 0 +OP4 E039E9 0 +OP4 E039EA 0 +OP4 E039EB 0 +OP4 E039EC 0 +OP4 E039ED 0 +OP4 E039EE 0 +OP4 E039EF 0 +OP4 E039F0 0 +OP4 E039F1 0 +OP4 E039F2 0 +OP4 E039F3 0 +OP4 E039F4 0 +OP4 E039F5 0 +OP4 E039F6 0 +OP4 E039F7 0 +OP4 E039F8 0 +OP4 E039F9 0 +OP4 E039FA 0 +OP4 E039FB 0 +OP4 E039FC 0 +OP4 E039FD 0 +OP4 E039FE 0 +OP4 E039FF 0 +OP4 E03A00 0 +OP4 E03A01 0 +OP4 E03A02 0 +OP4 E03A03 0 +OP4 E03A04 0 +OP4 E03A05 0 +OP4 E03A06 0 +OP4 E03A07 0 +OP4 E03A08 0 +OP4 E03A09 0 +OP4 E03A0A 0 +OP4 E03A0B 0 +OP4 E03A0C 0 +OP4 E03A0D 0 +OP4 E03A0E 0 +OP4 E03A0F 0 +OP4 E03A10 0 +OP4 E03A11 0 +OP4 E03A12 0 +OP4 E03A13 0 +OP4 E03A14 0 +OP4 E03A15 0 +OP4 E03A16 0 +OP4 E03A17 0 +OP4 E03A18 0 +OP4 E03A19 0 +OP4 E03A1A 0 +OP4 E03A1B 0 +OP4 E03A1C 0 +OP4 E03A1D 0 +OP4 E03A1E 0 +OP4 E03A1F 0 +OP4 E03A20 0 +OP4 E03A21 0 +OP4 E03A22 0 +OP4 E03A23 0 +OP4 E03A24 0 +OP4 E03A25 0 +OP4 E03A26 0 +OP4 E03A27 0 +OP4 E03A28 0 +OP4 E03A29 0 +OP4 E03A2A 0 +OP4 E03A2B 0 +OP4 E03A2C 0 +OP4 E03A2D 0 +OP4 E03A2E 0 +OP4 E03A2F 0 +OP4 E03A30 0 +OP4 E03A31 0 +OP4 E03A32 0 +OP4 E03A33 0 +OP4 E03A34 0 +OP4 E03A35 0 +OP4 E03A36 0 +OP4 E03A37 0 +OP4 E03A38 0 +OP4 E03A39 0 +OP4 E03A3A 0 +OP4 E03A3B 0 +OP4 E03A3C 0 +OP4 E03A3D 0 +OP4 E03A3E 0 +OP4 E03A3F 0 +OP4 E03A40 0 +OP4 E03A41 0 +OP4 E03A42 0 +OP4 E03A43 0 +OP4 E03A44 0 +OP4 E03A45 0 +OP4 E03A46 0 +OP4 E03A47 0 +OP4 E03A48 0 +OP4 E03A49 0 +OP4 E03A4A 0 +OP4 E03A4B 0 +OP4 E03A4C 0 +OP4 E03A4D 0 +OP4 E03A4E 0 +OP4 E03A4F 0 +OP4 E03A50 0 +OP4 E03A51 0 +OP4 E03A52 0 +OP4 E03A53 0 +OP4 E03A54 0 +OP4 E03A55 0 +OP4 E03A56 0 +OP4 E03A57 0 +OP4 E03A58 0 +OP4 E03A59 0 +OP4 E03A5A 0 +OP4 E03A5B 0 +OP4 E03A5C 0 +OP4 E03A5D 0 +OP4 E03A5E 0 +OP4 E03A5F 0 +OP4 E03A60 0 +OP4 E03A61 0 +OP4 E03A62 0 +OP4 E03A63 0 +OP4 E03A64 0 +OP4 E03A65 0 +OP4 E03A66 0 +OP4 E03A67 0 +OP4 E03A68 0 +OP4 E03A69 0 +OP4 E03A6A 0 +OP4 E03A6B 0 +OP4 E03A6C 0 +OP4 E03A6D 0 +OP4 E03A6E 0 +OP4 E03A6F 0 +OP4 E03A70 0 +OP4 E03A71 0 +OP4 E03A72 0 +OP4 E03A73 0 +OP4 E03A74 0 +OP4 E03A75 0 +OP4 E03A76 0 +OP4 E03A77 0 +OP4 E03A78 0 +OP4 E03A79 0 +OP4 E03A7A 0 +OP4 E03A7B 0 +OP4 E03A7C 0 +OP4 E03A7D 0 +OP4 E03A7E 0 +OP4 E03A7F 0 +OP4 E03A80 0 +OP4 E03A81 0 +OP4 E03A82 0 +OP4 E03A83 0 +OP4 E03A84 0 +OP4 E03A85 0 +OP4 E03A86 0 +OP4 E03A87 0 +OP4 E03A88 0 +OP4 E03A89 0 +OP4 E03A8A 0 +OP4 E03A8B 0 +OP4 E03A8C 0 +OP4 E03A8D 0 +OP4 E03A8E 0 +OP4 E03A8F 0 +OP4 E03A90 0 +OP4 E03A91 0 +OP4 E03A92 0 +OP4 E03A93 0 +OP4 E03A94 0 +OP4 E03A95 0 +OP4 E03A96 0 +OP4 E03A97 0 +OP4 E03A98 0 +OP4 E03A99 0 +OP4 E03A9A 0 +OP4 E03A9B 0 +OP4 E03A9C 0 +OP4 E03A9D 0 +OP4 E03A9E 0 +OP4 E03A9F 0 +OP4 E03AA0 0 +OP4 E03AA1 0 +OP4 E03AA2 0 +OP4 E03AA3 0 +OP4 E03AA4 0 +OP4 E03AA5 0 +OP4 E03AA6 0 +OP4 E03AA7 0 +OP4 E03AA8 0 +OP4 E03AA9 0 +OP4 E03AAA 0 +OP4 E03AAB 0 +OP4 E03AAC 0 +OP4 E03AAD 0 +OP4 E03AAE 0 +OP4 E03AAF 0 +OP4 E03AB0 0 +OP4 E03AB1 0 +OP4 E03AB2 0 +OP4 E03AB3 0 +OP4 E03AB4 0 +OP4 E03AB5 0 +OP4 E03AB6 0 +OP4 E03AB7 0 +OP4 E03AB8 0 +OP4 E03AB9 0 +OP4 E03ABA 0 +OP4 E03ABB 0 +OP4 E03ABC 0 +OP4 E03ABD 0 +OP4 E03ABE 0 +OP4 E03ABF 0 +OP4 E03AC0 0 +OP4 E03AC1 0 +OP4 E03AC2 0 +OP4 E03AC3 0 +OP4 E03AC4 0 +OP4 E03AC5 0 +OP4 E03AC6 0 +OP4 E03AC7 0 +OP4 E03AC8 0 +OP4 E03AC9 0 +OP4 E03ACA 0 +OP4 E03ACB 0 +OP4 E03ACC 0 +OP4 E03ACD 0 +OP4 E03ACE 0 +OP4 E03ACF 0 +OP4 E03AD0 0 +OP4 E03AD1 0 +OP4 E03AD2 0 +OP4 E03AD3 0 +OP4 E03AD4 0 +OP4 E03AD5 0 +OP4 E03AD6 0 +OP4 E03AD7 0 +OP4 E03AD8 0 +OP4 E03AD9 0 +OP4 E03ADA 0 +OP4 E03ADB 0 +OP4 E03ADC 0 +OP4 E03ADD 0 +OP4 E03ADE 0 +OP4 E03ADF 0 +OP4 E03AE0 0 +OP4 E03AE1 0 +OP4 E03AE2 0 +OP4 E03AE3 0 +OP4 E03AE4 0 +OP4 E03AE5 0 +OP4 E03AE6 0 +OP4 E03AE7 0 +OP4 E03AE8 0 +OP4 E03AE9 0 +OP4 E03AEA 0 +OP4 E03AEB 0 +OP4 E03AEC 0 +OP4 E03AED 0 +OP4 E03AEE 0 +OP4 E03AEF 0 +OP4 E03AF0 0 +OP4 E03AF1 0 +OP4 E03AF2 0 +OP4 E03AF3 0 +OP4 E03AF4 0 +OP4 E03AF5 0 +OP4 E03AF6 0 +OP4 E03AF7 0 +OP4 E03AF8 0 +OP4 E03AF9 0 +OP4 E03AFA 0 +OP4 E03AFB 0 +OP4 E03AFC 0 +OP4 E03AFD 0 +OP4 E03AFE 0 +OP4 E03AFF 0 +OP4 E03B00 0 +OP4 E03B01 0 +OP4 E03B02 0 +OP4 E03B03 0 +OP4 E03B04 0 +OP4 E03B05 0 +OP4 E03B06 0 +OP4 E03B07 0 +OP4 E03B08 0 +OP4 E03B09 0 +OP4 E03B0A 0 +OP4 E03B0B 0 +OP4 E03B0C 0 +OP4 E03B0D 0 +OP4 E03B0E 0 +OP4 E03B0F 0 +OP4 E03B10 0 +OP4 E03B11 0 +OP4 E03B12 0 +OP4 E03B13 0 +OP4 E03B14 0 +OP4 E03B15 0 +OP4 E03B16 0 +OP4 E03B17 0 +OP4 E03B18 0 +OP4 E03B19 0 +OP4 E03B1A 0 +OP4 E03B1B 0 +OP4 E03B1C 0 +OP4 E03B1D 0 +OP4 E03B1E 0 +OP4 E03B1F 0 +OP4 E03B20 0 +OP4 E03B21 0 +OP4 E03B22 0 +OP4 E03B23 0 +OP4 E03B24 0 +OP4 E03B25 0 +OP4 E03B26 0 +OP4 E03B27 0 +OP4 E03B28 0 +OP4 E03B29 0 +OP4 E03B2A 0 +OP4 E03B2B 0 +OP4 E03B2C 0 +OP4 E03B2D 0 +OP4 E03B2E 0 +OP4 E03B2F 0 +OP4 E03B30 0 +OP4 E03B31 0 +OP4 E03B32 0 +OP4 E03B33 0 +OP4 E03B34 0 +OP4 E03B35 0 +OP4 E03B36 0 +OP4 E03B37 0 +OP4 E03B38 0 +OP4 E03B39 0 +OP4 E03B3A 0 +OP4 E03B3B 0 +OP4 E03B3C 0 +OP4 E03B3D 0 +OP4 E03B3E 0 +OP4 E03B3F 0 +OP4 E03B40 0 +OP4 E03B41 0 +OP4 E03B42 0 +OP4 E03B43 0 +OP4 E03B44 0 +OP4 E03B45 0 +OP4 E03B46 0 +OP4 E03B47 0 +OP4 E03B48 0 +OP4 E03B49 0 +OP4 E03B4A 0 +OP4 E03B4B 0 +OP4 E03B4C 0 +OP4 E03B4D 0 +OP4 E03B4E 0 +OP4 E03B4F 0 +OP4 E03B50 0 +OP4 E03B51 0 +OP4 E03B52 0 +OP4 E03B53 0 +OP4 E03B54 0 +OP4 E03B55 0 +OP4 E03B56 0 +OP4 E03B57 0 +OP4 E03B58 0 +OP4 E03B59 0 +OP4 E03B5A 0 +OP4 E03B5B 0 +OP4 E03B5C 0 +OP4 E03B5D 0 +OP4 E03B5E 0 +OP4 E03B5F 0 +OP4 E03B60 0 +OP4 E03B61 0 +OP4 E03B62 0 +OP4 E03B63 0 +OP4 E03B64 0 +OP4 E03B65 0 +OP4 E03B66 0 +OP4 E03B67 0 +OP4 E03B68 0 +OP4 E03B69 0 +OP4 E03B6A 0 +OP4 E03B6B 0 +OP4 E03B6C 0 +OP4 E03B6D 0 +OP4 E03B6E 0 +OP4 E03B6F 0 +OP4 E03B70 0 +OP4 E03B71 0 +OP4 E03B72 0 +OP4 E03B73 0 +OP4 E03B74 0 +OP4 E03B75 0 +OP4 E03B76 0 +OP4 E03B77 0 +OP4 E03B78 0 +OP4 E03B79 0 +OP4 E03B7A 0 +OP4 E03B7B 0 +OP4 E03B7C 0 +OP4 E03B7D 0 +OP4 E03B7E 0 +OP4 E03B7F 0 +OP4 E03B80 0 +OP4 E03B81 0 +OP4 E03B82 0 +OP4 E03B83 0 +OP4 E03B84 0 +OP4 E03B85 0 +OP4 E03B86 0 +OP4 E03B87 0 +OP4 E03B88 0 +OP4 E03B89 0 +OP4 E03B8A 0 +OP4 E03B8B 0 +OP4 E03B8C 0 +OP4 E03B8D 0 +OP4 E03B8E 0 +OP4 E03B8F 0 +OP4 E03B90 0 +OP4 E03B91 0 +OP4 E03B92 0 +OP4 E03B93 0 +OP4 E03B94 0 +OP4 E03B95 0 +OP4 E03B96 0 +OP4 E03B97 0 +OP4 E03B98 0 +OP4 E03B99 0 +OP4 E03B9A 0 +OP4 E03B9B 0 +OP4 E03B9C 0 +OP4 E03B9D 0 +OP4 E03B9E 0 +OP4 E03B9F 0 +OP4 E03BA0 0 +OP4 E03BA1 0 +OP4 E03BA2 0 +OP4 E03BA3 0 +OP4 E03BA4 0 +OP4 E03BA5 0 +OP4 E03BA6 0 +OP4 E03BA7 0 +OP4 E03BA8 0 +OP4 E03BA9 0 +OP4 E03BAA 0 +OP4 E03BAB 0 +OP4 E03BAC 0 +OP4 E03BAD 0 +OP4 E03BAE 0 +OP4 E03BAF 0 +OP4 E03BB0 0 +OP4 E03BB1 0 +OP4 E03BB2 0 +OP4 E03BB3 0 +OP4 E03BB4 0 +OP4 E03BB5 0 +OP4 E03BB6 0 +OP4 E03BB7 0 +OP4 E03BB8 0 +OP4 E03BB9 0 +OP4 E03BBA 0 +OP4 E03BBB 0 +OP4 E03BBC 0 +OP4 E03BBD 0 +OP4 E03BBE 0 +OP4 E03BBF 0 +OP4 E03BC0 0 +OP4 E03BC1 0 +OP4 E03BC2 0 +OP4 E03BC3 0 +OP4 E03BC4 0 +OP4 E03BC5 0 +OP4 E03BC6 0 +OP4 E03BC7 0 +OP4 E03BC8 0 +OP4 E03BC9 0 +OP4 E03BCA 0 +OP4 E03BCB 0 +OP4 E03BCC 0 +OP4 E03BCD 0 +OP4 E03BCE 0 +OP4 E03BCF 0 +OP4 E03BD0 0 +OP4 E03BD1 0 +OP4 E03BD2 0 +OP4 E03BD3 0 +OP4 E03BD4 0 +OP4 E03BD5 0 +OP4 E03BD6 0 +OP4 E03BD7 0 +OP4 E03BD8 0 +OP4 E03BD9 0 +OP4 E03BDA 0 +OP4 E03BDB 0 +OP4 E03BDC 0 +OP4 E03BDD 0 +OP4 E03BDE 0 +OP4 E03BDF 0 +OP4 E03BE0 0 +OP4 E03BE1 0 +OP4 E03BE2 0 +OP4 E03BE3 0 +OP4 E03BE4 0 +OP4 E03BE5 0 +OP4 E03BE6 0 +OP4 E03BE7 0 +OP4 E03BE8 0 +OP4 E03BE9 0 +OP4 E03BEA 0 +OP4 E03BEB 0 +OP4 E03BEC 0 +OP4 E03BED 0 +OP4 E03BEE 0 +OP4 E03BEF 0 +OP4 E03BF0 0 +OP4 E03BF1 0 +OP4 E03BF2 0 +OP4 E03BF3 0 +OP4 E03BF4 0 +OP4 E03BF5 0 +OP4 E03BF6 0 +OP4 E03BF7 0 +OP4 E03BF8 0 +OP4 E03BF9 0 +OP4 E03BFA 0 +OP4 E03BFB 0 +OP4 E03BFC 0 +OP4 E03BFD 0 +OP4 E03BFE 0 +OP4 E03BFF 0 +OP4 E03C00 0 +OP4 E03C01 0 +OP4 E03C02 0 +OP4 E03C03 0 +OP4 E03C04 0 +OP4 E03C05 0 +OP4 E03C06 0 +OP4 E03C07 0 +OP4 E03C08 0 +OP4 E03C09 0 +OP4 E03C0A 0 +OP4 E03C0B 0 +OP4 E03C0C 0 +OP4 E03C0D 0 +OP4 E03C0E 0 +OP4 E03C0F 0 +OP4 E03C10 0 +OP4 E03C11 0 +OP4 E03C12 0 +OP4 E03C13 0 +OP4 E03C14 0 +OP4 E03C15 0 +OP4 E03C16 0 +OP4 E03C17 0 +OP4 E03C18 0 +OP4 E03C19 0 +OP4 E03C1A 0 +OP4 E03C1B 0 +OP4 E03C1C 0 +OP4 E03C1D 0 +OP4 E03C1E 0 +OP4 E03C1F 0 +OP4 E03C20 0 +OP4 E03C21 0 +OP4 E03C22 0 +OP4 E03C23 0 +OP4 E03C24 0 +OP4 E03C25 0 +OP4 E03C26 0 +OP4 E03C27 0 +OP4 E03C28 0 +OP4 E03C29 0 +OP4 E03C2A 0 +OP4 E03C2B 0 +OP4 E03C2C 0 +OP4 E03C2D 0 +OP4 E03C2E 0 +OP4 E03C2F 0 +OP4 E03C30 0 +OP4 E03C31 0 +OP4 E03C32 0 +OP4 E03C33 0 +OP4 E03C34 0 +OP4 E03C35 0 +OP4 E03C36 0 +OP4 E03C37 0 +OP4 E03C38 0 +OP4 E03C39 0 +OP4 E03C3A 0 +OP4 E03C3B 0 +OP4 E03C3C 0 +OP4 E03C3D 0 +OP4 E03C3E 0 +OP4 E03C3F 0 +OP4 E03C40 0 +OP4 E03C41 0 +OP4 E03C42 0 +OP4 E03C43 0 +OP4 E03C44 0 +OP4 E03C45 0 +OP4 E03C46 0 +OP4 E03C47 0 +OP4 E03C48 0 +OP4 E03C49 0 +OP4 E03C4A 0 +OP4 E03C4B 0 +OP4 E03C4C 0 +OP4 E03C4D 0 +OP4 E03C4E 0 +OP4 E03C4F 0 +OP4 E03C50 0 +OP4 E03C51 0 +OP4 E03C52 0 +OP4 E03C53 0 +OP4 E03C54 0 +OP4 E03C55 0 +OP4 E03C56 0 +OP4 E03C57 0 +OP4 E03C58 0 +OP4 E03C59 0 +OP4 E03C5A 0 +OP4 E03C5B 0 +OP4 E03C5C 0 +OP4 E03C5D 0 +OP4 E03C5E 0 +OP4 E03C5F 0 +OP4 E03C60 0 +OP4 E03C61 0 +OP4 E03C62 0 +OP4 E03C63 0 +OP4 E03C64 0 +OP4 E03C65 0 +OP4 E03C66 0 +OP4 E03C67 0 +OP4 E03C68 0 +OP4 E03C69 0 +OP4 E03C6A 0 +OP4 E03C6B 0 +OP4 E03C6C 0 +OP4 E03C6D 0 +OP4 E03C6E 0 +OP4 E03C6F 0 +OP4 E03C70 0 +OP4 E03C71 0 +OP4 E03C72 0 +OP4 E03C73 0 +OP4 E03C74 0 +OP4 E03C75 0 +OP4 E03C76 0 +OP4 E03C77 0 +OP4 E03C78 0 +OP4 E03C79 0 +OP4 E03C7A 0 +OP4 E03C7B 0 +OP4 E03C7C 0 +OP4 E03C7D 0 +OP4 E03C7E 0 +OP4 E03C7F 0 +OP4 E03C80 0 +OP4 E03C81 0 +OP4 E03C82 0 +OP4 E03C83 0 +OP4 E03C84 0 +OP4 E03C85 0 +OP4 E03C86 0 +OP4 E03C87 0 +OP4 E03C88 0 +OP4 E03C89 0 +OP4 E03C8A 0 +OP4 E03C8B 0 +OP4 E03C8C 0 +OP4 E03C8D 0 +OP4 E03C8E 0 +OP4 E03C8F 0 +OP4 E03C90 0 +OP4 E03C91 0 +OP4 E03C92 0 +OP4 E03C93 0 +OP4 E03C94 0 +OP4 E03C95 0 +OP4 E03C96 0 +OP4 E03C97 0 +OP4 E03C98 0 +OP4 E03C99 0 +OP4 E03C9A 0 +OP4 E03C9B 0 +OP4 E03C9C 0 +OP4 E03C9D 0 +OP4 E03C9E 0 +OP4 E03C9F 0 +OP4 E03CA0 0 +OP4 E03CA1 0 +OP4 E03CA2 0 +OP4 E03CA3 0 +OP4 E03CA4 0 +OP4 E03CA5 0 +OP4 E03CA6 0 +OP4 E03CA7 0 +OP4 E03CA8 0 +OP4 E03CA9 0 +OP4 E03CAA 0 +OP4 E03CAB 0 +OP4 E03CAC 0 +OP4 E03CAD 0 +OP4 E03CAE 0 +OP4 E03CAF 0 +OP4 E03CB0 0 +OP4 E03CB1 0 +OP4 E03CB2 0 +OP4 E03CB3 0 +OP4 E03CB4 0 +OP4 E03CB5 0 +OP4 E03CB6 0 +OP4 E03CB7 0 +OP4 E03CB8 0 +OP4 E03CB9 0 +OP4 E03CBA 0 +OP4 E03CBB 0 +OP4 E03CBC 0 +OP4 E03CBD 0 +OP4 E03CBE 0 +OP4 E03CBF 0 +OP4 E03CC0 0 +OP4 E03CC1 0 +OP4 E03CC2 0 +OP4 E03CC3 0 +OP4 E03CC4 0 +OP4 E03CC5 0 +OP4 E03CC6 0 +OP4 E03CC7 0 +OP4 E03CC8 0 +OP4 E03CC9 0 +OP4 E03CCA 0 +OP4 E03CCB 0 +OP4 E03CCC 0 +OP4 E03CCD 0 +OP4 E03CCE 0 +OP4 E03CCF 0 +OP4 E03CD0 0 +OP4 E03CD1 0 +OP4 E03CD2 0 +OP4 E03CD3 0 +OP4 E03CD4 0 +OP4 E03CD5 0 +OP4 E03CD6 0 +OP4 E03CD7 0 +OP4 E03CD8 0 +OP4 E03CD9 0 +OP4 E03CDA 0 +OP4 E03CDB 0 +OP4 E03CDC 0 +OP4 E03CDD 0 +OP4 E03CDE 0 +OP4 E03CDF 0 +OP4 E03CE0 0 +OP4 E03CE1 0 +OP4 E03CE2 0 +OP4 E03CE3 0 +OP4 E03CE4 0 +OP4 E03CE5 0 +OP4 E03CE6 0 +OP4 E03CE7 0 +OP4 E03CE8 0 +OP4 E03CE9 0 +OP4 E03CEA 0 +OP4 E03CEB 0 +OP4 E03CEC 0 +OP4 E03CED 0 +OP4 E03CEE 0 +OP4 E03CEF 0 +OP4 E03CF0 0 +OP4 E03CF1 0 +OP4 E03CF2 0 +OP4 E03CF3 0 +OP4 E03CF4 0 +OP4 E03CF5 0 +OP4 E03CF6 0 +OP4 E03CF7 0 +OP4 E03CF8 0 +OP4 E03CF9 0 +OP4 E03CFA 0 +OP4 E03CFB 0 +OP4 E03CFC 0 +OP4 E03CFD 0 +OP4 E03CFE 0 +OP4 E03CFF 0 +OP4 E03D00 0 +OP4 E03D01 0 +OP4 E03D02 0 +OP4 E03D03 0 +OP4 E03D04 0 +OP4 E03D05 0 +OP4 E03D06 0 +OP4 E03D07 0 +OP4 E03D08 0 +OP4 E03D09 0 +OP4 E03D0A 0 +OP4 E03D0B 0 +OP4 E03D0C 0 +OP4 E03D0D 0 +OP4 E03D0E 0 +OP4 E03D0F 0 +OP4 E03D10 0 +OP4 E03D11 0 +OP4 E03D12 0 +OP4 E03D13 0 +OP4 E03D14 0 +OP4 E03D15 0 +OP4 E03D16 0 +OP4 E03D17 0 +OP4 E03D18 0 +OP4 E03D19 0 +OP4 E03D1A 0 +OP4 E03D1B 0 +OP4 E03D1C 0 +OP4 E03D1D 0 +OP4 E03D1E 0 +OP4 E03D1F 0 +OP4 E03D20 0 +OP4 E03D21 0 +OP4 E03D22 0 +OP4 E03D23 0 +OP4 E03D24 0 +OP4 E03D25 0 +OP4 E03D26 0 +OP4 E03D27 0 +OP4 E03D28 0 +OP4 E03D29 0 +OP4 E03D2A 0 +OP4 E03D2B 0 +OP4 E03D2C 0 +OP4 E03D2D 0 +OP4 E03D2E 0 +OP4 E03D2F 0 +OP4 E03D30 0 +OP4 E03D31 0 +OP4 E03D32 0 +OP4 E03D33 0 +OP4 E03D34 0 +OP4 E03D35 0 +OP4 E03D36 0 +OP4 E03D37 0 +OP4 E03D38 0 +OP4 E03D39 0 +OP4 E03D3A 0 +OP4 E03D3B 0 +OP4 E03D3C 0 +OP4 E03D3D 0 +OP4 E03D3E 0 +OP4 E03D3F 0 +OP4 E03D40 0 +OP4 E03D41 0 +OP4 E03D42 0 +OP4 E03D43 0 +OP4 E03D44 0 +OP4 E03D45 0 +OP4 E03D46 0 +OP4 E03D47 0 +OP4 E03D48 0 +OP4 E03D49 0 +OP4 E03D4A 0 +OP4 E03D4B 0 +OP4 E03D4C 0 +OP4 E03D4D 0 +OP4 E03D4E 0 +OP4 E03D4F 0 +OP4 E03D50 0 +OP4 E03D51 0 +OP4 E03D52 0 +OP4 E03D53 0 +OP4 E03D54 0 +OP4 E03D55 0 +OP4 E03D56 0 +OP4 E03D57 0 +OP4 E03D58 0 +OP4 E03D59 0 +OP4 E03D5A 0 +OP4 E03D5B 0 +OP4 E03D5C 0 +OP4 E03D5D 0 +OP4 E03D5E 0 +OP4 E03D5F 0 +OP4 E03D60 0 +OP4 E03D61 0 +OP4 E03D62 0 +OP4 E03D63 0 +OP4 E03D64 0 +OP4 E03D65 0 +OP4 E03D66 0 +OP4 E03D67 0 +OP4 E03D68 0 +OP4 E03D69 0 +OP4 E03D6A 0 +OP4 E03D6B 0 +OP4 E03D6C 0 +OP4 E03D6D 0 +OP4 E03D6E 0 +OP4 E03D6F 0 +OP4 E03D70 0 +OP4 E03D71 0 +OP4 E03D72 0 +OP4 E03D73 0 +OP4 E03D74 0 +OP4 E03D75 0 +OP4 E03D76 0 +OP4 E03D77 0 +OP4 E03D78 0 +OP4 E03D79 0 +OP4 E03D7A 0 +OP4 E03D7B 0 +OP4 E03D7C 0 +OP4 E03D7D 0 +OP4 E03D7E 0 +OP4 E03D7F 0 +OP4 E03D80 0 +OP4 E03D81 0 +OP4 E03D82 0 +OP4 E03D83 0 +OP4 E03D84 0 +OP4 E03D85 0 +OP4 E03D86 0 +OP4 E03D87 0 +OP4 E03D88 0 +OP4 E03D89 0 +OP4 E03D8A 0 +OP4 E03D8B 0 +OP4 E03D8C 0 +OP4 E03D8D 0 +OP4 E03D8E 0 +OP4 E03D8F 0 +OP4 E03D90 0 +OP4 E03D91 0 +OP4 E03D92 0 +OP4 E03D93 0 +OP4 E03D94 0 +OP4 E03D95 0 +OP4 E03D96 0 +OP4 E03D97 0 +OP4 E03D98 0 +OP4 E03D99 0 +OP4 E03D9A 0 +OP4 E03D9B 0 +OP4 E03D9C 0 +OP4 E03D9D 0 +OP4 E03D9E 0 +OP4 E03D9F 0 +OP4 E03DA0 0 +OP4 E03DA1 0 +OP4 E03DA2 0 +OP4 E03DA3 0 +OP4 E03DA4 0 +OP4 E03DA5 0 +OP4 E03DA6 0 +OP4 E03DA7 0 +OP4 E03DA8 0 +OP4 E03DA9 0 +OP4 E03DAA 0 +OP4 E03DAB 0 +OP4 E03DAC 0 +OP4 E03DAD 0 +OP4 E03DAE 0 +OP4 E03DAF 0 +OP4 E03DB0 0 +OP4 E03DB1 0 +OP4 E03DB2 0 +OP4 E03DB3 0 +OP4 E03DB4 0 +OP4 E03DB5 0 +OP4 E03DB6 0 +OP4 E03DB7 0 +OP4 E03DB8 0 +OP4 E03DB9 0 +OP4 E03DBA 0 +OP4 E03DBB 0 +OP4 E03DBC 0 +OP4 E03DBD 0 +OP4 E03DBE 0 +OP4 E03DBF 0 +OP4 E03DC0 0 +OP4 E03DC1 0 +OP4 E03DC2 0 +OP4 E03DC3 0 +OP4 E03DC4 0 diff --git a/platform/mellanox/one-image.mk b/platform/mellanox/one-image.mk index ad912e260d1e..74365cfea430 100644 --- a/platform/mellanox/one-image.mk +++ b/platform/mellanox/one-image.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2017-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2017-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,7 +19,7 @@ SONIC_ONE_IMAGE = sonic-mellanox.bin $(SONIC_ONE_IMAGE)_MACHINE = mellanox $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_INSTALLS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT_OEM) $(MFT) $(MLNX_HW_MANAGEMENT) +$(SONIC_ONE_IMAGE)_INSTALLS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT_OEM) $(MFT) $(MFT_FWTRACE_CFG) $(MLNX_HW_MANAGEMENT) $(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR) ifeq ($(INSTALL_DEBUG_TOOLS),y) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index a640fd093889..654c6b65ab4f 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,6 +17,7 @@ include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/fw.mk include $(PLATFORM_PATH)/mft.mk +include $(PLATFORM_PATH)/mft-fwtrace-cfg.mk include $(PLATFORM_PATH)/mlnx-sai.mk include $(PLATFORM_PATH)/hw-management.mk include $(PLATFORM_PATH)/mlnx-platform-api.mk From 380898f3a1b1cd4dee0e4df0f9a16ff6da96fdc4 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 3 Aug 2023 18:39:27 +0800 Subject: [PATCH 093/145] [Mellanox] Remove unnecessary file manipulation in the SAI Make file (#15993) Signed-off-by: Kebo Liu --- platform/mellanox/mlnx-sai/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai/Makefile b/platform/mellanox/mlnx-sai/Makefile index 6731bd83688d..ecfba91fd752 100644 --- a/platform/mellanox/mlnx-sai/Makefile +++ b/platform/mellanox/mlnx-sai/Makefile @@ -10,7 +10,6 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : wget -c $(MLNX_SAI_SOURCE_BASE_URL)/$(MLNX_SAI_VERSION).tar.gz -O - | tar -xz pushd mlnx_sai - chmod a+x autogen.sh debuild -e 'make_extra_flags="DEFS=-DACS_OS -DCONFIG_SYSLOG"' -us -uc -d -b popd From 91f3da018ec7a1071603f5a35dfe1b16129c26f3 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 3 Aug 2023 18:54:31 +0800 Subject: [PATCH 094/145] [Mellanox] Add more unit test coverage for platform API (#15842) - Why I did it Increase UT coverage for Nvidia platform API code Work item tracking Microsoft ADO (number only): - How I did it Focus on low coverage file: 1. component.py 2. watchdog.py 3. pcie.py - How to verify it Run the unit test, the coverage has been changed from 70% to 90% --- .../sonic_platform/component.py | 10 +- .../mlnx-platform-api/sonic_platform/sfp.py | 14 +- .../sonic_platform/watchdog.py | 8 +- .../mellanox/mlnx-platform-api/tests/dmi_file | Bin 0 -> 96 bytes .../mlnx-platform-api/tests/test_chassis.py | 7 +- .../mlnx-platform-api/tests/test_component.py | 519 ++++++++++++++++++ .../tests/test_device_data.py | 56 ++ .../mlnx-platform-api/tests/test_led.py | 39 +- .../mlnx-platform-api/tests/test_pcie.py | 67 +++ .../mlnx-platform-api/tests/test_psu.py | 12 + .../mlnx-platform-api/tests/test_sfp.py | 25 +- .../mlnx-platform-api/tests/test_thermal.py | 54 +- .../mlnx-platform-api/tests/test_utils.py | 54 +- .../mlnx-platform-api/tests/test_watchdog.py | 129 +++++ 14 files changed, 941 insertions(+), 53 deletions(-) create mode 100644 platform/mellanox/mlnx-platform-api/tests/dmi_file create mode 100644 platform/mellanox/mlnx-platform-api/tests/test_component.py create mode 100644 platform/mellanox/mlnx-platform-api/tests/test_device_data.py create mode 100644 platform/mellanox/mlnx-platform-api/tests/test_pcie.py create mode 100644 platform/mellanox/mlnx-platform-api/tests/test_watchdog.py diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py index db184567ca29..ef1713f8f3be 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py @@ -536,8 +536,8 @@ def auto_update_firmware(self, image_path, boot_action): try: reboot_required = self.get_firmware_update_notification(image_path) is not None except RuntimeError as e: - return FW_AUTO_ERR_UNKNOWN - + return FW_AUTO_ERR_UNKNOWN + # Update if no reboot needed if not reboot_required: self.update_firmware(image_path) @@ -810,9 +810,9 @@ def auto_update_firmware(self, image_path, boot_action): # Install burn. Error if fail. if not self.install_firmware(image_path): return FW_AUTO_ERR_UNKNOWN - + # Schedule refresh - return FW_AUTO_SCHEDULED + return FW_AUTO_SCHEDULED def get_firmware_version(self): part_number_file = self.CPLD_PART_NUMBER_FILE.format(self.idx) @@ -844,7 +844,7 @@ def get_available_firmware_version(self, image_path): def get_firmware_update_notification(self, image_path): name, ext = os.path.splitext(os.path.basename(image_path)) - if ext == self.COMPONENT_FIRMWARE_EXTENSION: + if ext in self.COMPONENT_FIRMWARE_EXTENSION: return "Power cycle (with 30 sec delay) or refresh image is required to complete {} firmware update".format(self.name) return "Immediate power cycle is required to complete {} firmware update".format(self.name) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 1011bd7cf1fd..aa83fd1455ec 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -198,18 +198,6 @@ def deinitialize_sdk_handle(sdk_handle): return False -class SdkHandleContext(object): - def __init__(self): - self.sdk_handle = None - - def __enter__(self): - self.sdk_handle = initialize_sdk_handle() - return self.sdk_handle - - def __exit__(self, exc_type, exc_val, exc_tb): - deinitialize_sdk_handle(self.sdk_handle) - - class NvidiaSFPCommon(SfpOptoeBase): def __init__(self, sfp_index): super(NvidiaSFPCommon, self).__init__() diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/watchdog.py b/platform/mellanox/mlnx-platform-api/sonic_platform/watchdog.py index 879aabfd3530..2a032d3131f2 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/watchdog.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/watchdog.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -80,7 +80,7 @@ def __init__(self, wd_device_path): super(WatchdogImplBase, self).__init__() self.watchdog_path = wd_device_path - self.watchdog = os.open(self.watchdog_path, os.O_WRONLY) + self.watchdog = self.open_handle() # Opening a watchdog descriptor starts # watchdog timer; @@ -90,6 +90,9 @@ def __init__(self, wd_device_path): self.timeout = self._gettimeout() + def open_handle(self): + return os.open(self.watchdog_path, os.O_WRONLY) + def _enablecard(self): """ Turn on the watchdog timer @@ -290,6 +293,7 @@ def get_watchdog(): for device in os.listdir("/dev/"): if device.startswith("watchdog") and is_mlnx_wd_main(device): watchdog_main_device_name = device + break if watchdog_main_device_name is None: return None diff --git a/platform/mellanox/mlnx-platform-api/tests/dmi_file b/platform/mellanox/mlnx-platform-api/tests/dmi_file new file mode 100644 index 0000000000000000000000000000000000000000..f9b1cdcd505ba559c54cfa755445eaf08d4817ca GIT binary patch literal 96 zcmZSLXJTMvVrF6GWMgLFV(?AP$w|!1uTTg{P0q;6&&f~EOf6RMDM`^|2=n!KF)%PN mWpFfM@C`AvG&YGaFfcSTV(`l^Q3x(bP0mcqOie-KF#rH7UKrv4 literal 0 HcmV?d00001 diff --git a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py index cffdd437695f..d3a1fd95a7d1 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -326,3 +326,8 @@ def test_get_port_or_cage_type(self): exceptionRaised = True assert exceptionRaised + + def test_parse_dmi(self): + chassis = Chassis() + content = chassis._parse_dmi(os.path.join(test_path, 'dmi_file')) + assert content.get('Version') == 'A4' diff --git a/platform/mellanox/mlnx-platform-api/tests/test_component.py b/platform/mellanox/mlnx-platform-api/tests/test_component.py new file mode 100644 index 000000000000..131220c27f90 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/tests/test_component.py @@ -0,0 +1,519 @@ +# +# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# 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 pytest +import subprocess +import sys +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +test_path = os.path.dirname(os.path.abspath(__file__)) +modules_path = os.path.dirname(test_path) +sys.path.insert(0, modules_path) + +from sonic_platform.chassis import Chassis +from sonic_platform.component import ComponentONIE, \ + ComponentSSD, \ + ComponentBIOS, \ + ComponentBIOSSN2201, \ + ComponentCPLD, \ + ComponentCPLDSN2201, \ + MPFAManager, \ + ONIEUpdater, \ + Component +from sonic_platform_base.component_base import FW_AUTO_INSTALLED, \ + FW_AUTO_UPDATED, \ + FW_AUTO_SCHEDULED, \ + FW_AUTO_ERR_BOOT_TYPE, \ + FW_AUTO_ERR_IMAGE, \ + FW_AUTO_ERR_UNKNOWN + + +class TestComponent: + @mock.patch('sonic_platform.chassis.utils.is_host') + @mock.patch('sonic_platform.chassis.DeviceDataManager.get_cpld_component_list', mock.MagicMock(return_value=[])) + def test_chassis_component(self, mock_is_host): + mock_is_host.return_value = False + c = Chassis() + assert not c.get_all_components() + mock_is_host.return_value = True + component_list = c.get_all_components() + assert len(component_list) > 0 + assert c.get_num_components() > 0 + assert c.get_component(0) is not None + + @mock.patch('sonic_platform.component.ComponentONIE._check_file_validity') + @mock.patch('sonic_platform.component.ONIEUpdater', mock.MagicMock()) + def test_onie_component(self, mock_check_file): + c = ComponentONIE() + assert c.get_name() == 'ONIE' + assert c.get_description() == 'ONIE - Open Network Install Environment' + c.onie_updater.get_onie_version = mock.MagicMock(return_value='1.0') + assert c.get_firmware_version() == '1.0' + + c.onie_updater.get_onie_firmware_info = mock.MagicMock(return_value={}) + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + + c.onie_updater.get_onie_firmware_info = mock.MagicMock(return_value={'image_version': '1.1'}) + assert c.get_available_firmware_version('') == '1.1' + + assert c.get_firmware_update_notification('') == \ + 'Immediate cold reboot is required to complete ONIE firmware update' + + mock_check_file.return_value = False + assert not c.install_firmware('') + c.update_firmware('') + + mock_check_file.return_value = True + c.onie_updater.update_firmware = mock.MagicMock() + assert c.install_firmware('') + + c.onie_updater.update_firmware.side_effect = RuntimeError('') + assert not c.install_firmware('') + + @mock.patch('sonic_platform.component.os.path.exists') + @mock.patch('sonic_platform.component.subprocess.check_call') + @mock.patch('sonic_platform.component.subprocess.check_output') + def test_ssd_component(self, mock_check_output, mock_check_call, mock_exists): + c = ComponentSSD() + firmware_info = [ + 'Firmware Version:1.0', + 'Available Firmware Version:1.1', + 'Upgrade Required:yes', + 'Power Cycle Required:yes' + ] + mock_check_output.return_value = '\n'.join(firmware_info) + assert c.get_firmware_version() == '1.0' + assert c.get_available_firmware_version('') == '1.1' + assert c.get_firmware_update_notification('') == \ + 'Immediate power cycle is required to complete SSD firmware update' + mock_check_output.return_value = '' + with pytest.raises(RuntimeError): + c.get_firmware_version() + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + + mock_check_output.return_value = 'Upgrade Required:invalid' + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + with pytest.raises(RuntimeError): + c.get_firmware_update_notification('') + mock_check_output.return_value = 'Upgrade Required:no' + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + assert c.get_firmware_update_notification('') is None + mock_check_output.return_value = 'Upgrade Required:yes' + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + firmware_info = [ + 'Power Cycle Required:invalid', + 'Upgrade Required:yes' + ] + mock_check_output.return_value = '\n'.join(firmware_info) + with pytest.raises(RuntimeError): + c.get_firmware_update_notification('') + firmware_info = [ + 'Firmware Version:1.0', + 'Upgrade Required:yes' + ] + mock_check_output.side_effect = subprocess.CalledProcessError(1, None) + with pytest.raises(RuntimeError): + c.get_firmware_version() + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + with pytest.raises(RuntimeError): + c.get_firmware_update_notification('') + + # install firmware + c._check_file_validity = mock.MagicMock(return_value=False) + assert not c.install_firmware('') + c.update_firmware('') + + c._check_file_validity = mock.MagicMock(return_value=True) + assert c.install_firmware('') + mock_check_call.assert_called_with(c.SSD_FIRMWARE_UPDATE_COMMAND, universal_newlines=True) + assert c.install_firmware('', False) + mock_check_call.assert_called_with(c.SSD_FIRMWARE_INSTALL_COMMAND, universal_newlines=True) + mock_check_call.side_effect = subprocess.CalledProcessError(1, None) + assert not c.install_firmware('') + + # auto update firmware + mock_exists.return_value = False + assert c.auto_update_firmware('', '') == FW_AUTO_ERR_IMAGE + c.get_firmware_update_notification = mock.MagicMock(side_effect=RuntimeError('')) + mock_exists.return_value = True + assert c.auto_update_firmware('', '') == FW_AUTO_ERR_UNKNOWN + c.update_firmware = mock.MagicMock() + c.get_firmware_update_notification = mock.MagicMock(return_value=None) + assert c.auto_update_firmware('', '') == FW_AUTO_UPDATED + c.get_firmware_update_notification = mock.MagicMock(return_value='yes') + assert c.auto_update_firmware('', '') == FW_AUTO_ERR_BOOT_TYPE + assert c.auto_update_firmware('', 'cold') == FW_AUTO_SCHEDULED + + @mock.patch('sonic_platform.component.subprocess.check_output') + def test_bios_component(self, mock_check_output): + c = ComponentBIOS() + mock_check_output.return_value = '1.0' + assert c.get_firmware_version() == '1.0' + mock_check_output.side_effect = subprocess.CalledProcessError(1, None) + with pytest.raises(RuntimeError): + c.get_firmware_version() + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + assert c.get_firmware_update_notification('') == \ + 'Immediate cold reboot is required to complete BIOS firmware update' + c.onie_updater.is_non_onie_firmware_update_supported = mock.MagicMock(return_value=False) + assert not c.install_firmware('') + c.update_firmware('') + c.onie_updater.is_non_onie_firmware_update_supported = mock.MagicMock(return_value=True) + c._check_file_validity = mock.MagicMock(return_value=False) + assert not c.install_firmware('') + c._check_file_validity = mock.MagicMock(return_value=True) + c.onie_updater.update_firmware = mock.MagicMock() + assert c.install_firmware('') + c.onie_updater.update_firmware = mock.MagicMock(side_effect=RuntimeError('')) + assert not c.install_firmware('') + + @mock.patch('sonic_platform.component.subprocess.check_output') + def test_bios_2201_component(self, mock_check_output): + c = ComponentBIOSSN2201() + mock_check_output.return_value = 'Version: 1.0' + assert c.get_firmware_version() == '1.0' + mock_check_output.return_value = '' + assert c.get_firmware_version() == 'Unknown version' + mock_check_output.side_effect = subprocess.CalledProcessError(1, None) + with pytest.raises(RuntimeError): + c.get_firmware_version() + + @mock.patch('sonic_platform.component.MPFAManager.cleanup', mock.MagicMock()) + @mock.patch('sonic_platform.component.MPFAManager.extract', mock.MagicMock()) + @mock.patch('sonic_platform.component.subprocess.check_call') + @mock.patch('sonic_platform.component.MPFAManager.get_path') + @mock.patch('sonic_platform.component.MPFAManager.get_metadata') + @mock.patch('sonic_platform.component.os.path.exists') + def test_cpld_component(self, mock_exists, mock_get_meta_data, mock_get_path, mock_check_call): + c = ComponentCPLD(1) + c._read_generic_file = mock.MagicMock(side_effect=[None, '1', None]) + assert c.get_firmware_version() == 'CPLD000000_REV0100' + + assert c.get_firmware_update_notification('a.txt') == \ + 'Immediate power cycle is required to complete CPLD1 firmware update' + assert c.get_firmware_update_notification('a.vme') == \ + 'Power cycle (with 30 sec delay) or refresh image is required to complete CPLD1 firmware update' + + mock_meta_data = mock.MagicMock() + mock_meta_data.has_option = mock.MagicMock(return_value=False) + mock_get_meta_data.return_value = mock_meta_data + with pytest.raises(RuntimeError): + c.get_available_firmware_version('') + mock_meta_data.has_option = mock.MagicMock(return_value=True) + mock_meta_data.get = mock.MagicMock(return_value='1.1') + assert c.get_available_firmware_version('') == '1.1' + + c._check_file_validity = mock.MagicMock(return_value=False) + assert not c._install_firmware('') + c._check_file_validity = mock.MagicMock(return_value=True) + c._ComponentCPLD__get_mst_device = mock.MagicMock(return_value=None) + assert not c._install_firmware('') + c._ComponentCPLD__get_mst_device = mock.MagicMock(return_value='some dev') + assert c._install_firmware('') + mock_check_call.side_effect = subprocess.CalledProcessError(1, None) + assert not c._install_firmware('') + + c._install_firmware = mock.MagicMock() + mock_meta_data.has_option = mock.MagicMock(return_value=False) + with pytest.raises(RuntimeError): + c.install_firmware('a.mpfa') + mock_get_path.return_value = '/tmp' + mock_meta_data.has_option = mock.MagicMock(return_value=True) + mock_meta_data.get = mock.MagicMock(return_value='some_firmware') + c.install_firmware('a.mpfa') + c._install_firmware.assert_called_with('/tmp/some_firmware') + c._install_firmware.reset_mock() + c.install_firmware('a.txt') + c._install_firmware.assert_called_with('a.txt') + + mock_meta_data.has_option = mock.MagicMock(return_value=False) + with pytest.raises(RuntimeError): + c.update_firmware('a.mpfa') + mock_meta_data.has_option = mock.MagicMock(side_effect=[True, False]) + with pytest.raises(RuntimeError): + c.update_firmware('a.mpfa') + mock_meta_data.has_option = mock.MagicMock(return_value=True) + mock_meta_data.get = mock.MagicMock(side_effect=['burn', 'refresh']) + c._install_firmware.reset_mock() + c.update_firmware('a.mpfa') + assert c._install_firmware.call_count == 2 + c._install_firmware.reset_mock() + c._install_firmware.return_value = False + mock_meta_data.get = mock.MagicMock(side_effect=['burn', 'refresh']) + c.update_firmware('a.mpfa') + assert c._install_firmware.call_count == 1 + + mock_exists.return_value = False + assert c.auto_update_firmware('', '') == FW_AUTO_ERR_IMAGE + mock_exists.return_value = True + assert c.auto_update_firmware('', '') == FW_AUTO_ERR_BOOT_TYPE + c.install_firmware = mock.MagicMock(return_value=False) + assert c.auto_update_firmware('', 'cold') == FW_AUTO_ERR_UNKNOWN + c.install_firmware = mock.MagicMock(return_value=True) + assert c.auto_update_firmware('', 'cold') == FW_AUTO_SCHEDULED + + @mock.patch('sonic_platform.component.ComponentCPLD._read_generic_file', mock.MagicMock(return_value='3')) + def test_cpld_get_component_list(self): + component_list = ComponentCPLD.get_component_list() + assert len(component_list) == 3 + for index, item in enumerate(component_list): + assert item.name == 'CPLD{}'.format(index + 1) + + def test_cpld_get_mst_device(self): + ComponentCPLD.MST_DEVICE_PATH = '/tmp/mst' + os.system('rm -rf /tmp/mst') + c = ComponentCPLD(1) + assert c._ComponentCPLD__get_mst_device() is None + os.makedirs(ComponentCPLD.MST_DEVICE_PATH) + assert c._ComponentCPLD__get_mst_device() is None + with open('/tmp/mst/mt0_pci_cr0', 'w+') as f: + f.write('dummy') + assert c._ComponentCPLD__get_mst_device() == '/tmp/mst/mt0_pci_cr0' + + @mock.patch('sonic_platform.component.subprocess.check_call') + def test_cpld_2201_component(self, mock_check_call): + c = ComponentCPLDSN2201(1) + assert c._install_firmware('') + mock_check_call.side_effect = subprocess.CalledProcessError(1, None) + assert not c._install_firmware('') + + @mock.patch('sonic_platform.component.MPFAManager.cleanup') + @mock.patch('sonic_platform.component.MPFAManager.extract') + def test_mpfa_manager_context(self, mock_extract, mock_cleanup): + with MPFAManager('some_path') as mpfa: + assert isinstance(mpfa, MPFAManager) + mock_extract.assert_called_once() + mock_cleanup.assert_not_called() + mock_cleanup.assert_called_once() + + @mock.patch('sonic_platform.component.tempfile.mkdtemp', mock.MagicMock(return_value='/tmp/mpfa')) + @mock.patch('sonic_platform.component.subprocess.check_call', mock.MagicMock()) + @mock.patch('sonic_platform.component.os.path.isfile') + def test_mpfa_manager_extract_cleanup(self, mock_isfile): + m = MPFAManager('some_path') + mock_isfile.return_value = False + with pytest.raises(RuntimeError): + m.extract() + mock_isfile.return_value = True + with pytest.raises(RuntimeError): + m.extract() + m = MPFAManager('some_path.mpfa') + mock_isfile.side_effect = [True, False] + with pytest.raises(RuntimeError): + m.extract() + mock_isfile.side_effect = None + os.makedirs('/tmp/mpfa', exist_ok=True) + with open('/tmp/mpfa/metadata.ini', 'w+') as f: + f.write('[section1]\n') + f.write('a=b') + m = MPFAManager('some_path.mpfa') + m.extract() + assert m.get_path() == '/tmp/mpfa' + assert m.is_extracted() + assert m.get_metadata() is not None + # extract twice and verify no issue + m.extract() + m.cleanup() + assert m.get_path() is None + assert not m.is_extracted() + assert m.get_metadata() is None + + def test_onie_updater_parse_onie_version(self): + o = ONIEUpdater() + onie_year, onie_month, onie_major, onie_minor, onie_release, onie_baudrate = \ + o.parse_onie_version('2022.08-5.3.0010-9600') + assert onie_year == '2022' + assert onie_month == '08' + assert onie_major == '5' + assert onie_minor == '3' + assert onie_release == '0010' + assert onie_baudrate == '9600' + with pytest.raises(RuntimeError): + o.parse_onie_version('invalid', is_base=True) + with pytest.raises(RuntimeError): + o.parse_onie_version('invalid', is_base=False) + onie_year, onie_month, onie_major, onie_minor, onie_release, onie_baudrate = \ + o.parse_onie_version('2022.08-5.3.0010-9600', is_base=True) + assert onie_year is None + assert onie_month is None + assert onie_major == '5' + assert onie_minor == '3' + assert onie_release == '0010' + assert onie_baudrate is None + + assert o.get_onie_required_version() == o.ONIE_VERSION_REQUIRED + + @mock.patch('sonic_platform.component.ONIEUpdater.get_onie_version') + @mock.patch('sonic_platform.component.device_info.get_platform') + def test_onie_updater_is_non_onie_firmware_update_supported(self, mock_platform, mock_version): + mock_platform.return_value = 'x86_64-nvidia_sn5600-r0' + o = ONIEUpdater() + mock_version.return_value = '2022.08-5.3.0010-9600' + assert o.is_non_onie_firmware_update_supported() + mock_version.return_value = '2022.08-5.1.0010-9600' + assert not o.is_non_onie_firmware_update_supported() + + mock_platform.return_value = 'x86_64-nvidia_sn2201-r0' + o = ONIEUpdater() + assert o.is_non_onie_firmware_update_supported() + + def test_onie_updater_get_onie_version(self): + o = ONIEUpdater() + o._ONIEUpdater__mount_onie_fs = mock.MagicMock() + o._ONIEUpdater__umount_onie_fs = mock.MagicMock() + mock_os_open = mock.mock_open(read_data='') + with mock.patch('sonic_platform.component.open', mock_os_open): + with pytest.raises(RuntimeError): + o.get_onie_version() + o._ONIEUpdater__umount_onie_fs.assert_called_once() + + mock_os_open = mock.mock_open(read_data='onie_version') + with mock.patch('sonic_platform.component.open', mock_os_open): + with pytest.raises(RuntimeError): + o.get_onie_version() + + mock_os_open = mock.mock_open(read_data='onie_version=2022.08-5.1.0010-9600') + with mock.patch('sonic_platform.component.open', mock_os_open): + assert o.get_onie_version() == '2022.08-5.1.0010-9600' + + @mock.patch('sonic_platform.component.subprocess.check_output') + def test_onie_updater_get_onie_firmware_info(self, mock_check_output): + o = ONIEUpdater() + o._ONIEUpdater__mount_onie_fs = mock.MagicMock() + o._ONIEUpdater__umount_onie_fs = mock.MagicMock() + mock_check_output.return_value = 'a' + with pytest.raises(RuntimeError): + o.get_onie_firmware_info('') + o._ONIEUpdater__umount_onie_fs.assert_called_once() + mock_check_output.return_value = 'a=b' + fi = o.get_onie_firmware_info('') + assert fi == {'a':'b'} + mock_check_output.side_effect = subprocess.CalledProcessError(1, None) + with pytest.raises(RuntimeError): + o.get_onie_firmware_info('') + + def test_onie_updater_update_firmware(self): + o = ONIEUpdater() + o._ONIEUpdater__stage_update = mock.MagicMock() + o._ONIEUpdater__trigger_update = mock.MagicMock() + o._ONIEUpdater__is_update_staged = mock.MagicMock() + o._ONIEUpdater__unstage_update = mock.MagicMock() + o.update_firmware('') + o._ONIEUpdater__stage_update.assert_called_once() + o._ONIEUpdater__trigger_update.assert_called_once() + o._ONIEUpdater__is_update_staged.assert_not_called() + o._ONIEUpdater__unstage_update.assert_not_called() + o._ONIEUpdater__is_update_staged.return_value = False + o._ONIEUpdater__stage_update.side_effect = RuntimeError('') + with pytest.raises(RuntimeError): + o.update_firmware('') + o._ONIEUpdater__unstage_update.assert_not_called() + o._ONIEUpdater__is_update_staged.return_value = True + with pytest.raises(RuntimeError): + o.update_firmware('') + o._ONIEUpdater__unstage_update.assert_called_once() + + @mock.patch('sonic_platform.component.os.path.lexists') + @mock.patch('sonic_platform.component.os.path.exists', mock.MagicMock(return_value=False)) + @mock.patch('sonic_platform.component.os.mkdir', mock.MagicMock()) + @mock.patch('sonic_platform.component.subprocess.check_call', mock.MagicMock()) + @mock.patch('sonic_platform.component.os.symlink', mock.MagicMock()) + @mock.patch('sonic_platform.component.check_output_pipe', mock.MagicMock()) + def test_onie_updater_mount_onie_fs(self, mock_lexists): + o = ONIEUpdater() + o._ONIEUpdater__umount_onie_fs = mock.MagicMock() + mock_lexists.return_value = False + mp = o._ONIEUpdater__mount_onie_fs() + assert mp == '/mnt/onie-fs' + o._ONIEUpdater__umount_onie_fs.assert_not_called() + mock_lexists.return_value = True + o._ONIEUpdater__mount_onie_fs() + o._ONIEUpdater__umount_onie_fs.assert_called_once() + + @mock.patch('sonic_platform.component.os.rmdir') + @mock.patch('sonic_platform.component.os.path.exists', mock.MagicMock(return_value=True)) + @mock.patch('sonic_platform.component.subprocess.check_call') + @mock.patch('sonic_platform.component.os.path.ismount', mock.MagicMock(return_value=True)) + @mock.patch('sonic_platform.component.os.unlink') + @mock.patch('sonic_platform.component.os.path.islink', mock.MagicMock(return_value=True)) + def test_onie_updater_umount_onie_fs(self, mock_unlink, mock_check_call, mock_rmdir): + o = ONIEUpdater() + o._ONIEUpdater__umount_onie_fs() + mock_unlink.assert_called_once() + mock_check_call.assert_called_once() + mock_rmdir.assert_called_once() + + @mock.patch('sonic_platform.component.subprocess.check_output') + @mock.patch('sonic_platform.component.subprocess.check_call') + @mock.patch('sonic_platform.component.copyfile', mock.MagicMock()) + def test_onie_updater_stage(self, mock_check_call, mock_check_output): + o = ONIEUpdater() + o._ONIEUpdater__stage_update('') + mock_check_call.assert_called_once() + + mock_check_call.reset_mock() + o._ONIEUpdater__unstage_update('a.rom') + mock_check_call.assert_called_once() + + mock_check_call.reset_mock() + o._ONIEUpdater__trigger_update(True) + mock_check_call.assert_called_with(o.ONIE_FW_UPDATE_CMD_UPDATE, universal_newlines=True) + mock_check_call.reset_mock() + o._ONIEUpdater__trigger_update(False) + mock_check_call.assert_called_with(o.ONIE_FW_UPDATE_CMD_INSTALL, universal_newlines=True) + + mock_check_output.return_value = 'invalid/' + assert not o._ONIEUpdater__is_update_staged('') + mock_check_output.return_value = '00-' + assert o._ONIEUpdater__is_update_staged('') + + mock_check_call.side_effect = subprocess.CalledProcessError(1, None) + with pytest.raises(RuntimeError): + o._ONIEUpdater__stage_update('') + with pytest.raises(RuntimeError): + o._ONIEUpdater__unstage_update('') + with pytest.raises(RuntimeError): + o._ONIEUpdater__trigger_update(True) + mock_check_output.side_effect = subprocess.CalledProcessError(1, None) + with pytest.raises(RuntimeError): + o._ONIEUpdater__is_update_staged('') + + def test_read_generic_file(self): + with pytest.raises(RuntimeError): + Component._read_generic_file('invalid', 1) + content = Component._read_generic_file(os.path.abspath(__file__), 1) + assert content == '#' + + def test_check_file_validity(self): + c = ComponentONIE() + assert not c._check_file_validity('invalid') + assert c._check_file_validity(os.path.abspath(__file__)) + c.image_ext_name = '.py' + assert c._check_file_validity(os.path.abspath(__file__)) + c.image_ext_name = '.txt' + assert not c._check_file_validity(os.path.abspath(__file__)) diff --git a/platform/mellanox/mlnx-platform-api/tests/test_device_data.py b/platform/mellanox/mlnx-platform-api/tests/test_device_data.py new file mode 100644 index 000000000000..d99591d513c8 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/tests/test_device_data.py @@ -0,0 +1,56 @@ +# +# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# 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 pytest +import subprocess +import sys +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +test_path = os.path.dirname(os.path.abspath(__file__)) +modules_path = os.path.dirname(test_path) +sys.path.insert(0, modules_path) + +from sonic_platform.device_data import DeviceDataManager + + +class TestDeviceData: + @mock.patch('sonic_platform.device_data.utils.read_int_from_file', mock.MagicMock(return_value=1)) + def test_is_fan_hotswapable(self): + assert DeviceDataManager.is_fan_hotswapable() + + @mock.patch('sonic_platform.device_data.utils.read_int_from_file', mock.MagicMock(return_value=1)) + def test_get_linecard_sfp_count(self): + assert DeviceDataManager.get_linecard_sfp_count(1) == 1 + + @mock.patch('sonic_platform.device_data.utils.read_int_from_file', mock.MagicMock(return_value=1)) + def test_get_gearbox_count(self): + assert DeviceDataManager.get_gearbox_count('') == 1 + + @mock.patch('sonic_platform.device_data.DeviceDataManager.get_platform_name', mock.MagicMock(return_value='x86_64-mlnx_msn3420-r0')) + def test_get_linecard_max_port_count(self): + assert DeviceDataManager.get_linecard_max_port_count() == 0 + + @mock.patch('sonic_platform.device_data.DeviceDataManager.get_platform_name', mock.MagicMock(return_value='x86_64-nvidia_sn2201-r0')) + def test_get_bios_component(self): + assert DeviceDataManager.get_bios_component() is not None + + + diff --git a/platform/mellanox/mlnx-platform-api/tests/test_led.py b/platform/mellanox/mlnx-platform-api/tests/test_led.py index a46daec16879..3e60016a0703 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_led.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_led.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -179,3 +179,40 @@ def test_fixed_psu_led(self): psu = FixedPsu(0) physical_led = psu.led self._verify_non_shared_led(physical_led, psu) + + def test_get_actual_color(self): + led = Led() + assert led._get_actual_color('red') is None + led.supported_colors.add('orange') + assert led._get_actual_color('red') is 'orange' + + @mock.patch('os.path.exists') + @mock.patch('time.sleep', mock.MagicMock()) + def test_wait_files_ready(self, mock_exists): + mock_exists.side_effect = [True, True] + led = Led() + assert led._wait_files_ready(['a', 'b']) + mock_exists.side_effect = [False, False, True, True] + assert led._wait_files_ready(['a', 'b']) + mock_exists.side_effect = None + mock_exists.return_value = False + assert not led._wait_files_ready(['a', 'b']) + + @mock.patch('sonic_platform.utils.write_file') + @mock.patch('sonic_platform.led.Led.get_led_path', mock.MagicMock()) + @mock.patch('sonic_platform.led.Led._stop_blink', mock.MagicMock()) + @mock.patch('sonic_platform.led.Led.get_capability', mock.MagicMock()) + @mock.patch('sonic_platform.device_data.DeviceDataManager.is_simx_platform', mock.MagicMock(return_value=False)) + def test_get_set_led_status(self, mock_write): + led = Led() + led._led_id = 'fan' + led.supported_colors.add('red') + led.supported_colors.add('green') + assert not led.set_status('black') + assert led.set_status(led.STATUS_LED_COLOR_OFF) + assert mock_write.call_count == 2 + mock_write.side_effect = ValueError('') + assert not led.set_status(led.STATUS_LED_COLOR_OFF) + + led.supported_colors.clear() + assert led.get_status() == led.STATUS_LED_COLOR_OFF diff --git a/platform/mellanox/mlnx-platform-api/tests/test_pcie.py b/platform/mellanox/mlnx-platform-api/tests/test_pcie.py new file mode 100644 index 000000000000..781fd74fe9f0 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/tests/test_pcie.py @@ -0,0 +1,67 @@ +# +# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# 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 sys +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +test_path = os.path.dirname(os.path.abspath(__file__)) +modules_path = os.path.dirname(test_path) +sys.path.insert(0, modules_path) + +from sonic_platform.pcie import Pcie + + +class TestPcie: + @mock.patch('sonic_platform.pcie.Pcie._create_device_id_to_bus_map', mock.MagicMock()) + @mock.patch('sonic_platform.pcie.Pcie.load_config_file', mock.MagicMock()) + def test_get_pcie_check(self): + p = Pcie('') + p._device_id_to_bus_map = {} + p.confInfo = [ + { + 'id': '1f0b', + 'dev': '00', + 'fn': '00' + } + ] + info = p.get_pcie_check() + assert info[0]['result'] == 'Failed' + + p.check_pcie_sysfs = mock.MagicMock(return_value=False) + p._device_id_to_bus_map = {'1f0b': '00'} + info = p.get_pcie_check() + assert info[0]['result'] == 'Failed' + + p.check_pcie_sysfs = mock.MagicMock(return_value=True) + info = p.get_pcie_check() + assert info[0]['result'] == 'Passed' + + @mock.patch('sonic_platform.pcie.os.listdir') + @mock.patch('sonic_platform.pcie.Pcie.load_config_file', mock.MagicMock()) + def test_create_device_id_to_bus_map(self, mock_dir): + p = Pcie('') + assert not p._device_id_to_bus_map + mock_dir.return_value = ['0000:01:00.0'] + + mock_os_open = mock.mock_open(read_data='0x23') + with mock.patch('sonic_platform.pcie.open', mock_os_open): + p._create_device_id_to_bus_map() + assert p._device_id_to_bus_map == {'23':'01'} diff --git a/platform/mellanox/mlnx-platform-api/tests/test_psu.py b/platform/mellanox/mlnx-platform-api/tests/test_psu.py index 2882776b6252..2c67fa999993 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_psu.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_psu.py @@ -37,8 +37,14 @@ def test_fixed_psu(self): assert psu.get_model() == 'N/A' assert psu.get_serial() == 'N/A' assert psu.get_revision() == 'N/A' + avail, msg = psu.get_power_available_status() + assert not avail + assert msg == 'absence of power' utils.read_int_from_file = mock.MagicMock(return_value=1) assert psu.get_powergood_status() + avail, msg = psu.get_power_available_status() + assert avail + assert msg == '' utils.read_int_from_file = mock.MagicMock(return_value=0) assert not psu.get_powergood_status() assert psu.get_presence() @@ -69,6 +75,7 @@ def test_psu(self): psu.psu_temp_threshold: 50678, psu.psu_voltage_in: 102345, psu.psu_current_in: 676, + psu.psu_power_max: 1234567 } def mock_read_int_from_file(file_path, **kwargs): @@ -77,8 +84,12 @@ def mock_read_int_from_file(file_path, **kwargs): utils.read_int_from_file = mock_read_int_from_file utils.read_str_from_file = mock.MagicMock(return_value='min max') assert psu.get_presence() is True + assert psu.get_maximum_supplied_power() == 1.234567 mock_sysfs_content[psu.psu_presence] = 0 assert psu.get_presence() is False + avail, msg = psu.get_power_available_status() + assert not avail + assert msg == 'absence of PSU' assert psu.get_powergood_status() is True mock_sysfs_content[psu.psu_oper_status] = 0 @@ -91,6 +102,7 @@ def mock_read_int_from_file(file_path, **kwargs): assert psu.get_temperature_high_threshold() is None assert psu.get_input_voltage() is None assert psu.get_input_current() is None + assert psu.get_maximum_supplied_power() is None mock_sysfs_content[psu.psu_oper_status] = 1 assert psu.get_voltage() == 10.234 diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index 6cba2bb28627..57c221340c13 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,6 +37,7 @@ class TestSfp: @mock.patch('sonic_platform.device_data.DeviceDataManager.get_linecard_max_port_count') def test_sfp_index(self, mock_max_port): sfp = SFP(0) + assert sfp.is_replaceable() assert sfp.sdk_index == 0 assert sfp.index == 1 @@ -267,3 +268,25 @@ def test_set_lpmode(self, mock_read_int, mock_write): assert sfp.set_lpmode(True) mock_write.assert_called_with('/sys/module/sx_core/asic0/module0/power_mode_policy', '2') + + @mock.patch('sonic_platform.sfp.SFP.read_eeprom') + def test_get_xcvr_api(self, mock_read): + sfp = SFP(0) + api = sfp.get_xcvr_api() + assert api is None + mock_read.return_value = bytearray([0x18]) + api = sfp.get_xcvr_api() + assert api is not None + + def test_rj45_basic(self): + sfp = RJ45Port(0) + assert not sfp.get_lpmode() + assert not sfp.reset() + assert not sfp.set_lpmode(True) + assert not sfp.get_error_description() + assert not sfp.get_reset_status() + assert sfp.read_eeprom(0, 0) is None + assert sfp.get_transceiver_info() + assert sfp.get_transceiver_bulk_status() + assert sfp.get_transceiver_threshold_info() + sfp.reinit() diff --git a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py index 5d96d4661b6f..d906fdf4e02f 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -42,7 +42,6 @@ class TestThermal: @mock.patch('sonic_platform.device_data.DeviceDataManager.get_platform_name', mock.MagicMock(return_value='x86_64-mlnx_msn2700-r0')) def test_chassis_thermal(self): from sonic_platform.thermal import THERMAL_NAMING_RULE - os.path.exists = mock.MagicMock(return_value=True) chassis = Chassis() thermal_list = chassis.get_all_thermals() assert thermal_list @@ -123,9 +122,9 @@ def test_chassis_thermal_includes(self, mock_capability): thermal_name = rule['name'] assert thermal_name in thermal_dict + @mock.patch('os.path.exists', mock.MagicMock(return_value=True)) def test_psu_thermal(self): from sonic_platform.thermal import initialize_psu_thermal, THERMAL_NAMING_RULE - os.path.exists = mock.MagicMock(return_value=True) presence_cb = mock.MagicMock(return_value=(True, '')) thermal_list = initialize_psu_thermal(0, presence_cb) assert len(thermal_list) == 1 @@ -147,9 +146,9 @@ def test_psu_thermal(self): assert thermal.get_high_threshold() is None assert thermal.get_high_critical_threshold() is None + @mock.patch('os.path.exists', mock.MagicMock(return_value=True)) def test_sfp_thermal(self): from sonic_platform.thermal import initialize_sfp_thermal, THERMAL_NAMING_RULE - os.path.exists = mock.MagicMock(return_value=True) thermal_list = initialize_sfp_thermal(0) assert len(thermal_list) == 1 thermal = thermal_list[0] @@ -162,66 +161,65 @@ def test_sfp_thermal(self): assert thermal.get_position_in_parent() == 1 assert thermal.is_replaceable() == False - def test_get_temperature(self): + @mock.patch('sonic_platform.utils.read_float_from_file') + def test_get_temperature(self, mock_read): from sonic_platform.thermal import Thermal - from sonic_platform import utils thermal = Thermal('test', 'temp_file', None, None, 1) - utils.read_float_from_file = mock.MagicMock(return_value=35727) + mock_read.return_value = 35727 assert thermal.get_temperature() == 35.727 - utils.read_float_from_file = mock.MagicMock(return_value=0.0) + mock_read.return_value = 0.0 assert thermal.get_temperature() is None - utils.read_float_from_file = mock.MagicMock(return_value=None) + mock_read.return_value = None assert thermal.get_temperature() is None - def test_get_high_threshold(self): + @mock.patch('sonic_platform.utils.read_float_from_file') + def test_get_high_threshold(self, mock_read): from sonic_platform.thermal import Thermal - from sonic_platform import utils thermal = Thermal('test', None, None, None, 1) assert thermal.get_high_threshold() is None thermal.high_threshold = 'high_th_file' - utils.read_float_from_file = mock.MagicMock(return_value=25833) + mock_read.return_value = 25833 assert thermal.get_temperature() == 25.833 - utils.read_float_from_file = mock.MagicMock(return_value=0.0) + mock_read.return_value = 0.0 assert thermal.get_temperature() is None - utils.read_float_from_file = mock.MagicMock(return_value=None) + mock_read.return_value = None assert thermal.get_temperature() is None - def test_get_high_critical_threshold(self): + @mock.patch('sonic_platform.utils.read_float_from_file') + def test_get_high_critical_threshold(self, mock_read): from sonic_platform.thermal import Thermal - from sonic_platform import utils thermal = Thermal('test', None, None, None, 1) assert thermal.get_high_critical_threshold() is None thermal.high_critical_threshold = 'high_th_file' - utils.read_float_from_file = mock.MagicMock(return_value=120839) + mock_read.return_value = 120839 assert thermal.get_high_critical_threshold() == 120.839 - utils.read_float_from_file = mock.MagicMock(return_value=0.0) + mock_read.return_value = 0.0 assert thermal.get_high_critical_threshold() is None - utils.read_float_from_file = mock.MagicMock(return_value=None) + mock_read.return_value = None assert thermal.get_high_critical_threshold() is None - def test_set_thermal_algorithm_status(self): + @mock.patch('glob.iglob', mock.MagicMock(return_value=['thermal_zone1', 'thermal_zone2'])) + @mock.patch('sonic_platform.utils.write_file') + def test_set_thermal_algorithm_status(self, mock_write): from sonic_platform.thermal import Thermal, THERMAL_ZONE_FOLDER_WILDCARD, THERMAL_ZONE_POLICY_FILE, THERMAL_ZONE_MODE_FILE - from sonic_platform import utils - glob.iglob = mock.MagicMock(return_value=['thermal_zone1', 'thermal_zone2']) - utils.write_file = mock.MagicMock() assert Thermal.set_thermal_algorithm_status(True, False) for folder in glob.iglob(THERMAL_ZONE_FOLDER_WILDCARD): - utils.write_file.assert_any_call(os.path.join(folder, THERMAL_ZONE_POLICY_FILE), 'step_wise') - utils.write_file.assert_any_call(os.path.join(folder, THERMAL_ZONE_MODE_FILE), 'enabled') + mock_write.assert_any_call(os.path.join(folder, THERMAL_ZONE_POLICY_FILE), 'step_wise') + mock_write.assert_any_call(os.path.join(folder, THERMAL_ZONE_MODE_FILE), 'enabled') assert Thermal.set_thermal_algorithm_status(False, False) for folder in glob.iglob(THERMAL_ZONE_FOLDER_WILDCARD): - utils.write_file.assert_any_call(os.path.join(folder, THERMAL_ZONE_POLICY_FILE), 'user_space') - utils.write_file.assert_any_call(os.path.join(folder, THERMAL_ZONE_MODE_FILE), 'disabled') + mock_write.assert_any_call(os.path.join(folder, THERMAL_ZONE_POLICY_FILE), 'user_space') + mock_write.assert_any_call(os.path.join(folder, THERMAL_ZONE_MODE_FILE), 'disabled') assert not Thermal.set_thermal_algorithm_status(False, False) @@ -283,10 +281,10 @@ def mock_read_int_from_file(file_path, **kwargs): mock_file_content[os.path.join('thermal_zone2', THERMAL_ZONE_TEMP_FILE)] = 81000 assert Thermal.get_min_allowed_cooling_level_by_thermal_zone() is None + @mock.patch('glob.iglob', mock.MagicMock(return_value=['thermal_zone1', 'thermal_zone2'])) def test_check_module_temperature_trustable(self): from sonic_platform.thermal import Thermal from sonic_platform import utils - glob.iglob = mock.MagicMock(return_value=['thermal_zone1', 'thermal_zone2']) utils.read_int_from_file = mock.MagicMock(return_value=1) assert Thermal.check_module_temperature_trustable() == 'untrust' diff --git a/platform/mellanox/mlnx-platform-api/tests/test_utils.py b/platform/mellanox/mlnx-platform-api/tests/test_utils.py index 5e01fc70dc0e..ad474433bfe8 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_utils.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_utils.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -122,12 +122,45 @@ def func(): def test_run_command(self): output = utils.run_command(['ls']) assert output + assert utils.run_command(['not_a_command']) is None + def test_run_command_exception(self): + output = utils.run_command(['ls']) + assert output + + @mock.patch('sonic_platform.utils.load_json_file') + @mock.patch('os.path.exists') + @mock.patch('sonic_py_common.device_info.get_path_to_port_config_file', mock.MagicMock(return_value='')) @mock.patch('sonic_py_common.device_info.get_path_to_hwsku_dir', mock.MagicMock(return_value='/tmp')) - def test_extract_RJ45_ports_index(self): + def test_extract_RJ45_ports_index(self, mock_exists, mock_load_json): + mock_exists.return_value = False rj45_list = utils.extract_RJ45_ports_index() assert rj45_list is None + mock_exists.return_value = True + platform_json = { + 'interfaces': { + "Ethernet0": { + "index": "1", + "lanes": "0", + "breakout_modes": { + "1x1000[100,10]": ["etp1"] + } + } + } + } + hwsku_json = { + 'interfaces': { + "Ethernet0": { + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" + } + } + } + + mock_load_json.side_effect = [platform_json, hwsku_json] + assert utils.extract_RJ45_ports_index() == [0] + def test_wait_until(self): values = [] assert utils.wait_until(lambda: len(values) == 0, timeout=1) @@ -141,3 +174,20 @@ def thread_func(items): t.start() assert utils.wait_until(lambda: len(values) > 0, timeout=5) t.join() + + def test_load_json_file(self): + assert utils.load_json_file('some_file') is None + + mock_os_open = mock.mock_open(read_data='') + with mock.patch('sonic_platform.utils.open', mock_os_open): + assert utils.load_json_file('some_file') is None + + mock_os_open = mock.mock_open(read_data='{"a": "b"}') + with mock.patch('sonic_platform.utils.open', mock_os_open): + data = utils.load_json_file('some_file') + assert data['a'] == 'b' + + def test_read_key_value_file(self): + mock_os_open = mock.mock_open(read_data='a:b') + with mock.patch('sonic_platform.utils.open', mock_os_open): + assert utils.read_key_value_file('some_file') == {'a':'b'} diff --git a/platform/mellanox/mlnx-platform-api/tests/test_watchdog.py b/platform/mellanox/mlnx-platform-api/tests/test_watchdog.py new file mode 100644 index 000000000000..d3dff9db8735 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/tests/test_watchdog.py @@ -0,0 +1,129 @@ +# +# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# 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 pytest +import sys +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +test_path = os.path.dirname(os.path.abspath(__file__)) +modules_path = os.path.dirname(test_path) +sys.path.insert(0, modules_path) + +from sonic_platform.chassis import Chassis +from sonic_platform.watchdog import get_watchdog, \ + WatchdogType2, \ + WatchdogType1, \ + is_mlnx_wd_main, \ + is_wd_type2 + + +class TestWatchdog: + @mock.patch('sonic_platform.watchdog.is_mlnx_wd_main') + @mock.patch('sonic_platform.watchdog.os.listdir') + def test_get_watchdog_no_device(self, mock_listdir, mock_is_main): + mock_listdir.return_value = [] + assert get_watchdog() is None + + mock_listdir.return_value = ['invalid'] + mock_is_main.return_value = True + assert get_watchdog() is None + + mock_listdir.return_value = ['watchdog1'] + mock_is_main.return_value = False + assert get_watchdog() is None + + @mock.patch('sonic_platform.watchdog.is_mlnx_wd_main') + @mock.patch('sonic_platform.watchdog.is_wd_type2') + @mock.patch('sonic_platform.watchdog.os.listdir', mock.MagicMock(return_value=['watchdog1', 'watchdog2'])) + @mock.patch('sonic_platform.watchdog.WatchdogImplBase.open_handle', mock.MagicMock()) + @mock.patch('sonic_platform.watchdog.fcntl.ioctl', mock.MagicMock()) + @pytest.mark.parametrize('test_para', + [(True, WatchdogType2), (False, WatchdogType1)]) + def test_get_watchdog(self, mock_is_type2, mock_is_main, test_para): + mock_is_main.side_effect = lambda dev: dev == 'watchdog2' + mock_is_type2.return_value = test_para[0] + chassis = Chassis() + watchdog = chassis.get_watchdog() + assert isinstance(watchdog, test_para[1]) + assert watchdog.watchdog_path == '/dev/watchdog2' + + def test_is_mlnx_wd_main(self): + mock_os_open = mock.mock_open(read_data='mlx-wdt-main') + with mock.patch('sonic_platform.watchdog.open', mock_os_open): + assert is_mlnx_wd_main('') + + mock_os_open = mock.mock_open(read_data='invalid') + with mock.patch('sonic_platform.watchdog.open', mock_os_open): + assert not is_mlnx_wd_main('') + mock_os_open.side_effect = IOError + with mock.patch('sonic_platform.watchdog.open', mock_os_open): + assert not is_mlnx_wd_main('') + + @mock.patch('sonic_platform.watchdog.os.path.exists') + @pytest.mark.parametrize('test_para', + [True, False]) + def test_is_wd_type2(self, mock_exists, test_para): + mock_exists.return_value = test_para + assert is_wd_type2('') is test_para + + @mock.patch('sonic_platform.watchdog.WatchdogImplBase.open_handle', mock.MagicMock()) + @mock.patch('sonic_platform.watchdog.fcntl.ioctl', mock.MagicMock()) + def test_arm_disarm_watchdog2(self): + watchdog = WatchdogType2('watchdog2') + assert watchdog.arm(-1) == -1 + assert not watchdog.is_armed() + watchdog.arm(10) + assert watchdog.is_armed() + watchdog.arm(5) + assert watchdog.is_armed() + watchdog.disarm() + assert not watchdog.is_armed() + + @mock.patch('sonic_platform.watchdog.WatchdogImplBase.open_handle', mock.MagicMock()) + @mock.patch('sonic_platform.watchdog.fcntl.ioctl', mock.MagicMock()) + def test_arm_disarm_watchdog1(self): + watchdog = WatchdogType1('watchdog1') + assert watchdog.arm(-1) == -1 + assert not watchdog.is_armed() + watchdog.arm(10) + assert watchdog.is_armed() + watchdog.arm(5) + assert watchdog.is_armed() + watchdog.disarm() + assert not watchdog.is_armed() + + @mock.patch('sonic_platform.watchdog.WatchdogImplBase.open_handle', mock.MagicMock()) + @mock.patch('sonic_platform.watchdog.fcntl.ioctl', mock.MagicMock()) + @mock.patch('sonic_platform.watchdog.WatchdogImplBase._gettimeleft', mock.MagicMock(return_value=10)) + def test_get_remaining_time_watchdog2(self): + watchdog = WatchdogType2('watchdog2') + assert watchdog.get_remaining_time() == -1 + watchdog.arm(10) + assert watchdog.get_remaining_time() == 10 + + @mock.patch('sonic_platform.watchdog.WatchdogImplBase.open_handle', mock.MagicMock()) + @mock.patch('sonic_platform.watchdog.fcntl.ioctl', mock.MagicMock()) + @mock.patch('sonic_platform.watchdog.WatchdogImplBase._gettimeleft', mock.MagicMock(return_value=10)) + def test_get_remaining_time_watchdog1(self): + watchdog = WatchdogType1('watchdog2') + assert watchdog.get_remaining_time() == -1 + watchdog.arm(10) + assert watchdog.get_remaining_time() > 0 From b11c6d47ea44c5510a4b22ac818c24e41b781923 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 4 Aug 2023 15:15:04 +0800 Subject: [PATCH 095/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#16032) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index cd882cc8cefc..cf346a310a3a 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit cd882cc8cefc2a0e0c6a016d01f20eb482672c5c +Subproject commit cf346a310a3a8981905d57f31987a6c8d9aa5085 From abccdaeb6cff0ef583290d11405b64c27418bfd1 Mon Sep 17 00:00:00 2001 From: pettershao-ragilenetworks <81281940+pettershao-ragilenetworks@users.noreply.github.com> Date: Sat, 5 Aug 2023 03:01:49 +0800 Subject: [PATCH 096/145] [Ragile]Adapt kernel 5.10 for broadcom on RA-B6510-48V8C (#14809) * Adapt kernel 5.10 for broadcom on RA-B6510-48V4C Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * modify one-image.mk file Signed-off-by: pettershao-ragilenetworks * modify debian/rule.mk Signed-off-by: pettershao-ragilenetworks * Add platform.json file Signed-off-by: pettershao-ragilenetworks --------- Signed-off-by: pettershao-ragilenetworks --- .../RA-B6510-48V8C/port_config.ini | 114 +- ...d3-ra-b6510-48v8c-48x25G+8x100G.config.bcm | 788 +- .../custom_led.bin | Bin 300 -> 236 bytes .../x86_64-ragile_ra-b6510-48v8c-r0/dev.xml | 509 +- .../dev_exhaust.xml | 419 ++ .../x86_64-ragile_ra-b6510-48v8c-r0/fru.py | 961 +++ .../latest_firmware/bios_upgrade_header.bin | Bin 0 -> 8388725 bytes .../cpu_cpld_upgrade_header.vme | Bin 0 -> 286723 bytes .../latest_firmware/fpga_upgrade_header.bin | Bin 0 -> 3180414 bytes .../other_cpld_upgrade_header.vme | Bin 0 -> 1105536 bytes .../monitor.py | 378 +- .../x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml | 21 +- .../pddf/pd-plugin.json | 67 - .../pddf/pddf-device.json | 6502 ----------------- .../platform.json | 402 + .../platform_components.json | 37 + .../plugins/eeprom.py | 25 - .../plugins/fanutil.py | 187 - .../plugins/ledutil.py | 59 - .../plugins/psuutil.py | 270 - .../plugins/sfputil.py | 389 +- .../plugins/ssd_util.py | 311 + .../plugins/sysstatutil.py | 82 - .../plugins/thermalutil.py | 75 - .../pmon_daemon_control.json | 6 +- .../sensors.conf | 21 - .../sonic_platform_config/chassis.json | 3 - .../sonic_platform_config/component.json | 60 - .../sonic_platform_config/fan.json | 152 - .../sonic_platform_config/psu.json | 134 - .../sonic_platform_config/thermal.json | 130 - ...t => system_health_monitoring_config.json} | 0 .../systest.py | 43 - platform/broadcom/one-image.mk | 3 - platform/broadcom/platform-modules-ragile.mk | 30 +- .../sonic-platform-modules-ragile/LICENSE | 1 - .../common/Makefile | 27 +- .../common/app/Makefile | 25 + .../common/app/dev_util/Makefile | 30 + .../common/app/dev_util/dfd_debug.c | 43 + .../common/app/dev_util/dfd_utest.c | 1802 +++++ .../common/app/dev_util/dfd_utest.h | 103 + .../common/app/firmware_upgrade/Makefile | 19 + .../common/app/firmware_upgrade/Rules.mk | 42 + .../firmware_upgrade/firmware_driver/Makefile | 19 + .../firmware_driver_cpld/Makefile | 23 + .../firmware_driver_cpld/firmware.c | 144 + .../firmware_driver_cpld/firmware_cpld.c | 384 + .../firmware_cpld_upgrade.c | 1879 +++++ .../firmware_driver_cpld/include/firmware.h | 82 + .../include/firmware_cpld.h | 64 + .../firmware_driver_cpld/include/jbi.h | 15 + .../firmware_driver_cpld/jbicomp.c | 438 ++ .../firmware_driver_cpld/jbicomp.h | 37 + .../firmware_driver_cpld/jbiexprt.h | 224 + .../firmware_driver_cpld/jbijtag.c | 1679 +++++ .../firmware_driver_cpld/jbijtag.h | 146 + .../firmware_driver_cpld/jbimain.c | 3362 +++++++++ .../firmware_driver_cpld/jbiport.h | 45 + .../firmware_driver_cpld/jbistub.c | 2518 +++++++ .../firmware_driver_cpld/jbistub.h | 95 + .../firmware_driver_ispvme/Makefile | 22 + .../firmware_cpld_ispvme.c | 450 ++ .../firmware_cpld_upgrade_ispvme.c | 691 ++ .../firmware_driver_ispvme/firmware_ispvme.c | 140 + .../include/firmware_cpld_ispvme.h | 70 + .../include/firmware_ispvme.h | 86 + .../firmware_driver_sysfs/Makefile | 22 + .../firmware_driver_sysfs/firmware.c | 143 + .../firmware_driver_sysfs/firmware_sysfs.c | 495 ++ .../firmware_sysfs_upgrade.c | 258 + .../include/firmware_sysfs.h | 88 + .../include/firmware_sysfs_upgrade.h | 72 + .../include/firmware_upgrade.h | 57 + .../firmware_upgrade/Makefile | 33 + .../firmware_upgrade/firmware_upgrade/crc32.c | 216 + .../firmware_upgrade/firmware_upgrade/debug.c | 60 + .../firmware_upgrade/firmware_app.c | 985 +++ .../fw_upg_gpio_vme/hardware.c | 263 + .../fw_upg_gpio_vme/ispvm_ui.c | 837 +++ .../fw_upg_gpio_vme/ivm_core.c | 3097 ++++++++ .../fw_upg_isc/firmware_upgrade_isc.c | 68 + .../fw_upg_mtd/firmware_upgrade_mtd.c | 446 ++ .../fw_upg_mtd/firmware_upgrade_mtd.h | 32 + .../firmware_upgrade/fw_upg_mtd/mtd-abi.h | 259 + .../fw_upg_sysfs/firmware_upgrade_sysfs.c | 285 + .../fw_upg_sysfs/firmware_upgrade_sysfs.h | 16 + .../fw_upg_sysfs/fw_upg_spi_logic_dev.c | 1181 +++ .../fw_upg_sysfs/fw_upg_spi_logic_dev.h | 90 + .../firmware_upgrade/include/debug.h | 34 + .../firmware_upgrade/include/firmware_app.h | 172 + .../firmware_upgrade/include/vmopcode.h | 192 + .../common/app/fw_upgrade/Makefile | 18 + .../common/app/fw_upgrade/Rules.mk | 42 + .../common/app/fw_upgrade/fw_upgrade/Makefile | 39 + .../app/fw_upgrade/fw_upgrade/fw_upgrade.c | 1632 +++++ .../fw_upgrade/fw_upgrade/fw_upgrade_debug.c | 51 + .../fw_upgrade/include/fw_upgrade.h | 230 + .../fw_upgrade/include/fw_upgrade_debug.h | 25 + .../common/depmod_conf/distsearch.conf | 4 - .../lib/{rgutil => algorithm}/__init__.py | 0 .../common/lib/algorithm/hysteresis.py | 169 + .../common/lib/algorithm/openloop.py | 104 + .../common/lib/algorithm/pid.py | 106 + .../common/lib/eepromutil/fantlv.py | 76 +- .../common/lib/eepromutil/fru.py | 121 +- .../common/lib/eepromutil/onietlv.py | 441 ++ .../common/lib/plat_hal/__init__.py | 0 .../common/lib/plat_hal/baseutil.py | 164 + .../common/lib/plat_hal/chassisbase.py | 318 + .../common/lib/plat_hal/component.py | 33 + .../common/lib/plat_hal/cpld.py | 66 + .../common/lib/plat_hal/cpu.py | 48 + .../common/lib/plat_hal/dcdc.py | 11 + .../common/lib/plat_hal/devicebase.py | 355 + .../common/lib/plat_hal/fan.py | 413 ++ .../common/lib/plat_hal/interface.py | 1324 ++++ .../common/lib/plat_hal/led.py | 52 + .../common/lib/plat_hal/onie_e2.py | 127 + .../common/lib/plat_hal/osutil.py | 440 ++ .../common/lib/plat_hal/psu.py | 607 ++ .../common/lib/plat_hal/rotor.py | 149 + .../common/lib/plat_hal/sensor.py | 219 + .../common/lib/plat_hal/temp.py | 139 + .../common/lib/rgutil/logutil.py | 67 - .../common/lib/wbutil/__init__.py | 0 .../common/lib/{rgutil => wbutil}/baseutil.py | 23 +- .../common/lib/{rgutil => wbutil}/smbus.py | 93 +- .../kernel_drivers_blacklist.conf | 5 + .../common/modules/Makefile | 70 +- .../common/modules/csu550.c | 252 - .../common/modules/dfd_tlveeprom.c | 516 ++ .../common/modules/dfd_tlveeprom.h | 121 + .../common/modules/fpga_i2c.h | 133 + .../common/modules/fpga_i2c_ocores.c | 911 --- .../common/modules/fpga_i2c_ocores.h | 13 - .../common/modules/fpga_pcie_i2c.c | 1144 --- .../common/modules/fpga_pcie_i2c.h | 107 - .../common/modules/fpga_reg_defs.h | 174 - .../common/modules/i2c-mux-pca954x.c | 1676 ----- .../common/modules/i2c-mux-pca9641.c | 653 -- .../common/modules/intel_spi/Makefile | 21 + .../modules/intel_spi/include/intel_spi.h | 23 + .../common/modules/intel_spi/intel_spi.c | 969 +++ .../modules/intel_spi/intel_spi_platform.c | 167 + .../common/modules/linux-5.10/Makefile | 34 + .../common/modules/linux-5.10/wb_at24.c | 861 +++ .../common/modules/linux-5.10/wb_csu550.c | 236 + .../modules/linux-5.10/wb_i2c_algo_bit.c | 725 ++ .../common/modules/linux-5.10/wb_i2c_gpio.c | 431 ++ .../modules/linux-5.10/wb_i2c_gpio_device.c | 110 + .../common/modules/linux-5.10/wb_i2c_i801.c | 2114 ++++++ .../modules/linux-5.10/wb_i2c_mux_pca954x.c | 1343 ++++ .../modules/linux-5.10/wb_i2c_mux_pca954x.h | 67 + .../modules/linux-5.10/wb_i2c_mux_pca9641.c | 1375 ++++ .../modules/linux-5.10/wb_i2c_mux_pca9641.h | 64 + .../common/modules/linux-5.10/wb_ina3221.c | 1031 +++ .../common/modules/linux-5.10/wb_isl68137.c | 572 ++ .../common/modules/linux-5.10/wb_lm75.c | 987 +++ .../common/modules/linux-5.10/wb_lm75.h | 40 + .../common/modules/linux-5.10/wb_pmbus.h | 535 ++ .../common/modules/linux-5.10/wb_pmbus_core.c | 2780 +++++++ .../common/modules/linux-5.10/wb_tmp401.c | 798 ++ .../common/modules/linux-5.10/wb_tps53622.c | 265 + .../common/modules/linux-5.10/wb_ucd9000.c | 675 ++ .../common/modules/lpc_cpld_i2c_ocores.c | 843 --- .../common/modules/lpc_cpld_i2c_ocores.h | 13 - .../common/modules/lpc_dbg.c | 534 -- .../common/modules/lpc_dbg.h | 39 - .../common/modules/plat_sysfs/Makefile | 20 + .../modules/plat_sysfs/dev_cfg/Makefile | 25 + .../modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c | 812 ++ .../plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c | 351 + .../plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c | 236 + .../plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c | 587 ++ .../plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c | 82 + .../plat_sysfs/dev_cfg/dfd_fan_driver.c | 170 + .../modules/plat_sysfs/dev_cfg/dfd_module.c | 95 + .../plat_sysfs/dev_cfg/dfd_psu_driver.c | 70 + .../plat_sysfs/dev_cfg/dfd_sensors_driver.c | 149 + .../plat_sysfs/dev_cfg/dfd_sff_driver.c | 56 + .../plat_sysfs/dev_cfg/dfd_slot_driver.c | 27 + .../plat_sysfs/dev_cfg/include/dfd_cfg.h | 97 + .../dev_cfg/include/dfd_cfg_adapter.h | 46 + .../plat_sysfs/dev_cfg/include/dfd_cfg_file.h | 37 + .../plat_sysfs/dev_cfg/include/dfd_cfg_info.h | 109 + .../dev_cfg/include/dfd_cfg_listnode.h | 30 + .../dev_cfg/include/dfd_fan_driver.h | 18 + .../plat_sysfs/dev_cfg/include/dfd_module.h | 96 + .../dev_cfg/include/dfd_psu_driver.h | 10 + .../dev_cfg/include/dfd_sensors_driver.h | 10 + .../dev_cfg/include/dfd_sff_driver.h | 8 + .../dev_cfg/include/dfd_slot_driver.h | 6 + .../modules/plat_sysfs/dev_sysfs/Makefile | 21 + .../dev_sysfs/include/plat_switch.h | 86 + .../dev_sysfs/include/sysfs_common.h | 90 + .../modules/plat_sysfs/dev_sysfs/plat_fan.c | 505 ++ .../modules/plat_sysfs/dev_sysfs/plat_psu.c | 430 ++ .../plat_sysfs/dev_sysfs/plat_sensor.c | 457 ++ .../modules/plat_sysfs/dev_sysfs/plat_sff.c | 291 + .../modules/plat_sysfs/dev_sysfs/plat_slot.c | 667 ++ .../plat_sysfs/dev_sysfs/plat_switch.c | 135 + .../common/modules/platform_common.h | 74 + .../common/modules/platform_common_module.c | 210 + .../common/modules/pmbus.h | 520 -- .../common/modules/ragile_common_module.c | 76 - .../common/modules/ragile_platform.c | 97 - .../common/modules/rg-gpio-xeon.c | 357 - .../common/modules/rg-i2c-algo-bit.c | 734 -- .../common/modules/rg-i2c-gpio.c | 431 -- .../common/modules/rg_fan.c | 266 - .../common/modules/rg_psu.c | 340 - .../common/modules/spi-bitbang-txrx.h | 107 + .../common/modules/wb_eeprom_93xx46.c | 558 ++ .../common/modules/wb_fpga_i2c_bus_drv.c | 1121 +++ .../common/modules/wb_fpga_pca954x_drv.c | 525 ++ .../common/modules/wb_fpga_pcie.c | 164 + .../common/modules/wb_gpio_d1500.c | 367 + .../common/modules/wb_gpio_device.c | 54 + .../common/modules/wb_i2c_dev.c | 774 ++ .../common/modules/wb_i2c_dev.h | 20 + .../common/modules/wb_i2c_ocores.c | 1143 +++ .../common/modules/wb_i2c_ocores.h | 28 + .../common/modules/wb_io_dev.c | 571 ++ .../common/modules/wb_io_dev.h | 21 + .../common/modules/wb_lpc_drv.c | 166 + .../common/modules/wb_lpc_drv.h | 18 + .../common/modules/wb_mac_bsc.c | 660 ++ .../common/modules/wb_optoe.c | 1192 +++ .../common/modules/wb_pcie_dev.c | 770 ++ .../common/modules/wb_pcie_dev.h | 26 + .../common/modules/wb_platform_i2c_dev.c | 749 ++ .../common/modules/wb_platform_i2c_dev.h | 19 + .../common/modules/wb_spi_93xx46.c | 111 + .../common/modules/wb_spi_dev.c | 583 ++ .../common/modules/wb_spi_dev.h | 16 + .../common/modules/wb_spi_gpio.c | 477 ++ .../common/modules/wb_spi_gpio_device.c | 153 + .../common/modules/wb_spi_nor_device.c | 87 + .../common/modules/wb_spi_ocores.c | 1025 +++ .../common/modules/wb_spi_ocores.h | 21 + .../common/modules/wb_uio_irq.c | 282 + .../common/modules/wb_wdt.c | 1038 +++ .../common/modules/wb_wdt.h | 46 + .../common/modules/wb_xdpe132g5c.c | 574 ++ .../common/script/auto_update.py | 196 + .../common/script/avscontrol.py | 236 +- .../common/script/dev_monitor.py | 303 + .../common/script/device_i2c.py | 327 - .../common/script/fancontrol.py | 994 --- .../common/script/generate_airflow.py | 236 + .../common/script/hal_fanctrl.py | 1135 +++ .../common/script/hal_ledctrl.py | 830 +++ .../common/script/hal_pltfm.py | 492 ++ .../common/script/intelligent_monitor.py | 144 + .../script/intelligent_monitor/monitor_fan.py | 284 + .../common/script/platform_common.py | 178 + .../common/script/platform_config.py | 184 + .../common/script/platform_driver.py | 258 + .../common/script/platform_e2.py | 434 ++ .../common/script/platform_intf.py | 367 + .../common/script/platform_ipmi.py | 92 + .../common/script/platform_manufacturer.py | 591 ++ .../common/script/platform_process.py | 396 + .../common/script/platform_sensors.py | 253 + .../common/script/platform_test.py | 142 + .../common/script/platform_util.py | 845 +++ .../common/script/pmon_syslog.py | 519 ++ .../common/script/ragilecommon.py | 1365 ---- .../common/script/ragileconfig.py | 225 - .../common/script/ragileutil.py | 2099 ------ .../common/script/reboot_cause.py | 183 + .../common/script/reboot_ctrl.py | 150 + .../common/script/sensors | 8 + .../common/script/sfp_highest_temperatue.py | 148 + .../common/script/slot_monitor.py | 242 + .../common/script/ssdmon | 82 + .../common/script/tty_console.py | 91 + .../common/script/upgrade.py | 991 +++ .../common/script/warm_upgrade.py | 514 ++ .../common/service/device_i2c.service | 15 - .../common/service/platform_driver.service | 15 + .../common/service/platform_process.service | 16 + .../common/sonic_platform/__init__.py | 2 + .../common/sonic_platform/chassis.py | 530 ++ .../common/sonic_platform/component.py | 226 + .../common/sonic_platform/dcdc.py | 85 + .../common/sonic_platform/eeprom.py | 92 + .../common/sonic_platform/fan.py | 308 + .../common/sonic_platform/fan_drawer.py | 167 + .../common/sonic_platform/pcie.py | 21 + .../sonic_platform/platform.py | 18 +- .../common/sonic_platform/psu.py | 359 + .../sonic_platform/sfp.py | 211 +- .../common/sonic_platform/thermal.py | 234 + .../common/sonic_platform/watchdog.py | 236 + .../debian/compat | 2 +- .../debian/control | 6 +- .../debian/copyright | 1 - ...form-modules-ragile-ra-b6510-48v8c.install | 2 +- ...orm-modules-ragile-ra-b6510-48v8c.postinst | 7 - .../debian/rule-ragile.mk | 8 - .../debian/rule.mk | 5 + .../debian/rules | 67 +- .../ra-b6510-48v8c/LICENSE | 15 - .../ra-b6510-48v8c/MAINTAINERS | 5 - .../ra-b6510-48v8c/Makefile | 18 +- .../ra-b6510-48v8c/README.md | 1 - .../x86_64_ragile_ra_b6510_48v8c_r0_config.py | 1498 ++-- ...64_ragile_ra_b6510_48v8c_r0_port_config.py | 7 + .../x86_64_ragile_ra_b6510_48v8c_r0_device.py | 1234 ++++ ...ragile_ra_b6510_48v8c_r0_exhaust_device.py | 1232 ++++ ...x86_64_ragile_ra_b6510_48v8c_r0_monitor.py | 206 + .../ra-b6510-48v8c/modules/driver/Makefile | 16 +- .../ra-b6510-48v8c/modules/driver/rg_cpld.c | 602 -- .../driver/wb_firmware_upgrade_device.c | 178 + .../modules/driver/wb_i2c_dev_device.c | 140 + .../driver/wb_i2c_mux_pca954x_device.c | 296 + .../modules/driver/wb_i2c_ocores_device.c | 423 ++ .../modules/driver/wb_io_dev_device.c | 103 + .../modules/driver/wb_lpc_drv_device.c | 130 + .../modules/driver/wb_pcie_dev_device.c | 93 + .../plat_sysfs_cfg/WB_PLAT_CPLD.cfg | 41 + .../plat_sysfs_cfg/WB_PLAT_FAN.cfg | 304 + .../plat_sysfs_cfg/WB_PLAT_PSU.cfg | 64 + .../plat_sysfs_cfg/WB_PLAT_SFF.cfg | 521 ++ .../plat_sysfs_cfg/cfg_file_name | 4 + .../scripts/pddf_post_driver_install.sh | 31 - .../ra-b6510-48v8c/setup.py | 18 +- .../ra-b6510-48v8c/sonic_pcie/__init__.py | 1 - .../ra-b6510-48v8c/sonic_pcie/pcie_common.py | 107 - .../ra-b6510-48v8c/sonic_platform/__init__.py | 4 - .../ra-b6510-48v8c/sonic_platform/chassis.py | 134 - .../ra-b6510-48v8c/sonic_platform/common.py | 44 - .../sonic_platform/component.py | 110 - .../ra-b6510-48v8c/sonic_platform/config.py | 558 -- .../ra-b6510-48v8c/sonic_platform/eeprom.py | 12 - .../ra-b6510-48v8c/sonic_platform/fan.py | 36 - .../sonic_platform/fan_drawer.py | 17 - .../ra-b6510-48v8c/sonic_platform/hwaccess.py | 47 - .../ra-b6510-48v8c/sonic_platform/logger.py | 19 - .../ra-b6510-48v8c/sonic_platform/pcie.py | 43 - .../ra-b6510-48v8c/sonic_platform/psu.py | 104 - .../ra-b6510-48v8c/sonic_platform/regutil.py | 245 - .../ra-b6510-48v8c/sonic_platform/rotor.py | 41 - .../sonic_platform/sfp_config.py | 23 - .../ra-b6510-48v8c/sonic_platform/thermal.py | 14 - .../ra-b6510-48v8c/sonic_platform/watchdog.py | 21 - .../systemd/pddf-platform-init.service | 1 - src/sonic-device-data/tests/permitted_list | 6 + 350 files changed, 90789 insertions(+), 25962 deletions(-) mode change 100755 => 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/cpu_cpld_upgrade_header.vme create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/fpga_upgrade_header.bin create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme mode change 100755 => 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/monitor.py delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py mode change 100755 => 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py create mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json rename device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/{pddf_support => system_health_monitoring_config.json} (100%) mode change 100644 => 100755 delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-ragile/LICENSE create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf rename platform/broadcom/sonic-platform-modules-ragile/common/lib/{rgutil => algorithm}/__init__.py (100%) mode change 100755 => 100644 create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py rename device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_env.conf => platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/__init__.py (100%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/__init__.py rename platform/broadcom/sonic-platform-modules-ragile/common/lib/{rgutil => wbutil}/baseutil.py (51%) rename platform/broadcom/sonic-platform-modules-ragile/common/lib/{rgutil => wbutil}/smbus.py (89%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/sensors create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py rename platform/broadcom/sonic-platform-modules-ragile/{ra-b6510-48v8c => common}/sonic_platform/platform.py (50%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py rename platform/broadcom/sonic-platform-modules-ragile/{ra-b6510-48v8c => common}/sonic_platform/sfp.py (74%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk create mode 100644 platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py delete mode 120000 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini index 823f53160c33..b71ad39648c9 100755 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini @@ -1,57 +1,57 @@ -# name lanes alias index speed admin_status -Ethernet1 1 twentyfiveGigE0/1 0 25000 up -Ethernet2 2 twentyfiveGigE0/2 1 25000 up -Ethernet3 3 twentyfiveGigE0/3 2 25000 up -Ethernet4 4 twentyfiveGigE0/4 3 25000 up -Ethernet5 5 twentyfiveGigE0/5 4 25000 up -Ethernet6 6 twentyfiveGigE0/6 5 25000 up -Ethernet7 7 twentyfiveGigE0/7 6 25000 up -Ethernet8 8 twentyfiveGigE0/8 7 25000 up -Ethernet9 13 twentyfiveGigE0/9 8 25000 up -Ethernet10 14 twentyfiveGigE0/10 9 25000 up -Ethernet11 15 twentyfiveGigE0/11 10 25000 up -Ethernet12 16 twentyfiveGigE0/12 11 25000 up -Ethernet13 21 twentyfiveGigE0/13 12 25000 up -Ethernet14 22 twentyfiveGigE0/14 13 25000 up -Ethernet15 23 twentyfiveGigE0/15 14 25000 up -Ethernet16 24 twentyfiveGigE0/16 15 25000 up -Ethernet17 29 twentyfiveGigE0/17 16 25000 up -Ethernet18 30 twentyfiveGigE0/18 17 25000 up -Ethernet19 31 twentyfiveGigE0/19 18 25000 up -Ethernet20 32 twentyfiveGigE0/20 19 25000 up -Ethernet21 33 twentyfiveGigE0/21 20 25000 up -Ethernet22 34 twentyfiveGigE0/22 21 25000 up -Ethernet23 35 twentyfiveGigE0/23 22 25000 up -Ethernet24 36 twentyfiveGigE0/24 23 25000 up -Ethernet25 41 twentyfiveGigE0/25 24 25000 up -Ethernet26 42 twentyfiveGigE0/26 25 25000 up -Ethernet27 43 twentyfiveGigE0/27 26 25000 up -Ethernet28 44 twentyfiveGigE0/28 27 25000 up -Ethernet29 49 twentyfiveGigE0/29 28 25000 up -Ethernet30 50 twentyfiveGigE0/30 29 25000 up -Ethernet31 51 twentyfiveGigE0/31 30 25000 up -Ethernet32 52 twentyfiveGigE0/32 31 25000 up -Ethernet33 57 twentyfiveGigE0/33 32 25000 up -Ethernet34 58 twentyfiveGigE0/34 33 25000 up -Ethernet35 59 twentyfiveGigE0/35 34 25000 up -Ethernet36 60 twentyfiveGigE0/36 35 25000 up -Ethernet37 61 twentyfiveGigE0/37 36 25000 up -Ethernet38 62 twentyfiveGigE0/38 37 25000 up -Ethernet39 63 twentyfiveGigE0/39 38 25000 up -Ethernet40 64 twentyfiveGigE0/40 39 25000 up -Ethernet41 65 twentyfiveGigE0/41 40 25000 up -Ethernet42 66 twentyfiveGigE0/42 41 25000 up -Ethernet43 67 twentyfiveGigE0/43 42 25000 up -Ethernet44 68 twentyfiveGigE0/44 43 25000 up -Ethernet45 69 twentyfiveGigE0/45 44 25000 up -Ethernet46 70 twentyfiveGigE0/46 45 25000 up -Ethernet47 71 twentyfiveGigE0/47 46 25000 up -Ethernet48 72 twentyfiveGigE0/48 47 25000 up -Ethernet49 85,86,87,88 hundredGigE0/1 48 100000 up -Ethernet50 77,78,79,80 hundredGigE0/2 49 100000 up -Ethernet51 97,98,99,100 hundredGigE0/3 50 100000 up -Ethernet52 93,94,95,96 hundredGigE0/4 51 100000 up -Ethernet53 113,114,115,116 hundredGigE0/5 52 100000 up -Ethernet54 105,106,107,108 hundredGigE0/6 53 100000 up -Ethernet55 121,122,123,124 hundredGigE0/7 54 100000 up -Ethernet56 125,126,127,128 hundredGigE0/8 55 100000 up +# name lanes alias index speed admin_status +Ethernet1 57 twentyfiveGigE0/1 1 25000 up +Ethernet2 58 twentyfiveGigE0/2 2 25000 up +Ethernet3 59 twentyfiveGigE0/3 3 25000 up +Ethernet4 60 twentyfiveGigE0/4 4 25000 up +Ethernet5 61 twentyfiveGigE0/5 5 25000 up +Ethernet6 62 twentyfiveGigE0/6 6 25000 up +Ethernet7 63 twentyfiveGigE0/7 7 25000 up +Ethernet8 64 twentyfiveGigE0/8 8 25000 up +Ethernet9 1 twentyfiveGigE0/9 9 25000 up +Ethernet10 2 twentyfiveGigE0/10 10 25000 up +Ethernet11 3 twentyfiveGigE0/11 11 25000 up +Ethernet12 4 twentyfiveGigE0/12 12 25000 up +Ethernet13 5 twentyfiveGigE0/13 13 25000 up +Ethernet14 6 twentyfiveGigE0/14 14 25000 up +Ethernet15 7 twentyfiveGigE0/15 15 25000 up +Ethernet16 8 twentyfiveGigE0/16 16 25000 up +Ethernet17 13 twentyfiveGigE0/17 17 25000 up +Ethernet18 14 twentyfiveGigE0/18 18 25000 up +Ethernet19 15 twentyfiveGigE0/19 19 25000 up +Ethernet20 16 twentyfiveGigE0/20 20 25000 up +Ethernet21 21 twentyfiveGigE0/21 21 25000 up +Ethernet22 22 twentyfiveGigE0/22 22 25000 up +Ethernet23 23 twentyfiveGigE0/23 23 25000 up +Ethernet24 24 twentyfiveGigE0/24 24 25000 up +Ethernet25 29 twentyfiveGigE0/25 25 25000 up +Ethernet26 30 twentyfiveGigE0/26 26 25000 up +Ethernet27 31 twentyfiveGigE0/27 27 25000 up +Ethernet28 32 twentyfiveGigE0/28 28 25000 up +Ethernet29 33 twentyfiveGigE0/29 29 25000 up +Ethernet30 34 twentyfiveGigE0/30 30 25000 up +Ethernet31 35 twentyfiveGigE0/31 31 25000 up +Ethernet32 36 twentyfiveGigE0/32 32 25000 up +Ethernet33 41 twentyfiveGigE0/33 33 25000 up +Ethernet34 42 twentyfiveGigE0/34 34 25000 up +Ethernet35 43 twentyfiveGigE0/35 35 25000 up +Ethernet36 44 twentyfiveGigE0/36 36 25000 up +Ethernet37 49 twentyfiveGigE0/37 37 25000 up +Ethernet38 50 twentyfiveGigE0/38 38 25000 up +Ethernet39 51 twentyfiveGigE0/39 39 25000 up +Ethernet40 52 twentyfiveGigE0/40 40 25000 up +Ethernet41 65 twentyfiveGigE0/41 41 25000 up +Ethernet42 66 twentyfiveGigE0/42 42 25000 up +Ethernet43 67 twentyfiveGigE0/43 43 25000 up +Ethernet44 68 twentyfiveGigE0/44 44 25000 up +Ethernet45 69 twentyfiveGigE0/45 45 25000 up +Ethernet46 70 twentyfiveGigE0/46 46 25000 up +Ethernet47 71 twentyfiveGigE0/47 47 25000 up +Ethernet48 72 twentyfiveGigE0/48 48 25000 up +Ethernet49 85,86,87,88 hundredGigE0/1 49 100000 up +Ethernet50 77,78,79,80 hundredGigE0/2 50 100000 up +Ethernet51 97,98,99,100 hundredGigE0/3 51 100000 up +Ethernet52 93,94,95,96 hundredGigE0/4 52 100000 up +Ethernet53 113,114,115,116 hundredGigE0/5 53 100000 up +Ethernet54 105,106,107,108 hundredGigE0/6 54 100000 up +Ethernet55 121,122,123,124 hundredGigE0/7 55 100000 up +Ethernet56 125,126,127,128 hundredGigE0/8 56 100000 up diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm index 27656bd3d466..e86eb1b9fa36 100644 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm @@ -5,6 +5,8 @@ l3_alpm_enable=2 ipv6_lpm_128b_enable=0x1 l2xmsg_mode=0 l3_max_ecmp_mode=1 +svi_my_station_optimization=1 +sai_nbr_bcast_ifp_optimized=2 bcm_num_cos=8 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 @@ -22,381 +24,579 @@ oversubscribe_mode=1 parity_enable=1 pbmp_gport_stack.0=0x0000000000000000000000000000000000000000000000000000000000000000 #pbmp_xport_xe.0=0x00000000000000000000000000000000888ffffffffffff9fffffffffffffffe -pbmp_xport_xe=0x488080808808087f9fe1e1e1fe1e1e1fe -phy_chain_rx_lane_map_physical{1.0}=0x1032 +pbmp_xport_xe=0xffffffffffffffffffffffffffffffffffffffffe +port_flex_enable=1 +phy_chain_tx_lane_map_physical{57.0}=0x0123 +phy_chain_tx_lane_map_physical{61.0}=0x0123 phy_chain_tx_lane_map_physical{1.0}=0x0123 -phy_chain_rx_lane_map_physical{5.0}=0x1032 phy_chain_tx_lane_map_physical{5.0}=0x0123 -phy_chain_rx_lane_map_physical{13.0}=0x1032 phy_chain_tx_lane_map_physical{13.0}=0x0123 -phy_chain_rx_lane_map_physical{21.0}=0x1032 phy_chain_tx_lane_map_physical{21.0}=0x0123 -phy_chain_rx_lane_map_physical{29.0}=0x1032 phy_chain_tx_lane_map_physical{29.0}=0x0123 -phy_chain_rx_lane_map_physical{33.0}=0x1032 phy_chain_tx_lane_map_physical{33.0}=0x0123 -phy_chain_rx_lane_map_physical{41.0}=0x1032 phy_chain_tx_lane_map_physical{41.0}=0x0123 -phy_chain_rx_lane_map_physical{49.0}=0x1032 phy_chain_tx_lane_map_physical{49.0}=0x0123 +phy_chain_tx_lane_map_physical{65.0}=0x3210 +phy_chain_tx_lane_map_physical{69.0}=0x3210 +phy_chain_tx_lane_map_physical{85.0}=0x3210 +phy_chain_tx_lane_map_physical{77.0}=0x0213 +phy_chain_tx_lane_map_physical{97.0}=0x3210 +phy_chain_tx_lane_map_physical{93.0}=0x0213 +phy_chain_tx_lane_map_physical{113.0}=0x3210 +phy_chain_tx_lane_map_physical{105.0}=0x0213 +phy_chain_tx_lane_map_physical{121.0}=0x3120 +phy_chain_tx_lane_map_physical{125.0}=0x1203 + phy_chain_rx_lane_map_physical{57.0}=0x1032 -phy_chain_tx_lane_map_physical{57.0}=0x0123 phy_chain_rx_lane_map_physical{61.0}=0x1032 -phy_chain_tx_lane_map_physical{61.0}=0x0123 +phy_chain_rx_lane_map_physical{1.0}=0x1032 +phy_chain_rx_lane_map_physical{5.0}=0x1032 +phy_chain_rx_lane_map_physical{13.0}=0x1032 +phy_chain_rx_lane_map_physical{21.0}=0x1032 +phy_chain_rx_lane_map_physical{29.0}=0x1032 +phy_chain_rx_lane_map_physical{33.0}=0x1032 +phy_chain_rx_lane_map_physical{41.0}=0x1032 +phy_chain_rx_lane_map_physical{49.0}=0x1032 phy_chain_rx_lane_map_physical{65.0}=0x2301 -phy_chain_tx_lane_map_physical{65.0}=0x3210 phy_chain_rx_lane_map_physical{69.0}=0x2301 -phy_chain_tx_lane_map_physical{69.0}=0x3210 -phy_chain_rx_lane_map_physical{77.0}=0x1032 -phy_chain_tx_lane_map_physical{77.0}=0x3210 phy_chain_rx_lane_map_physical{85.0}=0x1032 -phy_chain_tx_lane_map_physical{85.0}=0x3210 -phy_chain_rx_lane_map_physical{93.0}=0x1032 -phy_chain_tx_lane_map_physical{93.0}=0x3210 +phy_chain_rx_lane_map_physical{77.0}=0x1032 phy_chain_rx_lane_map_physical{97.0}=0x1032 -phy_chain_tx_lane_map_physical{97.0}=0x3210 -phy_chain_rx_lane_map_physical{105.0}=0x1032 -phy_chain_tx_lane_map_physical{105.0}=0x3210 +phy_chain_rx_lane_map_physical{93.0}=0x1032 phy_chain_rx_lane_map_physical{113.0}=0x1032 -phy_chain_tx_lane_map_physical{113.0}=0x3210 +phy_chain_rx_lane_map_physical{105.0}=0x1032 phy_chain_rx_lane_map_physical{121.0}=0x2031 -phy_chain_tx_lane_map_physical{121.0}=0x3210 -phy_chain_rx_lane_map_physical{125.0}=0x1032 -phy_chain_tx_lane_map_physical{125.0}=0x1203 -phy_chain_tx_polarity_flip_physical{1.0}=0x1 -phy_chain_rx_polarity_flip_physical{1.0}=0x0 +phy_chain_rx_lane_map_physical{125.0}=0x1023 + +portmap_57=57:25 +portmap_58=58:25 +portmap_59=59:25 +portmap_60=60:25 +portmap_61=61:25 +portmap_62=62:25 +portmap_63=63:25 +portmap_64=64:25 +portmap_1=1:25 +portmap_2=2:25 +portmap_3=3:25 +portmap_4=4:25 +portmap_5=5:25 +portmap_6=6:25 +portmap_7=7:25 +portmap_8=8:25 +portmap_13=13:25 +portmap_14=14:25 +portmap_15=15:25 +portmap_16=16:25 +portmap_21=21:25 +portmap_22=22:25 +portmap_23=23:25 +portmap_24=24:25 +portmap_29=29:25 +portmap_30=30:25 +portmap_31=31:25 +portmap_32=32:25 +portmap_33=33:25 +portmap_34=34:25 +portmap_35=35:25 +portmap_36=36:25 +portmap_41=41:25 +portmap_42=42:25 +portmap_43=43:25 +portmap_44=44:25 +portmap_49=49:25 +portmap_50=50:25 +portmap_51=51:25 +portmap_52=52:25 +portmap_67=65:25 +portmap_68=66:25 +portmap_69=67:25 +portmap_70=68:25 +portmap_71=69:25 +portmap_72=70:25 +portmap_73=71:25 +portmap_74=72:25 +portmap_87=85:100 +portmap_79=77:100 +portmap_99=97:100 +portmap_95=93:100 +portmap_115=113:100 +portmap_107=105:100 +portmap_123=121:100 +portmap_127=125:100 + +dport_map_port_57=1 +dport_map_port_58=2 +dport_map_port_59=3 +dport_map_port_60=4 +dport_map_port_61=5 +dport_map_port_62=6 +dport_map_port_63=7 +dport_map_port_64=8 +dport_map_port_1=9 +dport_map_port_2=10 +dport_map_port_3=11 +dport_map_port_4=12 +dport_map_port_5=13 +dport_map_port_6=14 +dport_map_port_7=15 +dport_map_port_8=16 +dport_map_port_13=17 +dport_map_port_14=18 +dport_map_port_15=19 +dport_map_port_16=20 +dport_map_port_21=21 +dport_map_port_22=22 +dport_map_port_23=23 +dport_map_port_24=24 +dport_map_port_29=25 +dport_map_port_30=26 +dport_map_port_31=27 +dport_map_port_32=28 +dport_map_port_33=29 +dport_map_port_34=30 +dport_map_port_35=31 +dport_map_port_36=32 +dport_map_port_41=33 +dport_map_port_42=34 +dport_map_port_43=35 +dport_map_port_44=36 +dport_map_port_49=37 +dport_map_port_50=38 +dport_map_port_51=39 +dport_map_port_52=40 +dport_map_port_67=41 +dport_map_port_68=42 +dport_map_port_69=43 +dport_map_port_70=44 +dport_map_port_71=45 +dport_map_port_72=46 +dport_map_port_73=47 +dport_map_port_74=48 +dport_map_port_87=49 +dport_map_port_79=50 +dport_map_port_99=51 +dport_map_port_95=52 +dport_map_port_115=53 +dport_map_port_107=54 +dport_map_port_123=55 +dport_map_port_127=56 + +phy_chain_tx_polarity_flip_physical{57.0}=0x1 +phy_chain_tx_polarity_flip_physical{58.0}=0x0 +phy_chain_tx_polarity_flip_physical{59.0}=0x1 +phy_chain_tx_polarity_flip_physical{60.0}=0x0 +phy_chain_tx_polarity_flip_physical{61.0}=0x1 +phy_chain_tx_polarity_flip_physical{62.0}=0x0 +phy_chain_tx_polarity_flip_physical{63.0}=0x1 +phy_chain_tx_polarity_flip_physical{64.0}=0x0 +phy_chain_tx_polarity_flip_physical{1.0}=0x0 phy_chain_tx_polarity_flip_physical{2.0}=0x0 -phy_chain_rx_polarity_flip_physical{2.0}=0x0 -phy_chain_tx_polarity_flip_physical{3.0}=0x1 -phy_chain_rx_polarity_flip_physical{3.0}=0x0 +phy_chain_tx_polarity_flip_physical{3.0}=0x0 phy_chain_tx_polarity_flip_physical{4.0}=0x0 -phy_chain_rx_polarity_flip_physical{4.0}=0x0 -phy_chain_tx_polarity_flip_physical{5.0}=0x1 -phy_chain_rx_polarity_flip_physical{5.0}=0x0 +phy_chain_tx_polarity_flip_physical{5.0}=0x0 phy_chain_tx_polarity_flip_physical{6.0}=0x0 -phy_chain_rx_polarity_flip_physical{6.0}=0x0 -phy_chain_tx_polarity_flip_physical{7.0}=0x1 -phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_tx_polarity_flip_physical{7.0}=0x0 phy_chain_tx_polarity_flip_physical{8.0}=0x0 -phy_chain_rx_polarity_flip_physical{8.0}=0x0 phy_chain_tx_polarity_flip_physical{13.0}=0x0 -phy_chain_rx_polarity_flip_physical{13.0}=0x0 phy_chain_tx_polarity_flip_physical{14.0}=0x0 -phy_chain_rx_polarity_flip_physical{14.0}=0x0 phy_chain_tx_polarity_flip_physical{15.0}=0x0 -phy_chain_rx_polarity_flip_physical{15.0}=0x0 phy_chain_tx_polarity_flip_physical{16.0}=0x0 -phy_chain_rx_polarity_flip_physical{16.0}=0x0 -phy_chain_tx_polarity_flip_physical{21.0}=0x1 -phy_chain_rx_polarity_flip_physical{21.0}=0x0 +phy_chain_tx_polarity_flip_physical{21.0}=0x0 phy_chain_tx_polarity_flip_physical{22.0}=0x0 -phy_chain_rx_polarity_flip_physical{22.0}=0x0 -phy_chain_tx_polarity_flip_physical{23.0}=0x1 -phy_chain_rx_polarity_flip_physical{23.0}=0x0 +phy_chain_tx_polarity_flip_physical{23.0}=0x0 phy_chain_tx_polarity_flip_physical{24.0}=0x0 -phy_chain_rx_polarity_flip_physical{24.0}=0x0 phy_chain_tx_polarity_flip_physical{29.0}=0x0 -phy_chain_rx_polarity_flip_physical{29.0}=0x1 phy_chain_tx_polarity_flip_physical{30.0}=0x0 -phy_chain_rx_polarity_flip_physical{30.0}=0x1 phy_chain_tx_polarity_flip_physical{31.0}=0x0 -phy_chain_rx_polarity_flip_physical{31.0}=0x1 phy_chain_tx_polarity_flip_physical{32.0}=0x0 -phy_chain_rx_polarity_flip_physical{32.0}=0x1 phy_chain_tx_polarity_flip_physical{33.0}=0x0 -phy_chain_rx_polarity_flip_physical{33.0}=0x0 phy_chain_tx_polarity_flip_physical{34.0}=0x0 -phy_chain_rx_polarity_flip_physical{34.0}=0x0 phy_chain_tx_polarity_flip_physical{35.0}=0x0 -phy_chain_rx_polarity_flip_physical{35.0}=0x0 phy_chain_tx_polarity_flip_physical{36.0}=0x0 -phy_chain_rx_polarity_flip_physical{36.0}=0x0 phy_chain_tx_polarity_flip_physical{41.0}=0x0 -phy_chain_rx_polarity_flip_physical{41.0}=0x0 phy_chain_tx_polarity_flip_physical{42.0}=0x0 -phy_chain_rx_polarity_flip_physical{42.0}=0x0 phy_chain_tx_polarity_flip_physical{43.0}=0x0 -phy_chain_rx_polarity_flip_physical{43.0}=0x0 phy_chain_tx_polarity_flip_physical{44.0}=0x0 -phy_chain_rx_polarity_flip_physical{44.0}=0x0 phy_chain_tx_polarity_flip_physical{49.0}=0x0 -phy_chain_rx_polarity_flip_physical{49.0}=0x0 phy_chain_tx_polarity_flip_physical{50.0}=0x0 -phy_chain_rx_polarity_flip_physical{50.0}=0x0 phy_chain_tx_polarity_flip_physical{51.0}=0x0 -phy_chain_rx_polarity_flip_physical{51.0}=0x0 phy_chain_tx_polarity_flip_physical{52.0}=0x0 -phy_chain_rx_polarity_flip_physical{52.0}=0x0 -phy_chain_tx_polarity_flip_physical{57.0}=0x0 +phy_chain_tx_polarity_flip_physical{65.0}=0x0 +phy_chain_tx_polarity_flip_physical{66.0}=0x0 +phy_chain_tx_polarity_flip_physical{67.0}=0x0 +phy_chain_tx_polarity_flip_physical{68.0}=0x0 +phy_chain_tx_polarity_flip_physical{69.0}=0x0 +phy_chain_tx_polarity_flip_physical{70.0}=0x0 +phy_chain_tx_polarity_flip_physical{71.0}=0x0 +phy_chain_tx_polarity_flip_physical{72.0}=0x0 +phy_chain_tx_polarity_flip_physical{85.0}=0x0 +phy_chain_tx_polarity_flip_physical{86.0}=0x0 +phy_chain_tx_polarity_flip_physical{87.0}=0x1 +phy_chain_tx_polarity_flip_physical{88.0}=0x0 +phy_chain_tx_polarity_flip_physical{77.0}=0x1 +phy_chain_tx_polarity_flip_physical{78.0}=0x0 +phy_chain_tx_polarity_flip_physical{79.0}=0x1 +phy_chain_tx_polarity_flip_physical{80.0}=0x0 +phy_chain_tx_polarity_flip_physical{97.0}=0x0 +phy_chain_tx_polarity_flip_physical{98.0}=0x0 +phy_chain_tx_polarity_flip_physical{99.0}=0x1 +phy_chain_tx_polarity_flip_physical{100.0}=0x0 +phy_chain_tx_polarity_flip_physical{93.0}=0x0 +phy_chain_tx_polarity_flip_physical{94.0}=0x1 +phy_chain_tx_polarity_flip_physical{95.0}=0x1 +phy_chain_tx_polarity_flip_physical{96.0}=0x0 +phy_chain_tx_polarity_flip_physical{113.0}=0x0 +phy_chain_tx_polarity_flip_physical{114.0}=0x0 +phy_chain_tx_polarity_flip_physical{115.0}=0x1 +phy_chain_tx_polarity_flip_physical{116.0}=0x0 +phy_chain_tx_polarity_flip_physical{105.0}=0x0 +phy_chain_tx_polarity_flip_physical{106.0}=0x1 +phy_chain_tx_polarity_flip_physical{107.0}=0x1 +phy_chain_tx_polarity_flip_physical{108.0}=0x0 +phy_chain_tx_polarity_flip_physical{121.0}=0x1 +phy_chain_tx_polarity_flip_physical{122.0}=0x0 +phy_chain_tx_polarity_flip_physical{123.0}=0x1 +phy_chain_tx_polarity_flip_physical{124.0}=0x0 +phy_chain_tx_polarity_flip_physical{125.0}=0x1 +phy_chain_tx_polarity_flip_physical{126.0}=0x0 +phy_chain_tx_polarity_flip_physical{127.0}=0x1 +phy_chain_tx_polarity_flip_physical{128.0}=0x1 + phy_chain_rx_polarity_flip_physical{57.0}=0x0 -phy_chain_tx_polarity_flip_physical{58.0}=0x0 phy_chain_rx_polarity_flip_physical{58.0}=0x0 -phy_chain_tx_polarity_flip_physical{59.0}=0x0 phy_chain_rx_polarity_flip_physical{59.0}=0x0 -phy_chain_tx_polarity_flip_physical{60.0}=0x0 phy_chain_rx_polarity_flip_physical{60.0}=0x0 -phy_chain_tx_polarity_flip_physical{61.0}=0x0 phy_chain_rx_polarity_flip_physical{61.0}=0x1 -phy_chain_tx_polarity_flip_physical{62.0}=0x0 phy_chain_rx_polarity_flip_physical{62.0}=0x1 -phy_chain_tx_polarity_flip_physical{63.0}=0x0 phy_chain_rx_polarity_flip_physical{63.0}=0x1 -phy_chain_tx_polarity_flip_physical{64.0}=0x0 phy_chain_rx_polarity_flip_physical{64.0}=0x1 -phy_chain_tx_polarity_flip_physical{65.0}=0x0 +phy_chain_rx_polarity_flip_physical{1.0}=0x1 +phy_chain_rx_polarity_flip_physical{2.0}=0x1 +phy_chain_rx_polarity_flip_physical{3.0}=0x1 +phy_chain_rx_polarity_flip_physical{4.0}=0x1 +phy_chain_rx_polarity_flip_physical{5.0}=0x0 +phy_chain_rx_polarity_flip_physical{6.0}=0x0 +phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_rx_polarity_flip_physical{8.0}=0x0 +phy_chain_rx_polarity_flip_physical{13.0}=0x0 +phy_chain_rx_polarity_flip_physical{14.0}=0x0 +phy_chain_rx_polarity_flip_physical{15.0}=0x0 +phy_chain_rx_polarity_flip_physical{16.0}=0x0 +phy_chain_rx_polarity_flip_physical{21.0}=0x0 +phy_chain_rx_polarity_flip_physical{22.0}=0x0 +phy_chain_rx_polarity_flip_physical{23.0}=0x0 +phy_chain_rx_polarity_flip_physical{24.0}=0x0 +phy_chain_rx_polarity_flip_physical{29.0}=0x0 +phy_chain_rx_polarity_flip_physical{30.0}=0x1 +phy_chain_rx_polarity_flip_physical{31.0}=0x0 +phy_chain_rx_polarity_flip_physical{32.0}=0x0 +phy_chain_rx_polarity_flip_physical{33.0}=0x1 +phy_chain_rx_polarity_flip_physical{34.0}=0x1 +phy_chain_rx_polarity_flip_physical{35.0}=0x1 +phy_chain_rx_polarity_flip_physical{36.0}=0x1 +phy_chain_rx_polarity_flip_physical{41.0}=0x1 +phy_chain_rx_polarity_flip_physical{42.0}=0x1 +phy_chain_rx_polarity_flip_physical{43.0}=0x1 +phy_chain_rx_polarity_flip_physical{44.0}=0x1 +phy_chain_rx_polarity_flip_physical{49.0}=0x1 +phy_chain_rx_polarity_flip_physical{50.0}=0x1 +phy_chain_rx_polarity_flip_physical{51.0}=0x1 +phy_chain_rx_polarity_flip_physical{52.0}=0x1 phy_chain_rx_polarity_flip_physical{65.0}=0x1 -phy_chain_tx_polarity_flip_physical{66.0}=0x0 phy_chain_rx_polarity_flip_physical{66.0}=0x1 -phy_chain_tx_polarity_flip_physical{67.0}=0x0 phy_chain_rx_polarity_flip_physical{67.0}=0x1 -phy_chain_tx_polarity_flip_physical{68.0}=0x0 phy_chain_rx_polarity_flip_physical{68.0}=0x1 -phy_chain_tx_polarity_flip_physical{69.0}=0x0 phy_chain_rx_polarity_flip_physical{69.0}=0x0 -phy_chain_tx_polarity_flip_physical{70.0}=0x0 phy_chain_rx_polarity_flip_physical{70.0}=0x0 -phy_chain_tx_polarity_flip_physical{71.0}=0x0 phy_chain_rx_polarity_flip_physical{71.0}=0x0 -phy_chain_tx_polarity_flip_physical{72.0}=0x0 phy_chain_rx_polarity_flip_physical{72.0}=0x0 -phy_chain_tx_polarity_flip_physical{85.0}=0x1 phy_chain_rx_polarity_flip_physical{85.0}=0x1 -phy_chain_tx_polarity_flip_physical{86.0}=0x0 phy_chain_rx_polarity_flip_physical{86.0}=0x1 -phy_chain_tx_polarity_flip_physical{87.0}=0x1 phy_chain_rx_polarity_flip_physical{87.0}=0x1 -phy_chain_tx_polarity_flip_physical{88.0}=0x0 phy_chain_rx_polarity_flip_physical{88.0}=0x1 -phy_chain_tx_polarity_flip_physical{77.0}=0x1 -phy_chain_rx_polarity_flip_physical{77.0}=0x1 -phy_chain_tx_polarity_flip_physical{78.0}=0x1 +phy_chain_rx_polarity_flip_physical{77.0}=0x0 phy_chain_rx_polarity_flip_physical{78.0}=0x0 -phy_chain_tx_polarity_flip_physical{79.0}=0x1 -phy_chain_rx_polarity_flip_physical{79.0}=0x1 -phy_chain_tx_polarity_flip_physical{80.0}=0x1 -phy_chain_rx_polarity_flip_physical{80.0}=0x1 -phy_chain_tx_polarity_flip_physical{97.0}=0x1 +phy_chain_rx_polarity_flip_physical{79.0}=0x0 +phy_chain_rx_polarity_flip_physical{80.0}=0x0 phy_chain_rx_polarity_flip_physical{97.0}=0x0 -phy_chain_tx_polarity_flip_physical{98.0}=0x0 phy_chain_rx_polarity_flip_physical{98.0}=0x0 -phy_chain_tx_polarity_flip_physical{99.0}=0x1 phy_chain_rx_polarity_flip_physical{99.0}=0x0 -phy_chain_tx_polarity_flip_physical{100.0}=0x0 phy_chain_rx_polarity_flip_physical{100.0}=0x0 -phy_chain_tx_polarity_flip_physical{93.0}=0x1 -phy_chain_rx_polarity_flip_physical{93.0}=0x1 -phy_chain_tx_polarity_flip_physical{94.0}=0x1 +phy_chain_rx_polarity_flip_physical{93.0}=0x0 phy_chain_rx_polarity_flip_physical{94.0}=0x0 -phy_chain_tx_polarity_flip_physical{95.0}=0x1 -phy_chain_rx_polarity_flip_physical{95.0}=0x1 -phy_chain_tx_polarity_flip_physical{96.0}=0x1 -phy_chain_rx_polarity_flip_physical{96.0}=0x1 -phy_chain_tx_polarity_flip_physical{113.0}=0x1 +phy_chain_rx_polarity_flip_physical{95.0}=0x0 +phy_chain_rx_polarity_flip_physical{96.0}=0x0 phy_chain_rx_polarity_flip_physical{113.0}=0x1 -phy_chain_tx_polarity_flip_physical{114.0}=0x0 phy_chain_rx_polarity_flip_physical{114.0}=0x1 -phy_chain_tx_polarity_flip_physical{115.0}=0x1 phy_chain_rx_polarity_flip_physical{115.0}=0x1 -phy_chain_tx_polarity_flip_physical{116.0}=0x0 phy_chain_rx_polarity_flip_physical{116.0}=0x1 -phy_chain_tx_polarity_flip_physical{105.0}=0x1 -phy_chain_rx_polarity_flip_physical{105.0}=0x1 -phy_chain_tx_polarity_flip_physical{106.0}=0x1 +phy_chain_rx_polarity_flip_physical{105.0}=0x0 phy_chain_rx_polarity_flip_physical{106.0}=0x0 -phy_chain_tx_polarity_flip_physical{107.0}=0x1 -phy_chain_rx_polarity_flip_physical{107.0}=0x1 -phy_chain_tx_polarity_flip_physical{108.0}=0x1 -phy_chain_rx_polarity_flip_physical{108.0}=0x1 -phy_chain_tx_polarity_flip_physical{121.0}=0x1 +phy_chain_rx_polarity_flip_physical{107.0}=0x0 +phy_chain_rx_polarity_flip_physical{108.0}=0x0 phy_chain_rx_polarity_flip_physical{121.0}=0x1 -phy_chain_tx_polarity_flip_physical{122.0}=0x0 -phy_chain_rx_polarity_flip_physical{122.0}=0x0 -phy_chain_tx_polarity_flip_physical{123.0}=0x1 +phy_chain_rx_polarity_flip_physical{122.0}=0x1 phy_chain_rx_polarity_flip_physical{123.0}=0x0 -phy_chain_tx_polarity_flip_physical{124.0}=0x0 phy_chain_rx_polarity_flip_physical{124.0}=0x1 -phy_chain_tx_polarity_flip_physical{125.0}=0x0 -phy_chain_rx_polarity_flip_physical{125.0}=0x0 -phy_chain_tx_polarity_flip_physical{126.0}=0x1 -phy_chain_rx_polarity_flip_physical{126.0}=0x1 -phy_chain_tx_polarity_flip_physical{127.0}=0x0 +phy_chain_rx_polarity_flip_physical{125.0}=0x1 +phy_chain_rx_polarity_flip_physical{126.0}=0x0 phy_chain_rx_polarity_flip_physical{127.0}=0x0 -phy_chain_tx_polarity_flip_physical{128.0}=0x0 phy_chain_rx_polarity_flip_physical{128.0}=0x0 -port_flex_enable=1 -portmap_1=1:25 -portmap_2=2:25 -portmap_3=3:25 -portmap_4=4:25 -portmap_5=5:25 -portmap_6=6:25 -portmap_7=7:25 -portmap_8=8:25 -portmap_13=13:25 -portmap_14=14:25 -portmap_15=15:25 -portmap_16=16:25 -portmap_21=21:25 -portmap_22=22:25 -portmap_23=23:25 -portmap_24=24:25 -portmap_29=29:25 -portmap_30=30:25 -portmap_31=31:25 -portmap_32=32:25 -portmap_33=33:25 -portmap_34=34:25 -portmap_35=35:25 -portmap_36=36:25 -portmap_41=41:25 -portmap_42=42:25 -portmap_43=43:25 -portmap_44=44:25 -portmap_49=49:25 -portmap_50=50:25 -portmap_51=51:25 -portmap_52=52:25 -portmap_57=57:25 -portmap_58=58:25 -portmap_59=59:25 -portmap_60=60:25 -portmap_61=61:25 -portmap_62=62:25 -portmap_63=63:25 -portmap_64=64:25 -portmap_67=65:25 -portmap_68=66:25 -portmap_69=67:25 -portmap_70=68:25 -portmap_71=69:25 -portmap_72=70:25 -portmap_73=71:25 -portmap_74=72:25 -portmap_79=77:100 -portmap_87=85:100 -portmap_95=93:100 -portmap_99=97:100 -portmap_107=105:100 -portmap_115=113:100 -portmap_123=121:100 -portmap_127=125:100 -dport_map_port_1=1 -dport_map_port_2=2 -dport_map_port_3=3 -dport_map_port_4=4 -dport_map_port_5=5 -dport_map_port_6=6 -dport_map_port_7=7 -dport_map_port_8=8 -dport_map_port_13=9 -dport_map_port_14=10 -dport_map_port_15=11 -dport_map_port_16=12 -dport_map_port_21=13 -dport_map_port_22=14 -dport_map_port_23=15 -dport_map_port_24=16 -dport_map_port_29=17 -dport_map_port_30=18 -dport_map_port_31=19 -dport_map_port_32=20 -dport_map_port_33=21 -dport_map_port_34=22 -dport_map_port_35=23 -dport_map_port_36=24 -dport_map_port_41=25 -dport_map_port_42=26 -dport_map_port_43=27 -dport_map_port_44=28 -dport_map_port_49=29 -dport_map_port_50=30 -dport_map_port_51=31 -dport_map_port_52=32 -dport_map_port_57=33 -dport_map_port_58=34 -dport_map_port_59=35 -dport_map_port_60=36 -dport_map_port_61=37 -dport_map_port_62=38 -dport_map_port_63=39 -dport_map_port_64=40 -dport_map_port_67=41 -dport_map_port_68=42 -dport_map_port_69=43 -dport_map_port_70=44 -dport_map_port_71=45 -dport_map_port_72=46 -dport_map_port_73=47 -dport_map_port_74=48 -dport_map_port_87=49 -dport_map_port_79=50 -dport_map_port_99=51 -dport_map_port_95=52 -dport_map_port_115=53 -dport_map_port_107=54 -dport_map_port_123=55 -dport_map_port_127=56 +serdes_preemphasis_lane0_57=0x0f480d +serdes_preemphasis_lane1_57=0x0f480d +serdes_preemphasis_lane2_57=0x0f480d +serdes_preemphasis_lane3_57=0x0f480d +serdes_preemphasis_lane0_58=0x0f480d +serdes_preemphasis_lane1_58=0x0f480d +serdes_preemphasis_lane2_58=0x0f480d +serdes_preemphasis_lane3_58=0x0f480d +serdes_preemphasis_lane0_59=0x0f480d +serdes_preemphasis_lane1_59=0x0f480d +serdes_preemphasis_lane2_59=0x0f480d +serdes_preemphasis_lane3_59=0x0f480d +serdes_preemphasis_lane0_60=0x0f480d +serdes_preemphasis_lane1_60=0x0f480d +serdes_preemphasis_lane2_60=0x0f480d +serdes_preemphasis_lane3_60=0x0f480d +serdes_preemphasis_lane0_61=0x0f480d +serdes_preemphasis_lane1_61=0x0f480d +serdes_preemphasis_lane2_61=0x0f480d +serdes_preemphasis_lane3_61=0x0f480d +serdes_preemphasis_lane0_62=0x0f480d +serdes_preemphasis_lane1_62=0x0f480d +serdes_preemphasis_lane2_62=0x0f480d +serdes_preemphasis_lane3_62=0x0f480d +serdes_preemphasis_lane0_63=0x0f480d +serdes_preemphasis_lane1_63=0x0f480d +serdes_preemphasis_lane2_63=0x0f480d +serdes_preemphasis_lane3_63=0x0f480d +serdes_preemphasis_lane0_64=0x0f480d +serdes_preemphasis_lane1_64=0x0f480d +serdes_preemphasis_lane2_64=0x0f480d +serdes_preemphasis_lane3_64=0x0f480d +serdes_preemphasis_lane0_1=0x0f480d +serdes_preemphasis_lane1_1=0x0f480d +serdes_preemphasis_lane2_1=0x0f480d +serdes_preemphasis_lane3_1=0x0f480d +serdes_preemphasis_lane0_2=0x0d4b0c +serdes_preemphasis_lane1_2=0x0d4b0c +serdes_preemphasis_lane2_2=0x0d4b0c +serdes_preemphasis_lane3_2=0x0d4b0c +serdes_preemphasis_lane0_3=0x0f480d +serdes_preemphasis_lane1_3=0x0f480d +serdes_preemphasis_lane2_3=0x0f480d +serdes_preemphasis_lane3_3=0x0f480d +serdes_preemphasis_lane0_4=0x0d4b0c +serdes_preemphasis_lane1_4=0x0d4b0c +serdes_preemphasis_lane2_4=0x0d4b0c +serdes_preemphasis_lane3_4=0x0d4b0c +serdes_preemphasis_lane0_5=0x0f480d +serdes_preemphasis_lane1_5=0x0f480d +serdes_preemphasis_lane2_5=0x0f480d +serdes_preemphasis_lane3_5=0x0f480d +serdes_preemphasis_lane0_6=0x0d4b0c +serdes_preemphasis_lane1_6=0x0d4b0c +serdes_preemphasis_lane2_6=0x0d4b0c +serdes_preemphasis_lane3_6=0x0d4b0c +serdes_preemphasis_lane0_7=0x0f480d +serdes_preemphasis_lane1_7=0x0f480d +serdes_preemphasis_lane2_7=0x0f480d +serdes_preemphasis_lane3_7=0x0f480d +serdes_preemphasis_lane0_8=0x0d4b0c +serdes_preemphasis_lane1_8=0x0d4b0c +serdes_preemphasis_lane2_8=0x0d4b0c +serdes_preemphasis_lane3_8=0x0d4b0c +serdes_preemphasis_lane0_13=0x0f480d +serdes_preemphasis_lane1_13=0x0f480d +serdes_preemphasis_lane2_13=0x0f480d +serdes_preemphasis_lane3_13=0x0f480d +serdes_preemphasis_lane0_14=0x0d4b0c +serdes_preemphasis_lane1_14=0x0d4b0c +serdes_preemphasis_lane2_14=0x0d4b0c +serdes_preemphasis_lane3_14=0x0d4b0c +serdes_preemphasis_lane0_15=0x0f480d +serdes_preemphasis_lane1_15=0x0f480d +serdes_preemphasis_lane2_15=0x0f480d +serdes_preemphasis_lane3_15=0x0f480d +serdes_preemphasis_lane0_16=0x0d4b0c +serdes_preemphasis_lane1_16=0x0d4b0c +serdes_preemphasis_lane2_16=0x0d4b0c +serdes_preemphasis_lane3_16=0x0d4b0c +serdes_preemphasis_lane0_21=0x0d4b0c +serdes_preemphasis_lane1_21=0x0d4b0c +serdes_preemphasis_lane2_21=0x0d4b0c +serdes_preemphasis_lane3_21=0x0d4b0c +serdes_preemphasis_lane0_22=0x0d4b0c +serdes_preemphasis_lane1_22=0x0d4b0c +serdes_preemphasis_lane2_22=0x0d4b0c +serdes_preemphasis_lane3_22=0x0d4b0c +serdes_preemphasis_lane0_23=0x0d4b0c +serdes_preemphasis_lane1_23=0x0d4b0c +serdes_preemphasis_lane2_23=0x0d4b0c +serdes_preemphasis_lane3_23=0x0d4b0c +serdes_preemphasis_lane0_24=0x0d4b0c +serdes_preemphasis_lane1_24=0x0d4b0c +serdes_preemphasis_lane2_24=0x0d4b0c +serdes_preemphasis_lane3_24=0x0d4b0c +serdes_preemphasis_lane0_29=0x0d4b0c +serdes_preemphasis_lane1_29=0x0d4b0c +serdes_preemphasis_lane2_29=0x0d4b0c +serdes_preemphasis_lane3_29=0x0d4b0c +serdes_preemphasis_lane0_30=0x0d4b0c +serdes_preemphasis_lane1_30=0x0d4b0c +serdes_preemphasis_lane2_30=0x0d4b0c +serdes_preemphasis_lane3_30=0x0d4b0c +serdes_preemphasis_lane0_31=0x0d4b0c +serdes_preemphasis_lane1_31=0x0d4b0c +serdes_preemphasis_lane2_31=0x0d4b0c +serdes_preemphasis_lane3_31=0x0d4b0c +serdes_preemphasis_lane0_32=0x0d4b0c +serdes_preemphasis_lane1_32=0x0d4b0c +serdes_preemphasis_lane2_32=0x0d4b0c +serdes_preemphasis_lane3_32=0x0d4b0c +serdes_preemphasis_lane0_33=0x0d4b0c +serdes_preemphasis_lane1_33=0x0d4b0c +serdes_preemphasis_lane2_33=0x0d4b0c +serdes_preemphasis_lane3_33=0x0d4b0c +serdes_preemphasis_lane0_34=0x0d4b0c +serdes_preemphasis_lane1_34=0x0d4b0c +serdes_preemphasis_lane2_34=0x0d4b0c +serdes_preemphasis_lane3_34=0x0d4b0c +serdes_preemphasis_lane0_35=0x0d4b0c +serdes_preemphasis_lane1_35=0x0d4b0c +serdes_preemphasis_lane2_35=0x0d4b0c +serdes_preemphasis_lane3_35=0x0d4b0c +serdes_preemphasis_lane0_36=0x0d4b0c +serdes_preemphasis_lane1_36=0x0d4b0c +serdes_preemphasis_lane2_36=0x0d4b0c +serdes_preemphasis_lane3_36=0x0d4b0c +serdes_preemphasis_lane0_41=0x0d4b0c +serdes_preemphasis_lane1_41=0x0d4b0c +serdes_preemphasis_lane2_41=0x0d4b0c +serdes_preemphasis_lane3_41=0x0d4b0c +serdes_preemphasis_lane0_42=0x0d4b0c +serdes_preemphasis_lane1_42=0x0d4b0c +serdes_preemphasis_lane2_42=0x0d4b0c +serdes_preemphasis_lane3_42=0x0d4b0c +serdes_preemphasis_lane0_43=0x0d4b0c +serdes_preemphasis_lane1_43=0x0d4b0c +serdes_preemphasis_lane2_43=0x0d4b0c +serdes_preemphasis_lane3_43=0x0d4b0c +serdes_preemphasis_lane0_44=0x0d4b0c +serdes_preemphasis_lane1_44=0x0d4b0c +serdes_preemphasis_lane2_44=0x0d4b0c +serdes_preemphasis_lane3_44=0x0d4b0c +serdes_preemphasis_lane0_49=0x0f480d +serdes_preemphasis_lane1_49=0x0f480d +serdes_preemphasis_lane2_49=0x0f480d +serdes_preemphasis_lane3_49=0x0f480d +serdes_preemphasis_lane0_50=0x0d4b0c +serdes_preemphasis_lane1_50=0x0d4b0c +serdes_preemphasis_lane2_50=0x0d4b0c +serdes_preemphasis_lane3_50=0x0d4b0c +serdes_preemphasis_lane0_51=0x0f480d +serdes_preemphasis_lane1_51=0x0f480d +serdes_preemphasis_lane2_51=0x0f480d +serdes_preemphasis_lane3_51=0x0f480d +serdes_preemphasis_lane0_52=0x0d4b0c +serdes_preemphasis_lane1_52=0x0d4b0c +serdes_preemphasis_lane2_52=0x0d4b0c +serdes_preemphasis_lane3_52=0x0d4b0c +serdes_preemphasis_lane0_67=0x0d4b0c +serdes_preemphasis_lane1_67=0x0d4b0c +serdes_preemphasis_lane2_67=0x0d4b0c +serdes_preemphasis_lane3_67=0x0d4b0c +serdes_preemphasis_lane0_68=0x0d4b0c +serdes_preemphasis_lane1_68=0x0d4b0c +serdes_preemphasis_lane2_68=0x0d4b0c +serdes_preemphasis_lane3_68=0x0d4b0c +serdes_preemphasis_lane0_69=0x0d4b0c +serdes_preemphasis_lane1_69=0x0d4b0c +serdes_preemphasis_lane2_69=0x0d4b0c +serdes_preemphasis_lane3_69=0x0d4b0c +serdes_preemphasis_lane0_70=0x0d4b0c +serdes_preemphasis_lane1_70=0x0d4b0c +serdes_preemphasis_lane2_70=0x0d4b0c +serdes_preemphasis_lane3_70=0x0d4b0c +serdes_preemphasis_lane0_71=0x0d4b0c +serdes_preemphasis_lane1_71=0x0d4b0c +serdes_preemphasis_lane2_71=0x0d4b0c +serdes_preemphasis_lane3_71=0x0d4b0c +serdes_preemphasis_lane0_72=0x0d4b0c +serdes_preemphasis_lane1_72=0x0d4b0c +serdes_preemphasis_lane2_72=0x0d4b0c +serdes_preemphasis_lane3_72=0x0d4b0c +serdes_preemphasis_lane0_73=0x0d4b0c +serdes_preemphasis_lane1_73=0x0d4b0c +serdes_preemphasis_lane2_73=0x0d4b0c +serdes_preemphasis_lane3_73=0x0d4b0c +serdes_preemphasis_lane0_74=0x0d4b0c +serdes_preemphasis_lane1_74=0x0d4b0c +serdes_preemphasis_lane2_74=0x0d4b0c +serdes_preemphasis_lane3_74=0x0d4b0c +serdes_preemphasis_lane0_87=0x0d4b0c +serdes_preemphasis_lane1_87=0x0d4b0c +serdes_preemphasis_lane2_87=0x0d4b0c +serdes_preemphasis_lane3_87=0x0d4b0c +serdes_preemphasis_lane0_79=0x0d4b0c +serdes_preemphasis_lane1_79=0x0d4b0c +serdes_preemphasis_lane2_79=0x0d4b0c +serdes_preemphasis_lane3_79=0x0d4b0c +serdes_preemphasis_lane0_99=0x0d4b0c +serdes_preemphasis_lane1_99=0x0d4b0c +serdes_preemphasis_lane2_99=0x0d4b0c +serdes_preemphasis_lane3_99=0x0d4b0c +serdes_preemphasis_lane0_95=0x0d4b0c +serdes_preemphasis_lane1_95=0x0d4b0c +serdes_preemphasis_lane2_95=0x0d4b0c +serdes_preemphasis_lane3_95=0x0d4b0c +serdes_preemphasis_lane0_115=0x0d4b0c +serdes_preemphasis_lane1_115=0x0d4b0c +serdes_preemphasis_lane2_115=0x0d4b0c +serdes_preemphasis_lane3_115=0x0d4b0c +serdes_preemphasis_lane0_107=0x0d4b0c +serdes_preemphasis_lane1_107=0x0d4b0c +serdes_preemphasis_lane2_107=0x0d4b0c +serdes_preemphasis_lane3_107=0x0d4b0c +serdes_preemphasis_lane0_123=0x14460a +serdes_preemphasis_lane1_123=0x14460a +serdes_preemphasis_lane2_123=0x14460a +serdes_preemphasis_lane3_123=0x14460a +serdes_preemphasis_lane0_127=0x14460a +serdes_preemphasis_lane1_127=0x14460a +serdes_preemphasis_lane2_127=0x14460a +serdes_preemphasis_lane3_127=0x14460a -serdes_if_type_1=13 -serdes_if_type_2=13 -serdes_if_type_3=13 -serdes_if_type_4=13 -serdes_if_type_5=13 -serdes_if_type_6=13 -serdes_if_type_7=13 -serdes_if_type_8=13 -serdes_if_type_13=13 -serdes_if_type_14=13 -serdes_if_type_15=13 -serdes_if_type_16=13 -serdes_if_type_21=13 -serdes_if_type_22=13 -serdes_if_type_23=13 -serdes_if_type_24=13 -serdes_if_type_29=13 -serdes_if_type_30=13 -serdes_if_type_31=13 -serdes_if_type_32=13 -serdes_if_type_33=13 -serdes_if_type_34=13 -serdes_if_type_35=13 -serdes_if_type_36=13 -serdes_if_type_41=13 -serdes_if_type_42=13 -serdes_if_type_43=13 -serdes_if_type_44=13 -serdes_if_type_49=13 -serdes_if_type_50=13 -serdes_if_type_51=13 -serdes_if_type_52=13 -serdes_if_type_57=13 -serdes_if_type_58=13 -serdes_if_type_59=13 -serdes_if_type_60=13 -serdes_if_type_61=13 -serdes_if_type_62=13 -serdes_if_type_63=13 -serdes_if_type_64=13 -serdes_if_type_67=13 -serdes_if_type_68=13 -serdes_if_type_69=13 -serdes_if_type_70=13 -serdes_if_type_71=13 -serdes_if_type_72=13 -serdes_if_type_73=13 -serdes_if_type_74=13 -serdes_if_type_87=14 -serdes_if_type_79=14 -serdes_if_type_99=14 -serdes_if_type_95=14 -serdes_if_type_115=14 -serdes_if_type_107=14 -serdes_if_type_123=14 -serdes_if_type_127=14 reglist_enable=1 -scache_filename=/tmp/scache +scache_filename=/var/warmboot/wbscache schan_intr_enable=0 -stable_size=0x5500000 +stable_size=0x55000000 +stable_location=3 +warmboot_knet_shutdown_mode=1 tdma_timeout_usec=3000000 + +#vxlan flex flow mode +flow_init_mode=1 + +riot_enable=1 +riot_overlay_l3_intf_mem_size=4096 +riot_overlay_l3_egress_mem_size=32768 +riot_overlay_ecmp_resilient_hash_size=16384 + +l3_ecmp_levels=2 + +use_all_splithorizon_groups=1 +sai_tunnel_support=1 + +#This property allows to enable L2 FDB entry to discard based on Source Mac +sai_fdb_entry_l2_discard_src_enable=1 + +#RDMA +sai_pfc_defaults_disable=1 +sai_optimized_mmu=1 + +#ACL wb count +ctr_evict_enable=0 diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/custom_led.bin b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/custom_led.bin index 1fe5585e07796a7e30facd1faf391c9969ab8b08..e02f94e7ed87ffe60524721f4aec68d661880e7c 100644 GIT binary patch delta 152 zcmV;J0B8TK0_*{Q@U>S)Mn=H23jiBR765QI03?7X10je;0wo7m zf?>j80Wkq$A2C5q?Rz^)mL`LwmgRlw!DNAr6j7FS903-q@5HW~GeK|TnlSUN) zY95tAsvQB6*+v?ORvxwh1!#6#g=nfqQbYkd5_q~p1u6v5LPjz|Cea5X4B$mZH9%@Y zYC)2+04)X3F+u~-O-2AM0MG#zlh diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml old mode 100755 new mode 100644 index f5e871564350..3bdd16e80365 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml @@ -7,116 +7,413 @@ --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml new file mode 100644 index 000000000000..c6c4852077c5 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py new file mode 100644 index 000000000000..f95164e03601 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py @@ -0,0 +1,961 @@ +#!/usr/bin/python3 +import collections +from datetime import datetime, timedelta +from bitarray import bitarray + + +__DEBUG__ = "N" + + +class FruException(Exception): + def __init__(self, message='fruerror', code=-100): + err = 'errcode: {0} message:{1}'.format(code, message) + Exception.__init__(self, err) + self.code = code + self.message = message + + +def e_print(err): + print("ERROR: " + err) + + +def d_print(debug_info): + if __DEBUG__ == "Y": + print(debug_info) + + +class FruUtil(): + @staticmethod + def decodeLength(value): + a = bitarray(8) + a.setall(True) + a[0:1] = 0 + a[1:2] = 0 + x = ord(a.tobytes()) + return x & ord(value) + + @staticmethod + def minToData(): + starttime = datetime(1996, 1, 1, 0, 0, 0) + endtime = datetime.now() + seconds = (endtime - starttime).total_seconds() + mins = seconds // 60 + m = int(round(mins)) + return m + + @staticmethod + def getTimeFormat(): + return datetime.now().strftime('%Y-%m-%d') + + @staticmethod + def getTypeLength(value): + if value is None or len(value) == 0: + return 0 + a = bitarray(8) + a.setall(False) + a[0:1] = 1 + a[1:2] = 1 + x = ord(a.tobytes()) + return x | len(value) + + @staticmethod + def checksum(b): + result = 0 + for item in b: + result += ord(item) + return (0x100 - (result & 0xff)) & 0xff + + +class BaseArea(object): + SUGGESTED_SIZE_COMMON_HEADER = 8 + SUGGESTED_SIZE_INTERNAL_USE_AREA = 72 + SUGGESTED_SIZE_CHASSIS_INFO_AREA = 32 + SUGGESTED_SIZE_BOARD_INFO_AREA = 80 + SUGGESTED_SIZE_PRODUCT_INFO_AREA = 80 + + INITVALUE = b'\x00' + resultvalue = INITVALUE * 256 + COMMON_HEAD_VERSION = b'\x01' + __childList = None + + def __init__(self, name="", size=0, offset=0): + self.__childList = [] + self._offset = offset + self.name = name + self._size = size + self._isPresent = False + self._data = b'\x00' * size + + @property + def childList(self): + return self.__childList + + @childList.setter + def childList(self, value): + self.__childList = value + + @property + def offset(self): + return self._offset + + @offset.setter + def offset(self, value): + self._offset = value + + @property + def size(self): + return self._size + + @size.setter + def size(self, value): + self._size = value + + @property + def data(self): + return self._data + + @data.setter + def data(self, value): + self._data = value + + @property + def isPresent(self): + return self._isPresent + + @isPresent.setter + def isPresent(self, value): + self._isPresent = value + + +class InternalUseArea(BaseArea): + pass + + +class ChassisInfoArea(BaseArea): + pass + + +class BoardInfoArea(BaseArea): + _boardTime = None + _fields = None + _mfg_date = None + areaversion = None + _boardversion = None + _language = None + + def __str__(self): + formatstr = "version : %x\n" \ + "length : %d \n" \ + "language : %x \n" \ + "mfg_date : %s \n" \ + "boardManufacturer : %s \n" \ + "boardProductName : %s \n" \ + "boardSerialNumber : %s \n" \ + "boardPartNumber : %s \n" \ + "fruFileId : %s \n" + + tmpstr = formatstr % (ord(self.boardversion), self.size, + self.language, self.getMfgRealData(), + self.boardManufacturer, self.boardProductName, + self.boardSerialNumber, self.boardPartNumber, + self.fruFileId) + for i in range(1, 11): + valtmp = "boardextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + tmpstr += "boardextra%d : %s \n" % (i, valtmpval) + else: + break + + return tmpstr + + def todict(self): + dic = collections.OrderedDict() + dic["boardversion"] = ord(self.boardversion) + dic["boardlength"] = self.size + dic["boardlanguage"] = self.language + dic["boardmfg_date"] = self.getMfgRealData() + dic["boardManufacturer"] = self.boardManufacturer + dic["boardProductName"] = self.boardProductName + dic["boardSerialNumber"] = self.boardSerialNumber + dic["boardPartNumber"] = self.boardPartNumber + dic["boardfruFileId"] = self.fruFileId + for i in range(1, 11): + valtmp = "boardextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + dic[valtmp] = valtmpval + else: + break + return dic + + def decodedata(self): + index = 0 + self.areaversion = self.data[index] + index += 1 + d_print("decode length :%d class size:%d" % + ((ord(self.data[index]) * 8), self.size)) + index += 2 + + timetmp = self.data[index: index + 3] + self.mfg_date = ord(timetmp[0]) | ( + ord(timetmp[1]) << 8) | (ord(timetmp[2]) << 16) + d_print("decode getMfgRealData :%s" % self.getMfgRealData()) + index += 3 + + templen = FruUtil.decodeLength(self.data[index]) + self.boardManufacturer = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardManufacturer:%s" % self.boardManufacturer) + + templen = FruUtil.decodeLength(self.data[index]) + self.boardProductName = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardProductName:%s" % self.boardProductName) + + templen = FruUtil.decodeLength(self.data[index]) + self.boardSerialNumber = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardSerialNumber:%s" % self.boardSerialNumber) + + templen = FruUtil.decodeLength(self.data[index]) + self.boardPartNumber = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardPartNumber:%s" % self.boardPartNumber) + + templen = FruUtil.decodeLength(self.data[index]) + self.fruFileId = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode fruFileId:%s" % self.fruFileId) + + for i in range(1, 11): + valtmp = "boardextra%d" % i + if self.data[index] != chr(0xc1): + templen = FruUtil.decodeLength(self.data[index]) + tmpval = self.data[index + 1: index + templen + 1] + setattr(self, valtmp, tmpval) + index += templen + 1 + d_print("decode boardextra%d:%s" % (i, tmpval)) + else: + break + + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + + def recalcute(self): + d_print("boardInfoArea version:%x" % ord(self.boardversion)) + d_print("boardInfoArea length:%d" % self.size) + d_print("boardInfoArea language:%x" % self.language) + self.mfg_date = FruUtil.minToData() + d_print("boardInfoArea mfg_date:%x" % self.mfg_date) + + self.data = chr(ord(self.boardversion)) + \ + chr(self.size // 8) + chr(self.language) + + self.data += chr(self.mfg_date & 0xFF) + self.data += chr((self.mfg_date >> 8) & 0xFF) + self.data += chr((self.mfg_date >> 16) & 0xFF) + + d_print("boardInfoArea boardManufacturer:%s" % self.boardManufacturer) + typelength = FruUtil.getTypeLength(self.boardManufacturer) + self.data += chr(typelength) + self.data += self.boardManufacturer + + d_print("boardInfoArea boardProductName:%s" % self.boardProductName) + self.data += chr(FruUtil.getTypeLength(self.boardProductName)) + self.data += self.boardProductName + + d_print("boardInfoArea boardSerialNumber:%s" % self.boardSerialNumber) + self.data += chr(FruUtil.getTypeLength(self.boardSerialNumber)) + self.data += self.boardSerialNumber + + d_print("boardInfoArea boardPartNumber:%s" % self.boardPartNumber) + self.data += chr(FruUtil.getTypeLength(self.boardPartNumber)) + self.data += self.boardPartNumber + + d_print("boardInfoArea fruFileId:%s" % self.fruFileId) + self.data += chr(FruUtil.getTypeLength(self.fruFileId)) + self.data += self.fruFileId + + for i in range(1, 11): + valtmp = "boardextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + d_print("boardInfoArea boardextra%d:%s" % (i, valtmpval)) + self.data += chr(FruUtil.getTypeLength(valtmpval)) + if valtmpval is not None: + self.data += valtmpval + else: + break + + self.data += chr(0xc1) + + if len(self.data) > (self.size - 1): + incr = (len(self.data) - self.size) // 8 + 1 + self.size += incr * 8 + + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] + d_print("self data:%d" % len(self.data)) + d_print("self size:%d" % self.size) + d_print("adjust size:%d" % (self.size - len(self.data) - 1)) + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) + + # checksum + checksum = FruUtil.checksum(self.data) + d_print("board info checksum:%x" % checksum) + self.data += chr(checksum) + + def getMfgRealData(self): + starttime = datetime(1996, 1, 1, 0, 0, 0) + mactime = starttime + timedelta(minutes=self.mfg_date) + return mactime + + @property + def language(self): + self._language = 25 + return self._language + + @property + def mfg_date(self): + return self._mfg_date + + @mfg_date.setter + def mfg_date(self, val): + self._mfg_date = val + + @property + def boardversion(self): + self._boardversion = self.COMMON_HEAD_VERSION + return self._boardversion + + @property + def fruFileId(self): + return self._FRUFileID + + @fruFileId.setter + def fruFileId(self, val): + self._FRUFileID = val + + @property + def boardPartNumber(self): + return self._boardPartNumber + + @boardPartNumber.setter + def boardPartNumber(self, val): + self._boardPartNumber = val + + @property + def boardSerialNumber(self): + return self._boardSerialNumber + + @boardSerialNumber.setter + def boardSerialNumber(self, val): + self._boardSerialNumber = val + + @property + def boardProductName(self): + return self._boradProductName + + @boardProductName.setter + def boardProductName(self, val): + self._boradProductName = val + + @property + def boardManufacturer(self): + return self._boardManufacturer + + @boardManufacturer.setter + def boardManufacturer(self, val): + self._boardManufacturer = val + + @property + def boardTime(self): + return self._boardTime + + @boardTime.setter + def boardTime(self, val): + self._boardTime = val + + @property + def fields(self): + return self._fields + + @fields.setter + def fields(self, val): + self._fields = val + + +class ProductInfoArea(BaseArea): + _productManufacturer = None + _productAssetTag = None + _FRUFileID = None + _language = None + + def __str__(self): + formatstr = "version : %x\n" \ + "length : %d \n" \ + "language : %x \n" \ + "productManufacturer : %s \n" \ + "productName : %s \n" \ + "productPartModelName: %s \n" \ + "productVersion : %s \n" \ + "productSerialNumber : %s \n" \ + "productAssetTag : %s \n" \ + "fruFileId : %s \n" + + tmpstr = formatstr % (ord(self.areaversion), self.size, + self.language, self.productManufacturer, + self.productName, self.productPartModelName, + self.productVersion, self.productSerialNumber, + self.productAssetTag, self.fruFileId) + + for i in range(1, 11): + valtmp = "productextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + tmpstr += "productextra%d : %s \n" % (i, valtmpval) + else: + break + + return tmpstr + + def todict(self): + dic = collections.OrderedDict() + dic["productversion"] = ord(self.areaversion) + dic["productlength"] = self.size + dic["productlanguage"] = self.language + dic["productManufacturer"] = self.productManufacturer + dic["productName"] = self.productName + dic["productPartModelName"] = self.productPartModelName + dic["productVersion"] = int(self.productVersion, 16) + dic["productSerialNumber"] = self.productSerialNumber + dic["productAssetTag"] = self.productAssetTag + dic["productfruFileId"] = self.fruFileId + for i in range(1, 11): + valtmp = "productextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + dic[valtmp] = valtmpval + else: + break + return dic + + def decodedata(self): + index = 0 + self.areaversion = self.data[index] # 0 + index += 1 + d_print("decode length %d" % (ord(self.data[index]) * 8)) + d_print("class size %d" % self.size) + index += 2 + + templen = FruUtil.decodeLength(self.data[index]) + self.productManufacturer = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productManufacturer:%s" % self.productManufacturer) + + templen = FruUtil.decodeLength(self.data[index]) + self.productName = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productName:%s" % self.productName) + + templen = FruUtil.decodeLength(self.data[index]) + self.productPartModelName = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productPartModelName:%s" % self.productPartModelName) + + templen = FruUtil.decodeLength(self.data[index]) + self.productVersion = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productVersion:%s" % self.productVersion) + + templen = FruUtil.decodeLength(self.data[index]) + self.productSerialNumber = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productSerialNumber:%s" % self.productSerialNumber) + + templen = FruUtil.decodeLength(self.data[index]) + self.productAssetTag = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productAssetTag:%s" % self.productAssetTag) + + templen = FruUtil.decodeLength(self.data[index]) + self.fruFileId = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode fruFileId:%s" % self.fruFileId) + + for i in range(1, 11): + valtmp = "productextra%d" % i + if self.data[index] != chr(0xc1) and index < self.size - 1: + templen = FruUtil.decodeLength(self.data[index]) + if templen == 0: + break + tmpval = self.data[index + 1: index + templen + 1] + d_print("decode boardextra%d:%s" % (i, tmpval)) + setattr(self, valtmp, tmpval) + index += templen + 1 + else: + break + + @property + def productVersion(self): + return self._productVersion + + @productVersion.setter + def productVersion(self, name): + self._productVersion = name + + @property + def areaversion(self): + self._areaversion = self.COMMON_HEAD_VERSION + return self._areaversion + + @areaversion.setter + def areaversion(self, name): + self._areaversion = name + + @property + def language(self): + self._language = 25 + return self._language + + @property + def productManufacturer(self): + return self._productManufacturer + + @productManufacturer.setter + def productManufacturer(self, name): + self._productManufacturer = name + + @property + def productName(self): + return self._productName + + @productName.setter + def productName(self, name): + self._productName = name + + @property + def productPartModelName(self): + return self._productPartModelName + + @productPartModelName.setter + def productPartModelName(self, name): + self._productPartModelName = name + + @property + def productSerialNumber(self): + return self._productSerialNumber + + @productSerialNumber.setter + def productSerialNumber(self, name): + self._productSerialNumber = name + + @property + def productAssetTag(self): + return self._productAssetTag + + @productAssetTag.setter + def productAssetTag(self, name): + self._productAssetTag = name + + @property + def fruFileId(self): + return self._FRUFileID + + @fruFileId.setter + def fruFileId(self, name): + self._FRUFileID = name + + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + + def recalcute(self): + d_print("product version:%x" % ord(self.areaversion)) + d_print("product length:%d" % self.size) + d_print("product language:%x" % self.language) + self.data = chr(ord(self.areaversion)) + \ + chr(self.size // 8) + chr(self.language) + + typelength = FruUtil.getTypeLength(self.productManufacturer) + self.data += chr(typelength) + self.data += self.productManufacturer + + self.data += chr(FruUtil.getTypeLength(self.productName)) + self.data += self.productName + + self.data += chr(FruUtil.getTypeLength(self.productPartModelName)) + self.data += self.productPartModelName + + self.data += chr(FruUtil.getTypeLength(self.productVersion)) + self.data += self.productVersion + + self.data += chr(FruUtil.getTypeLength(self.productSerialNumber)) + self.data += self.productSerialNumber + + self.data += chr(FruUtil.getTypeLength(self.productAssetTag)) + if self.productAssetTag is not None: + self.data += self.productAssetTag + + self.data += chr(FruUtil.getTypeLength(self.fruFileId)) + self.data += self.fruFileId + + for i in range(1, 11): + valtmp = "productextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + d_print("boardInfoArea productextra%d:%s" % (i, valtmpval)) + self.data += chr(FruUtil.getTypeLength(valtmpval)) + if valtmpval is not None: + self.data += valtmpval + else: + break + + self.data += chr(0xc1) + if len(self.data) > (self.size - 1): + incr = (len(self.data) - self.size) // 8 + 1 + self.size += incr * 8 + d_print("self.data:%d" % len(self.data)) + d_print("self.size:%d" % self.size) + + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) + checksum = FruUtil.checksum(self.data) + d_print("board info checksum:%x" % checksum) + self.data += chr(checksum) + + +class MultiRecordArea(BaseArea): + pass + + +class Field(object): + + def __init__(self, fieldType="ASCII", fieldData=""): + self.fieldData = fieldData + self.fieldType = fieldType + + @property + def fieldType(self): + return self.fieldType + + @property + def fieldData(self): + return self.fieldData + + +class ipmifru(BaseArea): + _BoardInfoArea = None + _ProductInfoArea = None + _InternalUseArea = None + _ChassisInfoArea = None + _multiRecordArea = None + _productinfoAreaOffset = BaseArea.INITVALUE + _boardInfoAreaOffset = BaseArea.INITVALUE + _internalUserAreaOffset = BaseArea.INITVALUE + _chassicInfoAreaOffset = BaseArea.INITVALUE + _multiRecordAreaOffset = BaseArea.INITVALUE + _bindata = None + _bodybin = None + _version = BaseArea.COMMON_HEAD_VERSION + _zeroCheckSum = None + _frusize = 256 + + def __str__(self): + tmpstr = "" + if self.boardInfoArea.isPresent: + tmpstr += "\nboardinfoarea: \n" + tmpstr += self.boardInfoArea.__str__() + if self.productInfoArea.isPresent: + tmpstr += "\nproductinfoarea: \n" + tmpstr += self.productInfoArea.__str__() + return tmpstr + + def decodeBin(self, eeprom): + commonHead = eeprom[0:8] + d_print("decode version %x" % ord(commonHead[0])) + if ord(self.COMMON_HEAD_VERSION) != ord(commonHead[0]): + raise FruException("HEAD VERSION error,not Fru format!", -10) + if FruUtil.checksum(commonHead[0:7]) != ord(commonHead[7]): + strtemp = "check header checksum error [cal:%02x data:%02x]" % ( + FruUtil.checksum(commonHead[0:7]), ord(commonHead[7])) + raise FruException(strtemp, -3) + if ord(commonHead[1]) != ord(self.INITVALUE): + d_print("Internal Use Area is present") + self.internalUseArea = InternalUseArea( + name="Internal Use Area", size=self.SUGGESTED_SIZE_INTERNAL_USE_AREA) + self.internalUseArea.isPresent = True + self.internalUserAreaOffset = ord(commonHead[1]) + self.internalUseArea.data = eeprom[self.internalUserAreaOffset * 8: ( + self.internalUserAreaOffset * 8 + self.internalUseArea.size)] + if ord(commonHead[2]) != ord(self.INITVALUE): + d_print("Chassis Info Area is present") + self.chassisInfoArea = ChassisInfoArea( + name="Chassis Info Area", size=self.SUGGESTED_SIZE_CHASSIS_INFO_AREA) + self.chassisInfoArea.isPresent = True + self.chassicInfoAreaOffset = ord(commonHead[2]) + self.chassisInfoArea.data = eeprom[self.chassicInfoAreaOffset * 8: ( + self.chassicInfoAreaOffset * 8 + self.chassisInfoArea.size)] + if ord(commonHead[3]) != ord(self.INITVALUE): + self.boardInfoArea = BoardInfoArea( + name="Board Info Area", size=self.SUGGESTED_SIZE_BOARD_INFO_AREA) + self.boardInfoArea.isPresent = True + self.boardInfoAreaOffset = ord(commonHead[3]) + self.boardInfoArea.size = ord( + eeprom[self.boardInfoAreaOffset * 8 + 1]) * 8 + d_print("Board Info Area is present size:%d" % + (self.boardInfoArea.size)) + self.boardInfoArea.data = eeprom[self.boardInfoAreaOffset * 8: ( + self.boardInfoAreaOffset * 8 + self.boardInfoArea.size)] + if FruUtil.checksum(self.boardInfoArea.data[:-1]) != ord(self.boardInfoArea.data[-1:]): + strtmp = "check boardInfoArea checksum error[cal:%02x data:%02x]" % \ + (FruUtil.checksum( + self.boardInfoArea.data[:-1]), ord(self.boardInfoArea.data[-1:])) + raise FruException(strtmp, -3) + self.boardInfoArea.decodedata() + if ord(commonHead[4]) != ord(self.INITVALUE): + d_print("Product Info Area is present") + self.productInfoArea = ProductInfoArea( + name="Product Info Area ", size=self.SUGGESTED_SIZE_PRODUCT_INFO_AREA) + self.productInfoArea.isPresent = True + self.productinfoAreaOffset = ord(commonHead[4]) + d_print("length offset value: %02x" % + ord(eeprom[self.productinfoAreaOffset * 8 + 1])) + self.productInfoArea.size = ord( + eeprom[self.productinfoAreaOffset * 8 + 1]) * 8 + d_print("Product Info Area is present size:%d" % + (self.productInfoArea.size)) + + self.productInfoArea.data = eeprom[self.productinfoAreaOffset * 8: ( + self.productinfoAreaOffset * 8 + self.productInfoArea.size)] + if FruUtil.checksum(self.productInfoArea.data[:-1]) != ord(self.productInfoArea.data[-1:]): + strtmp = "check productInfoArea checksum error [cal:%02x data:%02x]" % ( + FruUtil.checksum(self.productInfoArea.data[:-1]), ord(self.productInfoArea.data[-1:])) + raise FruException(strtmp, -3) + self.productInfoArea.decodedata() + if ord(commonHead[5]) != ord(self.INITVALUE): + self.multiRecordArea = MultiRecordArea( + name="MultiRecord record Area ") + d_print("MultiRecord record present") + self.multiRecordArea.isPresent = True + self.multiRecordAreaOffset = ord(commonHead[5]) + self.multiRecordArea.data = eeprom[self.multiRecordAreaOffset * 8: ( + self.multiRecordAreaOffset * 8 + self.multiRecordArea.size)] + + def initDefault(self): + self.version = self.COMMON_HEAD_VERSION + self.internalUserAreaOffset = self.INITVALUE + self.chassicInfoAreaOffset = self.INITVALUE + self.boardInfoAreaOffset = self.INITVALUE + self.productinfoAreaOffset = self.INITVALUE + self.multiRecordAreaOffset = self.INITVALUE + self.zeroCheckSum = self.INITVALUE + self.offset = self.SUGGESTED_SIZE_COMMON_HEADER + self.productInfoArea = None + self.internalUseArea = None + self.boardInfoArea = None + self.chassisInfoArea = None + self.multiRecordArea = None + # self.recalcute() + + @property + def version(self): + return self._version + + @version.setter + def version(self, name): + self._version = name + + @property + def internalUserAreaOffset(self): + return self._internalUserAreaOffset + + @internalUserAreaOffset.setter + def internalUserAreaOffset(self, obj): + self._internalUserAreaOffset = obj + + @property + def chassicInfoAreaOffset(self): + return self._chassicInfoAreaOffset + + @chassicInfoAreaOffset.setter + def chassicInfoAreaOffset(self, obj): + self._chassicInfoAreaOffset = obj + + @property + def productinfoAreaOffset(self): + return self._productinfoAreaOffset + + @productinfoAreaOffset.setter + def productinfoAreaOffset(self, obj): + self._productinfoAreaOffset = obj + + @property + def boardInfoAreaOffset(self): + return self._boardInfoAreaOffset + + @boardInfoAreaOffset.setter + def boardInfoAreaOffset(self, obj): + self._boardInfoAreaOffset = obj + + @property + def multiRecordAreaOffset(self): + return self._multiRecordAreaOffset + + @multiRecordAreaOffset.setter + def multiRecordAreaOffset(self, obj): + self._multiRecordAreaOffset = obj + + @property + def zeroCheckSum(self): + return self._zeroCheckSum + + @zeroCheckSum.setter + def zeroCheckSum(self, obj): + self._zeroCheckSum = obj + + @property + def productInfoArea(self): + return self._ProductInfoArea + + @productInfoArea.setter + def productInfoArea(self, obj): + self._ProductInfoArea = obj + + @property + def internalUseArea(self): + return self._InternalUseArea + + @internalUseArea.setter + def internalUseArea(self, obj): + self.internalUseArea = obj + + @property + def boardInfoArea(self): + return self._BoardInfoArea + + @boardInfoArea.setter + def boardInfoArea(self, obj): + self._BoardInfoArea = obj + + @property + def chassisInfoArea(self): + return self._ChassisInfoArea + + @chassisInfoArea.setter + def chassisInfoArea(self, obj): + self._ChassisInfoArea = obj + + @property + def multiRecordArea(self): + return self._multiRecordArea + + @multiRecordArea.setter + def multiRecordArea(self, obj): + self._multiRecordArea = obj + + @property + def bindata(self): + return self._bindata + + @bindata.setter + def bindata(self, obj): + self._bindata = obj + + @property + def bodybin(self): + return self._bodybin + + @bodybin.setter + def bodybin(self, obj): + self._bodybin = obj + + def recalcuteCommonHead(self): + self.bindata = "" + self.offset = self.SUGGESTED_SIZE_COMMON_HEADER + d_print("common Header %d" % self.offset) + d_print("fru eeprom size %d" % self._frusize) + if self.internalUseArea is not None and self.internalUseArea.isPresent: + self.internalUserAreaOffset = self.offset // 8 + self.offset += self.internalUseArea.size + d_print("internalUseArea is present offset:%d" % self.offset) + + if self.chassisInfoArea is not None and self.chassisInfoArea.isPresent: + self.chassicInfoAreaOffset = self.offset // 8 + self.offset += self.chassisInfoArea.size + d_print("chassisInfoArea is present offset:%d" % self.offset) + + if self.boardInfoArea is not None and self.boardInfoArea.isPresent: + self.boardInfoAreaOffset = self.offset // 8 + self.offset += self.boardInfoArea.size + d_print("boardInfoArea is present offset:%d" % self.offset) + d_print("boardInfoArea is present size:%d" % + self.boardInfoArea.size) + + if self.productInfoArea is not None and self.productInfoArea.isPresent: + self.productinfoAreaOffset = self.offset // 8 + self.offset += self.productInfoArea.size + d_print("productInfoArea is present offset:%d" % self.offset) + + if self.multiRecordArea is not None and self.multiRecordArea.isPresent: + self.multiRecordAreaOffset = self.offset // 8 + d_print("multiRecordArea is present offset:%d" % self.offset) + + if self.internalUserAreaOffset == self.INITVALUE: + self.internalUserAreaOffset = 0 + if self.productinfoAreaOffset == self.INITVALUE: + self.productinfoAreaOffset = 0 + if self.chassicInfoAreaOffset == self.INITVALUE: + self.chassicInfoAreaOffset = 0 + if self.boardInfoAreaOffset == self.INITVALUE: + self.boardInfoAreaOffset = 0 + if self.multiRecordAreaOffset == self.INITVALUE: + self.multiRecordAreaOffset = 0 + + self.zeroCheckSum = (0x100 - ord(self.version) - self.internalUserAreaOffset - self.chassicInfoAreaOffset - self.productinfoAreaOffset + - self.boardInfoAreaOffset - self.multiRecordAreaOffset) & 0xff + d_print("zerochecksum:%x" % self.zeroCheckSum) + self.data = "" + self.data += chr(self.version[0]) + chr(self.internalUserAreaOffset) + chr(self.chassicInfoAreaOffset) + chr( + self.boardInfoAreaOffset) + chr(self.productinfoAreaOffset) + chr(self.multiRecordAreaOffset) + chr(self.INITVALUE[0]) + chr(self.zeroCheckSum) + + self.bindata = self.data + self.bodybin + totallen = len(self.bindata) + d_print("totallen %d" % totallen) + if totallen < self._frusize: + self.bindata = self.bindata.ljust(self._frusize, chr(self.INITVALUE[0])) + else: + raise FruException('bin data more than %d' % self._frusize, -2) + + def recalcutebin(self): + self.bodybin = "" + if self.internalUseArea is not None and self.internalUseArea.isPresent: + d_print("internalUseArea present") + self.bodybin += self.internalUseArea.data + if self.chassisInfoArea is not None and self.chassisInfoArea.isPresent: + d_print("chassisInfoArea present") + self.bodybin += self.chassisInfoArea.data + if self.boardInfoArea is not None and self.boardInfoArea.isPresent: + d_print("boardInfoArea present") + self.boardInfoArea.recalcute() + self.bodybin += self.boardInfoArea.data + if self.productInfoArea is not None and self.productInfoArea.isPresent: + d_print("productInfoAreapresent") + self.productInfoArea.recalcute() + self.bodybin += self.productInfoArea.data + if self.multiRecordArea is not None and self.multiRecordArea.isPresent: + d_print("multiRecordArea present") + self.bodybin += self.productInfoArea.data + + def recalcute(self, fru_eeprom_size=256): + self._frusize = fru_eeprom_size + self.recalcutebin() + self.recalcuteCommonHead() + + def setValue(self, area, field, value): + tmp_area = getattr(self, area, None) + if tmp_area is not None: + tmp_area.fruSetValue(field, value) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin new file mode 100644 index 0000000000000000000000000000000000000000..08eba59b3a77d401ecbb2fcca0072552bb48e10f GIT binary patch literal 8388725 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 Dsl;?vv{TfI==a%0s_0UR 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

vPPy*G2t$~%gG@uj@M0!PA|-2k1UV6FE5?js&V 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

WaOu6i{!Xm1)aVc2BYyLgizhTKiezMiUXJV+ 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 z zl9D63f-@I_Cpsf?V~p!8@+fn%?zSF-mKW6ed*G~Uqrt)_?RnP-aR}9lDOix9Og_iraKwArloctQ(Hzmvi4X6Mg8%&>Oag^K4%$fHdNM$|$cctui_qJZgU(vD|VU>sQWiR$~hh(VMJZXudIfi5;Ng7aBfEI2NS;3%_ z{EP!T9a|AK1LKp~GuaQ>v-qo{j zbUbz0kv96Vo-8gnLoPiaDF=NYpwYp(UF%x18=*G~&ii?7va}*J<0JX5hvyX2`=^go zZK-xztZsNF_2bx8HfI0`aVV5*N_;5

QXUMlqVET@-ye4w=6*zbeaWi6L4rUUedoNxIMx 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%0DP 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

*-YcW0S(9W|Q(F43YFC*gq`Js`DU|#f^XK= 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%0D}X zL`WUGht@`!XcnQ-!|k?g;E&0n}f!2H#vU{OnCwC^f` z!r=k0qL=!O6%DoLBQDX0C`dfr&lKB%UW!m;zMAS?2O+ECeZ4X|%cKFN zd1Nwk@qD%8x<3nJ!*m@8I&5b$vxkAdvjIAAOa-)(&#?>n%Sj7}MfmznZXKZXeGluq zGdHag6AjU~_g9 z+~FGAwsnh1Frn)wcBrl*TBc73Zhz;+ro>;mKX=laUu27lY^AphguiXWcR$cCz_aW` zC;`^Jk`{F$oL(DY6(%-QuB5|y(Fi*yOtb40t&g@_>Mt3_GiK03px~Q+#8R3%ZC&%8 z|E0EWlf^go{exssxd93d0&X+ouO6Fn=n2y#Sk@T(prqs5QV&mRO7K?nrlEd(2oduZ z$qX^xX?IPztr1hY=4}+uSZEWl(v;@?cIdO){Vk~B9f0mDMr@aqu6g_-h#7XuvB+L@ zQ9-7}hoGZkw0F!La=*!Q`Wl4#1XgJEjVl;nl!(UdNQRr_Z)>CTwRy#Cf5?@LsCrIz zG9%QcrpuKNsNvf-g#9Fs2SyxivEH8VP&+{?#3HH`Ne|*xzFUqZx#ZHni`--9m!vzt z>QY;A)j81IQ*Q}<4S8@WGTaFOgMs0!ZLKgdIIZ)7go`KEgc#nEFySHIbI0JwBV3Xn zxEU@C)fmI_Y7l=Oz8;+8- zQu5y-nk*?#XCnT!uF5c;2zn`CAdzIz%h|}T9FHbXWrw}l6>O38gG1#CDQq*tG<@=s zi|$OoKVjPlv;vTBcVhbuat{y%`1n3%JdrMSPBCG@%%zMqmBX9au{GiZ#{)i zVO*huk#K0*ovIM19xt7i{)wuqJ9AdBMpwS#Q+ya%^G%PxPiu!_Gn+3)#`nsmxxz4t z<(;1nHb%9$8({vZhQh&~_rWziVC{-)R@jaj3Xt01CxSf{-sVRjk?lx6UEgfPi+HKO zd@NZpT(`WLAd>{*aCVwsXzyS({V0L7tzP(`rBCWNDAJ8*t{uFRK>gr+T#IT^%8OxT zh3FyU=C6%8~57C-+X5tMF9W*|Nrz>Gp<|tOF*&S zWb0jCTfTm(3IJ+S0QiCc02~6hzs&UD_Wehl)DWogP{EM`NFGiHGJ&B-j4VGCt(s=s z0$C_+MN6nhPNMEIcG!lQeF6oh-9K)pMo+CN67*9WJqQBa#-kYOUdTwH!L>7q`H7hV z_VA+k`RNT4@1cIO@(&)pPS}$1L+O}lsw1oI6awz4$8W;-rtMDnM&S? zjOp2+%7@!-VP9s$B8W_I1fc?^5m&{s^e+S76dcaJBQ+)OH)&`D+@9hx!qKui(#9 z#SJ*#vO@7EEk(2t;?jQ&eC+UQ0-Y*x3sM^GzjJ5!jh^`gJnCq0J4Zcn&Eh28u`NkB z=2QFoO--Ynd@lHoWHGg}c5%nmln7QFlZp-=^O95BOS#mwCla@xsm2O1n;z{YfiBDy znRQrd9pkVDse`a!VfF$FeX(vs$=D`TtutEBWVIM#Y@x zob=`RGc^1FP85481-|m$hI=9F=N?YeOb+Yfnt9EQ&Hyzdv+BhaCluipRo}$(*a+1# zH(POo3bpJ=KVRCzW9y70q0sWq(YF6Gc_#e(^c)>_*zK+)9Fw<0JN%_c7&9V3HEaVX#KdnBS@ z_B|esqgYnfZ1;gY%6;)O)O!}8+Y5X@3Mh`HQp8quOKu}DGE1(qZfzFNoK=rlfb{_= z_k}o>&gX-OKcYD$KO3b0XS}qnf9qT7Tk!Hp>He%G(mk4!lR$8pJbWVCKGDzlJ~4WH zr$tfq0QDu#4`Z3cEQM4f%!QqFt_zSRkfla#!fv}ofh+~el^$XhZv|X$Fy%acj6hll z&bpc#+B6<52U~T2enMXw?`|{5?kG3I^oi8C`ypZ*kMTutcB~d&1}BHPEeKKYqECNM zhpY=e5YOtYAJz5%f21^Ud0E8d$PDnn`ut{OH#hNP6dsnVGrJC<>$f+HubJC(%gvEvVz$EiduQHrw9|fKOg8Mv1t;hAK z8G_jBMW{0P5*V+X;St3rII?pNk@}fi-CmDDJ__FqdM<`1T;iHJ-yoqFn4>0^Y z86el2eUS=B{`79@BW> zp#J#qISBILKm`3iQt+s;LG{^Z<~g?zx*+`0B-12+QGSwT z=3TwE(SHnFu^)ahpEG4INJ#8lwi(vnsvL61;?U*;MlO-x?Ar}OUiaQ@D~Y*wxYt$Y z>s90391tc(AnBm+IvVIau!-L^2uFgRZp(o8`Cr?b0+p_pZN0)HigHYCds|AC8acq~ z$xw;}i?w&(*%>!hHz>3_0%tFIZ*PUH4fPARA4>7CB6BE8rF*$ieL%x6iO|mV`aNJ41$OAY6oB^)j9~UMVT(8v9)>&Bx5!i&j1P!~N+C7c;A(Yy9i{ z%`yDLl=~mYJ~zCO-TB=<3JFsUGd&#^xQEenb*TWkg`t0# zQ)}^oC|gQ2xKDe{BE@vY4L%W}B~{7L^zZI&S)Xep0OFpFObdP~bNI^>KB1ZL^! zVDHI4UuQRjyMtO%9n~AD$t_9T1&FLot2<_GV1cMl&{6!I5VzL5^S?u@@*o=fLsI$R zD)u1VL3e7W!bhEzrUVu}(x$(OT>Z)Q*5t|+y9IkS%gk^Vv++^8donba$5GC5)f$Z8 z$FiH?PVQtYa$CUZPW`*|Rx&7(bqtAmgL$gH2ju<$hA zoe2UD*fU1Ow1t`7Tj$H1;TN;qHR{JHFjWvr-VU_*E{lBEhS$(?)G9GS`aHchl484n zagtMQ9fRLDr|jq<#sy#gzYLi50qoH!!@K2rDF(gL7L<#S6vf#;(@U zJPOucSrfQ-gOmVOtS0(0w>iH*Q(_{G9|iTaV>C<>X?zBb9Cl{yhk1M@!*cxzYY`=B zO^S>Xrkw#d3~wdP2$VAlDJ2jz=Rq?oxv(XfnuDk974bDZQqZVf zs@PH>j@On-fsPaokE+>Kqf5T}RM*lt3!XqCiZRzY8Av70IB>}-5`MZ<)ymmNL`Ha% z!@^}pkAkjG{coRIcn3!!id--L?EShBC~jkA4*5lJ=q5(od$};Q2yZWWA7OR5p1*n( z1WwJw*>FRDd}w^&U;8OxKbT-uQY7c}LRYOO&Opo}!p$*HyB>UM?IGl{RT#u?{$*oR z4lVKBvoQHqKaI4{AcA2(U%hXd$Eb9tzRe(}Xz6U%nLJA_H=VCAQh%gHA6roA%FjwArogReYs6ZPk|eZ;CI9$ z2&r0$%c}F`95rl5a#8KJa*VjE6a1MF2Fqac59?6yqBO6OZk6J;l26zoyeYlcCPd47 z?%tH@djv7aD}(SE$s;uFdb{vT{=2M!(o3PF$TH4Hv8=QtYGJrmR0Ck zcFB5?Xgji(u&!rur%}5#x^nss3`jzSDZ2+^(=Npl0PlNj@peB1cK2uL$#Mc}i5n^V zJ&t!rY3+B{!$?bMWf{;Z)iF9TbC@-Fiu|_jCSI}}4)xkh<30LJKTpO3S`x`<-431nvf5dQ>t+&7h^V&5yLaoZ~VFrws`!(xGog0 zgx~=lU-jeZu0l`)6vNi{0t$%~fp!X;S(E(52|t{}24l^#qiv(^4z5YWy!ndWGTw|C zKjHxX*!qXWF+Q^({t!(BA>0Oy&sP-Zf0>n-wP1AvVB)g%R1H z&1!>JOCD=g`Xck3_q;mB^rJJ~)iZ5n)bs~m_<3MJB+?auHE^>Hc97@5-~^Sy0^8SMEwDLrr3)=}G$(zDy!pvkSah?lQqV z6Vn`uC6cG%LYH_~vi7P^=0p^-ksGLs!IP|Zx9D(M$W*D-`}Salr8W3Cq~?NbQ8;6t zdAnIQIw7ohFi6uRC^6u|41db9F*^s%-o>q<9 zaTTVB*H=0eQDQiV{#}nXpZWQ~%a^)$Eoyh00O zvQ)Vsh_^5wZ$DUwg>~Ajp1O$ny#f?S=-wZ-C4_rI*Q@X3%rN33F!ohX-C+Df5DiTt z;SMK>ln>TbXL*}oGD!jJUK?Zz4jE%pi8q=so*#(_p@qR!+NP^wguRSM1ic#N=?wqi zBs-tkQQGfeajc~SkwYLd3%o?xy@6I4S5~Sd=ZeYGu!T071W!MgOR)8=G8(|_`0FI_ zC^Zj$T3~{=dRC@dHgWX@I_6TLmJPT2;zwGxjfD*aC~HuPs-{~cG3!uHb`{U(#w`}5 zAFrX|$+f_u+}$Xou{I3Gb9%Z|=iRB4g-Z+rDmO9HgQpsZd%>z{>Np2l9C{=l8Ezuv ze7-3f|Im;41}}*hx87pyOMTMVOJ!@3dUL^Xvd%8^bR5PGJKFt?+G?~~<9Wm{Wi&%O(~|Y2DkZ77Gp_ezlbrm6$_CJ6 z$W&ft@5`uM3j#7kkrB&|0{7f)*iiDfql<(o#)b}Vasm@16Py%&wtWti8$^C7-hSA_ z1Q`kWmta8`;IJ6pU!`@U@DNHE;rd|_)DwzH*eI`VWp~imAOmn^5uZduA;{JxlF?Q0WF_jIf$AtJZo}PA~ltPd_oi8nRQ(ZSv4{dJ_K{yCld=WrCW3MOHUCh z7Z`N?O|mX?oZmEVxgfCic5{#^T6!Pa5{;H*s`MrN@~M=HRonK;_`*#bG{C1_J6N@g z(b7$bP(yth%0cbgGV}8=N~BL+`YpH8qShhCWi4-d94>VxH@Ll+-snd(y+cz9MT3#z2Ax8h?>apk$(q(zAC}#p6z-FFP)pG(%UuU{s|Z z>1?qeZH1y(qRdjUGdxfz+- zTbsUXB>IyYYRE{~3f^hy%+Rio@qahGeY|&QoDzd2kj680X2c0DlwliA}$9KDX zy}kAAPPOr>N8O5LoYEf5YsY|QD`p$#%|&c!u~N%GnLPvcZ%9VLT5=|8XF}aGxTFZ( zn7URO#|se~6($&ZV>jOOKG{im)R`kcxxAX(l446^6JB>Lt^fP{mAB*<=+Z&|sGMaF zPFhS)`Nn278}p&ILFmd94e<`{rY;LF)V%$HYXjEpT6^*aYf&(z%$(5VM^}+8ML^8D z+_66@eSs1D`3q*PWaZZ}sC&aon+3xolaWofiRR+e>BeCU6Bas4M`z%7aVK1^88f%H_?E@K}4bo9M(Mg;9|^ zxW1@#4a0BK3@zeJC z#k>H#QGjBB1DMu%L{cYgWv&HmfPz1lB)2>j5AqXIiwnF1zG=1)eg$l0!MAcF=#?U& zA)i#5;fpFY31`j*T!h)*8tzwrnZe9N`_^ua0&ZPC+C-t%pg=VgXHXY(G3jFaf;1VK zTmn5;(Eb*H|A9BEny)!S3&(4>O^hSn+tPfio@(pCk8BtJ^S-~Fx4K3^*2t=-4hWl| zuiYXh0o3kVxpIkkHnQMJQPUr7Y6um+eSUm-QG0)HCX4Ao@kE4+e;^Xnt;a?UlP`qB z-qFH1uYGY5*v46h`~>Q3jfRK1DgXS;u}2DCCL(#B;Pt-~x5$=gWI^d64sD&!^K4X8 zJ~Fq)kp+QP%* z4&6VHSPl|xukM~7s6cHQ@vZzaqrp#Re^l_eKzU}|E?CL+)HOUgWHkrKig$QIc%;`s z$R6tS(Z?yI&}8wV%M>0F*9+Bx=c~O9YUoW<2)hp7-CMRb_8jk%g7J-1u+S)#o71f5 zgse%br0CML)f7bg{0GN}-2+N-_^#qH%0s(dPS(Z^^2$Wr0O)5921$EBgjX8#HgpuW z!Hb2*!-IW2d!NC2x}el|CoK>@o?5SZ) z_w=#J52Wx~2NM<^(VT;lq3g7WKL_phYqm~aObLt_Kco`+GZ3>Yk z=XmG4nB=-@6u%dZ57vf}UIt?P)HxZEfyPho*pWjxal+VVj$S$W==*1(lM872mHI(C zhGfl+4M;+oPPvZ zeSpbNSS+B>#udPLJUyhn@7>33ycQ;S@6GkW@*3zJeo}C1ggQ#Ngvv{^JJ*iR^V~JM zc?MEWM_^(^^qpG2)vS%-W6Fffrdbs{X+t{GyQHJyb0Hy5eks!5N?M$;qZt-v((y5} zHp3;&Q(jypEGbv58n9LO7F+83e!i(7Yjq=k? zguaVWZ_QdH)#t2*cz(>!L{hvpy#x!if1!Iw^ms6A1qGN!A89z#4yk3(9e_-zRnO&MrdoD{dBW)tHWg+f0JaiG0*fd%x>#+{;wf)Wn4y_ zhsXN0v=om}i!*-*mo(h1Bv?J!l|am$tcsm-$a-XrcZa~;u-RtaTScxS%yZ5wee3fx z{fqQ1xj)1bKh5@Y1hV%V5A(V))xlZv0SLq%c1+WcoxkILcDa;{V|V|lTo7Wu%*4Ws zXB`*j%lF*x7;Xd~v?{44%bQZ{J=!YwYX@j15yH?+K_(8O9$WY(M^h3%UpV#sP%x07AT$L?_`5 z+doGZYJXy!R_qJlJ~xaZ7G+4b$&_l&oy9|6Xo`!^xVpM9FlVMKV9dlD%<7rQPyC+R z@zkqk_o*?A?Ms+NuqW_6|CwK9KGk5QsrKQ3D?luSQ9SI>gaPD-ZI>4c#67Ugq``qJ67K?!>oC(1Aj>@Qdf6hNl0_WyOei_e z+X=3v$_`aMx2P@BoYfi5qYy;-(G>|O9R0?1H)${s9Tf|FT=GDo?0*%Oj{0KZw+{r+ zZ~_D9CO~EmIAY&}@q7ik^E&1_g$p&<`P`IGxF~W{8XLQ&Mdc&yB@b=^7D|lr8YD@C zeJ)naag}xKg}awQ9md3V74A#7x7dIOG`iPEEce``Nwmb=%aQ~vFeSK5To3`7D!SFB z{m|bfK^{lp0)>eIT9_X~+S1%&+)YnLTR${w^*X1V>9a?v7|OXR`FjLjH6{$$8TUBo zQI;La^N3TUC-76D@9-h#M~%z*je|8VeXufgOn7|zRpE2lgPJrm8{H!>Bo8Q;B+xAU2b%zBEVd+X zCt(iDQ`n$ZYSj>9usyJ+v7IZe!?vq2K~xlJ3^nYmT}z$a1C^jv#%?POSS!vmJV3ojZg_VtYCcBeij3$nVNu)3xLGMnLf^$${nkqNd>3^O z?qopNuqiT?N2jNwScE{_C=%5z#|2{;k-9J}8B|*;9dxkjNcrn8EC_O&#AC>lR#k2W z`a_#!kaaw>CBP4f01RX@7ow~K{w;$jMeI z*qpX_{meM^7lZ<3T}L~7=`6so4A<>y4tIePur^C*^bY@VFUY2Rt|1a_P)i8+0K13f zdK)S8BPaxdKwzm}Vvs4j~@LIj4o640JH&<1SEQ)YIM8siY#PY9*g zc5|ngN>Ai@^-?LwNz}1ok{YMlu@p&8kj|ZTd`IlFg%tzI)1=__ES4 zz2~|Dh3XXYW1V+>*9T+1Mz&McsTOE?=^a8HjkTdRD`0+V_cGhPF^VTPH%Llmc09D> z56If+38rjKH7iAV_YS#(&+R)GSHa2 z9`)a$yKF_j-BzhzWmFKXj2~$eOtL<41}mqpn;E*NvrSoLZ&lA2PZt_!Y8fqR0HOs{ zeh#(B-C44m1Y;Pr55;9W3ScF_dR|eCopm3iv>mUSbWB#ti!jK|j|XfM{4X=dYsxI& zd-v%;a2`6$D0lE1RVx7(!Z%tKKZczY>y1FM4e-@67-C*s&9YT>B>00wY|s%siQ=KR z%@?=MSTxCDtb7C&yO7sQS4a#5iZ?xu;uB=K)UD?lleJ4FRC(tw5ij#dT3Lum#KMo1nNj5oj5uw+4!DZfQ+cnO53qk=| zCXtrch|lB*X8{lZG{rQ9Z`ljPv_a%MLrUTxESxJ7^gKR=i#v3wJX6J(V91XAOwVLX zy=m*yufD>=f|C);L3IcD?aepOyFIF~61-ftk?iS(ydDjD6v!!0%UybQ_lu_IPLqLx zWkmIuHXkeT-*p-_t@BB@YRaF$%0%UIkQ*Qt{GG672N$=So@N*^(O^a7`AJ5B3_Ll_VkcrsgcrtkIQf+GleFke zT5=&7n!r#QZHaWLtEF4$q-QgHOs!s^D(B%*vd-#t=~O$B`Z+8KH^`+(-A>~jBCk;m@EJ-46;BC$ZB59*v~8)NefQoABsC5 zaW-JEA)JM^yJVngni+Q_WXCc)pY>Q)Y1HI6QEmM@kL&~PBIPGPQP@DDqpk;|$L`DF zXN1ARiZKjU-9C#GMJvhoJ|?5}LU0y4cY-)7I_1X}TYK%L>ac?(W#m9-*)b+fDdR_m zKwi!EMySZ_VQGfSaY*LSRoE1bBtc%)$%au~_L~advmf5Paum-rWie!Jiz{+=9ao$q zM9lNE%8=kAQ98Jc6fLawaqv|K6srTm@x#62?Rf70vsY1OUm7Xz7PocJs%|(fcXK@2 zkj8SiU|DGFF^Au$>i4Uk*d=v7tho7dn*Wh;uZ&*z8IsPvJ#k9$(M$Tj|Erxf)s7H4yE^J;(ldt8h@}}o-q==zVRDf`Zaaw=2|)a%x^{VQm3Z58j7D7T**NcQFh&$i{fY4 zds#YCsTm3Q)2V3rq2lL{>}C)41tG@XsslZ&qcUa(N;yZ$R3;Bqe`k{3;f?I|c3!iKH;CGUGMx-kPqg+BZMlvA0@PYU?8l*I zvDvKuQtY=NLXKEcL8er~$k^AZ1zhluk|SYV-=iSvB=^oG_kG+%J@BZyJSsJ5pL!&n zeW}yA^W%_{A=;s(7Enb;7?9dZ9}+Uul`~TlZ930AtnR|*I?6#$eQ}HzpaeOVMWNk( z#RdUlVAsm{bWKpbZhtc4*E|HA8dCt{x^YKfYn$ZH_)Jwu{Za-o*eHrAV|hx9Vxo+nWNb~W?4OEAlqs&EpiGnwZr#0 za(->~QrHR96+_cr;c`}KXDMRnLTsh$V7U}G>NSJ)#Y8_~%oM}Qf2Moon*Nb$SfFeA2*E~0n z(5lzAcu$S1MbGM`Oo``9L0P~H%Fm?Uh%t~Bc@+aSwY^8L6rj zB!l#|W;s5*cz(%!`fc@M12Pplb>He`zRM2;SgOfmA2;B|6#(!PZlB~GQR zG~(#9S~4SuLB-9V)Jb})@c6xAwzTENj%uC6wbrGkBq`tgZH1Li5E>CrQUPg{z%pe~ zXbOiBuDVeth9Yg<_8RPD?l1vCY{j9zWixT>0xuv53Ylz` zN!n;xQVx;QdO=68floA~aY14?w*5DV^tny9S4u>U=3L?|J3GJ`x-edrcnwZDd2sEs z7NNLnl`)fgHB|!zoey()s5yYLLwgQ6Y9YmU*y9h3dXUW|`^UV85ZuR$e|Y1wP;ZW_ z!l!@^svLFiTBxR)073Z_L(MG`Dmxv)#k_T5>t*T7fi49oB3qp(n>&ah4Q8r9ur?bcoqU~Rb0|QUZe!cF?c~I^ zZQD*xY}>YN+qP}n&YY>a_tQ+h{TueK>RR2;dYr>hK@h962Yp+=3b;wctIz}T;LT^y z{En#fnY-P?0#H>eNovOybQqLSTgyA}UzPciavv0q^)U$MkOkL?<7@T$&4KJx3qXyX z*p+ptr~IGd%fwd5d7rS^|M{JbzA9fhyQ%&kL)>Ay-WD`4?!%!NKc-BrpE-OdE zY(;(W^NVQBs^nG&=5E*##6AgkTGBiN^u~7{zjpP0Cp0Xbw`^>l793H#?l~XNOH`U( z6!8zlK9^(I_t4phnZj~~{pF@N64gsAq6V_({Cr@#E0 z5o@)!KacF zirn`sBGMF&%G$_glxt|1-0ljUXIQTZrVs2PHetaL&_ewdkdVI1lHHJAudKjZP#VCZ z)>1o+D3weC1*S-WF<$TXG|9;J4H2PXKU9rXH>~#e*piaL+D%H}oaqSV?3V~tLYWJA zxP0da()g$8Q^B+n1TnRwOv}#E#=d>8-CYc{3-!APkz4gRmYOI^X{GekFwPmPwsyP@ z)Cli8Te{fY)G5Rv6tD?;7DCS#ab^^D!Hv0XgN)&b9>R(gYze* zn{Jl(GCLOa8n&SX;tHNAULnX|@@{t49g4e)u8(s;3Ay1srgT8z`Y;teMTP=2DVQEs zovAxFyvvp{QYa=zym9&@Y!Z0tZ}0*Gs|dqk{w{=tZ}gmH1&CBpl~9a&tO~k?r8i{s zT;=iva<*)Ro$)xE@tS7)4fV$$^fBN!f^q*x7!J&3F4sl(rHRq$<(t&cuhuqhA z9+z1gwA!d3hmHX~ykDwO9Ls=3Gu|AT-31Grpq#4XkT!|;imq%ycF53PSW&Y%TQ_;Iw;gn8RH)rb}aime+ z+O#L4Wsdrr>+Z^Cn~ScRZFh z(`-PTnr9zRnz7m00j9R zJavqb|6|8?gS`;m!ey|klljgEV&(z)eKWTf5nmaw=vmIE7RIT@OP_`-NTdwBse%(7@k%B{Mc=DPl~GpW1p*?={TvYtzL?Z{#%k>(2Hw~$z_zYp zN|tNldAn{qZQQi^ZxZB`Z*tDhdjvzw%l##n(LKxTGe*8p##zxsax@D-9XFIlaC+yp z0Czj^%3|)w(~$nqnZ!k0LO=f3#Xzl#yl?QRZsCe%YK~HE)2Emn{5(b(8DVpBf&7-$ zNxvUC*_A6Wut}bQ9YRPeH||BcJv%of1aMHc&9P7fj)z54fSoU{q|P#MpS7F)e}f=#tLYjKwQk`U$>0!)J;)kaV;*4l1na7Rbi$c9o-MwYkc2{~+gT%q#?>#2bkl zXo<3!Jm!qgKTp-+0VF#}DY>-@gZN8#r-Da{dZGg_Iomi4=@?izDiG5XRjzrRepVT0 zon3BO8o-&ew$I=F@Aufz&G9%z&2}6<^v;fyTgCQDb?Ik>8Cv4wO`d69gXlH0f&&&T znj__&{SGj%At8{elO^u$dDUQq!)HrVtroyE4$B_{H zU*Ld^lr3Hi*vK?I|MWnT^h5tlIsJ1n3kCu~0*#k5mt3KCJyy}k<#akH$xBZ^F#_*o zZPM-qDsXH23{y0p;rw#qhj&2>tN5TIMWcYS3b8w10{Y37Vvog}et8eFbH~rBBa+Ia z+39;{9ehUK%zv=!TqmOMCS#3C+J*V~caE~|;K|J!(|qGp6j!0Y_4elY+5k&=t#fvyf`>6QsOo+5DS}W-$8>sQtZ3& zMNHWhsP`UiPlRRmOn~DHr%Yr~MIvrj#zJIO4jweu*LXiN`OBscswC?`0(^khL>Q2_ z>+iGeh|{`QWhLo^phcu1jHkMf$xm*oF(MU=yl~MP*T193FkbBJ@P$mD&Hz10(+&7V zid0x=>btj01UxjfU0E1|Q5$mjJfHOEt;x09m${cCV}Q__NkrgM!k~>+tll&PVw#zI z=G!2)gcmUZUH3@?Snd_X70${S+Ts?|9ue59?&SW}1j!-3taEsR3DE?Zk@boTUHO6E ze!b`YQTiJJtUQ}*S?eQ9ShG=SO=8bp^Un1eu|YKpvYc#mmz6_D;+5_=hDmX3RIrpF z6>@7nf9Ks2&+k@n_zE1MIaY)_J`er+#?83cB2Eo<*E^^7>e5^S6j@U_?W&DT_9in$ zMU$2*YO~9=K58HCUbQ^ko5e&c>_018{^jkhqpE-;XIA8s%PH>iCkgeTn|1P=<|XUF zuo9vM0BlQtA;&g|{9f1Ospd~TXnky=ZRKcKRRE>exy&Az&>!l)nNPeA_a*@UM&u5M zPuakACP71KzB5WaABeh5)#WS#sVHN?o`NDTUyq-cYX(u)hSr(6&GNa)Y4d}RbxhPV zxgY^3t(wScr{*OziQf;K6B;B!z^m+{>Xs7*q4G;iRb z4LyFBEe8WevZ1V`JtK1@ni%cPtX_hs07pQD^R475oy+&)p}tr9-1sEW_imYYuf`a? zyI%6S*#HKG%v?pj_g$xYNi3r<@-oKS;pI~%Jon}XEf$&D;E-#)i0V{2!(*UKV%B%O z&gChLvo%$kqKjjU|I)_#43{i66%oBl29pAW{vk6HHuY9o@91Q$d*D;;7=1>OuPD`_ zsz{QEDpSCG#4f}zEh&q zqxTCS<4?Dp_qP@(Wpk`M5+3z8a@}(ML#QGUn-3j|haL`|!=$VRV}h#P5-@p~%Y|g> z+Hw_>d^elOPE~od96`9+@0Ubb9C1!-ClAU>sF)=KJrH3pCW`8GT592ID~-x{o`Ak z^lu$z#_D4OP1gNih?o)UTwBGo|4ghdyJtx$>pbD%sRR7eg;fL0ItM z8Z`Y0edif(@LH<({9G3P(mq{a)?a8jzHNq>DbWyQuH?iJzSe5S!tz`t@n#Ew4?vKm z5t6i8u2})`5`vZK4q+2%w266l;@gqIYmgQ{0xDjKVb_LRQZ*=nm7LEZCXj`rKq!JU zZ=V?91bLJ>5SKr?n&L+6uY;Vp`Y%5z=SxcF4v{sA{dtt92+U*S|V%6K9G^Kr+i0{^ij8 z0VLv@Bu@1Lj;i71xbZsC0=I3<-JuY+PDXSmPM^AG4#jV6%1I)oDzw0dKAH;2ApwF< z+6m739G*^%RVEDSyauwKIbOW7k{an3zqc?gnIyZxe<$CrZXLef#?&Fi_`S@{(bpd$ zde3_NhBLpRI%&m+FA+}&>7H~D(Zq&V`^r1Po0~V11Fb9kgJu2 zoA)-h`0~uY&U%`5s=Z9k-9LSW^+!mIowa0H{pmusIj2)EQ|5nIBt}&5!;hY-GBf(j z!rfQsIcHQV#O0$5}HE9iCwTBA7a&Eq!e$2hXbI;0Z%Ghn(Ro)qPw989k7%w{Ek9=77Vz0PPN z&Y{3p!*|FXA);kICWMSEy_?@SQyI@5sIz&tC!B=OgeMQEow*pwenHP)(m(jf!{0vX zryh0}(J%&dt@jo2a?v_88?I#(eVAGCTcB%dL-_qbqE}u{&Z;qNaGz#08V}Mr76s{4 z{`5--oKA4oe6^1Mo4}P_K12f(e*c1A$q#^0X5Wo2nYiNL-M0~1M#&Vh1pyn>@pcNF zMgw9LQy(GT{;wZBeWZ3ZjT4v!_v+pwn3KI~Y@TqR#?L4sM#is93Cu=gcW- z*@_cH(Ewq()0y(DSy-$ASLi@4MYRyc8V#Aq!LNhzg~5+{)ik04_#+mN-&CKH>J~h-iB= zDdUin2G)2k#g3O8U`rVMUyPGIO;<0@T-ey_ZAbi(iM4DUng+SnxzZC$*231&J$|F) zA3M$gaxHS;13AH3jRuQ?kX6R@6m9$AHHpY@XpnXRX3$eO@H%R_E zfQ08#!Ld9K^xLG?Vhg(`rhW&(ho~A`vUwl|cgvB?tvG8Rt5i&zUni`idN2J;3Tt?T&e|i?_2?mFJ&`89q#9uFABs$b3- z4I)!1h!n)^i#@VZ$ejWZSJAPUmOhx?`dIkMlUIj}5$=Wg~C^O@SHIid{1CZQzLY*43hnr$&811%e-z@QnfLOLJ5Td2&~8;6{&t7NnEG)!mHI z)XGs;8v$?9;q{MV&R}rgGhZ&Vc(K0`o(p1sAnP*-9CJXgG!M|bOpC}&n04y)hS525 z*9vBCZ@J54?!53GGX*MzFImfR__MQbjV{UTn7>GT7vY0eS;`8lE&y=iJU9LGGF7R( z?ShEbk?K-*Gr4LxJEV>jFYO4^R5$2)_F=cYhd^37WDKeY8{^Z9+_umd2E^(fho5?x z2n?l_4;T?DW=^s*7CDls)W*{2p)REOj19E4dofBa+#~HC0K#RqLrw?1P(X* z@l0NO43q*cG)Vh9R?zn6$OsXx`LOR3QE@M_ z%AEQ(?1&`ZMhcH;>^Z8UCROG!uF`Qv1N1k&8@dn$i!%r?Dva_NK6lm$r$)-joQTjs z5@mWt^tU)kqRb-;PDK(GP%Z+H9bBJet!kY=0AUtew7E+)QcyXauY3y!tSSP#mIq^| z3A8nlHwzAc!Pc!fk?nlB4AG>%Lj;0N3I~`JSj#vm!`%aCGFl}*FMW?vo1E@q8W(}~ zn2nK@jl}|wl{K&4i@x8=)G87tMpRE$qr+V2-61Oj27+AtyG_TguKjc{b|9bxCY$_^ zQY@gm_2=j$wbb$2)Vw+npIlhh@a9&O+3>rlWc{9)N&#Z@G;U2Z01HpTVBN>+HvueD4`(9O{1tE6wb3;C zlNjCVcHPoK#N22Qed=oevYt02+5}ZCz5r9b@c33MC^I2vWNpSv`YwZi1I^u1*HK(@ zqKK{_dd8hm!NbJFe1h{+jf%iytWxt1vAW3? zi3r#O)~hv5dN^&59{P}&IRWUrzN#j4-7@{9=JwBB&FSTGwZ${C#;5wxWR{vB$dm2>-R zF%8KTo2nd|AOT}IhkQXWT}h_kfq5fwa8WUm#=%P zNe(Wt`G@*@ma|WAgJgP*0Sl`6mnCQY{!j&Eh8~{oP6{7282EbrbYi%`YNQ_+k9?8j zFOQtNo7QR#_H?2?+u@gj%r&lY@NZA_+Ybak;1{-mN~mr(+2hIJmnHUf5p%4QB*X^8 zHX;hj>PE1^LLE=O$$^OND%m401+s4w zUI^Wpz@?v+bOhS!Os3!Z@gayMR)cXf!Su)F6AZiRpttPBOQteYU%|d@y0&7DY7wrv znDbYs8tz?>dZaNsc=X*d2yYm56k4_@A}fFykQ*4MFcoZBfnr-W10-tdT2+p2FX9vtOI5o3{wzG?_CO*<93pt}*oY8c`j2=Tn*gJCNVtvPIw&A%H z0@j7BgqtQy>CZ(f{2D;mtVnuMs_{z}AYaF*R+y-TKrY5ir0iK_qpM}do~hYov_%_H z358f_Mm{{mk=oce`$k7CW11FX@Rl4vSD83^9W9WMgl8 zdZv8!5@2jgZl{J;LzoN(GwB|kzzVx=$Wsd4qpUpDo#4IP?j=eRM8b^fkSeV|{ub&x z>b^H>!f=%nj-!~HIvRcwK}-g|+;3$pEGx3tmGkdG{-9)T&E3}!kPCGrayg(Y$uO9F zkp|{xuF(Fe2z%LN)$AJ|M-s+jm_(W*hLKkg0eFs+NmXmk%%?B9d3}&y#+J2Y(iBly z9x;00VX^CS)JC%BxDncr(z^IZ2eOyx$+IW%l8}WK->zzwLojvv7#hE0GJuu|@+*L^ zKcMmcljvwSX0o==>%fA z;Rf1rc@Eij-Hh5_+$IE1R!D&k=TwZCHT=m*WEuevame!zsn@jTnH-yo*dI|p@ zP4U(rSf&uZfj7!OqKOySxl)<~Kp}j>I!m5;=kK3^`9zk_afOhR){Ae+MJ&ST%z={ZG03xRDsz9(LNSL?fh9^9S z=Xau-TG^eL6PsfJwqd&>gRWl(3K=+wWQKzk-7Zmbrc%CGiPiD|tg(#Lsr4pMHm++j zGzup7@-w}s5GM>b?&@}C8@phKNF$^)uAuer3_@@q@TF|-;}CbwHuaxVG#vpQ{|ds{ zw@EP1SBoG%5Yhk2OWG?LQqE4e}202_1AxO0Oh&6rC5QUS3t6r4Jv=-keS7H z6vT5ZoW8@CGBq$p2JW)aSQ)PHn$^yvHQ&BU^MO4W9P+Gw7%~F%bzVY2Z_~y}7yx=1 zFGyeUl%ax(50xY!A}1YJ(~$vYF@+260^!_s8*Ga;mXBi*2lbT^px^X`ci^~rZ1!|% zvtT6Rnl2_&QMJ8r~(S`iRp1dMzEb*-kOc ze}>B3N&paFH%diAp7xYH=vsPi2@?1#<71{3aJM%!Iv*z3ZAF#|ig+93&w!T4rIRz>|h3^N!OOi4l*E) z+VwX>xz}mmwsZ&Gx;t!)ogL%^VhF<|`9rh)QWMs7$f#ZaHc_z($ali$YUm*4)gkfc zLL}R9#1CnzrT@_N!bj2(7q#a-2#;}i%fLY9z^Iz2H{dr=N*tLoY~Z2SK6sE8kV>sc z?)&rfw+$(R;U?3{#Pf`3rO<}$FiEU;4|We>7tqcIb0Ue&z((C+tb+^PbtIobMSD6KeFRnfh2U?a z9WEEsocPkXa{!MGva9X_mW$YEk0FeAfSHwPFBrw@IVL0r9Nob#g)v^@d!RY!wVI(f zGQ-$DB?c4s!TUCsYan0wET;1AJaMPO=T?ph6>$T=>NpIW38%~jmn-{A?ER~BGDI^* zq{;F%by6fvj0IV71VbOrHkrnp7+$gn<*dR%eDdkCx9O0?rBvQ`&Wsn{Lti&pT9a7= zEiq}F?lm$&$a`JRUSAZ_r+45&-e>a^8sKAYoaHb`Q*r}qtG0}E zx3xgcW)hj)yOp@fOTDW=77~nFKt_S&#NLC<6=Bs9t2AB2pPskba0(Iab6&tJC6skN zD;i(VuWL)|(X8z=_1h;m>5>f}IrX1So+W!@0Ed;6}W?DWH@RNkT9$Dph}h04ff{>f*Pcc_=EJ`MWd} z0k55g{KTkrKJrhXd(z0+k`Ltc#(k0u55J1cDP?5fn0te16t_scR6MmYGP8aRZR5_K zsEdM+rXtbGi19u0)Fq_Ws|hfwS|IaMAm`wn8>b=u$=J4kVA1<_xX;r?OZ}dD3)-o? zpe64!?>p){?eiU23W%B8hqP66Tw-tTN@nU;0I9tw2Q^HqH* z=xC4(M4pK+G3_OiAXkGRZMzGQ5uRd0FL_I)B1nvGx*)Szgn4Ks$_s2M(gM;IvilRs z&3l^3QH!Fj>JWn1<3SOzQ}YP>#G(5$?v)4*eR>`&-YdQ%*@TR;MRPzd{|xi|^jp%b zYIa7V#Y6C17c6*i|MWdyK~J8&9m$A9ab~XL%kwoE)?oC_UFc@r1i9IX188CDzaj$Z-+>1x;WM zpOR$EUGnY}4|cX%+KfoXoMxWbBy=Al{UYL^7O9ZNthmT2UmP-Yq5r;N-o3B|6i`;i zgx+B`Ti4jkBYjkJ-B?*1H^3kMcF*ce9Ok2HMhNEvt1;OfC5eBsiTBdU72oM`=1trs zq@WD06wN=`9gG3Jagx*+>?JD4;3GCI?d@OpI(oA?1LJc&#^?pLcn#n#429x0ionS} zagSE{Q9R$UzNw>ttmH^hA?)h?0pk zLu84b*)EL7drqR2rn)FKxwG~wBLbozKS|Hv(^5W)F=#7SP~3qpsZYJ@gB#y0BE=(* z#Qpew*58ZH=z|6P(+>RLkQ9}%0H+h2wd+TPa|_SW$O6j=hN#g zwa(kLW9h=Ri3nz~&~K9JNgBQExksN*ar_$|?5Dm4D@5Eg=T33X&c}zu^RA8h^*u zAE^R$*2>R1^Z|YXR6xR4b0S1Pw2=ETUW!i$Xdu?xa#oL7pg^}$<O;S0* z)`@;HsDM*Y+0ZHy5x$ta^4O_J{Z9iKb>3o2{E%YAkEm>j{Ap%PUM;`OB@E^-5zCU~lMI(?; zEjptgr`m783_DY9h`8Y!_pvLw3Uf}fm3<8^8LN<;%hIF9_F=&DZHXtl_U$7CNw!oX zOKI1pE(g$>El-^CojzH?w(}j4_c(D=ZzFp%fcRjq;1KBAK|7o61f?InS~PyTfcJxM z+N6s?{Y0B13SHS%{y4mpx$0TNf&tYcp^O_st)-45EWGn4`EV3m{_C;@M&is&G6+pN zOre@|7m7Ti;m$V86!xeR%ek%c7e{7jf>P*5#@FE=1>7r#y5P%6?ecOme@h61cw17y za{`2Z-(|~JVw|~J!q-=e+?V4LHV7Mk>oZOg66kY1&3dNd=CYKr;((qrH_1{Ex>mf2 zrMAP%0)HC8TC(iIjK_rB_Rk8kV>1B7dxM99hlmz}1^vaRM&rxXEjRij0j zqmL!ox6dgh*1MvZ44zL;i}0a}e;{{x#q0x1lS%ttt6h$RA0kzHdk){8(BYT)Z3EXS zf{WH;op`Cf;J+MN*-3d|G%fEM=&pBM9FSNJ&e(WPUIDdPWigzR6^BsfC}OnaCVRr= zUGQ^rGR-$`lNBNI6RCPP;5F}sas6XJrjxga(%`v~uOBJcVC!9GX&_&b9ETZwhTX1E z?b|5J#%tTn7DDs1(xnU$s-WKbOb&?_9LntZ-?qu$-^P3GxHqOO@e%>iQWSM2!_f+G zfF2-#H#7hM_$`4PtR@;?m(Dw%vg0vDG2to)TVHgvadcJ9`31rvpxkDP7A z!_(`MY@2Inx@tvxN1HS^Y}0?UCi87y0u2a;VknO2=gWQ<^K^=k}U^Nc}{?D}%F? zkq7qGUQBHW)wRW0a1rIoo5t%R!S?qin9?J{;E%E*DeQV98?gL>A`u;z%F^XVg^wk) ziTVWD?h1{3h#t#iQi`6Ze2_!2GqYmRF*1V`tr2+bvD_GEFEnW0(S~5Jaube|Q}poN z`!|uRQ1%?9(t*Fy09+PN`t!%RGU35qLq(=lPJurIkf{UsgA`;;&rj5Pn%W;(Y6~4Q zXBZATV?@#bGu&~LCUigKNz`)nC|w!@3ZJ*hMYdoa{af%58ulppJ!sJ?l2h=3UoeP8Xreh0WR}5j1?et0zD0R zzz;F;An1*|!EC?$c5F+d;;G)CtAaHawYg%B1%pE3d_}kJLd829he_NS?aM|F-8`J4;C|9q(h2mo)o|EDiC z)r#d(FEv*(lIZQ6x^dY8sFH>Nw{lEdCh3*?t8a0U^?!~0|7k=0w+B=R|6vbY3IAse z0Ei&C0fDS`sr9Q{cy7p#cUZ*}m63qA=*7@?-COzT;NE{b`Z2f~z zCJKN-ZZUo2L!i$~!K11^=d&69(vcN7h56al6;>ZyR5rHX5RE38~X zs@$Xe*1)*uJRjp;?Kh{VhZ(B7|0xDRBfTKw2lT5sNy&=JVLg{n$C!;v3C8IA8Qa4& z5<;2J8PB!3g!}W)DM!N=Qi*K+!)EyEanFMLt7D&dd z-7G3}P*C<_d!fB&Qs5Ec|0M1Mr(zB5mjFVQQ}aFkaZW74gc(5YyiM^@ z1u_0d)9*XC=0}aaAsJU@$}1`!h4~>UFTQ05f$2yD1j5>dD!J_o&#$

R&lrM5 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 RvO|diQ94EEN)hK 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%0DS63^ewNQiOlAsfg5*SYX)L}E8DP;u_p#xJz zDJ~-={^tWWT=Lw1mQP^<@nnjb5vT3`c`Km;xbH@$xpHH5?$&LA9XUyov2AK-&t8@! z87mo;HKzlCjDSi{T3~Kci*)@HCf9OEPcxI26R3WodR4z89cm{-ClMJO#?UH>stZ%S z(%WIa%>0Y*TG8!5T2d;t&aWj%05C7V(9vXkwNS&YGX37UOKJCysD5h~8t@0GInzxf z)qK_r%oi>P`L=Cc5AI?N7^_t%y%xdsYg(Jn>P3r!4c$N ziP<^L7w{j%iWl0@Z^UxY7LObhXR@Cz#;V^XCk$Ip*Ky2u+c()9iYA3^MG=!v&O)(%L*!0t4?Unh1o;?1qRXZF?~P zyltk*wMABNdO=C>&9<;KpbUxrpOkqv4vCq^kBbEEF3>>S|HkD~ah(d{AqF+z+ zn~vdlaya2J5$Qta%U-^)?Q95Y)A^pmx#jBe?|~Zze=z&&O_&}{-O~%|Z^3xomu1E?A>t(V-9)nyTd zR6nV<35czlS)|lM5YAr0w{&QVm^ql8xuM)wt)E~ZymL06MDdFRmi0o7=Ei9d2Qr|z z^@)ua${c-nn@{YRHE(ElbMh>Lm^X6PTw59gzlIh}Z7{r1E1P^t*NtSXUtxpCLqdVd z1;#=rp=$ZMl8GaK2v$^26|T+_c_hGeqNZm8vkHzj3{2)E%f9#xTjAJ3JQt*Wac(9G zxj1Fuw=1?_z1i=rkH6da?XaK%Et5QgqgAC&)l@g`+Sh<(2G7$(6R@isr1^N@Me2F2 zE{Zud<{ww&LH$4|+P01IhPLUx#)y#rZjU2%(BiUZ>{oh~jaUjUE#=*U7jSo>0&C>H zTLk5_p6K@oJj_++_;4*Zh)aH`Kp#Pc81%lzO;k6siNA zyg8mXj{PC=Mos+qc(wY=n(g)8YHc=_=}6T~xc-2PQ4C(@eVa1X?;nBS2ZSAxrqY}W4+b#)uGUWgAR`~YL96&^{>jY2Fki1X zNGcPn|H_b2kpO9)A9JVL_@rEO&_E>OGqV&)G_(=)%QmhjXjWW8NVF|Dk>O^Zuygr2c=GJU` zs(NE^NO_heX&tj0(qep;v68UhS?oC^i$lG4=}-?U{FfE1=$r1~E7> z^3Y##n<7}TxGAYNV@PgZ!v?*5Y^EU?P_GdF#M2M5>0 z-m0)ca%jYmeDPjPtgO?w$6<>hY}-gq?~+y7w}xR*Nx|p$8EsD)<@~YXsXwZ(-N?we z^D*Zy>j>9_YGsvaS!SNrdK1q#u6*N_Hi4b;&zO3W_#pjUjtYvdTV#5&rK*Gl7!j6M z{>_GRugE&y*sQvQ!27rMLl2dkj1W%iH*;P_SL1!2?wX>C$m<3V2oRmpO_5_OYaoq7v_GI z0b=0Swl$0a+=_bCt}S8om_NAlEmc3Zo!60EqN{2i;a`%issJ`a zgvUGc+(j|UfuL-J5)K7*ZIU{s-F>E?+|!4o%u^C}s$b#hzK`2#^HcsxuCvDku2%qr z-fudj9t6&v7AI^O*d<=Fu|Vs}u;2R5x<)kFEqv*B`6I)a<>M`x7qE%1!QK2h@3UvD zpbsv*MVJbPLX2@-=NAC$HstKB;DruQFy4NkfWfcJo&?Kfe?3oMQZyu|0?Q*sg5CXt zysAAPevjy!Qc;zkfllyVSo)o%N)Be)>Ha-vPV&3m_u?5+J63;X(KUjg zC;;CePnAMT+dA)KmD}SxlvFAg?O4igK~0m-N+J~f=bE()`!QAT9W!7nj2LTEiYGzA zHq_GorvS5E3AdQ`$|F$b6Tq6!jS@v!&Tn6k2No9PVYwm9(tp?eSpKss&xY=?99!1= zjKxOXqw?Ow3i)H6-D&10XnY zfM|uWF06Oa>0VS`tFTx7EubfKsm!9|y_M%jHY3>Nv;kR+2&lE7860d5(dNyUC+aJT zpShY}t~jz`&27t@*}br+T zE3s?t{?ue|8Q_ZZt0+gsNcwmV(^wbUF{BukUg1Zc*`&vuDwNqmZ68AmFxrR{Zo~>NDyE3W9(z->>Q;

d!rYgT3;bn&e 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�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�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%0A` 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≪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ØxISLL%C z7%XsYgZWApq0_)BS1pecm(=UYL1_E=x*w7)0bTkGHhfwdU=N7yk+ee z_b8IWd9z{VzXrF*kN=zEY&O@jG zg_GvW=+um;W@h`~L_|aa#Jgs6vxN%AF@5B%OL8jpo_QEbiFsBh!8x}kpPgx)eGCyVF?7=?!M*flr?i-n0C7&o zb>Z>_Q{OZo;Ycmg{rOYi1TOtd+#ISfDCISJP$runj!EKuO8DT|d0<)PO$ZL5uJa_=a3z z4}qU`&X6#Tz{Lny@9Go8Mhld7060;jLetbAeg@xCa$;a7W~LS$f27FE0K4HT==SbY ziG}C16nM{s@1G#$W{xHQRmv`>&qR*Oi2i5N^PhIimQJ{JpDIjl=lO9(x1Dz`5X55`@=2iItcuE8xSQNbCvKX@{y2}(nXQ(K z%W0w)-_$DjkJxof9ahN`Q2~cr(A0cD#gl7IHW-x3wTzg|+<@yXG0CGli`W7GWsGYR zaB(rWToB<^2K4T<$&IrBQ|lb#LnjX^)*_$b;(lJyL0Wm+Jp)B_c~(wlYcD34yQVV0 z=RvdKGkj=k%T^tj<1t=ZxfC70Q!Ld6dWT|MTH*|Uco|Y;>>aHg7uQ34_v8JyEEQO5 zDU5B-6{0D_Frm8b!e5UP!qx~Gp6Qr3WWZl`C&hQW&H+}vn;wn18@G8b?F;r-Tg|;j zHuE^U$Q~k@Fc>B=55;Li1a8L6#jF7U01QyC;nLms6cOF)8?GloVR<{gT;ZB#Zu~z$ zmog;AP(h@N);_3fvZR7Fj^j7=5(>#AQcO=rlAwQWq-U6{_!+KK9oEzWY_|sLCd*}J7{XMqh5hrsUCVnC5Ee(T)Qq-GM(pRijYrXB z4Z-;0`w6_+{oFoZi&FCn1y*v~cop@8f>aa;M#|ecLq73tcryMFbc7Fyr ztqttaNq;N>!BOZ3sJSN~luaObw9Nb@0x;;mxz@1C0{fVoOX$wh?*8R~Rk)>}7gQ~p zWi2ovC&Q+{*Tl&#V=7rlSr4k7FH#WT393w-@_y~A>j(4XoteoG7FsGo`DEC5mJ@6N zunN((XaE%~3kQqheq~=HXL##^;9P4>iZ!lv8n;JBv#jgLXOZtTu+PMP^K$K<<;_pb zVE%!3^h9$%X->>XpfyA=Yrx1_*Y{$?*NgFR)`Jtd{H_TM=%0CA(gm=U-@necNgaFo z)~EC!jc{At0GBbSOZ?9GFCzB|p^C9;Y1e_E6AFaZ5_3C+O#1?&66sD(NJ%UN(n}HS z0<)`0baX$>AGY{)l%*^?GOci}dcy91S%Ay^@L!3UgB!OH9`rU5D!E8F9tRf13 z60X1-5%$B4vZBmwGzcvXXNu(a;A3YDIdq2>76)Mk7z@y05K7$z)sz`OBdG0UeKw=z zul?`Br})td@qGpoAn>xYhx?B6a=g2DNO&>h(ksDbff0>`$4^yJd@rYRt(x_a`o^@_ z%$?&(N!02Q8f#M5hUFG^#2`64U>##ymW@6lERF!-_#1!!m?A8RcER91){jtgo|!%4 zOO!q=0O4<$3ZE7L!b;{$5N8HxWg;IFk{?p%Vi?_*v!rbDt zH>153cibwtA$m4zd6_u zcNBVuRK~gy6eU)9I^K52Q^AS%0}W2pr9j^0i;UeIIl*xJDr2e>r=4EoI~Kefx5P{A zcPVaa9sk&JWBq(7+0Ie$g4B5sKI?%q9j+BPp!VZTMAH+JoZ#sGX9Y%OgGUIOYu-ut zmqR1$0E8DhGd@<4F=v^5$8y&8RkO}#-iOFEE#e1ek|jVycJ68*{WKPd-fvNkAD_l? zXAtCm8I_Lt8c~*6>Q$^e_Yg-fu-Y>oA!rc2v5=1TZ1;aCUW z{PZ~ji4io6Bv?0-=W*?cu*X1bw8`x#ZE@D#YV$jA;>eQ*L95GTXoO}g+R;uEPj@g} z=I)kx@1`XVHB|)QZ-f%JYR;Q=`AllO$doWT!S2+qXB*Gk1xf%$_XbEr)mYEPl7evD z6)vhPz6*Pp7i2YyS{CbQ(NFJ)5xM6q)vcnnUEuePn9k92i-iO}yvIAi8NO1V$6>VI zgW;x$qpovFtw$=-|1QFJcI-g(u-hWEh(hmD%dvb!y~P~&VLy7*v&s^3(3?gOWDRyd za%{!dg?s!S5LL?fTB_X%m;rQZVJ12AN+{4gx_Izoz%{VO8a?+ITa`Zlr)Y|B0tchd zU@QxRh$zb3p%O}*wF8JE`?+wjOsEd(IBPB1K7Xf#=rY&p{YhYv$+t7xasj%S&bU8SY&JrhAO)Ex`Mc@3 zMoJwG-MPX0CsBw>9y9s6MN!nH_BGkEtqQrkdF$!40pW-_#)j6Z>2M)@z?tklQbrsV z9XEo7W`&^@ALK7rwyq&g+5|ZkSAJ$dHdv+WnC5P5Sg~mQaeqj_p@{gWWyGB)pEGgQRKH38#v~<=$zaK$T?r*9hf@Nl;@2f1F;Yd=D+y zvn%&P01@+?B4D|Ji!~#Rp&wr3FoTL%)Ll`Ytq(A;yt9u|XC_^`#?BLQc0v!L_o&OM_j*LDTqTrdvP zF$%td3vADI8r)g8O)QJz*K^Eb@pSvUd^nms4Yt*`@u@dccz?2JfPW9cfdlN577w*{ z2TsCCNQ-cB!+s92irgM^OIs(CEeV>1=_kLkzBUM@{#5-m50@iRe7OK|C1Sx!1FYd& zE^SV3;`P0{`CY<12DZM28&bzIq2bo<$5j2SNWxDW7v(e%;QI>ji$g=kd1Qr`>I8%y zLsaR`)t(k*ULk>AB?@FfGwB@J6xs4o`QzYf%+}?v_aW&c7P-(Uiz3kWd{JMNTs6s- zhL5;3-$I50<+S;z#2Q1H!gBalfrIP&N$OLfP_gYIQx>Tf6D++x+2NZXAW%f>3tU8J z-XLmVaL-@QW+!iGbdz-8vSIRA0GkxwdoWODo-4%&gKoKU375=cD!tl1kphqOvX`4e zM69&`X&6g21w)NO|q< z@eoA1d6u2tfSvH1CQOWZfSLDku&9^IP(oH1<ZL{IX&2xiH4)HZ| zCk+OUPITdtf{K%o??~X`WQXT~dzlN6rD$72+SnZd9?n>Y@gv3t)Nb8XKtUF=6^|gj z#3NgBu_$vm(tWyBI}`TdO`)%qLlN}liRS#mSajpZVcc-4UuJzg^%G$q~`W@ ze{@C{9VYw5gqK_1e{eP>Ma&8#lh(zsoe(~zZTp8&g7lX9&2K{(JgH}**O-1dDY$sk zK0Lzxce*Zk;`p`}Oxh<7+=^L$HD+C!q$z>9C5Oe}HMexujico}oz@*x2c_bp79+=k zyCnMeJnzS7F^4au{@Nm*IqZd6R_IO`5gP3UZ^$h%?MJR5)mdBf4`Z^1nT!+?=~qm+ zXC(%&JrzkgE`&M65JBPU6f-#RrP)+CwVL~D^1NpnSa5#;N2SYp7tKM5r^Edyh{R~r zc!62(V-yqhD9~XJgmc7(gcxy(%``m=44BWy*k_S~I%3$vPp>`z{J4d*fXy8iWHCV$ zwsSm@waJy)#{5h){`F(g{+(m97RA`@8}cMr?O|!vvF)ug`7p;+%kuBgpi|Et%}w(` zJQ6$E+cfsI?K>?+C0~!=8PSAsx5X_UpjV%Qet8+{f8Oj z9g!g`PiV`4y<~#q7*fh#GV_5N+2=2MWO5i%0DqVGcaN;F_Eyy$ME|t`93_|YUIw~9 z3Jp;c=^BwACwz)f00#1sPJBly9*IQZvLshPbXZ3d*s3cwbxo_=TzazsBJ5NrNDC6w zZ08uIEh<%bM(vmV-FUY?xAgA=HGF~oAmu@lMa59NNpo{5ZYWMvhFt%M*8j3Nasb8U z5+|^1O6di0H0V9RDInvMBDb$6nbGOt2$M;D|H=1(WFNj!E4xQInbf`8LkUg+2~%p z?`ce>3!qZqA+WsODfiMHalQ?~{*JBwL1Q-}G*yOY8#>1?M^wyEjF!d0!N*I*^eozj z%$a{jRlFm=0oIK=kcWj5Md=Gh;V?U$cWO@t+0LaADJOWYUTT-aU zX=Z={f!8V%40>%dw-uu7jr71LV-TnWT7m;_m^4oXly#HFx&G6WePmw!;3e_lHJK8Z ziweI3a9rdj4T)18ah191u2lp(f^D-Ae*6+C#1s6*#-ZUr9f7VOIk6i|-R}FYRYF?t z@jDe~ruU1V_wAWo82oDH1U6a(1g0k$Rif)D$C07j(%~Hk1O-1E~R>87J=u z;7a9q-!U)?r=X|++Z=e2fcmOpwsE=RH*(d02DTZIqxds=XUuP=< zpn!z1M#~g`y($d;w=Zv@a8Nm&i)%uxW;njuve_<`AJ@Qg#~4g(#`x7x1inLA>2t)e2R(+z7wo-Lh>QJGYKOEoosTJuRiKX>o#{yt z$aMD!1uUw>l}_oEU6xSwg44g<%%PAKKIS?`Ucw-qf?Wie#P8M}lSV@!L x3(I8 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

~2@nuGZl9j6`}*ExHHlss{(E<&Il;S$(>uLR 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�|^UMWWcXSRn<$X!~GG0 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

?a|TT&L8a7*VDzCCuJ*hG8AXk;g($XHF44$0 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

JvHIY<#1UX1JtP?ZLrCk42 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

EoV#+NJp=W~ zBzkr`(!HZYfchwt&o>P`;I%p^7~uzUzBm|RK}Lny;252GEo=shUbsywpsYM|z>2tn zEc9{IOv?JwF)M$L@Wt)Vik`(H9c6$+5~b2W#FIQixUzuRXr&l;blAF4M>o z^YE1QmZSOmN92sTK9-;#LI}j4EMwT5i$t!8TaG>GB}yKP3fb~OWU(=7U2bSIW$~2$ z_I{ne)BU(=Ptu@f)>=Fc?z+k79J@7_RWgcsx-b znQZo8`&KabVu&M1gNr7U6aD5hwrw3$2luQT{%FrqvN(sEkyPw-S|JHENSiKl zitEvuoSi&#vDA?_!;%;vvw2dVPjkt8r+o6Tg`#o$K`)7yFYxVsFzmAmQsKxT zW9qA6t1W}d`I*VXy!D087@eN{|I*Zv$vCDr)_7qkV-s03Skg&`33xcp=&)k>D~;?% zHjzyML=@PT!yveon@eOdpbC|M=`QwA%t>^yC?x_Q^jg-aU8U-=F_kcT5-f-iPk!_J zeG#7510%$B=jm4@u`DpLpU$hdPA(fkGh~jbG#^#Af2xNAA&DDbzZcbbAECV(p_{ zHvby#g0X?w5FCkzAul+f|$T`b}>pL+t zª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�pSj`)t>a4xq$) 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

<&HI7i=8+Pb=DrCR zf;awiP??p za@O2065P8*#jz4)Nv9^*K=m&~brgGe)#^smFe2Wb1bDoZf|fb3Ph-}18vRd0hag){xtyeq3| zRnl*snH}CYS+G;mC9pVQN)0(b`JZyZwBrxrnc?csX)?h-(9C$V)vv|*|C*|kS&ydt zk&76p(Y;R|(!wjZAm2Kksyn1}OmyiFx~N;-A+0X(*2^F@=JffGikN1)6Y34+K5@vd zBe&(kkW%_3dRQ}#Myp72mK{?Gtf$XNaxbD+i~dQNo{m#u>u-1~^8fVksgJ?;__Ei| z(U)IcdmO^=J9C7qk`;X(t=N?gSax4R_qC|;u2^*mc&U?LJ`LPFnPMd0O5-#51ht>w z)(BH@XZLd73TowiY=$$@tZ5+??7P}1JEO19rLM2rpEimuMCo0aJ*OU}y?gV6Do#sY zP(=TH1~tQ(p*Qg@&Y%-n(0A3bZzRY$1%r`e@)i9$FhFe1k`1kG++DHbCHcb%nd0?y z;m^75WfkM05T|9xB*Zz5e0z47WQxrZPIrxH+Y%kuEFPp-83nL(;Z4}}w1>>dTqhiW zw-`#JnHU+g)_nj1$dp4#YES^3ewbjpD_gkAt9J0zgI2e&Xf7?;d_!*CB&CGLeu-hf~^24C+x=~-hQq@VWw3Zd78~Fbh%iKm=`#REsZE6Alg^&Z- zdEN4o8dQr$4QdR+M>yb#S}qr8ZwQP_hLa(oYu*uJn4qW=>9%B==w7pS!H zeCvMNUGe81FFC)#c6@SRSMWfgD(*=6L=nDvg!JyhfF9o1S_CAFfek0h+f;JxDHf~< z=<>|HI%1&b-E)zVEaVg|lywvdw8RP4%A~7o&mOlRKXAM6nZ()o-^rwl^RUy(XwFRC z1jm+rRwu6Cx4Ulo4tL**k5Js7arfrwI5$vBKigw;FY@Qk)2R#w9oi|^t&jmtPO3(@ zz3^2$oNG*sxrirkAVpwwf$8rr?8VYqlqc?i+><(WG2%ektlV^u$RBQq@?ea>3dv%L z98h}h!PNw3BwVFzHa8`l;B#)KImEjcM0ySJ^jD`cW

kc*qk~dJC2CE(23CnkK#6 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 T<*g?S-uiAmQ#)MHUq@@2+4_^?mNc; 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∈2ar&t~WY6^mEy<&hN;8EdO$Hvv;gUu_f_N*k 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ȗg>Vn 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

fN5Tk1ulu->AUc&iAa353i9E4w88a_(8zb-kUe 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

&XudDW5lgr| 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 z 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

i#sM548N1-}H=?-g+QgGR{J;2d>J;Nb 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%0AI`}b%1*T zD6<+TQsTJ?<`L0gIFf*vIJoq1aq+;#fnV zP3+(*Pb%$m%Z#yVpfNV+4~5S7$roGQ;Hvrvv3;F~b(x{ZmRO>foGSpKwFz{l==o1O zLz^G}J|22s!@z5}{#|Sv&J_VT6DkFE+6%ub+*J5zB1eLa3iNBtbkr78a6CAD2unf! zz`-NsUma5MmDL4)DTe~**o2OhrE;lEi(oW*P`K`FC%A_~wOW3&k{jsvBs8dN*vJ@|+!VD+R$vGn)NZ~wdYzN&>c8Yr z8}=EZ%zAW{z!1M=*S}RM8vnG83O^f72YwpK1puwF?gwmB?6tTnKJr?tP>oX1ZTILY zUOm347f~0}u*no(VPH&zNE*yWdGq$ahwNmdqlbuMK+@_Lr84p66c_x~-@X_DcBn&( z-wNJ*FjW5YtY=ba{!D=UW58C_)Z&w?9B*hN#$Yd<*F6p{qptoZFTMr!-})G*#3Q+| zHqn%7qB;rCNRl&jf%v z{z%J=*)EZjaeHweBW&q1JldERkpJ*)sn8AtyC-bT7fo8I>iXG7gM8!&xdJZ?s)|%= zoip6dWgZ?ATx2b~f%%lciHvUCp_`DE*)G*uU;!&FRmrO>z_~Xsg`22S8fd^CsO4G4 zy$g&6Kb&SbrJe0>R!WEF(Bw=#DS&q3fwqrEb20g`O6xWK9_+9u(D`b%UhZ`u(z=N8 zM|iU!%Ner0-khiT#n5+3g1I4m7cRT@><7J?YJnzb$?N&zpO&*So%Yo3-Qz0$3rHzz zn@2jj%KvPhYc7@2ICsnKD-(y>E{x;F=JG-n{y;P&@^hj1k&4}(=mKO-wK`?6nx040 zgPkpuv(8iLw)I_zJM6U6k4(VYVBUkKgz@cV6;I9+iLj=y*&!_Gqfy5PAwMseblX+t z$qoh}h1n(wGrQszDrs=-Q_mG1xh=aw><#vMtIz9@#P0aCdm>4wK{U!}OOgQ8m9|I+ zzKXagSWyH1uQJ!Kj|5<(U0jd%?x;aWRZwra`tNS8r1ULp$X+Vt0HloDmn^9eT{5uO zxf7tyr-!ZMA<(k;0iAqi%8W=)0bVb?B0Hw8==H-fRICa}_FRF9pi11leL@C1+@PWV zH#+`h@zDiXElt8-)ng?QY9oO3?_|?&UCYYNhWEr22*6u+ca%NsE1WzOgN;y6u4bUI0}aI73BoLX$o228=>YEJsOo}tQ8hDixGudG~Y za=id);41|QG1^D+47z>hAe+!KS#nAYf|VB!$B|w^M%5zBWx+ZP&{WHNPvstTbTOo5a#|gJWGvO1e}T4XJvu+_7;T zfV_J-Rq}Fx14PxO3rF;YI-KWi^B*ztP==v`wUOkw+LyP~A!oDO&}9#$4!@;1mY#xC}zh;a4h@oiQZL zxWl2Ga*{p?AUr=Kka|j#$}nBx)c_b4#fTycL^y@@h$m!MOCl82oZ2ZyQw__F>kCcp z0&*Uyy-r)2H2k=fTh!GKav-B`=Ydnv^%?|k=Uo=MMVW8+9q0zckt0*-NhFB-Ek9Ya zMFAr4{TL~Z3F;NgvM+{m3~7d-V_1+XqU=)83S@uPz|9l$cTVIDf#Bl#>h=WsXn&@B zk4^9Fdas}>v_)R+Me^-Lzl26)+=JQ}!PercUs~yRHF0=)VyDlyc+W5sbhZH*BhEe>r=NK-IoBNg|+VVlMVjHPt zGP#Wt-m;3VsJ(SeBI^()W!;xqJuTUrMbn8bQ!ju=(50YBkT_=u`q6MKBu9F9 zuAFUbD7G&ttWiidt4g&z3wASG-UHx^00?V0#sgPSUWx%X3NrgFPl> z8uQtjpZqPu<1KEIN;949QHkCFol1jYo!7I6Y{vvuGeysHh?j7htXwy!P0D!!nnwZ$ zw)RRM^Ii`j4?b5jpFzy1XqfJi*B%6na6++=PgO92b$Wj;T;`^q`oOo)^2EJx_?~y{ z$Ik(gl%*&dNJ6nOmVKq|grW(f9jr`F*H80QgH5bpTGGa7vx0*fm%wWET>M!@=?vSF zx3c#9JnaK>t6tX$aseff2PE{JWyk~6l<{G)pM_JGEbGGn7(A}{NVC!HHQ8|0t!u$5 z`F#7kVdf>m1mbU*#WX{~a+qA&FFe_k|5az3#}G4uos?p~(G&uxG3xlh_c<`#rMW$q zXlymw!>b&)O5~qj4iZkW7t=S}H$V6%a)vGU^bxc(@hd?M zgLdGrdAQ1V@gMh4D~eVrTCp=Xkg?P_)!Qw|ME>?4F0#r<>k*=oge=z8?&CMk9Rplh%%4woUCa;}2m z=ELJVB$zeLgfc--<#0DzL9uBjzA1TGwDII?L0!ZABtNF!Kxzs|v+#(#{2l6>9;lEV zhZ>E@#ZfDp<@_TU3^jMTyW6hu0xo1v0uYb06A$aUk5c*J7jD5sSWyX;y7MhLugOF8 zh8UaBXVZv$(o*YC*{JPgu2F+5ujKoUP*tupuwZHwH53$f3s%(b!8?Utc^+#B_u!7- z_Ex3BN5ZRzUOl436Fxe2eTIi9>$R16y^nr~{9OdmMlboP7_&E?8HSiG36=p4pqL`7k}`3QJrmt$u6+vWhA4V6KeR8gM^IeZfBx-mec`-c& zpb4T)2jH-`sMwTHj;4C+x{K|{)IAh#=99D7YqY!I3s4*3C293DXpvZ;hHdHE;zq~^ z$n>cAVyNZNRmLO$^yLrf<2u*s|AKpE$?qBCy;ZC<2l0Aq9%EeeQItSz+j`uvWn6aX zhXQfM3FPWqT5)XhGv>z*^X4k4I0R#=jc*L=-bXuDE$~R_LWJx%E&|V%N#~c<_>Txk zNP-bF4is}}cG6nC3sxxM?5jL?XJdm`!%n2an~LpogE)D0{G#rn)MBj;^2WqiTHX`xeX~X^XeFBbx!&`BQ~9<2pNVvreF5&cz&KJ1szB(ies%l4GpF>$%ZwmejmwRAcRArAnnPlYdRP_W+65x?|xp~T;aVS(MJWTWv&v=8=FYF(xu?jN82o52PO<~Ak5 z6x1WNnh@RyJ(;?V?B5)HRT~N=1d7!Jie$GMdEr`is03v4ZdH>MK0-)yF`#vwxicnely+OtlGQ5s|MtxZwL$(gny6>~jr}zisTg z)I#`Zf4>Z2XoDp0+Ka9ZIXDtqSt$jnPSI8u40rG8pgQK~*{h89+zuB66fcyZe}*h2 zL*GRURVbK2Zeq=IP|O5jAF`9h9W9|;nGVD#OhDI>G+81k$0O}vus^=u6Qd~Wj5vb(CU4;X~Z$#$AofbqU~>;Dum4!tU(xK z2{EvIoj;p!yt__%&y6Hsy2Q~zesGvAg$!x@%GreE+s%{{?F?`vmSGGL#LlD#vq^~+ zrdgDB=JB@R%P}{j=*`5W8xuQn)_%;cw*RY?#ERzE11U*eGzDf}^QxQSn9Wn#te;uI z$j%5X@+2y~!5$Ag7&V4gaO+K#P=5MVrZD$~uBN5lUAJ|IKeEXh?$~ z<9pKcj>ki5kXH`E&}Ub*2{v@n+_nLX%e`v9T?F@mLVoW||7m_ePpeYykr<5_i!Y-L z{&a>)R~)YDS0pB*bKVOUAm{#rolkzMCY1KFKD%Agi)=JDsGB(ETWaVZKPm3|o1=lF zr3`(hiBqPb#W`KWz|7pFqsiOCTzz|)PDqFJsW^MaBpE#ooAGg&{{AFs#Cppi0%n3? zBz9g4O0~R!*44-)r?ohK!aQsy7Xh|w4rgs#z+sP29@kf+@d$c*XSz66EBtaPu~<4* z`+?~0Kx|X7c|wW>3S@k+ifo{JNJC&1ONCpdv2NK&zju z(WG(iiPnxczU(Tx3O)_jk9mz#4y5D^_M9^7W8KO#rNQOoC?580o*@1JIrXsc#SpGf zyWKsS^8TM+ZchpQBP>p=^w{tdLG8{e1B4`-#!04Bh<490B%h@7TxVS>vLgevkjs+K zdgw7=|34HP`9DUK?}7K;`Edks(6s?y37HoQeQQ^ANk#@KyS#-N=Lm*GFw4@^HxVIXC1IIVzjxLARR&*h54`rZ$C z^+6AlU%E<&80(sj`3FuFz;`8WN&K+^dOEPNd|3-d>55*s44#rjsri#}>@;W;+Xa)t zGtmbZC^H;uMKz}JZ{RuSM|_GjO7;0MLv`=%)qQyz+K%DG8b>ogzxkzh znKjmoxMc5ICTW)1L^2-9TCQKqFKp*W2pRS(y+=^*7Xk+gThJo*a+?jQSBMRX8WrR_wj8vsn$bVz%xpe|jC6J~}rGz}40d-!F{lG!t?k5Lka@97=57RyLjS7^7 zhyEzY#~x^>RKQrzyRtGUD8O1lm1dxrXsCbA)grCx#0F^Jv!Mxu^CX~RQ5}Ni^A#Qj zy^7=tpXtLx0)JL|1V-^m_Oc!$@lo*vofU*|N=g1Nj9__6{C_dW<|qnW5o6K9$Ga*m z#Pt7O4cUnI%gVK1b8_~WylO!C#IT_&>8D&~>zk!eaM`}4=pgA#(xq;3$#~V#V8M1w z;5xzePDoE=xTWQpmg@5eRw1RWJBz^(S z=3(|G)h8bi^lgHc7jqm&Z;DIiqr}ggP$QdbCf{QbpmTGnLm?*Oh*^^(k0>MH#y(fS z|nZ;^nolC31L01Wly}sO+>BCX+6kN*U7=LHYLs2n9qNfh%#?V(m$#|7I zPeNgEYb)sDNnG1ERq^pG4Uga2YaxpQxkv;?k)RkE-V~vQT3MILP3p$Y|8IEX^SoFX zD7>_Q#1x?AUZ?UHOqrC2bC#2A35-m9Kmqx(n!Rh@gdfby`L$MO?fpdLZ|<4(=;(#R z#D59xiw8EQ@h!^dkz4}K4iAe8FhUyloSE;W;cLJ4%2K~ET~Q9e|He#4U=>};HM#sc5FBs?8i80_4Zq z_gqRR__cPs-Amm>VotY~4uT?=UK+S1KwOcx(}xfoY1BbI0U3mh&0qm2tE zG41*n)nsFONh;xAKAq=V)`RmN)B@22-s?e12D5;-p|9PGM+8_gvkWvZL0uRVq2nXs zu-V~J4qoUtC&EgQ+ier1bV#Xm3nan4I-%gs=-O|NfE3}j=z#@N#Z|FEFRY72BoEPK z)YKYw2s?NV-|NP|s?~`ZSsKtM`bUP`rpcA_ypa*eJ$L-PUW*{g-N}eQ8XiE{g2Ji} zR?e^rhzbh(%`c|9V2}Dov|8Vx#^UGo!jEpp;v9iHzh#t!mA=XkC`=#>s#Slt0wnj2 zobXs+PGs9D9#yKA=oVF>Gw)5*CLFF2fi7X)+>5SsClYwN7^D=tTJBg>Gl0iPDjkS; zGrzwmfcLE)DVZk&CrQ7NP++1I$?IEg#Lyi>V^eh(I~Ewo{S#o-zso2g!pR|3CCciW z@^W*QR^6BtKZuci*~@iB%rqOP6XDcH1IvK`OIQpsE(*qj;oD1deyx~VQmxYK1>|T} z=t^5Jb>J*0%xqgB#(Tg~%2!gNAnz##+c!I!W*K3d!^ zgYTI7Gf8C#@_JDeqX)^Ut%EdP(ikJW|B|-01a`!^9bMeCr;|AaS8x3JOhBzHLxV#h zzKzOyW5gu*Ft>uH-2i@w9O(34Sk9Llvt`FPqxDZH|8T00yQgu-`+JtS>sU3 zeiZlUX@MBZU^i+bk7N~p4dHZpuF#$U?4UVH z`AgD7;vA+^6gh3rbCX}&R*v+;Fke2j65&$)S%v+hn|X=qiRZ_Gc%$OQ^NMbHA7ho8a-Tc3 ze2%6kGk*o*SkzWoD(aQdW*`u^8SpkY1l;z>?laPk>suHHPqiU110>_(2;Y+!h|6=E z|MMfwiTLds5Z3J5T?VsBYLyYZ@S4saXIdrr5JPewIM4i0NR5dB^u!&e74SsgtYa4C z_HX9fbZ@iYtihlKDB*$T-+bjvxK`NOL$N!{iN(<1B`gYy%}0=@fVB0CL5$4areg>n zC3hfizKja+HcqXQHk7RbY-nf_UCm$9K1z8$BpfY>I26`mDy}%%^wj2eYQH^guoE#g z=Yi!|7{QO^%e`_*U;|ZF7vLyX`C$WY7CaDin2}1OfHuVe5@2{z)si7!CxhI~540bT z!1aJ)5X8{?=K%hRs&}&t<09=MPjIzY8;g_-kWIIN`>YhXB5lhHiRE?aDOi&nTf>4E z-pWMqTPW#EURCyPipIfJIo)km-89LSkoiXb0Jp*lTWF^49FO`j9jemm|G&yNG}`^7mf z+;FGkWyd#n@B`M4m^Dk+|3)2E1*fgYlUvYKl6C2WJ97>KU9t(wK{eB|QoS6f&&|Yz z4BTMa0_gO6xfKmVs7D+iT{b`4+at2cq#_wdUM(sAzZ!_GRmfppGwJoO9V?f}2JFZ5 zeb>p0&)2#tYXdOSf@9QBY z2H-Li{M~F9lxA$a#_rvci>*+S6OfogXOf;5>63y-Uog;l=c_&w?EmTPOR2jcjm;oRy>pVB? z;-l}@q8B7^)S5`fORFw5XJ&atYsLXvK$djqo*6Las&DZ4g<-eA+o(Uc{VS(?b~z0koY)HC%?+9wYDf2qZg@f87rukoLC&-ffp=9@MBJ3 z{`q_WMai!*$g3ylkW6Q)zQT)yA~ojCjN?HX`<1o|4@pTBn|Odozq*FWXe84O4-tJt zZk}>VE4&B^hD1}MQ&}2uTx}0=tiZZr#-lD`d}Iv>BLL0PIjeg_kX^5HMZen%A=2aL z_EO(C1ArWANruhHs^=TBW8V#2ee#sh4wrS1-y&{Jg)8jkH(}gY@?-_IUXNTReCq_a z6gsrx1i3svAx`Jma->Qb4rd-d_)F_|moGoH1$913nlmMyij{CRGDNhw&Vynqyxj!o ztlNZ)(?IYTU=b~w3|lxeWkE<)@qPW~=r(UUx0OiFlnKNxegXdJ^*OjkN3`;B!!QWT ziL^@gk*x$|qIm%!kDtJ2qK^iay3*kwvL=ZUNfijc)AmH#8>m!Gkk+NJ|BQ~n?FhD> z6btt@uFI-!%pHr9m$UOduGnlM&!hFnjV2ZRw7{=Zkrr0bnE7LTtytusakD>KU?(H^ zcZy(ClSc3=ntvU!{}&>9p~RK$gaJyPMt1lTWdtSl07}VmK<22oM9Qisu>4%(v!Otp z7CWyTo-OKD1j{Ui*}^m;ozRwY2}Vit>Kvu50YN@I1pRRp<6^W8PqMm+GR(wy&Qez) zxb<;X<+7*xy2z9Ifx@&Otkt`flGqF>vVniB*wZ+-X@v=HhMR5RLf4E0|BvA5=B*@( zD#%=Nrx#&cskk|(FM0Obk@9Xg@t6uiY018i<|1yKZ9N@iF^!Q5j{gi`B&rFTpTBI_ zJjEQvh&IpFx$dPi4!w_`xqC9coI&Wg2lDuYUp>FWT42K2`M3h9Xw=_>fX+U6STbl3 zuff8?rR3&J>5xShqCeklcu~=&P6ambEZ;?6Q*Bvhq&_99lstE$dMnn?K8>yhrxscS zRQ|2ujMpuTTyt=VX(&OoyC^^;5JgYtXkP$Ohi*47-vx>gPy-(r$!j#kPauPZw3ER< z$9vJkpt7&m&51NyzQk#1DJd8u~ByiIOMS^gz=8DE1Cjirt0Zm3o{V^xqfV&tRXiNi) zcs#?qxb|_mT;vY=5sKoyRFicQ^Y`i$@4C#9B^0{R?JxXon&x7H!qJ0e%kaeRS!X#_(Bd5?d&7;R>25_YtLiQ-7ePN66soX+FB2(NaU1&WX6~Arv>S4xjbauXj-k2~jU^P_ z#PF$U^?qT)BPyJPPQ~xU^4O`|<*HjPqVPM&px7Z8xRDg4#6Um5Ue23A&_y2ol0Zt|nnQYNnAOuoR zO6v4+j~p1DFtB&CaF5a;-@>jIL%doKZ*8;2#!iwR8)mq^68?9W2K914kDq`&xwLLG zsb*#dlqG8G+0`*R#FBlu3VQQ2umH+W0$4>Uhkd0`>X}ph0yz_!X<4fbDvN)ezV~Ik zh0<|*s=JQlYTNsGmXSJB5i8~o3#q~w%pt=ROiL(Ni9x?o6sNJHW_g%`g4PA4>jTX{ zb-SL*5$LkiV9XHK8Jl`8u}iSfJnC7Q&Lk=`vcCPm5Q+}Y%Dx|7hzR@go;Bc^TX$Au zdpsF5{1-p|u6<&#xGG}p1}k0{m5H>UVW@&zMVIsu=>ZYlZRG69uD&%6J*d)lp9YRo zbV%^)uNF0`x3DVDak`!gPRn zff0xEBX4npST7Uk%6yu>By!61C>1fb5Ow#F*(6UX&ESB@;na(SxvFTB*ur{JliR8; zVe<}D@+PMyZKS?p%q=Cu_F{>PfV!O;l${SEZ1e+fYw>0pA)RNR!NgjsF=+zR>^wgA zUe>r~mPXbe`;AR!>@QxC(X(IvQM6b|UxWyxGFJt++uiBxwlJuQgmRI|r7wgxipNA7 zOg(G*2WnRh1_rs`9+ z_`H}K4m)M%yF;-v@1jPiaSx0^DzZ&)?QZifn~R99ZbF(cDOyLGVBzuYJH<}i%U|5j zeP%XLw`IXbv4w?deWhNFx{aQ=%%Q8CJ_N4XR&|cKf;UeL>s?Vm zx2Mr}=jXgRWjvjO*2-(RYYaodoTwLy_pEVL|D$Mf zKod3&>_JhIpMHdcqv)3&RUJ`2gE7g<4s9XRObWIEX0*=hjJe5Sep)5hil8jCzO-(6 ziO}?n!cux5{%e)F{Za+R5?gn?;)Iz^o!qVs?}ilHH1jzSiWkM+N#Hp}tUUQ3So{WV z9D7)(M*}G~B_0NPvl&|7?DLap;`wY4`AgbOKjSQl%VP^St6%KmYH0CTc=X&!Z89M)E&8qa=}?;s=N`L|3Y@u z$Q4c2z=dE=J|OA3I0o)!bem(scrCDN?><2VcIzHS&qWb?;_gR@(X{n_l-?f@3)~!| zHmvekM~369-TpKc(E^p=5eZLA_hJA^oDEHH{5h0S*Y72n{SLdnMZx~G{nZvq)W{@@C;SBy`{O3u>ddh>Y&s%u#T=>J4(a2!7+x(1IIn&yQx`1_z z$hO9R+xf5WbH2~iGBp&_psD>2=VIHIK>hXDE()Ux=@^1jW9M-<)MjLn*7n{e93ejX z)noLmo3`H51b|8^f- zGie3kge+zULSLvPzQY|5Ai}oNYmNxG{zg9RN2pOH8*RGZOt;PP{%x7+k(Q6%Sr6c? zH&cKHD~hgp&TfNLU!P()d(_4_oRN%OT6BpU1_1h!`@YscXZ=SHYl}svAiDLCIFd+L z6^2<@ zMEabSCn+`r1_w?ss1W<@kwC?fMQ+tbV1KL}N4PsWa!IN6$s=)qGv^jztbbpk9G`bA zXnN{uzjox~gV)YH+q&D10~^qlScD5sr#%Sfn;9F>=&P(1AK=S>^S!v>3gPQ-(4->H zRc|l1yv4QKk5^M1fwc}Wu{bTelKc;G0szoI|B?K%s;*@mZ(4c;Ppwc;$B+>lGLeec zC-q@fxj-TrwZalH-Ov5691la3`U-IRA?d(CPg7{Xd1eiR_094Q`*$;5k= ze#RE{h9K?fUu2AthSFgtt~2q@Q=W{3^QJYWg57mvq?q=rHnE^`CmJ2-YDiVJUWiGE zxf>m9*~}2bHRLN^sbFA1M?0WaX>?|QXXp+VWsMW?@WAiHoTBwy0m>Il>-RCSmgCzV z(mV<5+Yb0eryqS<2aLn1RMJME_L67+JprwTScki!yHa`Q8Em|(dEePAT|l+LO78Y; zD;Tfur1XWF#JCj_eF|&ZJfw|Bz;OrKG&&@^FAmG?(&B1SenKKn>87h_Tc5dm1L$Cw zW0YpUjy>d&i-xkkdoVxel<(!Sku=`2&p;uM-MZPl2>YI@eWin#jWj57yG(4|a{R$g6-tmJb=86b~ z>@lWj8`qD(Zq0osuHd`WrN?d^?o$UHcL;P`vB}|JKz&m^aMAHL+Vhga)4Rq+7J{3? z);_}@FN^!eyp_bpR?!?T&_!9sl|kDR$1|UY1RR-@iEl62oK2GapHro6)#C#W`N0psM#UciBwq7Eyl&&!%QVv8Thk@cAI%*F75wc zD{hf-+VY?l8Vt-^X>qXn{_~^43?m8zFTuG=rY$Elvd37^cQzBM?oSacsl(u13Q5Va z>Lc7>j+$ctv^j*LxtX~e8XvI!tuJ|ex-tkRt=wpn;)#!~X=elwPS&pMyF10Yw0Er$+#u@9hyq+NnozAMd|1Gdy zpv50;<^yAZb=g&v*DP_2f94}nPtMP8#=W)C5eEXu*uYNt&sN5ic*}f=E6Bt{9G(Oa#T^MYCOATd1w!1YbSjPU2Yln*p6#az1c73p3?;tSMmJtL;#AeX)>YC%Q@WkzQi(q2DJ3%R`y z>9Pg!D$v867U#!%U5%@do!rNwufbK7OvlBlH`yLKVF4;9a3Y~Wxgnvx@3&tt70@t` zSQ(sN7E`zKs*6+Mqk?j0DJqb?r<^4;^m9lqDp*Zq6Wqf^x}I-YBpgd$EN_L?{e_)E zh0o}{YL83_nBoVsTiv!nXLPW5ussmGv>Bdo&cl-6-k(_E$UmlHSJ$)v4RX|%Wg9A4RY4>3RmYP>$@cVNwFW;J&ESpi^R0fhpDg}LdDD~%Ol5}9J%ywT%o zf_8haJ7GKW_ACWDXX;@&i$j8{V>fu~s?1C*2tMN8MT3!qnG8`XZtp{e(JE+JR7Z}V zUZ~t`pq4lSHpEI{SxmQ2lJyma-nq+*MRj`07EP_e&bg|542OgPOL!CqF(s+FGDgxc zx**pB>Y&;5jO+OC4I%G++f~l0VN}6}Om5SzAa%W+JplxUntfNF7B%>97Ev#;m1 z^YH#OR~13*ekURWQ5#c$$aU2(K&B?H`Dr1rGEZlr&r@ZsJ|k?p?1kskFI;wyO^A7(8S`o)nrK79^9|Q? z5{lKOUQb+3(SN?*3qV+D%v-FAEPWYwZ|cHz`i0N*8kk%@WF$TjEN0mffWf};AbTN9`NuXumx8RarwGM!%K01fP$fQ zADO+cgOUW#)f9Vqb;d5^2E`^vpELgZ5<6_C-fI?tx&{GB?W+ zC06Al$07hi{+lf%3`F+wbO3m6_W1dbf+-x_$ne3zgL7lmYyIf=eDZ<=o}sKatJYRQ zOQ5y!dM)&o<95n=V%R||d}ecERAV7>tZzP-2$MuGhZ7V5GpYWl9SM*j zyvKk#UG@&5E{muF4V!G%y#)OO^{MN*BnIQsa?RZ zrn4d@TWpRGoYNZ{ZM2f&#juNvSlQAy(vY-fgdQAo!G7@v*L$}h@;3zW&H15X1*d&= z($ho&Z}+pD5sGUeqS1kd-*x($^aY>jkAHr81!l7#j#a%~w5p^L3vq`61<8Rkk6;-8 z14yDpY~sz%CKK=@QsDS#I3=Z%1)1UL86yTYcdaSWxaO^jd0ouujIBFf+N3toYOlLP z#Idf;xq?zcU;-YpF3wmS^H!{uaKp&$^p8yuPMaBFmcxK{n#LaTlKZI)+%X6=^q`^toPF zYm}!nyCfs8CvVz@tKaOP*2b=>ki-D?k+WFa_nD*&C#hPbjVW^HYMl`Fi0eq(Dk zXDpUd4Si?6k-IJum>M@C}h9r>DsWv#?Tckjye2w=x1!?!i zd}~CNzEJZ&`}AdmJ`21U=OE~v%ODvO(@{0Gxyi_xqcVo)ge6tKFd6ycjLFf;nK{ev zFsOPkE-L$idS!MI41{6yP1yu%=p4}>5J%d6%{it0Rxgz-a;P*~8EW6JN<8die8k)+ z3+>_92)=-f4bwuC@D5cpsr=0rT61ylyXYs_X!XPWPkqF#x4-t$ODv1HV5aVeL>9pd z{Eq~W93f2=CfTGhqzMbPV0|DZ_)uW7A$wz{^dS+&h>vP(v0Z|G8nknns$;1n!Mr2#v`hYJyJ$8WBI1S1GJa%h%YFA5fH7?C9 zF1(**ZzbQgv^b#c1)YrrKBAWb;594nt2{&n$mplzc&yVq+-Pmh`3V9dnCY`ZMb z(`bCAbpP<{M~b{P*nxgn+g8bZRm;)8vpV0-YbGP@_ezCr=`6r=eMQmBFCE|z-t;_d zhz!<)Z}hH?M%hhlzH3-@PZQsi_|--9ol}-5hpmr(C%l*c6pg26@0U~3=!ON%Cy%)I zNWD@8>GrG?E7A~1k2={5i8BL4*jB@2^o;u5Tx&Dt;5NcH-=?lDjZa1r;|ss9S3mY1 zoWB?mN`nLh;k)Idc}*Xly;AjLXWAAe?>?=n6aRg! zBlMqcrAAm>l04Kne|fb1FAC}xX(tgu<(NTl!f24SIGEb$_>!#d_tLc8Nq2}nO9y4d z5FFa+t&r!(!JfoEJQ`i{A44MI`)`I70R1`~vAPk#Z&WQdtZOi#BZTICKZS^{nPX(1 zdQ1IDqby}w(F)|bu37H35k+1W2hv8r0yTIS+?v$InG8ZG_Bs{=6hx`oGzJDF%QM@) zN=}{x%a<)spHBLm>J!78f7B7qlbP~8uLD&Z6X#SugMrol*`xb(m8K#*{IhQ|G|p1v=oIrE1G2 zCt-iMGdcDnr6&%m>ASy#HGk}BA3rQ*`hV5?45P<_LwW{ttUiROY{S}!ILZ9SzQyvm z0`fiz%DedqEJUR(LMm}%OPwIXqtq{XgF|N=*VR1^K#QobmrwXBJ6WVsy1oy?krILb zq|roy#B?(FST=@87j=U0rANA09+T)YZd+HY?diFWTeYtGEbrveOUu z%wXW}u!Z(Y>773{GI_%i@t(j|a;bU_5{1vst=(^-Ls#7B~}N^80et=jrW84(`1K!9Mf zh@cJSC=I@bU1=JEezF~3*~5)M_i@nRBE`5$zdHjPl(&SBWMH5^bA7q2MymDoCsvho zc}A1$?XGNRG*WZ~c=0c)fs-q23IBI@)@?ahP?zQ6*{w{DJ0-m*Cl>Ylddx1*D>`G} zUc?X{b*{2EMVvtYA5xN^lCQNEJ%xNT*CZsG6=0Mn;uP_#N!h@m2-}9whce1|2_)tA z2jY%zq-F7l8s|Nj6Rl!4GOoVYnlWw(Ql}S{y`r0kSG|54@Q% zly`9`y-v8(mv{4-y#-YSTa5PKmnbb5OnWV9;}V~Qwu1(g&Y%B;1iX)5oP58An6!W- zAe}63J7KKBRw6;c2p?1zpnQ%WD5~O3;=>iLWL^v!M@a5`!;G%5GCS6$Qy_SPWGe7v z$v@?ri&REo^a?Yez-7>|F;1Lw-cSyS!ki0J<8)?Az))^CcHtFqZdaiVPa)5J*qc33 z&myKf)}|VdtqebYGKtQCh)cG`I2dUBYyI_fk@~2zvcme66F+)<5L=`(QBL1atSecX z3mKP=eW}N1rhA+h9Bq4l_8A}QV4hrD4DuD zpd4@<#5czW-@7aXC^kr$5n{oiCwEDfjCxLLgrk{RK=QTK&5rM3-X) z)6Z08S4`HV&T)c{ zQ{4M)YT30PBz{hxj1D}{!iZY&T%>?pX#v5cb2Dy!7cY44BsDo;_3DJR&oRUm5x%@0xgcz z-Ax=_>7t8>A}MO%E~|)L8JX)TXi0oHrYcPyDSb|*hbJ*0X4YI9r2X268yU~`EDr!q z*XeXAv0lX%ry-58y@80BYLpSSosh%MqV>g6)-lnCC-?Z57PDy6h5?0fN*n#;JQ=+% zgI}Z_%rCt2;*Un*4ji*sCfe!;vWxgbtY%-*Yd?rI$v=AF@ zP9O0Hisd$<-ye*?EEqn0u{hC-qxrV!em!tAu-ylH04wBFr@MHP14K$pm@07rVz)pH zQLekHG`AkY5DnHmLX%V{tsE+25#=`iidkVB0&B&yoo+wB6Lwu?brtbfU6vTbRbg0Q zAC&TeUP0Od`nZaaxy1OytLC>lL2+B>O{w z*N~m`&EI=3cUAos`?Mo(C=Q+d-{7caq2hQca6`|9Y`EJvC2TlEYtf+QsTdJ{UNV~1 zE!ZetnI0FP&%z%Q(^X-Xva0>59Fek^!|f;j;1Y>*t@+C!ho?cpC#oq-2z!fc<@3pj ziP*zmSD~3W??=i!l1k7R!dr}`?@*U#09#}jPjIS+JDsIYQJ}KEN_N5yShznc{t@*d z>wzTR{%3!-&c>|1oEm`z7rgw8J0M-!zX-#Ca?lgB=rT#jpa^q09-GGbQ_eL-ta&b- zMqzHSq{updwjx5WCE9cBIt|OMVd)axlOtIEDI{5^&RpKx!VGP-gy3@QGbu}NJitV6 zbBAk@Lc2PK^c}|h0jrj(eenenmYyF3(CyZ5IaMeZEy6d)yv{Nz@@W6CH2VXm5yDX{ z9aG&5D~FW?yl-{Kthqe8L<~RTjdn-z!x18M6pF91Cnl{z^GKS|=M>I;XQMJ7Lp>x+*;YeR@{94=%=1#HZ7K_sb zT54R`=*V^|W?x-RrnPiCaBixnSMwJEV=o)F@vCNVODGC=4;x(>78PFf7cSjNaeC>y za2%Jm2M?Kmj2xU^kMoNw@z{>-uXOCmjc8dqNwu>Wsht-0VKX+;rfNIp z+Nw7)<=`j;Cu_rN$w;EmH}0nBW{R|nA<+Ul(8{$^pT4$vp&dnafFG%06NBIx`!+xD zuoYTfO5~iUpW=F6i3e=NZA5m|X5$>=XgVI~6jK0_%+>m4L73J2*?m$yT_QmC_otK! zyt2#zfk&y(J&~;3l;{vQhcZz5XVGAg+CIT{CR9zjsh}O0prHfZ5OAHgDmmf|0@i*d zg3KL5rcWUT9kF@ol&fMLi0aV95+r35;WN%~32C6J7wilYHXt*DFi{tW&+akYGExw^ zJ^%>(qNpk`od`OePk^XZcZ(d?sJ}sE{siF_oH$(Gt{6bpS+kQ;FXtcxn2>UNzVaIQQ+M+6Fi~H9EEZQkl5P} z(3mfNM7Jc(D0bz3!pXka$w*VndnOHX!CF5ul8Qs?r94-+sQGQl#ygRj*0p_HdKN)5 zoy5&^MZYL?XK@=H1hez~8aqUt4~LA%1Mt7r7hSIHI+1xBc7VKKg2ugpS0J!1;!eYB z&S)t3I$ox6RtnW>iw8F=m(tCWHoFW3z%KkpTfm^>I=(`UF2c~HE}rRYS5i20gqVI* zo0lpn_GI>wUXr%Ql?QHoiKUCDG32KWlBDTZQ35mNVpK`nDTu0R-M8LXh1I{`JE_BK z{CsBS-+NZ`=3Sv?=&9nUJeRdxCoer3Pb`?9suEx@@!V%RgSeBo2Sg_5967kD<``i( z>|g=!5kWZ0JAv3lBDH=I`RXS&O!A!Jv_!=7V%$yw7L80?C8xi_$;Di&A^Hs@7uUq#V7Njg@&TEK;mZ~#d zmTq~?g5;nGu1m}lr{|Ml@qR!+6jhHXz7_;T^X@{uC`vHPCVbl293t!81CE-f&QBVz z1zl}}HYZB^ztA&BcC6+=Rk+RW{A4<{EtDeuibyZls^&!S@Dc{VQwezjn;Jwi)B(*W ziDxpla2_G7IS4WEZO=3ZG3AQ4pb|OA2|BEWaOYo^WRzy{k}Q@^C{lK%P^j4yTb4X~ zvL3VK_s=Jh0ihxtK6b82^@=75K;#>+^tBd>^ypWLA8a{PeS3KTOj0DVMT7!J?+;Rt z@X-AzUABbT0|Gga091Lbz|Y0bgSWFx?-$*fmi_bJsF(MRmU&Jgm$}`zy7*(VyPj!M zh*)1aZ@B3RuAf13X6 zCvPdIQzDkDQTe1wU#}d=#bAm^Pt@IY4#Ss$-+sgJ zo&ei6PEeVDz+^rhtn?4lX?pefI<4P^Mjtz~0F?b$uCrrv=lY2Bmh7E_)w)n;?URTi zbndB;^Oji1Z!zmF9x*;F+oXGS7Ehc>hA|R(*uGex`zH`0B_0oPh+&?BR?6UO5CU;J z`59h3@3%|tm=cWb^!V+d6f^fhl=x&h%4grds=#gE(|Con3WIkQj0oS!=qTG5bb4By z{nEChQU1D1cMh}bIfLZvHe|5HFf$4?Ka_G*2^VL`JKl^|;J$bTo>rgh1pYWP;-}d( z(KMWN7Q{B_T1kchB@!3O;j9W!PkilYUm~k;gPPQ&4>+XQMj7ST7Nv88uBYQ8uEw5l zI&8`^YUn#oG)k%n{wXmGxWQtd_bC;%>Eaa6<5gBgGb2DE4dO|~CEc<1+hy~a?rQDp zC#ED@&#Qm5x^O=Mc<26aWjKc&GfxI|Ym2=>BL0+cb^KR2bAe5w*J0jP*{PVvF%WJuTZI29wP?mUp7*mV&L8}x*j5W^#xRsUCk=P zQ2WpAPEkj?z(t{1aWe=VxT3xTfnb{(Y8!!GJ_g{#RomiO$u zEWbaXL#udA=5*BqxTWQUN;fU&A1uNQlO4Pr4B5D*roHIcPPl&a%l&bC9XD(|A)sY~%l6_W5_=fbk>lQF8OaG0MoLU4%n=Qp zV1)X{e>k}P!iU2^=p9db(zvs`-+s(1VC$YQOKVRWxE>f|Aub)jk!84QOtj!R%x{w? zMb2cgAilo^W@hNsrqEg>l0UQK-a4Zrj;0w0E!kF=+4alMBj`4ex>>tpZ8JAmZuauX zT08yu2)pqHWvjqtOm%VL;QM-a#HfD!Mgb@_PtYxsbBLSSZ7ojksA?;HLC(iZG>P3# zhknUJs&=S${hI;wKk6l5qz))AYBdvoaxh4_%OW;W#nXJfvv=k zDM`$R*biMeeQ{R~i1OLFI{|e| zSPs)?09Bz`_eZ$2PPnl+gQ+FPYCyR>afhabgX2e1r^WM6^thUh0w*CHz5c^k$X23` z-9aFAAOh{9EOS6>s$TxQ6!Ly`w6)AR^l_$_fg4|Y9>%_(gthl%p1z}$Fgb7?Ox|?Y z>@q7yMA3L#PuEjA5PscWW#VhBjWe}6V@-WdXI?z{LTM~A_8GnMu4)$-xJGG8o5`M^ ziNe>31#Z|EWRN^Q?=G5Y=gXDw5Q)S7bN-JR=qNj!lbfxOH(>cK^OoKgE!ie{K5V~f znX3~obOK?L!eMOh<9irus2sN~6@X{7uTe%{B)Lb7Lw1Osps=?J!@!NdH9p2+{4VnJ zNIxOBdK53#y5k3ryQK@HUMhjy_pamjO`AKM@vr?6_3>-tkEpVR4f}>~SR?ZvQG4V4 zg-%@51Sq`bnS9@%JIjvJxul`fos0)C6lHN|+taYF*}%bqx}mAore`<`W)nt*1M8f0 zQPtBdUnDL{f0nAeY5dI*^~ZPTPCwx+ZZOu6xEaNn+n0nP&`2Q8fi>zOm&)+aBc8iC z@Vko|XQa^#&Dh8qeYqWPrshzoBbiT#7T+O`J0q1OUE0He`^l5|%US>F`q;$D49s%k zD(?t$wB-Ba{)S=k;q3ia0W|>X6J7ZR0IvMFV_$nJ}WnlAFA<(NtLR$l<|wkh+DYUPJrd$ zD~O%ss2UuZnsmrO-LOn4(*@^Gxe{>60@!4;^^7>Jdf*LZ^M9vJS^%{2fJgep;mPm5 zB}x`;VKT{wGl@lL(!g~ea_^s_kz&}u^av7P57aFk##c5+*3b^;Qrg6uw|$E)c|bw1 z7?PsjojjFI)se^*f~FT;tX{PzwL7wQ#o2~ET_tg1vTvOo8`duyLNAOXZf^^skm^`H z%MEtwy3F4BaWkYEIC_rTsvJf{P7qTtYZwUZ7MZIkPfj@t4n;ZU=$?nrFdV?wC>ddG zn?n|&H`ooo5pGfv;+r@IOzq*0FQFixCJszu@O5|fX3nDR?4b#*--UNs+RJ5urs`{; znFj+Q-fD)2cUV&J3;YyeMQ#9qkJhZ^K8~&_*%1$(b@~lzx@dc3ZEn zx}_n%NqZ$;tOCS%QSb=@laaHjT0%zDEDI}<(q-&~oHsB+{zCJVmKBAa5e1H<)s!uR z*pxlX*N9TrukxR2bWa2tKVl#ryA`f{$C{)pqbU;Al()PqSng}T-l#^nkrQKjg=#;M zI&?pO0{&4SgN{t-ZAfaRnuh9!g%qCc)LxXx@gFTw{7F2Y4FUXga!y=Dx>-avqQ<|r zDF%OOSxnkI$@}Hvqb0hV!_%7&o**vT zdGbek9mFQHWd{*6)>m|@-PLTsp14TocZ+Nj8Xs6R%y1jyx|!I`1QHg(trr5VbgfCm ztw?&mGx5eD`n7tb!U_D%9>djf&GgrOY)mp7N9Pr|NTKlieRgoRsnnKeQ^J!%wgviGVZ@#|~VYdrv{Z7%aoalMcDq>UZLnl#yejf-@DIt%MdqO7*mc zr2r6Ks`ldm(8C7MNJlDX8x(oNkPDRDJ{lAV->Z830C;`5vCN=>XT_wS+-s(vIvRLx zqPn*|kr>&xK)RxUz*NJU`>rq9uHyz&-5e|Js1p<7IJH6RP#qVGv-eHJGOoEU90^f6 zcCv)+?m%?wZ%U)3t~^S02V&xsWdxkZ+Hv>@F&AJ`GKQ>8jyJ$+2`}Tqvs&Ne1`M)P z`+~gh0Dey`Fc9lWP_lCvzT(F)MF{}PP!Wna(rbW3UzbjL#E|Z* zmIA$^kg%gnO^Z2~PgZ2QA)ijxT-44@-dyVrpTdKGZf{?6GdFy*-r@2%Vw6%JN&+MC z6$PZi=cxrOxAKvCf29__8tbidU=${n5RdEZ^D8*(6KjCDDm)$53$YZ9^Z$& z#oHj=7Z2jep%@*83$${^KfIhc zzf8e20!2`6*y;i}umqWb4>fgNeSkV0JF!sg3d>&`@=$z3vydL^sROTupw&u0i!7ok0D#<)Tl*&Sbh-j)05UZk#eo+N>9%C49YN<*uQP z``@wbV+`0R-Ds`5( zDW?{D1RRBCq>v*3EUY zJ)T?wP;j|L66VP@Quv~@rC!#)s??Nt z0?CnbYhN`rwqo^O?8ON`Ch+3wIsO++!U@b&0F@6}2H4JLtZz)}c;(o^?-70y4m)Tk z7Q}hBl~GxFitMI*ZgbC6iDt<|9VjtsvbG4iEASckUhWsFR1My@;%PD+VD_GgH(*-G zj>t|Cepr3?^eOGJl&UAe;8DI?9`m`RyVtEx%@^60e0BW}NRsTmYE&tLX9NjS3_zyX z)fI+7nwW%!swZmRV8Lg6NedH(%EUBG>srx?+fH)FZCyAV~UyzgwwHp zBebot#jf;kqW}^L>Ev;4RVStDPt&E|aRT$ma=ct^^;nB9^Apf!m&h9pzi8}sWmddW z;pu$z*v+T-u>)_QbrA1!;4bq1YKXr0A^T2&Qr`nxJJ3#NMLbq#Fip&jXU2pGJ zwah!dMC+nz#FNBw?GgoAh-tLb;3u5XQzY?Z>Tx}BJJ;;($%g*A`!unW9#qlh0Em?# z>4ypZK9-+-T}eAqmEB4vK6@x#%0K3a;&Uuy95DmDz&E2x);?fD$g)!f7d3aAjP*II z-!Y9jXHihF3#)BBN*t$<-9WarliY1F`J{|Y9b#RVY)PlcsJHdfS#p$Tj#8`=2QAzM zNQP{UC2u~eezPs*dMG1o`4mgXUiWxCZ5Zc{{Zw18XGN%jLoE%?GD?D9;kYvj z%?%F%{nKVzF>Nv*|2$(|;OXO0HM%$e< z#1D`4K-SGsEl?x}uM|^brNDEuUz2M9lRy$awzj~j9y1(meEYqcW6OzkM?|$Twbts5 zm(C^~A|#4+iz-F8i?#N(Vd6W+aysK`02v+5X4AnGNt2oK1tOae+~Xx*{?kKHBJyez zg#I*kPLCa~8%yTC^V1qcrVro5MB$cL+APyDDNC>*>z__;MH*$NMjx)Ka|cIc2Xac4 zB3f&rWKv!Rah4coC4ZtU?92@>9aRsn0RyUL6Fy_0#=!xCEfH&-KIrs!0QB z_+;%+^69R7Te|;vLX5LR(p``&d^I%~mSW@!1>gKtm=;C_^?-n2tyYxzKYjhgMLaE? zYg6M4Qrb!iUCBjc?W^W3M^KA_%{h%^p+_PIplXSIRv!9r2L;*IF>#rJaIU?dKI{F{ z?$NrOtT$yyaTn#!zl&)KhL~9_nGy+vB(<8U%Zf`$(+&Y9}rAiF38Gk_( zST!WscHsO9V!KJ&bRRhc!nWFdVxg2D69>_{C4dggM{^pAB*?^PZ$)Bosdg|6V-;yi zSx|Tn9v?Sv=0%yBET{(yDYMni#=RCi03slFuR393Slv5y*~Nh)LQ zz+;h=)28YZ01=Q?Ahjims}`xq(%CckM~$9HjY7Z7MI+Ze8Ihhl!Ce-wgX3yFRy)l& zIApqxd=09#o40ImV~1+K%hP~~4uU=EUO1w}<&JfZ4cEjMgg73hAPrDH7k=XahO=en zu#i@YGq0IC6RevOpLI2M6^2E;lBRC6!6TEn{TH?d4cpI4SCjaK^M2P20m78dXVYW% zKky1*q@w6xzI4b=Lt=trYS(X`a{^`DAPUo(MIgU~<7Kn<3xj(9p}>t`x;{ZZ@AsX0 z*tUaZEI#32r2pjFA7drjptQpqxoymt++*^)U2TWNOMlq0^5_jZ@CKpm>QvBP*t?bv zxZy@bb`zPbzFVq)4|MQP5rl%2W^S0a=qkJz@>g!jn_hLMI$rwFVm>?u@ZQq@GYRF6 zKam)oRxp;!`_0Y0lM%bFbrvKEA?Lg3mxGG8Pc$X8O7k5d@M3>$M=JaN@3ISHwT>Rs zOHyOgjj(#VrRb^-b0$1xj_*w?vwbD+ao!GEn9bJI#3h(D@1jlLOmUxH0ZeD2#4*Lv=zoXz$Mljw?}8_;B)NWOd$=@arVZg0nr?`zpbWT}XY$yNLwd+&J>_ZgFx_HY`suV`U^TF-P#4Bkg(7ao29bJCf z%Rg5E`n0pueVK3pmS|F@My|T3o`6{8&QT($I7NDYD@A$*%f(7mU=^i6!@!7ba2BZ} zF0Sw?OHQ=b_>Z+f!N9k-*rm&?gKKnF={t7~6D3w6s;%S2Dyj+~{V0A5p)Mh|@mmb9 zxjD}d3_Wr~#Ku?C|6X~{kwu9B}LIG0d z`a^V#Z=^+e)wz>#iY#1Pk?I&kV107E{_t!>_5**llw7->KxJM>?+x9c_un#%{!bNeKfu_+urw zq);?ca>C9Remu7-bmsqv5By#~*#OG+kamRCBsZWG(_D>`4*)iyYtC(}X=zve${`bE z>GVo%o${N)$RBov7Y;C^_!GQDT$8Cq(_FfL=={!P5#}9sbUc~R>?AcS5-f>&Or}iz zi^I;&&f#C`m)w2gs^nym=+5Na+KU;WSyJIVq^T-a>Qjm^)GroQcbBl>LI06ILKV{h z7+OuUlj^98tLjHpVQz0(L>{>UnA+gZCVrd$@j_<}w#f+=yf zRcrGhi`t&l6;5TR(@DY;J?m4Ols5@v-Y=82T)yMjiZnC)9fcQD=*a$BesU7t2 z$s53ChS+%GarRm z6lbHBnE;!*izRQovXr|I46HxCt$+ONgs)e_D@J|2`jX@XK)t`h7spCfdQdTS;QZBm zOwJMptxgywm!1__0P3&wptiDkpigQvm{Yg}#{Lg4lU8N9Vgfvb>tyzEC>2wY?glM=DRve_atxamq!htxq%hcTOIm5>1!Vu4kKL4 z{S(zoT?$K(>vXmf)lTE)(hCbCd?Z?r0~lnTJwMN-0V9+iUu&Q8g#G(aTv&X+|2^{ zU<+seiFkscW>a{b-~Yic*kl$0sN-9@NFp7!?&z_4MF4nf105FFV}GK-w(29vxjv;N zq(vE&=0N1^V|=dSPu14ZS5b1sHsVm3YQpzv`tjXio}9*9U9_~V=m?K)*fJX7 zb?(9EiTC!`0U~Bf@BjjfZ@xt4U_9&oSE>B8yWun%(g|3{TKo~+nL)^@xPGhnC>uzD zWM?I_(l4Q+O@QKTjB}@%^x7B|15)oR{QMkH+Ke9j%c)H`=u8q@k&O_p^L*R&-qg#+ zH`R$F)H8xUK*9#tpvVQ8NcFyBUFK4CX={g9(abMMGsv0gIGCJO{ZfYah*gDEh;Xg z|ARLDm0%FK!U^`VRA?`er7(sEY*AGiblqPrihipy9sfg=kDF9w#H0uzL;u651N%B8 zQ2)#uhw78^3lHKa>A$tao2IOk;I>7+LQXr`xs7;~s5LNtpOuDVmzSK(dPuEU0}Q?A z$oSpEqh0o~Q(#{95~=n3V!s(`Gm?_X32Ks!j3B|QS`1@nX$hg-Vx7@@Gm}d-Bz1Y_ zOG?MTg?3Klf6gcrveoa0^NX&RB?qgjhrSH$)lT=4s+d<3xQIMGD!G^E9Mn}JSd?e7 zB-L6$LzI6m&E&u@QD~5@LrG5;$H*j!bQV9CB6Q`I@?#$>_pX@3pKNi2vYXt%^5(GH zs@6z^>5%!E7h8o+N%tTqa@=~~{hK`QV}6i1!S%jW>~|+9V=<++P4j(+l~U`8R~;Ql zgrnAuhhtq6>VhRuSTA{#ZNUs%`9Qb=vO+NUmj9Z(vD65&#Cu-~)Hpy)h1RU|4AwrR!2!b2)|gW#<|3;lkt=ON6puIM{s9wXfdm zV0m=-c*#l5SC=Mw#lX zTNDz>)?Q(Jp(&)6M6j{w6-d7MDbfm^=3?zkC=xL+xpqxc0*wavDVwevjcC3I68l4U z5c}|V^OshMQ|{_=J>h=&sMlxaqI<>5gVwa9?MR2j9GvPb*4ucZIOQl!oWw^j^Jms? z2=7Gag?zuo(=Dih4K|-Mv0zm4eFpSrb@cxjJ`hXqJ-56Q=-hvF{eQpe(KT?jkf{4F zTQc&45jw{}EA;69nr12?GD&jW`>AwgPXa&Q?20Z=!gWptdFV<1d;@Oc{X*A;qCJo3k za9?wX6eQN!Tf5Kt5Df?1K(rc%|-EX_B@=oa5&blG)89}fdcbc9*z`>?`qL0PrGZkpMXj#^Mi_N&PT+gkU}bF zM7QN5N%JNyr&b{}hFfSZp4aM7p?Tgi!O(}+-&IB+>9$ej%=ZVW1Ka)G{#`VrnZP@l zKyd#?`a?a&6juB>s9a60M2)*yxQYNQNnIX7y7J$!eJCMbw#N(ayu-tlj^e>FVG`gW zVsFVru{I$5EV0I#jPcyOF`2J8?5>;U$9MAPw=rr%P}L6Rn^N9bRJy^Z^|lJ3h68bQ z?hhG(Ol;roErFr6p**q1-^|lTu8qr2G9XyL@k%N8I*WHiclT6vCd|2N0uCm(>4XQd z2*_OBK9Cg!go+WPjFvi6h-DamI{{~sfUzn^w1@#SG~|c#L1mz(BQAQR)%-8TBhCQw zuSOO zFk~f~Ro{6eC$PVERR^NX8uq6Q2{L9$)@Np0is{$HjN$o%&<{Q1!&v@@jZlXb$vW>^ z=krI&)0vIFEeoDWM+@BB(^cUv0c+d)H8r)F=wnj^PIuw8CY=ViIYnCc?q^j~k>b-u z-N&)0-d}D-OPzsZ&`2Va{U#oJBd&`e7(emLe$0K&QH3;X&&r|M>CkS=0NNQl< zK%eYp*!a}!yfs3HeJz`ds$;X1?zqrI6|wbKjhUhn?RC{3tNyEHNu=R}mvRa^JBA>A z3HYQD$P@*>HtwzjdjaPr#`XOhpMzs45u0(o1^Z$*^!O55nd$yJV1RX&+y1Z()}Svn zq(6ccSrqj)qiI|3YbCFs-VHCoU=LMpZS5`P3ZtUB7}qiHjKzr?UScBccXg+_@z?_h zr9`0SnZY!(cz~9x(`u)*& z7tzEJpfCr7eDz^PcC*0s+1NF3On9~e)e-9Tt-1=**+_vBOQdgaakl%!elWaLGEzed z&aPr&QP~2j1u5jvca3{UA4(-~&C4xDG z#$IW>h-^qA%{Zp*JX1h*9|4x|%?vxhfxMrUO!Fl47SjBEur2e{j&4aNi=73ilhl(0 z#FrSRELStP?vD+TAYQA-@qo~vxn#p&51+`vNp35xvALR@8O~>oj&(})55GQE!I=$1 z7bJlBmo2yf=!2j;;Hbsuw$K&{D=|Q`rA+024~#gF z5Ewzh{SvaMQuI=&Q9dqXS@Tr5z-n5gN$`yUep)mxv*vQIqVwA`7Y#*QV@Ku)-mJ7- zVPN`V29O#;=VHEYLHU05K83!J%X!rEAUc8gKM%Y}A3FYyR>4@rInI~thQ54$V@ql% z##0v0I1D_~n?_S9e8GI?``4j6yeQA5^YBQFT`qMblbq$-RtU~2cDauG_(xy59BuxiWBOUovKPg+y~en9Zh2p*{&;#2~u2j_Ktx8q+s{WVlCI ztgJ4ye**IfegpREmFBB#E}@FBxtJ6N#6zqX#oXMRgYdoO0{YJ zz1xBvx4Ga~92u>-;^HX6C_7C0ksN#8YBF8F1{IWsfx}|y702w*Gttru<`Aok!pk67 zDu_tYxebb;#e-Y}l`FjZMSx2KL3U)D&L=z7k=8tjz6{qMO#X$Fi0y;?e+h=Lk_WQ7 zNPVl7W9r9wPJztE+RvHzc_j>2Iaxll9p~PL1Ht+DlcdXzJ!#6xaD01687(s0Ob`V{ z{JoXF0uEWe<7#4Jem{28z#m^3de2*t@NA+(Js@&plM2D+WwS!~AY@1QZ3$09oaP>a zY3MPn_Q4w<@P@!j)CQNNwg5doLnx}r0Ud5WW8Kw9#Z(8re8=a7MU>d1uG=cn{=_7b zNrFId(7kJE5o8;zNQ*e)mDO`bm^Z};Re-9HE^!Wmz^dMl^~tyC$DY9n~=fMHrAtCUXO^JJ`Paz(J`EF;2YSKLV0Ozde76 z%Fvd=iVUxa+L|6;Fl4aJX$He*y{ZNc8pX6AJLC8CKc_jKQ*UnqN9)bINuC1I)xAHR)HwfE zlJeq)>CRBW)!4c`s2j;IL36OxrC%T?x;ux*4fpIieqetgap%T#5R7ZLB5HA)Nd(|( z^LxX;$Z+eN)*ZvB7$D`!b7wmj9TXkARDq2AQG+%s>VSbZtkJxzJa3k#Puqw7#Yduf z5C91iAW1@Y4C1m6Ynr_Nh@SKFzy}#}*ErSjJx`Tl;t+S{uig5u zOxP7bsvOH1eTETdh2MWq6L{*DmmgHwTLK6oGi$X6JMGQd z{(G?g4$<7=I)uhcWqnIKAkMj(dx#{x;0~QzAOuhOo3{`q!X{Y8u@4h2_&c%!ntBST zQrwPEz)%MZrEvlx;g<|o&Jm)l%?swl6trk@$GnEAq8s7>pHsPS4mTGgp*bjX?ppbi-1rqh4H> zx&LynbNs3=8|CGvtn?SzA~kM68p7T^jr`cNpdNuX141J3mUuEj)mY{vWgQnt8*`_L z&`|8IJwv!z^lODUsI7~DO&I%Zf30#>WmTOo^k`e&#T9tz`b-JAz3=mfTM^bp)OC8G zuB|Ea{lzwjYK$cm;7^^+svKol05ST=Pw$VQ4yjz09Kxddi9xBYmroO(!Ba>O zQ<`gkL{nlBid_QslIz~Ay>m%(Z%nZyaK!z)Osdih-d%c)KH(Vy;u)_6Vq?&Q!juO` ze;(Ld&bq!t1)60E)Ix&ra+g^7QBZV0N2 z5yvW=HV>DnW&IZ=ZZYD*<(zdQKo|G8_=upuut)^mN!Mr^`5J=9ikESY+@-HSPA_!4 zr#4u*9s!vLG>Kxfk5L+TI_Gey(u|F2d8$qoiC+fynuA|Ep8-!Fa3!+LrKcoWP?(fX z_&O@7FVQGu`Jp%EY1^uP{w8T>RGCQJip>+JmQFgtr#{_7>0qS6*2uz``A^_qDh z6j~MBO1@-k(t`2#8M>L85+ksjV{EbxdfbUcy-F2)IbsW+{w3z6q(7!3B7#ttVk{|G797LnlRWEm#_=cxt9f} zm*ZH!HtAu(5Ao7FDDrjN)4?ptvE2uC;f-tIwutZw)V>BXE}z%t z7|m%i9cGcX@V@n3@(b*_-oI$9u^had;++SXX8)LnE0{e1+>*JX1P{AFQFKrk|d(q=c>&!wVT7_5Vr z%;?C}_GN-nI(u{4$Mi3rS?wLhp{46l($3UoEmFPqcrv-~<^Yc0OZ#_1m_o%BwLW&5 z1T*b&@ggi@i7FK^#3aEj4)ap`$=y$L`vbyhAC6dKe#w=dGn}oAD!Gn(ngeYND;gTD zJ2QniPbh7spU@PZ-TRab2S2-9@jmAv&z9EVm_WurkNax zQwU?1asEjIItesk8j%Pv9Qv2vqKAa$f=K#Qs^-f6%{hdqcdG&gsdIV0nJh;~6|5`+ zeAZ@Szh#CiJ?{)JzT9#6Pl~;JB-b&Nx8OM62`FUz6g*6p#t776KqZ%Fuic5$S1w?9 zsfd4MVL#pZNV>N2u-KS+mhYIWMC^=w`*ivIv z;dF8Cvk5B2B-OipguAXAWPQZ-_Ve0g-5o~4>W05ayu;P%v;nW(bAgG%@`==V&cWvB zW8bF?Hb-enrV*9>j1^=mJ6Z380a9HhY=@(^`@W{`NJBmeJ>rbyzPcHM?M=wX`oNFMhve)#(r38M%?$faSIRz z58N(A^!3vQf@H3IEu~!nyj8DV8d^PRr+T0Ne!t+Or-U1>0XjBnqbr#@0xq^i|S^8ESLumIxC`9 z>{Q`n%a!Jk7hE{Z&RLKEDVkv*@mY;EsX^_^qA7KXhTeUJ;P$=1V;FX;(_)Mc-re6} zUUiOgjyduBa;+JG|;hLnN0S?muOg$(O&j=te`%D@bgYz{$TV|uW7LDtzI zaVvEu{BHkS7<9qB#JCcz)=?FBhymr^rC7UK=kepa%|$!%Mb8h4vetKaJ_rb z#*6rovD3(^$0p!}JVPA%m9rDlo3EyHYy;U_D!^$%8f>+p&p9204s*rjei#4neobnt z7m{fKe~RF=DelIBR%h|G46a3U1b6rsOnsqw%_&Gt5*5%eU;K2*fRUA!P8!C&2R}Jb zue3e_^e)wyGb7=l%>`5yIC5gMc2EJyDOd;FS*E?Y#kBV0w2$2X{&T~~?^3rrH zFhvVSWl)a7^>-7G-QP-T^!zHG>P#*#Y%npI9x|}?7*@H70`>6!CwI5$JI(YDr^p!n zsx$5g>_D@Isr*bzB~U7&1CY03yE)IkTR1@XMtH+P#k2=2)mDM(>xJ+l*Urg+WmmyF z7>hD)FjKyE5G0o#<~s+roGZLQREb)2cb0&3iC0f1CZ-EQDXpABz885VRjfVT$qVck z?sDHvaB+kBL(JRGBG$v{LI$;({!n;jtq0=5!cs8inUB2p%?^gi^MU^}GG^>!~>QP0b#nU;0XlIHRMXxR192r%Z z4KaSbqth|Np9=oQG_JSNP6Sl>ozcJf`ZYHBAS>vwv8X**CwJHkxfI9dkCvp;N%E+t zSN)TE-J%)slQuJAcIfi>Fsp9n-PQE(Waxhj=dXE8xstt&{SS7e{Yi3!E2B>Sff?>qXnMqWzy6YV4&_Zx-9{28Nha)fV|3BPl0^=$=hX~l4a^sVArQqaY*w0ksGg%0itMOgA; zUi<6|dcHnw!~7pa97_sAVYMW~-7x^3kmP!v@V?j2Ge|2`SELDzR({JdZ}A13Vhg~l z6!=klw_iFw!cZMh+|E;jIh&$l1f`a5(#b~o_rIgU?UYK<3azBO`we!^y?Q&+Gn_a-IQE8Y=8x>5>rjcf6o95imKYK5`zX##U=sK_i zbE8^Jq^jYQPTE8GapVU{0Sp%`10laER_Rf^uK6a%6UaV2Ok_Ba?==Q@$lH{$rOg%NzYzg z$_2J4B?glN_6P@8b@yw)QY*tFbnZX`o4w^~(xB=x^O=J8e%73)k(6 zyZjUpB<_MnZJ@hRr(ThqU$f|tx*E6{SoXjR^v8OHsT^%qIjL7vX|c_zi0FUZ;(Hcm z`9cTnD5NFw5DeqO-JcR9K3LiD)e9)x{T)=j&gv*I{9CHTeLXxW>R=ZQY$SD-=xdg~70n zyWX#Fu5DyU5#NMaFNYaW+`KM!Xx(ojhJ7}xmKL=`mF0fK1R9U!@eKpbhs2F)xiC%g zdlt;bFL57kykxtyTqi={W#1J#P82gSFHX|8J?~c>6E+Wo2Zs@Rj|#a{tMwrAh!m9x zrL092ex0q=+tj97pxS3p0YRmUQU&m$f;Ia?QV_-oCq~Wg$J_~y3sEEUdJA`vIRCYm zpjkfb-5!F@3bk{yW&bVnx z?#BvW&FV$HnIc2GC!Ndox#b+V1D_R!x2PdCmbFvS3D)%?y`8JI7B0ep7d{AoX6Px& ztFph%+ULpo$mp9??|JC5as;QLYLMTOTBP-m1|}$8I)ET!1Dft9N3|2K1rO5cv%44p zSl$oKoXD8_lgG-9O{m)lNMF~n((49jp-I$$KU^tnn$Ds6oDvL83{>ON|A^K04o`Ag zxw}v>#7eIyHC?Zi?~w^6g^voI-1WCOGUgcZ-o`9XCu@%WQ64^aN3QH9(F@UaXsx^0 z*9WHQ`qa=ZhdV#SjVB4f#w(~wBkGh&S=e*l=0v~LLLWCTa&)k`l<+2P)Oqxw>{qy@ znS~Wm^#LnEtCKk;_8@XXL@SpKE^+b#8|*H0*S1;(3{loRm-$ULoj4^c0U;DA3y&vb zU?3g1^WlEG=MBw>*!lmku85^sd%4BE4!E#Idp-*C^iaF*&I%N-0>Y%Yp<>rYFcK`J zZ4ox7e@}8@HNM#=iyMVyc4(NxpH1(y7kd9EQg*QQ4Av~;MSFtL3pFrBw#jRg6Oz}Yw%T&MrI&xB4M3Kk;nd1}4cBv?CTI{nFpWlCt11fnx| zM9Xul0(sg}yp5(sMFAchFvnw}VHl&F01cF3y?*6vc|IPe%DH#azc7kq8^KuVWaY;ZzlO=(R@j)^|_c!~)~Aj&<02zbK?1YU8amirsjgn~tiu%kJ~ zUs!NG0wx;RxYD8R(p9tXj)+7YQoX5WVEW?5WdV2e<7=8|sR!1JE@HOIsGW@4lZTE4 zIVzc-@A{E|XdP}+%^8+rcmECUbc5Ln(OfZobWJBNXnmqLebvvgtH(Sc%AR;rnX>-# zJiVe?4t%J?wvB`ng;kX(X}*j$S*2~gQzXk(f-nZhq_$pX_-|HB7r?3Lp!#j2Q6*v$^6vCI>pGSfH)AMDf;#q>>&Oo;r(VER z`;+a%_2bQ4+zlbpN+S}J#G)cOjG}J}M1Sr~VzNJy{PGi<qQ-A-jtpUpXpKubn67XSBQFK<%<(up99MGEde7(P>Axl_v#4Eto|6h9c=OVpEmuqs~ij;*ECB6U%Mq|Y4S8N`j zkRM&w^DGu8UwaR77ig&-wj}E`>PaHNI*GF~>mYEs9jI^yunV{b18~{Qo@Us%VTQi( zR|_4++V(jJqdu(m{8cHjZ6^^&EGfvZCC+N%kLJ9JY4_{8y&6=ElxzJ+PneL-!(-=@ zGq%m5HH~1E2g8YXpP_oU`&lFL)R)j|RxNo*S(;9=k(;l>HSane|UY(ZdE;GtM5mM@qWwVgLaY?E0liB@3{?x93|7uv}7VK zPC9Vo--tp)uLS#OZMT7f^4u7tw2+^0>1X)Et}ud2mqpjiM~%i5=%r$*O`E00T&vm7 zZ8Z+s0BImjvh;nn3li`Z3er-R-iEG15L+u~_X1mhLjhr71ZbZhNitGrKcCSSd_u=~ z(3gIx6-1jA<3bIBQbE_52yMP)#%I;Y@A@+Hltq<%uwUN5^?A8qVGkc%5RYQf zWeh=B{x4tIcgzLxZ9*KNq$T1o=E4A5@fcC`%l5KO+1S3PW(?#w6Wlm7!HpuOfVl<@TmjB<5@GkXz z71~E4z7$Zf+@;DY8bZ;%hV(w&Z;B3zyAYq6Fkf3!ejaLmB4S~~@v5=_4I5QA3|iG+ zVucyo$^u_p5(}>!ysC50E##bszLQp<1qPNQEJ4p*GH+d=8w78@5sI}wx&rwTcVxUNR5#UjoW z*36*wPow-1*OjbP5MM@LEBy08WimgjF&<9Dhx*lFoa6pA+kkRy^u~7B+VA$n1`q$B z5*Goy<@b-(SnL_E`7`>u>bKjGcMFB+4oDL+FKb)m)(?;<-7keS8;qTzBV;SL9eMe< zf?qgLuUlyARkZMrW2M&h=>T)BL=NpxZ@uxacwGfh?jXi~r>u?YZEm?dmLO--R*8zu zU=gD0hS!uY(DoGxO#y|$Y|3s8QRxUGNCGXmq^e>NTLDuz6c{?OSOGYHxNt&%S+rgS zr&QUce3txv?hQLr54LAE;!?!>jn4%)%)DkE2_>*h>tm-bZu)kfqO|gPHM6UZ7HP)( zgDq|Qz2PXsUiXdZ>vc~h1GIrHh29_9f<>uNwyF|5bxQ-!cg)_J16MRIsw|)*ukN`Z zEZxH#Rrc`>#(au+Bg2)}{qvOw$th8!aesjK=0A%NOsfzFAW+SGvUCg>JKovmV{`Da zqPY)JBjOa*Hr*5|1E2#jsmke$*0Z46J46=1;bn(p-p2BN!JV&GV6C`|;mE^MJ8eE& z!fG`_;3hc5>)LSSL?Z;iD8bo&Aeqq;#&px>(c~lM?FFy%$#=hFeVov{eJKi^9T2}c zPjEhW5;v;DkI>w~I+9K3q59tZb&5Tw;RBq7{ygE) z*vSC&g@{2K{9J(&=P^J9zl^kLVj?dbXs#1hSj%`dEiGT+(#N;(;Ev4wf%&%TRPZzJRwqx1G4{#r6MmtZrW<}#{x@J^^3;%C3jChz_^swlUeY1jU` zWkgaRYd^Tr{Xa3?T7cVHS+ikt@h+D#bLCj0iEvIJa^nU)5I>_QNBTaCO9h7--no|QO&xC9A)Z{|uEA&&8d@M$&2vG{>7)(f z=|~(OB3jb*P3BP*)E8Hb=3X1{^clqWwiehCv*kZofAKF`JPu&fKQZTSUOC+7%;Gr4 z)g(xcSel&;C&uyB=b*~Q(CR--=89W8Lmt-tqZ%7P3L%lV-OQ?hr@ibQ zQ;S^qW|y=+8>tr?obvILEbic~R7RNjQX+W#E&3;mjn%B`!Bag>0?AzaFh>e>HSLsIeLbu!f+ zAOUARe%om7nYL(CO>TlqQ_N zCm9NB9=pH7hw6Ha0fRI!=E#4?XbKYIn6JgFBZAMCf!<4;Q+22^(2j;RH~Jh#8JJqD zAuvRmp^axF@#^vbM(qzj41zIVOgRj5$X$!q0deiwQ6Y}R%`h{^h$3SBmK*vI*xl;x z0u@lqy#Gxdc21DQ%Sk{a?X1TvljE|lmV>Tzqm=4ND0axe&=kbEuFBc7r!{A?SxVYh zq}q2|2tvRi7DpTqXR-uq4-8Nt4cITPbp>~~9XlHRINr{#`XeKjJQ~dwc<9Tc_Dqn< z1v8nFbgLi^*zx60GWn~ouw&~G5{MwUOkeu514lgsLzh|2piX;D~F zi@qmR!^C&c-%1XDiMU zw;l7rA-j}$xXKOXI(ULhoB`NNNz?7E0<2W|4{6<3p~|3J6zNK^AGvG$1wTiuR-$0R z%*OL=aMqGa7yh6#4T0+ohmLy3eA_~X?Ii+XIOi+^zY&rby8;;g z`fpFVOKo~2X({DFQD<6@nH1$)F=3)nq=;H(^e3*HrF$6C%R%p^#7;g4rWm4-j@n++ ziXum79=Gy^KOMOl2_#-UCUd_K(D-wfgvv*F>%bIT9W|lhL@9hUhl@+XV>A@rPOFbs$A-``%MsM+fk`n~|6ss?px7AgjY~LK zsgEhL%z^n|ZXa$*J^`DM=W$eNh|ve84?(|jNRW6e@3pUeG(WM8X7W3?is`^A?nf7K z?os8e58Q>2-{1dS;Z~+9mMJ11O&$WIVvd)^kagnCJ}irqZah6p%k?DQ3wu?-PqK9> zSB#k}wH~FkwaDAcps_M@7r3@2+J!K4>|As9!qqgAIr&?HN{4O)!Z-c+KwBa$md?o6 zE@U~mFD z1g*Jet-e={{_lx~-SwRgY;*P5*5?N~ED$l!4Tg$dPw^aW9r-yHW;UiQ-NNb7dK)(Y z&mWCg%3UWSBf{??-Km#mAt{qj*lBlLKm0bqI#6jdi)L9m`bg`1b6e8X7$tZTb-{_% zkGYPwszgKriEzPN2mV-)AC7KdswzccyZjxXxU{d3D#etcC|ca>Gb38J4t4>M;Ks00 zSm7OEJ$^#nX)b|8>LO5&;i_vtb-c}L^b@tx9OFN6OWE7gAR-st$SA4B1;VuD$^sTT zcToLxkY(rGKf|cwl+>A0TGYC=6sZG+0j}>QQh5#LJSB%Vov=(xCln`H>AwM_?*+CA ze2F$e^vvt6-&tiNySr# z@^jEi{ZD&Pj7KgnCpKKQFoi=(EKO_#@xlwh4GlF=Z3as4udbSV@2oFmKUl^}5{deP z2s}OS9w@6Kb~d39oRz13RjK*EnB)cSMg<|gF zzfxgqJJ@MH;J9NaZ4;{4{XNuozmrkIsDg)-S40_#9rhVR{xSAiJ4n}7Oh;!%nwK_1H~ zr`WMC0KV0TGDBy4ekf%5y~f6LpXp%9Stw zTI2*IkUCn0$~fsanjjg(#V~p?6ObP&ddXO|?hWyBGs^}FkXv*fHDvro{hx^{CH#Gm zYn>-6CIaFF0fuzz6=-?{#cE;QJ_Z5P<~qx* z#3I;g0HD(sOM^b@(UHKvBNeAoEUJjV4%AfsyMgFz*Xls=w<|Ev&@I9|cU+I_`+B24Eji7EDCx>; zaDIhvY_yS9+DTv}FVisFt4_&=mtA(-aw{|Z{pf4_h_<;R^^mm|oS-MUe^F{0L?(OA zACzF^z@QA6;;XVAhn;S#Xjf|iRr{J&DHQ@N#5vPBL*gVgm=&~?upuF}mT6A~jf8&u z!`Q-9ixNVW6G!SKT2)w1hwKLbmwZMuu6<9jLDV5*z2v~@|Ik=4`Af&{t(Bf^0d zS@9Zwe!7|w90nXJM15Z$GDaYTUWjR=FuG8;pr+~{sGTA!?w}y-XZwL~qadLghJ-&a z7ykZ!F@$^`)lqZk;4#H5+B{Kgl&#}PHc<-lfvKQ-hq9>GShJL;3l(f;e=VM$dtZ1f*C9&wu9o?>eL^nwckJaJNQy}nhKgG|iq z9wo=Igg==WC-tLxL4m$wKPuDGs&dKRf}0J^BHvC5P`!|Oyz*05V6-3MA6n6R-lu69YZ&g`Uy?LAocGF~BXcivlylePd{(8?9@DQ%yF#M0@}N zr3nJ5tKJyRC7l-|cPnS7*rpqLZQyhSr0qRu>O&lrrE!C`ByyP~IpCVMMg|-Dn3uk& zp#buE!rf+`wv5FxmAnuh0WUwfy2U@yJs&$_eU~!KaT3)&!d2q!JB-4C%qA4QOKs6r zENaU`<#SVnQ>$fwyG|02&}}RzIBh=Md^a(L6nb`j1)c?T7_~fLM-@8GUWL=jcP}Hn z?o4XUxeDUHZ$}CN44Ot5hE5S_VPNG)NR*e9HFf`m)Of%gA8}eZ{U_1ZZVi(UWHG6O zd)X?w-=f*l8*WgJAh)g}a`22S+NW9mg~(94oUUT#LsLPW>e2msb7_B$P$zuLE@rrN z?@2yg9~znVs3^Y=0eu{c6t?FcFeSpN;2f(#KYx7bTY;98LK1yOXQ6NMO>Iib+t%8! zD^ZAOP>$}4{8{&X$7H+))ZPK-an@x23pTUR7erATnkKU1QUm)s5q)9VAMPtI-!P%8 z0I$y^{Lp|@xR|PBRg=P4g`6B#GE{6)3qY--9ZUu{ri~@o{dLev|G{0gi;7U2#@`QS z`PuyP80BC171-ReDID3Bv`_TAnK=bJ&f!btb6BBSl?owS_ zO_C_xeXlK;tbRY6VeKHp!2<{nyQH<4;6m}gFZINYG&wAwi~4*@&pzI;@<%Y7R!W1^ZpZ;?npe1mwW>UCsgsI$;#SmtBDo_MDG;Q{iFwzOud=1uP)F zWcIJXGLe57=13c=mclkoQr|x&!MGI&uLpZ)->L%&Tf>3w_fMAq0z5GGY!j94U^vVA zf!+|@XN_>OZ0J}dW?>19N zjFC+r761b&Vq_VHV8xG=tyfyrcwZ2CcqQj~@}3E=h*bGouYVV2mEVZ4M{ise}qmN zq~Y&2c<~M9L>P?~T=zU-;sVzs_TP|wImvOg>WC%1yY5xayTV(ek}z_ZRNDmEuDs$! zIA0>(>55{tmddlTCZVL>b2Cm5T7#!~TmlHu<~%_yS>nwi=`;B)^PAkCEp6&*PR z7kxf}ta?W)IankiSI)g_)&jUEV?JS#cX6)D7%qwK+3Z(xPj3TSni!bSnSF6(zZ-8; zrVW|K?JzWu@K}&9Cd#SM<&$c(z~Ea$L~&|`NSmHY;Pgw(t@OJ)du9e$3bEVjOfL*) z=A0mZLgZC<(qhd|!O@*-9h@;qZ@f*C{M~WAB9QzjnHgdbUk zwtEJ~Nw${ODzZ(y7N@Z0Of;g-UP1R!{uY|k7C&DN_R1pwF?4%BoiWz@DT{}!E7 zHuIB6J^aWJV%&==03Bts)OfUjj=+aMR1<07a4}vyT=Vrx#LGpd632arV(=+6*fRmx zYt^}Vlnm(rBvm?9aO67+_AiSXm&BQaM)MG5rrt4cInSvkSloLNQ|* zz*FG9=1&Q|r2I)UWOlcxJz-!;^Z~j1d1_i?!e9C8yF#QXAQ{UWSSDuMrfL|wJ0ugW zr!)|o!$_=nkegM{q*y%zzs|w|txr2mJ?TKekLP#|F>uGri_3ND-eQE3n@%KwL9Pn1 z@_g%4VZwm*hnYe6UK2G_U*X8nm3Q!ZtVJx4XkP-D-@vAFAjjX;4*1WhbN*vK!eRp$ ztr{DX_=BF2BIav8wi$@fAzGXlm&dMS?$QA-tkfD$?wSY>NI z$9IJ&s*{1V=QVb*?(K)%6VOH;9xjV+8|-Z6UV9qu7osg``ad>{(>qBNcE13QPqUYy zhlNAB!c6r#YDlqn<8L^8SY^3c4&^e8cYcq`r3$)>ER^B(G#>!fe(Xi1*<3EN+vNed zV(+x}WecLhVZIqMs@D4x)#S7%WN)jO5R7;gcC(tBXSnbP5#`rzm9j=61ld7cPmaaE zn~@z%<2w|tJB=Gtb>EFVr~j<9Sc?7;4`=*2n9+?y-vH!FvC(HlAswAy@CRn3k+Qnh zT^ZL5Z6Om^n?Ob=Q)1I3y2@jou?t82f9QrtN*jWyq>|9CC&RH|KodDu22h^k3mV^b zPDk(mFe*4rh;jf!Ukw%KefaJKf*kuxcOu`nG$RiNe~(#fMIKr{l2$w#Txh^MtwHuC zHb1#Qo0gFb1WId5c5j0ZEU)FdL=36WyFB~g6F<<)555YO*eADb?!XZ#jA%isu25P z?mVX!WJ^vYRgH8j1Bw!8655sD0|aOp|E{3qC12$X2*C(6pjq)A%EVT z7*^yk1g`RQ*cE^8k-yF3Z*BmRk27uh^{P}!v8&RDWLZGEhm5l>{Q2;`ri7F6aT z;qdb1p1mc8SP4L7szp*0&1$gn$}Cidaql9lupo60LcA-iW<(7+na3=ZSigJ z@y9bZSsrubI%@+csik9PJhxC^(Y7;!6d}OcCbV3q8`gQw5qmW+SV+dZM8lX#4pBV~ z*2_$Eboc1|ZENaWIyGZfJ~&qS?gey>L>_VU*USXM10`O0z6)676S_my=7imG!vx$>6C_|YN(En4{EKmcv zOjfkNK83n6yoVhWNAi@7E!}6ei9`P!BpRcB{ScC^SlS1fwhZgh`ors`Q@EEe(P7d+ z`cR6D4nL!oOB}D(q<06^;rD1n_U&U?FA#&p;Q@%1O-Qa#*%*B`n@tF9*q<)CxY^P8 zZaR3P_=#EJ;fJio^pL?6Q9Q@m2I|}Z&H+oucvauXO$n`UK74#YY%qF*+z)~CX@VGK z?eY|2zd_tr?3^g&mK~UTKMgO2lcnPD{h1I7nihy{}b}saxaCRJ{GE=;Pjm0XI zXpkD0U{aU_r*<84j?8}5kPw%m54c~31SU`cCW#!@CmR6@j!o>K@TK8@#}(hts(tQx zi#jA#dTs(Y4|(yk5w5G}m!G&o(m)sou(xvhF^PZ;^*{CMF@BRU{mx%WKHuJ-JSkir z&oh(grSzY7t;#|nRaEPYXx*u*j&zb1}OmV18Xes?5wu<_XYE5CcTJ2 zmcSSZHEfx9>7(rAFFIrC-d(buZ0#{l)YP+CpYiN7g~3yB7+%1?7`aayR27rsO+|}v zial!2sBA$Qq)KDy5?`B45W!y(5ry5)J!aO_Eswx&=4u-0t^DrKgEc(UJBOLI+=p$K zoW)A7enx~d`#h>Qw1P*MM1W%>3jG1s7&-s3-3j5$)_0dV?1O7xc&p}6Y^And3mRAn z+KX_@joM|PU%rt*oq?&95S__&f|5(_!lQ2S5j0s>s*Y%vjAmcjblmStC-63&)+$Dg z%n3Z6E7;0*tu^ORKz^6|6zYppH9tmuLcS1(JgTU!YQJI`x-~tsg6@G`iZZOWY=Q;( zgms4-+Z%KVq~y_ycozDka2%Tgs{pBMci7vE%%216lneJ^`)OH!N9T+NTdzbf#wv$+ zw~E#>;}Hp@&AlMm0a;uqb?uFs5Ym^HVf2ah)@Bc5QT;w1aG7&sDRzmavgC&Xsx!0y zUV_M7T=LClB-*lvX^H~6NH?=fJ8g(({Nz@%>H9K%DRF9l>qB*Odp=bWgYoiXOwVCi zy42i`OYbvLrFGGtEnVs3WV?&z_k{aP^Rl3AeJ? z6)s;v&a-E+Aj>MHDnujR>hf!-6UT>Y_TWVxkmpqwBq^mtXLyt`)+VfU5tSg7A>X7c- zv6A$$Q9z3}vtMZSD)9@jz|dAc^tx_6I$TCpN6#MVu|+4z*QM(vg5J~#_2$nEo-=0M zjJcn5u#Zd42IaLej3E+O4~~4#vpLe9=&Ld$rdHJC*}4AAT&VQ`#{)l`0}g|OY>IH1 zv<*-zWoq4tH+goC>3O$5Y}n;q4xi^zoKK)Ip}&cpZXij+4;wd@fpQMiDnWacaP#EC zO^vK&SWqSx@B$X~=1&JLy+D!?c*AC9V_4PVecfKgakZ!;g)m2}FVyKTRAC1`44zA+7tpV;kbN>24~K+iCet%Z?_^IX#&BdbQ|dvY zI>D8mDeT4ta+CGh&9N*p0b-6@A)iA0*p`WM%b%ymg_E=#o;CQYY(>pz523gkcr@& zqOF|*Z;eh5L}|UxcZ1sP{#%OVp&*a90c&|ca8-FjUC;8_a& zVt1POeMXDJsyRobT(49rixba=44_S1bVhob(1hOO8?%PD5UbVN-B-n=e8L6T5^yt< z+}Mc}zsCX?j&MS(t?YVAx2q&9gD~eAA^}=*Wbz$XfzU(w?YzE5zd{MP1Vj2es?LHD z6=xAwa~~-Ld|Jlt5`Z>!^m@|N4LEzdC4PmVW4Fk`uAz1)%}tBsY19nq?|_)Bha*eM zREkAs2ea(%9RN(7fg|(WdA? zqn$|9$!KYc(G=Y}{DKosO6|9XYj70}otCUyVWX z#I4lw9>$@OL*LP+CO|UF=MZx`Z!ilL&j2;V7`%_ycw6mnl}1tx3!Le`E?dG17xLE& zR)jy6qD3$Ql+LCv_AY@0(M&;Kvwa^$Cd(;a%oige-JOt8@-Oc6p)O7Q@g4TrPwvQ+ zBjW`QG#T>igYsR~-@7fRT!|Y^LF_&S3afYH1u@+KNI33}y6heOuv(@IZJ8SdZkW_A z2AM~xC6qv*PqaT?jDZUEL3lVvLd)y}bfY}61Ik};eP>mFZB+Xgzh_m)UV4d@_my+@ zE3PkGL{-Cfw~(qCVqGs7cbw2#gOzv@1=|%@ZYEf4o3e#c--Z2In?GJ0O#WTsmL}qO z(vamKk{h|Q8NPQosNzG@g8Higz%#3R!hQ^!xzY)d?Y(3n8JElvKuq%@pW?w#3nu=V zpG|8?HrMH9*mufTW$h$O6dW`_{un$yDd2!`JHJ`O>j=0!_700)X7Iz22sL-E+U37E8n_1T9q}N+%c|k ztVKDy{wM4e2*ytFJP3pCls_*W$2bFMp^pKeYot$bOal4(^`L$v7&^lB#BMuwCh%pm zhWFn`nELwdC&Hk`zIV8+2ZQ-;AWfa$2`nAuMExuDMOYPKsu38#SjoZ4$P)ymbsFU` zP~LNTKq?S78iU=3_f`d)YjQZbdM4%Y?l- z(`PaI9O?pPoVhZxUY?7~9K)Y>i-%(^SV88<8>!ae4@TfgAxe|>w3rsqfq;;g%yO~g zUX(_@lotq%ccx_#ZRGebiKD?&4=wU+&iy;C#{)P}z7u;7FaP1Ce^c0Taf#-14$%ujo!9ueqILET2^ zMhkhq@kL(_%JbC%&eP#Fv7An)#V&HkCR=Z32);N!8QRQZtSSeXgaW;NiLhq03+|yS z^`i;7dpGfCz(pv_J#tHL-;0c6GY*QD`gwsE1C`Vf&;Y{8m&YH7s;X!+0f2#lR20i% zFBK`9$7>9J&g*lD{v!m*GxOhqO*}olE$$-Jnd#h?v>qi?BGE?Yir19$HPbIQxDigI zL}ZK5Pg2R1FVow1F0?r49f+-Duqo7AjWJQ@ zWM0u&@p_eA4)WcV(0LKE-OAfxQ0^Y379~#-)75wb6BlH;7*JNeRw-DVl;1WDeswi? zn8E+f3s?W2Fu^!rIj|m@ko>Y|g4>22es-Nya^&TpJCcf4H752M>?>zc`F*hp%Ng<- zVR#~y97-+|^u|2l1EhzSCsu>MR!Si6jPT53j=jOPp;B=_D;t#?VOWCB?4BlfI9!2$ zr(1_imNQw321I4^)`9X7weltxO#Q8=m)M5rY+)D#v|uO2?-hhlttdNmQ)Eo205}U= z&2zkzj*mr?Wa-^x;nME*oKf_o9+My_%!ZFFP2Dbk+X1YH_K39Eh2v|w?AA@pAlI@LUk;uGQJZ5RrCx2;b+!s6E9^ze9WEfjM9ejcRwq?TFB<>hIP>t*N95Mhh{A zD0rrRgxUdN_}=vQ68eDWozsl~I@rBH2Jqz|wGFL^D^f6}SNzbF@ya;t0|T@EAU7Lv z)inT)ud{zdop~&~65%ZpQw~k2T z{u=+`8Z4bIn39xRcTL70Wu{2Is>6OzvT6r0^P_lZ@p{EHiM4XTS^$3*Vq6TGTJp+8 z>I!^Cg|h$GjYO?6qZ9q|J&AwvXA(Bc4-F>bCk&{m@Sa2To3*7eJ5UlUCKupub+=gB zL4o-F6Jt^HEalK$5akPq(f22&nR5fQ^%W~Kr@uY8E#R zL_lH+9mip1FTAVh$KXG>tz9`D`eJwy1VAoKPBu#ni-hK1`07J8zGgl4LiR8m{p?X z9F+l5B1)@;8v}2$?Qjj_z?&2P?{27!;YEhAoV?if-J0pNqy}qvs(xdK^M?S;vlwS$ zWiH3b8F!LDmW6@=N!iC*EFZ_)%z74nAfITS$^(pZUMuKXYyO{1H>SE#bvT!$GcVND zUQY^ov_Rt`m^(ud3G=2s)c;jLuz^k>p1x}prbA2AZB|nf9512IGr69H8@tVMJ1tv5 zV@3@(Gz=j`gWIF7x?R%^IJ@J7!1fB#u(&DN3%y8DNn~&)k?jTt3>&eIys7eykxZ?g z5S)oZm-FVlLHkXTJ3OWXuY}ZSdnAD+k7ioaeM_G?cj4E<6so{tgMD8rMi)M4$`c5j z)~L}is((@O-4u24Hj+!v?)y_-$E7RTmoyFBuygPOzS06&O-UW z0JM{Cn+=s1yNIVIaXL7=Gc5u!gaZD9Y@{eDgQWHu6U!TfKAc_6y_pjZG70y%CXQ^D zXzO?~RqFd}iP|Jo1BB3&-y+5vlP z!=92naR7Vj-kTj*74ehAx!=IcLK|S&Yn}7H2D^4#WTAraY;+Y&wAZT9Gb*}pm3d() zT6fwV5BN@qyHF64XK1>;h)TV*hh2&SMNewIqBLUnDr6*Z4mqcEe_D3R&E(6R)+K6z z;FL^uL)KRNKNj2OQ8|~=<3^O$8Lm`bJ-hNIU2ChU&9wvT3QHg-F9EAM_3$yFYt>xB zGx?bqX`^X0I6gs)4GvE#cR@m?hFoDJuZJxcw+tR!b%C|HC8izGO+M94d53?W{+Vi? zqfSbIFDM2^y3ebci`} zViPZY`+7nvv<3|it9x)!J=QacUL;I5ZVs5Oc3+?M0e?l(H z$|vD1)KAm>w)D0Qd4sKn6_PKZ?3!CD&fG~VHo6+m2Mpn+G_-HEOA^xfUkP~vm491- zE9j)v+GB-rWaOc{3?Y3TW{8z5&cATD1kA^!H1w1%xwdrpXdh&^?C&~YTvcex6B!xBM5GyJ+JXni$)Q2X!7lomAjiw2G-E94IaH_Tbrj79Fw@U;z zk#AgilWJ1Ze_EiYU7j@KyY5eAFl%2VvQS7ae3zk)7|Oome1plJd|L+V~6YU^jE>d#@I_g+9Va36*T0+oW zy@ru~yvY?b^H5&A7wgZt;oSbRzgtTuX>V|;m%L#1$Ip_(>PU59mY+$sEz+D1Y;Vuo&lVjK^FQQXgcKN<%QODX z0Ywf9v26@*5RxbZ_nDG_ht;HvcF5I>>T+;_A*FUIUEkrzn^ZZ9&giQylFtmV_8Edq zw|HIw??V@%`V;M;&FS~8p=Jq^FENZ!3@yQx%n(KIPXJkzgc#){KYY;_(6Z;`VIRT> zz;eb8<b+HTs0BLcYHy_Im{7nys$&;AR1IEMfLQ=S^2h zHB)BIPe*<2I+j(u&G4bSu{tLJ>Q3KzDnW)8|kcAiBt+HLgV%V=g>_f9lpZ z|8_AgJ3E^wAOHUpo}2Pm^r@U8Il*hh|J@vn#ydM@8X3%weNoMRF|7<_+P$Z0C)7*2 z{!{g?;7_UPpkc{GaRQ~kE)^2swSUJ86ETTsLvH@z4TCldC3!MsABi%;!*luIDR7%a z*4^+vTzs;b05X|@0gx;87T>LJP zUWyEvO-a0MPT34_m>Ka^{4mT^4$l9GRKg8U-h}hNbB>wHCf)A@@^t|T_vW+2>%2!d z+w3|>NMYk}ZnDV7n;b9vd%?5VWRAxEeo=`6)Z2$vEA4W2(iiyenhTF3P~-MWGRVCO z?6=v9X}x$Zrzq=eUC!ck)FE3&1%hge9rX!-4~UCGOjY;6jh$EBxs2@eyMM#YBZC*MY~|e*G(Xx*KfpCgC$eyfx$@r>L^y7-u4^Zx z@R#!GcE$uzS= zeboi@2e?obOF+x%Q44z%?IM7*tXH;;%-NLR^&tbOOmSf6#3f`@bCS5mIHib`B4fgTpV2G7S}P;Wi{RaO>JSF|llNhbeo@YZ^CsJ%W2^V#i*&4?yacv=lO^JNmZbj{ z=sS-XhefyO8E6G-`I6*H_6H^SE(o?m5uX)5Qv-klSI0inFZ~Eq$GzWngUR0@$3@r} z<*jks7i~smB%zxRT>bB^L^QQX3jFy5fkHW3be{g5_)ro;k|aL?3X)_L1l@_C1_q}| z#*=1HsT)4N9Z|#7hb%jxQSsG5bTUZDiOEwH{u<~EBfZD<;#P*W2#+sUv z!EPg!F044pMSB!!xzu?S43kj&4$cP>(;w%pn?mpVTyiGeTmDV1oIq?eScMb@lJir6 z@|qkA!_&&twek;;^MV7Z4GEbRi$ehD1gA3K!}o`bX@%y=N|}4E2>cUCY{94ZVO`L( z8Y^#t;LjwsM~!EBq#IOF{ght*yAA0Acb|u{(=DbK)k(jbZzzHlfgGF>LJzDtE2*r| zMI%!y_x_W&NAd_aax&PYYZrtpT2JJU3$$r=ccL^l?%IzP*(snqpAztqe&l8g3M=VF z>6pLBGdlLBEwoWu*u2wwNH9JTzC)Ej*5fW$Q069){YC624i15sUv0Ame0`uJWbmf} zNlX5o6D`7VZ}%51*t!&=9k8eH3O}2(>p2mGpRk(x%TflGbGmDfWMd6CcLPZOzsHp& z&TF*mMv?QQ8Z>M&`#Dh(y$Zd-@^sa450V5{Ps2sx%rlCWSZ-gwRDeh3lIdW{rtL74 z9@S&CUZ6FDPc%Z_5!~X|1bCPWg0cj_nj@jG!w6E>l$C%igRsr=$v1n+modJvJn`7} zwOCvNl?`|bb0c!QU(88D69;cR6;Z=!hd6BQrU-&WMy+N~4wbq2E@~Cm4~Ca` z-#Nrry@{=eRfn)UpbS%&mutJup=iAB$Z(J)DZ!_M`1)6e0=Himq+}91r=}Y7@PRIO zGZ0F-Nd8YwNkb$~6BHLd={stloN&j;yqPIqZ20@JPe18{rK4-)ugwu`-9dDs@Be)U zF+EB=1vw8j$#;tjDqQPNA7l_)xmPILFh(`0L=6+H_z!CwVM|44uhKg#Pztjr4J(%=~EKY6DS6M31#T^ZS_C< zur!a?I4D{WSYGA5PGm@&U|XtHvlr_u3dwpPWCC*#q5_4 zQ?#fo-T+~08wa-_rM4ZH+Dg1?GQFAZSz;p6VQe%SJcaTxPNc(@abj}@D_CqseQck| z6;vp9AL8rA^XG8S8uW`gCFAiWaj-BzGI{e2^~hlc2QK#64#(m8*?Dqg7nbdl>C1RhZ5sM|?S2?%=*@p(~G=R%YyYvSTHH*zU2 zb@@XKY_biK&5qMzK4>)#IV^F{+{f|>T$0dA_b^)G6j}d3V%?pE5PeaD@Dw5Y=w>SR zvHpt$6<n!2Lb*@W#DzFVZ3?oop;)^h6tMWql z{L{lyq0a;hS^a>dKPGYOybjvnI}!Y*NR|Qn@`o*0uMcg1gZShM^zR?7#%>n_!3w<` z89^E;)T#PAc}%TfaFwF zuEDS2f8)Ej#I)p~BnC>wu$6R>l~~)d$E)pCgb?E2{oU<_o$Vh=4=;c@hTO{{ znI~SkbuUc>w~Udxkl>_R524fWaan~tan=4qOuv$Y4uyaM#@wuh5p@1n;1DbU<`hoy z%rU*)shtCI^;68A$bBiySn;8JmOi=Wwcm4vp5H?1k>PoCjokA8{f z$x3~&CS}$8 zjfk{4IM6A)q(ShLlm=rP7eCMiGh_GO6i&^ay2?9&I_Oo7%^`8FX3;9pgUl!WlOh8I z7UgLGM?kp0d(KGAtWf766c^P2XXN3XYCDvYq5D97${(U+Kp!B^>0)WE>Elblu06XrF=$Lb#m6xP(r~9r~Ka32=2c-Da=Lghx)NrzQXGS|$0;a1I>X_8hD4Q>U7Rq7O zssv2RsjDx^@v%E#aFnjpDv9?RciBal5=X*k2Kca?EC;Qj67&ZaPGn>Io7!IF>~=gl z;Cb%L~XKQeg%b@siiWn)5rKhSNK=Nqy>` zdVrtTVzOYX3ccsq@||@CUFKrFC*!sClJB1`jvBa)Zl8Us-_Gk?nh3y5I40TQdr7$>wYLqx)x} ziMeSUwc8GL-}2R3MXG2INHPdF5l!@$H^bY2P@EcHvL^fakXO zq54BL1e^_%cphqO_59Aa#%06ERxfQ^>7!@fH;}bSyhS4FUw1ev0?c@RE;;d%tUF9U zAHMNNJGLtFd^@{~>3idyH>n&~=Xpj0E6BmPtd87}+RX`0)iodL2%a=;gwvuE09rMN zP7#9{?NoBWA|kLgAzP0vx{0B`XUQb4w9d8b%Z}GK-FA0^BAdnzc2w1e@l3$QAt}B^ zdcwDr}erQGv-=o`=G7cZG-{I5>2@MN9OXbMnm#K5v}hB2Ni8x z+$n|sj*6)o;TcqrWieOINSev@F3Y{v+BHxVY$E_K*u}9Pb;21X-?o{wqJ=>)n+ruJ zjjgC9B>@|S%(fz~K7ZsY1)N)ii-4)nbhOK~2o*Fnv_fxlI@yB}vgcZYzIcHf{!0WG z%pkfLEqM^Xk2Rera`OblK;=_{^G-LB{K&b~9K53>#`6a9a?mM}a2tZYU-f%jn-ZpP z2#!At6;jfSiSQ^P89ddGFQEGY*V+>y&xrp`nbs%(gvwjnz)Qgs#n^6<+@&Sohk5tl zilV~)obIShy8Y)LL}F)M%6;KsMtab)VyxF9Ew`0N55-xC#jeCnaoRS9HmUyWF-e^i z)Zg}(ke!yeVs{8+e_j(rAw^tE7EA}KNb)STfj_+le!1sXolG}GFSEduvd=7`I{lR1etM@YX;;IX6}oi8ob>L&6BJ(W!S zFd*JqXHsXvn#4tBwJ^t&uj2gJdV;jOTF*JV}nuC~%oplV(FBlk<;6wyc ztt@!R{KhjS6;1Y|z6u((6vII0)hSQl{oy2kF8_FLwfH?6WfT@az0R|jDk{Rp9N&Y3 zgk>`1L(+RTEF6K~Wb26)uRhMqCm2VLxGK&`O-^~R66DnpWy2pVMLxm5^ZL|=T!CUd z_IK!Sbgi5WfwG0wa_l5Ey3{nc45I+{l5)esfJ5eXu-LU7f<5&nrMIo^M+HM7Zgr}h zE|0fBDcSrr7W{rEf1obSX%e4@!ver z>>9k6Y9e^iY@>yTRa8A~_h6FK1==Jiyi4QBaIGp>JKrGKV?vOuD1~l+nv2&0>k$pZ zzJUu3YHJ(cl+;b^MCiwJihb>B$G+N9B2Zt5u|*06UzC@-Z%K=;k(ltSklbw(ZGUWn zAI1K|mbyuSIGvvCU9@xnc`?9-$pXGkZo@f8zfz$idW16T+36BX53Hda9~UL{NrM=Ivles=&tjF~L5e-EgwJfk zb~EXSz7*bh@(0W~S*3R>iaW*AJJ0!L%~`f)LYfRX;&>+CKMheSbaWUhW9EgS44S zvdSr7N0Ee8;LOaln5m z35m1dP5Q3eP^-C#!vOAMjhY6M`$8?TH=Mh`Mdz7WEIE`ixmioS8kAmX{oM(lxw&w9 zBc8fcQ2aU`Wr3^9SCk6c|DH3!be#|r^#jaBRv?WH?s`G^SZe|G5&Kj~MS%&y`~o-z zxqGOV5hHKy2rzN=Lw=}+*a!jz$C5B*BrZ_B^`EBl2Qo0BrSga-9jQi*j&i1dR4elO z;$^PrU96Up!uE2s^GfNh<^YJGQoh$CMi*wz=@@Ai&;zpYVvD##S^V^a81W@b+jP2Q zA3Lr|LqCl}F}(SMI~icuEWvq|j#4_dG*+}OWEcXKUYwX^YfAtf+KfV6Y&+k%t4VU6 z;4)Bp%{)D|Tbo6fWkfMY66-_?u5kBM`*EAr#wd|EqYA&2M2D)J_Yu^s#S>{RnBM*1 z1}?a)Vf8AT?I3Tk;h=o_AERW6Uu1AC91o*vbyu+){2q|+5)cr_P8(8~v_ch)xYkIc zCThgFy6nup&N;s7Bbh-89D1T>j>rW#!Qwz92D*7g}-miuH68DYy{w98YTNEWj4v_J!cM_K?fjP05g`{RbvcwBE zTts;4IVg{V35nBadPCBrh}m4P7b_cD%hUYX_sXgZQ!W?U=Q`aOT9AD~F5xCehhV#4 zkq%$V3Iu5rWU0+DlVn-(Y)$6D1D0sPzGD+7W&IJd)l;rC$Btjh`#vwIhM^9-waTlC zT&eb))e|dcdn=p|vguM$=@*gC81%~L%o{m|3<@N!LcH_RA)=!8_#OHJ3mpBF;%m9*jVb#Zg6TkOa6+-_%YTy2^sbPC( zJz0jP|->Q6%7uG)|K(B^lSjoDWi66U4^T{JkhqzoblGXK2(fW@Kg4s|HWO%d^(~MOtsdE zVR!vhC=$1{NaC_>M6PZAV))B&o<7QsYNQlEstXD?oc%3c`Ndf=8sd7^oA%TS(h#z( zzFc4$sjaw(JWpD0UfI-c01mV??`k`NuDM)x`(Ii>@PfV;Doe!llSjUFiQ!LIJL4?M z!7xhTE;_kDhe-QVm+k+~0^B6D=<3d}VD{Ch*w*@4miMi6J?AX9-jh%r%MT4<&zX(0M{@&zg@)_q`dPPecJ(IY*PB(`jOHe*s1J>o^=2dAH(Il?$6G9J zsA%n;LA5@ry}wq{K~ZVn-cszhAbFF5j%Jl6ryA#ZvN>4VbWye2a-sJ{|7^j3N0#oV z4k!C54i3o~*ZIbiJ$QM1umi@R22y(IjrTutg~EOoFhS$hal)TXr4(h(Q_u^^P}ZNO zKSC<9)RL|tJc;z=73}bEC=@gNsXoiq87Da`dIn91B)-kJp)~{es z=)+$<yJa=c)zR$+RQ74K5%UtRL>iJjT)FXfI(1khk@mxK458eXcj8za|BdFmt~6D zp*}(mLanR(2jv8z?^P2OM(5$we{p}?XT_R9qqn>RR$4}FccFVd^lOd;NolA`nkUF-;`6{6ZpriwQyUl4kxI9U?{jsPv;hHiNi{p%IaL_=yA$f*Eae z(^j_3UC*a;@1npOGqInizWzG+M;FURQ$Etobz_I>Js`Pwk~e!t&_S@Z8SYMrXt8WS zH-PMXlw595LlQAYz3ca}6aBSn!7S6s67zzG;9{L?bCzGMl?#E-c7Vcx35$)C?pDL^ zy90Jaqy|*2dE5e==$E+Z9ubdh?YstzxB2(%KesLw#f|<4`z zgeSupS-oeX2O5Qpwirx98C=M&AZ2M+^k&DpY)M4|q9Lm|)gflL@=x-L53#kBIxEGr z?z?e zXQ@>q|2X9=OYTq+{C6VJ|3qTdE4ZtTU;lAjRz_OK@;mOePU7-BP9ZQpxZnwsT#9rN)c*D~6g>OS zMzs;UDqKwj?aWb0$5P%SqrlTJzuj?OUrOe<*x7)b9q|1zjM4{b8C^?$7p`(tiUpp8 ztwAsGE{A0Q!-Z$d`X>cAzZ6=8ku87lS=Q&aJ zhiw3fZHe{?A!;=IM<3bb4r)EM(Oj)FEHyI5f>9kTuD|pss>P8(NnGX?@B0+6qoph~x`I_p)r_{jy$zuhO!-Iry1XG(;F4Aak{(-pcR;;yA@(#O(bdJ3AVn z&pIdP<_V^F(y5rxz#V4)0Er9Xnx3`ZB~@LdgcHB_eW9;!AN@jA6brMs^x?H|9^@}h zj1bV;$JHnC57~3i8iz+XK;*&}){^9<>-{h>N=^5>D_1hZDBa1bM+wHCwDZddACJaK zxeL7i!E)=a85MRL5HCEq1`X6j?D*+6tH?Sv+`Cq9tO^AK6P@<#wY-p#MDPDOgn2g( zg%}K+H^WDurY$$Yx$4~};&K-32?Es7s6@o?y%$j1TYLtOVQ93!GnHYkVqxJY#C1Ap zl`;e9Jc22gW*;w~fP%+#K(0+wl?oa?+Qp-l=3r68HT;vm%C#c*NWv-SyNqf*DXaPw zd$atx8$GdAs}x$bWdUYc8n)_Vln4(~km%>hCvfJeVD{aLOl`(Tl=+kYdcn~1n!I0m zu0v17EdwMcX;(HmrlSG|dy~g|V>GUNa6Q0 zQC*5a0*Awv%=Oz;D+(#5$4||kIpCstRDF~O`)MiD&9?yc3mHy%xz`mtBmoL>y+A4# zcVnrSgnK7$V}3dtGJ@|Ztgi8Y28)aO?{+g`iMI^@>@T?!gI#BCB9x^|C6A-f{;D$2 z3kx^Ua4c*5T@4V{54xWWDS-9N)GdgUWoaZTE9}(?f@_`*bV;?Ow|B(|>+6@MJ(3e1 z8j$+9WiMK-mx@4NNin%;SKp(nv!1)?&wAS(z08rDhkoqOC0E$|_BOS6#$bRl5}akm zayTfBuS(7{N)s>T#iNB6Aa<8ej4MsvZEOT+D<;ySICcWY56E1G9{*GTEdr}@D-_EV zj3kSjs(1gN-?xvzKdC!(g0F&GMkFzO;PgZ;tOcnO56a)^5t{dam5PsJ*Z8mcLn#f% zyh80S3eYVx69|Sx&kC5uo`Sc%l!HFx*zV^yFkx9H;0bLEfacXxz(175H}{UM$wsDF z2jkhN+v!D{y@$UqTwQaSq>EZ9g0`nGYuuVkw6FD4K%hdO!cSsYFU|mJ=glKf(krv^ z7!y29nf!exx(uhX3}A1WK_h_tee@6`2g`&BhIv7=ZuQ@gZFWSSJsPp=(WUQ=_*um! zS^VF-`|Ghbs$P5OPNMOEY`ZIbSn%@;l?ny5BJiUo2*PHI-jJY4J+K=F$EM&-|5)ml zIbs(^IzmFcCrF>gC-%$%>GbXo%5$fH+jB8}$)sh9c2@xsl7{MQSSy&gag z`>h*PQUo%SI+402qzO9|8^No;!TlDj?sEtE5W?n1gwwKRcP7U&A9qlP4GuX7N?sSW zrwfeuH-yL)-J9K;G?x|$$Z-Z@*nB_p6)sWP+bC@W`S8F}Dscd(ug3=>QJTiY*#HuK zL5WAR-?O4zrjX$pViCXC>ZRVG@+3`ofYPgb5w!tRsm#{Nc8u+WMP_af+yxlwnYWo1 z?ptgSxjZY#nEGI>CP#QGBcBj7T*4He+qNXRfx@n<36SBhEH<)X(dQo6tFu~dklC5U zRV_@-!q*T35&rbKENCP?4)>U*VQ|=5h(uz5vEFlslMC1sc|jsx3hc6sKHhL{9DIRcKXRfz10}4_~ zv~5`}?PM(*4a0MgGH-d|N`*Tz^26FC+^fO;tkGK4bu5ksEewP{I>az`6J#^jUjX?~ zBxRLd3TOD;F9^JW=IZ>ib`vd-&Q#Nxm zWxZ1vu}q)!r<75+RUS%U|6QlrSDfo!I237dfbsF;Cn5Ya}S`TSjZYq*#ni_)$sm) zDc^;8N{FGwvOgY~@RM7Lv0WX$maF=ewq~Q@Z@TY$S`ofhykttH6VLDG#KJh~8qDX(x3Iy3GotBbWVJxRO(=8wL?Gy7f#n-eHPgfo zz4Vi}=Es1x(*x5z2`kJ4e%FCaE{@&Ke3igJ_C?5XU;O3si2;MwQ2wFsOv z!2yBKgtdCY86@U#^jt;P=Lcn-1gaNSR+bSVkY-h|&9dDZ-+ZbSEBdiott|_ef(x z>Jk}pXYGD#@6e!J*hmTl_>qD8hBoZ^N5s@4f4AFu3QYCYMI><0$7AL8(ziv?*jvfD zn@H@1g|WgLI==O$h^BA~uA`^v{KR{Gg2nMhcQk?a&0$FTr;Aa+mva4eu}mPTp+vkR z6BjC7LnqEQfqEkxlqvO5hLt`PwOYdS5;B54eq#4#YTcGdDm1%{Ny%3zm84UM3I7db zJ+fML!sy?Nn-LS6kf9T@WEOS6s>0j#LYLE|lirEm>el96qq?_5i2nV{A}+-^=S0aNC&-}tSu*PSoclx(ml z4GffJSjV~OGp2z>nln_bzNF9eacE7AjJC*1;TsUb;To*SSZgC9b#nhOue3w7g>rjk zYYRl{%WHe}2>-yOqw9`^iVJd%j_f!fQ=&w?Oe;PShR1sL+!0tAtK_dZBm=uNz`_-{ z$-UX9uX~cq)#&vsFr-CZmQUBgY)DT$n(2qY3=SPQ1*auf`80HdnRL$7_BBc} zeV0PKBpfBwgknNLuWMhYXUX?hx@_eGxI@!>j)qedsu|#V0T$Q}%5Kh0J~{;l(lxf) znflL_ZW2p`kJ&F+AZlY+OogoiAYQa(%A*K%>5^WJAUbWW+D1eh*Q74dt}U@Vf|;MtQ1Nh5dD+hWAvL{bAe=x-(UAZ zW7-cU6Mo!iR$8A6DGpAQJ7W-?7r^-&-F;jp^?G6Pf;#y>D(cw+oK_C%T-|dZBpBz! zYSmLeHNp=A6D99TKB*VdBl^sk`*OjP7_zG9Q#{$b0X}N)2^bv@N)a_>@3}ic9A_iO znaUO&(%dNo2OkFF zVjIYtMHf15626XQ{rCEIF-M@tRw*sQ(F0=o5~8An59%GBAS$wWs~p$-KYpOtEQJXz z&3^k+m^~1XwZ4A~A)iqPhIKp#-KZkZq%59|%3|dsosdzy2 zFyvC3LO6yr(QVp*uXG%B+tO03h+cnBpVFhApmka&JewI8E(dpy;?o%RA{Ap-r@t`G`sVX+xlZR4jJHH`s6iMQHWkUlU#;$)VO2;tF9B+i zud8>jvqe0D%6qbBDAmr>@=&X!WmTDiSXs&x)SuAjYCAAhow?%Ujj_Z zZ0{mNa$S}9XQ|QMS4xRKC~W?S*v*?}loa+enhMC}n5HoA(@Lp)7~<&r_D-_q+EcId z7L{*Gi2-@@JdeD}5LD!cvpm=*ah2mg==T?pJ3AwD6$%fS%!~zttl3Ze3XyN8few!- z6CAi5$5{28^Rmu?v81~f@4r@U%$A9!Zjb}H3Wp>sYsN2h)c~mlW;8SiSb-253kntE z#)IOQFl^Y&x=MZM?f-Q@Mc}8yZA1ac{7cX%2Mclqkx$%k+>B^x7OUW#!M=2^@B?(hvlJWk%?#2D>ebGAo z)Ygs}81PUs@I-$GVVMd<{M}#3kWMt$w-NZ02M43L)jYcqQ0aodt(e=^>OAh!=|OVI zl#(1*E-5kH>-r8j75#X|2P%QVL@=4yP!!8o6yY_>)$FHsI=#P>*4q+*AMdfNqU4Qk zHFs3046RppOO<|MS=tn8#VF6w8rm|`#W&qJ&;-?Q*-^R8uo9wRcgy8cLOfOdXgZg% zss$MwhZ&rWYuN{-tMdfDh5M{t9vd1K!kMKCop?;MrP8|SV|(8nqpYZD+=)Uz@HqUZ zFit9=OZGx~re5_KD>*%dK`Mc1OO1i$t#M~-MUG@62HHo;!^kqU?S!j!7%q7#xNE{M ze8-U4ruf$faVYMSM!WAB7Z@$nHJhID6!=`J>;INi8Paul~x=wuBYbo)*Pli=x!hNx{R~3CsgGkkJ&*id4O}peA zTv0JF+;#L3jAqHFPrzXxPFa`aFhAp%Dmah0dgNtrN{a^5XYCmeP$L2o> z{&r2-X`B^gIho9^O0((;Q z>;a|;;55U_7mOEf4?7$v54!qTN20Vy`Qo^qb7Vm0Y2OK~;(i?o zbHw>oeEcnR?KFt@2MoV8Cl`r!nJJ##=0|2852<#t0jCx93c_Ye`OTKGg>JQ`01KPG@&^kqrrswL zh^A^0AeNmTIUs)tK%XIH>Qtm>-&wLlFVw-unnqJd_p*CmOuUYgzf?CMAo}%3nt%t* zQ&IE$b|m>(fMr`^*|UaWt!>g$@kw!V>(p{Xf=(XAV2s{gYyps~}OVbq&hlSD< z+vgEyy~fK&BOHQYfrm`99~E8zVCSG`UYNnb)$a9?hyr`ZgZGv_>^z4|EzwJtzvgC6 z?y;_mdeb#*V+mN3KEaMuH&&?68|_|C8a%oGpVWr#VtgR%_FFo7i@*KIrKkRAr3l%k z{NbS9FN7eIAYXyh)u?In9@0{lYIS#oU!aBZKc)$MHvFl^&&%(jx!TKr?lbC zU>m3Ut>Xr`m8?(*PI755&V&rP;H!f~<40UP==G0E)ff2vrI~WiRKKUHHI-6j;_DQ| zSS2FLc_;uI&*(u{p(U$SC?~`ZCsdY_c>YMfP~sPJ_G&D(Hon=s>emmvEo2smaeF7) za@R*;FWVQHX;p=m3T`z249ZcH?TLJ-SJitd15u(W&gHmZTl>&VP z+~9hSQP{MAP`*C4uxI0)J#_=>20ng=1L)s5-We_*8k%1P>Yt2(2Ql8qE7C0kTyb** z8Z2_sEZ(^sGR65Iq=UkjN^oBpg1~J71lq_4y=yo;!=W>suC7};lR?m_=`v6w!1@jE z;`vSq$fKB3T7%5cS{*vSg~JBNGxJl|!A0W=%5mq%j9GJ7a$c5{3Q;kvv<2E~Ym$I~ zw$agqVQdI(3`Vo+20f!_mtrPqf!oQ-Q)G{-@{8*zq4=Uw)KB5u3T;cE)-aX!^Y(mk zhK#6FAM2(3M_>2TDY}_0A&;iv!z$?}FGe}XFC{ENc60cj+p@CC9F+9OgZ5)m%ANUY zA(^3g^`NBWTjt|?rFW*b9q2bBQ6htLom7(5YAa>IccQ9i5)n9D;nc8v7n2s$*;7!B zM?-=3jlyJgu4_yslSD7SuF?HZAw*idfUVE83|oDOf0LC9HM-&qKqpx}5xo_WF{m<9 zn-kObm)6NOFS^c|k2CYy++3bAI9W5pjbOv(<~f5)kOIfJL!T>ub^orS(u22iemkY$ zt<}zu9-VPyMS~{D^oGC?R#OQc>*It8BONq9Np^M%m|+0Gd9hyes0AlHu?24&JXy6^ zQ-VZzQbh>2ZlKrnw94kXK4Bck(*l<6chrOgML{@w!s zF&1bdfn`ZjIv^R9ipxjD=w)q43~-ztM^sjk(ilTWh4910L^3r67CLxhl7JUSJB8G0 z;msvat~P^x!E`P%KXTYV2$IaSP`#0IyhTW=%&906^W$lCE;aom!~ROukuP3+`P)IM z@OD_&{y>cmp97T>XeUaQyGCG_r~Dp5MU`YMauVDKT53<0$^5RWFe){o2hNr-%Zq|NBe7*F+Et*zYQ|!83|$$F0x9C-*uwZHST3p*~q-@GB< zqya=8sp8Ls29wOMpHlRTc*>VwKOdGnbEklYEJx1ETVpiPMy!K}vO*OF(>tTHzk79> zA$`f12el*-g-P}C!JcV9$o_W?A#mVwso`p8=n4pSM&*!)NdXYz?QI#Du{d!!aE9{N z-}6t9!u{|bPq#pvL?xtp+Ybg5vVj|vmxPaj(*Q$G4CTQgJdjoC$TA^^hR6XECBvPk zu*^A3fi}a&Ia-6M9~zWS`UbJU7)T=x3`9bMe`XHQR4W5~>|-UBUz-y2#nRKF38hsp(69&_ADS*O+sBUPnhW$*B`L$Syx1~s z)Y?s))Z*p_pCpDbnc#~T{5PYCtHU!5SbMk>&k;+oelhLK*6WfhfRkLVL*CXYs>)8U zfP)nrt@yrkwYN~=!#!i`ZYos-oajpc9hv83N@T(%nYi?V)Lq%i;gU{_!=lE>nvm&I zrOddXQ?Man-50L*z|e!2E-ae+X%2i>L4@L0A0VA<%5+`ar=m?xYnEN7f0m{rQw0N* z;d_&ICL(dkNnKs^$Y`EstLaev%^i{`ZlUv&>Wtn`ww!a{uCw1$Hz4|<_wCaYL%|Ap zb`kr7LbX}@-c6{~uyt){L61s6&Tk-$8uw4U7DXTSgPBC0dwwT!FG+}R^-BX4H;MeL z*8?f1_(6Fz*y<%;BH9&(1U8qDA$#aLmH=A9!b0`LLJGP$1d=s^ zV(|$jlV-d2jwH@?H!uJCO86<7P?_I;cd-tO2YsjTV@R?%2L1wgjxCZSz;G&xO?izQ zm4-~rbrvZpNW*`cgAPS#%~U*xU}WOeGNC7gycFm+Du3jo(&Ts}IPeVJKGBT!Te7G# z`d@kw*2!CLt9zw6`z2|GE0OcAHb^opG4%J<^N&l(sk*>J8~hJ8$90MVssq15X?S|i zCtIhpl-%i+(N&0wPeQ7yz^G;nk}0nPa5p&1n$UbJZ<+S${-zap%sSx)?nZ>P_<&e% zR$m30D=}UVUPuM+Q8lPAQv8@5<>Qg%+=@x+zOMx2gRh29KOM@Ixt#f7*^yZmriraX z-G|UtasCMBB+*3vw-LtFb`m=I9um%>8HJlX4QjPh%+&L*@@X?U=sDDm5im1$r=o+{ zBpNZjy`UWKt@ne6cHr)ROIwKNd1lMScNIxH2v0{cSGw)(f3))W3TRA2QIYDFDP+jf z4Zi%VV?}EY2pd>N{}vTZOv@p#oW8*$=9le7VwoKH%ey6{m;_-&Z=F0Ad}o|~b*Jzo zm3qiaU-mS|SVP{zUhPY4IrguWEuhy+4tn|7Niss6Z_ZW-X>{=jj_3SGyKQ2Im&uKDaK_@5zY5T4cg{*6H(+0F2vh})?mqtXYQfIliv>Ml3il+Qw95|+h>61x( zR#aTO|3JV@GRXve2?jQ8YiS5z03+hL1Wy2syBn=eL9lDz+aV8obm$F=+Nl4t52`qK z*W4V`p~icDB94VS;CHI8>kw066~~CtW`O+j80@EVbHOB7HS_g+t^H$cwaIb5zFwOk z!OyV@+1FSSL#vwx;@tR=K%l;q=&;b~AG__m;^N-yKs0&l_Z|IIyQwt^=|Eo&dxwJ( zlHQbrjUE>c&31Ix86x+Dj`kAvc_( zNEK&2k%tReJF>t1f&FH3bn>I%X1U1JdP{?O| zb$dEHK@b-RtXK6rXs3cU^$3Kh9hArD;Kwy3Eo9;pjl%a*Z$Z~xvOv0XBZ>28R6T&= zMR@z%&TzIY6Z1HCwMtpWfT5wrG7H>|W#bS37V_n8Y*uufTa47~6Q@0kXvI7o70}0pt8h5?L@eQYYh&{OR&9+MmJokTEdV|Q8dT|Ps z$n&yt1VC2T{k2)d>i?AR>prpg0ndD`8r>q>jM0alS*Pljd{r2Ob9Q3SRm+hC*?=-9 zxu$75`6SV$-h2)VAR{8+5rYa93xJYLjtKq`}Q>+w-LkA)^#cjc)6{X0SBzsR zphxS}sT)}td|t^uCJtIRhLMKi*X?l4>K2F;%-UI`VPv7HBfKsVj)V>U^*0DzhYgTo zKoe;CL|VGEpeSwcR`y?Hnw2i2dmk`u^kaQ#EA4rXegePZ56TB^WN*qEl)n2 zu;ulFG=d}#U*HDD zD3~H$kRu&`+_DQR{S>|##+0d>{i0C#V(*K0t)9AJ7GmcncB)aVBM5D~BEGf=lo)5t zzL#XoMVYG?%jB8|*mf-6oEhHMy9I&VtRmDVj^y_j47MbsnxlKdL>mUI@Y7J+($_U! z4VO+NEWE>7o{DNoV=!|%bo_38L^b!$8JX*FgK^kXMW0lB+#RbmJLz*;Xp7kYrP%oC za)gGK9;@o5V!~^Ee%mmHH4o!q9((KhlJJnqbSKr^o+@0za_=ByVIyQ-S+$k+ujlNR z0D5Jix%6mz@YhL z`b517>5Z`U>S#rbI$_B0%Ch3RL8L%#r zAZXpcoN0UFoUNv`*xsS%I6H4|bk+)jGlp>~_nvUP#~JlyG0ZO{-liGqKp57)T_z@X z7JsK#kPxU$q+-i9>1&xTX=;S&?-#*eSREYuu8=<9`l-GxCWm(~uMo5QIu)7+lZVZs z?=6h3Z7_#b_w)P$ZR0j(N zcUz^sl&>*UO{lmCc0vBMHv_`C+Q?J zX;YX{WWAn6<{)~0K|Ul*H4P9G_Y$uI4z=1eC&jUXU01cA_c3(1)mC#^aw*9SW-*~-@w!J=G-HRR z61L`29wJk0nZ5I}C-BTfkK&m$GS*QHuLcZ~-eNN$r)L4*#@M1IB3|CxRFWS)B=jK> zhus%Xa+d(~$;vG!mIP{^7H<*QUsle22cHslNrqK3Dr+-8`c=U&A4SEip%eHzta(*Z z&CG%{b#*-`i5o6QH>?+Ld76YCMGl(CjIeqM6)4ND7@bTE@30eiLp6)Wg#4{KbL+n{ z#kZbT@m=frILdtjK2!hF59$s3Vv#Azr9|h*Ny>vAkdbRr0g?* zpJJhE>7da~pzP&vy+o^4-cU63$%KHAL!p9PLk3%q@l;?rR!orRI$B@iqi7Ol8O37t zlTKnxVBu()`?`NEqpme^Q#F}l2USF<74=_$L+_cakpR5&=kUjUrW&l95r+q#phMhV zv)H<_4M}j7at~DC66=;E*}SE?lvNsMC4~c>cI`PT$T< za2$L`iN=phH(KQ4L87^zkZ^O?q2Nc$aIXLzo1EIYjCWa zXYf$J9M(Dy{i(uSUyH7ddKx_Nt*vB9Sdt5ul9gQ}P;~2{7-M}p0UK@%u~P?&3=DwH zNS*a}r#IY)y7!H2@_s}jG4h#Fs4xJJ5P(P@*2U22$~5h9lt=u1SK3K3WSd!lb4mXN zA{U#+{SrImo7#_NHEmoi+cB)n!KkynXwEO0Fm<8c+TT}iwR}zr9SjnL> zlHISElxBU4*v4LtV%AB|=x8kLdYN+e{7#-$`52)ch4b|gqEw(gxeu@q4bSm&-Ht4< z?lvIed%AJF}l zVnVd8wQ^B)C2sXc;6nn#xl>TAiGStaM$cgvlXCI>p1!H+seA%AZg@Et2WKS~LdG#v z3@V;H_Kn@21#2)#2o41)p5!}k#vl*KH0n!#sNFl9q}HOCOcSBg+iwg1 z)|uX?NG(3coNH#4z{y`lWc4+1eyjl>gjS$ebOhLV?$xch$wiu{Idnln$9-tDr<={4 zJGx1T$MXTa{#dP#H^E*CPB9u4=Qum#;j~7Wk02!L5-hCH(KX{< zp~zf%z;nOCHLDJ9PHsZ)NrgSKe)@wp>m!~zE0d*KrZ4vp(Dvt0hxSX9sqhIt2)Hf! z;2n&?!DxzBumjzVEfcCq9o}Zfq zZIsCX_gTVw9Foq|x{nT}up$);vqHjk*u9+)gSH^2>~!ntYbgL+I9o7w&?@6wQGw`7B>Dp^qGr4Lmi)W^%uOA%)X5;~HWyU%N+i zU(=h(b8GG4OghJU6k2PRu+pH(Sd)BXykUOqr|$D~41Mm5G}>JE#*(R~jEO!b$Bl+O z&$+GE5k_KeF?#Ol3lns#V>&AN)SAL9ExZbf3uG+rQOgcX)oNZ9S|)%eq-UM;2E;12 z;1AJyUxC+H<4Hl!tTV>>Whn78iY4LTo`EuNW+0kB~ z0i*+rB&i>A$j75tFC&weKC+2`#Yph=gc65g|52?^Yp#Y-fI0g=>m5W_K6ahLoD3d~ z@`FCT1kt@p`33Ny5&9rLE-^pm42*-*>~7!C5dPsMEcK2>K4?!((I6%A z2LwFj@O_+iyW&uh&Ha;7vzA-MTLNci`TLvaIB*yM$XqxVib3T|8r8m*M!Uijjv8&V2w7qV@0 zuvw)~wVj1Y11fNU{QjO*Z2(G4m*?Pa10puGMw)Ev(>TK&4(@5Ux|rTOUUC#2}hI0k{=fK|!~2T+^nJ zTG}1dc|E0{&Iv5t#v3;(dTqP|v4(ZN=NsrV^v>O$6l*!>IF%W$*Hi8+A+Bl*gE-?3 zj-g2?=AP!Jl`*za({J=wMlsE*+2mdu>h7>8v)0;X53g$$u`v-^a#00 zgVlDtG-obsa!oiR(PQzt?XHO1Acj+_(W-N-v_1qdtrw~&fU8+!T?Z^(6l$x8+jPU0 z)8t(Gv{Y+`$mVOdi(g#kPV-x;IGJtNma|fiTIDcILmg=a`;7>DCdQ!^7ZwJ^S{t7H z@hZt!dJlSDtLdfM4rHHOM{adM;a#3QL=g=m?EoUC-CKq_>#oj2$pzje1=l+OYK#FM z?b_>WBhf}mgaBP?)7Of1zG&!v;>ZLzAPCavLk7+OLqNR0^mfa-JU#-;KO*kPo8m=V z!yofV6o>|ROr(w(pHRjI_qPyTrW`+d=1zSEw?GaI!hIo%f$c}*A;fiAl5VQA=Nf@Q zizf7+M8KG|T-kWL3EY+m&r7qE{DyyseWLtb-8|)QPewe3nbj{{Y*wTNpe37%lRL@i)cg zOE3)1{K2CfNJIK{zP*1qY8SKVk_IbB!VqyCnMWgWhKCZ!|2?Uv?6ZL*3bcn(u`BWO z#?ZcEplbR9Zd)M0W{`#T8xfiE6c+G_i z5q4Qs)|mQ~;^xVtL-?Qha)@E{p5aYOI4h>cT!d-S8us`IOJgn37--dgnS5-el^ zW2V3>dW$Slaa+n^;sGARiYpkV%9y4v{AhR%DnwpbqGNJI3mk`N0F zxjAN(0hofuXgIu<%c8O>n@eAEg~QEg|QE)Yc} zv4My-Wb7cxwt8Y$6?<gZ8Pb1 z9^zup$=ecaZ@@`9+HLh%-(upM8~1zannvn+YlfiS?6;)(i|HN$&+xjxSqntHi~_ejcrj& z)9wm!Skw{WY!=lqTB9{3P@al6p-dE(04{4&rYt{B3w{b~ZRLhu-2!O(`4Pic(Gag1V4+h+Ux{9{CaKQG06 za7db1mWNZgfhoZ}F-2LxcXeuX>uqLGn%L`mK76(9sE8m{MvlMIg%>8AHybROU~|C_ z1~!q3>{Sv6DFK4+4mBXca6qZWSsz!lF7p6BaQNCg!Ip`z!}~8!-IbkTgj_ z2t}k$6l#tx#tGf!)!uvMzqBypj!qdh)7|pIaPcg>&69gI1v<#!o6oE0e4w-iIuB<0 zDg1&u*c$G1(D)`6B$#E(M7F8e&7C2GaXgRAYMq)tQr^y$#t{$O(Fz|IqnQ|XE5u+b{(lXV6P?5CGq5eDFZ;8 z>UP(KGhg-_iS>T+!W{3?1gd6vTIUE}z%DXF{pb8nd>$b%R#VwsdaPpTTdZZ6Gkka8tG;xQZ?*U|qI&-Y7p4`So`10}c7=F{kAnF# zLG0qV<20&!tWP0l@zL5^{TC;Lw^_;tan+XFze2Q&rLWV966ut)^!QrJ8 zC3i<({3O9L{f;ld@a1*`tdQr?AYk!H$ai6piV_y-xV2^unHW%F1c74OLMHlV9`QD1 z)c70)3CiaOC4hhg0Md@poV*y9u%Gp|hTK=4A5d#t7p*qYlT2DlNj(XE=;-!<_1yOG zpZM4-EifRXgE3R3syB(i--Nen%$QNl3lUOD{g6W@W#=F`o*{N0L3;IR_c z13uP$hfRtNsMXrA<^4C3qRb3HXd&oy4lsCQ+~9a=kVTfeB`Sv_eXc&$wY)XmMyyWx z0hxuy&{s{y0h(`S{zY@E%`6n$)$P_cTZ{yuUxDL>fH83OeZwbjj~hy z0}|{}Z_t|jo4!0_1X5eJMhtT~o4?8Me=${an_3>ra`__i0Jju7_4!GM(H;X^XjGZq zi%pxdI`s`@qFX4CSoOBvP^g0vxR(5a7IgS~Y~h_(^M|d?&nqG&`Bz~1=w4oEe}&Hc z7-rXONVT+keqdv9b!2a;Bpvc@H%XDN146oJX=1`FunvC)`Jq?y^Csp&W+L`X+=AqH z)tM3PcTwMb{}02_fyM&grVad*K|8R(gaAhgj9Ots(7C1U+%fd~_~L+MP(kyI7EE`N z5RFGL^sWHHBC8onk!~SHHw+0(T)G}>|(sy zo0g1|4Uy25GD0}Y3&Ws0=s^($avv7by8Yh25U3;=cZ@tpK0x9oIMtMTyE$;0AZfD< zdcg&Dcu_bA^eHEtd8^j@A}7tR(Tkkvtk$7W2$jk{!U%S;z*1>w50cSTi~pIHC!PA( zrFZCDJ6G=kc_UH^0vyVT?ONTGY{N9EqLbSwtd|fk~}iQrmRR4=+rX&NrP)|J@ny82 zPOPqa#@xft8o1Gg8{V75ULf< zm2A~bDFv*V(rZTowf30L%9$H3or2l8yOwTV8ziLEAtn77t#BTzE61iZn`D|3Y=DNt zJPIRz_|RTlT+ig1Q43k>2jApR!kOU}uW%D_xZcxjmst5;_6-t!Vw!R@WWYmR4bXYt z(L|uW3eKCfR9@^Z-}a#^NlWx~MbU1f7NJ;aP8V0~*ynVvR!ns+Ot^@kz`??qTEyTH zwiwPi=^nql>@^ocywT^k;!DNePGAT+fxq<{u{I zQS0sB0tg`R{5#q&IQgWeSsW0LKgO@WoO` zVTuWvwQ<-#_KrKEuq2W6{9pMm$HD;wpd#}ExjRJTgTj;dvfhz$0dny`kO zuafA;sQoCj7do=Q$Ai}kZbpHDQj7{7<AaG9}(lM-_czv53usGbvec0TB9w5$c`LOKE1wYrd!syBH81B zaukq+ZBa*bbck}8GUYODz>r^oyPo7!*ud6G#NV>B^8jEBu86l3fm5NS077%1tNmGv=UDE12r&! zF90%Mrvp6CLqnd((W3}zxM%Ea$B^L!Fh{)-!U*cGUZ4aPCge(8MsBy4tv?OJK4Z7u z9!w0Mp^jEj5X_2c#ZY=W6VI4hsDifQh8q;$Dp>e)%-C8Lss>`CU{&DuoIJsdU;S)2 zy%2lxu;h>?i4B=8x54dVWZhT#J0JAKK5YOioGs7HvE@Y8E#m3)VQ)@k6K(*#*kvol zHq*DNvYO}O*U9-71IV2;q>NUzflJlizERG7UJ{5V#0% zN{9vBzC6p?OTz@|n9J8s<}t!_ih1|4*{fJ=gh{9$q5yCuAx^HQnvG?Sb6zIn-7g1! zHp6g$OZ`a@j|Xr{b)=01uL1R!D?j1oOwi=X%Kt+2SeDJoV_U>^g}B%3x3+e89bNaVhjI5C78CijV@q8(MI z*UCU94{Ns0l!>5xH+I@UJIr9k>AKCfBCUfjg{jm=Jvhi_^g9GhL?#6hb8j2G(sO z#?Eh;BX?(w_M^REHePE_Wa{<8y%57><00kPgKP?M*&=BOdRS?2+X!9SOCy9!l^o@zS zov%H_rt03AfmYPm+bCvS=qwea z1r=Z@Vh4Q=Aau7%$SkCY71e`RQ7J;-qK{yijF)+ixM-CQi6DnQ!GPk)$O~amy4(W} zuQx`awstpQRFi!Dsm!tW>Yxn%VXHyU)8Unl6b1}I1&%c?`U;q+q)3;3@Bm_xt^{PJmfq|rP`B($wZ;U@|W={_40+vb8 z@oP)%7}s&#nlJ=qcMt0jZ&JKzZY(uu z_kNE=7n7k6v}29u19lAHxuAA|fipqtkUvDeIad&)T>vqU!l9XT(HlqAPU~zku)G^1 zLu{h#-0KTqN|0)Xdz~;$Tx}&>j-iy_mKR%_qbhk=gIQ42WvzMdEmSuGlmeaJ01py@ zwX1#DXZ>nFd*?D0a0`>h%D#3I5Kv!T0l%USADH$lJIyG$Wzgd=D9GLA_;~r;Cg-cqL{{Q=pCJ6?;f35pyZVf+Wc>5|wBV zw6I(VPPCaQp!-1d$uM{6gaDxUs?{edcIyh@jFs4t`u1^=U)+TekTlzZIL$c^OOP3H@0lO1nT z-{KG$7=goXQ|yXazFBuauAksyx9)?72)JnsvW||7G4L&^s$GD_JlAor6VE3E=e)v_U?h7-!=R@iyvBmz3s7wI5cido$>I7s4z3T_8mJ?g#G)_1N?GLr|yq~b=nt~z0C2iJU{BbOKo2L@3Shp9Iv(8wBBj(pV$FY#4}jcb5bg%Fp2F{jzr zdCnxRF+}z_srTaqQaaP!#m8x5jCLz9T71>n}Un>@tym7k5h@o1>NqJ zTLFr099er&7?SyqoP00(v2TOaLZ`CPw#rDuFOp|k-L4^G+9MZ(3;zoBd1uD9*U(A8dYb_iRr{(Fm(H8 zQ#u(9eSCdGQi0xdDJ;zwa~dIhWdU3Au@v^`#zO9YFc@F{MlUIB7S_C_&!@SEv6ioE zacx?_WoDl12Y6JmwNGoXa|qEUB_v7o^Lt`?Wq`)N@q>WlC6r%*CxV#{X;y)&2)n2E z89G^NPop#Yw$HmWCYXxj7d^gX&G^0=qjWGVAw1NsP2Ts zuCwdSvrYgF5KNOmNof&8tO2o8aR{@(#nlkhc}cqvvG`paaouLO>_6bYHGALoYdgY- z)euIpQqM)dnXJC<#*azmqjVvTW+^)wJ!8o>b6Ogw8?q-qnLOLj+Ug{!M3EZAO}!(- z_|PRQ<_m?Z%jBJ$^D=*R16E-US4Xr1t{Q8g4aK%pYRm>tajW1G+pd_5W(RRz9Oy|o zy5^ROh)e4?Tu8TF3$7qWq)H`y*X&f=|4?%*q9a0$2_Mzb*uJ5e4*nFwK@4vYfVGn8 zMdgMKY1ym`^2m;uOsDK+?2vvvk7{0edL%#2WC`yP6IuAJgBNKzHc!1u*eO-+@lQJV z-Ch_3PVQ&;!$Va@GFJVR`nP@>y7GsBWckk<(uE3Z{f;i&hKj>Jp^4h2zGF`^&_5+t zuVllt2NUGcMM6Yb#G!3WAmm1PI;QH5+)K2eNtYWkOv<(VQVtKm$`P&*P8GO4=xM#l zjHR=W6skRScCA4T5q=^U*c~80KCcK@x*6D|JZPr*1hKx6^Ayll+X7(7_UZrc>inkfyY9F#}7N?QgWtRGM z2AKnhp{1@4SjhBecgqGbc(A7$VWM1l0j}O4zRhP{?jl)Ln%e}5jQT-jA6n-dYzgELdQ0&vd}-{^juozk z(6_(1Wjqg7joP~?B^3A{^&^Mj9Q{Fbb7$UlPo$1eRwqmusIb}#TJ=7FFmt}XyVLz+ zP4MtklgjzBGUl&{%oqkI5A~@`qL)c3r%_&5@Kkp}=1*Ur*M@mSpEYzN*qsQ8M^n8+ zrj{iaa|hVP%o;Wn z>8$EhC~fra4ZKBns^g_7vdm#}jz`=-*~5Gn&mb{+=AkJw_*$h<*zsj<>1boIqBRC?rt#$?9u32S$=c;h`nh0D%jGu9;s2ObE|9t8^OqG43LD zVB2w1gJ61}hBUt2;g};CBb*jpp)BTg=iK6o)Ue+~#g6i~p9i*AnlQ}lw$X*b`5Xv+ z#oByDEC)-^AIBW;b`MY9&NeiDq7FM#ohAig_0k*P6vD)X z;T-)`ZiCX_cNnqY*NcY=VloW}5v(!uE6VmAr^0Jw9LK?kY+mR$Atq<#wIO>n0hN8H zHB1pjlkv9i1HWFBxr0i?!dgH7k?dj@7k?}{Yz5b15IUJf1eZF7I?J2D^|j%$ zDObx?nL_qIep@?@r(M;T0G%!*Mc%rGof?@h?u?iT1oKzIENju=KE^D&w&&!vfh~RY z+Ht;2rO6q=P_b?)tD=tRjwRYaKETNm*yT63`fyhLrOWeC{`cRCm`p&a^UbnJ!gE4b zN&*k?N~0rvi;;s0dfdVr?)>R+Y=qGQm*bJPO>ta%#_#fxl?6?TwV8fzmeN)I*?2f- znyhJ%Yj#$GpGw&iYT^^d7hwAZY$)XnVV&5$*heMMm~>>a+V6qVl7U5uyD zFEF%-7;Qn|8U-`|3=jAuh)5bpL`hdN7^0>C8{R zK-JpXQ^rAuPb8nbb z6uoQV{Iz0U0^4GQ+z*{DEQeuClFH2}>NEC>VSr5$;UiBWmsgf<204v9nmqNX(Zdf0 zDOoj7f!e`SsiiGPOgmlJV^v2;6Q$at>sp;l8i#>>K-N>D=er?L)0i7KU>>n8Zp50R z+MiD*)zqy_<+GB;<*34i6qE#Ia9xLM(Z4HCF~^gsf^&E`#m1rgni`DSYtv2NkuX;6 z#r!Jl;1V@zl){24AyjY1X0<3|V;_B*7jiHf2DD?OgLwL$P#K?$OX}XKDhtJI6HI{n z?K!f3-OCSF<<^lNkUZxVr7)M1eO_PuAR2s2<@MM&Q&nY5CaoS7#ddVhx37zBmm>ygD zNpe>(O+i!6^OA?6e;;Z$Lai05X4#DO5#`MWK$--Mt~MqCVm93`yvl#W-aNZ^>(ppA zawgK`VT|3wIjA9M06Rq4lx+8?6eXZ$@?P4%6Z6=$;a?qJ%0S+qd0Vo#Mz<`n!Dh=3 zq7_s+x`19!Sz>G$#cLx|U@C|j;0DJe@mO&lmcA3if0ybFHF-_J`$24k2%1FLOQ}oq zGd?N|dF!D)NJ(+#>l55n@y?tgpc%IvFl_AVq;2c{MP{h%IGnj^fY&Qdpn1vTZ<=Z& z=D`Z$m&OleKG?N()5$S3DkvvqR_Sj=N&YWe{RtBxJvpUwJj=*HjQp(ki$vnxN%JOw z9&C-EJZ{JLfN(&ghz;m<{O8Y%R{q#jNJP{`AkL#%W}uD>!styghe@?7T+M&a%A-ch zcF~Y?qf_~aE1?v|pT-Mq$UFj0moxKJRarpBFhLiqVE`Y^3Y%U#0D?AN-w;Td61G<{ z`ysA#P(_@8P6U(pnLhKH8pJS(bzX8i6+REybPTMRO!V7^D>RqriWi~GX24y{H*@uK zChhuiYmRBcs}=-_7X^d4;GJn*g6DlQ?M%agR{9!wMj(K=5GI_did)a{$6=u-4AW!X zuJeoroy+jS)eM_Q4GsANje1TL-0I*$rDknebx|PIE=$+FX~-JuFma~z7!ZwH!jl9V z$px9yYyuRYIR#pe`-e|_4$BS@fy_6mNY>oho!B_tbC6ziS5e4z&=0u0k2L z?2s3-6q|JCJsYWGV^pHBq_om#Z<%g{R>gcmMj21I25%(n|@lVoE zt|(CF`B$|KOqw?ee9c<3)#^y7G+~NePh4}Z-dtyV^;3dKf*t*2{+i*pXrky zy1OlqMN}^-R9{RhR#w3M(rYW>wCcUVik@(%mnYpXiH)wLG6H(<+5KWa&9s$gqjm!L zJR}sye78rt8}=3PL0q5X9N^+Qe00qGM>HvDBHVsYYs?;sU=JLcm96syDL@j2HmIgA z#}+7sn8>5Yp_MxaO|gH4zvI$Zs*tZOekR+9F8!}DA0n#II+ZJDbi0aho@0h`#isgr z@57zKN1M=k>i4%JrPiPE@6=-91oRSUVV_(rC^NZPE|(=vc2oO}Q`I*Eiaq+Ccx>H? zq1h4SUC7?>BB~52jK=cmEt^5{t20g_6T&*pnp;=vt{<8cO29gJ+nwp~*3k8Xeh>91J*^bzqdQgv_vwg-7`DfSfRFRv|QyiJny%PGI_1;K1c*Gzd)! zJ$jChrgVJp(E8^_9yx;^KbkKfsejq?4>u-CGS#6ZFo;7Ggm8Nv`?t~Pq|&Y`{xc#_ ze(wtGiLx(E!772nP4?6XP^c-@l@l~hWJiYW6;-i!aqO%ZmwH*cz_>aYt>P`xfVd@k z5bTu*nLVZk_TA2GB8sR&?#bR#Cpb0^EgJX_z(?7^;emr;e&CLg&(vS5xKyr!wPqj) zIT9O%LV2B_Ym%bz3iaMK%F1C=Ct-3;KVV(tj6PV}19^1H!s|<_b|JoK1qUl;W9D_H z8;DYYwj*N+06g%avolR@ISmRR!4Q7mDj@DSNfYK0F$tbs z`m7z4Sny%EW3UD00pa^SzJKgM!r3R|TXxd@Ibw&+`rkqu9o#0qiTdQ=K>~IQAHLbu zWQ=5Q14xF56r`gvvH4yxSIC0PN;B#AlLlQUKXk@jNI?`?A*>sE2MKew;OcC2!B&AP zM~}1;NVsAMKjqhuB`pJfI{4MDScEL^Jn@lC>w#W(Uyr(-ql;bG0!)W z6ZlxfeXBNGI{>btGT26D#*1rg0oyP~2T(hcAJhMlJ2x&Re37CU=o>))N2|5oxP6k} zVkp4%?NbT^!y$t6S6e4}2nNKr@!cXEckNGYf2;?TeJ`onKS|Bv6%7IX6RfKiePQcT zYn1=+CAK?g9$FyppVN=n`n7svOmG1~nT4upN{?uTXV)dXV7q-AD8qAouttFa#wuAN zJhc>R?Nfqu3B^Z&9WPzIaDCfT3mwBhPlh~U*+k;tPqS8~3_0A0QJ$L3&%Mv{td&vk zpk4`>U<5bAaXFTqKeM9ydS^52Enk=PGW3KlD7@Y)E^tkWFrwMBkdvG~CSHt5R^HB* zbd)_~Ho0CtN8%8$hd~lpJ9yQ34bM_P<%O!qD(^4%Q* zrnEAe1GQN#j{|{G@9Qn~A6TFAa#>R=V?W3tOnLRy9gWfpaTR!N#mMXPyGijIcq)D_ zVPI+pl9FWFRwsrqg2j)i%IDKf6FxvWfw%~8coH;{&o}TeG`}nZ)yNhcmmuk^H)DFW z^j$jczRGtBfyi)nT2AXNJWLCtjF`yFIUpb0R@lPauD~9i(ISBbI*2UfA2n7PMuf_{y<@ z-boK4!#=@il{-X;Y>rG2M;T@t$Zz3rE8(_h(l2#P;ax|oJhe|8ZL7fhox{IqPi*ZM zF#te;0uU{?1W`w^6n?euO-1c0Q`Tl#pxIH#{hwE+Lf!ari8Qk;OwC~ltwlOZt6__Z zEJRzk-WvS`~N>eU?PUOzSlZ0%ir|mTdA>HY&a%Z|jSaiZ z4sH94^WYm_1NgdUNBElSPCZ4c`ByK}OESPw{_&dWV;-wj9idcIfxi?5@J z6Q*E8nC4>t9)o^sn2v8bNmYq+v5n7Mq=?l6_6YfZ(MIHX-qGYJNver#ZKO9IXXUO_ z@bATrXr?o^cnzJ-Sne|M$gl>zOj?RYr`i_w=K!v?##I}F^MFAw-nHA+nocc77_cth z9kG@*oav0=KInx!ZJ}qHLL}z`41a`fV5yQqwz}`3SKQD(X^{sflSJchGW zC6RR;Y2066Z|3mm+62_7j!aWqlvj*Ipa);?>1Fsa=*H{%);NA~yY6n{^V4q@4l3UR z?+P>Z1S z*oPCPiFTAd5+j#?c1^{TOC)mKy&_It{CJ8KT)=CELlw9poL@G8{=~e;9$U-qoPHpqm$s+}=S7oMbN+mQ+M`#wK9ig}! zZ}2he+7l>KmKa7aY*m_vIttOs(XPU}S%`oD2?th#b9GMGB!bSG%i?^kp8bKyyKPGp zr6oQLbQM8DSGSW{n(4sakTDl&s#|CXG1})*M&UPyD?379lPxglDg1mkJ9#B>;WntK zHJV+@=&IDnnNNBP)3Tj$K391J!6-?EUd}xte7M=1FTsOhbHfwX+#WHt-q%>YR6Mdz z=#6d@N?HEj*hbDMqR{`(>wFR0K7)Gq#MZ+{^p09T9tbo2CSTDDDqsa=eItN(sP;^R zxRFc1S|QqTvj**%Vm=&`4q}6*JOKL)h5xbtzYS}!U()U2La$+-9_V8nr3?xl4tha_0=1&X3+S5Kj;Os?atJ z*mYh_?euOg=8oa;b5F!$Yv)*vXv465Y2RbiUh&W$==hl%L2V&cd9ZS=8yBvhQ5qRU z`S>zm4dHfI6=b)qWS@0)T)M<=;ptk(*j6z$CN{43K4^WYt6rEx&V|+l{e!PhCVNE> zDQR;OmLIl3aYwN_;RH;O9pHD&OXT~&iW?3CjwmjQ7|e98Y%~3S_M=&^@vZT-oc8Sz} z6m>VID2|k$7FAxyPu=^b(##4r=mQSBxIEF`aidP{+49P_@@@<8LSsB(kC*|STd-(S z84X%WfcrTNNZLu@8o=dEv0O(z1}7%s7QZNm10eIR5YT(TXG!Ofi0;f3R$& z-^r5qU$EQ9n7kEB+gQd9=iPnyY^ zCI~WUQe_W7KqE5C`Hi?Y9$RB!ie>D~K=U_|VVITB!|G766DBjU&Wb;1>mE2;kzZsb z4?cT}2%IFYM03$fXtAQQpruZx#CHHSK)JzB*Tk^Eb`7s_Ksw2LgjT3K=Djincryra zXZNQUa(eAG?Vo1qXLjz)!ST_$myJ$&eqj^xV0tcYi zrw5)2E!H22t%+$m_!ZyBbj8I^SSfcGcd~O+){JsB)7;q|K{wmVJ`gyWeT|U;s%irJ zsRG`2eL#V;V-0HkTy8*>%l>@clj`E|L3ySYk$%5^(mVMDuFP&Ou=toDYK^D4|{Yx!=+!M7L{1D zMo~**&5Wujhsn^7Tiw%$MAOJ$?STw{JkhflXk@kx^N4AwRibDSkWea_U`RH1t0LP1 z?*Q5eN9T>t+0U-(my&!laxQT|s^SnF3C%ukg`qdHTr|z&lUQUj5p+SxqG$^LH=S0- zjh>$i%4qr*fHW32m?^q&0TpD0dc~IKc z)R2vXEm!UIo;AVR)7*#Xm8)jiLd%B>!%=3yQhjL27Z@}5pSfi)dSHMC)zAA??&I3_ z_eBeC0n|d5Y<##P#&?r;qATJq^eKi;>;8^7_@*Plr7EV_G((`aI}PdabIq@LJrMht z`&I<-bb6hTLnd?A-V4wi91*B#%Qd8!`jg3OqmcN8aGcC8`-C9m?}y$X;b{iNFe{l< z2+TxfmQoTnZmBowR`D`=qGG=$m=JicKhz;IxvfO6MV&F@be3##-t+y-;*FMj386I> zd5OBs@yk)n+tLJ#pxDlDy~$Ue!138u$~mjpfb9* zq9gnAUmM1GRrYrWnDN{00n8`YNq?_$P?T&v5W2Ev<-s-x&0 zU%AgIbq$&ij-Xau*{O65(E0fBtsd~vw(bncK+BzvczirsPNo-}6-M=ikI#zk{C+m& z9r`~dHsDwDfZ6->@3^ColKn(eMc#%&PvW)G@PNR-Vx}-fxZRf14%X0nIDD;Pufm0 zg_gJ!2WZ#$P}6F77if2U}FVR;{iM7{0psDl7?|H@6LZq|>fu1@GDn^1y$H zhUwyp?{bjf{8t*t1a|B--qX7^{t`B&XWK5!W$`}aFn=D>_qO1%Q z)?lv?>)dLpbppE2w)l|ZD%Ed;2C0Xd$dFg))9*yE1OOpZw#}u*kBqu$9K&{m&Fy<* zk{2j9xVJ(7C8udag_Q)n#X{wkKDr zgE_~!xRU;K%vW92v38LXMhZl@8PT|R$6~1T$7QyYBPM7(iVV3>~QqgyeNmZX^t>SYZPxu5<(q=mK@nbp> z1!w*g8DxGC!gGk-ZO8n2k7E?e@cLsvAbPCPsgyPW5X4-1e~k~q>)*3QR}0kMDck=7 z&=3^lrzVFvg-x=7laDnC*ZrD_(3K2K(Vr5y97ltE# z*JANlI;<&2UxLUCYuNxKtbUj2N`AV%T{&-Png;609MY>&y)i3@Zo%j|HTn&amSpP==a-nm^mXh84UH6uXT7AN)>K%j{u&K?FN@(l6o`F9p^`Dvoczw3 zL^s)Z*1hYdrJTa*0Y!Tjn_8NddfhShKuMcHR->Z?o5J`du|&y^d&cd5HLm>9sidmi z^L?~i@`EJpRh^R$>v4WFa8G5uhx+Ka4Z=R*^A4ePh+`UPm4`36cZ+$K-%IeDf=%pJAF0qeK-cXnNhvVbj2-?9d zoH~(n6XG}w{t39iXg~NH3+-b57HWeonu<3!!*!0#E_yR8diVp(vKMGD^w1~UqLLEc zHpR%W7pRcp+OwE<>-fG3TDZycZn8UV8gr|1);f3wQ#o9 z+ah_LTfF{!l5z-20u13f1PcZR3o8mQ2EDKgp3(4TUGzeG2$Hzz>qL=y&`;&=?z|54 zcxWUt39cemR#g}-t5{RxYFum?cBA4Yc-TG(qk_#$^y5n8VwaiTKGR9<1oE1+8I76~ zYx~LYZdqbt)@)$STqqrg^*NM(t-ngzh~)4{ms?8JvnNVPEfJ)B_O*Epo3RGGA(nS0 zX`O^qod%w_cV$G-)?!@>!{WCLs4bQ3MKa10UbSE3N(^kyuzEvzrcc={azyE60 z+fFmqBB`FiQ9vWj+L=GkX5{Q9OQokXGs>e8M|J_EU*gV~%uZQt6p^=_D|+7Xu8~xeuh-HDvL{Xh_JaRfj~;74=*{gq`Deemd{<_)x`6)JM|63pLvm-fl zG#p~C)x1kW25R``JCBo+i>%9wvnQ~7REXSv>A1(0WjWwM!Sl(1wo9 zMYTi1J^|LUEXB{{ey6aK0V4tNarH%FUq$EnWg^vj<ERZ<3p84{#kJaf)Z~brRCSV$3OjmFI%O|USyT8)JgB>!oiCH5Zt>%x z$dwUVfVX3rkEGG&i=i42y4p7)@X#8FMv6Dw*KeDq*ZO~FxLErNW{oA^T82nLlig}b zdwJWGQLD_RDR`T>%=7X%Qz|`vN0(@t(@ZqET-(6dDLGPR;CPp&CdjAROv)(%>8x@8 znP8TjMDi)#!A(`{i)EIe-2IMy@J@jPEo9hO@gEw2{qyZ8nxeIbOOduAYw}D_^Omr< z#tWkoPfK)S>p z$O0-87GPHQXSWPv&0_)IC1zm`l|NO@Q7JiP;0ZF#d+ApGV|b|Nc#0pO?JaL+Fh*W$ zqZ>~l;XEmPo!SZLbUn3)O(^zTKV2(WHMNpbCzcx$)esCPX{v3 z{j4L}R71QA*8SCW=KgQuk~#-cqomWb^!{_2-wppoQYerUq|SgizFTEe0wq|&XkU(n zG!%j-41vk{8LyU#cR#G9MgjQrQ#G$+>b@*oHUr^E&&fJ%zUCdYM%$3Pw|2zmKm2{b z7MLFs^|W<@Q)*$E7FcPa-#HcD%*QOzfWBr?%_v%pe7}-(rwg+Ej&=gq=CeU?a`za! zbr0?)MzM!mWw>(fWNRhGLgu@)O0WA|1Va9a7; zBW{-0j!h6#;@d5rmRtA(C;k zA%5C1{qIRX8>lf!vkJ|J^+wzk-6E8p|N~F0CsIlO%vC#J*R+O zw!4mhEd%Wd8iZY|r;c?$lxUFunux#5^NLNBa9-QGnj7t>%V1PmLpcdCXXXvLOF>_m zQ(RMLtlcvJyls%Jq!lWrDEcS09FVJ`4rYt34Wr%e{&YV?3pEqa`(N18O}x5fu0`Ff zktD9sz6d+`*F5yRp_kCP3CnKC3oAR}cu?Qn6j;xh;gYjmI?$ZZ-hP^}^e{UHYF*Fy zqxHt?W?3FIcB1*c+Z3wRM*BI*PGGGWMrQNcqs>P!yY=x?I zxhTH<5tC7z+1I3>c4CkM0sO3aU{%5ZVe1w1VsQVCCKen^xQbPS1*Ln^qmq^)fmByn zMbshCa2J0>cWzG{JyMI{;pX_`-o(yQIqd4GsL)Jf?!4WGF^5()v8n1+%I2#K&Y0~yZ^CE40i!l$KJGmaeiK#7rJP$pl zu@*#y4qYs8ggA!eZ*gjb<9-03-cbZB#;U$VTyS#I!^V53b7TRkqtrN07S2ua$W^mU z&%_U2kuVkkZDgHFjmev=lq6_kp#xsa%9Y`pj%zGcwlRa)je!!kgS@4cvO#9~GCN2| zz%QP>|J@w7YU7hLwI=)`S8sMoUlXYBMBTc9<|%NsOWhW%QiJT~IES)Q@@;cNE%0*GDM=`= zhCy@G4IpUhWLU-?M4X^u3;(KX7hR*GNzQu4@jQmf)r9u5V`|x6QupS9ok^6~WD{+~ z1a&FvoV2qNatwa$`hW(LMw#Lrjcscu#XY`FNa(fPds|qfc*YmAX{ttP!%0E10h%+^ zjX9};+&e519$7ngm8Bz?!U3@B!2-O&c zRRp<*aaOLNFLbV8jCWnfo2z%-b17Q%{MLPViO^d{Qb~_|8|dkHTj1@y5sDktqrxa8 z%ZhB3W+&XWZQLu20?_BjgDhIfw3iLx=cAA5Et#7)<89E)-0j~b)=z0I%R>WnS6teq zv&>%rJ8ywT`BD%ATizk3$!da@>EJhLUM>{#Yk3N7S#nP!rPu+4TI9&U*c24mSxva%b|}S zQsiJ~d*WKE$M%GpvYis*!N7SmP>8I(ke_}^c&BCxx&+NP2vFUjFC#!}eo)gWpS%cfK#=Kh#B8M3?mr)^$QHJDVf2^ARz$;tVY ze+Y*Bog3m>e`W(+8BFNw-gJ{@Okf19E3<1lkmG38pK?`trnb){zZ^2K+Wk!`98}6P z*KGy(elqWfB9H^g?J7LisPu`may1WW9_dy9y4_dsan^-Rcpkg-bs&+4eFn?sI*kFSQ+B++elXoA}~8s%6%ndbkgPavCW3q%xJ(A`LyiJ0)N7 z%ggut9l#YLX_}CU;Sr3-usG?o=s$!m+<>LGd5~VyJj-{}rcVEc^;-P_Df@kbVz9Dd zKt)yj%+_H(q0-hrYW9B>Sz2*AuM9vAQz2HCCMa&G5%ScFVZzPXBzR@lT6&AQEm)hO z%^HyH_Hx|m+LVHi1YKv?izpZbfWHbC=;6iGVn3fH(Z5_iqtw)r7y?BH59AX%7chm~ z$^*z-KROe9t0vwIcQy=_H|bJW*kjT_x5{(+7vSR_)7_oAbcZGxlVCZoS=A3sMOdIP?v4fgX7x=&Rw_-JDO@Y(gPoT;K)8iAI-FjN@ACrA>2| zqyLGLHECIqf0QuvI^>`@EnBNH=!xGG=GBrMK~aY43mP#SNEU-i<4FgfyE|)KE=OrD z%MGigg~8Go2wZM$CfSAaaF3dDs^H9GK5hfQ?u{=?T4_6>&fB)~?|9l2dS~>z+c=|u z?;V{Wu0;;4=NWYxL4w)rQqFs%KR)QEoBVg?L^dHQU6I91I=Pbty68KHd^)pGrTx_UdNC7K#EfDz}^(p<$)Zhw);t)_tX`(yMNnNx)j@&bgd|3;B#;FCD>Y zSTKi*1j^U-p$qFKZqGPQC^=xgq~Tsjp@Gi!M_PDWc}&r<8PaSk=9Uh|p$LQm69Dy| z@5IfD1^F@Pr-DWRMg`-!|2QXJGDi)~>kh*==9?Bjh*QoM46JoyW<|EqC62g3qmdE_ z_x8K-8HkY7IJ#5<13AJn?8O!;2B-{NnuDxN(_&b(?Tbm8o;slR)|>iczuiW+ zxgl0@1h(FpIwYq^_hsMo2oJg3S;Z8X^;!g5bN3&Mu^b)iU??n_Bv$LF&}C* zwfBF3YMl70fF4;RqJO9xJ)-EmnY2`1S00CrPDc9K!&GN&xLQ$9x#Vm zD_e$9>C3OTLiI-hCmpQd>-o=4@b^EDFX;!w39iCrokh%>_at*X&Fcy_ShiDEgrnn) zzB9lT(6LPDegYQxv&Ljux~F@1xU_rXlg(pmS2&H??f-m@k}K7B5IBA)qKN+Gseomk zR)Xq$=a+QUQ$Hoz|EaHWX$%_tgk8)pHILo1@xuFKG~dA_Rw(yc50F>UdULF4La$1- zQFWHq+d#Z|15Vq-_s+n0bB6-_J0$LLyoWA_%H+1=mZ)m zDS`mQB-$mD^#-=X-6*P(i*k^lX!EIdZ0q()jQCJoavzIvJERcuI-b~W*wZ;rIAN)T zdlO%$1^_LMYOjivFi8BE!lCD%&46Fu`D{Nd4SK?>WvsB>L(J~d8SlMscDq`-wC&G9 zOGYyD3gSEL?-%sXp%4e2C)J_H-Xxucvgm|sb?E0lmwzhlfTHN`wQu&b??e@=rj0mr zYm&DxsqY{SpZs|>DAD+<&5hcjKL*di!lEQtkLE1ANeM6l7d?4uoC6I z9j9K3^O4ahgzkLl6Xw(OE$QovWpBL^BOEc>iNKJfghgX^mGFzfw*Mu>$Mt29d1TT6 zmFFgftE;A343BW((&ki*dak7PH!AHQ;rbdY3HPJ7+_XyTh{H}j>pv#9@I;GPEnDAu zX5;&s7&*a-gmwe;4{Lt;=jD-J_dg2=`Z2Jp@RL)yRbA6|q_rDeQ6e zXbxmi{aE4oVZe^}8yJuv29s^o5y>|+WaxlC0uJ@eyDF;()Ej4l7Ee+T%A;Ry&1Dz5 zUXo=@K3%gQ1f4tjI^s``eowm%K~=r8{44EKlEo_pjVvi5Bkj73^b+=GTaTRaps%YG z*HeA4)xbj$FY;B5hN8?}$B2MbLhZS-v6xTu3%X~U3if{Jivfe%yipfp(P1K9l8ER4 zM|{DAj)24I8Y#L+4Pvigrjb=gwSJftsj53HSigb=T@Oj3neD8Vf8Lv6k~uMrxPo0q=rn~kyjWD68$I8GHJXv(E>gXo=`qD$WQm#Hx7 z)z2hkRJ2)$k$?V5cr_UxzzQ%N)xJmuh@Np0Yl+*$`rQ#~tsLS$5TCYUibMkh<;%$n zcjV9>KJ_I`Xkf$L(?vFvpC;xu9Blk1+9CB}adGW^y~h_Nd+atmu~Sj8wxb^5Zq zrVwO##aRI@^MpCZT#Cm@X)EzI4ETnAm#oy5v^Xsy*-FS33yf=uP`6B;sRc3ExBSW) z`;)bw>+QHlAQxL=y)TpAq8I5}dIOJ-JNsW^N9$J!4XN-4rayxnZOh7~^uE0^r2IR# z&8VQz4UKY3a}2x|(|dUtf%yw?Hh{f-iyds%V?=Ay{39bBc7soSFkMai1KgaUPIumq zCR9Fi{}DT#+zCLxdf|a4?)F}Vby{UHY`Q_E`_;jfF?vw=MBSj6psXw+9}q3n*hy0% z4`(RNrQB7g`7n2#McPcQzh`)4J1nQEcPd`JR+W%&9|E5d1I2%P%c`hbR;{?6iglKL9z@f<<7`e{! zGiDjTbUWyEcT%LpghZ<^Mg({mlNfL@-=4p3%@2evXc)!{>RdPKVdv;pNPIJaLcWt&U#8x|FlOdmWFPR4S%2 z#%1X4&5+WboIXb%xKB%)QQR+1Mp3sj-JI+?2LBvNtYVc<^dj`~#HDEag9;~P4kB2# zRhm15ZLO{d14mWR5sC@5X+OelXRc<=H*a0O(j%lXO&f$;kmpBXg=ssQ3cMZhT#Ok+ zyB*nVr0aujKG%AvVaOzbgM9|(P!nF$jloG2eEqssl*U9BRotTcpB@WgD2OH`6l1TX z(W2m6rw|cO$Nf7W=LS>fo=G=32RUBbpkBIR_#gC`O!mS{9n-LZO7RqUyOi_AMEjiW@?L~ZqE(|s>JrsVjDuV8m&H`9rkqmZUSV zH^kz;d6JB5_W`MKHWf!DwuBc3{0DN%O-?bZ^_EzqY)Vho?-U~G1cC7rX_phV(UNb- z^tXULsG4mrvXn3Jc08iq{fU~v(^Yvnm>o@pcbjBo1+$t=jhr+AeuJzlb$TI7KMO!( zr~`1@OE{(X8idKhusB2t(sw0iV%!8pkgCn!ce?^Kxx0-8ckV8f>X5%(;JTpoZK#eL zCw_6Dh)Z@8#{m5=BGtanm)aO%{_d;z^b1=xWJWjogb`hw_*^szDo%w0*YV}`#9MAO z+bexgo5HW+TYS*o6RH{AclW=v(mH|?NhY)4)}-8Nkd%c6(7OU4`v4F-O4f{hY}x&P zalt8i;D^+DqC1?p%C?r9geICCl>n>pafk^d*Uyrq+5vM~V?R+yOk7pEs?RZ2OmW$f zYC6$V=Z}I^$R9X~z77C>D{n?>Al*I{j<3{pxn~(Rs$=&Q+*qr^n*)mTlHGD3|6MI{ zv;?j{dERs(2%PFQndm~&`vnbA1%=h+FAOuO7t~IQDt5SwrKH;gV1R@<%e)O#*y0ix|cyyBPA z6d|ukL;DdQ(N=U;5q?GlN^i-*!1&z{E5l1Fexf?8lApQ9R)gSWX?Al{Rwx#VY3MK~ z?{5!mP;AC6CreQ5oN9oZ#{=)X>vtin=23Lx>ET<*GBkkk{k;rZOh)%8vnQ5;$akf7 zh)|Bj-_b?efsJ~{&Ub8?V}KGK`lzjcws%-}=kBH^XxaOtphj?5gyq}a2-B0stv}8l z2|z(GbSba6=sLY*$d-a)PaHh*|4~##tTx?i01}5cg)0mAQqYk8OH_{llms2s1u$)s zGw5~W&6{0Y)jJ{^DX^v}rSJWU97+1k_&{axhmATTp)rQRxr7M=~ z@@tm`+?_=U!+-MEF3OvyaobTNO^X7*Aj<-U%?SNc-3R{E+$!&lFQmSokltfzVKM85 z9mA`%r)CBNrK-0@rZ?9gB)!4nI9(tAdBn-%Opv%%KCR;-0Y*WYd6Di5hF-BPnwF3S zm9MrQK88i`<5S*N5Zdi+vl%ujuHk5jf^|v@B}9bOX-*2`SXYpPKlH@s-Lu{2?6 zTh~Y}WO{j?YfL-HRhtmFHifG%0cDYo^{%3124W;{@Bs8Q0q zF6ssw1C9(i9@3@}o|vC4zYa5+{6j7}j$H(HHi3MeUn?c8EhXYryYY0qK8L=6TtAS~ zo4@J2ne{@ZKWkQ*VMyRKHb>*BRA(QuG}|<%Csypg&$JTfr#I=(HGh*g^@4qBu_bkVhR-h#szxfY zgB9XQeVnJ-mZQP))%$9!ju?xGFTIXXlnTw1b|#yIyPv#3%J-&3wl8>v&3Y%au-WY$ z6#Sq=>s{T$FJ0Y2X|+;SSS=Y}lf}CpXh|W1;`eN+(sqi?Ja09aB;J*?g#@z0LinhU z-%C9;hac%Z!wqB92tX{;=y2?eAZt#*ZvCP8`y0!tZ}FsmWp*Be<~?B0P054uGj@fF zAz_zmDjOjP0nlLsQMk%S-MfIU8PH0K1Sn3GmqfpqM>#2fZhc z($*-TmW$h9{ecXlK_p*jTP!!5?cQ~qo#(}1Hd*JV9w7;$^wQhL6YIJg*AFNt+X@wo zXdmD!W0wFSmuv^$a;eTmEnA)DTRDeac7WON>%L(`_AR4$4>xLgKv2&XMTT_H95*YpB(!{e$o8dEP*5crFm~au7b~snap*wxLm`gzK6roSuVzCeCZHlHe4uNEm>c|$h*MjSwg)kN9w z52N=3I{!lFv{WceetZa~FojfQvUnFejfIT_0+0;Dz*=r0v5sJO1A(yyVwJ7WUXUtC zTp8dd=i=ColD$T^-1S*|4xE&45ia!fr$@CV+V1PeiHjJl zQ0Um2rQlD|w)<3bjY+z=L`?nMBFSw?M$K%o#Ou2XptuERbyZ|hI0@I7v~Vt-)(gi=Bu8~ z8>74a38gLt)K1rydb^7=eQ$$dC9)yFoHQn589x*~Cl@A9x3F~M{qp5kRv<qPZ=oZwW#NZ_GH!hCE0M7W4;iv%;?iQd{2o$}Q*EO%hD?$dYT-TqWTI#|DSX;DkA>Vv6~b8WnaFBZX2Ix#sKz*(|&jLv@?Ta z0FX}K>*!47er@o4@B6Wx92yzZ?i)X^6oZ?y{6p2#d(o5NwDvF-tYAhdbvM1_vSjiyfUCTo#KEF0t<})9kkni94 zc>|ZFw2f*3^6)HS{z?&|ItWDYYnLbcNly_F>voQLGJ?g0;8v<*s8rk-|K1hm2$@v; zx#h~S!8YrEarjJ17Ra#EAt3oElxw?S5rC2y3q|B8@oX^-?h=iq>e<-V;9O^F zTK5bxgWL?LK_5c^+tI%weVHH8gy5XpATcpcmK(P{>6jw}^F&2ji`0vWr~@jwGf?}Z zvW2>-UI5cz;lfGtV+C~XZ%Mm+T3t4NQ2>fJrLBrO;()GrZ;rJ3jX!u-TY_Q+#-uK1 zVKJaC4{7NMiL&_v2VbB@(r+#MVci;7Cl`xJaS7r7c`~Bna!_vUSkNK%D=tG>kPMs9 zbD8646Fv=^FxamRFXHr84)mm_r7{Xae$-E;uIcfP8qOneClY$#O5*5F+%6Mb5K`UO zD<4!DD;^0J+aeNx`jN^u@c9L>=*O7NSX?x`y!$#V%%V4rG4n?omo%`t}L(peE z$$3{>3hKp-Di0%#XuiDd5h6g}L08sTmdjO0_! zdQR`fhq3Oyr$BSG=R-KEL7nQl?rP7`V#I1ux*=t59;@Ux^$TWDXNRJm!=__FnL}za z1;}IEKR)H^wY?K-eeE&vdOof_?^dayb1G6oRGB7?O8E3sre>uEX47piX|d!T1?2YI&tUQiA^C>%=ea4FA<+V z)bT|=2SL9mL3l7WGrMz$`U&a9@1+y@^3!mNRZLRvw&QqGWmsus{d*uR zl32a6JL3P#8Q|WTHc|a0P%zHGtN)54?<&42z!5Rh2}fGR>~9l1uB#2&6c&+dvnoGl zxYK_5$NEbDH5l=s>~aWua}||-&!9D!def&QIj3|;VECXYxOphOCxT`fGNSnjC&s^(y_-Y&%*@_YK7?TfNsb9nz9~3DAkhre!{^ViNlyi8ME&A z-N``y&`S;39hbmb^x20(3PBda&od4Xk8S-{blLSx7e^13Q7ydlDlJ2n<|-yr4hi9V zDDmHA2k23|R*YG(H+XS}^RO7M;JGVt`qs+<{XE)csmw==H|vkui1H_GkbJd>y{TeZTa{u7gpH} zlxOov9e%=NmT>xHD{kQ{9NK97*p7X9t=@?r8t+K&1dh`v^tMxXGB?slL@} zj;V5^l3)p`%5gF?VE?bCDS~Z9mFFiO)+z^@22e4Y%?5KyD#hgB4lv@EEX##aC&ue^?_Ys13Ep-LN$Yw z#l@tdE`q_^xj!qP?KFl2IzKfBNcj~X(|bE`B0FCPOAuTiDjBwZ=-oLeq|A?-=NjgM z`XfTvd*Sx<2U4JAuzQ!-XNOs1kpPFrG;V9b-hDz;njXt26g<(@u$l;s zy{k3vNbX`6yS*FXFO_A(0AJm@oDRPGoYZ`pxuZJ*XKJ1cJI#e(d|UtMTcHou)F`7f zlFQqg`Y1@@Q-0*36mDeW8O7YxNlwDdxrWjJA9qyIkO; zlSB$l>>lLZqhZh;jbw(O9(>TveLN1vRQBFoE?|`=hNevZ8e=DG(g@PTrCYTWJK7E2 zjbqNEdU2R@w62qILf7pIOO*Pvk~g~XY+0znGGcEae9hi#k&d1ksw$(jy-1@=Dbcy` zeEdH$6$WO=uBn)iGGCrG?d=_BfS8j6UIzewARP;>9D||4ec%M%b2_04Ym??mRBx z#0Kkj5+fIpZ2uV*$+=EMap6Drv^)L~)soh@DYyt3j)|KCJXNh!Wb>Vu#P(A{1p@3o z17@>oqCOy+{zQ-h`M!tf!X#gyu~s)|FkuXLz7gU!5WGvC=93fU=8%@icfzg7>{4=L zAYluHVA8Q?#QJ<=hRN``B>hQbte24&tfwVf|oPHl5v^Pb*8tg*?)QpZqWi+uqAtg~#HgnK{_5nw%4eU&0zOnN zA)nTLsMTCVG;2VO6mVuHJHKX!8p(GHpv#`r%wU>oO^=Nb=l~kS-qfQX`G^(EPFBb^ zIPc%P1n((4zQwCj{}MQ3jc~*Tu#oTnahJFTG@ry89|>ByF4ubJftvRQsL1eYs?g=H ztK51BfH%=1qMCl&48al5FG)q3_g#3rRh3fG2bk&Fj;bBEPjjsjPgeNbwq}deQFBV& zMM6<(gHg3xv@bD@HJsG%+z$3p_!TT&@bTibwnHjA_~g6A>Dw9#tpp@N5S;Q0!O=@4 zn<7RB{`s-Ce4eU$MKzABZK~cV*}-hUPjUgx_m)nWYSLp$oUNdnigaW)!(!T=*7|f% z`qz?8)=`j3D%N{LPUBWU&$$Vno(q9XPSH0@|NqBuDwY-83=}QaSb=QcB;6z$xu)9_ zP;02VDGpN4fSiW~C2wxS;AuVN$xe&L%xBuL>$Z0=)G@I4c_Fu0UuZxK-;L?exs=dHT7>O^9-Lu;N}6ZfLl(Ga4n}Z=Kek`64SYoqFTy_N&KGQEV{K3 zcJf8E4QBD5zc#Joc$%lD*EIHt4 zuHd0ZucY%MyG=&orCvM7HD2L&WV?}unc8IdxCW-`PiA$UaMF=Tm-6LunO=)T<80pw z(j`K(37W#E)ShSVME#rCK#nMV`D(|l4YM}^k010qk$25iU@Y+5*X$8=DSaQas&{}n z+nR~dJWNq1ErI)JU)o-foe&aqyXoV%5UR5bJlS9FFIp=L*}b!wO@`zzhzWq$foKzu zTq?|RxBJi;|9b0Og~ys&rT!LLUtz$f$A(CEcHEmHJadVwo_?F&t^}AZej5^g87TcM zsh*C10@Rsh4r~RS^V$fax__oLjpxrutt?zvdc>r=cv~XNjbMu)*<}2B3n{+h$I2P} zI2Xa^rwjLHe5hPs8)xn!df&4xwt*yVE#ZwTODY>y6weLMwxb&1?ldMH?6&9T>(2<5 zFTidlz}in3m!Pz**o}uo?1-uA5^E1tjXfs*#OsPB&iNr z1gbKkJUbVk*XbFRcKhm^gkZNC$!oIUTKTo(RzNRWm#l$5LSO+>+BlmkM=IZgI>({z z8a)IOJ?UBsY+>i7GPN`Ap0nphx%JCu&{3zt9isE7cI39^+tV!6Sdp(NIQN>N2(82m zZb9B}^(k&+(4FL&&xyJ{2XW$BA5fr{lHmq)gstOkb|gu3X3_9F!HgQ#GYU*d&Qlr3#~;{`Hy zR4@J`9eSEwe$|7782~1MsD~7`j$oxA!)9vZv_LShuOCtj$wM5%2|0u&J5LkpCnZO_hwHZh& z?`tR0I@fK&YDQzRIDRyoQ0QKb*3>Y)thbOtngBhf@)%|h|FV*_6d*hSP!0TbERBZ2 zTymvlu)&3(KjiA$6LGB(JC_i+SQ5#Op+XW8uvNq-(WLEAKREvLvc~nIh({`3%R3`{ zn@!*He$@ae!!tk*)@WD5L$0)^3AOrC9*H#rf6#CS?g~j}#6zr8TE0e)Lu;n#FMBK6 zGu%Es`%Zs{sK;!k_7DadHfb}pVgE_m5b9UiEZ07KJ{dEX?xD`2yksP`$;-#cn&wKL z7G4u4I|RH*$#Q*&s8lrifS*GtJ63?Vox~tqX`VcyHc_x%ft{_t;`2(-=BG_E0+3AI zvC;h$?`|IQa}TVk*81CdmJ@}#S0fo$*p*d{yHkp z+```RrhDPZ79xJ80{|F71U1rxof+;RvHhtlj7a{D-V{gNEJKeyt?jcR5{y6tX~)Uk zI*Zg*xW@5-?4sM4_;;oU8{@ ziC@bC=N%(JZB%}pom=PIoY0n$6(7ju)1`q0KeKA>EaVEKY7C*HpsULhRs({UOwlI8 zCR*@nV1fk1V2mBp*XDE8#dm3zb*ELb9!U!ZSqSCF1g&>pUs%YD`ZR22K4Y-&AMN!v zPA>-hQpKr37o~Boe+3q-gnom#K6}Ue31wB&|NelF&ade(HNlXeKofs=8EY8_rqNEc z5!Vx$C-dREkZHGrx&6HjUb$11RTgwDEH00B+GYY|fom=;hhh&}NI|Hc34Y7Jk`iwR z#=RN<@F;xi8UqC4&PVoQb{tTp4}Vu_@_sXF$Ij17!QG+M0MvYMD;oyD*QQ8>O|Tbj zK%C;EY;a)qjoBC7H&MMK&`7+(XTBdxz^XL-Y7P`^tPVKBf`nReMQj#{>R*7e$6Le5mIe5Xzh;hHL4U5q^NNa*R2JdV-j` z2G}$uSGnUN45B4IP@28*%7XOjMC$1^I`{aqsvVj;k&l1KoOMiq)B!AucedFdrRz%N zH<@D-%0%E_WVk!s_+oz^*iJnP2u79?D_;6cRelp?+ikEEFFJG**7 zjn76bb)JX+K5_lwN&DW0M^2+Juusd%(UZRseNFtnxz1(Zw09{v3XbpbKH6$1dKLHynPB5T)8X<%d!xXGp9UXzE4*v`3Q zC#6A{b48m!oZmGs|7*+Tm-XU1FGABTc&8+4%p{vH6XoYSC-pSxv%U=t0 zGN9(119>)hw|6oU=T%7|G8ciaR)-6^O+<3^lG zE{Iz?Rqwg=#Im-NGmC@VK8WIuz)CZUdy56jNy4Njf=~96T1I2Y*BdM>GtGaoA_ zvOLWuLFj5I|DddTySmMz@aYE91MeJ&Es-MM;PSfZbK)ST7<-)Xvc{>s*&c`4A2okQ zd&`a;mP;AvTO1Qo*RV5ED_D+ZSb@&8B(lo2V-SHDd*Fx_xDaQ?(mj9TP*K+&`NJWI zK0Ty^d5)5wJWhDe4Ao3;ZwU`CU8x!}@m?3=s7whKYZ&ZS_bI3$UnQn*jZhT2CZG_( zn}bLq@}xFifVq|R9-{0}*N0(hirwwW&z5RUZ$LD<0h{MYbcuM(bdkxUvI<42Ne^PK zBah#|<#S`9a~z;QBEVZBpow)Bj!1AklTLJjqwEpO5O!v3KaHF>`ROwuDz2q2WZ1|g z#m?a}dsYI`og|x*1N1Fi2vFz$qZZ7TB!r_z?@_(aULwwWGCp=UB@iS9W@xl_L(34a z_nVen!_%g{LY3tf+uY-ez2i85aCGR#{QqN!S~8F)M0jHM`4R<#NP%}>-MRou--gxg z8Qid|0IihU<*sj+CFwt=Lky3W1Li5mSIVy(j2b{+o71PR_;*|=b(k$o<*ZLs79mS= z7dxge{2DKS!1|FSUFOw4S_aIW5vc1Yr^zsffk8KosubSS4Pd{QTBilPlddHz#JI-)R>K-XMR)4q`2-Cg@IJIb$`Bp#AP9=t zf+=v@4*HyrVDkM!(V_8=AzA8u>H1+XHqDw;k)Rcf2McnxIJqv3%;A|C8J7jN^qKBU zTirf1_jchS;R35qr*-TFYZ8X}U^pF&wfwhV^mr&|H#cXmwxo08>fTI=BzJ!k?2O_D z8&XYzpEz*EG}2@Sgo{9yFpKjiLRPFA;EYz<-*qL##HO)nY3+;Km@H_|h)bQK<0nbY@Hb%E)-~A;{L3{JA`i5i^eujYw+g*n;=7#gak?!QC z;PSE9y9P1*x{0F9)-r8QB;mCE+Wsiv&vOS>AM(+bz2n8T%9A8&)lv>|-T0$EkG>uv zjARUHrV3IOZ`kTG+N>BNEYIv40N*trl|#5&oNbq=(8{sHKy6c$k*mzlH_*7(fk$ab zwEKBXjzxCK#DNiQVY;#~Dd<0(Fpd~h&t)~n+3-4>+UBUP=B{2|r%iel?uo^MV2bh> zmoH~g^%H9rtBvw&JbzNwkI5e7)6q1f%qzwdh`>i_4j_+FWOc3fXi-biWL12A$jJ^2;KW$Wen`3X<8N5a2QBViO%2UY; zqb0_ci;`eqKK_l4u-F&Dg_WctXue<2x9JK8KU**Jfw)dN+J#uXsKr!CB&QhaINfz= z=jfoOZE$zZevcOO&WUUu^Ne4lWxxOLv;wDU*i3!`pGqMSG-rzcdo{DhLM;atZC%W|$uZao`K`tB7Hi+!f&_4+jWv#svvu zSw)$Nw;18(`eUuaAuvYbp!-KBRVmND@8*8>*k5NXM~RqsD{fB$hijd$+7r1HhxJt$mct76qH-1ZSOEG66JPgmE@7ly{RxeBFA z>ic{{W1L!JFx@>CkSl8|0~B0by)J9hRq94ShIAshIAXF`4))-s`It`CG>Ph9jYm{Q zd`07Psklj)Kl6Qb*t8cf^O6XLRrEAFI?)J-pwc6C%^M;aIw3p~I^P=!l{KH-?**r! zNiRR=z(0>Ho0DJGr9PH_{y46uD7K`mY@4loT(t>&sGM-1LaR6|D`sb(9cV>fu=@z$ zr2Y`0?Njtc4|=md?!{B+)JqvimTOmuSeAG^3rE!z9!r@7(FRfp+gku-b!ufurL6r2 z<$IJTAo=L9zKKy(fe(m8u7wGdxAAtUSpW3LPmjebX{BrjM6)#6*0ooD5^smuQo_M;<=Uz zV_zHXf7|3Mb{=vdqum<+E?WULB16%AMlKT?lT+kqIVjz9Fkargb3X`ma33s^#AD}VA$lecSA#`T0{9eDv?v}2pt{JM z{}E4Kz+THC=jc1frGfJkZz$@L6B-CRp#&`UGv!( z79{i^j@H)tUQw(##5X&PsYWGU9y}$BiBYhJYQz|ukdK5LVL-%z{*aKAZS455c#-Dt<5f@QCCxaXA6pIfE z9>lt7u3_JTQy8I@A36+96NNu{lq}Hw5RBL=1@JgpfQ5NjCQGQ$wL>GXHhp}i3TZ|ur{IgmgEDH* z@vhdHF}E)PuTG^d`LD!$&a>M&#*|`AgCDiz0jWowN9im#|DN^1rYW3EcGmWhB7=Qv z%OH1tMs{;Dj5(VwdaQnY^f(g^uqTNUE%p;ACZ=M?Vz$=Z!H}*_S)iPXHEW{Owc_J} z#U$Wd?Hbogd-{Vkyk7w$y9pu=WoHA9gwBG${O^8htBC6wnPLN|;quG%|AaHWlDWS> zwO6wxWwcds6DaM8GPPDo#T z9oG$NZ+b=>wCj2lbMh&6z_8N>@$|Gf;2`ZagoE2Jy94RMl1}_i)DV%XQF2D)tQ(26 zR|MzfBKgm8q@`Fn`R)>ZmKBwXfdAr~pDypN_<7YQCSYdexXsC9#>fJVbcbfz9m|7a ziRkZx;z##xD+brxAjVwt&<6GyxS&!CyE3uYuyDQ$B zNJn-ns$QyZE7Jkca#L*`&E>UAlNy*@1;3`a*#sb}xUM$pTj2Vc!+(2ow}KSrUFAq@ zFQ%t^@&KWwr=Dqs^Nrm6!DIQXOa*3B`S&?LBPe!aPNTktzQeAKA^n6{-jwJS-)J^L z7|baXyYTCq#BNKPRwekPAW>o}3UNCKi8g9MqinOVcmcppNIOie3Od*Hmo|n1gn{U`Gs&&pbAnz7nifUf_^Fk=CJB zJ*b2m5I8XmR;b~)vVa~iz!5#f|9msp(z2!@{37_2ZmXao_`hFFZqK!0nZ=4S`3Iwh zyQ<`$we)Aa6Y2Ep$~K{x(n~1e<+)SiW|FekyMr+@+RDcBV);K>8iJ2s;AX1j@%^!i zHk{a7nK?3(V*#JlNg-S|y1hP)&EvYfM04kXqG{gd5N=w_aah*nfkGX2j{>Dg;Hgca zavb{rYt8ZAKn&E{B$BQ9ab%6N0lNJ>Xon9|{DBXOyaxn?6NAUvbt5|508CY($-aTs z0DjylUbn2MtiE_RVQo4Z3S=?EkvMmK z`0kvMzDtjTb)xWug)vi;Gy0g}2^6OxILF{1`{UteKPj~ML3nkBBKD}-W6Tiyn^(#A@5sC^@g-3y)+lmGQ_Ac>nNi}# zMO@_uYPy_*9ry$#tUwYuT$glb)h!$4f(nIw)-Fl?p-zB(7xKA>(vexPy$%8!59hwK z#RtoJV_v9Rg*ISVu5LXVxs4UluO@|tA2r)c0iI(6o*L_pdW2S|TL({U3)4ghR0Cl# zM9orFb_I^Md-Y)t>ipM1ar-bDx0Smt|8KgnlVvYy-M(|%SzZo9n3r*VkSxP?>?*<7 z9lo5}y^8PMVA=cD@WP?N3OYpOOb{t^@%_UaHQ8%uE-N2fa3WH)^M6<&$_&}j;VErb zkQNxWeybsPzj~V^#%REIW!&w{fld$qCa)*+db*Brr1knMbrIb#?7it7j@*1@6XYBa z$KcM!*$<=uFN@P{`O+Vt?(l3}{eK#`B({dovqZDPk{qM~sx9xo+Hr$xz&-hYh}@)2 z=3oT>K-!Wi%BGow2~?4OqUuE1pcafGEAPyCq4(?FFfOG{3&+N|EWEAt+xode2wN)L z7(J@fxzFUh&22_X@hf>84?wtpI@8-jKt}Cb4-W`WfAIS3SvC_0tOk}{K9njoe5Mxs z>5lArgAHim-Vp8t)z8uNcwiHm?z`WRQ9lBB@Aw^k6%|X^<2p%#7+IEC8ejhs{ve-Y ztiyxx-UP=FUw%O|?$6(P6mljY#(STH6{KZ&>CY4-=&^BFBj@tpcs7EP>!xHDAjR^I zyqH~0z!wFrNcb5?x2##el%+@e39{VvFtwmum8#cuYshf*fX=xL-ByGVa<&k^?;5Z- z6ePJ*kxQj0PUGs7B`d$cQmv$HWpeEDTzDM>O$tOqvr=Qfa9$g1f|wSbFKC2Mg9jEN zLMR~yW|0)9bLFVFvN&&)?uZ?Q{E@0!t^T4oGf(|LI63k1itfoLYEeG0E84bessh}E zR|r?`ikiyp5~&}9{PPYSP(k2NlxS4UYLj~j@tJqLh~H|NPrGd)#W4)LILZ^XANqe8 z%o`Dl+O}?qe^ne{nNB8v`s8m_L|jxcQa2(Z8BPH)MDeMOQ&uMbH)WA{^&OD(DCqbw z_6%}$`W`{BlKVyEhAj70HgyDc*T^{q022fBHO6tYRWu#7!8(jvFNh|Xfs{h4!KT%4 zK=_-S{TfJIvGZUH_cX%NCa(vBu-`j<|CX}Sb4HR;Q>nC z<YZR7Qx7n{Glg!LBwq^R1vKNoY%h@ z5=`4!y%XyFBGPj)aiGC}ZKmo!%(h>7d~hDrXmw>+Lp-Z|gU!*M#M81RtDUP2JY3{b z4WWi(Y}Wp$Daa**+-Zx9kL|8ih{>TKF`f(0!tt1-pa_sYO?mvc;#mhcRZO5eL@e9Y zNqjSnr3%Q9>sHRWF%_?m(+ncI*U4np)I6I11`};*iwh!;EaXx=h=h#j=7&kUWT*vo z1l$5L>h=01B(sWkdQkJe@Tg2PCQMgU zhw;&Nj0N~;7cy-rdHdPVMIkL;BPK&5(d+^o^mY9g-+mXX2vO-`m}GS>Y|bH}py?{p z^Jtwes7g@~vArtVh=|#*dOC+GGB&3 z=m_Q}Fn%Ik4ZfMN>iV(KY8ByNxVqgnvCTZm8;PceXN8FAk8yk=;3spj%{13ABb;=n zX)C%Ay#!iv9&m@{2l_S_IXtcJZ#@y^Anyt(hH+y z|6+|)37TC=K@`^lX5|-fdF0L$xtvu#?2u2E#j$g!dIQjDiU#-$D}H5=Hy&Q`dk|$$>ZZ+6m_oZOkXp^6tw?1V&hO~Ul3mt984zR$1~7HBJS2DPX9(3sX_E zjSBW+nK_@0Fog4I;JSoT55)r-))vI*q{Cnqb=GDufc%X&;mE5SVvjrC3-F%_@L6bM zzrIXku*CSmuDnA%Uf+U+{M%=uw|4%-jk0%l(%<7eN|T zJv-&1oZvk;Lqnl&a>qdiSL0UB^w<2Gd?5&~-C|p`x*i^l0#`+ro)2*}>tzQCzdg-u zl#jGnguB%Trf?MevE?Azw}x>>L5aBJ&xm&@dmZK$RrG$P{{K`tLX|@N8MwE-l$rkT zf1;39p4vU;U-w(8ChEEN*G^9osB4vTEBkt=VXeo~JMopvh?4!Y^C#OE$=h+?J3L;C zABFxZ{tLt5Vn`U%ZKpJ!T}G97KD?wR0Z>ee?6C6l)HF8}Z^%dx3paK<*a( zNBAIHLttbv#9Gr$o{pxO9Z5FaEC%~Bp|UvhL=L~BIU1J(#jII$Y3Ox2=Bugaq@6YT z6MeyJT9P)=3!1}*8nFa|C1@Qwl_;|V!0 zS}BRU8vQYUD_2kg{%lU;5lcvd+Z8T=>hj2XI$RCAz=o6Cqe>cfLjdHZa2gq3XcDT8 z^|Ntiz)WF#46HR6rpcA<)!Dtz#hKRGMO0NTrumwqKbL}nUJ|VT@q1C*ZOrvI(yq$` z$B;dNsFqm5eL<{WI<&S9Z5_xU8b)Kb~u2m%~JY;p>vY4}PDWfW$wsrx99RKCH-XYylz7 z6tE~^gBDrF#u_RXZyiBXEB3be#t&S9aS1ag<6D+52K9+x@eA?q6eXu9697MRIsD*B zo9+e!zfsKc$W#rR;y$%sveYG9Ve2~+cd0S%3&(UaSGR8O+i^X&%JtAr1^nVIaptil4k^axyobBBn6egSJ0T(1X|7cz0ND zXhTE?E8&6~2gOr|s?dc^EXs}^X-9zEpFNxsj#RB`!$_VgZ?@5hk2J1)ohVj;1E{1H zH=;7J`1DQZe-UJ^X*?f#DzNI=9Tn52(n`_V!LZkXA@BKZay_QAG0eV4Bh`RR3RdF)BB#1*UmxHS$upi7;l>xC-!HNk1&&6hU?(f7{M191s*DE%Z)XuR z>~=Vo6}uzo2EZr*(pEwI6B@4SchL4!`WC7F2BHhKfK3H4t@O=sTN38=#6;?2C#^Y- z0!mi&y4kJmNZICak)FNFFJCxzU`Q$0$~JP~uHAS%Z|eSVGt|v_@ZrVVgaKmSMq_Dh z`l&$}B+ddN7``AOm^^msmiS$$t9meY0MsPufulCfTzxZh9kFg3SMQx{~1P^p_}!yJpJdWaU8F!f7awb0J+wQ zTa&;6++m$OwbermiFL98HNH6f%Rn9|90m2U0LF;vNeF7unu1AEu2gQU@8RN@re9WI z_vo9?@KaH97cd}JtPnYIEaNYCc3e37o~7zLFPy3Y*y(RT^H0A~8mdZtK6PV8rh>A* zM*VWU;%q*LtnTFvduX;hUh~eO2V+MDwyZ09(UzC+A*#Hxcuei;B}W)Zv_Q#D?53UG zi;|_th6JF{Y+YAPOS}9+!J_*rF|MeU^^y0=^-@XDFg@7cN7cmI;>7T#lQ`?a9<E4%eHxCi>%9`nQTHxWr{-t*O$!HK*Jewi2h2@3icpBmVGd~en3xD{y+!$2Rr zE;u7Pt!n0WU)8FjdDdUX5qbLF;uLZ-EFG7kAsUFGaYYND4FvB1XSAFXQA~S zw=1i|`_NOQ|Jrz>8T*PJwuhX!OPzc(mus9w;K;BZa41HILab;RG>u>)6{M?XuIf5O zLLuc|1ICiXSUj^?y$$5_@{CF7P%$p9pajA*s>ni>!p1iavl>-h7OThh@J$r_VfZ4_ z)(SjmUI|_T`U_DI6mPH_!XVjKf$rmG#+RRbh8(4~VEx95_E0gV+sAZ}>6*~Pcu)!6 zyCMf47V_;kHayb6tvYDtWdf;`T{C;qUQ#K#cLGxwFV&HaGHt-qg`7!GxFBNWW!j

fO{^1ULO7x9*B5*4i6gVM1?Y8&}tD!&&_MPG*_NOj+{WoJ3##VL54A^3SPi)3mPFF~|3WN6A1@Rk#Jag856IyQ4jar=sQ~o=AyI3_SmseOb0QC%^uk)5!XxE(h&+dV72jQ0fTRm z-(a4;>)^nAh9Yts2D$@**W*C;IQ)9nfzYNJk=(*1h)w6R_G&4Xm@LN7>-OXW(Fzkl z>=`@wb{4$7qBNri{>}IA4m~KVI#M*|aSL;(_0YK){T`k4hc|h_#B>N}ipd!za z2kRZNy!3QAV3oCMT&+3i#Qf;S4iU(pj|5xBjCtskQ3(dFw6v`)mHFR4LvK!JiAn60 zjUEl!aZ>vxs~l#emND0%{OU5_XWj2NU!fP*3VQw}sQ5Nsv|&;9;z)6A1Oz!NI-N29 zYk{@33EH}?WYM~Iu|@0nC0E+!;(Bd!HTW|aKe<>MyI2-jkQPxtm>i4KgVklh>RP=x zlhA9xh#RL9AYWaob!;S${OWYAy_pN7<>9cE{+3@|;kylut99~o;=g|Q^|l>1ur>E( z=xd$&9)%Bg*32|+zmv*z7D{pR%+n-s90^wE2CKpFu66J5W7FXz(fq1mKgS0+LTi!+ z!`DVFTEj$hivNh#E*uJg-Qr7bh_92QVkUD#&<{Nh9HGU5#o%NJ7GCNveW@5cZbzIo z&f}m146NrCj$`3zfH|}M1+2f^vC%PcLs|CXLZzr03XG;Sz8(}tr!=B|qM&OkLdC!; z^cY_pC*pCkIgf~-6a_>M359~AsJg}Qrb@LSsEB3re#xzQ?(-NQwE>_V_RlY6#{cbK~e(WqzRMZr0a*7sj)OlYvxF6q`b z@A!7Zge4G+yFs883sLcj8H%lIcgD8w1^A2;uO zkAGy$aWlRC&#{h0{AtWyXsUyr4KUdZc!pcS#D)4Rp$^F;SpEos#KD$r!Ipgr`{hX^ zTV_?ft%1w{rrwhl$g}#b4T(#1&%<=02tmroH0d19Y(sn8qlUj6GbpQp95dL7D%yUs z%Zwjgglbs=Nb8hMhjV+BD&JmVETw%ZLK$zyoxLsMh+A}2rj;?+7!3lH7{E)q|Gymr zsDc%vA7Z82h<^`fO`tR9it$P`thjAdZtVABPwsbmiFZF`YfRT)47_gjO&WO_5RCix zWE}+laS!J7f%x}+!~=cLdq2FZc4;&gGFAqna!qxm_Yr1VfIieJhOFMEDWSCM zNBZ2aa(cvjp@RJXiu;R{a=WZAK}!@D)x;(egc z`#`7nfdebx4+r>yq<;S=1Fx|wetjys$+l<@#<80dvuiR*{U}3&^o@KR)v|0&P zp8UHo7L@jgEU&%#C-wV(Fz0JGf2phLt>r~0hzI3t=TXc|Gd>X9$!x)l;S^Y=|LMP7 z|I-)$54`u+Vm%*2l3Nxn^GT+?bpAS7LH6~0bgZXX?IoT3Bc|y?|Iw^}_dhAG;_puV z_a}_SdbUwVp;zh}qdS&MI_@PgJW8QKXjvBh=4sCzHB9p?A)*G2Xiwt7WV2 zBIDB}A-KJ4cMQfcW*&8@NPo_N3!HX<00N6z2Slg}%^eGjT31da&Q{6?pEzm{G_*%9R%1WXB{^QD-CInAlDoYxl$R)!wWW+qbp(M zJSl50NBpwsl@or6Jy{TOzql%~@kMu6<6+nCtezPM1D$b|Q(wdg9AZ|*c|cbCJ&hAq zJ;UVd-WA4ca9pg9I(i~=rsEYGt%5}H5mKkurwAO9C#|x&AuF*3um3i)AN&xi4P;A`YMk-TG^ zWbxK@403ENU#iOH<)4t$U5CtT#I}^Tqba1~-gnF&a{W%XM8!HbTGW?UM|ZB`WF0zp z#AQ2N`^N5 zEj}D9hx4os*lBms5~am@_Y@G^Z@5B4<%fZO-DHWjV`pR^;51vogn* zvpQ!@PJ7O_oc%d3Bjdd7`daS4-%G5MpGItsl~*BITg%+t@2KZFLMWm)u_ukn9{ zA0mIm6)xX?jm)z3 z!6%>D_M2V*ej!%FgriYx=!3^1+xTny9Z|Y3Av8d{`7h2=tF946AgE4VWBccNg}O$C zi_r3Uxo$PD8`OO&&i%X9ee?PrbstHc`(IG^&Fg#BeVD-gFRJ_IwOKwl`NwDLBha^x zzjUtG@cqxwUTr)+JSV8q$8+^qSqWXA7-0@LPWNWs?%hnuS^nv z{SQg4O;BYF#mZ1`BM(%Ei1A*{T!A9P6kIaO(=+^;-%j3@{BDpqcZ8WLi~5PXPdc*J z_t6Ua1IPH3wG$H{M~-$&Z24g&!#OAu>GO_2B)RFD z(4#`LSaaq&8!tt01Z*-&�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 z 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

XUsm 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

ow*K@tbd z-KwU)KdQ#^psPDU!>Ub-?lk9Pv*?}X4DwB^mCsx!?^u;GgY5o?q;Q@Ykue$mhcydmt%GTHCQ0bo zpogO-<0ljW%H#K%$U?7mYM6&RecuUi8JN*FvcDCX=RmjHMIW)qDs4CmGucmcxDa^v z2R5@f>+*eu12%4E-jDaMWc#K((8(~^drzX==-M*gjX~SAcdKA! zJJ_y@j!!V9N4vALaO>~tmC0-=T@Dp4pTDjA;wOl=RR;Wi;rFy(yr5=0dsmK2L>e0PWJq|BXkJwW6==G>a-@WQ_ zbh&!;d(~s$LG`e#QV+XdJseHyksVZzoF~*H_i6RWdqzFRJf|M{&#Onli|R4)CH0u} zih30OQ9Z6-qaMYtt4HZN^(foG0}VPXTdV7{Q8AAyZjldfCOQXPY1`r%5f|IicXN50 zw#T7oo}zym1r`v?d>@Ao?l#mt_cqTi@@6!;=aYiCE4n^Uq}t^*u_>z9^Ethc zC^SG508z^DEPJ??t5c#qWGq?IpDbLN678|AOH8v^#&tyxW@K#-*Jd{!lvH`Gp5J&- z6@sfV=7;adDRNhi+j^b5GU2OC6d9>+{kza^8&647RObNK_cynOsL zauW|ETf?1!tq!;zjvb@jnT$=Ws8ozU6NA8RyR9woxlL4MM@h~Id{*U9tj4A~>LHG$ zl29#OKU@a{5EVFa_-r-$QBI+AEK9q*Ze^K zuX{}XKlcd#Lr?qU-QU9hAXfwb{n9rja`ech(a$a&_hIz&OUEIaFb!hBw4IgFY)|$T zmP{#HPF3t=uTry68%LFAqzM-Tk#0gn-|ESkZeZ8Mb^@F0$pwJUTp8uP1q89K){_TN zgMJ5yCB0`%67sA|td30O8CXbz# ztL4#UxkeuETdqyF#OmWvydftvt1_@9&lJZ-IoIyJXJ2Mxd;fIKxzrtvqvUI2!bpGa zX1;OUvbT93+vi*V$oBam@iU)d55k>x-V`nPZKRJF0=LFcQB1B_b74%i=_QzZs73fb zT`Zk(?z^}Y$s>jcfayqa%N5dTnm^=I+0Dq5u;3U{C*Gv8Frc}`_a)L@(A{6`aJIY# zmLXy~o34bF$UR}`dH`GE*l6Gzr#D=AAva>qz&PXKVc~ff?#zm2oiwY9RzVaO*849* zjthOOlHJ`5E`Hj|MwV>FrptSl67ednJ`waVmkewh9@x&>IefBe{c`FeY8!P>{>a}3 z5=xDvz7Ft(%FxcpMyc#<{=Q6jB4)A0HqsEP*QJd}M*>`DDnruC|C zj7f^ovgmL~_ZAaZjWmAj1^tN;ITyf=SpZQ9wnXmIB}zv)%X0o{J4)Wbw*2UU^u|MD zIp?4Cp+RHkT8NhY=j@Vs){&QD*b=9URa!^Z7ta6L@e`%Cm1%3_)>5h#qo+ClgpfR< zXa|hFn_Ia*j1NPE9@}qlrL$R5fx(i-9Bb#GS>Vv1a35Xc@Ajw~2X-iqq+xexnA!GU zF)N%qH?_uJ)mZCUiVZcbQvtQU$6WAaj1a$_akDL1W|pzpKh%ufG2z!NC5|d7t{+`( ziNpCAXNhUc!?>T5?FJXVf(JO8cG&qC=+Z#~Z4($MXz9xInCVT*NFrJx49(bg}n; zrf4EgA?i~1;NaU9&A0!ZDu~K+|EE;2j)uvTI}{Mi*?(gFg!UoR7KQzZx}oV=COiD= zctq({Z$VZ60O{*R>G;GaN)bVYx%gmoX*yn*i1Qg=3mPUti5*dS1Q%|uxd zCr%|~5Be%nK#)|c9eI&MDE1Yj{0~pF`m+2F-wM-{-2*l!l2!Q+2tYqk1-Q-N>E4^^ zJpNUAS0edy;pg?DQh~5?ab<&`a}81o==(xK>1+u210nZ7NoC%ZD@1XF8J^Nx$rQw* zwH{H9jd;->NlHaT3*9!Iu0@e7Qhc$|vH9j1<%c`@u4j~5e3ymi7O9J(j(;%jWb~k2 zE+Wjy>ZC>DS7|ZxwxZ*^$FXT<&)OAtDiGgui&VnVgE?87t5P!FbXeC|lgT$8k9B65 zeknmxyCKjI6?TEJsw`db9{|w>7cAg1K4_vdF{)dx)1gQMta)!` z_B9!z(T-{NOM^QsB%P#%KnlgU=mO#$NffJHe6O_OC*1u#lz8tU@@h)vwU>^SZiHxqilf&)9e$MvTaXqql;fK1K| zm|)aG)zp$wOhKb#AskRri^h`5p@Zc*6$T#)3$~xs;HyBd@)I?s?Pn&7G4zn2`{88H zrW=`Hq|BKJmPcJ?uZHNX)?)2Nh+UR%+& z>FC)XF1Lo|>d;3=;vob+S=3hCBBBvCMC#%-V;uWzWxI|9J|8P7FLAD&J1ua~soQHd*jm>`{OneF$L+2=r{DBEGAXf?3DCgdpX{Nvn@FFjM2x%H%Cvw&Lm)Eo}SB zj=b}+8Mx&dn#gfg#*HVK4Q|}RT823f7r|RT5!O~#rN7qmh2e@6U_-GSRkQlOy|Hqp z^#UFIQ-ViW;MWHF6B2n#0XE2M*pu#bIYb?}QIxFgPS&J9oj}j8a``TZmUs*=uAg*WEvQge-!e#ROrR)}*yCTa|6v zmgU7ID?Ze6!Z#PuMp=xj>F>n_`N;d=q#IWF7j3xo8N6^ zkvqnSN9}>|2clfdL6{g6JYh~}QosRUCY>9P(wVLS*^KXH-6*6KZ%td}{@sD*6W*L~f8cXF zHxc4L)RuJumA`#4*~+43&*zy9N6W-;<}V_ZMN37;BL`&$M1A9bOKW@GM_V1fMF_jC zZpi@Q1X1T6_J2Y{p2w;%;U4e>BR3;DW3;4b@7hb5WV2taOb)Xcgj(*S+LHa|B4?97 zU1|Tb!VUeNGFfRuklGqrBzEP;B5S@cvxCJtp50JX7xt{EmUpta7;;Mv5+qWMA@zvB z!vrM9b=BlVg><;qqm7X8Yl@##V(BQI=$MiuNjpc?`d)wvDSb=c@iA%Ou~MpV;N?J*J)~}-9OP&R-uXW zutdtkk>rRRF0h4Y2Hayt6lXl%A^h7^CO>@iixHMlWg<8l_{ADu1WAVweH`DYp2Y-8 z?4Qzw@u!c^JA{PLl~sLoP7*Qkkx=Mt0}vqs0b0Wm*iy_Y>&DQNqSPpH_xoh)Y#N|( z{~v2-0v=^`HU62*BpFEH4HzYA6ojBCv?9?G7Hbp+VlfbmNkBnp3+WKt8fFl!kqMK; zSs1F{XIpKpwTrE-ZN;T5f*}D+0$N$yVxetRsxKzBsbB~YGymVY_nl+{^!vU(&)-Kf z@7=d^&pr3tvmo&kRk3+???vGO3NC3?ZQoHh=SEsY{3s(*kSmY$t~57C2XCY54?5pg zSF30U3R?GjIe|dyCqh!|h($!m+s7SNc#dS)d7H;$g(njp9eZgJ3--kYOkh0zDpk&s zNntp{RJpuK3r+6@97$Rth4|RJ8qlV58azLB|cxf&1<9rZoM68-OzMl>EclX=` zDzu!U38dWZ1Yt(X4jaw=gxx$4a7=5oKr8Y3LTdb-Sgr<_Nkx4(g#oHdoWnWNo8j?} z7P?s>9cf2A zMsiJ(02HvTH)b3$qOxmRIffCg$mk6Yk^+E}Dt+cpY;}9S^gkZ;52B=aht-Wkgh%&q zJi}2_-H0dbR2jLaAy|hz9}1H=BX+lIDW%&XCHrUy{G#Q#vy8_gjPDv;c;n4n)N`|X z8X$?wqSyaUC;?o1MeF7CS28#0#pd0r0Ys`ZLCI-uY}Lu;+BXU@#M~Ijj4b(N5%)QK zj@R8ePi`wirpl11)J(E`Pogj^o@|v+Es~7zY_1XBsF?YL;hV1rfOT+_v7T%Zz8#(U zF(}{FEH^9{e;(I(9$DLMM%~MdD}o%wdPp`|l%M@k;J(YVNryu>cbiXGQ9G?DySdtm zIT+96H1E+-2=Rq(cKPeYkO62$wt=d)kmS)f0k#UhRn$#H0m~u>qQch@9wf{kB^sil zvZYd1NUqfFh_VO+OKceR;&ST{tdv<0PM`k~JL)VKd2A4EG9(137}FpApfN>n#5N+Z z1TBb67@=oq>ANid963c*ND-H zkpJdSJ2C5GIIVR=VC?tMoR8*TA}X~ z5{AVFtJ~L$Ym5m61>P@e{`HM&&T1&8B@BAp7*tQP-V$%yB1(lcLwK*oWvfy zMEamu>gwK^_^GZFB#5jT_nmI;JHJ!+ofH05hn&7a70KeU&m&g++D0X_-m_B(tAfda(`g9*Mr=l+I!q`g}Pheoet!PO>QjV9+2nHJ=;~D%gA%{&9TCHzTX^slUb8~*Y2kc)x+uZ5T^fBx+9L? z$2ptbi={tTS1sOaDij{?(2|IIv7?dB?CWB__I)f5sW$&Z$zKWV?zu&GHax^TnQo#W zhra3Yo*iEa>Y4NX>#R=BAX)WrcCh9$nOon#+9psEZJKyVR>F7UtYRdiSIUyi3aVro z))J%k>r`;;iAdPh#=}> zU%r3Um+ijE^^b!-1wY{4#cOuFBWKJVC--q%?1@2_G8&vl*5!NA)q|uU2B+wp@;tMk z*vzIor6RW28#7RK5P7@h$aXLH8*9n{7ySIt9Z>WZP&AHcaQYK)F9EqO0J*LuP9fL8 zoA>P6p}Va-04bDt>}JZV=X^ywube2iMd%D}bjV+w6rqT>=v1+1 zXTP|OYDh|i6M4Lp%3VF~liUeJRv+haCjlWLIr~P;aA7It9?ttwVG1|=FDlYA-|m4% z99WD>@z+#+8NXx~*nAlt*B;bg&~5xhvBG0Yt%VCiMm=gRScA!ca`5JelN<6}MbXh4 z{`lwEpbdY#b3~C9dy%RT5*W5q22kyCR-#Camb7&RPzItp>s|xKQjJ=<$M$mM5wlce zCM?3FN~n@F5qiM%lBPWeHo0Rw-}WT6;UGH(>C$5lEInb1&TtoF<%CnZqpVj_LUFJ5 zV`PDg46;mGXyOUhD(pTT7n)c@PykbS2F^%V+9{2+ZIL~`i{hl}AlBADnO8mT=15O2 zJUzFf3i$dVV+8&2uds*0B9B{rH2Y?X*%hbH&lL*6y@O%~K0pK*$ zm4b%TEZ$@m&(b(q#I;G=*24O!c+^pQUeBBZjl@p+Z{4cBu(uR7?!8dSU);nt_kU|P z&ngGWB(fdiY*h$sFo5>=gFPl;dY78}cC)1rkyF;V2+!Tcg}^gj-~cmH?k@A0xdIB~ z;}>`+4Hwm35gNIXII(5K>Bt=&R2$Y^oq-QWO zgsc@C9NkRMjZBXkj@28Z_BU!4Ws4m|-XrbQY_Wpp{$de-l*z3ti!fVJ6!Sg?5$qm}g)uARZZcx=bRO4#rAS#}D`7v< zX`tMih0DW4tL-m^RUteAyto}QEO z#=D=#uJ-0+1fRT4qMDc=Tciz(-L(AGmWn2H_eaAR>k$65K(F+mYcsZKp8XR~&8M4Vhnnrg;d z9i3^f$k%-%PWp4xeBGlR;X7y^<4qV@|2WW?AKurqJD4HOxZa-f_O&o}E_GS5#7Z?mwuHeZ)%=FI>OpEi0im zu8x?ejaQbXD|1hyrX1g190tsEqG_JU4Y|E5&(%y>6o@^;SoYHNXV;iTasauib>EN98jOZui~d*}6q%$|n=Ty%os- zW&umB2$5m}Z#6KkL!7ZzZNtde*fw0u8Gc|7E-J(-KZ=)=J)lO0wgXe1imz&@RL;;#F)fI&aQf zq>7Y%=161@3UF;NolqHdRdfuW$82um_}+&gMprx~yUdKJ6m@l!;~u8B)2MA>jJhqq z8d`6!_SGvsFRIn&P2NayVnXkfJbm7By~(RdZYwU!fe%XWmF*GE1<{_8!IvnjqV6pGK%Ai4=_re{NM{sVHlx#>HQoo; z71>dIb@c+A1!Q72F#Fikyfte+b?lrLv!%s2P>fP7<{a}-KmnXc3b8T*<{28^%r>`x zIIhA_YKrU~bpX25|Hwem-c7fyya)2x-7U|T(5~rmP*^~2arrOOV6t9<^ig9j?KZ-!(Se%p->j+fU!r z<550ISxUk)HNKZgd8Icsg5A*`o zQ{q7xp%MVHV~ZdS!CDBxPeCqIr{`{vFw+fy1-jrdf*Y? z8vXIsLuBg(QUB|GcuU?;a%B414qe1sIExO&G0t89gDFbPcu+D5!XmOOUix*3L|612 zT$PyV`;v*Z$$`!TPca)7p3=1_JoWj{67dxJtdfbmW#$K@fS}q+|1FkSvYC||FRK8S zsJSJMC6=EvAs*70kRu9_-%qK3k0t)FM^ZJG7}1L*xY+4)DFID%#Z_9xrdj6!u(+=E|t)S?vT4nHJu7XLU$s&(UgP8dXDvYFXiM4DGC>(OJ;E-(F z%EcD?$c``0WsDHHIXlKcLhkemV_pLCNEhTG+f?I@-ZG!iOVzC4jqGqqwz6?B`HqVR zS3akAhqKHaK{w!0_U#Ti;nOD^E}Ov9#CFEg=^T%pl?fQEJr$k0sdM^7G%g49H1aT1 z+1{4)svVVfZ>kua#7GSKDi`!w#$=O;ao)BOp7k0FCOehNm->BDQM(#Gb*M;Cd zC)uI_x$ulV1M>k2&<1Qr(^D}FTAGW!z5I`DO*R{1V=mu^;lQ0Nc`zUv zHT5l4w!#5%2NMj4jD9%aR^K8G5)RBz-y)t84v52=V8F?Dbc;xkMPI#_n4j@qI3NyG zm?hy02gG>3SY>Of$&zf8lrcC7^IZn4MqdIlNfgFc(IL>=$z(^(ad+ z?Mmp>;?NYECw6kb5rz$QKGq_=%7=#%6YDM~6a%aBR~95gVyDOdne%r^R?KrLSM0sf zr{9T3E76Gz#r}hLEfWhP<*`4iWPkm2z>v+C>Uk0{Y)kfd_z|OKf4`Bf1Amm7d3<6> zRUL7WK4FT=OU}=ko5;fMCbvtJ|Fpodh|S%@0@^SGSLH%h*yX*+bL5JY6p>rLfq{do z;%yGx>?b3x?b=+MSHt`%AJwP?SK`^zRQ61i6K$$^=WG3n!&FTb0sJmeU(`9?RXJdz z!94EbCELX_iM+fb4XkGJgvAMDFvglMkkE%20`24a&P^9gj2k3if`)3T!4|Y&cWqnWrPr-#4EpP60(e_lPK7*Uw;}HOCPvs@`Kax*Vm< zm|5_)3@Ck@+{CfS$#Ym&sT}_rUOexr_AQ_pL+ebjMXE_V+{*K%7fL^HUHlGMCh=p4 z2YM1a&aKLLl@XtTXPctVDMw>_8MHxK; zAa}ihWtqdA^MR!uX!{)v;wnIBKzagQvKamdFs)c5Wi-N@9651di{L*mX4Q^;f3ENBv5_QBNRV zMxCUpDmA}EVKr*{8foF~RoHISyhSVV%LTel)jt$Bxt~LyssYLVEH&+5+k^!Q7DlLH=a|Xv&%HAf#!xInkOP~!=r@G>U+xQ!y(H@@46w@w83jZ_Q9N$7!|MGdt5yU@P=tnmom!c8}*QV5nYy0Ja|8vFaC zUXlR+##A6opF&0Xs(Jix7MMA*77(e325Z0cU5b3?Z+7HMs#($6xC*#J+a2%L7#KJA zJTBA*%5sHx)b--(5dVjGP#m=*cNZ`V6VfgiHSK0ZkOLghpSE4=$&e|-+}cEXD^r2> z4EB$hK4#%%s$GxY1@oY(PCTyg-qT?VR2_vaZ>=swMIZcrPYp8T1vK?6nEf(yoCveK zuop_5EEn&a|3%-=nf>#@@O_L|wI`P>Q|NYfXkA`>jl23y`+dYG!f+*pkL8@zlrv$r z`@x!n+)?)tPNyy)THPZ{%~xUkON1n-b#H{1iLh+YeQ;`wn^nR-M1Y{dLOcB-=vTk( z8-ud!Bx5=BCq0(eC&tH;9KU@kEc6rN13RZzBwJYM=TyS7#C!+)x}za+`f;`L+!JK+ z#l7MGw)De#mwqa(#Mf6)92OZ5jka~fxCtX19(Zpx0W5~RcR^YsuW$kaoX$<|R)Joy zVegH)L+o@Y^!I(4ZdY#MiNJe|N%MN6U*B()x^K`B7e6a(w63t`3GB07l`un%e$I2LRhR*Xz_N(}(RNRZMenpoQ2I(8W0=DyxpS;LY%M=Kp#2>J3Zx@PXJjQyk zJILWKmU{A(41`>^x!u7!I27frN*1v;ALSTNk(zq(^>`7T@mx=k?}75|)ZabV>tnhh zhu%?84n!|@EFv!1SYSHeg%!5Bw|fpj7EyE$*@4ow2`~WBpSl3>nkyeze>2pFOFq=P z-|l%qm-&GzGlEBZF|EV4j81=Cn)3Z1k^0EtrMP_|aAzw$;R~xyaRiBWjRfRhUi+R5ad$j6!`HNbM<`*1DBKYv}uYib!h|HSX zx#RNF^@6O&mKPcb2j`pJkPS_fzuA((#~mAGdVIVSsY+Y=$tmt?j0AIHW(|MqhGht zQrhmc?V(x8p=pD4@uZW}>Epy-%C*pP88IIXv-y~*hL zYIgA>5S^ZUq{wsBqHzCoo%9lKa&XP@*M;2X+Uj-}+g)xIkFYVmACASEojJb-@kMJ} z*p-k$=AZ9`VqUgZesxs)6U=-<6QgBGNt2 z>F;9Ihk~=S=bs?^Jvz&H$)2yjbIwzBEQ%+-Or7qOya$h}X1d19@Xo3F>);{JlRC>E z$l{r&zjyI{b~my)aXi^N{g;xr;{#Ro56@q9!%ykSPMzgp$sW|-_noKe@5swWkxrkj zs++nEGTWB-Lzz|YbdO7?O*l_kCwC}M!~3c$Lsi)vtJom_8?R6tRQU>ZdHg!hC)b`k zwB{eHxibIvEVqJ4|j{1e7ARoC$=>R>iK89Mj_g2iX&KLoSPW4@>Q z^)MMcuj%jm&eOi{uSN0ORcS{Rp)u~ zeyg2Ptk>yBzoH<%;4&Hd4>=QpB`_aFssxOnOU(nw} z&Xf0VlJ^0f{;zR*$@6sZeS&AtLu)9Kq)_8h;SCGWMKO-EFdzdBF3ZGVzxbb45q z^NiEMZ=EOm1Zk%Iu&VAZ(mh-C_nh|Jw0i`Xbgmnxi%2w_S^S($Y|2hp3B8%7F9dPKU~K@vpt8 zBE4b^#c6EFyLM>|e!~~&3Py%FYRKBH2tu6|g$JFt=TDM%1iH7_{_*{}$$gZZQdw_~ z?sp^y+6ZXp9(7i}2NNPXJry@AFzZfm9XMpv-NV5JlN%dGt;=>DgFcB)9fGJ6{&I|( zTS)V-&LDFKIz-nK5{6KRlHHQd{@|z_##uEDMr|^QLAU9zFA{Dg4tAkJ@#TXsB~XP`)az09V30$NH9d+b?+Cj) zCeO?;*6bmOa;wO;VG9MNrYDKeOXoNv3j=>1q5|m^XL(@r?Mz(SdZ)OjnV#d)0ED!; zD;o$3`>!`!V@{_$+Ru%;V_Xe*Fb3jSYL_`SX6Laf6Y?z29b17TDrQo$knS=sx>{bM z7+bmmT;7Mm1u4P8OQVIC&eeHT9l?Y;E|oeijk+(5*Rg+$)Nv_wC|T6G;vPrpe*7{l z^mj;=E=-z53lU@J>(%$Ek?TpuvIf}`ya)KVj{o>Fz~FB0U;vJp$(+)ndQ11TE7W+s zdDJ^!RqS8ovd<3}*s1=(6#uFL_LUguI=iL6pVd<4|Jo95hYON|g~OtS!xH;^Io!Lj zdl)mR2dd{$tn64Len4elHZygP&&lvX{|tfl2b2V==o11x@V6Ia^Rxsnxr58{xuKF)qvl1~)}pg`t@KTr>xeWpewdNgbXIdj)7*!; zxu)YUiY{Sp%)g~~kGHeO-&A|NojtCkG#`$m3lT8o%_#w6lop%IlwAifhOer3FA;s` z>K+)3M+MJSB;_`6af4x)nBj__$@a|Gh>ZfT$~(UAC<2|#V@7%7hX{Evxs$)~d5pM* z^2XMb^06J|4qtclwi{oYYiw-d_wl(!W)gC%pbD(lqc0~0>XOjYvOCRRrDT3UUF zxdUERnHJdouCZ}DJmfZ~OtG=i-8FhOldjBs`}2W@+J;AmmcxiCN4Bm!AMU?oPA+e} zw<}dePjZ_pQdBfT?4W^FF&_adX|~cvpb|`r>&m#sGe92+Ysf3>+^y|@ohWwXCdxED;#^ML8r^MUD8{{xt| z8g;9B!PKSk_oeJz!=iX87klRe#|j4{f4bY{CNs6J!-zR zNkA%393p`Dr)53-8Nh{)z^niw>?)Z9b6-avO-$7FM*^tyNkc5EtMt652 zBw1k8od8DN3XHl1jJnJ5-(i7Ky877-z*)e-Suda1=Hr)7tw1kV2 zYxb{9>e(G`?EE;XA?W@HCa<#R0iD*)vk|0{QS)u;K#>@U2@M1LE|RUl8&bCor-1?_ z-Mwj#DMJs6CUR3OG0FR|V7XRfLyE)QQ89FRL&5y$*5s+MZlX^ncXz=j7@FH~{KfgO z03)Yq>-dX6oNT=}zpl`l8mU5WSkdE>AqNL5B&3|OQre4_Pk@$xr_k~V(DI9XMGFtk z1+(s&I~U(PB6)B17rw-^LKf{!0QiJtY5eD8;Jj{)lwdV6>A=Uv2GtKeiU6)AU)s04 zVW_dK@Zi|p#>SGZ{M}IUk;84O;7T?EP+pGR zgk>&()0hxcC)hn=0Rd3q3A4KCQ#BwFsgD4>%J@u&tJ>WzhZ}p%fzdON zK)JxHovhbyh;qT+Z~YQd-+VWY3BEo7>>tM?1O2C6IIlZB#5-M&ol!ebfk}!yqsB4z z8P$CuYw()#zhntz;T_n2dT8a3&l;N;@I2qxCdf?4*i36|oL?OZI5#sk!QKJ}@xDS# z2n?)KQzkG_(|-aoaJvowqthsK1*S3LVB9+mvhrIo#GuG~aUu!KnlfT{y9`+`-IRA% zBt_nh)Tn_^=~|f->FPI}$`?hlYsXlOQn{wsS0;t<*uvssfk75m^sUrTO_s5vZy84s zA6VLYz5#9R9ndR$F(06cg}Bzn7^w`y@{Pr`c<=8WNtrnkzwBpi*M!tRDys`Zl8lp4 zBG$?vv8ELt0wTCcdW!(m^`cZ!DQvH7>EUn*gn?aSgDrG91E#Yn4K{E zRz3VHNVfJ;#D^e}V^?&#J(j!w&b?cUKU{k!n#UE$Uu8%xKqcLHORJ);QbXxug>U#supBZtRp~*UD}{7 zxc;h`ZDpacQ5Gh;uq9Mw^3CDb@hDd0JI1zfe6^*p5D-)xSg-q~&eLO0P1*Bk^4Psl zYUNYh?JG68)jkb9VAHpaYX-Nw$U?4f+JZlHBHD*Q?8&hEN_CnOF@_80u{T4qIhvT@j1>Lg*ljg3gWCxY9gW8_ z);mVF1ZQKfgg~Zz;`X|Wc=^PgMHh9GAk|CEKr@@6S0n{zq^Ty&K?Hf>Tojy60CQy*hd*4W;rAh0(=N6lz{|qyhs50|Ol?%Zotr{6F%&Kn3zLZTYwjg5N=;)ZR zzqa$yFBa!ElyMQL$cWY?+nC-(lS{HMJ$&-OD13s6Ij=dsPkOc^4mYLgkwc5_N-E42 ziIc{nXsu*U0J6)~V6(JNAs1~P0BEhD)lpi8{`;NWH;M%hVRDVfTP&UBN8UQnI?A1K z^3bIX)$fCuw1I(+TO!9BKXHV2`x}!Odi1p$x=zMollQF{bPdPjY2@dlQ|phv$cs}F zAlT)5^)8uHxJwo@sYWrAMCd3Y%4pt8Wfx^eYo!)?>tZLBnw1LdvJeESZkGM6^hoy! zgevsFDu@XcwyC<6JKQe4UyDm89FD$b7j6|!sXoiQJ89)t{Z*eiR!AQ{v$p-#@gZ=5 zG(A~!g-&5p4KLcx71xMo=TkA?XPQEyGv@03@xvpjXGf3wRM>qArbs2Xtk1&k&nC}E zs{9csBJ6*I<9l!0%^xe)Z{*8p(5$O z5fJ-0jPz86U1JboEEK`&*=LT1yxWpneFMVNli!={ zK7}BqrHlPH5R$?$M-`fcRy3TBmu1_tM41m|V8xx;gKqd&atuuLFuxonqUVaH#iYcH1B z2oDctg%{a_^PJ_8`5EP*OTzOVlnl>LqHylv@{mN%A3Ag9Ew?B!OrCr7@iZ6B!}Ee) zsRes_S-CLRg=nxCw(7zz-3$NLT(ykeukj^v3M?VkDDR-c?!HCqcI@C}k8V9{(T?wl zFWQC1#yJ^~(C#em1C8aOne=q#P|k9MwI|o8iYtH3S&rc}K-5_CE#`I6U3&M>`4aXH zXl}pkEFL}e#&qm0rvC$F?~o%?r#kjVpHxwylFX}pnIT`s)g>8a(REkJ8mv((QJ=UB zS+Wdx56uW>V-TP`G%R>=aK5wcj&PAPSfVY89A36xmO;-4i}Bw;pcEKI4ev5_S> z(Tf}+do+4TSRNz@g}65AL`+2^hW|NrJ;py zoA0||c2+mb`v68f@#ZNar$@G|%}+w6r&W>o*8=Yt&~%H9Nf01QfCU9V8L)TBBQu1s zz6!MQtr%yB(&7X)gmx7kwy@W!4`%j7CC4#TiPB|GV-e-@z;TcUDIF;}>e!CbNxIED zBvP_hscANToH1(q3x@Y%TIkF#Pxn5GA0j%V8CgB~-uv(gulfKcepr_lqgr32h2 zOoNuG_CzB-SzDAvSU-mLF+h8w@fc#0yF@5S$J36JK;a>y_8(w7Xg7BCCRr`JyVcPp%GmOzvE~I5 zJL?KrEvL6AQuVgXw;X9kys3j6{?H&o-&-eWx3lsux(GhOVG4;MV+;}ULI{@#vl9gV zLV%~3xR`(#%vhl0j>C1oa}P(qEf7%MyoYrUJ}a3*?iWIZzeYhN zR0svjvbA8aux1NmgAD9}H_;k#?+q?I6>_`s=5-h~Vh32x>MWz~JwBN$j$aPpc0~xp zlo0^MhmgBc|HO}%2`6HGq-s6zsPlid_;WE?*NSkQDnFMnZyQ1P+mqb~SL7nQCaEgv z^jw`)1)2%4)OdMn7~9ClK?m0F$k~>=^2V6&?cVy|)P;0o|D_8Zj2C)a7t)EzBr1N| zXR>1pKa-b};Vd^NV6wg?o`TLNvXiCUmVS#Zy|Kr>RZTtRYL9&+<9VcB1-JQB|SzqL`pIS(T+GdhEBpeB2{}UR?iPD+!`vx{4KU? zH*smgR7-H-(cnVZOsDb|v5xDlbsTQgJ%8>xPTUngyB% z$%jlKd9WN8uxdcPD6x*bV9r>wjH}-&f*s2U!L>v3=ZWe+8 zvKH0N@x?IKTu@@1T#-561J{&lm`sf^^elJ|0Z6yuS^sm(JdIaoU zUzLWPKYsU?kA-3Vr?#6YT{Xihy_M3T!q>*`A%Eah>Z5zcR=oy)X;U=)A&QR(7q&`C z5CK138=JaMGa}O58;&8tJxn{lX1{yLF z_9lXt@xA$XJ|k71iPsP|Cr`If>0eVOBh=;;KAo`*>*L}s^k*>o`Cy?#?$`RQTVm-< zoo=gW_{~x@@)pFiQSzD#`?CRn{~rafJ}ybKKQzzAnfQqbMajgu1yaB`WG ze<)4+kt?Tl=D-W^v2^^PIu6LY$-9q z8Q?{IJHnex!~FS?mSwxtWqRv%Y8F6v-mh=_b-q2VjB%HmU#2ri^;+I%3+Tl*KeM0{ zuaLynZTJnb(#NP?7GUd0XRxWE(5#j2A{}HaJmq?^i)F_w_qwf6FM(47vEg$n&9_qC zv3f6}U*_mi+Ar=C+k!OfU)5#v-Xzw+Co@xYZyfuqjOkwP!WoOB)6>_KY7i5?L6!G(CxL9oDyV@q}lT=U6cnu;~ZW9n- zY-)Fnq`A?UNQ=qnRLmHe5K(o~ueQ{1zDuxwtGWQ&eRJjL&V)~s1;XHQBl5S#4>ByX z&hTg z>F4O!Y77ZU=pNPUY+;*i%bTW-xidt+!u3b_lQCotCFXZ@#QOY>B#KDF8RdccZG4gH zs(-B}B^G;McF#yvf4bD)oFz@IlNH*yPIz;pAr^2`VQj4129_Kh8;<>S1QTtrM6ruJ zS8^Xva(gpsocxVGK33g7+o|3bPU6lw z96CURiIYY%Bbv7C&X1-;SLTc5c^5BF?Y=+Ay+2fSqL=hNs!3n5bL+iLkufqCPjbKS zMI_;xIK>O2W(>Cx8p@3YwsXlb#XQwu=-Oy{Uc8-|G-Ucd)O4jhE}W1fE>?Kd_tZ9_ z$E`WOjwZPMMM_*S%n*CVb^*5Ac?wCBXO7-)7Sh%w6tE(Qq;G>*9B6vM7w$6_pq~NI zTa7gb0aq059_$uj(mPPjsDSxeTxxvB9W!471+g0#6&s*;4+{Axph0nUNqC9b6y|S* zGg&T~cZOa5Q!%d=W*$)0p8pl!Kf)MHD~VxsQZ~B@gqm6`9(Sq+4DM2el`@__mA3+!!z*^Ahd$D!=hvfzs1P>jo3qu*>J#9 zm4;Ph|BlS?Ti`Y|#eu4JOoDMiXiF9o*- zgd(gp@Y&0Z8nMG;p)I4fnLr<@&DkvUwVtMHChh;EW623RQmNp|ne;YBGjypu8CamBCZB28MN&g=Y}1V$Jy+Fwsd z9h>qb%xe&TLBo+f2i}KZwbgugKVWXu+)K1fP;`?_ntwHObYD0X5?Vh6to&+pCOpog z(I2Tfa*H-Rk>-RL6yEs zs+YQ?Mmg^kElzFvdiC(l~} z)ITk5(G~bV$oIc>6D+&pe%1d_rDn#fzXDIhfe-QnZ{1YfgH_-Ll~)gSh0ckIaQ_xH zWhlTj3vKLnjTXzs*U6N*uqTn!JFxuzmFN1m=!v<8RvJHYKa!$+^t8b0X;7tg zb22IHkewu#v4X4|M_j6hpuUnPnvGs&5gkn-W{P;Zr2 zCd97LRbG`)v2_U_A%iw2#YU0ViD%xQ<+%K8_px|m2vXwWmE!3 zdoZX!$TLvWl&YFn{#!w}`d<1OXaQPa{(N3Zgy#ae2|4JW>VoAa)vH%SpzO8rSKfwv zbe>vsA-xgKrFwxDI5KXR#*wgO>Y*Ct=)ZN@VO938u~+}`G9`C1W;Hvd=5=%+_UbW- zZRm@=RK@HgRzgtw9xJ_3ST z^%1ypI`gTH;VFDT*_N6sPIQYbT2=QJL6;z5tc8z3J&+^q?js-$$@4C+cxCA8mzuNU zQ3pShC{e%3BZ@aYmC?bypsd14?8tb=-%|%1joib%WEeulLQ0oUnwM?58!9| z?u_t!*xq(YWN-ERHab(i-Nx8+CB(GlZV#nK_BMVzFz~)Zv&8eV2YL_09_+^9S-jrI zX(=`l|8wz()vD<+k-F!Yvne~g8G){>2h)}{WDJ%mG}}^^XZC#i%#+izr_S~85?&s9!nPA^d?@mP9D$QZ@knMX+HU{Wet+tXbwF0 zBlmFIMDkN~`L2QTnjZnxK6WcrFWdE)SGJ%(Tzh2}^c^tf>$oYLm>= z7bLx!Nysy?lp1c5#9K2&AKz*eakuVCgew!8YMRjkh} zeaP6oU$?-~dnZTcgu^TvvmyI*GF-21i8pKrU2fPSqzzL9DExCYe!uRGIw&FKQ@sO>fpVqxiMUm@sA+loO`J`_b`%u79-iTi||T^v+}vvgI9VEL89u}`F4fU zJ7vCQq*KsNb7C7YBM#NSlx7}G_WZhcI=`o426*J+r>m${ZBJE5?t~m<)$T6AYubwF zx0&QVwt}2?uv)FV0IxTi=!3U`piQ(UZy01=_zwGUJalrk@?~mKkGwllhWk<{G#vXI zvsSa;s1du>eaZeuQig-b8i@376T>BtU9S?5*PiGzb}_6U-I^jll<8X5DOaOt`sHH( zZ9vrd=0=Qrk6&&uHi~@8dC%*qK@D8uslPSMYp)8f(h(0{$|@Ee<8bi1!Lu$301lc*E@#tl1iqiKF*o$zgVR!}s5sN^V*9bmfJe}Ja~^}@<=X?NGj^3W758wkHEw9ti1L9{^F zJb8C^8a0C%FH%%_cXkF6bWmtOu1NnzD4#(rq^48G$aSGFi2RtZk`d;3jQ;wFfe%Pg;cNWg*>D7 z3UZKHW`ACiQ8$#Jn*G974Q>t`HXf0xK4iY~c#Ww2Cm&36-nZXe%gO>|5dbxh73O>dHi>a7?q3WCAPpEl-`zeQ%upZPJ9})3n zk;uQ6Wo4C_5%K3-z)SomOg5`wEkmmv{I2XPf1mhc!d4P!7Y>Dnb|y$}mC>>!1@Lib zKcYar$EXp351H&s^h5Ul3h9~~>u3bx|BsOVC?+ZNMfm>$>A%6x=DCp08>V{7X8d=m z84(Kje9*|lrcesJ;V#=R`!VmC2|~Mimx_ybMdpDw20q4YwBn4e?CcQZEx(&GtY{7zBkW|=&Y3Je?#wx z`khdgA{KB(WV_|HKu-7p{#AG5^%`WZSUJL;G!Q>sG-Ju<6nlXPiR3l?h&ton~3 z0j5X%B`fAnR*b`&W3~8ZZ=QG`UXAC$-N@3k9;@UJB6B16MF^@=bJ`Jgd8|lMp&KMrTr9!~ zq<#C(0ulLQ$xS2_h^bOBS#9NV1ywN)Rl+LJc~~m5Ta}p-DsCIsoA*yvvaWqszsy^# zkZ$KUgkX=bKjG0N>-CYx9M0-&FqB2amWs8u2>&n)@ijYK0j%?1DvFN?CQ2DcQ1R!ly$obBl~&b4 zq;JiV%E2i@;BJ;vqkIyQ>V@qqk$M$NCd+q?LMFB5Vrg91oD-XDn1E@I`pjrm$MfaS zkG`KmftLGd5nDL1B21;sjmTLU^>sX7T>iXSm?W}%Sr``)*RE}|&sVKYs+IdoU$ytD zYVY~C)ppudwPANw5?&3pLE+w(P1SN6qow8eE34dfw1i+LFv)(#PM(@1)B-iH`unQrft8?0h2iA;HRRAw~GYVdiWh>^YzmQw94 z+(901PIlCrlPSL{8^27K`Ay_?nD|B3I*yl>3kO6#s+4C!6Cx9Xgcp6rGgh(L%5LQ+ z7iZ{Y#Zaea@h38(5rHj2#-@2MW-ZYcQ)K53|E3@Mi8N}z$$C=iD)MqaF_(2p`uwQ# zaxGEiYlVpme?UZ7a3yYv4|Ogq>d`Y@SAxRC)dCc3x@8S=$U2%3U|!2H3d+}q(GjEW z6z75nRm)C+u$8(5z0fAQmL2+96iy#3C;u)i%QxUalM?<@I8G)|yPkmj!fxbh*Oew! z`L3*3*;^T!8NxOa&A?WdQUC;`Y0lSnjpt?x^=54AK5s@(eqtud+0VpVVE zqIjzb{eP(KN{^7iy_v?Io5?dhF~h)k2APS3euEz3{q`-oRJrd5u+~ z6t3aRLxp?AkMnzihN^cxCv9z!yO@oXgGTMG3`s*S7qF=Wu+o(*K&1rz@LDbFaTEwM zYJ_0b5H%Y$Sp}VVu1&X~o^x`2kspF&jrTAi4XR6im2z&3<&-2)}%M7g})HUgm@ z5iKe<|B18-#T0yMUEu3oqVmOrg?xu-u_;BiP8fx{vmjfTJeZD0BDsLY56)O5PiQIj zo_v5G^kdDp?=GPe(*^&Xi2C+YA*jJDf4h`|8YgPi z(-#Ufvh6foFaBuhRN2Q|#f!}%emGgJ(*y4$Sb__tjSz<>8-pWKY&KMTCqJf`n{rb4 ztI|#1CFcI8&&13>@Q2eS)iWR?+17TsxrZ?6ZN4kbS0w#+I{gCAK+-*|o8OEOg{`7w z^QU|)Ja*t1D3K=pn+^y?=Dn&sfP9MGH@wIkHXo}-)SfA4S7z8hrmZ!GK7UrwzTUoL z0%{-HV9;|E+dT3X1rtX%=jN-A4|5wfXZ`~Wh#?_h<;3O(W(&!gwVKT8Ql1IQf^XGa zc-39FczwOeeXOO){qdqEciRPMV*j|w{f{9{?oWQwpj^8x@jWe;b z=(FF*$J<XInsHKrpD6_$KLAqQdzrb%_TD8hmz6P?YdbkMn($n zab?8Z4@BHcV(ukjTg-h=tk4s*`!+}GUf0z|XI|OtzUN^Tcz`x!A5iQ+X=91BaZkkk z04+%yORP4;|KO&%n&0Sh$m~z|Z&HRLjG9;IC{yAO&%D4t+vN<-SRI~oS$Kv^X3P~_ zw}xJX=VYfdl`j8#tC{X~)hg$+!};xd&8bN%;VZtJ(s_)h%xFP@IN$s?GaPbz&YfgeM#Sw2 zmu-)xqt?8{(Gq;(cLH~X4@3)Y{dX0eTMO&z$_UTg5v<-oX}m}V8o%-%m);qy-WV@E z>pw32X0Uowy!37Vap|UD_2zi#!vDB*bFlh#DJ^T#5nq#}2DKu0GVT9Kh4WaE5)Wb$ zjvbEe;j)(CUBT)WYG^C!gIE9) zh#e{r3-AJ3eg$Tiodv%Z+>#?a^Yvhzz-ik+UCU-_V26|kHVK>V2ui0L5Mvd-!n%B>uUIj*46SCNY>k1^wmS| z|IgbyS|^fUs*S0j5Fv+j8=11X{{Ns5|Ln0N!gGqkGsX&{92;DRU>lX?alXU zd%I%9Dzm5=7b#2{#gZ$M0u5ha7UCu6@vIlvd0S+mhw|y=p=tL=r}=<{u?$N?0!Sai z^AHt@BbZEewYmpFNNVh>=Op!j{-`7?aPI?2TnJ-@a!!?p?7qgBFCpjkS8#UwY{6*{ z_LW{U^7B}5+N$U@d>@Sn>=@nTzD-&WEo8fM{`8toxQ$z&vSU+q8*1~yB@XO30v82m zOCm&lTjC1h{br%GbWdC&zhA1rO$F(kct~Og8a@%hefv3;NVaLJng>W%qSxnCGb*8) z%cYuO=dGrDfv}&D(q^*nL5&%rpz5}v4AEFKOqjz93wqo|Xaj`{i$tdaQ3g2bcWkIc_CsZm+IiaWLfy(DIkk3m=Kr734c@&2@M4mlye@rn;~3h4Z|x>z^h3 zIGXB~>QFg9LnB>LU+eSFKfn1n5`NFm&D|e;bpi3X-6#k}=J8b?y2xCG>OpxZB@%c_ zfN0AU2w7plJpX(sa3|lJCUW}*7z>`y-4%Ux4l&Jvx%^dK2$b;UYzma>pE7P+%56<)Oi5hNw9B3TO&nvm%*@Y@+$pZJ>p!si@#FIZCQ?akV>77!TF%@$UP1 zG`isiCdECbx>+%`4&j#=Eu^WC)W(|MV7^niDpfY+L;xNWQO1Txax#&XL^Q9pR{6T{ zmcUENj5KS8M{)G}EOYmd5Jstc)(`&Njy%nGf5I16v_X@;D{;PL%C}vyEGA7x(}z#0 z{tPCT@8d}IzxbV^%K47uHozcK67kyVj~KD@gqfF$2TIM3hq_}G-z+uj`Bn0InY`D% z=Mi#9lJ{B3KjN38x5zy591=Ei%ZAu*AO}WC%wJoX9*$?)D49ZunGTtcS(!?7CN#>6 z%x{xV>VbDKAMN?CugHnc;+gGK+Jl!y%lJ5b`GZ53@49?h!@Zyf#~!#?8yiIau{+N3 z3bbqeJN;OC(Gku3i_$<19p03Xl68p&MTgzk z@N9=%H=3V5d1hwNUfn3WAP{pt@?l&CBRx|0-{WLqo&>_H>!;(eS)eSU!lAkg2Xb@d zkvGjAsawQRo;zdlFWG?GumunPi`0FcxG6K1z=$2s9m9g531lQh!PcCrGgI`wIwR}kP1F*)Xq@BhgI-f zM(sou^h>a=nmICRdGev@8WkgixKVq7im6pGLXI1?Fg}^3?-4VlPWCzvpsatS?guL7 z85Q#v74st%^PGx#indi8ipf+lTU5+e6_cc5wyKynRE($?h3o27%r+JCR~55O#fU{|qxNkT z)1YD+RgB!{!gY-*X1j`cLB(uWF*{VucU8;|6|+;t)To%9D&|dMd@I9sZ>ms}ggDvj z_7G%>_eywPxUNa1HcRL$;ksrOYLU>?a9xWE?UK+JBXzq7O{v>0p%K*cdxF&Sj)XG^ z@6+M^g!T4O?~tE%it-M2BJ_@`YF{2(9Cc0%2Pa)4f_jH02PXqBK9o9nVfg#gOnq-= z5eA1Fc4m3QFh_HE?f9vbn7nrUjgmhJ zR22Qv?1AkF2_5krj4NCGQb(&c=l1KMzrKc-Cx}ICtgE6E4uhn_n2D%WZezWfV&O^^ z^w3$D6yWm#THfi8y4H$Rm3-qna>l1uxbFHTz0B|q3_UBDjGFCnM1%$J?L^uA^#Zjv z@4ZO6$wx){BJapZ-3hoaC;i#E5@ok}Gn(s^#t)&8k`wXQ3m{`&qSS2VO3_IeI6xngwONT!tQ*vADL` zH|Paax8t*NW3)aGlx%Dqp4(6!N{!at#uoK-T!_C!Gj|*ee2$y>B$Q7%q?gEFzeEJR zEeKQESsmX?1SBQUlZ`aV8KrY5;B%A}PQnWsNL zBT%SY8{o4R0@fK$r|vH<4c6^o70kagT_+D+(l9@#M`p+A3|7m+B9ID{-(Kui@V1z1>%cS$9Bq6=fghabhcOlqZFQU_HtpM2i z6Xq}8{VTC~ghUdE$`wt20uR`Z7A*)AS-b8a2r9HT?*l5ahOJGRTV;*f=c!0a29_SR z#f7(`YbVK@lNhopY+t@BODr@Ui8_N!gP=An2?)KylU|s2+%w4PFt8wg1YX>$wjez2 zTS$!0#~z*(5H?|NPS_Q#N%|Ew4V`ruOblGB+lwmE73B;=z(9%mJ6BA%Ea=6wbxR*Ev-rY3NDm3 zoBXwMPPDmDv4%mc4a^uDqLOz?W7Py+cVZkIc)TujjjEQ~eMxNxVm_wCWsch?Ghzi! zaJ%3MV`E>_fi9EB{So=yCf%4!kO0^mcns_>{#le*;%-#}Rw|RL9@%_1sBcBh`>vKs#~i0cMpquHo(Hx=GIc&+0&s95soQN9Q!bNxgP)~*qTdJfYqUo;}tZ0uP zH8$S_JdwE5;Gxv1X((+{YR)!u{Doq(t6!2iC{te8M&veVJr+?SrAh_iw<>Q%>6V0H zx^G~`zF<#m&Y^D)71yaW7biXh< z-NSlj37jgkT+EM>++F%t>3>#vpeh@ZL7PM7Ehe*1@OPS(L%==;q-|^{;(F)Cg07e- zNXYm(TN@ELrJ`Hi-pz6#(A?zy6jZkGQziw#7sFcNbsyd6wAC~kHOo2pmLI;v@z+hr z$b;xYfeQfVO`@?|9tsTOJM8|nJQTT`Cf*ICpB@q1N++JTk?5G!`_Qq3sNh}5Vh9vi)W2y(={kdefTaHQl2 zrqq|m91aW;z2O9u16T33`Kiq}UZ%+-#F;{;CzX1k%e>?-^28ns&REHIfkKf?uaT(@ zuTZ>Cn~XYRWuc1Rcy`&p9yzzHJQDS5U~@c^>_=Yy?X+=NEyf3%U8l= z)l!CW9=7A|bvET5U1_}3BHW0*sRD7QSbH%aO~eRZFBP1I)+{88u zSS7?7$1)^#O#j%y$4)b2n-@dpB;*}*?5M;(1tpXan||yai7n|Ln|4g7^35`j33&$| z`-#NP>K{Ac*jkBoS+N83h+S(k2q`ZKvF2M^lffkXnMGk`}WpOwXwv# zscgLH16M?Yy*ta-g4l%rQQ214l0nJe%eERx08tv~kG+wmxa2eSApC69{7XiGM%4$h z2cnO?&6M;9)${`33&{`mPZ%sFSjuf6u#Yp=ETTE1gF&<%3zg`l~( z5ziLNKEti*$eq*>hq%C6j(5YMZQ+8Og7&CH=i<);Q=ligh|2VnSn6_l~p>Uej?=Lw}7|lbWdJ(`In*MTLJ6FFg8^ zh2vAO`=Wva?<8Y37Gbgg_FRAwM5}d4XEp)f}`lFB2tMJ7aP@YF3S4H!!mX!oz%M-lk+`o!#sBD zyV$L{BqUT^?bU_Mmus40jbuw!55^ci4x4llRtz8iN~#YL;ln?UA+Y5aJA@31giKr; zh`h*LnVh$haN(|asj(wU36jB~pP8|Ul6HCG3D_puS66 z^#}>F1x9{$_VjrG>Jy_N8%}rtYT9?fmc@Oy7CvWrYp2*O%L!$}6VjSGr9>~|X07>#8{gXHc%rw(u>FpP;3&(=(VK)v zJk`Mr-Lc|xqveCJho?jja7T87`XHR)sTb9UKdTSI6rKvphu0p-u&hkqB>Z4>P`5-=p%PTewit0!v96TcE_GSX33lIebMSWvMa|}9=rUGvYDEE6b3I^cE_`|+43e# zV07voJ%3ei!q7$Y?>I2-GD#C&E;_zw?;Vc)ms_-#I`8ryo7LJWyqnROnEm z$3srVNKcG2(%mse`Uu_-Wl?CWxSwIJi1%QmBSVbzD}4X|8R`EIGSY`(9yygJGtzt1 z(*GN1FR{r-Fw$=&80n2rUt8u3>qTuKM^U^GJ4Adg26;S^jmb#m0c5&Fl zQb&a09S--O{Uz49OS05407pzgLwGf=Yew`jG`xjNu+;a&Tlh4Vnhr6w!cPLlpGgbh z)j0DQ(a;O38YB{v(D!FIA%F2$%fd#C!5-@>IRLl8iBqwU@%}z@Q8mARGZ|@3R%tb^ zm`1er2HE0(OCaq*H72y4)8CkG1J{DXxj3_&X zPMWJu1XIIT-N*alX}Am+k@gO0F&>zkn{hUHHKtP|GX6|uRBSN(q88_Y&8cF!w|0ry z9^%NPh5RUG6c=dnbA<^m5RJk}hA#c@Gjwmo7`g@Lg`wM{7`h`P8M?Q$Ro9WO7`nsB z3>}=_DGsx(JEbEb81jckV%+cuF*T#H29qtSd=$`xW#?T@+FG zIeOF>pV*_Mx@aqkrJ)S-0CGeMz~ZA+GqW|2%}meOx%qBbEqFqtMRkC+2AuY1IU zmwlC$$G!1Z+`eHw6XR8m$9!sNt3&_{SX=e?lnGVra%UfQWD(PEvu~RK&GKcf?It=M zA4ZL)#t`|TB!Py|Y8jOcVs@L9{VuY{z_U9EJX-rvkz%R~ zIU_nL*11U)IQ~v2#i%za>mRxpPdaeVx6#8qg8` zT@&$~6{}pe^4;0QK@9tjf|%9#`G&{0)m_LpXnc*`tAap4veHJ z)2F{EIw8+g8MCY^7kyS^x5dUj^Sh#^#vRVTJu2#FaT3J?tqkm(Lxti2=cn;Yw8~Fz zZKRpz!W*St0vJ`+MxOe1{OK*8crL>UB?oV}g>br#dxTu#?W4*jFF*7L* zLPBaHKllzaV}~O$^?UU0%L>d%y;~1_Bw3N)*i9|zTMgx2lY|=XYK>PQPJJYh@OIICpoCSZWZFV%ZL9evp&I-OivLXipnoSEMwj@)m3TOj6nY5Q zsv=JSHu;`ne*f^v*!N8W&i(icmfVN=3X-S-N2P#VaXgLTC5Y8}>})!oP&@s5MyXrA zr=kDUdu^Xgx_BeQTdjFlt!5ZT2{P40PUeeoq(UO`dj=XEST55N(+NgwE0W*7F!ZKS z&SDjmbC@V6=GgIK_neW|Z;k5<=c%O!veTNn=sFVN#tXDmVGpiHm@k7~ELcGA*}d?h zcF$YTUV#bk z4USy0@e19-b+|t0o~3JzILzk?7p@;xALj#}Qa5-9J5Shcv?@wCk>P0@W@oY-%9tIo zveDXpY<|q*qlb_FUFv@BznEX`m^fUHGup8zx(G2mk4zgLSNmn}9M#|LrZ)d_-*&UV znZ2{K?4Go#9dFp9qeE*1BSS|9cFGlXd}b2S<_^*0$+b(99Ja5K3Ow1k6{roYk-N`> z<45Uz%tZzi3ZE{G|J&cvm*Tmcf9)O(=MrcGr{k%3RUV!F%9p{-g?o3ZnX0WR8jSoD zL^NYeOkXW}e2`=dl`im>6zulgT;aK{!gEE1C$nMCPmc~Zh@oP1T1{jR=l-a-Cc<6G z!RR+?A|DF_)))O+O{9dU=$9!vufj9C!c$V=DKv|&q-evGzfeiJ)P(E`La_Zc41pTN zm;>V-r+_IxdQDA4?!`vO*F^p%)sLx(^h>2L)kNm;yI?@|&)99=0$0IcxO1N!THE?p zzc4%w!YJW4KTv;V@w0Ahue8-Ksj2A{zgAq^>toNn5{f{C6Wbo6({y@eUeykJvad4q z?BWNk*LW~Lo;}fp^El_!L&f!jO@-QqeXeQcPoy-a5A2v;J=pkHoZvQ1q_V+q<{Dsp zBhsTI#*F@;)ql!}!E*B%x% znDR-$W_S(>9N`(ct&3t>f6a7j5c49l6B}fuDC0m*OdaKAkiZpfKSTh8sK>t|9SnY+ z7aaIW6>x%wTRTOw7GB%h4Xn8SNH77d?I9`PJn~S7nAqa5YL-W^eoYB)LH(yDX#BWM zMwx$AQ0MmOfRYQ!x`{5O;sImNlD#=}VH1d>ZFs%Sf?@KZpz|oG zgKA&PKu%+bQ>r@hzo!6zt0As@tgEbwdixwNrN#dcLPYyM2QJvi9`<6vv2s`60I zP=ABYt;VSE`iZ5ZS$N~QK#QA$%%FF@@kSOhx}djXnzLtF#x&>YM#A@<=Ea*@u-}Ti zGGiBg3OFxJ-_t~(>kGauqE1(iR?b_+1o48^*K)z;of0<0zjes^qil~oAD2yG{}Qm0 zIrC=81s(lxm(RkrA32#`AZ%*;cR@65<2#5UwO0?=sxeXP4tkH4RG)5IX?&!;+5^8* zpkmN*3cy%{Z9k|VH9sPxF6mlU7plJCJ7;aG3{>|IIQt=K{o1QU{X5g!e#nDE<$h}u z<}SOUe}bs1kRlyM4;g3&>94Bs0BQ~56t{nuK+l|;V=?WHB2YPs-d=mvNvfV{!&DK7 z=sjM1KXeovAoeB!;JsT*#xz~EN!GUtz#MU>y2n&Sen`MugPnR3q>Pbbz`11a72#W_ zLDqtg%hASguJ2m?SstvRQGv%l$3w_@A@KO;<-rh$1s)f6y=ZT-Aq%Ie2)B?Q*u(Ru ze;qev;rVNB?P zjzBJ@uiC3ev{&l^;OT;$uprUNnVGtIOTn7@l4rs4p>Y?Lq=$y4+M^JyOy`u%! zJm*-cKLBDz^)8@T{>0Y>zChN{I|yOn;a)Y%bF73X4(B{$G=4qUxCAhV=YFRc{0_~ZetRHi znpxKBnPYg5hcgSMc))o+Uc)W)*>+%{)AmkaF42-UIM4s1`dCUcOBg6iZ0%w;Hf4p` zeFaex8JyNWjV}ZGd%l+U(0{p=mQ6y#aGILP%g|}c-<^YEk9|D+om5C;O>3tY2*~!W zHuixaR8a`^EkSR0@$=)F2M0YZ@N{e%mg4&dJP)}_KJhG`+9BIE+!K^0)iupC&Bo5% zFQ>@L;^oAPBIL-m6s+J1W@DD-alk@Lpcm;I+w@A-lE6WTJo7|vqLn+p2i-XEum z-11Bb%&>-L4hCkVxPp(^lHv|>GA-P$Vg#6N80Wy0DDI}vj<`jYJJY?t^8o$(p= z!O)rzJOWm$5`9SAo78$UA}86`#m`oBY~y06JXpg1Uo!%nvB4W~wIesB@OZz=cx1p8 zyrs2M270%*Csjr!9@^eMC35%!-xw@*4lak6G>Jhf+hyuDY}nXHZC;5WEEHUAkA2I> zm-IA^o3`c*<7^sjJR^JsyXD7t^v>hbN?}uh%dof#^gg%9ilOKjk`~qSm|R_?;aO!t zjW*^&cukBk3f`J)?1n+I?ZkE%p2-?A-be*@fi=7!V+{m^6%&4~ZEsUuc^7s=2)?M>MJX8o^Jj#*p-5v zBH<<-jhzJ52zvY44?T8!*o$^{Hmvg(&5L#q4ay8){kS$)oE3!It~uKTF>L8}-SB9- z>xLDn{;t%!y>D@<0|Vi>aQ5V8cdXNL*WH4o5hgyOrE&7u8&w`3Dm0*?x znC(+;;$Xt69dXyMzO99FEMSpz&`bF$*p3rc#n5kjVhd?5_M5hUBe_f0)V-$PJ@l@c znIkU$)}mkdNHH%qr8NGDNM}x>O~U0#Fzp^NG`zO(b{K5jV@q8n`spTkn$xzO4;{LY zN8JTSf-|fx>r1jGjRoR=rE5m2HKc$Qn1N8usR_+H=yuTma9fw0BEsvQ7Q(qOG&)?1`WD=S@GKWap}5KWBnyQv)yy(^8% z^;B&`Uu<=qXAW;S=g=|GQJTWtG|n^`!UC(EEQTN97mDPRX-1!dtfulfm1=$GQoNIB z#p3-!ykXBc2C-TV;)Yr2Dovf0p^SnKCTex9X@@>xyCAr7i4<$1j^M0xm*Kwy%Ivbv zO4l~dO1Hrs!w2bo)2e%xPb%5blsoNdH7CTJQWRDhpksR7XFRRwEIA+skk*=Dbzfw{ zzsQ|>#B}(S!h=WmLwf}gTX)3Hhrza~g8LwE*BXpkTax_+Jlu`Q5=PbLOl<+#WI)>KVYdJUW6v>3% z#~Op%?3$4#B<|cRLf>{c?s>&~eCnYuLl)I3p830jg=+EKhTCs@QAbo8(G=K45WH~a z{?3yVJ0ofA7QxNef)v5l$^1L8L+Ir%lH~jOBk5MryCW!9ajqxbHEqI0bnE00-3rtb zZiQ1s_4zo-vUPDb6=%lJ%5u`$L_=#jtqoR3!t2!Rxu!iY)JALjXA%X)w2jY~Ju0($ zd}R2XA?gXwP_n6k}#JlE1%hjm-7*6iyYi+9kOyt^d5F{z2{&gY@ZVy zMZlAiolT=`yMgd)DbWeG_k#x1jnF#I@}Rx2+cB zyFZj0xMt4X-oEHR31&h}6J-nDkCnwC7#zpJsH#F;wTwVeAIkhpn_=~ijZwo<#%d)qnSmQ-MT?C` zt;@!W=X(`KOj}hV$ewikI&UJo@f~%*iVi1F94w-T>{Ou}*Fz(a?Gj2e(zp}p9+6H-j*v+W(CNpJyCXbm$y zs#w>ww#z8$`&Dd1PUFSp-!6CzBKN_q%Gqv;BB;|!t)Bb@iM(Nr;7!u2OsvX>ELx7= zIbCgqYHde9H~d2qnH^q7aE;XAGS++|KUS3}c7sIVvU(@+yExyMWOKZJ;*kZ(Jh})^1G(Xr#-GVf-Dmq3p#BWvh{>l%PwFz$Z#F^ zjQY?NxR8>v1gye&tBt|?z3`&ynwcVyr)T?Ez7RLiPO>7>#Bgy~ZQNk=q zpTQUN!9he|+2ah(7N2qs`dUb&Hb zCa?;JjU$3%<4Za@&Y3ti+IUeh8^5z12|un7Y;4Kzn5>i+Q7-f6N>8{J+2($RtpaO*6HPrB@r(9A6>6aEZ;?sYvlU zMJ{nFR6RKTU{fBPD@isz^TvbPhC|_{XN^95Mf)S^cmKfqk&@wYO8^Je>9)?06N9V4 z0P43KTzX>m9H>YMInRjiv$S5V6{-Dic0&uqkt_Gr(<1GK5S&wrgd0db9t*N=SC8 zr7BhYF93@==yo|kK*U*TDmJ-ai6b>2<$ti4zqx2GRS2Qo`mJ@4oE!98yY$5#6lmrHu98{A&3Q*5=62;h(K{9AqK0!Wme8B(CK0fJU1ddz&3k3c z;iwmH4#YvnYPAmSKVcXY9US`d9P%CxooxujGi7Kk^DW*-Inw6JuCa8$*~kHLVoa*J zTc6KPMBs)leHr^Z!DlOo%=A3rD0l0NP;go#{_M5Jo|rRL-=qIc!~ z4G*ij3Gk*jz$DC0wRELf?&pN+&$FO0fD!p*&Yan}=fi`cm#dP^y*|-&*tE8g47_Er zg%}Dgi&MOh;c7QEcmr)csT$rQ?FOqK4hK@D15Zk;;n$=W1%!E91V;@|YiFUSh3pfM z>8A%~aG&_$V08o2k556haoR5nz{1Tpa%@5I@JWXV>nr#{Ht(_7v**kJmSBu`{eZq0 ze{D&&h;yxAW6NR|#e+=#fL_OI-xeXK(GzaTgUJ3MJU1(1e545O4~(GYCdgkwMGk-C{5udWK{MonTLChiMSgveeU41K!~6Y^ zbE)sFV;S=8&ak~Fyfs&$)q215;x)&ONUb|CQ{>tc0lVi^ct2qhEKPR^Osb>WhM7pT zr^aqj=#>xksxI`{yh$BQlP$qz;0No5LV9wScQ5DO2aJ|xMt7{EXL}pk#PK%f%7Bz=pxZ zY3dI^AcNI!8P$hv9~a?3ye19pLZEt}cz*8KrWw>T5Y9>SHBZc>jxRE--ZhG{c&?E1 zlGZLFdK;5-x~uJruU8`IGen9v5UL)SP6dtIG3H4_RqwLSOySYaZ!XFQ1`u@afwd*l zl;Om>d@fs`I0V`#*?L?Bjd)gXoahqA<}-6$*4ARgnK0C}2`$*h<|SG%5i*Bgzmufa zoxg=%pwh5(%^JXSRc&PLc|6KvI>YK{6CMH1gRMW`o}v%9r0hUu7??E}xGc0r zj2?PF49r5X4WV-dXWIicgNe_p#j%-hyJVup3`^6!iXx*1We%$e<+e-iz?mBPO<`Vun3LV z+9k&bl!%OeJfPAxjs;p_1s0d_v8#Y($lN`WVtq!=^P(iPt~t*Wb}PjSMVF-o)Gr)~ z8N|m_d2kYuP(I+UwrU0_Z7LR1)Gqhsrkoo7!&8g+Nve%3T&Z?B|8{A@;x!Xf8X_uj zrkN;STGTnG{WP`35u@e1AjYW=_+nJQ6uGy{kf4gkJazlN8*pM?H+U&>FdtYt%jT0%>K#|69f4+B>*dJwk%5l5V??0(! zoW(S8Py)`Mw5#XyNzVgG&*#i%9I{%>j2EIasber+M{?c^N#**Jo?~^>yTS9Sv2> zf<4suSzDLsrp^3zU&h%;;LLdu&DX|L#D|WDZ}@V`@$Z^~PHxbNIH;EeldujpSp%!b zeqeDv>LLt3E5zm#h98WECqF2botfbrD6ee7CXupL6XSWjif-;HGpf--XEKJHc>ni=a?RD{M~YP%9LBOO0|P6 zP)&HfvdwGln#-b&AE|O}2vX4~IlvdR80Nj)oULMrui9EprsY=+ncIKf2vQSj@naJ72B5?Gg^dioAzWUZDmgF?i!e9Zs(*?jn&6ea!gG0rN2{ptIQ$X2chqaP zov)?rjD_h?5yZhbXQsb9*EmpBoiEPZG6O)kedaE2%!mEWX zf-0Qi|r71YNOwOcjOv*Jb;{XfYw!8C#l>5SMJ1d@q;X0ba zTuI~eB6q2#b7qM}MSz8!;@5lZn3g!;wj#K4Wf<{rfb)dCP!p><{S31KW;3tK^87?h zX`87oB4Fr-b_>s`>oZtg?y?01`~1iHEAA3jresf}7Ou3iw2eKUR1!Mv{{KkD76UAw zh$yV{)I?&31fL$or|{ECVXI=7#8kBsx5Sers#=F{x>bc>HFdHa3mo2K#?vAPEZMPa zl>a}*N~KY5oYylKN>i)7dfqrv@P5JXX9ZuBRDWMtW0rBG^G~8eV>Y9sM7^0=WaYWnHC)NvJ z?pNCG?PQ9 ziR3Le56Re33gWrT>V)e#xVfJbwd;BWQjgE%v$pY^@$@7f3J$U!YJy539aPG)$Y)Q} zpxZw6-DGQy`;)CXb|zVK-0l6dm>iTLiy!6NrpywW#`w-#n?}*m$Nzw+A)SYhqGBRN zH&YvA4r?MsU+Ev@8W#7AYa%wafQamd#e=%SV+J@h?*P~-W#5Rz zLz1|QAVUtJcTZkx$=p&n!$PR-K6rX=JN7^{B>bXP$_ah*?^#ee^m&la%(mosA8X7k zGN|d74}T(!s$+K*m~76P5eu6TXq z=fHM>TpxiYwl-n#a=K`z5JK*xosMGu)7N=4x0UT+(2{Y)*jd@|U8;*w^1u&d={q7z zWU_YUP{|loiGx!9judR1mGEENILd!CeTzV#^H}!vJ2UpoQ{LKRwakpwGWqY+qHVl) z33bGZ6ENOK)U4!6F8sUMm81Xt>0N;%n5`mXs-{)okMb%keKg=bWSH#gJ?;*93s zw5Xkb1$o4Z4Pw`6?753o?a}V?5ZL_++*I?gL)>X!VGrBeeQ=)8l57RvdK&DEWHOJm z$*rjhj|!uZ?$$89x7CH5aAr^oqb0ZDCgOTi?Cqlz4CgGba*djat#%|bkt!(sV@o#E zo$CASK-A{btPQf+#U?Rm=D@!}s!wBW`#yU??kV?*+@+|a4Ey*c7#D{tUFyOTTEGc znrlf%R&<67D#cS~^mbb58){_}g<`FoOR9^@B=T8W>5o23!O^_oQ#V(g4DW$P!qRj6 z6_ms5(Pf=8$9(HE-|iv-u6Yb^fR5yQ@MwxVW5|uIvo}4(gY=?;ITrDtD|ok4sl9Lg zlFPs!?7gGNu+WpHZL9!S_;<{_!KH}&O$dST>QB%+;Tt9X6)03 z#jNmv{w<{U-wJwjs)F9~pm%O$`^ocz4RgyZm&tdduPX9$KD7Q;*rQriM9}G5Mo(4b ziij-RGXH*SjVhoLsv;IXvrxVzhgsp4g5eba*7hbFjPIYnjYOi%vjD%%zmzT4chyp6xrUHNIc8H}I5rHw-)_^fB<%-Tdnc5|cyyIL)6gnLpp+ zCv?xFCXW$tu0)2~)oSIuY$4>X;x^3l)Amd_4n=*wRTWt_+8Q6vcdk+qMPM+wI=Zsf zGe?&CtsL2|<1f3SqV>d+%u?%qahMT(to4Lby*cG=Y3qs6>W$hg(XY0i5O?3L`}eR& zqVro%98zhAByF}oGTL(+6<*KZ*b47YT2F{4($@W3>1T9G>xt*p+w<}^vGs(gt6KNh z$y;XYiSg=fJa0Ae{=Z3!+w2So*%b3q75V-sh}S)j!j<%PTD@7l`bw_B!o9%brDn;t zEAH;o6}uZvg-;k5tc(|3NnOkmLasG*T-D}!L2at|Vz|6vEi4}Em^S|P&+2OsQ&>F* zs>Q}Su_`hdMBxN^=E#*Dlb13V3sQH=_-*d=y2^%U;x*<_BPRm=TTrVmeTfC^9Uan_ zWajZvygTAfLLV)RmOHya?0>2vKdX{M!xF>$tr}u+E|IeVR-;R>^)K{0dP~=I6B8`*9iC0jsh!OrJr2IJ@2^m2L^_6rcKhra+)w!4^ z9ntjG2jzaknJ)cnoN7JG1d3hl&3xi8$BP|j|LPT4noiHk9_kP>ig{Ksdr9bViDMjS zZy|rtVCX3+r)|XIepG7Z$4BWyZgI9ZJM@&K7gt)nsl^p3o>6mL{=qLa9gJeY^EE51 zm$yvnMxAKZ-P&dHiFvjzxWFKul-pA99%gtK6O*d-1XaE7Yx$bh3-PM37wzZpo(|Fe zDCAt}J7)K072or1uR~>98NI1hT*CTPc7$A&X`LTrOOjWxThw zo^%03|8HHajdJMXs7p^!H_QN4hWTF)p2Jk7cx;EK!MtDFEjSPeKbR_DAEz}GTFE2 z7111D3-SQ`!I$|STzRI;C!~@1b6?HZ&=Olp?cNl7I?&85P4P@B9p}j|wRtj29Uez% zhJ>M5Hpq87E8WpM=Mje|g81a6{dtEXEFPFlMJl=Ni>{p}QB!sZJ<2OZRMwX9}FD z=lamyU-cc+d}lMfnUe=!ns_eD^3ueV==jNlZ{EQ3n>VCHM^7HCzn16vYg4iW6~u{- z+0J>@4roC;XdI_Nfon2sd&A{fl`boBPr%NN7Vl-QV0jj5l=7@Pmu>b0dFw-cH321V z9ZIQFodS^(C^2&5c^aeG0>xh*i@r~dh158)G{ZZEgw2&~rc`I0n_9W~D`P49nW60Uo5fRQ zl+9_%=JWI}p6?{mN-0t2et=*rb5kvwZL}&+eZrY&ZU37}1sYo044zoCp&5%xG2=Ky zC7jXP_VEjGThfv1d-SUryUSCbKQ{sG&jYGAQcu9&*(SfC&0&EGPix(`s5M9xp~7-&2O7ESHx;|AQh1>&u*R}HSbM~#Qn$ucfF(p7PxPg-_QcLCckUV+TC@V zUyYT0QhoVutlf3)ak09U>u#xAAhMFF-CQB?Zva#-DsVLeiFT@8$eF&-(;~P4v-MkZ&FM_UcMus-|2a%b-%0}bH`)5 z)i#u+;Xa3L5}qQXCptj_8*HdZaZjw{Xh2F)7u*Iki~1+YW@=NLsm;<`Cc4m@JeiZ{ z*DoH-;vY+N+2s4~}F%AzgaTy?B8fMri)7l#y*?@1S}@ zSEMI5(a@kYBv+AcqGuuB>vI z@U6ehPTrrN9I#j>-^0z-ta~br8h^nhL@*6`{1X9?b{7pZT)v)1LK<*C?rHqYFO z%xdzBOY@W+6_%=ntp2i4KsGE-w(o4(GD0%T&Xw_cW;7iukEWE@5uHs6m0_50n{-=~ zZjY93r_yby<`&#LEVFo>MZKYF6xChW$)pDUB1~a7OyT5E^)12?vWrbEu1t|#tf;us z#x7Q&cCp)vD^opLvp4;msdsTbbc@Inu<%lQNLey^kG>$#hKQ5e!!ELKFBeqr+7N3ffi=)b5Eib=r#hcv+PHQ#NogG28TR&+A=|M72~;ws=0?UDnLe7OLi z9J0G?dtLrxV_Zt<=Ra!YA*7cC^pD*S)%j0o1t6l`<=T>z*vsTYdm2=SyjNY2P?_+~@kPrjq zMTa^gc%&#d^ttjr*VupNqv%6%!hj={N-y>3_qkWtIyXPhcC|1%S-93sii?yK?&m3*XatgaJrrGCE+>(#}4I#YDW7&vpL^HfUES?+HshXBs? z5-hkb>fmkMl^k0AEptDstqVAt1QzF}zUfC}z?FMtH#p4;bN%W5nGkKSvB-;hBQKsqKI^2_fct<#uh2 zgott8r~a)>0OTvtuZ;jmNpe10r@{&aA%z+VNPs3Fh#*S>D$y?vFRD;$+i=wSJLP+e z4yiHx4?x@NU(eY%-8-pQ&qG!&sbGM%LbgHnx7!0(5A(VQ;ocr!!wh@DCaPa}%~6y|bazC0(BT{Ne~e zYY>^d=mj1lZZVO<#8u+y%1Al&Kr=DHFdch#OO_wp%`ttWa|(iSmyy<$r z_q!@^@ZOz9SM&^B5)EWM_vF*u4lX!yi`qRZ)(?85_7in>M?cpGOE21)2Jr=if>XIh zb~{Go7HhHwahzTi`5oONnzgDlZ$!3qM#s>o)N@-eHx|7&t8AGgvK{p%vY}NQv^HfU z%EyI>M~>%8RV?(USH@9Ot7@N}u^CgdWp-PHneJ?N_9gql_3C(^CFItrCzv#qQNbqOVIY%AM_guG zYFPG5R#%>=&hz>utC>YL*CeV*bE^<9CK|;XBgX{5mVpD$Ei1sSzEmf$(!InCkNE=IIi_4g&J*V;bEex?d$s3wLm+TSg9Z)}~hJtVe!CSwrR{(V5g zLi>ZnL~2kl#pEoqy?khAj3Y?$eHKzL#wMqSW;toE z$aAZW2(PHa3CGvXdWImUx&a)()-w7%$LxtpSL-$@UB>mU;oV^A~B2(Q7+v~ zOY}8H<-&SjrTdQLK4Nyu$~o)AYu}gHPRl9#M!ep$Bl42=Og!z}#cBT>Pdk5c+CnqU zO~4r@tWvo!7~T;opUz1cpvw++1~)_Iy+g%7W!4TasU;7Ak``5R(lDBx3TDB5%ATfZ zc7%o-q0JV$rFMuU zzDG+aFugSmKz-tXDC><-D!lb%IU*PiJ(RTGwxhg9rgzoZ9 z@`h_OVm(ZAcpLoN>Le8iTAIG(=T^P6BTWywY`Zu6qyjlyiv^{5Cz&z-0F^7IjOfj0 zQkKzA*E781xR)cv5IdHvmO2}MDX-?UCl3obuE#9tEf23QBhlr@&bYmaRT{%#wiI=$ z!sJU?ri-uZfOwDXFpa;eYQk*}(WQr%rf`#jm>FIKqGUBAg8rF~n&;7Z>Trq_PHyMu zT&wQKmqZuI^rn9(#KRCp_{ZAFDZDw>z!dpQ(`-e3$RAS zeS!L(;%l_ka(P5#7Cj1@0uP)LjFEFJH{pV~yO-ZcUd==m%Bz-}PaJ{+GC zLW>+`O3Z5@)G)BvN@(ZukYDBk57&vvqxRNg=4{|5RzKqZp;S3wiq_N3Ii>W%X0h$g z-@RJg(~Gut@C})^u=nurDf^cdQad5tcjZ8m@R#e&Yz?Ss1I$dDdgjg>Zfd$Eas~Iv zSN)b5!nG1}*}Bu5x_+*#;ZPtf=l9(y$}%3{uawxff0MQa(dg8-xdaI6H4mY4wM8$>DsCr6=wIh?oNQG1@J^iVD==T(Y`G*Mog(pvoO;t zE+CHHW0WFh8Va3IaP^)xDa0QrWG-NCHK_wwfTM(gS3Fk6;;Y!q&}Thb+fyVN zn-ostrgaT(CL~7^2X0IWeW;3fzG{*NY={2Gq@hm^b%Rg(6#O9PCYJRiu#80=$1;3i zIzqZbD8tMc{9=>=^zxq8R*AQuWXe!p)KSF}*vj8F{yO;E!QU=ZThyhD5cg~vRC;55 zpL)d^rf8Dz(!;;U%iMYVoRBXO{PiL^3G3%sLXJTFTY>uj4Ak!r)c=;dyTSUy!TKY? z`uD(c?lQ5WSo)_USKf1hNFc%;I5uC zTbwp@(+8aE&^i{of(*t%)1&{AL*v5!LAwwsQF=|X;cfe9P54$2IuCRGH0eH`2d3ai zPM;z+i>TIavUTx`(Q;-`&og~?Q8XuZZToH8fpFVcb+uSWpeX(x9sK3+Cral+4E!N= zU=;h|Lw8@0t&h5#lfskyU{E*rEoJ9qT!oQ*0D$uiZR0^!b?XP$K*b+T zz1zR<=uGbf+%<#3Vf&N#7B=jw7;LNwC{??D8W)S=$I6Q(D$Xj7vz5*lZ0Y*TBpM~S*Xk9^vTv|Bz;OQCorF4~Wb?JVy%mlTY7e*{}h*Ap{pxzTEDq3cU zFPJ>U>y9%AuJvEY0QJQ+2JU$X{z}*xjqIp@M5LcnaL^DxqlTXE3Ub35X{mRq*~^Eh zCaJtChU#-q(`0O73OWnK8>hntJ;uTM6=sbh($69GbHTpowbFb6SM$NPi<;!Jd2*{X z)ULXzwXYL0OBw$(+w$3?{8?-`D1WV9@n(ziU!N571+a&?50_hS@;T7z7N-22bbI{N z;O|~kg)Yv459coZ0Nm1R1QL0jzhCh827l}M`z3!Htik$@VEv|G{np6KGes1^`U=#a z3)UYEw|oyi@?G{soX`78xeI!YX9-B0&0!zxI7jt0k>+%@4RR;1k{;vVMQ)#*V$s{! zN|j-*ZO`-@O_qH=x!^tjaRK+b2h6*gt1HnnXzMyECR?m2mej!k3?{jfeU2zv zLSV7)#|u3QO$kSlSamg#*3td2Z?HOB!SW9NHdPi4)^fFGMo@Y+McCk4k^Q_T)=0QK zp~DAj2k_neJrG{-M`Bn6Tiyz`90|6(NAw88`4)FAck4%Gt-Sr<(RTf)*7g_n06ZIG zlC5VxG$_W#Zi_ic`eNG+G;I1201}>5sG4XAL< z`5!zEpK<%Qx#Dm7ZtcYvodAN1-oBPzw9UVu6FiMIeQm2~X~)HzCunD{m~5`b3jdy? zWrN;c7>)Rxw9OILK#t8^<8vNndCS_~6}9^x+$DPk3kG)wA5*z)k8kUQ^wt@H>xG*g* zwn4!T2+J>WrkcoZcv5znB1{{5nZBbV!1nzF*q-GHj|2(=wA_w_(vr^MaCj)kG$13f0U|b}oFi zstJO=RG`7ay7=N&rqK%3D=-~3!Bhg6PKoA-#ReJDBhlt0=)4evjtyw|nu}B569z5I zZf3g4PM1`Pn#jMxk(#415y73~zNIGe))xgCrbG$#Eak)H#VJ0^fcYYzm0Pa|;+SJM z0n5r8)Zg;!?~QBKkEjKx?}@FzcWDE{$%OtJPYYuL9!{5PAN<-Eg@P#VyockAXRP8d zRMNMWNI&FeZ2UMtWTtn8t5(TXcZs4g(~P?&2ZH>fce#m@7r3S?Ejv)3UtB+_X?9r8 zW8SK&mysLP1&xed z){%f*nR583C6?L`?=Yz!(J%Tj1C^_#rRf%rTe@hTB>Ty=HYK*Uy+o%F{1sZKZFnvr2PNy(Ys79)6a{xCUyivDF5Y9eng@RlP0AO8A?ni{xD&PL-J-x1g(7)ou`w?PV% zo}1S+7QyAy*=A#P+o3eenFBwz+-d%ttDqs;f$6Cc*?K z(B}r~mj>$#gU&j98{zP%I9F>E|1pE!rI>KnL`IP{ydoRS3Dh?PTPlke!vEd^aT)YB z#Pg(+2Xcr_exUwgInIqGT_gsJ`3G-5!(vN5CJ7I7Ip8r?eWm*{bvd9W^5pgXvfdv~ zs&aDl zE0aDB>JJP$CrLsL39>Ac8=UZx?3lL>dimcR{dWSg;%}t}zSx{Bh{b{Otiv^t@oU5Y zT{EgNNvtH4nr&Zbe%9eYTb5XW2j*w3C)>IK{o#=Qu$*Qj9`S(Q(7IcY+1Juw1CrXR z*A#nF=gxtB#!pMQCI1y1EA7^ALQ;Uko3d8`c@jLnH(h}l7>8G+j(}CoplJHVD;!Rn z<_w0kz}(dQuJY78L<4o@ZuQ zF9Tt2;;$6LAZTQHYQ8(g-|;yXl?jsl9|7j=I7)Js2_eR`_yD?$l6{Y*73gJfnS*-s zAcj9bORfnu)0B95FMUZW&)wJIecP7iA-teS8tSot$ZT zVjq8vC+U2QiY*#G!`JL!+UWdtXQ_0ajfci>GCN;N=gpGt%Y^`rD0;keSW#H^OBNk} ziK0IqUKHkHc+mlU5uIl<|Exljhh?U;RpQhmHd{ohEyec6H{vD8IW$9Wt9*HvoQVG>7MqD@j}A=&f%O(S zJPTz4JPT^wlhpn(0(>u{J}2ptpbe7d-&H5cmja(#C9|C?C^d3BI|iXe=Bg5WHbbo7 zcWh8EY}MzRTWVd3uVpEaoQx_t+&&)=g2m9Z38(OgnMW_(WqgJZRK`->b}-e-+>>eX zDDeq#Q)<#rjHd8z0MM+YxF@ zmCpfvB|x1ixYzjfuv%I7&{t<2#Ld<@b?@}GsY2H#?!~+H+|vecqP;+6V{skZ4~EIf zunmxny@ymFEIUxHw))+R!CQ1L0p6dII&8dQwi6RRkio-RyP;Z0-Wx6ue}%ol%oHk5 zU4IkYv&g^`d&Lc{vLy(Ng=(&=s7Ow1^2tz2i#i~<@r}w^S9D1Bsy)dYm9tKLg3+%` zY*U8-IHLi5-;*)_8iI}dL(F%l#W8>62_KX#*;!GyMW9gOn@Qn^_y4r|r}Jc3#gPYt2@ z>=?)s+qbrAwEA>0jvoTz3bUaXcoZ#!NfDOnx+KVLm^zGJ%vZpR4hPlrVQ4el zlp+s`d%c6hb{t9Xxn&pynM-*^L5>2iBI+F?&B2X*JK%itsng@0dT?A;jG1b zgzQkxWT6rI!zPysTw;_3N3<}e9qFODu!eK9p&bwk#a^vXCKG>dRy2g%0@7H4bri4- z63paf_7cq;pzr#i3tK|PnF2b)jJ7PXN z=3Dg#<`9W+sa^5x1P|g+j>m1~vla6})RP=;iS>Y}>(Bh1;O``V5&ll`_n|fN^Un)< zbuS377J+n;8Dlxv!s)ArLooUUk^Olp5SGYE-8{Ose-Z~#A^4OK`Jw)dpM*IFXU5OL znMO;GyP~LL!6&a2v5NX}Jt8Xz2S<4j9_1}3zUfAFccX9VUdPmNOlZE zH2-hNC&4>JVv;1z>*Mq!+$I7NPESwrR5UmTVCD^aC&eW|%tQpJZoXFel9FuIdB!u^aZ8#CM0#LDImG^5(1LXi{BCb z^OAy?gzGPzl~pkz$&zs*J}p$6l*u_)CL4_vgoC;N((Qj#fL8Zi|M($CMi#!e2%CpS9l22K;VQ-;N zVnHwEt^Ov$R5@q8W<7MY3JbZF@N2>nOVYRVL}6DM7nOOMz)^NZF)-t%&}NIm)kRz$ z%UD|&zKWS(n8|H_(2Zsg=l4>V>+{l&2J>anR6(IqFzkBiyN(1H#jFEWo25$pzQwZL z$MmrM7iH@pfyn9IwP!j$WkMGet>ATTI>$MR#m<+XwaVGV2k?Cnx(<5>*dMs5EOnWQY4QDCC zvhBgULb&Y~Q7+a(m@6Wy@$eMm?L^?ACTg)!T|B*Qtcrr-m-8btEqp~Mvn;$2bp+r! z6S5HwjSo0HpXcAPo+*ZN5wIX{Iem6#t0VdY$pE*%9;3_;49Y?KfpLwS!emX(l3j!Z zbC?uPoe~#=g9%N7L&V+Si_F^<9zj=0!?T2`XmE(4A(s5rWzu4qV*2V3gg47Xm@}{k z=nl1B8!?Ux?^hfSNEEx>`XX`l&-~q>FH&G$9E4#)g!Qa^*V@DfDzl!v5Nz=Ez*%pu z1z6>PSwT6kI{{_6qOG7@X;e2)FCWWt$mSDMB_mlotB1 z!zXJMKv&zmS%wO7za_&VSkg9eB9WoBJ*TiWz9#g=i8bN*dTf1}aDL*$_#XQuh1`|4 zJvL{voEzG1F+{^z%o89J(8)rK`nJS4wkyYuvUHX&{AIp zI2GqyD4g?JlRU3##)4kNwR)xOsjd24@h@(QnZ7`h!Z}!I*7aPquB}6u^3~7CF@Qv( zPvE>fAZkf4l_ioYt2?Naz>+5u`|RH z1)7FfM32Q*kr|4hP3OD01&HVa2*1RTX;VRX?$8>3540flUDO_K!Ky<%h#upg@dUP05j&G`%ZE6>!ioexHI^nq7wUPK zVxl%L_#W)pCt&$|Vi1)@czr3ZbMP<=kTav$**$AocFyWwq@%_?EM`ks9bhU?5( zlo>QGx(!^S^^olf+R!#;yGp80KSp1O+I_l=aFE^FcKvi}F)&;)mOHJ_ZO)|yioe=L zF&Sag{oIi3!4rVdk`vVPdFe;Rp>4-b1=dc_D>#edZJS)e(>CVdB{IK2?#2=%A=kb5 z%ec+!c@DpR+pGJGKiayqS9kD+azQTc=6UxgSfuZ@cF%`J^0llGzhq5g;5Alk5^#oF zx<7fv(3f`U3)xTV!rs!5z7S>B)zkInM#paa;9zZZgOqE!9t{FQgB56Dwe4ET@0O() zznjL@`JiLY92_a%?L8H|dO%-@6cC@?Fun_sH%rVHDQvWOwABX{_IjlPZn>X!n56~r<8rMT7)iULE41Dtiz-SBFWFNRAqLe^_OQdnuWG8{;o=*+Xfva&blU`Q>S8%&-cDM^Xu5?CaxI#> z*G3Iq6uGwokn@PWcJo^ zlYE@SRa((_%D+cgY5#8)?cE7FcSb+vh}GI1sj?{-c9>1I=e`4+e?9U4(Dp9yQ5IL@ ze>R(tg+w=C)M!(Q6)n}&qTtVP(W3H1YFUegB%nlX)d-8NzF`+@YjndVaWAaZmbPlO z+E(keE%gFODI`EcP^yU3Qce3tOLZ}6i6ufnOn%>U=6Uu4@xAo_`}1M5`^?NUmosP1 zoH=tY{C#?1gc0Gb?yW>iInQ%uCqGl0o3n5w15LC%VN!}EB?KW&w9MP3Wd>_VnO-6( zySg-`mlSi}ONPb@E8Ui8Dg8kCsv=Hb$@T;%`Y+@VBg+L(h78iD0_M#ke z6ThoOk9!~COe1we>g&IX7wOE_H9aNH(4Bwh?yStM}ZZb-TPRe+S%7{ku?f5!s?>_-m9X?d7~vq?g>* z?u*tXjc7J-=TLCpktL9G9jF|;^m_K416kRH_@y#eJQs3aR-k~J2NHQri`!i?64n&0lBRKVZum#j`Tg3 zGM!Ui_O>)-47Q8rn5XJU-Co9pgUibM^a2niv%T*uf#5Lrtwow z@AlFs-X7EN8+rn~chOvv)n#@trZlnVARWOambXQOfezRW#t=|B3+!)~9p)%Bw0)0v z)xn5wU;I_$w3eBGLkPfpW=z1JC@a^58A(5UTY%18ckn!c_?AU&g44r7JNrf7V@DvR zfYiWpF0e$&c+W%~MXtByOn!j>I*?tWi)D2R{)lU(Go!eU zyXQHFrpU2haY8UV?rW4~iDnau2Yp4WTQH|J6CrAoL+X`J-cb$z z=1S47F>GaF3I?>e2|hR2y(R&aV^uQC&B z6Kb;_P9bg2?}Y6+$YMBXkJ_FjZ}Y1<7@-oi$>SJFdJ&{ofbo85uiM(>u@uX||E1qK zVtj3XamF_n%&&Y{DVD+cDT?!QSMZ6L0o}?T_}6~wAi0vQUuR%=LyJNn1GU8yjnXyU zstg3i2n2qsfr978Ry+2RHu@ESm z`KeAymxa7dq)ix{u4rRYw})+UYnu=QIU}dHk=Kq_*a{nBIgHA;w1mBSgsXdnLb?y_ zvbT_V#opGhQYvd5Ny()+ZL;NI<>Z5{#IW~yD(`o+fc8SO2J}d?7diGn`BhmrNj$z! z8sTjb**8mO?%kg0N2E z6|Z5TpGT3S7J32)RQ5s_VS_Am+IP5p)cs_ki*^scSm;KE0H^2cv=u`gt&v@#%kg%m&>f_5> ze#m?EXDx48!8c*S$a{|%@or40mRqIY931L7@+I-Q7hj&Q_;}Xxd}#z~v&wpJ@s1Lf zX>@tDyvAH|;Vg5R3)06Mw=tb^lDd?+l$$Qu>TOk&eQ1(y^Dc{ND#xi^C{Juo^Rbs} zy4f(wyvyFgN5-J_Ud(!LidErVb|K0!oQ)lZR%BgJbY*D&%5VBr8ExDttefmG>rGOb z9Hp%_!{Eei6iDO5c2(Oq%3JIKdTNqG#22+x24ZZbpl$-m^f`hUV@IP#gL<>l%d0&g z09X+V3Hb*{F#cjks;pxxGZ^wh3PYae7b8hyhzd-ZNeGvoFS-)bnidb0xEs6OY^Col z#cBD93r>*P^T;om5M<2y4Q^9a#mvc8cO%7?UvRP%D|E7vIL57=v7Bk8f#av05*S@k zKFxJ2p#-dLJ>~KTDIOJU*qX?@$h+Yscl-SWqjGO-AIOye22q-L=CI8Dkkw^ozd~n! zf-dHyeUN$Ao_{NuUduoIgxSBIbj~kBzBS&KS^N&e84UT>d0Q&<1;GOjM2ZR$w?Vh{ zUBHo3m~#xkC51q*h`rXiE8nFj0gqgiqnU?Qog4;aX3suyX7?Ur&un*kW=9S;v-j;t zEqXbGGoe{$e0xrRnVQp|A33Kf{k<*(0o+_OvG_VA{xekJ5ehHfIv#piS~56v1r%p| zqB&n+&6RhYt<~kB$2(U_+MsM8Jh|77-7@MROkY!|UCZaTpbz>t8EuE|p!P zOlV4zRUz`OCTph%C!}i)KiKoTd|c163(8sW|HsbUU^-)tv1M|Mr8ngq!Rbv(2)AO- z7o<0^NT^QaI1t$;#;2CEbIDyzno6Bns5_Ucm?G_PfG6nO&VW)U0f9$3WtC8srP298 z3LUkFZGF`_6x=)<<=M8l4YB_6e3>}%&E%j;vNK*?;U;DnvbLgo;mH0sb5(`IG1aT# zL{VmA*!7BX$UG{TzcjTd(`1lrr#ozI%ib?`foOYrnB!@jkcG{3V7NJ2x6P4fc$;Tr z!SLOYSuh0Fihu&cJS~_(?7Jv?Bn;6xI~s;9ucS!AugF)DP?2T?aEL36K$t9kjSdh= zNZG4+yI}($^2IKLmRuw@^~ZA-X@&n1O+x0BNeg~oW%isP77=7#c{-W zTu|cGdu^~ov?~nJp64udXBtj*reSB+H2m3F>)V)y%}hhaIsFGR4cEhvP1)pa{t7Uh zHp1I1QqgJ1B4?5AObbTU716pf_9goeb_jr^v3r)s7D^(K#1BQ(x5kc+-HvcWMKa#z zPJJU|iYD`tPSLuIL)p(LbrhbzjY_7G6bHb%`tUkMX~pT_r{mRYgxPp+(0|hcWigix0NIHJwEU&_SD;m9=@DRN||V;6lljg4gn z8*g)xU_o_DWV2a59iu6a&k|7Y~D)-*#}$avpm^sbqOq=M&vn&-YXC6I5P|7D*0 z*L0cZ{pNXK&7*979Y{F z*|wMS=Od|eW_DJdLT$;D^JONO z2AzVH%mhAacQO-N!5ndUh~=S~h_OUeWFmTI(EbRwm_x;3>7Ue$7o`#i%wcof^5iwV?6}r2=A<%x;w>z1eq8*_tk9|aA;0cRG(J%O zv?e~Ni9f+%SbP&XkBFM#&+NQMHSZVx+$-bal;a7>d&f(>LDjFC=eZ8Cs4>s;9Aa^$d0v3hrh}?i zo1|+URQDBh<~HANUi2`5Du^jh0i zUkcn2Z;hxyaPy{MgH0fErso9f34FW7YKBH}ZjNlRCPAH`6qTpz*R*kbCGXA^yP+8g zOVsvnCrB$QlYaM5a7M(!ly?$|e9c0!Yz1-91v8r!Gqr5ETX8eXeKUJXeRz!to`)bq z0-RSD8J8!Ad3$6Gd3gEUq|3FK7@bjFE7Up2}JansT_Ry_|CD`vK3g{IA>o?67UiIBU!pe>QOt zZ%}>qFlCS%az+l*(1_Zhr2up(0Id>$RtZ3>(g0mQC3BD+2B0s>7$q(hgPcr5sX>0h zr-O7hZ*dHYetWUZFm7_{4j-sK%uH8WWwkhti&$lW>zMToIcG@6P+`Y^Mcj9o**=SS zk)PPHGTIfc_cW(#WvJwbrE6t*4XbORjhg)kv7Q-z&k}8d#qe)5(Kgv0{qRj(KogAJ zY4My{I(mkNQh6o}#4MoL?$#GSCirQv6aqC7{uU<$Lpj(zL>o(=^TY{mRr>n-%{v0v zlKD#Pc(b>=uFeUZxqqWKP!fANw8s-VI20JAuqqs&o&6j80%ejx#E_xDn4Xb%ZJ>Y* zR=j)^9*WoGIn~ZMvf5Ln+R>qph5|*@7<-u@UrwE+v6lzidq$v45NgkpstfG;VAKTO zR;eenDL3>HJg>M#k6-R--WvD;eAJ@rpRhR%PA4SC{z)jF@Lg(xIHKq&-Q4oquk!yjRePy&A* zS{Nio1rVN7oBRoPQ78f81ooST#0=m-A>n&o;ySaPN<`5PxA=xV>;R}`yI2@t&{Fj= zE5}0}#?g66_`;lEZgd2js}8rnNKuUabz{#MS!9?!ON+;&cFpO-A!snn*w`FEHVIcS zAYGKTy}#=9cU$^`?(k=Fgf4AF{xuMMmmyZ_;A)elGBC)XC>ly2Lr+dsnkLAKz<99A z#S0g*JV(e99h#ji#*}pad^QogZcPLr3s+K~-(%on`c|`+%fLXe6?)YSO2t5oN3{6q>PA`L$aCZEST2z3@F|m(b}U~uW(4nd}Y>whOVnx zyr4gZT%xRO?b@n?jMU?-|OXa|2pNGqtnW3A$kF0o#0f3l$R9q6E7R*$GnW8(xc#E{AZ3CQf( z%yc6s=VV}URjxr}oj>+uZSWrMW*DGBET?bhe>bBS4v-#@rf<=vWsPSwpRuay1_+g0FHo^yipapi_PIAiSfV$Lh9-(brVd#n~LZ&Ck#QX2CD}gtJ9l&%`1p3g3`qN9ZL3WId}x zrU^y?xxH?4!iKyStaEo{V8j<#N^}YE(5r7@oIvPivq!HL2*BLcPhQ~)2@r@cUFr&q zP*{0@)oE3_>Fl0bMd&WDA&S?S0Uc2?Z1v_jQ`kgbGkW@3zru;lY_4{=m>wp{&**J& zMsLfqdfOz!^d+?=fUS)chpl9)v5n3#k%%F9?iQAgrPJKDOO!V6A|k;xoO;ppPfX}g#Ar#u=^27MtsCJ?c#Uv z1ThtD`jh-Dj9JG`Y5Fri10x4Fh7Of9bo7jkH6UWcdJkBCuY0}xk=E$x94oYn^L*hBXZz*VRvZ4tUORgSY&E-qf_ zunLKnIs}5Q;0`NcZ3ey2^wH{Y-jtLYVarU7784qpoD)1|r7QljLc%KSnE+E)c;K~` z&fpnC!ETT(TuyB`gbsX~Yhoc8rUTqMv5rb3a5RqQaM;?NhoWZDC3=anB4!l|1jYA7 z#M);@l&C{spjctLAe`wwZS5kb;%{J+>s?i7mO^ZX>ja5=$0k)2Iyha{K(8w>>WT8; zXnryAbo~|6^?d@1@Fv(40Pz5tkO*kxat$ERX;!A3Rre|I-hyJJV56H0(0(fs6qsc} zXdXH)Kq$bnwSfX3wR>XQWcIjOpWYQXy`y>Zlgu2J@0YtEN<>Xp@XYp~SDTD}AcD)X zp5yF7IXH$3j^O$V?*R%liX)LVpjX%2oIQKgF34Mgku*H`ne z7NIEQbR7NHP}rw+xI1v-jEq1XboN~wZyadf>yEt?YR_$dZ$x6<1^q1iDX%T@o{7x+ zO~mbqX%AzL{g%VF_v4Lb$kXtIeH^*JPxjwP-9WtWn#xlGpPGXk#TKao*xRPh$@jZu zIJiL0@bKKQ!*==~?wx@-O^3A(BlF+!SQ>n$I`U zr$N_}iEqu1Hf~o}lzk9n{C6{lD1Qd3I9C;GH;oI*gU`$Hii`JP1>AN~%x8OL!`Rrp z1*0kTJvn-z9CLZIH#zpRV$8#e!@Z;$>9To9rns1FxX-B@lj_f`k!`S(Ug>QzW>R(Z zgu9GxU5wkLZ_=^dB83<285vJLThU6Fov7a(ya=Z-$nbK{+qh~aI4DPL+kGv zDI%BSFqsfX>DEp@ef8nwwLPQ2W30I`uUo6kG#g10`#j_7=!n|xq&7_Oxyh?sPEqPRrAyi()}9E_#7IkW;I+-wEKdo7?-WjS1eChsiwx8+udN;0=e!cHli}ufT{4 zr_I1STDMzNHH`Z%NYH*y0A-i`qXQQ~FO2^8247!$cR|zJcj{vMQh00VB1()*lz8I4 zu1~d1U)(nOtWKzpQ0L7pc!e$T{-7^m{4F(}kx$l#vgs4wBJC7?=ys&qk-EG{U4Eo)M5L}Dik!KwC|U>7mncwBvF>FX zh|J69hQC#|&01vKHzvOTuL^447_sKWF$|FV47F9C?+Dk=-~~sxelov@f;ZMAPlZ=- zr0nzO2aoj^%#%=^)}VCwtjQvEi&<=~&$EIAm2c#a@49Rc zerKwI`k9im*fvo2=h+tOTVEFh!5rXDHIiHqZ=4qQElA{@U-_U*C{LgPj3OZIb(jun zHy>K*(3W|)IKqzIy~W)g^DTDB%Ec6imhy(t+2lPpn0sT)SWA1XJ8P0(`wC|0ozJ>< zyfX)>*G86zseAw1!oVV>$Mkc7K>=|Gwop*O?gW5(=(&&NIxpetzJfpfS6~%+{T%AJ z5qo~Td%hucOxMxOjr-=xrng;uxK_5j7C3cbUteF&!fo5OgYc_zbO)R%2KxnQ=tgyr&@2d-Csj;3>ow0{KFY24l2%^;sG7uqtHI8qIA*y{< z0_eF~T~{jI4di3XDx|dBKk|MeC4beKKr_>qVw%r84i%ON=qwiBjKo~eBj8`XYjo;i zx;#|RNX#gHq^Fcfrh=Zc*J_FB=0~`V#{zW`Cy2?SSa!soNV1Vy-iZqpjH>QcfweIAO5+aQ`f$C&gj)+}%!XL8-F0M2~V@6Pd`P?P-Cdnl0F>+!19oLHnD zE-tLaMo|O1mZk2{9(QC`<%%)(ZZ^qfmXmkcZYm}aFEmTY zh1mE&@dmBy@aSNaU9Q8x=STTl7fW0hpm~s)S zC-{MX=KP6m`?xjhhE&M=50kDJCwMvOW2-W%RRehq_a>~v+za*NswY{oPYM<95w=7+ zGm#)E)8nto1}I&*)>KvZNnM$4n(I&Z#!ZEOS55Loq5xBW2Of&#@hKinS-aPMZFnXe zD4R5$ib$zu^U}TcOA?(JL2e3mzd4|b5qT?4LJy0*GlA=ti`ls2uLq++1oJp8^3*2p z{X6RiN8R(0MG7bXIjav3>D|QJ%1PkB@jK$$`rAr{@DnYXh_5W#sv=I`ZV`l)M6K<{ z-Uv=bb_UF&cT#tvd9p}8x$a0NCqI=Uhfqj)Nx2#{Eim;N)i1p*k@FW0c7>%W0jNf3 z1wwC8tt#Up2^Py8+g6gPj(E5;SrnnoP z^%o&?$jYDI&)2iz z@pql^5__nG`xSsx+W>hn#K7wdabT7@>91}_y532QxYG{~Apy;m_Y)m{~ z`CVo-bjQJ*z-PmaT{(eMA%BCpK3N{JIJ&&6zm&%U85KKLQ$|`zqwdnwA$!>r>*I!v zA!{(NX`=ve$hRx_BXwhMW^>1YuDU_%V3W05q+gEw;2>PY*F_SGO!U@2$~i85n^K;E z+b_KH5wXBH%ghhA<#N_LO!NyhTg^RH<-9>0&@)4V)glBkXpF%l+j~j;6{gByI>H`7 z>6Gl3JBKi3Tww|3H)y4gv+x#t;fDey>nR40o!1~=lkU_@rr7H zY@g@%@UUZ^Uk(~O=lP5HdSjlym#cXUB1?dTX|R|S;1xwUL-{>Vkp98 zngbOnv58x`^Lr>jTJ)iB>EGMsZ(WGY<$Ugr)IAufdni)(lStje(Yi;Xb&p2to`}{x z6Mbl|6#T(F{ze{Jz~3jPds{9ky2?I%C|b#!Q6OM|+3mFHL8RB-y98atX$tQo7B3@#J8^aZj zuM&rsxLx9S@-9idpYn1PzDTY^7euV9@VLW{QMtf#HK&BYs4X+{*I_@C(^IIw=mg2O zV8PRLJ()x~QOVCjIswREsnB*|o$k2}*BOtdL)NS*)}0M&W4^0~^Mls#x{$}Y@mcw()0Rdb%rBKG zUYA}ZSbnv#0ql&Z`@Fp-@g4YQ` zc$)=L6V}X>81SY{San_}V!INTsB}@pV`hK~#;rV?o%Og~K0_wY&qDG`ViB!~>hN z=QLy=k-F<_$q*qL43jojqQ)Etq)kmf`tv7YOG=V!PvGGAto7_|H!*CXt1FS!w7-)ZpLP7YsIT}mWMR$63kfas z;7|*L2JxVVT&=Z<>7@f%w48_p(DM0Gy@|WDhO6bvm{y3yEMF24PBno~CXoPLGQQN* z5}_$ceX`IvyRz4s4lI2+EL$~4J}+2#d8wNj~B`w-+o}n zsiUWIwsV8{x+rFZtujy8s?23^Aoi9C75ltU;~ZDuWW*Ms#_I~b%es+43|e0gHGZ8K zeqmZ36hCpLG2itf;gF!KzUzmu1XE9>SM zt^Q0J{?RzCST1qIi>)whb+-%qBVG_^#hZ1Xbr9`lk{Guw!W${#gzN1co=b!Y#sQ+J zci&IM2qV**h8Nq?^hoB2Fz>CMvZ~8^$_)%#*cCHN;JNliEiqn0p_F=C#FYbdPhthq z1LUBUBrpRNR8W&FKsIQG)M0%c)eG6G#_6ysoVDd`{pV4XZ7nHgYZ4VK84B>j!>Zu1 z;x*Ec$_1khmmQ_*j{dGH3twbqWr5y)Fqj6+y zE`MDhQBZJ&qY+dfmrVyZKu!p3c;^M5xII2;Ucz})F>izirr&;22AMk@VDyY;1zFH^}!mS(+se7FTq98i<=Q2m*1!k3XUnjUJi%A#D0(-H1hpk7Q zI4+QbsPSD`MH+`y4JVQ2I4aKLylG0%|_+u&J zuqEtJGnHA;f=4q8?_6niGyAG@Smwm&3mWF6bQtF3Cw3iK%!w8}y1fQd)}V^n4!p~r zV4728W$v5OBUnXma{+K;FGvsx%ekq|Lfq4-44B`P@Qu4d3gnHPGY1P1R$-b-xunbn z-*^yw9M;)qZF~)Hl5K!TW$Wzp_>H7`2aZwS_{_IA&Br~kH7=F!$;|u(nF41UcB8`I z7+)U##<=nxwgi4zZ6z3;&i>5nN{!Qre4`L*>}Cm4m+!0hP?_ZomDU+y$a9@ z$mZc7L`7y*eIM@;&^A4p%tG!y7Xufy{S8}_a)+#PvvK_#Jx!?8=ZGf4SF}{W{`IDY zWzQ0^H}!^CD`=s6oEy+5%5hnqy5KZXdJ%Tm61}vU)>g`-tTEQ{kch~kI==~d-yA%g zbXfR!$9Ie9?RaX@Jn=SvEEMs@_mTSYAjUV&@xj~jj*!4Qk7(nEetRJpLUN z&~p=Zcw2tOLue{}dyF4?K@W9DPSuZOy(alKq4n^M6}{wM{vtE4YKY2I zQw2}=i=W`+>jH}_+r_WQ*Yj37wG04|CBWR20GTpw(|5Cp{Q~H1_8KBk!`mfE8S=8!NjZ}UkY zECR-k)@o#lY{$$H7=Wh)$WC9ZPCA_2@OOdd_V5kcV4QGLD_->_695KaV)-;X9WEv6gOo{%IqDckU$fn zZP$7MMKnlgI-u!pHklHVLyfyR?~IZ4I>{^$NuKM>whc^ zQbu7oq#tSF@mSu{WTMQIc(6|TG{;{|Wf}^8_nI~)i}&hXm`mAkxMr^GXkB=xkdxZ& zo~v_$r^l?_sn?uM#AytxO5ULCptYNFL{OcA+TXG*00SIQ4Nz+v3L>gsX7B*R6X~s) ze}lBl;i*YET%ilw$2yAn`ckf8@abKBBWZRg%>JiUt0laIr!yZ})g zx~-L#r{O;bMZ>7q-N2m%u)1xG@M!$#-YGjmv4%_0NF8Xqf)b#0v2Hk?g4$)^uM(X|`araaFOsvR#gs=FYanL-5ANBD9qLOkaHQ-&6 zw|{$2ZiRQ;*h?>sxG#z1UOePG9QIA&feD2xt5^Ls&;U4B=V6{+%JHLdB7z=>I;WSSYMM1Nr^Y1KCM_ z)j?}#!se30<_qRyh?nvF=BX#d4-@Zr44?Y*lT-;qH zS~sG|85ogh9fgBb(2oOZdoo{gQ85gDT7?tcBAn=lJJ|Rau^p&Mer2taJAa{pFFF4z zHkZ!lk>fupmHZaT$Ree>;4yX`s2i{csDqk5?$FW~@%>!x;ajn6qT_+SOw~$JmVW6~ zsYVQv&IFynZM4(yB+A_`f4P`0ZF+kwwDPum^vk+0^1H8m{hg7l?=tSW%Zy7{?&F~l zV^m8vk-p$d$Fv1SC$>HPw4Ys~1dFL+33A)}nkxs>;(~?Sm;i71~GH}*OJQJtX=TOQczz1L+0x(T6X%;_1%mX)0c5jEa%L2y;1h%TNynwNcSUQr!eQsOP=$>O@R(V@@-Y9)cu}TV# z7qp&o|EQW|>S#}S83u1h<{OAH4slv&F7@xQ4l{)%MJtaL*F&^WMV{WV<}+<@=Fo7n zZToZVN)AKV!`9)Ekm5nBFw|J+X=oS2HmON0)^0eQlbCVLIz(mC1Z`ncw#Dj4zZ(1~ z9JwSfHX6gmD-N{1pNE}C=p8inSjypc=C#jLJcM0?uRr)ls>bq(7sfO^#bq{hgyp>A z6{eUKwD1{S7{aItETN(ap;|~p_f9DV!H6JPw2v) z1Oq*?3l}+ED5VP?(}hyI3%}3qLTRcCU$(nYDz+D|rsl%Kwaw9U(Y@TB3r}j?e;{et zxp-d69yJ#~(cL<^2-4Q%9w9d7WvOf)S znl2r@<7AMB_O)?XEZ#0sbSv$-RtRgN%r$Xnjnq&-`I0+=-q3H&%ed(+9Slsgc{7+o z^X}`N&bC(yT5%2B@7|J{PlHm>Pd2&3V;Y`R+axTC``P3?oPo|{)jB(|_T($-+NmTB z+!6=4bn{OeQ0J>FRp`k|>bX9!~*^c|b*}4sdxCxCl^EA;ttY7aa+kiTFukYjR-2ipJ_5=3zvzAV0>! z>B-OEK@&hkw>3}l@%3_P8S|Bf4i+!T54C%H+@TM~&Z&w0xwfsx9r2Cruu9SF6Jt2Y zUu8~U$;ACwR~yU#Mc~mq$!~=9B*-DT8n~o~>g2!Pks2&~&&y~IE7Q|2OwTIc*rvD9 z1~5#|z(sy9?lEn?=Wvyx#IFXe(k5#_l%>O4z=~2vE}9+AD8s$e{CTRZu^HWr4nCcH zUgCpp3pyj#E1HR7OP*+N_>%Ma^S=Jj!50>;zh1b+#}*6 zlL9Dm_0d0+o|3PulZicdhj-OW#uEpU_mcuRCoaJqO;FA3@*3Wet##;n83p=AZL_(h zw|cpv#}!TH$k^?ilh74U=)jD*9mfvX&2!(1ABb&YdzOP9HfH{Ol?@pbQT({_E_tbZ za8p$XE2-C?%S+sv7u!^km+{VsBi}hA;~h`KYs|IdEks)_;)vi$?!ouHjcz4+UenaG z^99|?CcY)gZ9zd?G1Ym9d^k(10uZ7*1=aVI|pC??7&ZF@{gQc z#D)u3|3cbi=%PcQQ;6-KPRL0NU&drpHz)bAJ7vV8kJs`6f>G2HBkVJq<7UtHr9{Af(gtzcfj)GJo|vI(H66C^IfR zSIzqD2#y~?WPXR(<=>crIWMMWpr20442XLRW+2}95i_n+@Iwm86qqgENj>e3)C|aB z>l0_dDWAh&h2PTv@x@N+`(XvYOpGWdrqXwi4oa{T&CGPn7%`!MX-Nc=>1i=5IPS3V+`>@lb?eFS>FNf0Om#29-b%k%}CWMnn7S!Z#P5wO8 zD~+6bH-c?jfuW1@{#Q&bENLpb;Zwlbx0{ZO_35aXZ{PMk5#L53wi`i%jm9p>&-992 zki60TOWtV2#;(-X#n+v`8x>#K^->!6xG#!umV>M6;w6{yOkqU5hdJzUxI&|%#p?1l z{|wNWs=HRn5D%b|Zk|7l!2_0C;sPJ*+gD|A`*WPtEj-TwQ|>Vqh^ltuXe5<*4~dJ0 zgy|I|TFasLz6%Pf=NL zvkF*n@HdF*BwXqRkUOz57Vu`65(scBnYxes<$!p5GJ@@XMu&zF9{VRK@So2}PLd1( zqJH5j^BPtTQ|lBn&UJEA;M?hl^ARlgzbG{cQY3$iF{k5@Lgs1wA*C9rdVeKY^^v2( zYva+xf1pA^)FfsTOb>aNNdO^JAyu5OvxdJZk!8Y4ua{`E8FME#9MaUdbiZzQJ&dt% z__H}Z=QuqxW%_S(7_WDZxK`j+N;D0l1qQ@~i%~fID15_q4%_1t)_UE-B&N~W+kA%- zDjNkhF?t$;pQ1l2^uf;A#RC%TI3b#osmQ%Bnn_Q9AR@`p0pignT2`>a5$t2lDPI92 z=9jj?`lJDfJqNIJDiFspadJ$e}mI~NW8i=RrwQ#3kkMT=%@5Qt564pkcR4nZO2A*oLLuF0loToV+Rh_HMGn=QM&m8 z6NBew{0tij{{e2>_MtW5&t;~5-G%Z7%DlhRld4*st4(>clGqMwC#TFm@_B>LpZM(J z^JhM9x{~*CI)b)Bb)9>;PQpKP@D~BR+{nSjLUG%a;`TyukL7+&Meq_M`||Iwl<*N$ zOlYDOVxD%>pxj3#TIKA)_RRn?Na*&sZ=0c5TLRe5^%}tr^_+f!&`*eqLqB_ker^`} zxtZ2BA5A|Wfi2~3D@{L%F{Oaq)?{rrB(&ccF$oDxb@*raQ$dFVc@6^IBb}Q@9+!XTaw{N#eCBnW`*&9d%kD=+a7ioy$jv18`MmYUa&HRQ3 zAb20dtdE-88VkJZG3hT-KXef>HOlJ3IsWO|>F$gM@}yNT2)Jb?{{tNpL;93|V!W#% zX^0Il7f1F}ll*-L?;%|fc=MQZh%t?zj#SDfV%&jIzIWi(n2`wS+{l39X@LpKwcRlP!Gq8M5^ob6kg7{!abRrmi2G6w4BId(f~`z+m3HMosp(C@#neOhtdDVDwD6EKS>ySi8lJWVhOp?8c5n=2vaV z`b-65zb&%~?98K=>yZxYr{w)?DB1KYAq#Dw zv&YZ{ha_;$=v7{8_dD12r8Yly$`577 z!5Lz&^u8u}c&Q*>IVa$$c%A+$ESY~M)C3U*<_nj1|%c(44-!`^-l}(lNG19pZrftPdyu zQdZ(N^=Hv(3j!+;1bWs5K~>LBgUIpv1_O&?R{!>7TX%j1r`I;Lu#DpoNY0uxobI?4 zGPfSXxEcBPlaq!<*IsC=oz?-iwO?APv?{~|*i$PiH#gD!z z(=sdFsfGtlvyZNl9kpoC*C+7tCa#94fN*JSLm0DNm=WL3%y}td8%$Mx^V816?9vY1 z&9lyv>EGErLWL%_Md}7Y-L&TaAc_?K$pnWQ2T`ODb2)ZMcV}$*IkFn|x4QyG_xnd; zg&yx*Iiknf-=3S1kl!y$vmc5YkGY5Utf8HHRu-u>;xffA?C%3O-==;r#g z=Ok8fzq$8zcgl_Y46MC9(>Xe#_&|Bi6aCWktLAKAmwYK&{d~N7S7OEJJHEdu3pvLLm~*L729|F^t{2Y!LVgzDVmfB8J}PK6hor_sr}o z=A@DEAiSkPEcA(lMYM%ND-+EgX?rO6%lKKXi!4B9v;`@ErX0j}!Hg zmM2w`)Z?3$8~jpMCh8&!$xNp~MHaKFtZm>WPMSZ(YN^N_hnXR&>P}1dQ9`#-uzhFP z+Kw=HTYAm2Ewh^lj|AzE-Q*1zI(8GV+^L}WNvWWy^1*@&StWrBFk&qD3cs*T>`w0~ zb=|V3bnBkdZEO>}L2|Y_Lv~(XV(%&3XJJ15Gqx~iPw6##%0yaL?0oh)*;TGF;y$A| zH-{Z1%`tXZZ?Thf@%am%zq*n&PuN>Uii6yFBnP<}4svsfgWSmKF!Wxyk;4Cw5h9q| zEobl_C2-4fM~2LX?@6a{DZ$@0J)KBF4e%d9OM{<28Y%5&fW}EA~ zP!}$K670iRABVA%Ndxo^1f5QEW$NFWE4(?$H&EP`yGFm8J3U75K7 z!m5vZPmZ^xonGiUP|eyqCT^{a7(>%1$f%4MJJSdG?Wm1;o8_Ed895D=Sa0((ev4}d zq+!22Jd`YD$Cj1Bb2ZOE)v)vfIqKtE;;Hp1m;8C=-2H0eLD%n*M2OG4GXE`lKcm!3 zt`uvM?Ycpicer!li<`C>5(;PkH|_J`?wdhA<>O>U39RYxde7j-%HD_9r^m@x-#s)-*+eh((ps2?2W!0f>> zosP_%6JTTm?w1qKn~`0ZIWluoN{8P2hLYxv5sb{^SoY($myyZkfEn3gMs~IB9V*@% z?lt$HCYpsY6PBP8{RExJDP|&9>tJxgYft1`j*F(B$YAa>6Zt)Urzf&mb7Ud|w*#o; zQ=E{Z^YkGSF}kK$*%KO7nN%pHfXu) zou@i(eo#1rM)XDdiCrF5!1X%V;M|59e_=L8uu#yQ<9HUS`v*z|9Ow3Opy2C+4(nf> zE%ps1pMJ#LQ!s;arD@-j$ti+S6ze^O^s6?RxWOKUw?(9GdQ>W=OpzIBZSppHE#4xG zJIBn!QbwVd?Wq6#3_zsK8W*emZ6jvn?yJn2kbD4^p2+bjIcqaNo@L9`z5uD~W@ z3&ccK8;QEPQ)sbzz0GBa)MT1x4$^kEp)4R6a6FiDR3hPUMbo`lenlrZ!)XC#i<&78@q-& zyR1~=C=hBTGls4D?2M|jdVRc8_1USab3du-J!l~x-Rsv$m5os}wz8^TE5)+`^0;00 zs9xVaY}Mb&s5%QE*Em&=O!a!!CsjRh*s4FBQFT_Y^PH;F0QulXGs2^Ky^D;a0kY99 zeiT5Sl;YU{`Qay3-8gL3H`>L~iO|Vj^tcM6&AJdIyeLQba&Cki8E>CROSTJNz8%!r zp2?R>`Ssrut{kQkk>S()tA84bhy>n_Nk|kaG(*H@VhyJ)WJ# z|2jQ%IFL=sj07j5L?9$%qhW zP%((9*O3bN|NJQUNWT>kb{&Zb-sURyX9JT5?^gkh4IuNN=s=KLDtd(!4iIuv9JRP+ z97neH?T`$fkP+KAo1UYmBi+c~+bGUd#`q?v(JXU+_KE}YB@l!v)MJ5hEO#{@Vr zqf#U-MMFKuuFUNjz0%cl43e9XD+l$uAP<$;LF{{s2&V6oL@?VB!E{UG86ucy^_r+} z-Dh%R)q|q&x@Ocy5yrUUzLm&h#IKl!_(cb!o6h50?+oAw&e(#LXAJJ7dzxsjlos^N zX|Id@tP8+vkV$-=n)NAh1czCB-sW2sEO1v zMO-nYw!VR%nXS*Sfhv>+y^ebE@g#`Zj(x#z3g5suDa&>`uC*~ z6vhigVbj@k?>M^U`TE{$Z9Fek+a*pLS=-|0?KX~TyhMsS^zQ%s5wL!E&CX9Rp) z_4el&H^ycygpt*A4$r>Zz};EON0!wka;PqqLv`7A8(lhjQ^6%)bEu8dM(#F5AjRSN zcCO{<+<8A$;gc%Sr4&T={~%kwl)=31Wd&~DVs&q1%2Fbxet5VO?AwUFFl z9M=#=E#yR-h5J#XUPDMIL(V)`+bo=lq+XOe2qWY{tM5g*R7|WFo0FP-PbY8wlL!nn zu8O(9b3!eM_~OeNt5dG_A7Bh1m%X{{6>1{M6R%~0#hIR>$X=6p3W?IitZT$PSY4wS zim!Bl8E@PxvpMP4veiK}Me1_^dq1Uaq6#mUiKZ_th?>qfZUXz28cNGAUX!})$kqm- zF3G>2eCJM)IpU}drP~Jq&8}O;G~VU}@TbfB7CyocdM8R7Yvl6LR5pvsl>Z`&tAteg zB-4l~bjAviA$70K!~O{*ll8uiINH-(uHdnDJx~8rfL&}~(hS@0x39J_%z>77*=*>T z%=tclo^b8-LD$gBvWe_7DjWMy*)X9bY*0S)6H%Gfg1=lTjlw)+k6fU7p53o?-)D9? zBI659OdZU4YUzngqpF7E!bvn6I`HHu5)5Z1pXDxr*Nm;Ik#KS-OL7zmTw`h}rfQ%f zt8Sf3M8G*1F%y2NJg4UZyCJW%uDvy{yjCmNJDwBh8;SyztrDKxyP|F8={YV(O9bOn z#0whiHB6i$o#7TC(wV9vT-Q6-8lbbc`A49>-RJ{Y$U4R-?9a4tE6+f-mfkK%gV_q^~)*|?r6wC^fmk@s@kRHTv{2K%D=VrV)#B(Ff{ zRcxu(3%SghV3`5m3z*YoqgLQTm=u>@FCg*Hr0ctcuJ2O1zRRZTyJW`g&Mu}OrW1-t z4-;}6YgQwz*b9088XP%zQuE_X+34^BIuE`2e=MN;kb6mI`Tp+(bX8aC*#36{y5U5R zXMgwTk%_eK|AXl9k2v4?_eXZq{C{I)6?1A?XUMt;a3JDE#65O62Lwl=X~bpG@Tx{4 zMzea8&)3*Apc~OjcSQNp)Nx(2ELKc*O8sNzBMb9x zz-v-tiFr|T~T-$n+fdaUZbAChT8NQkoVWsqY;ox%ooYuDzY z0BZvSy+>8Z#ws<*SJ@se>zcz73fM4B~q zK9Ufw54PKh>!P-zt&Gd=OlD8M=Df9P`EWg1afJh2R4|8u?q}3DeKA)JCKRoJ+Np8o z@zM|IaaKPfdbPh(uJ#R-&i|R9oq`A3g*wz~`|N&dyoVhi0A-jdRv|+ zHw#3W(LcOliJt0oXNH1>ZMlnEYr(O)-n3t?Ax~g|oY4X`c$F0atweR`ZGWeL#F3xM z4(@=;k+_czoS3;u5bnXfu_Mpp>M1!YIa20PWpLbRQZt4%(r6y4-?zXGr^t;=b{+%DGG`$EXa)>>UyV0&hvt3H8x)xH75ru6`q!J8{Rv zp-Z<|5*9nBe(In%+{ce->$a8755&7oivp(`he?(%unudz^g!t+H2p-WoE&c~=R0tYcQs*MR#(RB z#z%v+e$H73ysHnL^`BGs@pj{JR8~)I-qnNDr`5bc4{+54NG_EjPUh`p#{o|UyW}Pw z4+rbzE-628$577~vf#4h3>l^lB`_j%=TJ@nLr;`pf)x$#;@iKm;w#?OL)wOb;Z4RQ z11ohif^!(!0qKy8jt(8BH{R97v>CVzAOQ5h#r0DU1uj@}1{|kIkw?~_)miU;1)qK1 z)i1r4L=3R{6`Yyj%AXo~&WVjY)3bdK<;3$>y&GF0S5H|yIKe;eO8=Sl(G#wu0skpD zB_Gg9jSBCl_6ZVH$cez~cLfU;KE}VEe2M??)KFkt@$6*Tw7VDk%MF4IKYYVxd-$Dj-Nq!s+dQ8)DQ`K!c^<*InYhD-$##p!o$+p~Q>=SM}rg(isWWDG$eG_!%7b3Fj`6bn%acxV$h+99SxPsXf z{lk`v$mg;#Zat5=D^zy6znI^i24Yppa`ed@JpRoJ= z8+cH5Cjb~8a0T%aOr4uEgK5;xk!TuiAx~~i@)R_2ICJ4-=8I?vok&Gmi~l&$5&Bw- zk+O^va2!*u2O%dLNz28WJsxWnx=!EwysJl|CBz{k>TC0^-s)WqT(+I{62y1+)R%~l z;cGjKpc(C|oc9F9$lyrQd6sV**?9Yv3eJLX$Wc*+I=xPRP)T}GRFW_`gCS6doR7*6M%=(0$==PtOJUw8YS0-|7yi#K-HhYv|qjQ8D< zxs|7by5Mct+KfA{=h?^BnOnC`bL%Ezc+rjI7y=$mY1Zpg@3QmgoL=#&TN)IzC1iq; z`1}K~VL5VD4^fM*xmqPY*m)M!1gD{|;4i{AcdNwkqnkyB9Qljp!xGd-mroe{4FP77 zBfl$0^b*4_s`Owi;004y;go+eq&(7VB56g8n#Y5u4l5o`e5d(E7PxTPQSWKUtOrL z7V&CPLv9h5p0>$kxlud;U?QKMBhd>wtdDb&Pc4Id4#dMNS@HAdvk<(^cnZmh$JcS` z89q45+q{v-mbT#8;e#WCpIbj;dalQgDE{F`vLuS1C=ZN;^t$$}p`g&u5e@qU;_Kt1uc&^3=^N+7wK9f2H0Ys?tL>)to?A zS%Tt_}?vy#fWP36nU-`|wVm-8aZBuGsf(89!emZQb))4krDoMRs04H9u7c0V?!{;}j_ zPHpj^oFKAQ7`)5G-@L?35opLRqc9nTHacYiENX&>$K5imI5>itarG2UE0<$aA*yuZ z$<-Ez7E*`q5_;$`+rusvExcq-;C!?tVVIQ2YN)3ogx3FHoO6;VHW|uPl3q5k=2C$> zV3)lmFwRV=JyoZQB4lUz>>B&|`>Gf@4qqI~WMD&rQV=h&z0F>MFtW*UKh{y!Z9?yToQH^u<5)c!6dG=2(N-Z9iDuWWY!Skh;3FY!jfW27 zp(EX25O-XSyS+9MsifNzhw^2K={}F%Iq^)bK9qn^>=V53wl1V6ygQHzMw^&a9J-J# zRJRRm;nxUa9}_$wyk4{%astQfZxxrNdF*+-8oHyHiVjoJXrAOmC3N0QnhdCQhTxbU zJpRgC5CM3E@$rpjr;0UCkh_8@uB8|oF^>B1ize*os>{c)?0Khn>ttERw0bW#Jg6m?#27(PwZ=Y7ZGdD z#E#jSmA~*Qr3ax6v)GYb!TI40LO-#o4{s3kB6Q%;bK}9*_04oh*AhJs@ltK_ngOAj zr9;nEkPkbNU*mW66f9hk?)f}Z`JP`MLnFTKp+s1?>84GB_n#vq>`X|*ZgF9wVG;X6 z-;%@ILMcoXB*he4nqH+BrVdo#3UE10~QDu zeUya5uDZso;tx4;)9F0ap_nfreglQKp5k2 z9AEF^w&T33qGfbCw%l{=NuVOO0ryO$Z7gihYfpT(8#UU9VTG0dz?Rp{+Le;Gx|*;?QJwuFMf)%Vug zsIM!zlN$iit-^YU5hp;*DsstJ>1;!>^cq&2%|lZWpaH={Pdme7C#>|3d% zYctyHvfI2o)n=Epd0r--V3?hHcYeBQ38GBbkHiq{4eX`|zHc}E?Nrj=Nz&mmTlLYV zd#NIYrkB}W`0vqFfM$<>;_#g~CDq~*r$wEQE?qifQ@PbnF5vHyS+l`0+wKcfB;cqJ z65N$J1y|4oJ+`zpwO_1-OY0}QmJk|1_Ygam?pdCzI&x+Utu8^S61JtO4Acn4YU2nri%Q5B8jRc z_|i%xttE*XwIitZ+jTukDhn;rDlQ~7FTE@xc3#!-nlUo<(#ol@De z$yQh^0z_LwcGU}~XO=qCDfJ@qw4D0W+UrNAOUm4)>dQ$t*SgH9>ype8f4#?PG1|(( zK?kx>5F=H`x>N~3D)efkDcBmJxQW!JxGeo1%;r{YNPU|cKx%*m3C99SZP5nvuo>Ty zXcaB#qiXpQ9Z2!Kb}f^Jt))b35kS^ucDjJVIyuieW4bdlJNaE_)Uwc`ts>~w*)aC` zc8eRGQVM70%z!#o_?pZrf8Z3hr>@1R^6Jb|H#?;=rY=?T+RTy`B^6>bBdvEib!83W zG^Z}R#Z>jZjbd1iYdSzhjU@5p$%8SekoAAE!z3zX|9+Fq;kv1)iom%q|;e-hn5n!rb_Kk90dlum;g6b>{W^h7^=#& z3gg4t2GMgSPu6bhMqbhq!t18qzSnuXLh}-tc|j+S7@-XC?##UT>6)v~)@(7OO;tO^ zdG!mLCzp1qyi=UK37U6rW?pVawdZKIm?5NI{o8VTtmkUp_cQahIC&E_Z$)O_(g zP&G-j%|(z6rsdA7=V{&#Ghe;M$@@Q=Cl?;6?##`o_I%A2W%yL~dCsc@ssMiXXXc&c zGMzE4u3DlmItb7sMvk}6eaVb^+6|9kAZ&ncB&WW!vEmSXZxsT^HptlIrKd29Mm z>N)6>f75qFS?GCezq^MyI6a4 z7vnc;7Y8{mS$#3zhf`*9?p^;cIrr|i&%L``kdDUP$U2vhZX4v>^TyZS8|vco4j)ml zasI1_W19Ld^VlawPW~g^SC)fykT1$5hJ8h^6H~^i9AH~#(oP|Ac7iv5N)<40h202>vfRgYA?v0 z!0|M>@Sf>zJ^JsfO*X5RBX|GZPv+2#K!NE+&Vfs>&B@8l2|CY?RaUV0fYnViE=snR z0};{M;|P9dsR|0Yl+~5+ zKmU?Ul7Sg8YEYC2iABK{7}Nkkf-(@4!C*)N3PLNUF}SP6d4RS=CQgEx83$>XcImEd z-QBipx7(Jtbs;K3CZS0HtAMt}LT!RnCJx=kLLp+zyx()5XC@QG_TAraKOcrX&%O7# zf6hJkoO91T_Z;ct8vn`8)^2OgVgHklo3U_ju6l@`HPh$$kF3w?cuFS6?0>S(B`<%J zm(cu&ammnY^Y>&8MhmUYiyy<%HnaIDnLh(=zDfgT4(*=M{53LYYp825+Prv_jM@Jc zi)B58)v_VmzfYjT;jKR;-<$m}t3POl89V)3yvE;iTKd=3yqLgTe=_-&h2}pL+WHla zP73?|J^eGI>#x3aQuo)XNv)2R{o!I_IU1)zzL~Z~zImbFmtNc^IPeX|x#`!UAh^B=)w^H^Cp;D&E_5nJy+Q^dLZAB6;Pl9a1m zSCXNPIgfSuB_%U@xzJ2y4*@FrdsT_qH@d{?8=2OkCH_ok@oG`q-B5h*mwamJ7JQ;f zbMHhd0<_wA|K=~5^kSu-C}!z3t76u_Ud-A{SRXl}dZblOtz-z{%GV-|F414J;aCNQeAWSSW>d&DE^vcibM@(k!@R4=w(ZzsEka%Qq*j@7cnrn`#yMC>m=M z5~98|#o6t~4KARl&sD{WsLGJEF`@aZ2fLb|7V%t-jw=eG`KwU=Szx_$4&|*cgGJ3ZNmQ=YYWNB-j zYdt^zp)4&gG}rus%a`FOXr62CnE#;JztC)_)xs=}Z7FJg!ER)d;nFiKnvEAfn(gNK zqnY2ZX@=);y%k+4orZjyOB~u%z~^r%TEu){CMp+Beb=XfDn~$d{}+wp)v-dlSU?bu zu0VG_2PzFG6K^CE(eCWrHZUdncW*hum2U-3TKyNTLj2ykJ9^ULKHPB9GzDFAn*kNy z*d(#lM(ace742#q_!cD+-%TWminHl^5DlRQ>u(QLJ?uYeZLYlFzi81$hrYRq$t8g| zXVYheT&JaI*~OI?oK06tvieNE@o--7*xh&gZsvDI;C-7mpCbNTq9gOy5 zxVsv9x~bRAwV1^Z1$wOheJx6*o)PWIid&;SoE}xJ&6V7`K(8&(lZ7jhyYB{sxd#K? z-ML-C#Tzj)#32t$_p-5+!8cgp{y%@p!}>>CfUS$|y`Vpxqz zw?0g467R=i=C;_vafGFrN?79rBhoJ>Katt2E+}*2V)uMB=!yI54*w?WLGDm zYPtSw4VEC`zS!a4iwNj|UVK(0gpvNeBE29{bEp=#atP$#``TPd$oB93*%x^5eYWE+ zvpGIlN*5$cU!5$)_o~#;_msxK{cMBBE)r%#yOLg2=N|+# z4VvV5My%xzLEA!1IE_-d)e|9J8o{Zn=uXmW& zuj2oV4WqE~6w$;+(DwU6EA4TwUTS@9?b4n^?L59vw%l>#0>t0n>A5S0a1{62+vKi!95tZ5BGw02!No6L_~pEn z|7mp137Jcmapu2-raAeO)_YaYn!N)we<#h~LGv>alQKdcSG-j3gJ}Lg(T82cWKE6x zmpS^l4{|6P^1A9wv9+ob^g#7P@5Jwq>zz;r9K(Tf?(_c>puBOp4i%+$s6_A35KxZ8 z5DcK8E>6Mab=9T3|8H<{LGeEUm+w592ABWJz7#GMsvr0SA3i_xjeh8$k!S$UU0Vg8 z-N)UnlMYq;Yzr4^_mTDzX_F55ZeOU)QwApoWYI)QrWUKE>~mq_qNCZBOaL=p{N2Y` z;y$#~(1AE6YDV^X`aw1avC0ZWxleHJ+M+i(shtK{6AzH08f^E?F4Mg1AdEA5to@7z zuh0+m^)_EpZRQzma&#i+{c?txUI=|ZEsGQSmF+Z({bBXA`rL-m^!=md`?4$yu}Mt#OR*gI+?C!q8jp_U}( zRe!6_y6Qs0eE<)mVqKse3wry5-T^so^%B_k6h?sI&Ph?+TlyxKvER|eKs!I|Xj;0u zC(#fsF0+n^7Y<9xpHC80D6N#8BpQ%t8{3}FCUPLe!++7NO_fqYtgbB6ij;E#p~m6H zDL+QUj3Wr)QOQX8p%OYzo%f72`yP|fQ5Z+tV^6^Fv9s%B)~SX8_*`W^dznUSeQ`VE zh+7#C?fP4!U9+?45Hu~>YC)N^=@s5{L2YidmeDlkEca-^VEA!nbQ{~H?);jG#{7yLxXU}>SbTK}afG_d_ksKW_G+vz1 z-t73*yu?RvVJiN6`R_FUNx{rQ>-a z=aifg$i>3A6+6C~rq(C*lg=}7n|S{<>>_Jsc+ady-o&_OXkz4S8=(^$?(>t{dw4dnV#259PQH3s>Ej9%C?gNvezL{m(mj&cJPAn6M zUti|SEA!=)X3trHG0!@1aD_eHy1G>|YQaxtLj>lMSHR4K|#I3%S8qTQpVlyx9}`(<;b zljcF?Nv{>WNpE4Gp~r+YB-IbZ@Bif2{eQJ?a{o%*{X=zwp(h07I!(Z~6`ByHMJq<+ zoMK|5$4agwJ@&{^Av4y>W8v4=9C@QElEq{>JU{N|5t?poj1&Wq+A(kig15NRG85xLpyOc*&*N1IcWmHu38&&F)WT%dm#lopu`q6$u_w zrV*)xMTOf#MRYMVRb)qO>4v2W>EU*UZnL_CTqvOkyHItz{}ti3ma0f&zOa~TCRoev z^w_~oQ#{xIu*wuW?qFve+T*${)0o|=i@2`zb z36o4Fo+NcxVH+-;4(cDK`*fNv;KEc+hghgmVqD-GNnnM;ANToIJUEEI?%1S`p!Ql& z>xS_X(1R->LG4^nI}_CUg4$cKX(1wTO_p9;c)HGvI}|e>pPn*Z*fV@|s7yX7R0{(R zM?=kmzoJztNU>ULXShXN4u$>yM>uZ%TexpVK@FCgeLjiGsQB(jc*hc}G!CC#25Y6e z+D)|uR4;|fW5*~`Td-Jvh1LtZ-cOox4aBE0S((>}{?ys@Z4iR-^~#|YL+y>Izx};( zsv+G2n+-{T?lpH6NcUdje+mC0rmw25(lX&1l@yf#Flqt>=R0A~f044DbMfNKWqzPC z2jbUWF7uBnv!7YZtDA!v?E``SoDC0S5B9xhPIG`h#3JKMjkl4+tnRhP|7g5kC9kgd zJI3qv@|quiLzr#5{D()gdumAfI#>J;bp`RB7E#E?uV^uG1`&6(a9RQrZ4ovr zOmu>HTJMD~EY$LggptB-rotR@hhEOWSb-AT$>EF@kt1+1$N99fGbsGV#K>us`LTuv4E}Ls`;P}hoO0cgr+KnyZ0n}=+<=nOjheX-b8tuuC z|5NJg6#q`=uAk1l|4Q?)_O#}S`t?6*{+!N$MHaqv)aQmqjVyeb+%&m^YujpB>&)9p zR2igGm^U1}UpV+{Dfaz(l6#*}ygLT(mSy`Xyt`7o6<(Hi_bGCfsFop6xMxC5h7T(5TZ|E-JN6$Df$%FE!i@vp_O|%){PS##dw}6 z7V;?DM`7J(QmH~Z4R*Bcy{Atn&hfK0pH7VCcLTp0`Ay_@h zcOTPc)|%4t-^J%A`SBa1KD{z)yHPs48TxoyUbT8%-qb|_QmP@&o1Gv^W}p{~%$U8!?Eu2zXm)H@3L$7nuX zEZQVnyRLX_Dqu8A#fb18))&5|PdVr{}m^8+xE|{_t;9 z5Z}SM0XQ}ruVvU4ifCo9LZPUwpcjC<{>11kS}WwXNf|0 zQK=~Krh^bJ-)DyP4TE`wq{;TPkxPQjg0AT@tXhNNuC=XWbyEo4!oxVg!1STH$YP2- zH$&_JoV%XAR}RI3W2<|(f_|=J`);k-;*s{~px0ERlZ9R-4n`3w#p8gVc{0kUHF4s}sB&Q@H(UVpRU;fsGk0O=* z_tmk%(Gj>mvgL^SxSWYM-B*sgUiM;NAe={dCH{uS20F45-ahR)_jwx2SB>?p__W5( zlJhqj`#^m>tg*F_h|4qvX^@dUaA{*WJXa$-N)C;Ec4%a3MfOKL{pDyhkC0uLZ;av4)O|96@}Q|Ch_j_}`@<>R*0oyGe)!$hqtwTfbm*U`vDg zc-SCavOgFG(fDSgF*-X1WJsI5mBtX=B-7Ml=!!mhA6BR4E%udP=%@KvTm^p=SVg@3 zOCnpQ@`-a7hDt=$%U>dZkh*0bSsi-@6Q!XkZLW?5s3LUi{PAm!``@)y``f3)z9f|j zB);5u+_^=LJJcL)!Unze*kkQOZ_cPx zA840Sz(}k2XkSwov{01ixmyF93SHCTjJ)M*8FibNu{#j01W9Prbx9-Q>7x=3R_w8x zVgfG*w-=Y8$%);wdq7#1aBZU?q4EER>e8GGw3E_7O2@ehb1t^jD9Dw9%N2ZI{POG{ zd!QXnzB(k~{EFbUBGpmO+H()>+(mKj)16m=2?J z8CxBW24a)tK=4+aDwg@KQ;NlmI_v%MukOs;d*)^i7bfkr?mZ?lRnf6%A2L?A_TjrY> zfksK0Az$1gI(!i!&`AwI5>4^7jQ)AaAH%~Ac@TJPlZULGj=eANFtdHVN20zucO465 zA~mMq!ATJR`iFY{EEYq+Lu9+%oDTtzRmz44fZU_CuX>REOERv+CK#G%p$@}6>s;Zs z<t4DwDSP5X8%E14fZo7a1jD$2=b;B9F^4 ztk_&~<5+oxNrLzUxgy8PUAS(EF6rFz1v(^llNW{+Y*I&8>H?@-rXey4p?ha}@|=M} zURkOaa1^26293NlcMR zedCl`S?GtR9S?a=Kz^;QGn*$)Le-iZ^8RjS^G!VZvgADMhIQ}opXRRJ&&gBmchQU2 zu9m0NiMG^t?p}3L`DYrD*X%zE&J?2gg+p*>6gL}I52p%e*S0$3{%#q{|596I4=2hT z&PSfp1b!7u%40KLAQ0z1r*oebX_XHrwH@gvV5+uFuS%~62vSejW)C+0S0geF_n|S| zLz3n{fzeZPYE8_#kmth8Oy^VIQEwkLbjVFa%owc9iu0*8q}JUKQ57)#57Y$k26Jt7 zU4G&=nU3U);Z$2_1%O(xAkbmENBa$G|Kyd^hBJE@a55&id_q|8yJU(1{%dl17;2=~ zRTZmwS*$@^n1g0>qm{eW)^$C)C;baY2$`dCEq4tTXohQihuqGN%gs&XvN%^UPn-4% zrGzY>W+CF9P_%HqzsD!mL}Hh%O)x4vo^+c5q+GpkN<4X=o8usMq2bDch@$~jto49% zU*0I^KASoG+eya)A5C;VbDAoxZ7K|5O|WsqJid;2yO%_~$C!*aejq(|09yg=tjhzoe_H3dt6(IP68Dn9&7$5N* zD@Uy$!MS%gdZh94*!_B=37n;P&uG8IL)I~zAfcq|r=QjXliDJAV~%iLJ>j^oCTOY4 zTZaKce`KDCV}<4@RD)Yyt^8S1J~W3HVY~6NDuRj26k&|Rfq^}C#hv28B00}{N6EBJ z?EQPTY|dQ`Kcou8ng*dmX*J!5A_#0qK?FC1&Sypqfqb$1fSVoQ8H6P@-byA4@ueVK ziB^2(?!wO-*ojf<4nd(WN0`%3Lp2LCu8%9%*j?{KL+DT;q%?EV*#3CYTlR zoS=L^bH}ARQ*~Wlp!F7klKVLDMQsjvi5V9AS7Z+|6WZw^IR8ZP-s0kwabgt9G2{mj z6wZfFDfD$bo`W{;+M!`%A^(@BVs1MTl9N)mA`i2#~CqpI@%BejD z)?!e9S|^hj@Z!?UrY)yOSXzS&!@sj0z*4C$uMRWpPvo8Mk~)`3_LY~(?o!$KAM2xo zhAZ1Oz@25DillK4Z-h6gw9~|)T|lf@Sw-U-KUKMAZ2H7MO$g_(7h1(R%tjk&+so$Zvrr;P{ zGnsMy^2n>=8Ru+@pQ@a?>vP-u^Nxznwl9tZrO(Q_(yl> zqnZUu^y#h_3Mlr;p)IuBF?q>Jm8Hef; zp-%277lv(JBCCuob2ffJ3I2%h1^$RM)ai+d+_Fyy!cGS|&_5v%5)~0XKJ7qg9NQHb z=nlz+fvz&o+#wVM2FkSw$GYD;cYVdodWT9|>)F~Is0nZS$QH3}wYJs-_hbmLq=cR= zd6|+dP$DRoyLG{Wgtr?m=-oks+O|Q@IN^2U;B^Jgr`!su`nh&5a|V`)A+XF_yUy+g ztiaUy)DK9lGxgrZAa>gJiR9ILJ74lF!dLGk{aNI%-f=t&vbEs*-k9;aOy*qXJGbrZ zkI*L!o1?7Rx_?RW9IP)+@sM!=Xnk^;er!%n(=RB{>=~!zngVA)KkZJNHGFy4&CzbA zr&~sA6&_F+DT#);0WeX{mMhA93(9=6jG1{UIWw){50HF9SE-9FOv*N6QXWiBN})a} zJ@H$1+FnvJ=s_No3>xJ@$)GJvXifNDTa9^Dh_}UkepP5x<5Axg&fW8F-QnEzTNEX*-CH;E(OePU zd+HpNiRdY^trje*%abP=MfuQDe(t#9MDo$$-h8!=I4Q*O`Bqe5; z2UfU`Rt3vHKkY!|@!Ok64o2tuKXk1-?>>H4ouzr%g68tFVEMz%%RbjxYKyU_>L|U% z)>&G~$*8HL^t1Lz^DlXNFu0^2-;+xQf=kYI&MiijZ0ej_+Ru{joQwPb&s;J+5Opoq zep6>%9^4@@VVajs4K7WY~iSw zl-R;Y0w?XcZAW76sHlV3zZ%x0TRRY_gZ9wYPX0ERxx!n!B%#cP9qVD9P!!|^pOq%u z2j+H`=KY_4Kb@GN-nA@VckwE+X_+IuIV53G3o7AEz@|#9HfCD`VGh{!XcB!ku8dfDXT59+#K~RXKM( z?q*BSz>U>XQ}jJMZeyJ{n?MybBmu&GWx*766?|hyJf@6x^)GJJT^j_ zsEFNW)X$L$Zi+D4aU+k7C3>LJ#9=@5M#;wst7iZi03wKTj-_;#!(Sr-^(8NyAotpcd~HcnqzMP1hTtg#q4H>Gd&5wHu8B zR}3p~N3uYEZONT_4S$}gz+lvHU9vzy?INSVkzoY}4y!IFy9q*Z5XUK9Wj>k+K`*@D zq00%Jbmq2&M@74xSXgZKCvw}$Ywc8sm=nYwgQCnEQx&_6lsv{bgjK@5B6@Sm`g{rC zP$b@{DM{g{r0Pkgyf*dHdT!zJRMFE-a#EeaR&2iu!XL~;?W4TQ|3ufK0^8b6dMAwz z{c1)MILR)4=@V7IPt~BlTIr5D+wz8jL@SyalbMG(wAE@`sKpHpIFqWB(JEeLxPCy~ zeU78XX0^d&dW%fsMw&*PV$qh@K1x?8z9MawoUgzA>?Bc&NIHja)Cnd1I#NdU_ryhdMp*Kuk6rZ9yM=RL3 zsnnEPUB@Oi_RcT)qRU*azs1z|g-M)1;SR+?LKIaxb5<~^W70d5URQJ+sC&;DIuub^ z41{e{I0SI82CMUenThG{__$d%x0cJIk%T%^+-caAWF{L z{=IU$!K_VBRPdUP0_^RkGIxm%-_C4GJp8* z?Sr-sC>OhvsE1v$HL9~VvCVCKfzSLKh5pJePWK<7FtC8a;w42?3W5(O&kDnla33{8 ziNE@~2-bPU9v2=?mKiO3Xt{QU@lq@=tBsdQ^0LNwxn6a!)W28m{9`4C<*tr-87hOt z2uq5|KC28@fi<9?Y;%)QJY}ObQKg}DNpoNMJEU`cvLlZc?r1nuO5KFhf!Ai;-_ax& zNKD~_kyr7crBwX?;co3{+Mi7QMSAMFWa?kiQi)QU~Jy40erNoYPil&V0? zxDQ(6uU}(ZcT^<~!k-}m5mhH!k-PZ4$nHdX!XN1-e`E~&kpc2YMh{7+%0K+4I1kMu zZK6tBZ>xyaszbce4$nN(UXw}rp_&&)M>#!u+T!0s6d3v*d1kiMjHF{}C9O)*5QB2s z)T@9b^*Td;3RiACe|Ws7fBc=5&7NXs<8cJq4v&rB8q}KQVNbaTSTZhIovjrSWB70^FJdkH>LC>;;HZSOP5%JE4+xd!MWm#;h9^uFT z$`Kki*S-ju6VPenW8XL^bk1I$N{gK*MTaW~^6`S$6H=o4LRyKpk|lnuY;y|}a>VJP z@p%cYIH7GyXd6`p@8cMe)V$=x4CUl2`{&Y#XS+UyCQ3${d^D`T{{!z~&$7V7Q&^TRVHT$I;@XKBK-NPxOinh4aFLp8E8Aw88Fu~2F|z$5`qn&xyaSh=Fp zGhNMFVnMh|HSBCWMiGd!bC<*HJ{st?-udRqyMvXcS(VG^NaeDy*Adw+|eM#5@edW@I)$MUK^kj7-JM@nOB|VOy6H{~XIX6%mXmcgJ)Ag}Cn=A9~m{v`g=_9CXj-4 z`}2Mf>){e+xFE1kb~HeLr24ol@bC(?sKVYA`YP%4JwY@s{8S3U=#*qNI287*0IuOZ z8HKc!@MXLPxb}o|8rU$IO%q-h0EU-lW;+i$%@~SitEb)`{${ZOUR2gsJp);El9V2I*IsWHhl<>uap%If_|dA^SKD6dNy6Y z``bN}?nt*(6YrcedcbK7v_th^-M^}=scEhMnXpKgZ~XycA92z#1S~frOaV(K=6~9y zdy-w6p4O#^>e6>^9swoe9Sz;CpS_7gMsm@2^x{_&=v4*%qV zPlMqTb=h^<={@}u4W(fC{}16l{xf|^A>2br*j^st?nvuy;(qR{3Ko9M5JTRFSUb(0 z$&FFp7=39iO=y!99j1t15!wHBvX^oZImwl3W^<$(~mH?VkRcA|P_Y16|q} z_Lj_Q7INTx>MtB%3vcC`0ZN58P%2b%i9PJu6eu=D=Dqs8uwBcZwdmExCq~YVXUW6* zjDWgU!;0wQ@2TpaIKV0B>2n^;73wHd&gl8FSW|n7>a|=gM#FK$< zEQO0WpZX9EH0YTZ^30p*xy!j_5Ap<(Sl}16%IK!yj1P%b#M;y@LM(71jcO->5Wpp- zb80u?E7ErmTcdK8d8Q~qMI%g5Ib&zBwM~Xzh)nw7TNe}M`ex|RXNif_gf}$Kl-He6 zVZe$CWpj)-0VQB+x9Mu10m!t799JvFUhPt(QTCKn_HQ(&v=wM<22vWEBmP%kp;Aa| zu4#Q40!MDRu?ZK8oSVP3BodJZm(YdS9m<*}k8KN%FW-WAtFDmYQxkt&gmoS&g13)#0vdaH|RczCKIb?TW8P1k+yz(aF2=^2ImuEERyt6qt&)ytbe1$vf(N+?Q$2)$nXcswm`~57Smz92RR-5m- zmrW>6aXII^;$_RA{-pHb)^$;_olT%xPnyX4_e_}p%(32mz~_=S@tzgqHg_?JgTdmOo4;!DN!I08>JKH|a=k{S*qo=qesM9;UE`bI_3;~rMNW)Se*Z4^05 zQp3Rn63c`(Fg7oIM2~0T-!tvE_#DTpmoDU;%r`#76$~GaR;luJK3^lZPG}3CmHUF+ zA3~YgD)(jk0`JbrJzJF=Gb65!onow57yz_Y!JT1&7-Ea75+Miv3@Xb6 zzno>-V4HR{Zuyxxv@q9la4>4&G)00IsOj_XnX0hIH@U>}#66n%I8M48Saq~+9_x$S4>;wAPCcGa$B+R@Nlhh;8$^HhVDwm~*;Mx)o! z=olKkQWeVzEwtNkB(vT&c))^XWU>{35Kx9*6PNn>kMI(-SA`&0zFb4!?B$AhzD|!S zer|5Qrg(+fg6+!sT>r)#(}t|#W!W1n*qxPS;GHZdRGKTpC*X-1y`{aG-KE}{2Yk2E zo2eZZOMEh0HZE}H>3#}Bb8{_oaqymRBLV{Wqr=NyVy2&6&1QXVq&j%Zuns<`O_v^~ zx~DqlmCk)xb#A%p9J(pA?F$_tm*t@4&;xNULgj_Z9G0>ia`5KXY&U#eB%#oC-7qNl z^#11S{T(!i##n#te_8M6M$89@P9iKN?90rF{`a`1^Z4uf$o51=huIci-crf+Ig-jb zu6kKqR?q5RRZo6~G*HzBpO*i{L%6y`z!<-o}7#f!~>Tglr^nAG?JXFz; zC*Nc@D0K=jdBgjBn;JC!Wc**r<)p!9V|qBpt#k~UlI|gONRwAArx5NAoHc!xSpiF! zaUD%eIhX5(J>-{em@Jpf&DX}JgY7}>#-Tpg%^~}SO#fH1Wmf5l|0@oY57IkmLW}x8 zYEw;>2p35-t=2Gi_Cg3Gh@)El^~QbgpP8-E=BtahPmw4fg0l{Vvv&VR7OgBEu$AS~ zoR!2;-*ixPN=KF@K1o+`J3vkyT%f3BE|D|xDL;gz3PV@vV8AyB%SChOp=xRZFRMkQ ze0`uWH@ZZ)KQo_aN{`r6=B;;4J6c?xvmv9nJZpXC&&+YvEr)cAi%S4T*7vZMuhQ`@ zeQf{?wqNKaUDqPCVT;wT-p25jln_)xaJSqUK|zV(Q@G{WU5bf=V}UH=katQ|YAXCF3Z&23_VcS~qURBS*@p;pNMh`#zVPc&#X`<%ct| zDlYoVvmf=3_=_{&6wC}~6}>*=Tw=uQGi;{bA21v#G?GFMJr9M?_BR}ODA#2Qjug4z zOGD%1uDzf%$8&*bruY_fHuQ9JY&g{^Cw5np=sp)3(7+rhn0wQ&3~4wbfBlV zfP_r9nTeQc4vz|F;vv)B7U(W^%Wm)L=*diBz^%f74-*cN?5rYFG3Svd6IoPGp&%FZ zWfABTcFg~Zc!IQO$hH44M~y8Y{y`?S1zIzhJGWWi*dP@dnC}^ntS-ZOUhlr zr{T^rzDExC-h2d%J>iy0E?2F8jNcBMln z0nT09rwN@#t+n>R71kp)VMk?itUFN?#QUqxGQ}HDk{$W?jM1s~b)*dmNSiD;x)a8u zL?NQZVe_*4_Ha)4!PLPyai3(kXs-GPvITcYE^Q|3`XY$3-D^v(K0{HnMZWodpHgab{fU+`Y z(?a@Fo1dEBidY$KI(LVKupx62@GVz+)VV7x*VBm3QUENXJ=Yc?*Jb5)`S;v0Lx`L< zg*};bSLq`-a24p4m91@cTDfL#^X%v)=!!%d<*u|lTEt9S-Cc3?Z;8a@j~mc7PByci z*k1EY&*V1rh~K}LY{X>C?UF(!i+`U~Y~R4@t5l^cr8M=J&`?l>VK{dM)FnE<|8#eP zilnELr#5QGob|^6oY2ckT}8Vqbr*?(3+-lShSO z|BRCgwathMIk~c-WiQ43Kc8|G*LN*#JQw&z4r1Uy zKj!5L_ycsu>h{_vbWQcz<5x4KdHSqk;ha?wb6+V(F=ORx>EeX0h7V1L`EU#=43lft z4N>I>@>6U0AWzl6vK=;~;h(9c)GOZnQ!v^Nj9%`hw}_!xU~0B24%Ne~GG8d8eZs-1 zX%Lb-3^jpQ1VVu4D&BPPfb!aazS69(6Kf0byp#r>mp%cW;{qOg_=5?5ZWw%?=O;#o zKM1_n9q3r?Ce8gpa7x^kdywd*Q^K!9iv1s6=L|eUxyWLxTN2!_2kpIbr*>%e#JfSV zZ`zZ|Y5SXVmYbZjBk_fZLafaXT1+x&eGP*qsPz;1;SXff0@OPMx#(XX{hJoQR<|b_ zK6e|gP>^RKA5bPTM#R-z?FN1CqGT3{nJ!2i@|UrSkoz4-dQ#lcQEK)ptC|aQS1TW) z>zunA419Dz>Ijk+b_Grj1P(d~20PBV>&o3M5%EqfS-vb1-XXzF8Rt~itO_rd8^#hN zC@VtCaqf0__b}se_BRgiDW0M|F6%+}LE&WyVR?4d{!z#wp-AZXvI zyrd~5#a`Q8DMD2pyYi>da;{|U#|pr|&q9lY%~GCWv8Bg*u?olFQ;t7R$cA-nJVyvf zuRPzRNSm@AsE+keks|trtez5jt{weRV&93m94`)0{_p-oc6VD9VPa4#fT`?oW#yq) zb4Sn5U+wZ0e3Djc(vgpaBa0VFo(B>`*MCV(FqlD= zZY<#P*n#jz^n7x1kB_A41^N;SQg#g$`o>u#+UhW7+#i#sM@6?Dv0jX9zr7j%yO_G= zKa!9eIo97ecij)at{=Ph_-O0zt?igfCSIJ9Stf<13j3n0@G01j?Ctr}-$;r{5KMh8x3v9cz87=C9#H11dsc-J}W z_fK5Mz2iE|sv^-BO!_c-8viiv4n;cM9YM&Sj8SkH4gW%J2K+MdZwA7R$q{GipG@FVz zQR^=?8%nbXT}te_RT8-!Z6t0~i8CbenN;FKDp4d~yvrv`E+#QeX;xdCVwEBtUCS{n zm|we5PfZ!YSXFvH8nd8T;Y8p}o*d+-8wD(IiqYsf;&>}uY1dIjpEDF}*64-#t3d`E zg0Zl07#g}%pToI(%j?i1e8v$paLYd-Z({JI``y?*;Vfll~TPUuVwY;Ev6?jT6Rt`o4$pM!=sP1x;|qvU6>wO22H8W z(}#xhH!7d>BN;C|)SpPaoM6T{RP4lP!AkJH)JkmOvk7g{o-w)jHF#P=_7sWKBUVE_ zd^0HVx%wHElC#7DeKf;ecV!sqfNC>LeyFW_HiJUR_G!GG#%l}p?(q8E|KI@6in=n; zWtE-IW?r=2R#lw@Uws8D2wwc;UgI4dtLn3j@v#JS(^6& z9=o>0d?p`n#ufaL7TOnopx3njmiOc7ds<2 zE;@A7_}X;%Q{ZG)_#i&3)xc#7#S$ zE9TMnudT~kHsNqh@E;$N!Bjd(QLhinE4wn6di$dBmOtSzcQMuB`nYKKb-64lqx;lA zEMzhKdPKoDuhy0t*PZ{aW=(=KGDi|n5Q@%4RYp)`XQp!xvbc9`5$4Olli=~Olk$%h zIRlZzZ|4Cd!Iu#izGMh+W;b6wEnyu+7$*rq*WD!(CKK(5m2v{bgvb?I%5hDO0f7;L z?m42K=I($)TrP1$+S(1f<9?D_4;Brzg+%~vR{;0V$XO>6#y(;4ep7g>MB&8SitpN{ z1H|Iot736#BSrjZ?O2eB^@Kw<2>0Ss{CW{g=HNEmtI$X|y{yZxv*mz{rUB?S02JP$ zD&9X)#YYZM9Yi@*|N5j}hVRdQUty*Jv5@~!Km*)L#;wl`cpc;7$P2C5Aq2X|P1W&N z47a4=F*J<8fk~RY{^q~__TKcE|YxW6R$w44^juhM;zSTym)!zc4%${uH*i%&#& zBB_SX6wPVgpBOQx852Vz^J1wM9ZcYh0S`_K)y0 z>|`A`P{+RFp_T@|C+vbdfK&W49HNAp6VD8EcVT-|G-q418%h#QeftO6z#B-H z`83H>b_HJmUP!F!1ViLi4B!g=dzD`M%Pj4t$kbWMS$><+x-V zFp{kp-hotYyt{F)sb;$>)~{;7L~g3w3^bMGY`~Y6qv&2{p8z@W>r3#??%0r1^q5Lm z9Ul?sepW$1tR5XnFkHh>ggOq5#;&L6&}`?7T2Nkp`yovN+kJKZfEYN*Eqj0pJ^>KLNtRw4ll+4Q_ryUJIfE{$VFoz zm_>^qYYD4G^uvcC27EB<;5t{N46y2eAjus~j$oOBTb@WD%&%|!K1*w=cb}nm%1Tu4 z|1GL$q5d*o4aTANL5OUDGm9|X<4}{uETjStj3QIGkG8blelGjMd2Zhx-z&mK#{O)= zvOfDWDBpTZ_?_Zsf382h9`l@ z|(_(K9SjeVe3@haLweAj_R114<54csuu)-qKst487#Ynp#rrr&4XFRo&b@D5)C<>AQcz zK@k{pL^3>6)E%HI7@>ebZcb|%z|mJIUY2tvv=QUzhRPFRnA(Y1ho3+ll%RODn{O#< zj8iq8O(UtM_1;{k+HJ*+p}U=F7;ADH{nfL_8Qr4ubc#x#$JDIk0wl?3cSb|cxJ`ZN zc`-6w2`{3C%-JO>k

Kd4=Ojvb5~bTmrh_-QO|T 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

1_Lb(($W7*U==%3@<};T@<91n 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

buBgOF%g)U)VK1|IXRCt^ahYQOVAk4|3WLsXsG4 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

kHMZ&Z+zSx7 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 z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ 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 z 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 z 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

M0LXS{?l<&~R|1f+oslpjAzEyYR+ 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𝔶W^w4tzUr%7I*LKE9-XYpv)&B6&;}$ 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

n4hz?lxw&=2dxmY2a}sI+(0S2~jop9M8NYVs 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 nND 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 AglR|LDO@_iC>Kw)DOehQ`60v-!S;0?67mOu> zH|45}rJJdne#hR*dFfmx*SmFsx2CKs?$Bz6orJO~;xGKvzP=SC0$4_mlrZ|nM8Rt1= zPn^zQ>ab#zEMAT~9JfO4d=L**C!FvJ^|?$Ilc;woBe5n4h|J&4viKd61cb|?f#DzE zTspPAnz=I&&$n?ZpidrmG|-d>f6|Hx6tY$tEiAPn=Wt86xXHx6>Jne_-dj_+-J%N3 z&r%VGf<*KDhkSbjiNsZqus2gN%SlbhM^Tr=lJ16oR3U~*z2|ZghTmbjBw^2c5==Q* zXU-GeqFCpoipLBo!V*zErZd*h88d9n{g9fPPo(^5Pzj;@Lz;*!N>soN=gcRJJS;Rs z=}WcDom(E#$>0&Ean2&TgV-y!8M(R)7=BhJr7f4Fq4>=bg47{tiV)Tj6Az}ODIRa! zOnz#gkEIKMa0X720V|ewsT02?QHRa1I)goFlgM%yp1IUTuAk7@m?tE?03iX~fxC3z z3eqFkp5Qh_0i2pb!H3L%!lXbF4X}{KPBa<9a+ON0V4Shaz)HiFx>_!B$!vnGf|fo( z?DP165Lj|%K6VzJI&%e?lW6j+sW&f_Ad@PwP!4$&wJBI*UUo1zb3dg?x9)|#0%=Pj zk&V`pAkwd)0&5yVFzId0SeqI*m)JCRlMStTeg=vmAvSYRg(9;EwWQTY{QQ`B4|<#~ zSvn5{*9KffiJK&@lYDIVxCRfM&e4Q8^T}|Qr>{3C0gfb$9nli`!c}g--(__Io}Pfm z=>~e$*M(49%PQQ0QewK`6;W=({{*Ca=eH=8^8$!y~3k zMojN(RU*ni()c;r5GP5+*e&Ats^>i4x~HMlgkZre!F$fb5QyiZkV32#M+AqTXlVwg zfEAtAg^EJ6GE%}P8kv0+FK}Z2vD+V|Tad;j z^Ab~?VE&4D#(BuJQe)wVJ99>4I1u~$Mb-r3o@$qk8=fvYu1Y>UJxF8;q;p#0bV#b% z;-p=&&R@U)zLdClv}L}uWS_E-3RNnm@Q2%4kTrTDYwT&14*QX0G@^1ae0dR&Kba{A z6qs-zn}^D#!`f5e7cH4?Qu5GW-b{Si&qR8Maa{GDXbzvL8z`1If7QkE=sQd-xH##b z444)^0pGvi62UlczTjgV2q*CsTxMgP_`QH3%=5QbC=EkmD=p%+;z=f*aX4~74*tAw zkG*M*2Yez{J-FjYCbYqwnKUdTwLxVF9SUj?BJv5nXsEf}%rq+IU%%Nz?m}Z`K}O>` zyQf^N%)sM2LX{ICx0x<48S}UW$e(SFz{N_}L*y2568C^Ak>q=Ur=CgXHZ z`hb})YOL5y=ze!+eGqO`P6*{DPLoy`g7&4`g{)g?O}XoS1N{;{Pq~SB64ktkKr(lUHxZr62g?>^L}ytv_eKSC;(Ti7g)!R5xk*t)EQgnHr>5H6_nz`1{EaoyP-1 zadp&{CS+u=b-|sD%F+^}-nNT|%bd4w5@E+bU19>&0(OJU#M?L@jATj^6`jh4a)Dqi zRCab?luFnLl#B8b+o`+5hsGX9*C%|bKh#v;Hc|(=R1!L!FrtVp?Kr6>ksf>P8{5;QCP?i?w1PKra|Fq-llqWIn84S- zM)%tZ`sOrFB!4CyDvi$?^JE-FWZ9#$;G*rV zbhj3-vGH9HWR^nV@nR0PY6qiwXSL5JpFNi77%&@Rv0>B2ml%vd^>fcpvQn`8X(DNLeo#O4|0+ z#0#6KDFOG)3G<%vO-urs=23I9d8P16Ee4PtS53-&NkRJ2&;eSoGl9U*z-T7n!P(im zq2du18E<<^|79?xDv>g6f#}vVv*QSlJBMY^lqIsXLkeOiydL2cPapBDSOOXHViOq( ztS!`Ln`UU3YJyfF>9^r!oEDISh^A>_ zTS3|sn-lKEEug8qndX~v-nG1Y(!_k(4kr70dhYQE-#W(%yYQd4n z%d0yn0$=B6>^#mE(MV5h?^_GL)$($VvjFjhSjt_yh`=wl;C>AByeubBKHig@w+Nqz zE6W7V6^KJx8A8TE0Hj(mjYA}nUw|ZcU}sbTg(lD;gMnCdkfDu9brsACh&M?bk(!PH z&f~31q&blIxz!$!v`h_enUpE6|OVDFUW3s>et^?!s0_1!+eDo~NNGb5ly*kJ1%r zD<#i4e&mKh8(qp9$nKKN4Y;Y$!E;X7d;G8Tm8a%#EXb@u%CS+mJNY_3j0$B0r7SPv ziQ8+7j_|aj86PM%KkOH<>g>i!tN=K2NpxCYD)D2ata7Cw`IJ zMAFLq=z+4i)w5!DoC$`bJ zT{qyjpA%h@Zm<{C?96p2mZ)(TvkIN^q^)vnFD;p#GvDk{ur-6MQzA*;SWDe8GvszP zr2mln=Y7)~{)eS{#ATnv#WUktBM)xdD6W(glG}^aR61|)Zo8#M$BUdsHd8;-@_e!~ z2>B$B*rg7njb)D8Q;sW34Ctlk%a>E~sT;KAN-3q|>aLuQz)?XXqNT6RoLs)4TymR| zX9mpaykg^a(!sR6(;qO8$t1B7BT;0`t^aWJ`s0s&?&scj_gw>I;Wr*!*y;V?++1Pd z>vK!x{hyiL_tf0)o#X%0gZ>ZaK7Q{Zf6KSNwfl^tUwP}E=Du!@R-XOU&0l@%Rl9G! zY-Gz1Hf`AW!iHJS_Vs@Dw)8tM%-8<>p$D&iZ0jd}_f7xibH84D=!L6K|I+jedyB2h z58N|;(_@eAzxuJidc!yV>hKRA{=w0I+;^9p=sfouU1tyT0qBID^zaSE+NGu1d*1Pm zz11r=eXRJ#9Z9i~+KuAQz-_xJZ7UtajLV)2E6 zS2g5)j)#WQky>lwQ}>$EzTSb`-}2~an)FY`?{R=-$_w zy|c%~&8EzS3pxMeq(w^&+IZh%#SN!y-14CxEM9rbn~wa|?z7K6`>MZw{V$xeWnEf0 zX~W%TZ`n|cPdH)Y#*Kq=Y0(Sc-SUH@?>OPVe*WKm@9MW~x$3k3`6FLGy8A6R-*VSy zw>*{}zi}fvN$4n|-S0m4tv`R`yWTj^yKaCqkDG5e=kJ|+yt%OS_|iiECp|jZ`$*xD zWX}_{lS5y4*X1|9Yx`Sw?C$RF*S>4V#@&01yKnvVGah?%_v95{-LPlQH|J<$>5)I% zTlV%MVpf7})=oeUESp+TJ@iTsyOS zOYyBcuYc&qca6Mx`{r{#bmyqK^Pc|Dclpp)6Ztspx98&GCqDhy$)(=G%fIr%=LTnP z-TII37}-gn$lA+Z zPXB(=6i3hMBahK}eO;XOrDH?iv(hQXm)7gOfq!qgTc$JhnJUIi-jXXs$m$TN92ey9g7)CEPX*x%HpC>EOQ>68RazG zHi%9*bME<<*2&9Hm6!sHhuS)6rx!w2n}s9c-0Pr|zJv8$l;+~%!M;<*#zwbtARd_v zFv06QNuyAB+ zUtgc*7JW&%u76!FUCiz;ekf&pTyRiPoe#^&ZmN@IPNxhyIRqR&ywJlzJ(0GPtbZNj z%tUl@!}^tK1)oD4E?ljST~&B^dOGMtxR={ywDpM8!R4Z~lO&SY070cBF8Jy5cdgOM z*7J9f%<~+G*lvqLxdOcpf3!!bENuKXu6($`gJF=iue0nPlt0W zN4GxroSX)|Ygcg^ojiN+V6{q~NK($z`>oFlPXW0Yj(We)sS`QJQgkAHm*^z)U57Y{ zk9GsKOtz^)jlkjcoIWi&K@4+4yS(VTIPq_+v1^z1UD_fjZ}JdeD+iQQ_WIQ8q=bz1wb z;xv8Nvj=;tRq4Cde_r%|=R-mxFkwdJ>Y=LGim+5!?nu?|Ysa#cNQ|L3sIyTXL`M^x zdpyYWZyS?A8GOri9&D|gugntw;oCqVpV=^B7TW2N%BB~kuV+Oo=dzl_$4;&>;XG#e z$%_FVHI?r~pi%RR+%0E77whTcobCKyz)c9P*vKF@5bO*u=UCsX^zhcagfxZ-gg@G*Hjp$+iz_N`cNdx|rh zx$mp&B#!RRkg-q3EFA-}RW~AAErGZ5R|>uG*1Uu?D&Z_>$_74yCte1g$hdN7OzzE?GjohR;mq6W{MM}_BlUXW?J~T`ne@^(uE5w- zy)L-ksjh||o-9G5R2g~kXN`1PKM`;utoC!vRL+tJoYkA(!;r;aH_>J!ePsBfPq=RX zb=O_Df5!)}yH3X4jAm4AJ$JQKYEx$&X!%slh0Z!jNzcA*^X_nTJ%8C{#$0w8J;2f_ z!a1q$>YJipDo{JkSyQGr3e=0)Tmf`^fA3hsr6bJPdZSO(dkfXxsjBw)#c3IXBto46 zQl)h01kI>UdV3d{0dr0)IvE=aI&tM5DNrDsd0U-lnefP=Lxr~^eebb#BAsdP)bkC- zr`7#CI+5u`6)9dCq^~vR$Pu~80$A?UNf><;Z%R9ZEj0O`jIH~x+rNMRbsyZZfB&&{ zLh0o6hvi)0v9a>0GVf=qDyKvL2%V_5D94}^Z~i~Z-UiOHqP+93bMCo!PTy&!Z#O+{ zGcZH-rJcEqb}Q1es=*xWsi0F|0!f&Qv!SxD1GmL85M!Z4neF zMsP!1R}8j_#+cC|#<=@W7R3FyyZN|TodgkAk^X;wRp)m13~0>Lee30^r=EJMo_agy z)N{`0S-jPp<*1{R(P>_Z3`{S@eOFKE;K4N?86Dky(M50T9&^8X{`dFxl=t>b(`qQM zUhn8cFDVWXADpZjCtB$xp>!e{b)9l(lxrH462?hrqe3T(<=}3q3&f?&u;n{iDaf`OmUR-&rBs)AcQU|cCBO=0^2f{JP8%=j-RW_h z6guggqX^^V;F9|0icWf#jElAE1g%y?ZzJlyq$u z#$8|?omD!CsHfr<=^=#dzcrG6X`_ni5@kj zDb&h{aGq{39=_p0nVq?-*;|j}fDW@tDh0#dh`B53r1*|X)QS3W2aZ3j6I$-~OL{YN z94E!xb(BsF^NcZLV;y?N1tX)Ur*<;?E_0A?nTWr7rTo?f+T=Gw&qf@_g!fP~ll^<$0AF7Y8%v~kTg{&;xx=cI8aql#>L}X)U zwTxw?3Zl>LMT<^CJkoLGZ-^)(FWu_o*HS!_WT$n~t4>080)_}yEqQ#{{doA{-RwphI2Umg6!;=w1{HL~(qFVDcX;k&yg%a8uf;YpmRFRi_<<(*L(P#_#xu4Rw?c zB*<=&ZP}jj@+hOZ5WMPC&;|QPWjIjO<)h^Hq^q9)955oX6`B^oTUMeWM4kN#$`W)8 zI{7V=t-}K>zYZHm$Pqsld_V*$-=WQ%xQL_d$#nl7d5q`BbO_eEVM3{k3>`uCl}*#_ zjljxDJG{(9h(qf^({9@$4mnjNZHfgkxR=RV$B-jn;A3=@P-J#RfJmxy z#6>82MYPCPq`laiFfJfV)JgxHf{c0XsxYa5~aAs$A*y7tvQ9~CX~c~C1AP98_G=kLw=fi0VOCLWlo)1BucM-k~&wU zl~~jC%#Jj;k;9oLNwFTpwcrX;#~*%Q@H*dTx2ef{3=c@owX;F!wJ-|wA8M}NYQE8puO1_uMqrCG+@xqpZ zbw5B+#C#`G#MK5v{CFl8E+xHjfnt@j{%&KuE`F(^u}V;;6-a7+SsJHnB%sp};SxQc z4{??F9wl~)U_xSO{Tzr*7L|qwwEcV-jT{^axx^Pt0k#vsU$vI62(v03ovRXdHA=NS z8jg)a9|X=iWF7J43#kltx$>RVLT1tmj8oZag?5mj(^x`wXo{wx1&Tbe%vPi^CoP}h z))R0aTU1;l8TOb2bgl*n0)>!Seo`f_paMlqvXNSD{4;kaR@tKj5grrhLccq)PEiltIXDTe8#G3OE&RI z%#g(c6jPU6<}ak_tzQ+ysw=`Fu#nO4j!;MePDKkheF8W!1 z%v~%h^0V;Xk<^i9=ZrZsRGpaapa30F3W<2y=#1gt>q-aSz2& z+Msu8_C>WMShk}UiS#YqozU#q41tfk81O^nWP01e@k zqt~X3c>SgZH(WCnt_RA5pdLpyj@FHcmCjJF25%O?NqP#51m=Tc8K5>HZy4?3>Bp=& zml`wxDSlHZX5$H+T(}!cRL%ItdeC9fnBuNq5@J3Z@-tJiPZ(dY#<5f9DJt;F|Idd=Bero2tMaV0nMYzs!Odl#o zHl$+!NzGhy`PAHRh8(P_lMJNLtxXD>ArILE65x@=2d^m?m{BVQM%Qq(n0bX5H;H_+ zmF1O|srd<2`Q>P52YSrt5MHmnP2PeL#FU?#BAQ*5<(MNT+OBZu*C8xtg{YpiWxVGO zu0dE5N>LD=+Rl0^Pdm|EvR(O(4Z-S^bTUO~AMcd7Z?*C^9 z1uOOiv}MR3!Hi||AH<;s41|z?1In8@#XWfr%yDlTtmkX&vkYr*$R(>T281OYngHI4 zL2i{>i4>HSy#jDTuaXu}QkYu^&?I1Ge`>NUq>?wu?QvP0ZcQFHLSfI9W6~KRlUxzV z+5J_?1}suZ35_d^#U7nKmm(27WvSYl9irS4N##;`GB)ij3D$x@PsX+sI0~Tk{0B{% zc6tv@n`U)0l9Hc8Xr{&7;bvP_N=x5^N9!E#ISA_r8hwZJ1T(}+pfXhyp69m=v{(ZH zf^N_q_=_Z}|2)UpeLJ>EX^+={%jYPws=9Kr$+NiR-W;4&r^y?XcpIsxNu?wn793de zoDv3Xwa(HawuJ=3S(Mj>RI&2#@}?dd0m61WyRZ$bN!w-GERRhxv@O+j)+`_k|6n9Z z@D(;|PY9I@;UY9ggs~k^mfjT}6(QGR7G@w9`aQzZ0C9jq={Q6iYS1jQrNNi03QUTf zpM%P{38*uvH|?^hIWet8DzgF8l7@ZU)Lqn>)7(#1NNK$pD9s#`8Wo>|<)VsKOzc$v z{HAD8sdEKF!b;SUrATIkQ4T{BCI!`jLE}?b%j+6L!m;Gxl1KV!*0la6=H)?0!sVP& z3yCJ2%TPFI4fBW8I1#MRXt_3290fnF8#7RC7`h$fdy3>_y&Ghd_ZyXBtRK!auC0nb zaRj|vRt2wST8peAL5dK{XF|9s7ims|hFW!*s<&n;=|}faa=eu8)}Q&J2B^T1dncLt z%nq<>IKUNt47+^2W*xru?kWpB8x*z%E3D&KDr+Oo=DYecXCJm18QBnkWLb3mWmC15 zVrQh2#0A!t%z}0f%hWtb5>Ii7E?C11P@VH_o7N#{)WZyxrK#b9bi#AlIp@J^Tyf{# z(y@8hO0oa~PW+{YEyKJqr}}P{lu`%Vb}Cw6xz`iuu=Md>86ZN)DrN0lFwV6(fmlU< zBJNsjFX$rf0Bec(=b}zHtRL+#Br@R8!rzFo0KM4Y%i%_2TD=KbIG=+Yzi^J=4V^p(N4xaXfHH%>zTIbnR7nB zBE^}b+I4l}xl7@$i$^SAn_n8N+`8=Gq(#8kT{)F*cs~Q)Bh^m=|+ni`BRG3n1 zUUC$bhIr^7l-5C{cO{Z3T{O<$KF3)=t~S&P{ASvQ=cTp#e43};s%Gs}TY#$X!q+U3 znqJ~)^TBr2UX`1*9^*ul^rmp3i`$!gn82roh#KQ+bGWmZ#!$ob6!SFH###C=Q!7lP=5uD@KGJ-iI;&6k(^fGmd@v@ouO#&~FX!BB8GuXO#D%aYteKx|{&ZNT?7D`{X1m}HF5Jz|D>EminZ1)< zhqV$sX#}r+Bgy#J>XrCYENk<;?q%9?Z|y@LoTcD;;?FICk(lS3ewu`>hh}VZ+|>bH zIF?KVGyQ@{1O%{Pw5zB@-OzzpTmYYOsbfrwkVayiESiH9x1Ln-;gEGuk2U7Pn)ecT z(0q(FenH(FW!#t65bb}kP~@I{uWuNGZx&#lzK??25G_#cg|&?jlX9P@75UL2C`&D1 zAqtR@h2D#Rg1BaBvj!HR!i)yfB&Fi00&%r5enxXsrWMlkM3+OYEdDF}6Tk_l(>(~Z^Tvuafvkt(e*GZ5$NOy7*n z5#3;yXFi~QcU7v?p!gZ&l~G1_WaV_koN53WvqMorm!rF~Qe6~BSx8oP^#%b3X~CC+ ziL-Hr(n{J%r;8Nlt)ZW?q-RjZre5<2(XIwZM2sictW&fa!V=B;G7CTH!T9-vpdGaN)J+;0>)SwM5KKuC*1ozE>iAQ}S%q=z0)DjcU^4P8 zY2bufB_Vr0QFN0j)_SN+>X4MioFhEqlpROlqN6!4fSogo$V9InvT1j~1h=1F_V zWNmn}|D}6ncX)d`^Sc>5%_QAnqA~L(SvcFgX9R55%}7kg(!6Bbs#YnhS;FKkpkqf^ zL<`Z0EgWQ`?ao|YH#N(moF8C0wa&EXNVA#NB>0&ATJbzFPcgls>P0Q8;Q>Y7g^+4C ztqP7YMvLIns4e1tR-t0jge=bQ_yDDNvL&9dG6ir19SJK9!&K0Lt}UI=vfrkegE|nF zYEx9&Nef~Io1OyWmi1=3BFYvi%XwDHiYW+F6Hc7fQ54>qjt7~+I-()XDv(L+h*K2s z{HRgQGhq|x6E4E?GU-G7F7H*(*bKd>?}(>I8-I%5uD~#qD2eqVc6F4V+U_jQKVKgZJLdrr!8j#eqV61v`+%0Ba#v65L<$DVt>3`g(1H8pbMtLOpR{ zr6X@RDm|eeN$sq_L#9+s@6hc@8nQ9V10j@~?S;%X{^i49qJP#!l#l(DhHmHsT zsL2tV*@!{wcq;%ARiW&i;i8%fWhUDoq7Hz7AYC6Tm))hO?iI4NvTS7VJ?8D#P7azU z?%r|fmnJLu>j!fC_|ASaxeMF-{A}sORnrHX+%@0Xe^T|5%uQL(tyV$*;L}J;7jm5R z^bfL*9%51UxB2vmGpn zj0K8!*Bsp1`cQuUaa|w2`gr>aIK0d@Ygc`4s+u-7j@+MIS4|)9YBc>PYyJJlXXfTt zR5`L;XZ+=+PmHSVg{;=c;>5?G#_wa|Z#5VdwQ^?eNS{W`#@&s?P}S?R+DS>BIW1N7 zgE~UHT+>qj%@fl$H!}h`AoKFn!rp(k-J3SDgejcV*^+XxamMZb4Vt>P_;s--wtH85AY0Q{<_8nS=?UC)%#$5kPgu8 zGBcF@uR~dFs-HVU9q@PFd3Ost!u5I3N%r3PyKhMY2T&WFTLc0 zZSzCTjPL%#PyJwUVB(i%^Y1ji{b_&j_M0C(G<(PVyWTZ>=hwgeuDd?^fB)v-U;Fm# z!t(9c?Sj_-Zz%q#xxxxcvfYd<{i zP1iqPdVcG=7uIguIrqXjn;yGtESFBUUb^{`owi;1Bxg~3tB-x^AKo+2J=oQrY<%uf zf3Vd0heJ2r_V5?q?LYqYZ{IQh;I?mk{O@>-`QSU(opj}8Tc?^CDxv=+w^V{ok{{pu z*qv+UZ%fv<)AtUv`;)(yPF{A~t#^I*z!?*bf!R|RTRxwiU2|MU9a7!UT%%?>3Z#>Y zdE%QlobV02KiY?pf;Y zKEip<(Szr3-F#@tFYNY8-M@qvfOG1=UKDfiU~ey0H$9^V%>$zcdk%7Z7wCEa``^#m z@Pj>v4o)9DI5HB?lEb684v*(PN6z3(sGv9(I&uc*j)4#dH@&1Yr8?IuBAqFI*;^HQ zX{Z-xmFFcLg*w9 z6?sy2h)b9jVmT$9U}vf`wxdf?Cs>$5EyKf@pLu|f01Xv{@#>wWUzmZed8mGpVYn8P$#uldzqJ+!p-ZS}o} zImN9UPabZXp2MN9hxxVl6aVy2Nz&7EO^TB9#JRPPBBal9;Fj>x=JS){T(DaHPy+tG!{d#9%E;yqpsG;m~pW z`SH@@j}u+$9^1W}a#n4>k5UOqow=){6UCQSbh7mP^W1V6>C9bbLF{0>T!Yo)r1!*C za~FMP)!Y?ya`51aPCDZxmLGKjSN#DaXNKb=S$BQRDjOgHFd!qm$-d&A-Y^vrcp7<=W}#6W)|wR+>H(#z}7pgIUd7VU+Ae zCu`OitXrx*k3U}DJBCg|9hY^oY{zK&+mZm=z2I}-uAd!heYL&e>i9TMV7OA+aaHjo zhInBMm^<-d&-ZE^Z8U5B!&&_jGt$o`){A@*irSddqJ3mx1NfV*!M9hN)h}Ju4mN?= zRl!D)IJSRW2JDaxqRsLzkzIG&XwUvP2R5smq!#MZFWEp(&?MRtnj*gA>L}yDDqdlq zpf<3DEhgmfu7!V3kZHkt#u2J|8xT@+5&

>k-5o|L5n_=_KYSSxF*_8 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

-qpN(Y-^(qa@xmaPWlWotmKFWul1$ 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 literal 0 HcmV?d00001 diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme new file mode 100644 index 0000000000000000000000000000000000000000..7be3d61ea2158de261c8ec568dfcb9f3eecea9d8 GIT binary patch literal 1105536 zcmb51d03Oz7O%gAhzUf*CYp=cb%Ko-y zCU464A|WkR{>ApRq>MQECYK%m*ks`&3zYgvg%WAFqlHAeHZnR?y3#dE;3|l-`0M{a z0TyCEp)7c%o9Vx@&|qPZbmd=vx>gzJy*#m&{kN`;Z8 zUrLt`NEH&k=cMoikLKlVx^pcbHQ@^aDt{jupIbB%~A z^4CvY(nzMy5dPO^{+|R2jhF#`-^2g)n@HX!W3Uv{KYwBO{`U_EWCTGd2$D7z2{Hcl z!?eGwp#SxePZn6GCEl?l{bhHt$!?Sh`1JYc|EG0EMEsxj#Qz_^$;QNfBCOI#xhOKq zXgq(?X#5O8qY<>Z#s8^gK_H<1>Y)Ei=)ag_C~lU~&j&%D8AG)?BPcNV-(LN1d;Y%~ zh?yGAq)Q|cY#xEhgen*%WkRGe-i=5t@nNB%6!Mpl1gp*?Ac#H2n*;`lXr_p6GLgt2 zFxjTR!62K7k>qOB8a0uG7MXqr6huk)eSux}h1IV|yJ63y=p zu^I<&B3-h@{ESFcUPe^1a}g2PQq!Z16j2=zG+pCA$RZ75!KTWPy0WBM;XWe25ck-` zaCjRrfBMIlpAws4%G)ry>R|ZHkHsR0PaOxRBO_DFLbMOq)L}366lXR;+CvI(j?)GY zfI*IrfYwA-sjGPMSpUF8aIYE>9bSYxJQkJVM-hcYg7uQUi6~br=5V)b9l4cmJ{t<6 z*2k0FZp@n0AqZB7n861z2|;@!T5l{%PFEAIqiJBlXd;2sNV>wPFT?gA=n620m~HQZlRHd7DKG13@cjIw)vF=wX$G_PO41 z%Zl&|_?}P>p|i|gQ66;f_4ET0%r+%>Y8#PrQO7A`LS_`24i=kDAT(Dik z2tq`Bs8Pgf57#Lgp`JzogM0mw;+3l~L^BduiKsGLp&$y=%FaE7a!1UPat|ZmaYH!d zup@I(-yquUV|yDBY&ld9QI1wA*~~~Kk44T!{7k_SxIeweAICYA55Lo9H3abCvxQ@i z#df4BXe4YgBQ{&vVP+o3VhF3DmLh7BKUt3iIQrwf z5d?`-g28eG?aD?))$wTRF+Y+Y94w^Hp9n{Aq#(SPkRAE}9LAtHsHFs)D9x9OqS6sG z9&D+9EG?IeA?3Rk9+oy^)+d6&PUe6;fn|yE>JD8pO|8&FK~%n3U|+j}VL?|DV`CHH z-pz=p)j=p9b%$$>jjRMJhmZpa{^VdH!M|8?m`*HjgMz4yCMRQZF(ONE3^5-{A+G4f z>~!U<^xRY<0A1KH^WM;&qJ(2fP*{I*d26 zR;|d+l`-7t3LJQ@AzB~8a|EL$3-Ku&)o0!!Xd6*!BWgNkc`h**!Kjj<6cT6N78|G< zkrM`o?Ga~24H(o0mQi$v^Dumsbj*#`_@BH4B)qtW@gBrHBoIw;3}y`R)_@fe^bv0? zy@HO(beMEfsKG86VNTm)dI*eDqUs6@t>t(eGM-i>R}@PWr}>U6Li|JGGH z8M0DMeh%-KNl*W*1GnR&RkV@e)o6cs=qp4D?cGv3MoGPt$*x>@B#QWbgU~e^Zy${h zqC`;zP0)TpqPbX>1H)fSD{B%{Ui9d|py4Do(_{1mx3ShQ^m2DP+>;&@jk}W;TH^f- z?Zr_KRViS_(c{%Y2ZH)8Jz-S47&dxcQ!aFf^^f5T71{kc&Q!}s?@i7!#7PGbu}qyJ25-ahO(QOI&c?ks$$Cu22ZBA zb!NAud5h>Ue6#!zHz4cC#OM%2+F6d+fm1mMnmeL7BSNta@nOUu=8C@ojw~U4=+0}r zl;JC!tGT=r+{TZy3~7$1B;aXz_5sn7_j|b zo>tw2=2O6)5#dwqN!nb*wAdh+SadhMSD#5#sp`V!VP|ci|IQW-JaSJ|i(8wuw2{F= zWt8}{JUAGYwFFy(H;{XIc4S@eDMxVUBrptT)Zx8u0?lBtPo--a6h!r4__;Jnceg3i zhLTL4gmTD`M<*6b)YWng%-kTeyjn2GZBizyC3jfv`9HY;3l-L4#hDWwPn5llDHJ;s|TVm8pqlFKLHZnZ3AKBJF0CJOYO zTeUn+1NT+vMP{^ee7z6fk|foW9limZ>V;P=5KvS5V=K{^>tewJFi1a#BM6z1xIW~P zu*4LOfk7qRm$!!=;L^3&Y~;&izh_`j_RhRgMG_2J(K17v)DsLac-(JVe@>aaS-YV5 zlHFQSGZ>`B)nXo$J0%atd(CS*+OrM}jwPr)u(8!YNK(mfn|V?m`)=fsbJ$T|YcNQt3fxR3Di;W?(O49E(-;&)A!wYe27jWs z(NFi(AcyBeda{q@5_(GX;a8e*4==IcdpNUNkJjYqLDymD@9$dpF=C*WBJM?}xGm3F z!>w+1vzjx=lTZ*<=c9BIbDjLWG4xP^DZ2#)k#!Vgf?Uq3X4eiRdV4!mfkE_Hm2#NW zukQ8g?6#3L!q;QLV;+0AvQxTQMJpD`Y(v3{4h@fsqKk-^dD!yC5Oksq7(|eL>RcpA zk%l2(o~z{j1_r5p8IM9IA_5o#k|4%dC_HqqJ-1e^-NoA9qYUG)=I6nqoEYb@z;a=} zMrg&dit`F5gH0W>3_d4Tx-^{0Dry9SYnEW;7<=z|p+^v;SBLcmgV+)801RQs z*;U4t*OG<4V36&%rr%OINeVG{a451WngE08<-a+${%jK*HU8{Ip9Sf?6LVHXiW?xtnwAjQNr{hozv4|S=ZOR}EyUEMBBj>U3^}p0MKo^ur z!%;9_395Hm?f@$~#!a#Yd6Dkw($83R28kLBZeUMrQygNKs1}b7A;D^YFo+_UGTII( z@Ac)(ioHb>@GS>@Ge5*xbIr}#%t|dG_rjO)vsTR>Q-;hSbNAo++Qz~Iz^3lVPdyfj5 z7a^*n!)KaclO)WSqkZB!|sdlMegAAhl}O zSJ*F4r}|?%^sSbmSHU0;*V3oy`n;(xFblISz*!3hXXB_fR90XOm5G?*q&sj|l~JmQ zP7rGbOH+dLH4Y*0kOQ+4lOfz)_PP>tmDjVZ9r!b1=kacn}SQP%e z#sMcdaZRHctc=+Sf2_*8*y&Q+XIa!E7(u++1)e!(o=GHe{Pwxh5rlzjE(I?fNL#IA z`VvLFW43JVJ*`LtAIAXp1Wy#1yu-|Ftfe;9=Sy(s3=`cJkR_LP2Ag}FU>`a59T>Dp z3+$o%VeXjmZM-C{qf7t>w+%_Y@wak4#<}Bx(Ak6V?GX_zY4pLUb)}IfdOd^9qri%s zy4&QU9;aF4wlR_N%p!P^+4eb0)oU`VJFp6KnqY1y{6V$}^8D<bQ{rV2$2d?`nWY3oRD)P9+co2pB9DD+@c z6BLcp0v2hkjj1}%4;+gJgIW((e7(7A!8~sF=bqVJ@MZ41vUyi(-P?rt69ge%`!D$O zI4UX5iYsc~q`Asw`S;tyBYFFhbruRQUJ5aN7Dj@w;fjb#LVRW`no#QR()C~7XM;OO zTqGlH7jpG9r9sp0!s-KqRC#5&yH6bcXP>lH7+l8ZU=Vv{Ej?u;nyedZFQ}Ag8Kzm%II$E#W-T=%=3F!bo4Wq@1^XZLKFYcGgZ0xp8^ede zAh)olEhKu*st-3l8pblO!JiJ>A?CrkFBaY9$L@T*>LdSau;Q#A~~ps6Z8a(+$1+mW*u zvR!snu7+~R)7RR2#y=b`8nc%eXBsULFlZWgKEM2 zPs4RvM=I%=phaFMjOZ_UntzpZo{hBj=?>4F9i+o zr^;>nM)|4tU3(}`isK`S*IfcDZo2XQt*X0FdUWQ6*WeF#H-o`ifLvS%JzU2F9zPb$Lkmz{A`Ble5pSFBN%+@G_>n_{>rD< zUpEfzx^nVYF!-WzXxoFQ7hjqNa$R=AOL#=~V9%#>IkJZ$=)#IB_5)4y}Uii~Llg=uDHU*e7h;B|f&Fc_iRH(f+_ZMrroDGoOp#MMMF_ z0OuNIg#+PAU;Mb=udPr;)FTJBDPfKE7UPG#KW~Oda)c_(2~9xGEW9V>glySuHdGLq z7PCDmnjjoIOeAWc-hww#b}qT)bhL}%JB8enxmE%{2a0eyXy&F)EV5bXfZuBt1Fu@L zl&}VmS6BO^V-e&M!hvsBPOP+w>~@rT`4sRqoMA6`8t?1?7DE^n3i&IN+c>ZJ&;Te`sZ38P->RAwuU zF3bH&)w&2c*JF@w!?ch zI@ObzvPqRt)7NpNS=N^ZRt)5eY6lMrmGbrYHw!z5;Lq{4FYPE#oW7Pd1@*~!ye06b z!}Gql`N{;-a7uQ~QeA-ShMHOo+ z6+{|4GzXQ%a>6;w=kp6Xcfglp!gE^}b)HvE>x-ayOGZuK7lVF@=d%{yHs339x1R^n zvN?N2@O^I2H14c2yPxb(n)%aJTP`@{KqZn9v$1gI172jFMY;vp(5#oin4&SZZ%>%! zl;cDL77RWMHh1hOS7@`JY5gV|4u^xmv~pD!rXDjLUq0aC>pU$6gJnWa&B~0c)(rI- zXTPyH9vGC6vVv?}%qjI|c_bAFs{n&(h!S65gWb-UFC)rV+)Y<2G64{*6K)ccrU8wU2PQ&o-Y~`^Y{XtoXCI`WpL69bOXc zKS#0K8lI8qdFJOjkhR*(`DX0!+z0MAz=}Ipl^684r4pWRpWHYNrG6GaP;f2Hh4nN>#qj#PRKqJV;rK^TD7`?JZ(I zZ<(#&mNJ*Qmk94wb33G-NV#)K-eOi8%UcMat8q8~*z2m;W98RWQv0Ky{sGw308iYv zs;t=BuKea=^GZ*64e4Iu$R3dr9$hSX=_nRxqa* zV%W*yeuZZHMF*+H@SU7}jn^ljE?+X`UL9~C)I461CCK)^< zvnjk!-!gWJ_5kT;Od$x|AtNX}zWrmxCeL}@g2OxqA=p&s+Z6Ynm@rjr+>XO}^Yfa) z;5QTF@^{h(U4Vd3s9l)Tt?>_&R;;<%PG@k#xp-~P7-4pXMGd^PbXMK5fy%g># zFi3kTYs;-(Hy*?wWnG&sg!@&@3j|@JcpkFqVXE(ykY2Fj6u-MoY)A@Ej!`T{2DifJ zDsEzsUSRWMp(tL{yC;0jPOu_PK1uV+n2M2{XHjdUWFIg%PGj%EoH(-|W&7;s3~CDv z43_TZeQU|9t0`&^ERB$q!X2``DF;OAtKx2|(ew)@-4noyu8VseE-`P@Z@TkIrIa!$ z80>THq5a!O-z=8A4gON=>kI~KDGfdi{`&8!%n4Hw>OvV)ns)`#Z8Bi zRxqeqLbT(ucUN4W7o8=$UseeQ6G*Lv>cDSmz1c`25*!RqbU1x9-{!iP*w@ZBoDGy& zGQf(8=#GARX?(VO*__X3lf@!1xI}0_%Bk#5c59hvq$TcSg2BkpbJTR1Q%cx$?R?_m z#!X;QBP>fN1z8mc2I9n%LGvTPpt_5Q870}zbv9j+gK0#2g2Aq+u~0*Jaxl5EIZD9k z=Ym1JAefa+N?W~Fth-W*javo={g~yQ|0MON+c9rt_&r?*pX6b3S?gH3dO2qOI$`9= zQ}B??*Qu2HuO7wcJijE#vDhQ<8WLg|-PJ3W=r3go5#slBcy28g9Ur}ZPFh*7xwWO) z{#qTlb0(*VO@1}Fv-1b=x7tn^;9K3b%H6oekm_XKql$H_?QN&QidXZdyc8bmu6icn zR$b-e36G zbLecy#}zqX#hJSoXWpw8&5T!X{lekm(;va$5a)|t;)U9;taEB2jIw(Vp&;s~uWFtO zFMRcEGE#3E&81KddEGX++{$QX+;z|F>mhBzH(+q@zczRMP{bU3bkpq~AKw8F9s0RX zJ6FBFIKBGLJEwDRQ`*6bPC59|dmSzvPkvf>XZ1I?I>6w^AMW3Hf3`5^?fr`JUoe^X z!QjnfvH2gb{L{!6T-qJ*VpR(mjD7m(t02Xpr!MW^^hR{J+y#TiKk|z@oI74u#k`;M zl>aMu+lksebVu^k%Ty>6vc`J#1-KhOwDsiEdoQ)&Pd@HQn)#swUbVP*_36(BuN|Es zyng?Rb#H4qxQP$%y{z0m{ls{;)>I@ndCdq0BdmN21}3ryk8l0>%f)}s0iSgs*J`Vi zo+jpeX4ZZsrEv8}_#E%}5OML=pI`5Pa&V>bciW*Eu&Jhc?(f{X0zaGm-#R-eh#HN3 zp))_%L&J;rpYD&9W@zU4rf%Hvx6YaPqVrtYxiYp*~B5tV$z zH}jgMtac$WZ!%O2k8uO?e#0hiz`vsmPp+S5E;WD^FO9Y5GaI&8{KHaLQn@}gCpcA?fWg>p2wNuT=B1FXHUGr?8yO_SL8V>*)dj(#wX~;!KMl*_2FuULHisXF*l${2w!rj9k`CGRtmNDR80YCazy}G zv1nO|4{cKjhFG$x`WmO`Fc|Eg3hDF3aOLrC86+B(2d~TG6G;lwDUK7-8{0z7px1*H z9eq?;j3BQwI|?ir!lI^0Fv#;!T#@g?@UE6RUh`B3puk|UM7|%Xn~onlSrnV%84EAX zr{)Hi;0Bakxo8h>g#9;e<}KZIDk`C-EhzG5dO)-KZxj)$H zMPIbu<(8%V7%Ato_jL!tOTilVDr)D<7K#O>%)#Q+WcX%vedPR(k@n>B<1J>TN`AL3 zcsLy6eQh4;ViVU0GSo%6iMe1k0cTiu{#1E$9g;p(Mswua_ka1j~h1zHZ?)9N~CWrCtl@WpCvdl z1`i%c@uQR6k;|I??)E~VtPtL-7F+V2g*L(Un2eX)6Z6-=J$Y#rEtW?WVMJ#_X*fFD z4ctZ|14T!!sP8vrdaE+sT86=3^8yT?v)n?{M7~^Wg+u_5pb6#cjZqnV>UzUXX>}Ptj!HUHg)7|l=o2V1} zgmjKi@eVMkn?(+eKY$_X_7Sbzoc{?w>@4~bzb@}P^+Cx7H%c9Q1Riy?YII`Hx7|$3 z%Cp=yaXc1m>UD)zxSP7WIH=oyBx#)O0|qDEDEcIC(-}L~!CXyGgvS81wXp{k1_^mn zFr&FBl<*R)NUbaJ=_@8A5F5R)6Z%GYxZ=>4dB#HwFD*UIpk z-V$GD{t(#IWue!?C9cBm2DUuUl8AVNK`fG_MWNGeLT@Oa%L6yVtBAsd>MNQrCi${~ zw&Gu!PGo}>S;vch_C67bbx4U=dro|mD# zML9Aycx<=|9(CYy&8*odG6|bihIHPFfu{jtin(Wsh7&xOdizVRs4la>rpD@9O2*yQ z@xD##Y-QU;&%xk;tc(zCTPhY+9nQvV``#Z6^6YpwR?VK(>=UmU_zb_V4-B%ayb;XU zJj5Q&M9bF`8o{8-qfss+PF4nrwZ06>1Ne&EoaSM_JD;}C$^Dc^Q-kacSaC^{^Xtpq z!RWQxFUC@$=jDSz%-ZL!n`DRO8mat74Ycjg& zm*_Y`+P(z!UO^TZ>f2L`2h^+c{WvX6iymghOL;At64dA&T? zB090ky+7g!h5+BrmxVFeALg8wo_s;>(N1d5flV!CU^%}F99`(c9!g2NJA9d=^`wQR zl@GON6FN4#rfJ|&M|gQEcCu8h4T(H49c1n`05%mz%9g~D(ufFBK-b;J%E6$a-Ipm? z$)4`7Cg1n?Qgj3kig_!gWs{DHKcpW2)lzpH3_5=98Pg-P6`d*f#D2hRgU94cb9=XO z!{goi&ST!}CmP^wTsvgTUw=%ku(Oc)q92o`CXS_ih_u)w)TXcG%Rn7ti1fF$N(W@*W#LPr?|J{(6?T%w#G zG{vLQn42fg!V|MB#T>=j6!nxKpl|#9?}HYDJ4fQ2g%!DsNG_=2D625TH^HFFRy)VX zIUZk?vMsRK#S)%C5cv81)^ENEA1W1m?^i+BffX;)s}Lq;>=K5Ibu(4;z`Y#)ikqDx zy(dkZyD{0V#~XeYaI|ES-8(yPPvHhp!vaP=eCFs!rTAB^hhI5N(+kxBcJQyEc^NoW z?tF|}Ur9!=@G}zpEFb|X@}Q8eGlN;t?$}({9&oR^m$mhC*omDKnOy)rMtK?xhRn%0 zwG@?i8ap|r{Q>U_PXrB+u6n&Uce5+++{AmhcJMc_qFXeN>oqI=giO*Ta(^6z>Lu z;q!FAr#oh`BbfTQ#}1SBU{IaW%FV_#4!f;jNVGw=#bEG0uI-?!%ZPV1#+!U|p8q5m zBU>2_bHBx!aQJX^j%)RP6$oN&HWZO5F#ZHK z)pXU4{YB#q`OL1;k2S}ifQvd1W8!Cb#C4|PwNJm`b;Va;MdP-i4-f7>ig>^1hoKL& z`FUW_y71zW2D_(sbMAdI`F02x%$a$dUsW6_5cpwgW(4i}I zy^sn9hc2#sd(vyw{EuJ!rTq~M3OUA^6c6Lufh6O71VP{@WnO=-NTtnut$JPaH10yu zF#PG5!5nx_e6XOR<`Bc~vpb3KxqAIS_j5hW+3rDU$a!c5Zlm?bCw9iiFSzAHFI*q* z)s=z4;Dr}YTRk;IGz?ux`czW}22I6hueZKfHqf2VZyI<4+B&xc*{}=>oOhm0<8G%k=b<>iC0O z4(&0TZcYP(rkmFGT+6}ah>!i=cJ1Qdm;il=wCn$K!cD)QL4y?!U3BVxbn`RgtEc?; zwTF7(Psd&UhYQE^GiScW^XfkJ6Ik)_iXVq|&3Uo9@J;~w!=f4ZcHZjfhc%sXy9Zs4 z#$2yHzY!kiP&)WmKl>QI?p61@**O<~`W0+y(s}c@hi1S3bxp(Tdh=a}{!Tu}nz*8- zus7uGf9_8MD~=33`o}%-`xmsr$3ySWY=fU%zZX6={%V=iekEtc>!5=dKY$h6YbZa= zY&tY#b?lC8ozVIP7<{5PW|{8yH0(0IR@{4Z@-7&xSHB=_dD*$@Xy8oNu5*clV9<2Vv57Qb8Kb=p`zg5MIM*#CtOV3$4)7+Ta~Z-0Srp_GyRW#CDec3L}VNk zpM#$x-?r4$NezQEOGPOyt0Vm&DD>QVXV)kr1jepKJi`S2ZU>DA2(x~Ox=6#Yi? zqQ-uB3Cc-<$~NFsN9E+ae01ymellToF{!qXmP~lxL0_>GGnc zE=oR^Q3=mIY6%Dl!6l$byUQHE(2A~u6$#h!E_sU?f-KuxtYvxfKrm?auP~B@hm~S& zzWM2@;9fQu#D_WJ0z2btI?VDf$?u}zv7FHDrkxyjK&tQcI!3kC!eOYZsCP@mzzrC;;Cz8IcOFB{TD{$6p=XD=Rhg8BUC5!yPiac_DGIMsNoo zTURL4-8BcB8dsLg=@Rf+4f;&>TlRruFc|E?b{sFryq>T4ysf7UKMDrhqP*X_gT|#oq_FNHgmt#Qw%^FnA>NplDxRn?bTIt0&7uA+%=M#VlH@&yjZ2}CIi}jJ?PQ~0` zTL=Cfh*jBu!5Vgq{gmlVD8(YZEt4Ay&&)SIApHw}q{i8U9Uf#VN8SWhWS6^XgjjD0 zg4bsDbz>61pki^M&os?>22CL(@}^=qV32xYk%$(h-7e!yvs5XGaEE++ul-2k^x<0^ zRp8M%=27Ed#Zr&F=$-pUrV`H`iMy~$0k0?Dx!i4^yt?%*j#FvQZs0b775h3S*v($j zZZ;BzOGDTwFi0Id>1|jOBO^=su{1Q1B>&bX zra&|7^v2eQ3pe$~w*?h1t5fE$DLI*PY-9@5u&M0g4FYbL z+MVslt4==936HG8nokvv6N2!vN!8(JjtAi2kCK0Gu#62J=DDz(20XCvr(;?(uz*oZ zeOL4jTS2a1)`8o23VBRKa0pHkrg?Po@;ta-Epr`0uPws=9Phc#Td~FBJXjG^>(P;K zrrks0TwcM=>$e7jM7C?NA#|d=@gO62uYQXe7}OOKRmmM?jrSu$?2@);!5=Gw8~gc? z*P7{Mhf=%XXeRs=3EN@v#S$b*iD1T^cW#6)0TzCn3Yot61-^OOoeME{;FBCT(eDvc zjPF(M=UrvSm3f0Z=iuRf4)b)>S=q!itCpGscaPN2gz!I!Z*W?91LocQS@22z@1ipi z!m%Ib6uXl{Z1VJ>U{h1;(IUi=h0V9dDk3Lb;rk9+`vdxksAq)?!Oc|M-cm7GF{*%< zNuz{@jAgFJzYCUtzf*_=8qTaQ3+k3qDtv|+6RZKSqJ!A$=Q^^!uPZA4v3@8| z%-X<~<;9rU~VU;PL2IfjQg*tWRCy5U0K3iQdaO$edWZ3ap5! z{)(PX*h1>H30kv)-q;KVAIEQFg{0LTjn9l=os*nZg2B+=oO@+`9nGoTM{S5r@u$FG zW_Wcohf5Js?qfR~>#*?Eig4XoOV?nJ7mBLmPP4DUOBc@3e$)O`k8%GdtE$_%D=h+S zs(4VYX^dW6RNzJKHtXzz_v!%gN^yqYg!d%-fNmhZz8b7Z9CGO{O6Cn|yRC8RYpoMt zke%{dzGNr4yDT{(fX<}CL+iDENS)N3;5}PRIT?`mM>JTm@>X7ny!>sbJX(S8<}2X4 za`}N9RlE7>82u^PtwN%68d&kJVHd{AB6~}L*C4+ra1tJ`O70ZeJ4Z?d&Th-4ee`eJ z!HNNPM|2Z1Y7)+LeJZCxPzwgDiaa+rjRiQVve@hJIw3rxOU%Wc@jJbdo;&4%3+*m~ z*8?a%9B3}Hb$i@(+4*F$`(+{6)aCX~X*(|4*{i1`JgpMc1z^xQVrpIBG+o2@iDu-JMmE9gI@q}kHHu3a`_}v0`Q^Mbap2C0KWJWH5qpr? z+ZE^=H1;<(*NbI?G>a{>8+#d5m?-(=N3bFVo5m~kp``NFiX&OhE8sDJ(s$%R*p(JZ z!B{}N%w^CKtQa?(L2m0iGoRSzYbvxP!OyL%(N3!LjR~&mV3fPPMK}Ctrl>ux+E)Ke zr7OE~-`%zzzA0122j^8ZCr5P#}B7U zPi_hg^IFbYR~-)q%cde^2D?CR{J0kt#~dpMgHFYmk%_W&++k@Sg)|WkpK??Lv&EZJ zmt3Yw&Mn1e!jBPuD}LMZGfVaFZ~Uw9zV0#&*wjnYHXQZO9K$L1u}u6h8a~NeimSF@ z6kM7D`wb^;?|b+-2Dldb4>wBZ-sbQpV=_tb@3DGi43+upRa7>f@HbGa%Hckz?^KOM z);G|Eh>+F4zyIR}xN|i3{yFtx^`ldp_T77Dx-JerjuQ*-Iv;wHaN*w{-!IxT*a7zd z>3dp^zNd_Iyo=DCG~G(&12(nh`;TjCj6Xg6<>9BB5dVZnR=po)M)$n@@%DOS-keoC z>)~t1`)6}B8&b@mI3J`_JIvN`tiKVtS$QjjSvueex{@zVS?C?J&-4p^WY@KGh>>ojL*!x-ZMY?-n4sS&O0#pfHv1X@#0Zg;lrPd=Z%aDVDR;uuhu*Wcsuj2 z(Ko3SW7ZBZcu}>5HnVSsF?jq<=O26Od%7H-~48DG0 zJp1R%Kcm}L@Ay3A&vWqLA!hyi*jv+6J3km>ng24?qkkUso{QC6eFQ0Y5XU>!J zGc(tpzDV4CmH*`4!+Q>3Q$K#!IU{d-5MjT1G-sTB*9Zo&yS=Ut&QvYB81M1w?W(Wg zAf>ne<7l?=hWjEu=i*53d$8iik%&XRmGAcD0Y4*A&l z5N_(j|NU0v4;>%IPJ$I@rV(f4Kld(vx=s;Z5;iDgZlgKSwX19|$xAbEEU=>K5=6f@ z+lboppTJBzc-DH=@a%l{ZiaebW657do?t~&QK#y!*C-Dx!hU)?G8n8jz0-K=uX0fJ z-z^ILR70v>X?mf~=5$B;T(Dxi*0GXnLw%tC!*{7=abP|e^f-5-Y=Ca1aRoD}^lBk~W?fh6XTTcsIg*kG#e^V*0A{cCHkk{ecmQe?&A?(QY zV`1Miz~B-@gqo*Rr7!IB)aB(}hOfv)HE9vQbOa3t)04GBc*7O2q6M+(q#KW`)C>zq z*YG3oUBHA(t(oi9_C$>5JYUp~B6zYZO~RM<_H(37aa%mfvNF2BrVgC=);WVP6;^(? zDW=xSA`=WIyL0<&DUav4qmX*W(p-Nq7&ySHU1{#ToLlQsR4R6XKgi7))RG3V)OTz8 zynNfb)E2NJH{Uhc{rKKx)WrPGF8yuz-fBnk$mQmVvVlIqynL1E!YHufhGw6G!qdua zaVbHT%4#t@+nHWe9#>LbJ&Y@A46ceItHFxo>XI zIp8qG^Rqudlox#o2KE1_)J>#Jd|90&TiMlr1HNNb%SUhXh%7S=v&?4X1}zV)n5;o? zn2d?__>nJ36QUk?#q5)wg`~`p#!m4HqWzgZK0FhsX;*Ekp$u3r&Qqy(JD-3*kD0VA zYR$ZIGv`tpD$Oc?Be;z+8(O(IQ7Rz&ocof&OF07uX)S|{>BRV;1)_s$Rq9>|7(B8l zt}>b3nHKSDm1zOc!N*bO!BtCP8DJ;UZe!5FATEY% zFCa7288p0G+S+UIY^N??R=&hmIpO#dL*8H>paLs;){aFTq_FWA7{m{_ z2RFNzPqhqEOTv$r!-K#84tF^VAMTJ_oBi*^{Dtrc8Q+jH=G!!QTX?GM%B)-jegGYZ zkx#{aOSE%9Ca}b;a4EQrgYn@(WRWVRWk2JGnEe!Zl?9#A%Mz=u7EOl<1uq_J;890w zS8(_n+xbL}V@+mQw>^9}_q$si#ilYmq+eJpp6%V&0d8ZJ<6C^V{!Fm>78c&nyjKqf zzcbtP3#O5Uuo1bi>2B2=FgQ!l_aipIKE`+MHyrIE6nuT0jFx9K?NuI%%_d(t@);Yx zE0-LiRgSgkkM5@wteCYl4_?|Q@EuNe-{H`DjgQa6s!GDZZDdnV=idxshkExjRPkH? z#yjd%s}{tygw>iQy1M#c$1UMYfDa~J?M-a-VGx6wH!Lat32dq-cQB!|>SRI1{UxfT z*;hlrpy0&1nBAvck0~bwTe@3+@dSf`wTJIWPQ`B1l_qDl>NDqo!4_`yba^WIbkzAJ zMF!qs_};3hEIpc1?&|)WCU?MzT%*8>NL6U0tuM~@rydEpziTbr1F(k~_S)kIUB_B= zuNHTa;NeP~UK^5HUCJ5faZeu*mSuoVrIt$BwH2<3Udj{QRz3US4tau;rtQD44NV^ANpN_pv=XEj?mA5OZuLZud0@J2 zqGEiB+(@wE&+^cTQVV~#jh1=)4L8!@KIdJrZLj)}<{o`<| zMd9S^%UHAq46?l(m@VH7YcK0}R0If4x`DxDmy=z>-Kmnj1*K~ZlPvg28D@-1#mzeG zC$~`9U-Cfg!HNd?0Z}h3^fXLPPK|Gi7yA^#h%8tL-Y29<=_I{vwyUfCBUf~TIY=ZnNn za;Cfyi{M0R2Q0W(`{dd4*?P&!S;UDEu^}GbIU8?ss_@}^^4Nm`X7SY}u3*J;7R+U| z)@!V^9g{K6o+P->Dc-}Jqws5g6B^{A9Lw~9?~yTI+E2LoKckHV=(?NJNoinHS0r<2 zmEF2Nee>9vh21u*z@SrRoIN2I@pbf;p)KWF_)e!77iV8;6;9Dk56iS+eb>N>m(vLo z9{63Tyoob?lP4!+V9NIncwWwz`Sp>crd$x1Cv6;pZyy>b zYpfYG{C5_&w(J$2aF>G>N22Gsjr60}B-@!$LJYUIfWd+iic>@KZtR0Y%G$^k9(XWV z?72@V>q`$$AW3d%q`XWpNK=NjFD-1HN;sVr7e+B$27|WAb@A@)K2n~mJ%a3WhWng^ z%(>TQq229^Qj1un+~@EUmi!9C2^!|B>!n}gG?PCQ;FVqO%~>Z>qAROgJIh~k7CJP6 z+gO~o_R@L0;pUC%;?gf%1K`_08Brg1BTyT-ftnT(g4e*K$2%l_Y3q+{FNLLg)JL&g z0X7xOMtte^4wYOzCVS1#40r~KIhdu&Hzd2JTFoXF+ldWe#r^Dq9NizagYA1*n$YBv z@OafLaC)=iox|_Wy#hx8B?kjm{Ansi++WOXZLlbx4%CuQfWZTu6HT?*3B#vc#JU@m z!WCdJFaCpXW2p~I@W-6BMP6s&@hX=YEu#?-4&F~*YVHvaU&=cP$FpV=YFub~T;OH1 z${4Vz)Ss;ymY6#>9*iA}^DMD~7xz~9E3naPD|eRgCkdpkF;yC3H8O& zIUh#gF}dNIX1uzJwK2}NhEhtuLuDHjx6B7vz-e|!X^?huE{(%r-=(RO%~YH4I#qn=cS`Q zQ)islTHI`d#{lu6!a1jUkpB7 ztPgJ7x2!b|1#Y7&Mt{k1irgw<+(_!`{s(*l;I|Jgd$HN=pPYP6qiSA0+*ySgg!qw` zgZSEcvZeq-EIbb&cRN9H47+_UC2O8<=Qd(8xQ%Wt-Y0cesU<(1w4zV*9Df6Yc{^B? z8B5*1qU0FLvu;})82oXTe!P+y#tidDko=2J;SsXw;=PewGcUCFj8lJZWK_bdo=h(| z|EsKbeCF!CwjVyiea^$_J?}rPeq~(I6mY2hA0gA=Hg5ZHb>_o(d*#YqA0{{*))8PZ z@W%CyLz@LB7ya=ui!dQL0tSC#m~K&g*|q3->gqQUGePh|yHTrahpv6h#BvW#H`wH4 z!|MTh)yB@Gzi#in9rEdxS+J?bkEW6Det+FKeUERt81pF{obzH;#2Z=V!<%31y7z7Y z9L%vx`fw}c;STHI@w&&<9q{9)po-D2zBg{MEqrg+@j#X{4mNfBDonlc{SM>5Zq4}G z8G~xTpz-2Y?@nH9|HF5t{B8T{zp(_|bhBB1y#GwnhikWttJ#YlfE5?ce(k`Y`8?$P znJ?~L_VW^nu-dQm-v=e?b^J3MpA5EWsvC1?JjK3Pkz^2~g|Ng^u zq7v9bWgI`}5I+Qb#n0@fBQ9ktWA1}e+z)#r(8< zEL+`O2L@-Xe?4$9P?KG1yjSkjW`qyN^F28)h_5E|4YAt>LWtJzUah(I!|#TN9|EgC zE`3$g_>uxP_5I153mEtPFIJ3y*ZX=jaS<4NC4TbwMfS_y8L`@Q4f`zkQK|8^b7^O_jc2@Pz3#?nhX4m*o4ErZ=qDT>^tLJ$wIuU&?N( zN2Y1P;HQdblV}ZnIM8(MYXl7p{#7gei8Q?k-b8K#gQhpe|3~u(YuHp(%mssgecW{6 zuXmyA8m<8iPt1G7SpOC+0;uiKFUw+3Qp6nVsy*!Pr z7?nKYu{(tY-SA+(;!49BKO(`Q3ccw_&80Xp*i>R)T}g86An_Zmk7K;D00Dy{^pZq5 zUtj7TKN!(uI0xU&`TQ!fAqSL*1t-5)G8(kJ0IX=skJP=uA5Biuw-?G(pTj3W=BVlQ z@uT#r8wsLKqXFyP!HS7Lh<+2ZA~i~{E+i@~6b zEsrQ?)MKu8ASGygu^0?0oer|6-5tfES|>8D#gOzrD0|bermn94{}3W15FnG7U_>%9 zhzLnUKvY7)5C}64ShWlRf~6LaDp*<>LxO-wKx9znLD4FLwK%jg1O)_T&{nNhponN~ zMX^=uz(2j8`+0uv^!2Q0;n1oLZ%MFwE-{d$*|)Nk7p&WdYWcdkOy=@D1?XS#&9gh&qAJ6jXIubkvm?f^AswmCkhlyDB= z;4{|f;AAe^>NrM$u=I)C1b9J+Ho8n?!J@IaS2bcMPOKbkYQQR+>O{X`qH*%F!-WSt z^T8l{&Z-Ze)}G{wYnL7&JI;bZSDcG>TqdU1;8riQFfm8~gR|8cCF%p@IEltXaaB;olKnYz0q|^h7it`Wi)Kiggyss!NN&V*qbdbZ6Ku>}MMEh;E*< z`g?F2WoM?3kY{3|90Ze=n%?ZFMEPST13wVQzxK9hK5xNkJ-^l!;*V ziSh8xd7+=JjgLC>X}NcCZt}4GJ+R{U%xJ~b39-KgmWT7>#KHrlWK3<)dbay>SLJ7N zQ$xxDu%fX%;vy!kqLKB2UgpaF10Ho`Mb$}Jxf#}3mJ!aQYqGMyihtqLw&l)GYE}u! zGWIqtJhUd&d0})#$c$U;kvPem6h0}#Tu`pXw%Zq&M^4j8Ddq6oV_KP^b6<~4d6aXU zRI8iyg4<}tnQ{_8yxA%Dr@7m=d%;fHGM9qXHU6zWU`5Sya?o=8$S@~x zMd@ixwmTT~KXi~#qdFLp)ppJ`WQxZIg8|wUV-#i4vD~yYglZqs0R|Pak%o4uBZf24 zQl7NVzzGa?U*o^>!6glBJLY6*j9U%gI?er4Rc&+=@2y6&&M&q!-V9d!v_6?;joG&z z9hlWF(B7~IgZJ{<*wyLxq#YjB)&k=1@Rz*LAh-CDzGEP=s1~si)WeI=>aj2JLoVW# z)7Do)X7H3ou&K`z5;&TbOM0@0qa&I|o8g-ZZ@Z!Yo~hcrvO;K|B$)7_ffYA-%M+6M zyI)!`3>Q&tX6ayXD(Z1;F{XVs_JHkem(RuUe9p#tF+H!lO_CIL);3yZ*92C?97D?t zJvb;sV~uxzNS!wr9BpU4OgijemyYHJ@K0_v1cM&+>$2axSik8FO;~V|ei$Aho3MW4 zoK}>jPu!+m@jKm90#>Bt5FfkHV!HCfi!FG#0{APJ?b4{R&n@0o&@nRIq^*N*D9{}c zxJjzMp=ij#DGB&$4A|7%Zj6r&afMv@TCrjxvVIE~>^vHsH#C+wNU<*C?jXK{r)3yJ z#@|tyUlONXO`ZCaGT`GQK{|2)v%}m=p5W%3hbw`P9qOd8cHibcLbvMqT9dwG@a5no z*#o3w{q2X&%&LcPCllcT5-oSwZp(x`qO!PDyQ`N4ue5B*Ew-~JJ`T%75c!swAtv~7 zSlf5~=3hIVM#~Gkx>R{s1qPF8W|_0pAfu#`PwY)KyOdy1rTLtY#C_5KFo1QEM;wuY z!LnbOli!Xw7pj+;cdpWJhYxeM(>%X={~k0~fDTI}B*A<2DlLPY&`=q>`EF9lY*-~c z*WuL5cq#QjyyhH6lrP1*!oh76)I0g0vJ?0=wZY@u#2zddp=ub25It+TBQvRjh_SA0kQBU85WuRpgrMmg&KLIH(z>2iPggSPAWE`b2q=hxa9s+~x1lQbJgj3`hCp`YS zg$X=KLg;l*Ib-|qCzedS3>|tD9(8zGqqy46(y{J}l+NMZGHEqro-ZN!vx=!4)m3iNs0S6EF87qA7M+QWCgV$Ne<2xT7OptbX4| zgb;T*7z{ghoh3o6(H-5mY}*2NxR*0!J&rDpm^Za5;D5!m9f!x{GSzH(V_9RFwa`BO zAUztsQZ`xbeVpIq2m5dv-v>WaL8nT^pa7n%*0t-PjD{yedg5$dwl`EVqNz#p7 z-5H|~z-<)dOxe7o*4jV0%a2{5@KA z%WRQVD|{#WlBI;K#n%n?IkC3la3y{PV8z=!OneFHpWQZpILOL$M=^uJ-~jt93W7I@ z+^8Am4@^G=gBC=W$jUw9mA|6L=Tz5=)4<@LQ?$b5t{Q?Dx+6fVyUPa*{zJaK%XUKg zx0MEcDs(KN5Dbb04jakyJ_RzzILkv893~iaZ|_^PtUsNaPbHiAec=Rm$QA30)TgK0 z`ByQb(b(#j6=22Own}HAeY5X09YNw=7xKa2_?k({+7HW}4c(5u&wq^{2ZP#xpgjv4 zuHOFq-Bitb%V#xUFz)ipb@zGuzlkwx-g&uy{{=AU7xgS-^@bC?w>Mwl$0hgSAM%CM zf5v_D&b5ZV+C7Kx+wyp@;$9Q}<*(ld*gv=^O}=ot2mU=SU+p%&!LB)A;oX?-mUYby zu;Rk7^@ask`-OM42y$S<5PTLem3Cz9>xIUl(W?CYfwYgf<@VK*sF!y>>_41g@om*N z)O>iw?1%S9AJF&g>@Z$PdXiDp4NvKB-yG5z_WtVf_ibPNO51u`0PY-X-mCl1UM$Uj z_2H^w@|;gT7>pVW^jx-}y2pAn_pIaMJy$Te@Z*z&j%R--JzajWgV)Q1ClJ0eb}iWT z`(NMYxXRaV_@g%itoY3F-m6PbdB4t^-1zEx?>cymE>riyY=6nV@w#f^^04?a{FQ6l zyYR>B4e!^ym+;@tfBgWSeBQ7>sx2(w^=ajrSJS=E&cOpDAH|PmZzC5n6bUb!%^rLK ze~zCv5AMm}@y=J&MSX>qi>koAN|^rQ!H36dKY0FmAon(A_g7$${pii>uOEC9|0shz zob}-&ikB|`-Tmmn{_r8k>6M>FKKN=7s;JlT>wN8vuLl3~vwPwrme@Xfli{lKtJ}$| zt`8>2E8#ihakKju@4OFfu3CS&`|ZLQJnZ~Y%73$JQ(E$R#^CX|{loAfVE@aOFElm( z(B^fO^N)vaaG;%o#N6*y{B6E#zIIyLT%Iru53S$5_V(!)AH8F?;kx+AxGDVWcylN4 zN!Q~Jv*zXNVuqsL!Uxup--Dkm%;e|}?>FE7LFT#uZsVKo_=UOuluHYVM|&vXHwRfy z$@b-k{aPnygEkhpF9mV`|Hx+EEW<6dj4gAmH%Y*A_T6ju7X@U`09gBMS3vr--_u%zqF62C)fLLJ-JRUpx(^mBR(s{O3#Lc&dnqer5co@K{mK^ z${cgEgLBMt1*%-E292tPf(wXZ43}x;tKFw2KpDi|gN=EL7f|hrqKsC?jG)1w_C!3} z$0JC)D4c}c;$R+vLChl(f?#!tRdgLD%^-;g2K}(X^{9y8CO_hk9??Sq&*e!yx8ho* zTy`n_I@ZF$F&C^j5G&-L$3@xKqSLzc>}%l(GIS=k%LA)bF%ho7g_R=$E0VI)_@l12 zt3&*}vz=I(nP4!`&rhFN%2M&Lo)I2c7T8oh1SP_tY&*^+POM@GQ843Xy2W8SMDo4>uIDZ z>E<5;D@xfy#_?c{AJzjw3K2aUFv!%ov%m|y+7cECP1Kei1%p=lwdlv9!Y)!AdP0a- z!`I{|ZFEPMC~XiXTDk%y?WhAQR#-8yB3^?P%Hx2-+g{@c2ED!9vgbIOcH8MvCB7gP z{6#GwAvWEpHqn$5Me_L}u$=9ZOjRykU5sr~2j^ysXTabxbS?Uiw&U(y*oijpQu&uq zZ~>{??xLpY`H3Sdy^WM`=Z4O_*}^I}$yAif_r$u0;O^8nAQOcM8AOEXC)y&CfP*kS z3|2rvP$)-2rk)voF$vm21UsrC;|KAQk$5jI*K#TX3}WKrkm6Kob~gD1{x#On0}AS4 zZN{c&3(rM1WO5Pc|z6eI-_l%tC2vjlydBR>q@rzcTduA^0T`rjrtmdFeV4C>vL z%;Fpa2L*T=#;l&($Al*cg1@dfU4I;hniNS5uGmWgxFBgSNg51IkD{bMWeBYv5 zU4A1m(IRInLX#sGJbl;GqC=5IZO5=ZR5kqdzC)h=9TTgIrL1wL;mro{mH3tNFfy9m zH}$1AYa=(r1^y^}1Mt{ex=Xatp1zSO;O=BIj?ytl_1cxUkK?Yzv*6>XXKcM=!5$02 z3c97fJ%bI7qx2TNIAu;MSz$$I=)Pez*iZ}ykDz5OLJRr?6Ww*q8Vq_(81#8EmK(?> zT&NACrbS>7mD(6~hDeeigiH*AAn+kLvK-M%)3vXh+3P=3eT)Tr^K=PAZt(KbDlE-;87EIkSl!J}-kBOcfuTQJyz3Q?V{C3bCHhfeVB z62jf7F&-73*}2E)(OR^WSZ7rZRn$X!Ad9jikC2)fOhgY#Av<|`8pH;jD9W$(=6G9+ zpx^?c9<|whDwi>gsWt8akB7QR5H%A$s~GG+>jWr{3_u;;*>%zrTuWOGe!C=~t_LeD>)BmdadOhDk zhk|+qa|lXKv1Xth^X76L;SSbS7gq^!q{F@FX&u=O&;4gO27Ze9FX{0k1wK&H<=AVJ z*(p|^;z+7q^usxD6LWPFzw9Igya!MZ!RYDX8T6Grs04zRwuPL;rmz}v+UV2hdKwt) z_p1#5_gMci=bZYMEKMpH3?0-s$i-WeNBq%eQY_JJU{G{ed=BT0yV#{LQ1*x12G67r ztjsNQ>jC{Dss~dQi1~=yFR2w+wWN&C!`4;0AJbI;gH4r0yTtjS8ztP}?^fOojD(*7 z^VL~#hd!rbEmxi}eUNft7g*6?%ghBC!C|CiNd9@wK!FVyO#Rl6XmJiRCH+-T8y!3> z2ZP>1MFH-o{FP?FfHqCnYM7+#Pa(E#>=$PC5`L(Rv!9Zwejc2F>y z1XdjSL?Pq;(maww)}9gHCGP`+(%F~P-Gv4HFU^&9u4gLYzQWJKT5w!fMj6EaRlloD z29H$J`P+!a*1diH#83>ha+xc^EL!#~-ciwPMIEd9|2+ z_;Z}4KjBhJgSCpC&y{0eZdwo}@@#;2YB-2i??xT6R>ULs;`?01A2R~(jg#mVBO zI~T$?Mf)44=&bHdhRHG=dU{F-1?3aq|d47HgCH3cN zVPNo~>e@|WpZg(k!Q$SP$6_bJpgWF>d*RnKu#Cer^I-i1p8%RSDK#W*{YlN1XQf}_ zo8T3ZHwB`m8cMIR+f@;Yut zXxxE1u%f?c*sR4j!2L{RAeDdVBbGy^+gy&xY@5HU`&pfgc}Z;qD^@JCAnzWk43Ep> ztNh9L;G>neNA-eWVysdGSVm2d9E!k-x(tPtNL`@5GAP*Qc%oPj3}&eXY9ZhEdFfwt z0mt*(yL46lsa0zzDrgV#ADOfkCd5CLu?^5Yg{aS)(YOOTpkP6m?|o6Y{ot zOWPfiN>?i|7@@bu#N2j|?PrD4e4Du9X)rjic-Nx;S@uN9?%>&TJnTC#XcM%Gd@dh5 z!KvxV8cqs>UqP^3y(5o5BE~j(JxnIeSi(K|O5)jxBP898S<$xEZOChu?xmbA^HbVggjQAr14n?2Io|QMAeWyMRz--?(!=X6$}ndN~dCJ zU(npzcdv7r4DJnUs-B)2%jN@YCuF&8U7Jd5<=-KDC=dp~uP?s}Qcy4Z>oGvbS z7jkVR2-j+zQ~|HTRs^WiDp|G{OhW_x5*}s2g9lFk*{a*pxjWxz7>MrTt3Yt)l(IQ& z#bOcX3@)9VS!g{32A7&|498p$(H5V~&n?lfbOVF0c4NjB6pr=1y6=G@VG?GR_;SoK!Usb3U zp~I9<8Ar}+mier=g)1(4nm_Uro2@H~&vyOxAYBYL)d{`U$D@i)>T_`Nq1&0&gTXCf zH*n)Vtk7mn6u(4TehLgS8-~#`3+*M(+ZRxnWcx`l82(TXK?sT%6jGL1{7EEyHs_AA zI_+QP>$WlnM=z$Cz$e!Ura98KH!D}L#GKW&_ebC}9hZ7q5xedAnyUs&`!_3t3czjL zzUXf0i^&YHE%8|fB{b6&(emmyPrA`J>X`xZi7i(MS+8J8Ap}4BR~?h0F%eZqFNa@ng<@ULt~f zxyO-}ir?hh#kjeyiDcHmDsbl{h1M8|t}v^zGD{TMhJ;;UuxZEYuDS}=l%ycRd?Rk^ z7#NJV!e&am*@yT~Bddr-Z5%K-={OK8sGZIYYdEC3Rh|TY937^I9FqDtl@ZY=$_Hc4 zM1vKrv+P4RJ2OqaHW2tPc6Pw$R&FMQ?w7*`UWw~O_m609fEP&-spF>KSCklz>@yAh zLSHy|4s5CkscXAEmJ_+>{x=Qb+^LOV(95b)F~MoTIdFIv;~X{3!dkx|WSIqC zTNdqG5&%~G)~_r9liIS#-npb-I%d-i1}CZu&BV$P#w@*+@9ahE2ZLW>QdusCP7&X@ zkRm6JHNa;&n)SxEW3k$^p6m7?ivPT+TBh7ez6e%C$vTPNRE^Xf*Kcku)4<1$L-Gf!aAj-i zj9eML+w<r>C zP%S;AtSGAtP|GfWiwF_i8pTlu)*X6{A}6=(6dfLQd}6^Q)hLg1*m`+Wn!%4a1!~Cg z`^Bv(m?!e$?nK8wceBB5tjA6;y|n)BTOCJQCvum}fqtD2Ya++)qeiTiQ9+NOig%pS~zUG4-c)~pNiXcNoG=;1T(!YSV>S>SJApBh=#(n))#Iy8~_#Ynr=Lf9# z!)qi^ueG;h|6SAlACe;A?)Xiu&ham*c~!78FEFQi;SyNUd?DcIgL{W7!d^S?KVR|a z85q1V6t(b6&EMM%Dg6sn+xJmm@L_0}zuC(z`~Nc2|8qD94_~%?RDv7+^w}hv-{vOO zetkOztoVMqFFtG{BIpe+Be&+kUU&j=gYM{%u9g=iZ*SbW@m|-%U`5@dSg8D;N0|2S z25B((I^42QJy#|A-#@{idRES3WjK!-wkJ&!t*zjNL>rJS+BDIpw|q!F_wWA#tmukX z&w1+r*TRA2rn;TgU{EJ@X!eSZblRqpHS<_tFvC^JoVcb`?c@6Ne2(A81%v7eaVXmc221+s9?G?BD@r#P8$S^Op9F?pV-1L&|KeohQ9@|ze&G*Rl$Cmv;hL$t!tfgL26v zKYTa)iSG?Dj0OFpC$Pn%&HPq-xi+@Fo)-?TI^hK62ZQ&_PZjc>nhfx<+wCO5ApF+(Cn<^kjI0&;Eij(c}lLNs*3K(pq z$?eP#k`u?bia*OL!+^o_CmrLs1Fp?tqwwdcgh_aPo-w0D!7gc&78Yz#NUrF?Q(fW_ zZ!z)O^FX3FBp&lqb2-@5A`dKr^NU)aSF5I%_p#th2xlXtd3BP?a9%{>3ljp32UaBB zKt&W5B+579AJcKe#>c>5josK6vXHCWel&=a=XS>Bfx%IkQ{71CN(1q9j(o%y5C4#j zTsdA7%xTu(S=Qaas69%sqBMh5P%Dwk>WkD8{7^AGeGrvff|BmTC7dDu;MK9xhYwb~ z$Fa3arCH-?EG=beS0p?Sz*28L&EUw^8u-^sgG^lBR|7#wm&C4V{Q%+^|e~T8E+#Y?fhn{9GvZT=@V_FoR$#DtSB|HbLsX9mk>>sQE~^*}GBz>E7szUQ!A4BewEcy4 zFeu$-x68=VfNV@@sD0`bRp?Rz zR&>N)MY9O?6Xm5VjnX+o@ED+2H0^kGx~|gYZ0o#>RlXRkC_lxZK3AreNN1vwgJt49 zV369mL#WWWj>YM&p%m76z@x_%#F5ql69Z$?(2zH~UQh^DWDYP#F7C-QWOz+9xndP~ zFo@u~Jfku(bA2S%P`t}J`0AsZZD-L^&&usaTiA95>7*xMMW<_ZexvTyBwWC8!E9j< zyp7RFRqbIyN&VOtYBl~!75oL5Xeh>c%L~4Sw6S+BE?47fB~#aCpZ`M*_i_g8elGPLCW0|=!AO-z z@&dP!{4+sF9m&A?cXiDikW9kkoMMJd?cdMt`lHHvGmhsS4pz)gpU76YINMx_zQsuj z*$j6b<&hQma-=jqlP*t5h%R&lD|U0wDXL|aIKox(i{^Q5Js3nMq?kuuv*KYGm10(b zZ4?+Rts?tQ^QpViNRx+W&+I0F!Dy$xI_5#AGL%7Hyr3zq4Gc=dd`HgOgeJ+CiDE(u z;^4`ye9^4=Vnp8ziRR^YB+}r$S|vL6lzoL>Ho&)V9Eh`;0-GAgU4|VaBspEPt{q)b zDW-uz5v}p|k)*Tcwu3>Nv0VQnU@)8E;Q6^M+vSftjQrZ-k4Vd$$u05GFFi=nMDHUE z*J0qHwZhx69IsovIw&FztWMf&3pSPZysw`=K;u8AOBk0a8hDaqZb~9Yq)yh%K32qZ zz^CxlhtYs>n`|t{OLd>-ic1LS0h=lvW|f&MqPLWO*W)?Kr@#ZGz9kpXqw1-!eFS+V z%61R|DNtu4Tx=rngDAiQeaih^oPg366JMPDbw_F(%I1 zK053V2g5ZF!}_$We8CW>ew$hJ1X!`9igbW->U=wGv+{uA(4Y_uvgVHnnTH9}iv@i3 z=GtcXRJVdiv`M|wsN!KV(OprREU=<|h=g+Mjj`=U){9>6JO;eRBK~>kOR;s3g)A)1 zX6D{LGq9q5ZBBC)w`{M#kWj(2M8Q9+fm?~U6FUeGKQZ`D?WJ6u3s&qb*cHNh-Iz?6 z9*DKsym}4{3endsFvJ_{hGKG$9=l}*UtzJ6Co$%bK=e4r%B!Dm1J5A!S~?{@-{|gO zBaZy#(%a&L|RdXRKsf8gdhDnO^O|V8sij-ZoQlCa&g&ZV8Rv<=$YhGB-0p zsmD{92lY(z+%fQVD_^c{r{eb*!j+3zqt?+S46tHZpg%eLQzN7>b!4F-1+3W929+C0h?jMFJ5pAn8cNwJ(cNK`DS@|9Q0JfZf^v|#B5T0euyz|f6>QHP z>o$U597M(kd?KDbA9EdpCG|PBv(OPmy@)Te#^_`#@`KioH}3L;$yu zm8J{eg9lg@xaYN<;zjVJWtS7x^Ik#5fyhzp*j(^a_5i#n~(xR(0Q4Rcr}1 z)tF=bB>8x>n5CK4@>pf-z+j#GXKsRWp9!x4&tiAY`7|(?S?n?%LaEH6NCL5q1zY05 z;AceEkPCwv;SjZ!eT76|gF&_Q`^kUEBQI@(#pETl0{Dk~w%VvLj1VXtzsj*)wWu%# zthhy6lDw7Us4f&}V?%{wQ*dxc-hmU^=4npPZ< z70JqRKkrJpSj#bQ&Lm>`7?h* z)5Z4^vpZE_@Y#b0&;Dt-xcSD3=H+IJFX1ow(7Ft}eXn<~BPQN>m;d2TDOmA2et|#q zr0(=H-s%m1r7yezg9GskGbOrCMR@8uh9|Nq;Bz-?UjjEP7Vy^7|(sapLZ|9u-6+`I7S_Sx-id*2PeUC3$+lYl|~ zTik{N2d)34-l#Bc?OXc~7>v1^mdAhi>3;n6{rx-N&kTXVwVnGP=nYM+>3ijWv62%5 zZ{z+ALmQ5Ar&cUn-Xq;RTlyzh@rY>e@gds}(M^@nYmdGuI{^k)?f>xbUfe=k*oWSr zthT-LVDL(>vzhS66YHM2>B`u3KVVSz?=K@r)a%0aal>maO88)K-1_1zVNgfx+T0C$ zZa6Qz2ZOFP>m@av@f&h@^YoVYCGgPt&tIRtja~n{>jEq1Mg04FaQFBjal`$MuY@@- zh`SbAE4LPdP5qFazTrZ|asr3>pjYvnxDyQiAaVbW8}mc>sy|~L$0bL<0fP%>j{~Yd zOqy&+pAr7Ka2M`#{!{M!zg5hcNDx>t(n_@ksbttx@&|;N}F}^Q_@R`oPEo(fO|DTqs=O&kf z6>&MEn)M{vfB*c5%XWB~68zmvoXT9?Nx&s7D*!7V!~Q%f#Sh!p*3u_@>x$q>O9w;Q zrxV_CRQQ1Pq23fXcrd^5FV>+3_PK4&{$p5{h9d@>%21T_4KCKIsV9RARY%G`B1@*1 z+HIPPAF7nmD_v%C9Kee8)C(A{olD_V#IwpY7AX}B5|v3AgO?77PPyu85$QhgkgR=Z z@NBi5xQs-I^OZGl_kk6c$Vy(L-Ei33r6V_bXDr}*5%b%q@;q*aiCR`cU+=}&2P-nl zxwg5ELjoJU=>U{;DiRC^pnY|RXZ1&)O7Fb4nfxRJ3>Fz|H}@sQxHN?s_{-d=@RgQlI50T&+Z>rAb-Ga>KyJV0MUjHR zGtA2L3+R2cFh9va9LFDC-OUe4i}XYndSM2la7{Q$G*}UBn59rJ?z6oupp6C<+Vz1! zhZ*z@L0PYDG_^TM)#qRc1`D~ACXS2NhA|Wspz5lGdw??}a*?Ljz9e8#dhRs73+~CS z`(tV}@(k%TPU?F_G%5p|YK@;pu$~DT8>ymYr4J770j!2ya?NX1hvX^646Pn@1gyAZ z(6Jl$`;c-)wtu;_fDIq!g4}IG9_W^zT>_2ueQCMyTT|JJY=<2EB7J=m1A9?#Y5>?& z$0CxWw~e2bu839I$RpK(!OCRZJ%-L12M}fSQ7#=Gb>wN+Vo#4nm9wWXd{%m21z6EM zXMHjsDYmfAa(6Q|M4tqM1u;q?|D92qYyf+HrD5(8FeoX>8sdL$l*;p=?Vd=#0-swo z_Du3{tqEx)MkTtiKnl<3^4PiYxg{)*^72a8+fz4n zX3(^(lAPh0de_`=O;$bpC2w~#Wwv7!eiDdGjD`RWK;R3C>T)4az4H2i%xyGo`C zUin->-e&Y!-H;nLx&*s6`TXP zBk)+RBU0(`9hVY4(b(srNToanD;DK3~gnO0RCl7#NHhaH(c&5|a}`hbK1f4S`1;gilc(C`UznCPRf{ zc#PD771_n>3<+}7zO(jzev=sbBpBRc5&r!|LTBqZ-8;a+`V;tbEb30Cj5|gqHwe(l zDTO`oDU!_;X5e9e)=Y1GQu}m-{R^8_;%gMrwGCEk_$QJ0zI zA?qTV1`K-ie}3Q~D>XYJHk zy{z$xZ-nrybxoHvxUSN8ANA#}O4e~r0@zeHY(HaSqm#3(;i6f-?`C)giE5BXJC);I zpe4K5s$1yrO%qNheQKi}f4W_TauFpw+KdL9`u*_g@m>pGE217ncsLV*PakYDi9`BX zxpJ~}8OO`b7d}2V47e^mYa7RyY&kO#)Ra^LHkF1;?l0aqYazM4ZLE(t@GBTRiN9*; z6iytmMBUV;G|s|Tt_PQRbtiApru5Q6FJUg3!dE;a5&az9MbGFi6vqD0`UZH)!s|q^ zaJ9wNGvwDLwLds4jRUvQ$+^k2MAPYer|{j?JfrRKdB+aI@+@vzXQ6YPkmcK93jeIU zJDj5$q+xxlFXd9o*m4QjRBc#5Ip03iB;*^R(HHuT@cHA^VX^>ig<%}2kIY2;>fuRC zDr$@NkawFcDd4_~{+$*Y+ zf)!n&Su+O~-^*cCMP4D+n@0G7T!uUyJsc*cO^aGIddd8F6u6DrE-o!!(zi*gX8l8( zzg7qaeGC}W8?O~5-u}b)O*xgz#u02+seUUI(@)u0OQH;ES2?J zeP5an1{H@r z%cVqk=3(WigZFhOucV8opDU2Qd;+Pt%Im?gj+^3txV?gHcKir<8_y$%UI{$Rz`pNAe}ymZG> zOSgvK5}U%q&b3ZI29g9LZP(tgp2y+j17Jm0LyzjOjf`KOvMP}DL?~^*V5xyQM~{ea zr9O4h9T)x)ezpB@Yt6>&dnJbs*V|WhCBwtc4BSY7MW^bTLwMQU2Jr^?OTNhl`{H;- zkp-)~as0`VmGJtU+_9Y%O!ZIfth%@kzXA&vaOWs@riA&GdB!Pm$4jnwX2VzKIcfeA zM-b~$bOpy;o^Y%etVp>T7J}M(ec7_mWG?piGWZLyb5a>1b^3Orw*8ZDPvm_>mh7Ou zSbJj?!F??;A^M7E!UWjV%G9xD?Q~Vvks@V)yQ~>LW3_FF6&j1$*U-rq>XmOXF<`}m zR7qighXk=gFw8UpIPlRwnfVD=ybpd}m4TOAd`p4jf`=JHcQ= zjF*`)8tv%AKeIv}wap3)B8c^5EzVzj_?l9g;A#aA=8xpQ@L7G2P#{RY?Y~>DJHQ{W zw-iOdkPx$^I3qk>&mt=mMbsl92pK_=BL4jg(7E^yboHG9^4aNGb^d_EF-Nc{Ef{Ts9e;{C_)kSwluCc8YLSyzBG6Oc8N^a`rDu#miV>z(|fzb;*NuUb0{ zPj&pajuf4V9H?lCY*`N#ME-kR>;Ij?3I>nAa5kCy`N}i1=dZb|JYT`b)wVFLk2-?= z7M=FZerv)@__X8hDYMmUFD_kR_414_nEfpQo7(&A;)6e*w#*d=aee2FFFyf;(i^Yd ztu}{*@Evo$LY8E`#)TH@X8b(0_5A?bFJw$-TzC@{~V+XR=n}m z|31P(gpJ+-ALUMzhdtO>{pzT}SHJ$}2dwy2jaS8ZdDueK@PgyJ{h$2^22XP(J{7$+ zFLSJ)RNR=j1)u3&rN0)oJ~{Wz!qdI`FB(3AXApbePnN{nNF~B&9}Eem@o--yX)(Q( zG*FcqzVM5F+<}cZ!EM}Q%AC8rKhdn~RqV4zm-oX(X0P^-siiPXK){Pxj8XtfBu`lPPWYD6HX0X2P>8*y-6H+cV+ib z+rr};^VVSJh?wy2oF1G0`sep@UbXHWg6ADlcmqMW>6Wae+ zQ*+%i-mJZ1@-!HHeP%{iMI6iTHGI!shUUYc|9=n9{ckntLKj#Ou}9my{=c(V)pKC* zKL@tX%Gs=abVdJUp%@GZ8Pad^k@Rxn;7^EnUH2vmyIT}%eI*2 zNai~zV8!Y{abfzRH{{)=vWoAB?u)=+uurJXds;iTZYxV0cHtu`SA5x0x^)pFhiI+R zEcf)A0xRYceG7fhdN8J02p!Sm!yWmOMO@!WdGwxudesb-KQaSW4As@HPP20S8i+@` zrngGrbMnL!XMLO;eKzQu=2-^S3)EmmS&7Vzta_~O=F8eHnHU@bgLVF;wHFe_i6g`4 zA5qjcJ{Wv)pZ|{kdvlT%mE4Wf+N6R(Jc_D7I2ctQUmPX*G;u2!Bo_ydGQKmU^3j%} zk=TO_nhwB6@+vP)nv1f2lvPFF z-0CYS1}mm~ruued{EDP3G&)pzJE0y9>N#=*O$ajEax>VpQ3;Q%h3K}H{+(G%>G|e( zdeAmJSaBkGu0-l!E$}PA6-W&jv0%_~fU3IS!W`vOEKKI7*1$cv+OI!Q*mc#Wh&*dy z8c=l=tXNQC+@EC<##O~w4T?D)@LZ=I;z2|ZXLS2f0WEp38vY?a^hmEX!jL^aqwGbM zy>5c%$XFg_;b*Rri38!N@H?Y+aA$SE&P$&%kgT*iuv&xNTDT3|IX1resvLsGA=|eh z$8&}SevW!hfi|il$FoN~K0{D~ZwkPInzX12=lqrbYae*A}3m~@s-q0qVZW95g6q89Zel+(fqNb zV4`GuV=vsT_SmM$y&Q%7={uY9C0q$K_VWsMJ+3D-A&evq^Pz#k-PW@Rx}1VIl}pQ?cqYohAT~|>C>vuI zZB(C%!4J#hz#v{|A#N{MzQ-sS^{8~p0WhebJavwt6y7e}Gh7s)XuAXkPxeP@>nij# z^a+V(ad0C%*PW(2&bpA{RN|;E)dZBKt^q4bgELWGA{3@RYlNXYr5s-Hz*ZEwrEW*J zU#XWxALT{EmscEw_K7Wo;w5$KmD*%NG<=he=>)0IULALYe8g_hM#T&Px6x<^L-sl+ zt41g+_nHXQ!qf6swPl&%BFc6p%RVpMrUm|WWYR@E+lD!243f3pvz-zNHg)6^^u1E< z4mDmIH^->?h(oR03EeTF+5^I}bwpW&X`TwKIIH4X=V^pJk{J9o`wpwkU~n_t=~k>$ zl4DY(B)CN$4&UNUCUlKl!fJWBR+*b^5o>R-VmT6n*0U5+(A8Owy+;YJ!C<}3iBk!U zMa0*WDQ-RX(eMGeEH1yR^$KP*(1$}k=}_YcRt&&QSdWjX2#r~Cbyqj;VWURhvvLh9at~OMS!5h3 z)?MYjR*$=QPJJK#A#1v-+au!USl@@c{6SbB1)s3`RkK^NjLf^_15b_}GB z%q9~LgsK`lsB>w-)?n}my|)V~_ARD6c8zvc8;66zB6ot%N@C}(D7(G%a^Xi5JkVA5 z^_E-BGG=8iMQqw=5?E0@dobt6A3f85JQ=IFy2%ip2#&glcSXhS#4FGG?(t2huLdiQ z``CK~%F{nTGG$H3L|f^BLGp(&@r+)#*8y3_u-3^2?pO00HrK7V%ge=lC%*Si?NI?% zv>TxJu@BRga$mJ&?@AgQ4E{kp@LW=rMXa4>p86(h{~0i7l-?egMV@Z!QfSYiiG!nH z(3feb(&O(Y;Ik0q&;}d}45D)geg_?Ai9ZQMYFg$LJh>7+mVzHno%6Dcs!ztGuH=9f zcjb@=tmfKnW>0<6Dn>trFLy>b`B7*?t=3jixzD@HV|if36pB`Tziut|w+l*L`N~IB z5zu{Os{(hAiqT(K`^aOBlXeAP#i)+J zV{*nJj#%m2f5Ct<_Pu_98vY?$a2!X^9N3Ni%esM`ubEm2Zes^!W2!5LeuX~KB9eOK z!oyB8leMf?OCuL`pChRmhl7Wmx#P_9xDv@hi{jLEjI=ZGmptsA7k6tzes2FZV@3fr zY6RTIc=^}Z4Q#VK?_Ofcww-c#veW*SsNL1Y<|xV%+vcOTehyZ&APJ)endf#bqLj_L zVQ#$ygMy4=c)cg|tam8k}zM z3Sm`(LGpL_r{Xi7JAYx7m!@!6MuS0LmvXD2@@>Qx?+8<+>Wl*z6w>?n$0kRLjdVAu zWELJmgF(Vjv|E^9q!G{3@UIIjq+l?>z&aCu1&L91I~$e+xWK~|I}x_uWwUXi*RtPP z)WP%>U`6>i(O+gbt?QJ&E+mPwer^JT0bN(``c7yn%vd>$8oCyqKRXTxHB9X! zMXCCZ!#C+HkJ4;bHQ%-fRs<}^>WZGgreZnl#%YEkt(L8?kFbgnFsO7N@69L)P;+fp z+g3>v;I5-RD9T!`*rD5P`3ddmaz8LAT+b@o62%hsdDZPU@5M)eL7eTGW2ad` zwbzKQp>_R7;FW}9-hsti#zW){0iL|Wp9UA)?L zvA??sDP&ZthQ|Q1l-``F5L0q(^&Ugkn;iIPr43Fza=`cn569O=PH6hzt4}x7vi29{ zEd+xiZ(GwS_XP0cV4Nm&{iZGdHf$r8(%in#Cnl%T{AjL@X9nY`H%okJ`xja~b81H5yn3*`BQpISy7H~e$y=abVNU{kA83OCH>T^rG%&<7ZN-H5H3DR7WkdODOpQ{y38Uc;6`)ntZT3 zDd&A5?=Dp#jR==uvmhfZzo4*$p z63GkS-vTR2&OUn{de3Tp?%oZ_Q=a=bIs@sAIA zzZeV$ygX;R@ZRw2O<#e*UsI{i(l>pj`}y2kngm9J-1MG>A__%SZB(-E^|G7r#t@tWADwwn!2_>?wxSN1S4iZOb{^> zVGuPWQNf~;fguoPRIs*Xhzz~n77<%eDN*qn!W~m&sl!{RktO7WW7T4=!ewvg$pn@b&7lSm#l!v!rI^JoVWhW$1cu& zxAgO;@}DNht*}04^yKEpm?P%zm=KL5<^SI%M$CqH|J;V!Zyvcnuux;Pet`q)c`S0% z6<&G5|CToO=0TCJeV7fEdxL$Ca)!;@V?&z%+6&oR_V+JzNEKLLRR7l=+9~s8aK_3u zx!%bR>1=$`iv4MyvLBgGlzWSOTV(&)$B6kDtxx%+6INNHF4z6}6SJWeXATo_On{%2 zQb6<;U^d)9Z=Thx7-$(tDyPOvG|iX|UpL2RwCp>;GMW$Pa=p^AUp`Fv`1*LYanx6G zI|4^jm_*DGait(?C5Io(o&fa(rV4wP0|k|eP*Yo|R3!9styN;LS5JDCB{xMlojP7! zlQVL8VFBi*I+hgl@3HQf*~>O8a1gxXg4r;mRa_C_meecwJ8y%C_xBLYhD6ubh%iFy zQ7j3R`noU*F&lwxOO$d zv4|m>9#C*1RytvhxPeJ-tCP$->-A8d%5|4vU+b9m+s!Za8l52vmZVYo^>vsd25T-P z6?xBkOiVt+aCOSVUd;1m+Or3I8ExvN_>H&uChT2K>`L@L=wwcoau(CPX-w>ERyDeo zGctT)BW1EyM=^wA&j8|88$9^GKCz~H&5-$amfj-wB^)^l zOi7p{MotS7+`nBOzA>w(z`2BKkJ(TbqOWfAvS;_CMIip9m`2Qo>YENqd^}M$)#goQ z`mUm2HM9VAWLA#rR@X*(N3JUldzoXxUt`u27l{{@I4EU87WPD*xH)df=ZqhttvKfR zJ8PY1Vr?mK8aZgc-)#@uXScb@ad=4)W<$fpaGk2wV@ zb$O`e10)@0!$2aH;6k7^D{7Q_4UJHN*>E(;dQ)B`3vHiqq+6`riG4Wk74MxH~5E9!jHvK?3evnc%+X1s-?in#@yRuTz6UtO`-?0n~Wl$6A7D!T^r>A-EEXRv7(Yf1#nQ##_W)~7^by+lq| zxo7CRq<%<^!?j5Ua|>p}xTM3XA`FRYQ| zR_NJ{cLN);Z9y z%v`V%vmu!^wo%r^_Xs89lTr;T?CTEXwWQyh#x^%x-}EW9nK2i8l9P-j*ORtMJEOQy zFNn6ZVUK9PRzK9A?cCdyO+H(8F5wvFV^mMdN6%)G;?z~7u20Au56p(#D>8)NI{M+2 z^w95!J>+Yc4eMQ79i22h{1*r)>tzy;U^d+2Qz_PV)eF^C+~J9JQ*oFLvno1tX=5DI zrV@POiGWz_iM&&?_(wKRc7R(e+A3dlrW~l^}N@{F> zz;bE)w~~3R=53fuc_5c*OXh6yu$Qi3EteFlv0v!gQAG3K|B+KEoAU1W)0X&QK1P4>b=wd`q*qKb?l^)EbkPwSan*K@ii<{7;z$PneT6?0R? zol)NJKk~Yg60PJ{@1wS1Haw*7|I(e->w%Q}G0Q2turDCWdn8K3rs)2FV2&v~EeLzh zvA0*pUY+z@i*u^coHWGvU~cNa)!?8}6~vurj%E;ecsXXnaf7qxF~*gwjXrgYJ9>`! zV>WDM8LxP2cf_onGh=yDpDP!$;nAf9SDlZCd*An3TGX7e5&O#HOPRlua3!+kNJDOu zL(@?<=7{c8j$S_Fk0^)woit;rqbFuVS+#6}I3CT8o(3MsiNEj~Z&AsSJwA^E<@hCR zNyhE4gP0>~%3c4yf}qW4Pw^JGpJQVmkCE(z$3AKClnZw3GsxCp>@U(7o#JLIf~)s9 zj`2Tl=J#R0n5%ISU8Od12*%)QYKsDgy{}eqD#guSw-qt270ue53)oYK>mSt2+s)R3 zMO-?4_TpdIN;sNL|ClR^;uY>m+NNAq{Tb%d;j(OdnIR*7sivv0!L>cFOexc*Iu33F4=ayJGd0LSk+&9!dTyf}{8knb;8 zTqr2rc~DFhZ=7*pSr|#{D^mZI#Cph5CSqUD<+z@ZeEI%5ujL))sMUvs zn`*i1Zhe+fWd7^yM9XuT>qX3l=lKsB7QTA-KZe#P+hI0*6L4SN!Iz?Ew75}b+xwUe zx2`z`dd@%pj+!HdE0 zd`k=V8F_#HfA?kmce@qlh_9nXgPWrAtXt)Nue|lN4)Y#Fi)FF!pARZO{KSX8OJkRx zk2&C)&tA+P+A-L@>H+`HH}YaO{Q0qC+~S;DOI|E3K9u~`gFMWJ*V4b8oNs-4ns&#} z$rnHVD-U}6@U{Kujr;AdY7aU7_7<)fb407%*!hv-4=tL#oikr8PseO{|JK2gv%-68 zUJdP-{rG%0_WdV=mg!rnZGpj~j<}Ts-yjo4;QCwqffW%n=*v-pX(1zj(_U z>`xz<4gch~{%hLuBI(JRpPv4X*|4+t!NdIgUCFN}b3aOdowg9O;eE?4%jo8XPhaGh zJbTO16@c0Bt*KK&OP0y&0BPvh1L4ouHv_!-55IHhQP;Z`>l>0WNBrNbl&x<_UcH96 z6?=9ZTzqTQ)S4TA9DlrOYQ?}G$1z9zlYean;Nz+7U%U_xVK%f3&RSy;xmsS1o_hW8 z(@D%r&lbz?-`1c1ZF1rH4IWE}><2LioGi3H?9(~l!e5#EH1lNrBg}@b`5zyA(dLrh ze=7fx%f~OU-wC|IdU5pBZ}(a4Q^{9P)hdlxBU&s|x$k8z{N$V6@BUEoucw_@?ZAgm zu1TY;4>A1Tvk5U9zRpUtyxbLi_sQk2E#Elrz&wvzET^O1`)>BPzYjnC$#n7{_T>ue zQ}+VY-2XmR&ib%8%q@NM)V&g&a<5E0)xVHQGL&un?q!kH?#bm4z0aee8TuZ9dPzeTmcP5vH z)zAVa2t}Fh%;of}OYBCmS^+{OtGb3X5PkybBJRY;V_!QYcmhRPScADV-V;Z59>l!L zWdZHU6snw8Ne??)wZRZFHE5aNQGNHMDL5 z2o}^4g1PEvPD%&tIfK#{+7KNI@GMV66$x-$tnokrS4{+n3IKpm)kzW9tD7Pr*Sf`} z*oc^=LRq6=KIVuLe^bQ(JzYf(W`3qkm(wvDmh=GcEqKqfs;D_Ld_4gRv!Rwxvu-#H z_rqCVqgAe|#(ow(J!-hdYAH$6(^P>IP+Txal(PnKfJN9;O+y6xsB^n88-iRWK3NN- zexQt^_B)Gx6No>1RF<>{jN@4=W06OF*w;pxZ0c!wbWlJ8DCF%Ek}%KUz&|jnasNC! ze4-?pK)p!7zR$th-B|8`Lr5jY5!=HQ)tJR8%}K(iQ2D_m86y*J|w-#{N=NUp%MSD`;Uxp{D zupXiXq_AUl1&`o}Dib@`sSK-~HJ9?It*HjjO)8f#B?@26hN^EUK;fexrUwu;?iwNH zbr{^zx;g-KC3HZ<9LpU^(jWN|FnQnz@kjjt=8aJ}%@pZMmfqjmR}kh2fH|33fWypK zwQ&=hUrUX^-p!JfDnkylfXiKkPf{y+_Lz?k)LTzALuH-UM#KHMf8nJt07*Kc(Bt@o zF0csT5X`yT0`wAQg@`65#*pPR-XmdcsRhU$Wt7>+A7+#;dyDcHs;`m@{N-g61^A9o zs(^yIR|A&yJtzo8rOh(6$6GTo_U(c^rVvkz(ZBufC=r<&STF_6`78Q#em#tc(np1RTL#gZUV_JR}Jid*s%ag5tN%UFwe6 zu>NA0StmyN31U-ZDc2cbHN?rvWOK>tJQcv)L)S^xML zF;8INjfFLpy)pGMTK~cv@r~i176l|G08-52;N1U;{&skV5#Y!L_??1;B&==2MQOwE zgu7)3GcXw7HJH1t^^%CH!XwW%w@%9NcO!x@hj|wZIs`v>Ym3quV*9 zVmG9>FjRJKsR5*We|q=}r8EH6Hd;-A9i7~v!kjBX8J<65ASKUe%}Au&p2s@Os`mKa zrVXB__aVN0>`I0Tds7SkjAH~rJRt~P+K1T?*I>VeuJyZH2kfyQ-Y(y=$HJy^|GQE* z-++HT#D4CRq^?^BegAB0*_;2ztji!EwDu*jtRdekv!2LttcEyWYg^y+8aw+1FM}}O zlERGwJME3#>NANwnMUljCeC`jmU8qj7+3&*d8mTw?_`|e%foz3z@ERF9c}GfD@oV~ z0j*L)yG@QNBdqKXKr(MfVT}gpQLc1la)1hlmp#-x3N&Cf#1UGjkx_skeh&)v_F}cN zfD=v$UD7>cF;fj;dzWWnwF8u3WJE(5Z?Kj892xI`vp1 zS^%>F@lchFQnT&;LXr+VPVguoj$)qbaA044SWPTof98Z_VvXgG zX{;uA3mGel12)vAfK36L0yYI~3fL5|DPU8;rhrWWn*ufkYzo*Euqj|uz@~sr0hjtBvO@XVu; z$C18IWrW_KR1;B}!IXVqe^w%?te|MPDjca*&)ByqwDCaGS06=gZk7%TUDNQjx7>+U=pqt{&BnNd- z!+nwsk^L~i3l=e&Xj)yBK$#S#NP~~X0*oXH@yKXGcBqpiDjxQb5lF%D3CNL7ejTlq zX+IMpa2rynzE@{V7y%#{fgOq%=>Q)H41olWlBpvP;u)}uL<*VONWI9auOM^*{5}`} z_K^xrR;;#t$vE^O@Ng&#RVI2Ws^`t63~Kh3!h}ezk056c9{L zpj7+wrx@gVh7(Ne4oy$dtVSqyRGJ28b6Oz+hqQ84r*VG3E?sp5z{d}Gw3wrFai0Oh zw$a^)QD>F7h(S z0iY?!VYEmJIjmH6gh{D93=z0@tsT?aEhV!85lSKSG2r7Dakpq@Y*9rTAA>i0mJQAYB(tC3MH1YvYK$=C>ZaIOGGBoM6Asq<8FmM>FHgyjZ?VDck? z7-(WrCQtiTpag0MF6)Ypi7Z!9Q~=RtKp%r-`@=~J?G+_?VAvh_uxen!pr~*%9w|VC z+MrQiM&o}fQkOTy*MCbXa2W|4K<<($)_jSKf*w-wfGzT`W#iJ-i*mS~U*4XF#poyqeI@%+YMoz2@%RTU8 zN}`r=Wq1uf3}x~WgJO5z%=Qs#x6?$23T5U1p`QV!ULP2&4+a_>UDO0M5+r&NI3BDp z1EZoz>h!qF2ovU0gdG2olU|Lrq0tvQx1fxWgOV{n>VjFMP;*;p!d-19>|^A3b;N;) zp1%96>LuoP{o(El6y!njbhJbnXCK4|JYp#9qb(HC_!-G#jWk}Z=;lngBm|wzV-8<5 zHTKmb(Hc{0Aj*W^URRTecaw6{T%2}NHuv9zqo_Yv!4k;T*U#>hHGd#Ef>Qb1CHBkP za}Xl{K_@DK8(f0|yw?@|SqYA7PKlvJuvefFR~A!Wb`~`DWrv98>Mv}E+wp3KIm`33 zOgFcQEOub{qKwASHWismCPoMI)O3UIK{M>b)ED?Bb@Jaz_I4+iq?%wtmMyOcH~R-m zW4OnVEy7Pyy?R z21pXV6XjSQ%Cwtx#m&P$21VHR7Cp+em!^}pHX9gM28uNa(zgmwh=kn5gc_2W)-7O~=T7lza6Q>{m4EdiR5Gcl4FEd*e zVOLNK6JAZ444v!-$8S$_cw_HsZVq)3^c3x#7;hs zY`q+S2!M1_{5A$sBrpx~exV(sl2jiooJ9>X z(L6qbqXdw&^F{Q{y-EA=$e>g-2@}k7M6#G2PwWAG;xcQ-h6xQbM6in)zNBN3-Ic#( zgg%4``5*TCwN%l7BO@ouTQ|;viQ}QurgNH%_YL!#``p$^nqh*GT#HOrdS?u$1UMf) z*0mlcMpJeEgrw@PWt(Zg#Q1u+!vq26HwzivY^}@K&h4Z)XPEdLAMj}@(PPS&5uGaN z+qVuT3Vce(d`8nu`oS-_{iGt4nPrIdIWG$TiTyX@p6R2>SN;zBxc&~w#W_g8y%~S> z9APA64or}%6z|h1n)%{6cmfW;X%r%G08f6Tp!~w+sVZd?Q zWC^p)6MG**h1y)Z$q+VL^rZ)Y}#5!y|yv!XA-gn-!6qwjd9 zsYj8EYz_A@z{E@?$ns{%Z^yBPubz-ViKTw_-S*Z7jLP>o+u;2!ZKd^t}c9gSU*}>fsdJ+aTGQF)uwn&5)?hcx#I#!e8xw1 zcB3t|n}h!bw{)1|JD(=&+a77}f0BFj(=TAcB}>ue^ly95?9WqVS?v`fnAkcb`z*|n z|0(Z=KVWhPP-b)rUe*|l=#1s@C%ach+9$w1cy&M0O1ivf&<>AEG-ns0EMae(y;Qe0 zr@Eb>wr7auMx*o~mxz^bO&&V3*QsacOjb|OA~?#d#v(jnbmAjN^(?u^es#Xa!ngcH^v#YNJmOUA%7oCxXwML zj6QsjWlpbRv@=a-V1ksYuV?vGhI?rRZuVaGsW7o~BUKScKcFv{rHt9|Wy=gi2Dm6bfL2C%=qef4m~Jvnf4jqlTPiJ)Q@4q|Obm@#-@Am<0~2)R{z|{# zWYQ18S*sCZ_B${^xVVm)`7WMj9BnJwuZ%|Nr%j`I$WBN3dS*~blwT#<*_R{Dvc~bH z0L)lwN69~L2S?fP>-@cw-M{4D`g+cT8}G&r!-Q9H&EcrT*{fe(ePtfaxr}mdU5D5Q z=RRI|Q<${<-s)GvPhcNEBTIcJ;~W=;9r|ct{?pn+Fri*>-c(zg{Mf(b=+I9qez(BH z(fm5ukDm)Zv`khWveZ@OLxja*iJw=K`uxgQ-{mdYv40H&fCoF;9fW<%5RF}ZZW!IQ>BVdM z)ki);m{=o^67HIL|KuN81OD9Z{A(!0oZnqOxzW`y=xP}q@OlK7C!qcH4X=>myN}`` z7eu`}n~$=9D2%cEWA@{3y0`xP_{7i-({(t?gRzFE)gSEm`6I@IyaoObP)eBZ(yx7( z*YNxN$xrA2*f0DL_EA%FRQSi+tCQLXcDX$fHK3e)-)-+IPrvBc<#fL^C9ZURAM9h( z)fdmToy9@NUOx^P`1I+}N!~^f49fO6d9t=Kh9NKa5)Xy;SxN&If3`_O^7KEtqi!vqGc7#?`*=i46CHiT z`={lO==v)D2uhMlta&hf*D_gX9dFM0KQDX$`nSPLCf z;x70j`==&3+@1a?g>=7_5QKEo2P&rfgznpUu#e%HE!>^F;hBwlH9s<+C{d>UH@}aW zJ}7f5t9bKM1^Zx4102%K&g=6U4JR2x5tv9aDeKoI>kk()!~$3CwGo(jbY1fmsZKMU zSu8g70)sP5_=-;EdAc8PW|imtarPYv%KB_LCETY*v(JNku_t9L^ygN{2ksXSuJtmE z5GW-L2fovclGVvo$Vq*8{tVJer<3w!KXM@#U|Pyu>7Qq1ZMP9+iFcNaGjP1RIt-r#Kp)_t%*Q8JImUN- z1_cBc3H7|;0F-tt&v@eIf@_wpBDnGjt1qKe$>z747cCjyLiaf2R2xv_u@*ks0};B~ zvMasIJr*YaO_4S7DNKYc(nJ{BDp_^3$g0FP{{o1>`4IuWn!@x8%_9|gOHihCMo;D_ zu~9SZTc%w>I*E2sS>kl9^<|%Dzp}`Kcp{aGa`7t&67e$@(`3h$J15K?Uj9%s04aoC zn~~m|RJE?;H1CjPH%y3`m8WZ$+wT^i6XPlr>NuF-1Arsry)x9B4bLS{&~8e~?WLQ` zi6r4f3Hc#GNIwkw*l*(OQzsyL!b3$$d`DyyOw8AdNmCT%qtXC4BTc`%nlawF3vm z8s!Gkvjr!HP&&}ozqvWx_x?oQ6w#v;2o|H9+m&~u%@@bn=F{@avvftoPAG~6oc>W% zoiT{V_xSWVr=kS;+&=GDPD6}V5nA0?${3YHE#r*^#8qA_Et;C;gE|;-yiz3@_4%?C?!tUH1R7pM zu3m5=#HG=I-DoU(QV?I@u*Ct6k^3YPDH-L4bj9dTdyY2{VB%qQPoaldh+xy(6w>vRLCvx$9>r3sQM(gQ$ztt*cm1 znhMy9N2%rxYHkG4_tp94+N#sW|$E6l4!~jZjt+E z@__G_dZA2$yJiOIr-V_0QrTDa(zTlrK@lY@fVY) zD(tuy8&L)W`zwBVq(mf)?DfaFEZ3F8EiDz)r01pcL|HTVk$_khm@A!p3BqDT_ zv>$THG9P&e6TXWYgR~(&l(B8U_)~Ki6~aVt?R848V417vx<Jz ze}WRx!kH&_OB!1#zXSV_p3aLN{93Yi_82c?{U$j|;khZc$J8=&){OIJ@wJ}DUl>E_=f_VkaFyYK9-F(cgY6EA#>)Xh$tsXET z?YSfTsWhf31WyuvX>L@)gkM@A@;X@R{;;Q@uG`7$G)yp_$PcTk*N;W8sJWMCic!W3 z@)!U%PT()E9;Sy}jOvDcObI&=OU>!A85`A0!N7+o=Y=>vz$|k4rdX1q@7@)=c025Y zp`2g@WKV6BeaoTO1kr+FVvNDvg`7OQ7w7u$hirNa118FM3O=7DsH-VyQFjaqy_E&tFdC0Vru4LN&0i_xvskbXbz*xjvpglwuVVH)Gig!@ zOe_|=kMQ<)X85*@H!{-puwf!T`W$_W+&eR7x^^CAQR60<(2Fa!P$L|RME%LqiHLb| zFrn+9AR|=wxjxoSrbr`xB}{ZAj7FPdGa_k?%?To2uNO>^M3J04YSx-{Qsc#PLh>@0 z2xV8E_y@IjiyQlTcIbokC}%E4DQ_L!qFat^STBx0bs8mWhj^FM|JkK}M-ZAW`!wk& z%4#E}g2@j^qJ#yp#eni96QvYS!lxu|n4MM8Z9iw0-QHRw+|r3DN>gYJ@vC|Lr0a)I zno+8pb()>T#;EEH!7uyPuW@&shJ9Qrmsnp70MxhegpiF}k5x4we!#1nzaCGYMq7ICyl?sb=}!+> z=Rd3%QHcKi7;Z=Y`5OTtN0)!9@LSD$xcXWOOjKp8x_U!%{d0F=TzG!lhkw9Cb>`s+ z{z&+oe_b6B4iwK>0TY&=T`~_2w7KN}`odyesDA+wxQnb?X6q{A)9xkhhmt=*IoSNE z{BK|8SOlr3FVws=h~XXG;DT=CY}(Gj1yR*cx87U&EsBp%W_x;B;55(Vn{BR=PWL0G;1c0Z92bMcp z>?}KO*?lr(Nc{{ZcK`GJj;~AD1HWAJy(J{IqvW|>uLmbqKRrLa=Efi1=bmS_!9Kk6 zNh7z~m$cvie!-13pIvWO&8fw0+hc*S_Q?Oj!P1Skms({gMXWkmPeC##(>5Jbvw?3?dn{oHnll|MK z?^|xxS{KzPE?ZzC&M~B@e>|6b@A@}Co&VQt_}Ug+uB}dgke2_JUE9UX;x(^OPF(xT zxbxS4`(*F^gR3mRx(>aDqgd~zec{`ocx&c=7vLcRH`;omL1YtY*yLt;W8`CEq&rwC;t8VqeChVN!6|lT?=p&R7}B#sK{nA-*-7 zv4OO(CtDeY)pXcLpHd;UF8o(tnZ019CgL>8iMv;6-DygU*>bY1N?y4y3}wNI0LYp% zgW6dWYgdR1E-gl>J<<~?4vgX=J5xiRlSG0?S>WBIzV;R4q|7(PSI^R`vJOBk#ZA<6 z8;Ke2i1kY?q_9kssTOBlPHzdT^{l9vy1`Yhy9l`eTIH3HoXfN1wF@W(6VXzX$tS$v zHX-e8(jQL46C0fEgUqmxzR|WqcEbk_f1hQnDalwL2@}$0#ltpJ8%MglzTni6v?`d0 zWUqH756+9M`)+e-s&{o6OeAduT)C)IkV(DV{5>0O;~EmUHbz8mPE5-%B$z+kdmZ+% zS691Qou}_`jWg|*n6@o|iERJL(Nvn46JPs&$HwLUJec@Y+~024+!xTfz`ENZmskN4 z0};+O{19)ikqza!vbZRe3s+Yow<=4bWc!_UQlFLJQHnLw6PKUCBTj~Ak`zx$HIBhi zL{9awI+oe+2p=~$yhMyLuIcT>_Dhaxo#Av%5p`lkIP9ZjSy?b+Qxrle+f;p-S8@a< zdZ(g#LJ%)yif=ZRK@gxUGz%$Iwe`x{n-WN9p=UGeVIQ8s+FVvdz}b(AX0gO2O%pI7 z2v%QI?m+~X$~`Zy)P>_@n=??#mksgr+OM=_R32}!E7u4+UE!nkObK!M#h8?~R+OzPQKhM1 zLQhPKFh#ISDlhTX%^9E4U?OasSdlie7r$gi)1`pQaFh#^#LuquuAt~|JGUu#W3jSY z*oV)@vlE5EoLV2Dmt3?;b^<0&9~CUR8xuc5JN)H}f+Zy=)ye7^i<`V$M}#1a0;GNb zMUQ$C4j5$hh?20FDey`jg`=dZS4&Kdm6S`u!5N~XqbQk)J-x3jHSEH6em z7KaZCeZ(%2^+@&;uaooEqKvunDn^okEYQL~96zX6p_&=)Q|j9~)89*lWGCC9iU+50X-u88><6c3@g{^v{bmj9-_N@J1c^#If5a1|->VQ~ZU1w=T zXV{hWF>WwSO!zvP(gUpvR|F4x9WxCjk1^II9aNiTv`vw$=8|ag6W9m6t}M8xl$=Uw z3?Ph~8d0*PM^Da;;0?S&erQcec^3hN=t-Aqe|pCtC+WM(LVScnaFk`ymt$poac2Wp zSul$N0%3vx(hWHL7MJL&nny~-`zQ;vv0~jt{d*HadH>l(|T9=HpwHH=$BWJ6J5)t zlBy$l$ks2zU_#&~xVn1gjOO4Jeg9jeJv}hNtqKIls55ZKv+>FeMXfnzQ`fcNQ}Cc>A69Z)%V~gMBP+@_BlpGZMef@ZM-j3P-S^?t;Mn(BoDe|R(=gkc;K^!wjKe97c zF4Jc41RuJ7nAC5w#=E;(&Srh<@n8rH!VRD5 z)NT&)5d1yrLpTbO=djCLW}3h`7j_2&poIx}44pCi@uQQ$<~X)G+g=V60V8Z}-0nTT zlz`#27bCPNiU~D-C636^ij0KTEgVHJ1@_UV8D~a^G)J+Tly$O70ZKnT)^3*7dT`B0 zL_S?&mn4)`njaPYAWenLFwn}yo^mIYqdlheq9}zCQvwEq{r>n@C|5Wf^=$RJOx=_y zyl30IFC!MgEtUD?5+qBm$iCAiJFP~Bufc@Y)i68QCxuj%xm8iRWEM)rCJGI`-D|&z z6dfe`GISr)2>ZCetO9Igv=5;Xe635XD1DuD(brAAr7O#zdN;$jD-h+n@>tmfw|i#6 zuHv^P4f9!rD4Lo^f=Iu&9{Js4npvz1cSG5O5Mbt2`3Vu&jG6;_pNq zWJhum{Rk?47kn&!6^DCy+_V!;a<_2OM$H+Rh?<>!dMU2p3}Ir_@HHs}rGo9JUJ7_& z@9S21Vw2$Rx`ErU58p(ASHO%dC*}H8Ar30sOEY6=LK?UZ+W&I$$5o4e|30ghz5ex%-(o$)FAxy-0QG57UgJ9j2TR!`v90@Hx!p6vV0FmvF=HAKX19Je7&RmRn77H@M0mb zq`h@RT4!Ave?vaq_c83lvUTX?V%K~IdO1x z_YRmCczWWNaH@aB;N#iWJ>lJ}VB!JC+P|oE!hsJC?Xp-mgTsV%m-w#B`AEL>(_ar? zK98nYPa0$Jf0|Ffc#VgB96Ima`OCGpEWbYxzNkIag>r6h3SWMAyfEkWCnQ1Ln?}Pv z?ydM{XvgfwYl?4#<6ka(jZ$qn9(%d=MDosoCC4@nR)700NK~7pU$DIs44D_dj6j+;joV@L%;m}mh{DAM)AF& z7iYJktSP+^Kd}5fE5Gex{)(p&2hYEReYDj$ef@gVp&`dlZ^+k+=RAgq`zA}S^$Q^8 z9hRr+TfdyT2^00Y$J7s=oLGHK@j7?MxwHY8un;mW-1f7@uOIugzZ5P<>8EDt|Blnr zcJnk8+v}`{*@{$4#h_BAmClwwo$Lsiaw%rO{=LAe?}sbL1cGUJ3gU zcrio8i|Bi}nPqOP3yojHM9^M#*s+hrrgxestb@{XDC=T9SqI}6z)_YLdD|B?_HW2d3z9I(St!|3q0{DMt9XddFr{*|R6OYb z9d2nvWsae5Bv(G^sV`sYhM?4^ijkNVVS9tb^GP)Y7Zp_~*Oh5%YvH0_rWuuxg9F+3 zP(}lV-++tXeYYpM>_kw(Wj)G`#@f})DR%ir?d%!V%u@O76u70HtqmEJtu*qy>8g~t zumdcZP_HL`Ac=8$?z22&U&OvH155;EKJ?TFEiY;6a4Pg-?MJz8FpvQi5L0o~ofV$% z86<C(V%dAVKia9Sc4WkhkC7f=RjL^nuDb;WYyO?x;>azzHOLnP!hm~yz! zxd$>}BGRAhIaZW2Sg3yIa90Is1SZ;)aZ$c=h-_a3$mBSt7$#b_&9+x|7&_+_tS(tJ zFoklor3p82$QQWAOGuE5W07_P?8BTge$uOQGezk=Cg>RnSppMTv*IF3zl>}N%Bh!8 zdK)`o;%M|i$)38yX4%%U z_DVvzCTyIf{*!dH#>bx<8)3aIwF&mYt@PE434t;|GUW7hBB?N;UQ`@B&G31RcOs_= zrZ)0mg8tn?2_wO9%KZxxx9_z@%mQ2-Owb2T1)A4Jh)ztz zZX8aGM;i@~AI+4nVd=&b_igR2PD8od6cn9CRetWWu}DAc{meDk3nj|c&x`gwsm`3Y zw(L~qr&m6JiOo(a!tmLSG|D4yo+&vq1}3C;8aGo0_R`0=RTH`r8A`<#2pY&TBG?qG zc5BkL?nTK#Ih5WzoxBAr|E6y;KHNRE7mmU$eOu(!q4VQ<3aT>>oIuIRG0mq-$H);R z`Goe!L(c;!#5b~kyge%^a#*m0TKXR)e-QT3_Oa{WcAN(HD1Zov zvKaj@r!F|7jF$@j5Pn?=>4%h+>jTvvID8BHKx+Nl3+)WMsJsg+yb5~fzyyWMk2FV* zS2iAGsdk$_u!9L>F-4ovUeS0bF3K%^TQ17kH~VrQ4F#;7&hRLAi%evrT&ok>t%FGh z(lr1X^V$9`%BXY*-BipDAV#PMGLjisb+&0fJJc5+1^+|q+bdU@%o^wP!#+Hu0YB8yOg$Y5Dfira{ZPhSS=WrWxk@58Y&52=SVH>=_TiM< zb4A~T^8_RkzExz8(#JMzUhI)&xWP?}Os!$eMObu-V)N$hlo(C%4BKpFew zK_3HCPdHvIsZKt_y^OL7caCw}@O?ev_gQXLr%y*#92`YDpwu@eE-EPspmo}v=s`J_ ze#*tt?9lPR3GM-7e@cBd?1M72q_ZSLFl6YQL)2Yv9ft{S=Iuh+c3NjeMqD_PO-Gr< z)`fz)AU|^8OsUhU@PdCQ!anw2FDO%1K95!=s!5$fHA*d|JaDyYr%<=ibXtDBnBtQK z`?zV|fjBzkeNYrIAS_W#pv*6_8^!KE@j)UV-{nC)%+K3kAK`9CjpK59I??*A7G8s> z7AC4nR=(df8t$#l<*p|g#VFT66czDo=$Ut!swsbBbY}_5`k4CVf#wQV-+LVwd`@Nf zT@b@jmb*7)eRRRiT{j)K(lJ$61QR}SQ|lGev;nolK=A$&T8vA=rfVn_8z8Hhp(c$OaM&{RU-d35`R7L=>`^x7%2Pllp&G10B?sJx^T_93b%XbKWl}qy!+6k-PqX;63|Ln5>E8}aD$Z{ zx+fhsaTo&$OkL z#vge2kNzul$n%(3{J^pH`Hr9d`1E1PzM)n~A4}cWc>Du#wDq6J?oR#3$9|xd%I`m| zubjL6_}9muPZj(H@yWd(XUF!vxpZ&yT&|ht-XoB4`{AWoc6LE_^QVY2@4xKVHE8lG2Jw7}8cHhFNhcm7T+5dpV z6nTMb!sX+Fg2%V#ew?HJ1QKuG?O8t+^nUi2v3JSDxs2T)aap#LJbPgGT*&ylwm>`GPi;3&yuGt@cIU&(K@CX_e%Wu8QHP`E);lFW^qvKYx3A~U|MljtsOGi1w}$?80pjVRH-Ct^J2Soa z<6I2w7k!!q)Hpv8*%jx;U3+@TGM9&!-z@@(`PmQulk)g)<^v>ZeJ_7bi9F2F_rOoa z-$CB(&CA)N`@Y-q;^S{G-u$|{74l4<|2R8)5z=o{D6w z9m^i4KbQjvRF=n$q1mz}m*d?2e((7mgdq0zeHzQ0yXCrs!@NA&`vKJWG#XjkTl&v| z>}*+$&&}-1AW^Uquf!ka3KGi@J_eRjS?Xeqdv|W`HHZ&VRHj7!+8R6( zVk1`H#ApXW4HH~_rwf}UEgs?GhcTm&xpKm(%E8{wMU{h%Y53=@1Rg}aQR#c3j6?GwHn+S4HgHREz^O-l+ zZN-$JXw!>{Ao1RmTI$Io^c*afV8T`Yhd`pwN%1XCc~U8%9M5RF76)0a3FET-?8h?5 zA>@_IBklckRWlO$qH2-gJ38e-*u1JS#JP|btUxN`fD0r0z zJBxh6&>zQ`ECe+==@~fMfZa4ZfKiSUDZT`W{;x{ACz2+oC|7*ixFsK+Qeqe=$H5jpDU0Y&hsma@#&*=ZM;=DMwf;IiTR6LWbu{6 z0gI)%GI^F`2c&c70*AX8vTk5$8_T^1 zmdWJPCwN<|C1apQ{EQVwJ$cwi{%i=<+{?ZW5((PKEq9nT@|H$kl}8+M211ZEpReS? zNQ10>)VruQAc2l1Ft`M&JdKQTN!c(AS$lNn2}+hxq!aeHsiGR=AQ`CPemIge@Wl@# zrAL{=^Mbk)Ab}Zh4QX&Po^Bi>6-Jycfq4EProQGfCc-YKD)Wzoyv2|?3R9D$^RFMe z=Y3W+I4=hQ*)fVmil$>v;jHZt6DV9pgfG~Rp}2@(f{!ez@gVhL^g$wIug`|sYs-^e zSImTab6-CzhWNs!_K=8ol!Z8^ePw!h4+9cAJasutv?`4V?ekXh=6h*c!FH6{zsE%M zcZC@5w8dx}_VZ8iyzJ?Wlka;eOZ49q6N^o}eLyen4Mx`GzRqlnW^P}Q|8@4PfxeZ!zXASLW zE9=ZZ^k|tZasKsCkl=P~jLtged_p?O-PzOht2;;ttB&61pN-koT_jF#>QA=>iAGk% zOi41~+@>FwDYWdPka=IBN{u3xIJ>?gi|o)o&YM6DL|NE6ia(li`wE}X*S-PL$LJ$e zhWd21v#zQ8@1^Z{h_{UGSBEB76fwuytaIhwsx;6FsmPaJb;vovL)y_}e&rx!L`^VL z)EaeiQ2#i+j}WSWcuURKq4F!;`iejr&Nao=G(2b}C4f+@$hAi#=2&8dZOTlLph<}B zM#RZRU2{1hDWDayPsb?m>wXm4kxDpT?K?zO3qg(j`0+DS)X7D|0jf0A{d|Z|9_yxQ z;wEWc({?33DdE9PP=luvZC*gAFCve>Vooq?SRjF%rG$w`*nBj`Jf%>7%>hX0KY_jy zrE^2}SZ#{-$FbId#LuFzi6WCgmu;rG2er3SApP_oC8bwhTU<>m9}ME36NiBsB98yU zT<-HNM2Ul=KXu7^kf3|m(Hc*VsIT?!J`}|5bO8ymQ)jz(Rx*Eoe$fW)q%CC60I4I9 z(DRN4h)iURt8NGesG${=`;^dRUoSN~NPiTof%GxFRaI%n^d`+rhyKQwOA5%`aD`W~ zWuciaR4sB`>zr>5@s`J3?Qrz8wl&62+vTky*eTz3e|2zSIK}?2%{HZ)U>`^nd?U|? z=OChq>QMR{I^}jK@V970nG5Ot{5A7%6QewB9Hgb&?l8+R5&LrKLqSGy6@|{A#sw4F z3Ubr1ZOZP+Xh(NEq@ODH(aakcv+Mt*jC= z$)!Ern*Ih|*Ww;4Pmpj(k7ZzU5dQXF0z*@g8Zu`q(Xoso^9Z7PW<;P4*9?Oi*HW<) zZkTTkawobplbsU+kT71P33WWr!E4fl?3F%ckiD%}_N`?e1wLg-$=<4=JXr1oqx_lE z>;GtrBgHZgQ!IeQ>;AOwjwRNAn?K~5TQ?a|X#utaRWnN0ex|@*Mv~IG} zf=b4mF}b^QzjueL2-FyjvUC~kGh8pWHX?><@9qSN{6eBbjW`Q6RV%Gpx5^Cz5=!?2 zQh_ElVh5gox7e4R4iaQ(c+2vFrs*B$GGfDt+G`*|5g(3oZSnJEJ2Uimzc@nr>5lXT z!}APX8H!|uZ4v7gWR0A6NZUb1?zvI)9lCh(XDnn-+O;90BPpu1qN%Oq4Rf(wJ=hLq z%7&{yVzhT|RVa(LI|o6c3jwY__LfjB+(Jr;48;^f=7#(D{-UN!bPtKCe9TX>QUY2* z(GmVO47*ZRKQeRu&s0c^OB>3N#HMN^71L)Hq15W_JHsHPo`twm3}O37KC! zgfm}A{;_-N*vqx&60?z@#_j27UZ0ZHRAW*yBUBSQK%%^DqP{9~$H-YHUiYn1?^Pg? z8~4$_uE@`p`={9kg~xfw{KBF|3CLIk6B8gRGIooDc&Rq*>5TcKI+Dd!acbQ*byJ?OQzP!H3vz_=iEEAA>eC2I(-?sF{zV|l>xMK;R zhV?vekH}v!jXve#hVN5{A>XoWPA?+J^L)--He6i7_34*_8VZ#{!onj^=16M4RP+aA z?5|PU;RP?idRKre$!o!8%*vr zL;P4=n77$EU$TNx5OX0qVhO~Gc|CFKLNu}?fpUBgL)`~?9xfb=CK{8<>kp|ru%ao} z0Bnadvj3|6G@;3ddMmNL=PSq)!+djd#p^FzeqiPm*U2pNAU!!;>x~(0tj1JX3hINj zF_3snWAWq{Z+F!_d-_DuRTv((*MJ2PyKV7`)y7KT6xHMdhy1b?jh$xTJ|^l-@XHh zCExz`Zprhk-ltVnU-xa9w+|#feORT6=ky*qhj~2v#dndAo;(%XI$Kry-0G6zSPSLE zY!#?c75ni?6@U4jn4yoT><0u$gp!cC`^DeEweR2l@Z@|g`_=h&nvhxjU`}-N@mFs^V&HZrcJ6+D<*jE^l`Gcv90rM5i{HvG3yU+0 z<{p+fG|xeP?W=v+uW^4*=4oSg4TRz>Ait$@_~KLTl%*JLUGIx?xfn!K2DmC00|$%WeFlqf01k4P-MOK0wi|u`_0FS5LC$H zc5Yub7Q8Ya)Sz(Ib-%_O7bo_&6bNKnAx|uQOkYiF%%<$t4xjk3pv|tJM#4p(i!LK) zDXU2}*Uuj5X#@%C$kyG5F6@}kTNy*mcU-mIAg{L~3Jozz9!N+Xs_8SX z_B@{|2LifLn+OvAI{$`&?#GLfDZJ=yNNBc+S(K2Z9Ms1B&?d=jIu`|Ml;FN0h`GUw zFxoI~E&hNpNPO~ieM3Igk#ts2cU-2R-vNmO=$5J|#?0cP{dL#5*vS%*Xr0D4A3l(* zL--I-1ZI&bNaPwgz86|H*5Z0`BZVTDFF?YZpmFGBs-N$mD))Hxr(6e#4EnnvH`+>G zgjmZjI%oum`g$26@zNlVyBPjqDR%tOW>BLqZrX)IrUx5c4Un*28$m|pkB(m`#9juu zg9yV2GD8U2$EB;*G^JfvW6XtW!#C>#AY(r>B3Rax$JqaCpmrTQs0H#{RvSC}+T}WA z?ax=Ye6w(#A=pyX*j;GhvO3jDI{K&rfoIN8e*+44Ltt3#)=`y?e+6!F-)Y0f>Msa(lh=bSE!)NN+t1g<#I5SsR4?YlfkeB{k>cK! z2h&>ow5KFYdJRY%RSht0&70}FXfi?T@w1sAK{;^l?I2&h5zJLp&RwISUj(Jb9%qU;GsL_Uj{as8RKn*NCJ27e`CAxNY~Gj`&? z_Ev;A4~P_&mTZuqFW@!Y?Ff%{en~1}mSP|=Ok7wh8)6jBiD! z(An420vBey473uw+`c9`a2Rizy12Y>zfS>3FlKD}uo)dGZkP_yVWRUiNVs8KHDh7{ zwHC8tv6Y!|5=czfWR;eEk!?>=S4l}m}t>Of<$8wKP?q2 z@Xwu!JCFZjd;lcu`WTYUq(dd5^1ab(a50dc+~{5PBqO@JkFyQW*Y?g!1vUJMKX_LK z9CstSS}$Z|pl*T0wklDWP?=67iLve5EBuP2sl$%qT^F zmR+uO)XI@nxw)XmU)YRj>FaUzavo94h}J-6F+#nszDQXP?KVT3Ae<3FA_LR~#cFhi zqtY^Fl1fOcfUFxb%I2@^yCPN`VICvY=>s0H9X8Af7r~=jU9upGhhv8?WS@@wGT4-O zo?9k%Ri>{BI_?i@s9zF8mteKS%#fvr&Zs3GAQ4o05La7#Fg&;IoLl$=hXE47nlw{G z(!8V6j0^0iJt4+xBi%vf#{nJ zZejgYNc#B&)}|XljqMGo6g$*jPh?1LhqvaYBS_rOZ)4PC-WPRx)!2FC|A4%?K4WRo zV|m-=eq&@20P>`ST<>QHGB$7Y67jiOiE&^mo2;^8IFr;9%+GmnQ_M* z`S(=y#$}Z}#}sd!KLym-;3rE;G=JuJFZ^|Ao1z? z1_3p{r%jj=d6pF?c4!7QP)CvC`Cd%J`KD^W{_uJ~kQnKpzey<%s?S8SgSjU+&j$&w zhBcD+uRJ%rr|^^)spXJ4%8dRy^NhSKQ+J1QHSo-p5>SJbhkxQq+0k9FuE>gmQ9_=& z#I;H7C@qRsc4{Y^HT95;rv5|z4IP2;jV2G0?8?~N@E;-3CvC{|d$R2}_(?Z&m;RJ2i2uNev=>m@EPZ83?kn>#C6IBe zN{Q?UXz9cC6u(?;)^`-L+p|zIKsegpQQAJO8orZ?hj?6ybl72&P8L;FbV#$amk!BU zv`UK{?C?(_bM*DgHcbuLg1^?zvHSO+y2%Vme&n@9it=KRNTpchOp`-RQcAWsnyYsz zK%!Xv6)uJSs{c_i{UiqutF~75o9*~1?aD&cV#}`OMja6Ez?$R)HUwQkvb~X!$+#5A zZ@EUvA|^Ff#c#ZqQZgM`1&Iq?dTDR;S4;WMIB6Ac1UuJ(E%k12@i&wtaqa8E#@NYM z&>+FA`h*kz?#x{$c5d+*sq6)b1(o~**Bxq2)5sKeI~42!qV6lX4O<(;0V!)(^`Q={ z@*o-?iGSvZmzA@Qa5wr>#&{snCJqyn#+_fd0I997LCYcQeSaHsp4FiS$3Ve7TZUbV z3e>pm9`KU&EWq0{&u?iPkN+AZu4NH|x#7co6PwFov&uptPhGTvaNY3y={~x0Ac2Y-!LZbWtrWL=A0Vy1xn7M(yj6-9lr^^iVL`6oE-6{tZe$JI0XV-iSB;jQ|s z%!fdNk>n<=Log5cB=C-XWn~759C5uKY3-~>Khwp6#mI;w5MStPXUNuc9UASaOzSGz zuYk;iRdE4{(~jks^!ezl@OIeV_%35xRmzdVk+9mHl&$>lAsW`?Wc;}JsjtTYyg7Pt zN(%T}#sbyigd z2ASu?#nTl{Wld#vJjcv~)HukV!FY||F>cpa_-Evm{E5mI$c$VOKpl+O(&eT6O19Hf zJDvcxv^=hsHp!gkI{MjjC^8DfuhS&~Gp_0{Eys(+?9fF$kUrKZS(%4P3E<=C2!whm z2BM)nwv$%1)Ww=0THoE1HS!Q_hj-qD{Tp(fgD!Cm=8CBeA0#e#IJp=5a2zJIF-nx} zopz9L=-S5ci@EhjT=8v-c{ax(-&`$Rgv(uU!+5U?eKQ7A5~u_0vC4_%=+5hPz zF4G^j0*SC-$6OKuYZkL!Ja)#Cn4asioW z5%{$WWJFbZ9#EZ`?BHHQ@kioo-c*7b(zdFVJja%RNvi%%uy=)AkQiGvE?hmkWaWJK zBcBT1VaGs16CApGZtb-@UwxdY^|XFb3la&J->iAS$=9A9TI`WM8@IO@8+6@Myd<4LnyFXH*Xil zzPUS_U7lris(K%}0FuL*{dD9Zb@vyYrgJGzvkvq?R*hRXhId7Ny0+v~+t|lt`;<@7c^v5$VIxpUL1Btnxo+fp^_&epD5Y$hhIaU$M%-N-B}#Y`O5m(Z;>*7HK>7`{QBYSlhw06&-Y93pmu!=5{$?1-+lLR zU*h8|;&ARPY^V3~-#w2XX0ID^o?P~2%)@U70S$xB-}G0rf4;N*^9}7f*sj8t@3Y+W z<7F#x`HjIOSrud*HD>YP;@wXXE!Ccvdp^vKLS~PjMBMkwH)N!G(gu$uWDi3|W%ira zuhq5xP+se^g-?cVGJ%#Nc0A~n|82SRb={<>r6Oq(GK+nD=jY!qIC9rw?G3@xF>}bf zeSbIPY4?*(i! z0=SX?n^A&zI@@u5QtNX%YD9n7N`HF`XhrRb)rdm=Jzh2FNzp)7jVV(c+kf+7pOaoY zaFDgB{{Isl%>SJ9Dh$kk<>w6ko1fDQ{9AqwvNw*fF|em2r8#)KNNwnBECE|u<}8(j zV#L&P-KxOM|eIbesEcDL}Am$7{FvBVhW6H!~W`%?!4gi2iK_?d4T>0G`iAAf1 z3?b=I{YAs!ahL`qmc*CfVnBi7ieeii(guGum~yV3t1rO}-0Q$|?8(0;3lN?4F;SQ3 z?*Rn~5raoN7N!nFdm#{o(CUe{dY2Y*fm5e12ZqFJ4jlnCY>euVPxyu1gao9HhgCs# zw8riA-#seq5w=LtQbSQ^J*ZJ>V~gf<8f^@{_RIYo)y^Q{=j$$+VX8Y=lZO;oWjgrc z=MdrcJ%(-k2^W&^t5Q&awJ@hxid7Y%n^j>_iC_vO79;DBf3_X-=tk?>{0_;!0f;$7 z{Z>~M#UM}+Q{`u(fOK(W&aGB@g;|cgLbf~Jl@A#v0l_(j2p$cOunpvI;tN4PZGb|1 zlk~S^IpcB+EU*g*Kr0aFkzyit5G&Ls`m)*96Hy?6N=!f$rIRHR;w$Vs^n5RXFhJj_ zB+B~}HphtSjv640005y(3Bf5wTHqS*X_Vo`09-Nd}vFI#X47V zBcXX7NEoI!MYiJ!LIf@crGGULrxR0wFv!rip@QIoO-AakYXF=MLdkcwS#N-m=c3Uz zHFc215Mg~AmVhM~Mva8%&n8zOAR2~YOA!nsmSF^IY4OsNJs|OWsr$UW3Y5v;g!vog zibsb)LUz~B+@$HG&uQ9UarRe8-5`O`m(e5P5m-YOTI+?r!UBmahT+9$>+s#1*C3Pp zx_OXcVv03fm(#V|yOni8)MYq1hq~fPY4O!7)%H?2*a*f;vB@ zpB*0{<`Ak8`(3A{v|&`8=@rml=;v*64su#P*okl`3>iT|Twfd=f4hQ2`Nof@U1>-* z1RuBo6V)Q7)0+aNc&14X#2px9AdGOO*y0n|rT3B3{XioTyG(S4&qev$6dqqcR@j0) z0}>8L2&{8yZjp6GZGndaomT+F9HQ;&ym4H&k1IBqVFWf3;ggKywDoj1E@v2b^ST=$ zp0SzscNET2ElU&SgCqq3ennw`Kp7ZdY1CyL;D16OMQ!0H z(P{L?yf*42vVj5;{ee~MKA(XcU76R=nyXF+iHJe9lT5HVRU3qCPqRk0fds!?a1P^# zx!5f?R`iG80q1fATI`;)dB4#CvX^af2ntqkgj|VM3Cp+~bbXb_QGIp@v?7diO$bCb z3E5%aFS{2K1Nk`f+p~gBBWC4lwk&D#AnC$RP{VlB)CDolNn0```zmihX%7)kSK{D2y7~qimt+SN=Z~B79^%nHYjod z+WlCn;P->xBPk#;v_&pv|JtI>BWl_O_lSEzLNxt`ysJ>z|He|`;MQIR>2`rucHYPI zX@^kmZ${l^V#xfF$&JPrNxl^{p&Qg}Q8%PxA~cnlZAh6z6*@}5GT=f!Bs8`~9(%m3 z*M=su=G3A3AU#2>q0hDX~$rrpB& z-0OzvTyaG`J1Zh#e?6!X#2>b34G8vVuL>b^FTqx`lWnd?#jKX^>wi(DqTZ03K#j`9 zR>WOHRqGP+xy3=m`;f6OxKjKIXJ%R~54Mig5u6Ty8v0PqhObhpt`2%fJD(^r0Et|c zw~EINczNhAsyEZ;)Ep!lOK>S#9 zXj|{L{M>=!UmQEXII`>|XvOsynW=L%q&^ESzi`Ta_tj}CPCu0{9~)pml9pcuCVEI9P~$! zun%2MJXe6$F>9~n4yQyyj#@5JZOi9s1?XnqN2!DehCi!2Owga?k7L3_TyxjL}!rbWpHE+{cQjq>~-hMg3_`; zVi!(Ei9%-e;*LzF;WM$2Bs{XB=}Cr_T{VBJlm9|=e<-N2G)|HwqMjm7d#NZQn{-I@ zW=NdCV)5tz!AluGCUqLJYNhQnryu64ytzNu*V42t5TD#Y=xO75B=8o@)X4%`Qy_%h zfGz(tTX4z8D}SQx$}K`m+Ch~FnqO(EBI>{ zQHm!yH(OBnp_-)MtHhA`rM9@rGM{~xPE0v^cS-n~x1h##WnAZVZokq_Q+I-`uNwjq zTpWGaN%p>jHIZj_aHy9G5~CMPZF$Ha`BAcXRf^hw4M@xsdnXqU$*If)_F87Kf<-042jGK zDyRbG$MEagP|R_=luAefOdhPtsG_qjm`8*JCOyuDcsgeP+3Gu@nY;VcG=%<~ehApo zLkuQEzJSkc$7B+73hjnKVv*(gb*Kw`%7T*x(h{R8caXqdqq{d{bP7*=FCx}}dZav>cn?W$dA`Bqo zMP57)8L4Q+Fq`@X1u6>qasuZ zwqxtOdxu_)XZdbQ%r!2dnCF26zWWbNjA+A+GGQdGzTb8~NCZx_CaIoPN(T(EQbeE- zGSA^!cvps9kCWf!jK{mKe+`L06hWr_zMcoPp|+Bgu^&;8(U1~89X7o+f5bJ=cKWLl zKBTWdiK&wRF54==%yjEg=>yBbmZn718uPE(R_ErF$R+b}J3*p(+lub`O8SIQnPj;h zGjS9o5^c~qLO(_+_gPFe{y-ZOB*vWw;=Su8rIC%L#kVU`AiuWLywoYBk69HJccNl& zM|&KoVVCO|v2mrXx$jyW_th7jka^$T4A=8!*w{CD4gbMm^-XXW1tD_Y@W;}U`P#ka z5nmhe2G4<3%n03E9ns8~-4FIPu47NE2MJ%BD!Go?h;i=LfBFzV1M#OSij|#_GJLTW zR#O%iP!bGkoC+*ULZ!FPb6i={FB-M)0SR4Ap@l%9rA#W?=a4A6>nOkjbn=R^2*N<3-JbEr?%W!j$1yBzyZk8&Btjg>qneZX#cve)0)jeqA4p_bHC5)HH&tn- zlt*LtQhY(;ACZS&Ou2Uf`yfUk3$=z2*rE#!)7U2^6JY_}FOOX?1~sGu3Db@wdE91U zhra%-;}ej`K_-b1$Dh0^E#-Nj5|7*h30z=>u2H?>c5if&jfX?S#$*}zRY>VOb}8VnqMSW7QTQrb2)%`|P0f<*TlpD`Vb-M5T(# zvZ`Q}_yV}kkHD;wA914JrPj*xq-Ce65MQ{(%9c>8IL2fcBGyq7f%xAAP2GM=Dv9U{2QlzRf$V(GKXJ*3ONWw!AxsPt7q@7-(I)fgp8-5 zRcl_X#=O1M>+z=gJJ+u>K@I)E`^VY(;V3x%dezsj2kwAGYq4CQqMG4Q4&(#!xi@EiBe~{h|M|}uTvz7I zR#4;N)FQ)-q-0W7%G+mGECwO(1)uQUUr{eIwTVAI`u7h|RUBM2vdmw9qwfb)nyIWtCe7Je{=KpU&=Zw!^6oFRWt+Un_O0MSr&woKeH7(=Nv-G!A zcBD+=^@W{5Vl5(#ea)m>K<@73R$slR-a4HEzUJpv)bus?WRbt;PniIRS*mtr-;hSbAGC+fl>u|>pn z`T+msuP*jpCAhYpS3#hL_>fl_rr9o*x;OJ~Gbw=v5)#R8aT&{ObA~#Rc=o$^2}neF zEu+~I4Py-Smnpm3)IfF})B&Ssov8a_>&4Py^jX+J%abu;`R@h6W#axVhb6! z^+7{cmI?}zL+D_&abqEo)UF&Rb~AI!db5QX-0)%%B(hv@SVZvci&)UmTQaQ}{dpX0 zhf9#Vyd|aNrJ3;xRh_S$H%Q2Y`a5QJF`n8T^cFPS(WZlhTf;OV@L+B=zvhnMY_KI{ zC6=(r@kw(<%@-{Ph_{z9kt3i6vi~)?+XvgJ&`Fic<|V%a3F}ySPw}+i=_w3n(j{n7 zH%QQR@qgQB>cy@i?Z8^3CK4o;>+kgwzx>*O(4%eakMxH0G2}0u7@4C5hrQ|a)i@EW z3)FCHK4v|iji%Ka4Rc8hSgxu44wuZVWt`y(`(ny$S&(%FJJi8&n@KmCzu_9rh(s;` zt#}iooOrp7MX8S1@qsWN2_%kFWDXVxf(tXCnmbJ|LxIHklg>jEWSk(Ab|vJ4 z#E96XUfZ?ISTLC<(*|H6J;=n3>8r0aMjt#&zZVj_TLEf_vgpb>p-kLxKqbTu6+z;) zSZRr&XfGzIo%o|~=Q4jTsBxdkvPq}dVJUPCX;F6!Bp#!yHlLv}#jA~j8iX>ZTn|vA zb7L8^+`G!V?tGD-tUwFNA}@9v5nnnNqWq3+$`3W-=YSePWNu~CPoiDk$V>dr5CSAZ zvGWQh-uGrlcVnbj{6rOGf7P(R6IINs;Lj|*&_%7W*ML@rRvM;$GwKpR)rB(;QV%Ww z38m}HL%fD{WuB*yf|A=r$j&G6q>P>%sZw~H^dmc88a4zqC@yRGkqM+ij%y2T<}Cd- zNc3U{1w*3A7B5TvDL7GE3rG~%(Y?)W`@h6Lvs(98l*R@mYIf%N_&UX2F~d{*p4_7s zfdp-XE%5?TMOCgxHBUNT=l}^(w8KslYh$7*sj=>v^Kd;#;7RLSq$6B@e||sh9;poC z$3mM!?%28^84(D5l7{D60%|y8uOaEU23^IWWhR--A&4I<;!iqXo2;*LJ$wAMt4)Cb z)R3K~kzXp(OGHz#sbONlZjc~%ZR5$+ZlekMIw8DzFUZ`m6t6w5G&43O3=R1)8oUcZ z4ch@*?Zw^s^J%`iW;e7P3la!Sw@+*iYNn4sA4+sx1KIs>XLTJ|m=q@ye8F}Qf5Gv{+AK^^clXqO;W)&f7SY72pngX8pVf97F&w{j zpoSz9#554w~Y8s{f^H)phg zgeWpVd)7W8MYfo~BV3sPiKGko)0PVmMiz)TjCWMlvzDyE(2Zzz&|#2}(42g}5=&hFyh|&nD}qIz z?a~r|qeBNt>bSkQ;d&Hg7L)rqSLn;}A`bHL11nNCvOp`8mwo-z0SfmCRY?LTXZ}9_)8zw3E3TQ<%OfR#P$89?F{S}{aE(zjs z`xah6j;JOg_u^zRhO9vZsDTh7d)VBhPE+pkr9KQF$U56bv6?21oQxJl^FK+$`8A+M zlJi~HlX2S!G~HR&slaDP9+|1pMJNgn1jkecE_r7K@G=nA?fyeQ`UO=t6sl+8f2$0 z@nystfnBJTI5NY2>i%8}P{XJ$ucew@w#R!uuF}@p5c2j1ZYSSK?!-OXV*I_zSFu70 zYIG@ghST3QrQ#+B;_WxCm;nhM@`e=(e{;>y4(XAjw=E!RWCvLaZ3Yp79Anz}_H*qa zF>bH5OY+P09!@60Ug=8vt}4(qAxootkv?p#;;VxH7iHs2kYD6+cKU@h2^{6&vHTK=d zJAs7vF<#xx3Y&B8Hol&{4MIpiZI>rYr)J>p;sn39w^9qKY-2ZlK-&-clBcKh+SL>4b&(L2_j0i8;b1r7G9xW z!2ApnDeI#!{qI6d7mQXh72Pcokl2Y+hSp8Bd6gyA_0lGjA!F`~!d`Ac$|SwOQ8F!5 ze+&dQQ18*H3dRg`#I@D|`5WvjgYcQdWhKQ!X`6-mgXK9wNISgigK}Sy4%#lw9auTP zE*i2*a%2zohbfxN?Dt|$C#y3cew|;qQ4&naXs{*5Z5$p$(K8r7)F3Lx0{yCF0u9r$B?pi80SP0ytZRq=ns>i=Rf|)irA&~>Zx-T*3xnvEj!Q)JU#OAp-b8YW0US3~2i(+Ma{s9tao|CduTAvrJ z)mLH`THLJ$i5CwazWAs0;>MdNT9#PIzk$5Dp*2|!d*AI^gHOKsv0(P@AyDHbc8)vr zwEoNs&Wg2vWzM|^iGjqqsgnQP>KTSgK>P?2A>+ZWyXS5Pd|dwU*L=s-*&q=x`@D61 z31@=%UcK>t>^;aHz0NYq?qN_{jj*@veC6Hk7eS3Z+wTi1-;#FEy-gs`eSlpds1sP^ zrXBA6)M`HTq{AZ=5*eJCy+iR^eEjwDCk3$|cUVC7`fM{R^F6L-?_Bcm!|vnv2@sFl zd--PD|NB5V*wQsGY!SkFZ{yhSt5?hxd};%UJ#){uPH%17^KtmYTy9&W5G1%CFl+Z8 zw0lmzS!sH_Z}mSQvEy1sKKIe~Z0wEf{x3dF4S~e!uIz^fLldj|-UeN)V(x&nBYW-8 z+9T|VrE`~ei}p+(dJbwF=I=Q+#F~w3u8LcIx(^u*v&m~8tbfbPdxhUQcf4wI z5ol#rlDYOm)Dj%i_F=F5CH@PL_)+NbJ$uKG>y|%{cODZS*#{DH7Egj}X2;FeW=`>* z&)tLc(|;3L|C6@LL4<-DG5Xs!iC0B={{Ojk^B_p*Pl6LF6mG~O($x@s72*((&|jkI zR@i@7UuJn1`Ew=*BvkLFR(NE&90)a*?Fe|ogUs2VD;zf+EcmxIs+sX6pav#yMD0ls z|M$PJv)G&*A@*Jlrr1)|g~OyQR)QKw(Z7s{u)~gZbyQtI{Q=0z!fC#EyUtH$xNg9% zv^UKiG83-r|c-sL?>afMPqi7EVOHsLG(j3XkIzDOrP;_VZ7>=`#jYe~8!a7#ciVBf~Ey;1UAF zjqJUkm4)JxcSv^(`pzNk&E6?1$d?-hZDd(KJIhQZuB3YUa*aR@T7~}JPv;?TdxObf zL(xPGNCYDT^q)8P$DPjXy1$Y5Gz%mS7;m)}<>y_Cp6 z;Xnd22$EalhG)e1APap_1F@K93@HxOK+eyVs}}UJ?s!v1LJJ-GK*DJXdDFYBmla2D z2`%n(nhz3%Y*I7RRbx*ZiVZIAu7dQjb^`H$y4SHJcwVM-659}MZnqff$! znmB}dkf=(<+^6YBQ!rjk9br=;zA#_28hvIowt_K%;?gtwDnSj)JkL}vqR7fF*Tda> zKJp|;D0e7$+>a(1;sNyeW%H#AK|)xPJH-9UB%R|=*`>?83Yqttu8eaq$CEM$v?^qw zQUqB8aTwA>X$jq{qN2)8+K+w%S`p~f=6Eq9B#&R?G>;vE2Z_<-8t+ZjKIL`6o)X4> zZ-^iBxM@@@c5-*B&+X-o^wmLD;(N{IV&`~w^9=1D8HDf#NKd{MIw`IqX8EMwvz)&w zw*m6zI^4}^ZjI=&L1B?ddcYAfDy6piPgvOzJeHTuB{nII4*nK5DZkx@8j>PU^foV0 zO+i+k)b5$PE)}OX48#>V?oBR-SSb+n;`n{EX_rm)>QEyFWNz4CKM=>;A8L?gPaQlp zM3RH;(AUn;HB{qd;e~l*`(jfBNFW&VBwF%@fO-CtU<&quyF-<2F(ju|NsKo6vVO=N9e#~c z{G{YMsKJc+-S?}U%@VHwl-D6D(itS=^+>e5{>Ho~A~|!vR15LzoiPfh@7bg{T~nW{ zJe~9s)HqPkUAD;sRdJB23bqJufOyOE1vsTJ|9I~!yP;j^OXen^#-&M$3bF~)w&;aNnOXssD8mtc3U9N<3LX;Y0Nn$wb2`ynpSuPGOOE9pavfG=T7xD zq;yP1Ilcm|Xn2%+)Si@LGiQWRwZ5tYNQ9stmH1U<8(y|04%r=`s6oQ3|4W(R9}HXY zvYzNE?S%9(H`O&dyXWXNa-)Z-z3!YDs1cXBXa1swyI13?%!82qHv&Oo)7hv^@zsu{ z!f89Iz~QYSNT`EN!!wZuIa+?Vm;QtdWUU^kOy|^}bx`H@(#LfBcnVOXwp$cdUuC+N z{N{EQ{g^rlB;3*cG~Ifam8|*mrnvzdAu%r5IG=Jl&rhi#y0TQQR7hsk<)nXIob%6j zstsNFNsl)oK`TEDuNdpK3b4T&ka*=e2*_+|pMxJV%9YB9qQy*K_W+3hXdG}`be5Gs z8*gpbg*K;@fL17&)c&Hq(^kSe(W8C%f!{#lB=(xM%R0Q)+VGYpt!Wyvr!=_Gwuz4te{2ohxG-MUj0gE=fsc44DwLqKOQy z;5tT_h415;d~M_mi9aUFiQY&X6zyaf-XY(G1`#jI*ch2*^ z`~LU)gZe49obPw7b@sUS+GnpFrRSbai)_o8win7cYiX z-q~M<<7=lcI~yjg4WH|rV%z)OlmjVPJ1k~z=OX#(rIvC5nw{;(5-cK=#2Z@jW9izf zU+qSGMgv$_#22AcvcJ}BDiRH32Kzcr#o1kXhf;UNyl?kNrA!%~8Ju$%D`SOkw{od4 z1pN?S0VWWIORxxcZ}By1d`PdWgvVGL>8`~hHgUT+U1X{Fy*bLH*9mp!qFJ*`24 zhpt^Ko7|qe%^9KN^r&g(-L1tFhN^A`)wR#bYKz3mnEOHee%`|XisR1ZiI>71aAuDM zUOz-LB|V3Kd?L7?PSti{W%%0#)_!U~;o%`pvAiu=?}kO}Bux<#7_@_qcm2@AZ+QLX z=w}D_E>T~r*!5Y1=Wg?QoY`Y5wI|Byq~XUoiIrCy!x!V!+)_8ng9BBiP6AU?|8F(3 zapI?%zBN_+@_)JH*QXzgD0cG0TB={OAt9ntny#lFsOXTYabjD-+{l3%;JOp35>C-( z?Qh4*U|&p#BQ8HbeR}+QZ_4kLI3>2`hCWW|^^YZ%qbvULc_E&!y~8Hla^W3%zyd~A zYKJsy0IQ`sr?1&Ev^&41R38ls6JqR_a5 zdRMqxU4%2zMLCojgG-pftn>Cyj%O-^u`*`b=)Ri4J-t3&u|B$+XE}*QWTgd9nt&jp zQ1Ovj+LV$ChhI5T05=0WJ(YxH8t`pc0UwdnCkO!laS?RA#s z>NELOJc}aylZl^T5%d{p)VUYEs2h? zUGb}!qRw^0UppF`zrt$yuyuNQ&-RF*cPPRXkHnogzGXTcNNtwv`>#VVSQ&4R#q3NN zUVN_V%d-|NV$60?+N?*H^IlA$6`jI9nON+`$>O)7yvDrmSW(h&vpWKb-vtBg1N4 zzhL>5qSC*Zf@W6NC=uaK@Cf$GR z{f_hz&H!^b!4g`Y?D7oB-InJ{e~2^PUOhBv?t*WpSq1Gr6TX@Bw;Zdb{oc3N|Ge8W zS{CCSHa6kZZ&-x#!lUO4CRvruH9mh{nCI{*7BS-3}eec5p*Waox3|zu-a?Wrc2Oa$F#5U{QPx8LCyN$CbXn%2|BEwB7 z54!i#j_#0w(~#vY4wtgKcIPBof3`{AzT_g-j*lJqqo?xLPBK4Qeed?EJe+N@6Snhq z+vWZD3u9yuUX{dNKwS6qiv@Y;fe;J;ygK?~t$uSh=6TCKoR)s7d2LKy(UZTvXc;Y{ zAL>4jm0`+$vbO7a$Hwl%);kx*T(NxtOcY=FvTx|qpI&HvYSGfg@#r@Abj2igKRaO^ z=3F0cp{~Pf$>|!7@4RE&dwxd7q@z_gzQiIP9~nkBnO2M2?OuqdBVwEadwU4z?cRyi zjFkaA5x2+xb@ruv6pMI$GG;{UBG}B;b>1im$0BBu(gZ`utMf1H;)Tw5XKZf2%8=Wg z9_k=LPr&H;H?T6gvt~M=J22?JOZn)qXa`Qcyb%%hIOpv_9juHu$9PoS8iKRL{URC1 z3!>+`)vFPPOJ$Nnfqd*38!MwWI=p0)?Gx6F{h}h70w-?SwDfP<*mV|Hc zqLyJUO0H`uuYlodFwT@l3}R(y7-1!0#{+po0>A|XF;178YU>?#L!0_>RD)sIQQR|( zl@X8by$lHoA{rTc%tOnSIG)tn&yRnNFSj2;0#LvaQH)nGkS*=uyTMiaMBRcAUkZd?D4o{K4 zw{|%e!77XG<$Y!6C`M+;dRFfsVG&mlzVkOe^0<71OpkS&m~dL{_hK_ zbN6k>8Kiax8*}~i4ZVWh++_#D;g zb!gJ#OkzRE;g-%d`O~;XQ)t|nl{Bo3f%T&m$~mr*h+=B7lEhn$MToi_4d3|jd&O+0 ziDQHFaQa+%L}zr6`HWjBYsASRYWEqejN+;Zo%s_JybWobv*E%(oRx3fxp}Pi6(a&;Ep1`FJ0Wr!5GqOgwUi#pp^TCSK|Fz-h_bJ%Vl6UF-Fn z?Q@Nksw z>8*iWQ(06q77;Tm|7>%qvr}TvW2U4i3a5$99*CiKC$P}15&7rMvFbmtGHBf0ih&kN zMz!Nf#)RW;GAzO;Voy#_i}8=C#RC=ZHnrn)mp1oYZLlavJalDgAsdKsoa8jX*(+UH z=#{uWiX|IMF=4e-R@ueX$1o=G){#!OjJn~3M^+K))f1k|6LcruAEVUBe!n3V1FN|G0EyrN@NT)tj)0W9}bRxinDQ;CqhfF)CO~)c=K~CXEP5KvP9j}473GW6u9s90t z8oT6j$;anPqjZPA!^-%gQ(>vEA{e;?a^vLKCY+^OE_zI?gy&TuD&J|0s?3>(m7$DP z5zR6pxgo!Yhn}Lt3DUXfO6TXiiyZA}$V}bilZvxIo)hG`wuN3cwSJM_vYwubvzhHM zz&!0)o?gSM@i^;d;KyO@uwTW?d|Z&fHz>#yJP>WcSrDGFRH_nX?05A7&%#8v7M!|O zab-U4jidZDkiSTJl&!#O=~;nX+v&ZkoMuTM>&3>hYB6Pn6p=e zl@UYzTG*PNLUI?E8$UA~?!+Rx|B;-vn_S0 z6OOYrC<< zteudEMU)26LuWHiu1oRwglh`I3(|27zYu0}MtCEcex)wXc*#-2M|Kqa@Pl;I4_~a- zompy!vqnn!mgY}fy@sYg9`MB_MUBhqXI=HtkiQDQ_Pji>3M<2-i+kGTGp=46Rz9PBwzCTs@dso3efjQu zM%@tq(6;=%BUps}rlZmMtf9kZo#h0=INOUwgz@bR1o1{XEgyhgi>U%E0x6(J>=2DG z{w0x>JF5n9T+7714YYGPqro#$8rG9@W(%=0))lb2IHO11Mh>kw7>?Y<37{lo}sluchtc+s8m@;&V7^gSrdVdydX7x4Q@F?DrW~kYYmBHI34A+NsenVpS{nI9@9H#|22}Qj} zwr@oKa&2@eG7iqh$~eYelH*V2c5nw;WXeDd&g?O1;sU|J8TNkVr$x+WDivq;(Dd`a zrdG&zIF;orn^fzM|a?KO$Z8v%s`-gZJ!I zEF#R$#OXGzWVD1NJLnBZ=3o&)+|%OyH+stK(SydSl3fTELGMnTpCIXJq6v)R^AaZ| z77;~qRna;?n!eT7t|H10XSDQ?Q9AvWO(+ST{=2~O?50^*8QN{BA8qwocvAVegc+Xy z(>^RB%6#T(*nqKWlAwUMmutcC*g7`_**LLwH4d&}rWj5iz}d{6nPOaKXuj+etBaaR zK|{e%Lo=h0_YngFVM*+b`nn8;!En z6tZ!)0eZ!rsZVZJCJm0zYbsm4#8@qdhdyYC&=&UjQ?8ec-HF#@5uZ?Q86Bo&?@E)J z>}-N#N3jU?{tU)>l9>}%)Qi>qxba4H~DebgmEQ0EOWdE0fn7SVs{_*vlH8|SsjZ z)zyA%CwNkT)Aud0YiqVoc;G`7TNG$kIh@7(h4Rd!4@@m|QfY|0LrOpv_HB7z(#ig&eTPB{ddskirZs;zzKc66fVd=_?*@EVykBLf@h0y zEOoT9#;pHp=@Bh{`rS`o3?0L2sohYrc&zZ$xhT;e56?ws;Iz}3cdvg^MP+r*e053# zJ(Gcz@$XX_aWA>I@0i?iN*#b7)~$Yd`_d;>_ar}L{Djj!tm~$~@Y{Im8mnW>cT)SJ z&#_v3`sY(G$iKHZ2S2p-C0xf@XWx4spR#*;k7xUs-x~JT1vvWvo>tioYIweN-ftW3 zveQ3Ziq(=aoa4B+YVzXRl<6K>6(8cfZT258PD;9OT;G^o@S?=$F3#%pZDO%Ena8^4 z@5O3aoPGO=seQBrfK#9RF&2WOrS?(Py{sQHp8RdKu4P&Oc?l~+e*E73_-mZ8(Q6mv zcYOk$VG$12eMe8(P+OMo?rxrWN{6#0`t5W7nlbnGFS^GjJ*}C4Y8zI@h40QJqR6S@<*QT-3u84%QcTpDx{kMf{qB zW*=L+1^w&KPxI*a?qU(n7rwC%1R&v;_9|=jB=nd9X0vj1#S4$DZLBK?KOMF1{_grI zETZ0le?HUy%PXxJi^pDG#|!hDkNhKOIM0~y%aLCKM%jyT%GCGNi*{>X|1!Dw!N1Z@ z6->u!84+B(lN~TzQ2kfUl#RcNa4h|EM#iaQd5=;O=AlPRj;HphoH{4Yta z8h3Tgv`_O!GjX93lsJbyWL}Qwg?y`>Z*2%|t$Wynhq%gl`0C=mM%kNf1*{$DF%UL+ zAu7jL_xdLmf&QM;OCfLoaYAZ7#lstmSk7*k&>-(_>{gU95~Z33EaGKDVrJvc&$#BE zeYpbn44m0?#M8^uy_v7>%RLe}kjkN8We|!%%zVBmgf|5CkU1(GPYL8#$iq6D!-B*< ze$LfOocZObdr3-t6zkX_Q&mp?xtaM`Ee`tpu2MAqxr1k%ZtwlB6Bd!#Bq@)Yp*ZdR zfpEE4_(3QZL2-VG_(W-4i==@;UQUh$SVV-0YpPAkF=(^m>rFt2vs$Cu$dFD-dND$m z?@cU_;jAku74jkSaN;PxnwQfLxT62wb>Ph$ehBSeT4971V_1i8gb|0{n zg-FxsU4|O0j1bKkMWM%pF-po_M`zY1oS9H)N8)vRIX0``A+EeB>clB^i8IAxH>)Ql zh(DX@!Q|lh$yK_>6Eb3Q9euc3M>mGyv@yxT>R@Zv;?zsEqwc;Nnn0wdTi4g@ti~CWRY5)?F52FM zTIC>3Q-SlgDmkNDRh-q=8qh0<5+^xh?btue6Z*xMxd$-ME!j{Jc@2vQ7cY;VmR_8h z5IXl$VHM9Ei@3-yIGp)K{foVlm`IV0 zG4$AUYl^i^Ms#c zb5Y!(cb81D!zcl){@tWqGfH`$+k5IAdgl~k5yrETI#spP83mC>M3nt%EJ8vAS`pxq zQUv!eYG_e7m9OnQ&v4u=OHI)=)}YCuaF&Du!@+BDR3BNN@=#>YQ14@`7RSWzrYMS8 zJ~3^s>hNx=4vPq+Fvw11W`n#+Y0xmq(<%M6uErlBp! z52>=hJnYC>kJXY;*)ZkY(%IC~!t#(IMm^3FIe%oOhT$>lL*ZAG8?On2urfaQIb@f& z(*0&HQ4~oa01*};;`Ag)dnrWpwDAC7AUIB+ipMcjJJ@&LjE-^6ucqS!6=X+3CnEDF zS9BbmL-&rr3vKayQq%$M^eDndGbG;91{^yoU9#0YP_l6%Lg`e6;5m-DKweZgxDX%Sx-?JJ`#Y04IyNi6shD|C_GLupvyJ=xK+@keZVOnfLd&g34Z z3wtboxW(4Zz#s_H*|hDQ=mlv`OhAn6!I^D28bXiaA3$3df_PEusEhe`9U!mDQg!8XPC%GJ{F;tXRY zdzB%Gj|x;a9YM0{_(rUZ%+yTd%4|U&y|=;RYFZ;s$F`)V#dihx1|@zkoyu+a2s;mg zaG6#=X|*dUXffAUTBOGDact<~X=|?XD`X=cU4B}Uzv3Cjh-6Khc-C1 zpL!&^TGv?G5W^6gK^opi_FA`;8q4vjxX0|uU}KEuMywV|YmCR52kw2Tu}YC?C!-mQ z*lXze%7uB_6)E%Ml+m~0tO>#`Ql)WqY*#=CzcVsD7^h50Bz647VYej&R+Z+cG0qdK ziA@Hh>6iC zC*ageIln^E;C@pc=Um>P%{hb93Z0)avTin@`w&Z7-2!F;v?l; z(-+vcb(*`m#F!c2NngQpym=xDXU!O(NU1oUGq~%e_RoPMZCH+ zV&|sa&&7|K2?LzwHCV*Pd8Zyn*@_-LmtA~J`}5gzEaKuL+CW~=y?r&${_)b3H|Z%B z@!g{rL;rj^7Jl#9`N%wLBhDDKEAMTf`E6JkE8}IX`26aaO=xKS?~3b>YOp&6R_kn^ zpYBzB_^Bs*o5m(D4=ZBv7tbbM*mAyo;XTpolsZ_%uVW4gvvaP`dG=1x-juKJZNefh zXM8_A4gDZoyXDuEv!CF8cK+c@(!jMpTV7P}b@*!mp$IDj1>88*U-Y3>v!m7Sg>MEH z@#pp3{U?3yE`D)g%fzu$?KmOH^VZSpKDWewQs2H3R>s?x{PltFfs>m|cqiwo9$B?d z_NIJ)JMZy_Re#U?6)Pj-2NXb{x!69bj@a`5x*y`%U&}X6!pf+vS&-KvdbR+izrIWY zi+KHDELBp0v<>-hW`tdKzR(o>eqIpGVA!0D4` zIB|<>+-C=l{q-leWhCX|v1+9mBg1MP$$c+t=BM9nU-d8j?~htB0Px|%%Rw=(E{=G6 zDgcXkb%)0DZLzl>p8MAN-IOg>48m$X9`oK06Tknv_tDRtM|b0ReCQ|k0cyd&ub24W zKC##9lsjaSk*=AP;}VP#@aFgEPlq)0BYE~kETVj*i4ofN>ht+#AATrTh(*jYE}Cw4 z?Da(!=ucrU7Gbxqb6Ml7z_{jhcwB=;pueY&HuL{2#214g^x8GP5^kp=Zv}+oc#B_7 z1TBoxYScN>qTFOe2@N9yFbtgNCDaNHgKQ+Za0E;Y!U~4Sg;_2fU-rd0HUpT)fLy^f zRZ+Vm4dx{g?2(&5Zu`aX~w4~4(;lc`9gw{0(CyXeeK41p> zF*Qb#JCAN6;Y_m>K5axM@F7j*Y^T~u1vryeysm|*BCg{AS81RC02}O^=s2QmGWjN- z7^wJ&2&4!WQD?ue#AT`g?QJHLj>x_ET#P@<~g8ugw@7|0V3B8 zQAGoS0E@^Ms3`zZ0RRw&S`mdaiWd3^&^Tt18R-e~k=1!m!^)8Qcb0dvGgPz?&KKH@ za5fg9w*ZgzM7NWwm`S!?Zh(tLXhlqPTOiU8y-ku*rZVA_hMQ}Zz-$VlYAp5T1aG<% zRz^6tn*g}v)g~t5y^}Gy4T}J|9Ab(V1o?pyy4vp~P889fHy~4#fajpyClhY^(l$Hp&32SL_ zj)IuV5QR`>j$s5hI$quDZV2qX1myxRiny4Jl|a`K?DbuNa_`AtGSN-hg+^avx;{@CB9aHr`kS--hVl#HnLy z!c}Yo0AW}JTLC;cOpOKrVt8uMe4JXD!Qs|$eg} z&LCqw8!Oo7`50lUV%->P<`O9?j2Tvt%8T0;(odkMI(fOQ5)1(CBcf5Xc@hPRGATzY z_rfAn-_e2GQ%=bUplDn)K3I2?@J>w)06IMzP_S$lL}A!}6>x-LKjo^S8ygoUXhx`g z*#>{K6cNs0fbAq!U~d<%Hm~N1su@u@C9P1Zj5(ZqfnXLSR23|v}_zz=x{I) z=_kND*9;KFez}1lBDaBAfPi3onH3nMoN_T!LW!e=+rCG|D6s+Ldr({X&ipkrHQEv1)*VjC4=8#TY>- zjQbZ;EmGO0c*FvN3U4}#K=#Y(5D=mP75lk^bOS~PP_wFNJdOv~WlDJLPA(6pOBza$qBplN-?Fw&0YGa1x6MJC!d03}PU`-H8{7?8hl}{&2SIPx|Kn5g5&;$_{K~ex8B0D*s%0>Tp znz8*Jyn2K-=vNp|Gx`@+#w*0@NBL9^06|zw2`;#=XG3%}0|G6dxYavJfe}lH(MAx- zw@VOCU;uyuh>*9;XAdAzo1SVknGIiWBj&{31E{Epo3eFz~8u9o;=YYWH$AnDL- zKMFuT;ec$w4r>H61+7N*4m)I+-#UU(VFgtKo_jk_IBcY?_R+*(Tdoy2Z`TY)=l5j# zU>^eDfJ~>FX{UQ0lM3l%0yZ9I1-x7Wr{w{cO%}#r`xXHZ8AK7GBxGfWYYi!&17ja> z-Bavk0$w3LuL{HbHO|x$<2S)%8LLmDt5QqSK^aaXp>8S}MT5&g+CgC3u+nf4>_$hG z&5X1F>fP5+yy*!5R6L3SHf-7v6}At65~9eqJ9U#8ZLZW@%a{)PE*7tw%=4$%9f(&4 zufkDH)kbRv_{XlQaBTW?L^IRxcol7V%=y;+;>$sX}IjhIx|~Q$n8K6@X;j zjKS~$JI0xMFs$Z_}$CjaT@d33J$Z9+JZ`N#EsNO?C{OT z002D%=~t1{qKWJ5=TV&d@j47K7D@S#RVf1IN7Tiw28;|V;M5|nD*XUsgAHDH3Oq!1 z&8G}thXMkaSlxmVN3`0tp)LQ_KbU7$uq$gwI<(mObQJT9Xr=wv@202-Oah>>$A2-6 z=#;M_j+e)Ha~SUp|Ng3Xyf=*ZhVkAo-W$fJ#&OSJ+)*6&lgF0{gz;s<_$q1KEgpA^ z$KB#_w|Lww9(Rk!-Qsb#c-$=>cZx2#v>%-5t8u;$#{fhJVG)aAsLU5j7LbuBP8PylJN-1c!Xp;LNXp98IO>R zM@YsaB;yg1@d(NPk0T^>GV^~PVCSF{H^M^yolLYM*{>e{k8{HR{m=@6!0V@*UpxG- zaFepr?P)Z^t3UvQfTpTop$Au!Up=t00B17bzlJN{tPe(th_9c#`ah-9kcvnqGC?+p z#HWCW9F3>xbE|%@DnYywZUd z)wKzX*VAM1|F^XM7xUg0cj{|NoHxo)?ki~y*^F0XjMe)6F{^a}AQA!5;PyXt;aAIB znmLwY8)iil9h@8>G`&6a{np0+EAMToLO`v6Oby}0xoLvm9DIkO=p=4LK3!*tWtRlP zzKazED!qv1GF})}`Zm`MlrB1ZXNW*$QBvNND+C7}(O``t(4x^AdR5mDa;<1GAo2jM z#)kXmj5`Dc2m(t0CEqzycPx~?a&6q30o-<&UpP(>j40V2|mkVrcP1}XVX zG9L(@71SBr3f<|F*?v^D?E`oNO@Rr1(XI!>*-j@?dmCVR1c3n|DkIRwj3@}4|DZ_| zV*!z-j-{y3Y(PYX1XdsL(H!TxuuIG`3YrcT5W--IgcLLt16c)teY{GcpuEW|2vMHE z);-@8%VRcxbh3nlrk8?MXa&-f)TUK7oczp#$b`5)c%I?D&njBG2lNKHM*sl6C8*JvJ2r&J{6e4yunJL$Zy+- z8}m&7NvMM!1FXQPE3*q%v1CPlu&;(z0M`$(r}tX^y3^xGc#{bb!bmh#6G;GU7%CO4 zCNxJ)1cBy3R3aR7>VzJCT%+x(xPikAcV~u#2umY)^P@yQXhJ9snhhAefD)Q$1)h%y zA>qHXlG~w+oj{MKN6Srw`QAJZc$47@q5!QR`!R__rVi3I&~KIR$SsiXT-l~;ChOnk zQ-adu)`}RY&D=MM&LJ2C&psl3fja=9WPsS4VeLcPA7>eXmcaQ56CSPGSz#%KoiV)lUoO-P{MXbYZz+L z+mvw-3_wFi(g;ojAX9FU6in5dyiE{9f`mg5F;svU0&J$jj~gI@p$?bP00=Zil!Q>E z@CA7}MX?0ruSH1Eb&U?9AxNs5nhS_tG<8-#bTL}NmAWb?UMSJTt%0s;0I}{3Bh5{uQtLELJvD@A zSQ7!Dt3Whm4Acf9?h{oEXhW?)ub@>^>tt==Z&LR`*a!qP6{6CKGS#!=;~23v#n4vn zBoqYsMN`ZqHjn{yApuP!gaLwEf}7eva3k1q{u9Tb-W+d_sN50hcIe3r5F$WOgYC~! z=Y%>WRZMuZ$b~7GSxr1ZD4v6DxdjgjRoqS7U{rox8p2&6}?rif+hm;?NFN#+4l0D>RW1d3$)V&(A>2( zXr@3L4O5p=6ZAHX7fh+LGf-d2dk!x<#(PV{2@13u3fAW%%k6W3aE?k2kh++6px-g@ z>$OZWCq%Tr83`n}(YVmWXo|ko&y^q|aCKU{V#Aws#4zuuqcOjll1TFlN&yC2RiGSN zqmw}YSJEw`zs`7$G+q2Q<1~!MA=~|Q)Tarq)AM?yvk@M&#-3LxkZEB-4K|rzCjo)) z9hNQ`(GW}~c(TQVRA&MFN>i?3ayZ0TjS2u4c-IJk&K6pGt6h|+pt+Z~-6k9Q4HJUA zS~Fz=nbh4(u(S1s_GW>)=N8gHeuvB}5u(Ez;Y|igh{_-=mwnmo5;(q!mD zl^UtdGA)3cKqO%C2322%t485Vcf*4BJtU)t8zC@4!#~ zg7-xhPpX z521;)iiQr?O8*URKJL*Z|1S8cik#tshSx-eB8n^!kV(*>+1b0o&xYz_sMJ&+SfUk}(!Ju}C&eFgi{;W- z@IFq8%GJpYIUUH)pBgkrUkG2Q`-y?6`v;oc^95tgG#8Eq)>6*TTdPn?rOs|W$D_&gGte3rzMNuL(iY@dGL0=+ zmq_D76HN#}%+&@HIx#!4E~?(#L6fC5c5I|)Z;w=+q3N}C!tDLjv zAa_PTKRN4h*UgZ?bZ82w6Id|$0s#y&_v~| zt1QXn%-Hh?C}yx|T4>^AdshBC6zbS#F_!6c|8n>^OvviF=Nzdg(5M^zIM+!DKdbhm zce|RYZVVSwxtnf=fB9exeS@9%Uxp@% zms2f|_cbJ%i3$os&)5!4>{ICw2{rr{FD8qr*puo3O)Spdf49mZOd3Q82p_Iq1pki9 z)0>xXp1wf2NARGvsiWxuv_`(P*Y$@m`zTvaX7Hty80eh_P-i@3&oX5owb?{BA+u5j zt+954t9>$KQ>SV|KGK(>Rzed~mAqW~WoZr4-|grvN%V#$M(cLX3D#YxcR5F(ZuU4M zfhINtwRG&zROen%uVhz--8MlJ_mF{#t}ovwFF|h!KvZSWM8_jMaUXBcK8|uEq+qcv z{Pbuu2pCKqHz=8;QRk2?BhVUi1mu28<(;QgV{-jv+cmep&z=|8#P@#;GX4b7|WSUY}K%2@T#3Bu{1Mw~l7bY6Hg!diC29vE%n$Qd2(2FKt z-Bk&#aYORcJ&BWJFWlZeDX41i{@c*RVQ$;skN#fU>*o8^A>ZzkH`hNy6;6=k2ys1= zr=vgI0GNs@i_=&2^nH8jnSX`ur&R+kJb(^D}$b7q5mcoV>9~ zUU`2JOg(u~Kj=;&C!vYcNF!smAODhnE6Vz3`iaG-po#Y>Mb?&qXAgrepiyLx`9x@9 zW1Yu*yT<@X0??+8UIhtFe0yi)s~aMpq|b2p5}NpD(b%8E^$zLV(k_^aW?A8b`3FLu z?(cpy_FLRYROk%{(l%&~c|&u5PM>*6+`aIrHR}9!E;P}9?_a}t5etJ3qD?NZ+93~` z__|d7`(jP_aTP61v@%qCGu6GvC7D+_&>H{#lKkP9GOt;e{U_ew78u|g0HAb7Jbk!f z+BN@@3Io#wzkJ}hqF1O8CxrCcHomqN+SE)y@T_x{A_scBJ=yZ)H@7Rp^hfeH6BWgt zIyu-`)4_0I!}~d2#b=lPsFA7tmAt+>jt;t1tsv}Bu}o;g;dsk!C-Ij;zoIkiei!vq zabL|OTOXTM1Mt2>Sd5{S>)`I($n7S-uM3(Ft{%J!aN@cUm2M+VOeI$M2>_-H$>3L@DsWDrb{iN zkBv00_iCRi5w}CXqRyZ)CXR)&M&^^R1y(BH<4yx*+0j#o3O*h6t4)OU1<)F^x!%XK z9y&V;-W9enB?Xz##8{zgh_^yGD>J@3zkzXc4m43s4Ut~iOi=}XcAOtcZS{jC5@KeR zw;uaK$IuKIkosKskFkKjrEDR?KRwhG+}6BZP_qP9BcRrmh-E3ZX4+Yj9brZgv@34~ z&Fj-=kc92_x~;kr=uV7YJ%%hKBvtTgBb61!$KhR^%`7C^UJ>khwx?yMkP-;pGk`kN z;_2bobD@vS>Ag{#16_#(ng;!vm(8w01_J>x{Xf`uByj9(0_1a&=2N|uA2(*h`?$7e z$lL4W@(@Fanor&3cLTZ-H<+@ry+^#S)xOKJ2jo_!u~QE#y~EP>5au&_?eD{C zBsj&=&@WkC&}-~E_IR&{rGdoxGuW4#n!`@I{iVOvbFvVcs97l^uf8m>C_`s%-`ppJ zkH=>f1WoU%mtX!)=QYQ+I21nQd^)E5X!sPq`0+BsLy-l3J_W{)zV=*5;p}Cko?Lo_ zBZPPUOQKfs*^GSv5Xl?KatC;as?F2mZ$-ZMU9-|(UQ@XXeh44RqLg?GwY82%9qTIZ zWE_RAj({0m{L9p(S1ZJ;7)uKlbwLy58wS>X)>bXPJB`%4wo42@g&){0DLX^<1x%G% zEV0Pn+@A{LP_e^8Ksw^3qHy?}K}u39w5j4dDJOR@4o6NO<_nI6?AAjQD~f5C#9dR* zC(NW5#{_JAb4e$RsjW4Wn7l-xcAg;k zF?1?Gus`q#@Rp#R?T?;+G0p3TM!&zZz=UtSV?2+7mBG9Jt zinynejGoJ>YkVCA0RjUwQS5&5M?n!Q>O-b(IPu0F=usTZrnDs)!foXt+5A1lfpkx3 zjZ+a-1|ZCxgM347bWJh9Z*#=+PV-^{oTxN4@!JI;p2O?xx9nQ7a|l|aV7cJCxyI3VJ-wZ$ zOr&lMf+iYFPO^k>XZE`*NONaI#b-eiHS)5xt%oyX!FRxk<6+5#Cg%GA3ZQg;Oz`DJ z**@VBh#EO5Bt=;CM2{Qni$y-VVti1W`kVo zc5+UBp%*mqK>32OjOvBzEWs&W=i&YE^;l9fku3%6I`qR~N+A90S!j(XY1Q(jhHcJ9BVe-B3PU>-_9HK46O(X=!SLzt>BAuJg1Kq*?2|Nc-z4D ze|-)^r%x&39vwNUn+7`Sq2DmZ^C^ScDo;x6k1Ukzav6apda;M2jSETJNErz;!rzaI zfhIQOkYnF7ozo5ZS$?v#)%QRXlQL*$vmVgH&jk6&LKENK^9{3H@zTZbI**>lLCkiA zb)A0U&>9C$>1x7luLvrX!|sCT4Cpu>7}V0uM*_kIT}SS_ZAeNlg4QV7(XO65r*CVE zEadFbnt1px)(Xmlrvw#Dj<6i^&m5fV4Bc|9K%1nf+&$NkaA+%QFp3OqY2%L6RP?aR ztN~f7A+#+Dz8b|QPAz#~>zC=w#=h_e0dde87as9;YYZ-r@?C8TX3b~8Ydq{np#^nh z8jsFu&Y^tg^bNE|YB)8Swcga^wGRpF523(&M;}%&zUUzRt%JZ`m;qFdMarE;oq_A_%z`BnIAelRM;8TpSlHUM{RRA5Wzt&Kr@gD+`}NNA-U7+v zboltlqd7nQp-c=t_*YEEFI!Ii3%(j}za*uPoqTlar=#D{;wC88z`i2L`$kJ0^NLth z;&^E-+p7%z6A zWRX{WOgVI!D!M~_Bk1?thSqN!o{=)^vJx?}SE zl?o)A0Ai@A&_uTkvYB$T1XxtSwzFon9GWFO z;FhcQYp0Q_Gogtm!-s9Jq-$!!Zn>_AEsK@F5((Nc58|vqx{4y8pG6xjEDucSr)nqe zZzuO;D?O)4g5ZgD1~L($sVXFG6~A_-1lmArEa=QWuzK+B0*VW#GHf_>12i$&Oczjs z>X0icL|I2t{0E_Yf^AQvz&6`a)8nF!qrz8XgkLmyj&ZFa!Jq2{+{>VQBhcTf5V>d< z=vOk3$@9rv_^mYoS>lupY((^EbbEd$0>49M;Yw3uM>V4Cgc#=%lPMayRLOCiR%3(m z@*1JBt#M$O3r&oW)`VI*Oodexoovj&RzMTA*_GKqkgehYU?A7hvYO_W>JtDuQ(>C$TB%AJH(7iVeiZJ`F5h<>WTv{iTj z!qj+UZi$-&nn+@mu^&1+4Ing&+Jao^fF`P|=*U(34@l(t9U`u(*cY1UWlsu5)SH;) zbXB2YXekGpSmFu@V%jwW`mTiN$xZNuGq+1Fy0jwcH+Cbp3h|DCcjONmx|0io+Wd5B z$>L-d8Gb>oc2055T+_j8p|^87^gQ@g?sRgmcolE=Z68W+LhgWlQU}Ex7$BpnorxW2x0UHCuqbHK0Ggq+=!+**d-0C7a zWF@Uma`sOBLQ74bf$f`?_=e%ufk_&?n4)<_sUrg#x1`MC4I5Ijybv;K9E=5 zy;rB*)~>dsf2Nq&Wb}mAc<_B@sDP4Ga^$+V{XqMz&!CCk=RY*2^QS3ywl=l%^NXQJ z94qJzT+Q&cuMjqP6p|=I&Z3be(8M5}xw)pDaU(!?P@6c? z3B6PyXv|?tHj~MyC)PU4asb}{(~Ax?pZ46BxXEK7Eqqd80kow#?Du8yyxJ$J`c^c5 ziMbM*h)lhd?p}Y!@(q$*7jFKs9-7E6n{!LoamcO7%e~@!>2mn&3TpCP-MtV1(imqs zHN-l2KaL>qS>Y5)*4Zx!Du}1t*Fu~6K1q-4f5?s-S)idu?A_H0O*}sN#i4zZ6O5U& zy~;C_nx;b&eTpw0+%6qqaI2S54DAc|LleDB>oqIv!Y*I+RcJTL0K6YZsCT8@L}%jE zq~_2z`*ir~V7yDQZ_ie{udFPj9&IdYfHrklSnKJrjpD;A_DeGk{1bY_0Y&P8^(Co` z_*ad7N7>vm_#j7W>z4zKx5QH-_3v$6KkNkWk1L%Mb+;vj5j%-Aa+n1^GcoFf6Y?*d zmb#{T-6z^8qs-8S)9z8^NPC?fWkJt&D!djU)>+(WE@b zG)8^kx7uHOhA-LR4NdI6#QjX|OZHCeNnIukb%1uO37(dXheZHzN=3j%(h9$<=5%Ih z9;8GCkmVl!ss9kbN5|UP%?{kch$6dv_Q<|1!A9s;+;xtw52?<|saeJ=^-L~-_Qt?e z<8HM}gfV@xF^3k@Lx(OKD^PU`JU%LO={Uc_*ti&e0;u$3f3co1QWPWj_$G2E7JgeL zu2rl2X|&uB<>+kV_^pc)x@^3RZBduQ)Lp)8VW-l83LkUU?Ut5xM+8huD>tQIoxK#k ziEoW3@uw6z#d!m=%;!9ScH@8w5Vl@A<1I}ZIGy@WWko0SJDwJ#{ES#6a|*oUQ&Y6| zbH2&(@9A3j7T0&gosyg{>ZWw*Ta&mu z;b%uca9(pu*mGnCbqC3kE|~)Tj@!lYKEy6#@RG6et^ng^_%)6_Ic;EFH}5ls(T|@_ z58nx`@w#%q_|U{{nfVhEcd)C(@E;FxXX&+>OOuy2=6;@Eo0uwt*2t3uMhKaz{pi6J zzwW{BnxTn~E}v0vED^}7`=>0_%!`Dda=LtE{RavZM=7aaGK>L*@Dur9buxFLE^^<} zqnG=Xdc#l9raI`&=bS$vNwbzagdbkQ8iOVZb|`9PfF4cR=jCRu0q{+Z;K_`1RvzoF zT@r8Z&HYjctKST#&DN!Jp-o+LUOnrkGRZ5_#*%vI_+j`JnZNj?*ssKRG&&?q9LD<(z5={?nccSX z1ldcTx-{!#mR$qw+?R{ayw#ow|jJd-aTmIH)}7v*tq!jQ`V{?E&? zoL2OrDzxY&BYi70QI%g1-e$Vs1@1NV1wYoa^>35%Vo$H)^_TJYyAHvu1v;+B>te!Plod|x(+q+I+XBG9I zPD^xj)rHMN87! zJX!wqd$8he<*F-t4vZqm)fZ(sZ;wrbLCfy=>3qlh{?~URmfW1X{tp=ZOYT}*Oz(O5 zHE;g%}9$I!~^v!g;%g?So!*2(D+QEuT-)19=4`^L2CuAUK2j(ys#0Lc0 zBt`}{Q4jq!mF&sb1qK}gy;0t!192vjXqUt0Mk*N8d1K14Im_{Wq5t;>2K_AgO#-uy zY;lpQJQ~RGY(uT<`oh^qPk?gqskG7G?!3h&!FxkOP&MhI8 z9(BmWDM;1u#F|vfLM4?8jLSF7FS(ufv7kq;yC7q1V6@BqCH-Sk`F! zx0zADqId`y?#RD(#zb9P8lZ8(gk(`vl1W#+f@zzR#Ef1w0?&|VA~kMS4E@4L+ZI|sCL6wYl-*|Kcq7pQ z9)sOOTAAwuHdUUpPC(H4AKf1_z^b%N+D$jB@IuU)Gia$}+W+j5dj)*%tW2qGi z-Elw7C8RHm3(s`O^evi;={Op3Ekkuk9h(a_)!Rf4)s8;IatJqYPYE~S&LhV2H@+ck zpC1y0)TeKt!o$a*GTPh?=COF&Me#L)#MC;lsdn^3k~RsF%3Ue;aQmGBU*=T9etG!% z^$U2Lu>Y`Ky%}J|O&i@JH3|8{E*g1-wxR(A2JzT|Adf9|OMa`irYHs;=<{1A9VhTZUD zwYS}0L){O`m*PCF;8Rs&dHahhN*;ZTPfaHppdd<& zjvn#*j-%U$SOuZsft*crPKe1#%9E{MYJAU%7YNlux`Pg9me7^#@uePzRbfWBJ7(~t zS0~$&cH6PSe+a%a3jgqcdGc%3q=@}wP|W>qn!Fi|gwa|C!mR@(6=FPNf#5_eRv!qk3| z1yCvyXX>i8oKrgO^Vm)~Ks+VGY$-ho$ZBD~QI-8YNIRJ``@ zmM7A#=I@Wt35*&F6e;gWZ#<|5Annsw}wy1AJn+dNWqHjwT9jJ0*-df zC7@r=sYF9Tlx4*az?|;$7K&}u58mMdvTdaG*+VN1i-(wr;mx(45~v_jE=n2xLNWS+ zm5Db@gkTE6U|vD+s)W@qS%-g(ZTi`~FBc5{tYgJAIn-3?N(BxT#w57I>D75e7u73J zm_sf12_jgyVu11}Q=v)Sg-w~FR-WrJgG~)wDM_Wvqi7ik#&K^u4ScOiEeI)QRM?+0 ziJSbl%iPn!iuY{|Ib$3BPtc2OvMWgb=fR-Dkov7xUc*R*%|@@L?k_6A;G=YhC~CBz zwcaK%z($e941KC0I$?wz?=*QD@W5$cP|xVW@P$n)=YPJp7RTNIyX&{ zNAF|ya!#s4bYMl_(hJlhF=aZ9oHfoq>6;1$ofOy89o#dfc|FAHFl_C9Fvy8mu`rkx z8;TF{;!}eOHDJ)ew||mjsjifl@iCrCK?@i(b{FD1RWXsCxuViYsXe^%oKmTK(68bv z9;8OzF^agqgB3f6r}t9$q4h^YmHHtDX9x^7d&RQ*8*{zCsvWsu=Z4Qh~v&? zVmj`G%p?q+0fSOYa?28^$PcTQmYFLw@R01Uy<`Xd?8*}9jlGH#9pNlk(K@~AdhP9r zfsVAI^gwM7JY3o1mS)ho4>`{!jH`-r&o+V;3!0|3u>N~Nwhdofb;7Wz4-DcRZ37v# zQ&}em8%KB4IKV?dvy+(PBWzC`DZ9&Z4NVR_M=H{#6gq8Oh+ByL_C}Jtz!q$(>99~< zmhPLj!mY36XrUUu2S`rVb#|G;+%tPS*gc|rc+g4u<%(7h-ECHX@-0tSFWfBHROJZf zaMNI>>*x_;5$U#K5)8V~Lr|o2%TI$KnYes-8YuLjqA( zMyG=%TH)B0hM>hO0_S01DK`^*~`ET0YpXHICy?=D^gnrwMI$$dLYtMd3S;R4O z=llb(;sF!oKwZ`U-hDFoRuh-YY#R(o|yde;M^S*xQ%y(^66K*@IT)Dt?uY=bMGw&gZGy=t$D-V zIrYES=77Qfxn)O{oe% z!8iD@iI4Vw`u;Q8yx`8C@t=Xgj3sx5ULJh@Pmy4b)ALW;LNJJTuoQt>E-%Zo%&+zb z-m1Z%L!07!O^_6r>fzRKGGP}wlf`gX!mF5`z!C4aIs(~foa&-FZ?5RX1-Zm1fcsns1MHlHkvr%rAZ2;O8 z3}&R78w)eXNLLpG`7N;!|h`0CT-0iTZ+b@#P(J}81ef7_C4=%$1`jg%k8C*w=c zKowD$Qy)}g(%jOQZ1mwF7$}B>tz&92zIZGX5!qAym>FQO;<{aGr_C2}$)X6uP1Y~) zEjcs8H!+fm7CC2P?J&EPOt4~qt4p9Uf26xUgZfZOyyXlAE#-=+ZnbOw7u0mWLLM3o z21%5T>|AO>DJRf+apsGbdteYRxV}6cWaA-~$ygo~~f2D+WICZqD~V)Z!0r zqC5IKQU*@i+KCR%w|q~6fI*}bo5k&R7@$wL)9IMWLNJ&Rr*Qk2qf`hm30-u0G5qyU z=@WV22%}pP@T{xYZY_Mmk&=6S^P3z7^f#0R+$9@*!KTJ5v7N|*?vK0oCRN2eR5HLI zaVVg!R2t;6u{e&66VZ5J@aSsK>zxxm_=}D0^y)87cfp_x^CP{BY1c>WU1^%QN{9i2 znhL^I-%gY(Qi;7pC@J88K|V=3g}GzAT5VrBF7hmeZ*%n&%gt4}i|E5HF7@w`Wjnx% zk@3SH^ZF{xxz;+C*%NKZ$%a32auicxyrfJQk}1q>{NxE&Wf|$VFOkS zup11v?ko)2ajc=-W1%%X)JRJuBadBvG>AJ3 zHdR@qsLOrJ5v<~`_G-Ct?maM=DA#M^>Z%>=o2wI@S$)}15M|SD`Tk_F2WG7mw|KGZ zw@?nrO^gvrN%Vr88Om&x#xMm2#~elX{qCv`8Yf=3>K+%vouk!TTK-sJjxpr)R4eeo zUvR;SUr?DLn=ILC-!lpkL*h0J1yKnBIy-fenCHKNRc&SS4)uJ9xQ2KQ?`YpKl&*b9 z^@5iI)tJN9uU7G{xnGbih~U)1_hXHxiE5P7C+9Ca5b69nlaLvss zap`q1$QW|7Wq%rQlq$V4?2N=xCI`;Ag_3vb4nOKH-*cP?w1-3+yYvmhu7wN`=kdbZREI zWnAP0_W;_s_A)PqSoqn(1Zuemeh4XY!a4V%ZbI0mYq_QWg>kACZ0aA*wU~`v9(Jp6 z*1hhy1RWS`3dS|e2BlLfg8Z>1lp!`4Y$N;^!Nen|71Bagsay`;9wVufQ}GAIcS(~G zff#LubPlX2w72uYF^}0OzIhO*oMXUWM`p00Zd1Iey}Pl%sJgVN1*|BbB{~_C6;4qd z3Ks__2|Rz~R8ZZ%v8AD=JKoGv>sBeiiWt#hze+Sh%0`e)M_FIN%MbbQN3B&@-x<{ER82;(vg$!QGq*rpPNDX&n`pK^_a54HU+A)ia<|{7ScmXmfx$tA!wO0e!4K15Ic%*qaUB@6iS!`% z=MvZJ_7Nu|<{aT3K<$JnX*9W8-{s+8@E4NBV8!Kj!pD}=j@F2qG>o{&uQR}4Y-`8~ zwh_OA5$o<6RWbS_82smtTCzl@OH|yswUp@l1Rfx<^ZRCEpigoam4%>KUE3YNirQWi zHqJ<$acvQ}wsuaykJ?=E!lAWleeQdC^kCW(`U5psQR!CsnZ074{@(f>-GK$cYrr6T zWW{jSrjtkVge2Rl%JcBps%fysyoWfO%%sf?s@G!So_wYvu~zh>jge<@0niS3cr|d1 z!bwJ(bP)9tyALf;JcJLqmDgJ@8PpTt2lCYYjn0p4eM;`3fpXMKz!?(dc{C%qp!5a;}QER7;~|Hm-0t z*MG@T8GgfT$}|7Gy{CKLM1V(*|IJrp&BqR0dNtP=`0LwGzXpTf{r2+mtJ62nemKAD zms$Ex@NQ%yY+bh3Y?y<>xoiKj^toZ&sZU3*mpS0IJKmLb#{@{PX;MM2Pznt&- zs=N8go`+Y~{x%5)Pu-lqHuo3vvSpP+{rz!}Cm0kR{ikqo(ev32qPZpC|ya-e2MQ^!{A>=RIIB@%jB9X1#su85{h!R~$1Xfx$Z&Yh8Ofp6(g?a5mw;`;Nd< zPxHQ+%Khe!0sgZ4-5mq#;RE1`ZOKjJ!CK${G*sC3FlTmwO~tv6C;c#@O7qFDsd>nn zgOAmdpIhpj)TBKJhT{Ltk;9*(Z_kGL4%5q`r%%T!cN)iCz^1Wa4ZZEl_atpU+2@ zkX#ORh`@>$7tRFN{gfxW+PHWdGX%700Dyt+CA_}(T1i}-+pz|NAs`2;9=sp)6>g%>y+ogL-YT+xdaRrJ%1bh z+2i>o`>*WU^JMZDc(v2j4NopC+j@n(n&SWdo|Mb*$;$r|<@|IJb1rS@b=!Y_xdM*^ z7soxkx$y<>&C#5?r-JJm_{jO~_2qBq&(#sy%j{$YB^SHxerV}M%ZGhJc1wYhaeb!s~)N4WA30M^0uw)1UHedr3aqIwpuUbKT!^~ z3O)jZj#+o|Step_mrs;!KDE;d48~h`F3z@8IiS6ywk3J`R4^Ddbf|H2Tm#k*Uwml} zZ9fVIs|6&-(SwpR!bNdQ3zgJuArlTQI{t*-2 zsT}=A!{Y2^h@k_QZF!XN`Cmp!bQmx-OB_3~@~dPLe8fpR%J9C~HT?g0{S z;9V_sS$jurxReAa$v41?GBbK_%hs+PM$`2D-RG{Y2ZKGrTdf7eE>5}d+_MYB>q01q z>iV#m?rcoQRA^a8-^+f7G6{4{xb^wOT!JJ>!b&2Qwm}sww{%5JiL{{@>?kR$;i{7Z z80-masE(ZCo#yNCf%wpq@Z`#aS;AnLH6@AQSMPx2(Xn7f0cmYRzryljpoj&I_*i&8 zFV&C`6TLm4vz#zdysaGzAFD1zbUi7C71S$QS;S|w!cFaUw22ieG9U5fU#Qb#Pp<;E z(R8=W!xJy2?OVj_<(e|NVDQH#;dj=u*tUF}IhQAABVZ6=5X1y|e@YEk*ppMPb_9d= zy10n@7{S$DlGVSq`PoHE_jE z4u4iT*|?sg6=vx}tWPWiE0P-(i`aDhGAloXP1PeoU=Trzm)V$G8KX&kTy^AB9T=3( z7&U?}_iu%Bi|&`pK7oJLQ#{@;-A;B0HqBtYxs%u7o5$nIgT#>TZH$x!^cC^tO1LXW zDf~LQ@Fh<@@|u*UyTm#VZsSOC7A04Y_=_x`b>?YJ@YQOeZ=E#b`w*LqwGG|nVb*uS ziYiU@nJ7Bb&eUF`yqdu91%oSc6fDJAV|2CA;S-xIhbAy6+wM<`{m5=X#+|B-joiYm zU~uB7j(7S<_3zZpcAZ_-GA}T=(S5AY#d2OMqRK`rOC@}L9B0?cjcQMMaZJPw(~hoh z!HU|ZGql9myTUgM&kZWNg>WCx*Tu%%oKvz|bdR+2M6#njSTVmPk-wEPGa+id%<{$y z;eigqSRPeZJkG#NuS_I4mUe*^wZ(pj!t&88M#55$o3r3sD~G(o(yY}d4hc8@ny=)X zR)ZDgtg?N>!ETRQ3ZsdVG6OtKmOpC>N<2nVPnxrWGgywcV8vStt%NOcl-I_i%W_>t z6XAJsgRjFk2+H#116t9oq@Mu`M(<1*VvF9h9#k0>SFP&cS!+Xzm~|n<-AD{JYD7A| z3aqH%s~_;)#;SI+*Gm7UZe0updCkO-eG!2p%40dlG#D~GOGZ4wmm8!3T$y)}(IfX= zZX`x$Tv}`><{W7pbN)spf)}6o#BVN$^^J{NTbNr#TOl3;x3S%%>iyELg)~$wnx(Rf z!J!p|X4i3ZeQXc&@bSgDYwT{r!QQ0EkW%4cvazM`3AWG`9+jtY4fOuloC5W_g$)CK z7h z`Jp)^@W{!;R{ZOabE`vZMRaYOD;T_hI;4upat3B^?UCZVk56s1cFWVQC#a!yxm?O8p%!So;+v+25)aC#biX^tqSJz zh5DWv2^cIGVv@%BUHIAYnCKS=iDobus7uqG=fv7Feb1|l|ESpn218u9X3K$M#>^2m z$@0qvgT!oWS43uZj4-LUn7ZGgIJ0*sF-l~2&AHZt+qC@}CkL$P=(LnnpLim*wK$kX zrk4o7VA*bN@wHWk{VdbYwyhq8$H5@SxNd1fU{^ZXFQFz{(=h}F1s}B4&N@Zs4Xj8I&>V{W-ETeCVyh#ghj>sBr7Tq>ieX zF??f{7vPK`r#X_agy}6S9vM$V^^hbRjn@cZPk#&?Z8|Z%iYu9Hn zDTk`!uYo~6>&pk>ou;O{S<3{&2}8Q&kxO5>^oF9il*%8-m~3V81Ke z^JMiiZrcxF#fODgzB~JRac$9+dDk^Bw!@ExjDPy}fh9%m|I1+BT=Idu>tMykr_cYh zXL|2k$k|~$?dKnlf<<$y&lSBb%6<AKbhA?J}#2@6Y~x z?#X2NQ)@6dJi9X2%4(bzLR5cEKCl)Zuo$4JjSmip?*t$G$>Zd%7fxWs;ExuLY|WXt zIQkj;l9S~hz~IQ%w?URia%zUqC;NNDfpjofd($Sh!E)T1I%S@8@Xxbv!Qe+vpQ{dh zTGIISU*U7#Gyj4YywL~ecQ3o+InQ7CaPfOTS$zpseEn0(!zVp8&v&cmGgsf}d<6!J zetZ7a`(L-exwYpddC@HKV=$<^`Euu#Ir1~kZ*O~-TMiY1g7fn!j34IzYRY&$o%Ymg z2{>tq`uETxOBoP3pXW^`(CAP-MB6`x#r5O*QJ8WOtV!s65xUyLJ`Ug z<+)Hf1i3=4#1WK1xNHt4KN}qm1yKkV6Y+0!ORI+>2pSP%{rnl2ZbaOHL2%$u0V>z> z=7m=xDC<;LG^^nYupojmV- z$jE2NTsni?k7hf@61oQ2?gJqo=d&zeyWk69Vu7v!=-@=TH` zQ6+*W+j->cbkSy{ktNr`gC+W~o^))#qTyJOj9SxZeFADFiZaHt(&`EMGx^!b0w{$b zHbL1(ojJ}(X?AJhUlMq_taBt^W107ehJcQfn_Ok!K=M42pOQ!-qN{Bd)Ph$Zgp})t z;^MfLctvg|#^l!pZ6E5ImhB?(<6sH7;qYFu+%JzJAXfPVitety2L9rWBYA9Vs@O4c z#i$msd~OM~(lQ@O{p*^d7LW|^F1emf+#D+;5<@ywV^GJo*7fsIAjygwjtwdl$NyP1FZ*zaP zE;2K!)uBKE1?Q2e^z&$gb;qW{^Py14a`Z-tNSB=2XP>ZzvXes2f!8%!`->tGq%yyBr)$4l8xN05iW!D2-aU9H8^$t} z2&o27WhjII?TmN&qc&andTkb9WWjCPu`WDy z9$3-3#2O)l#t&PZHf#=_2OdlFh}e~?&Lw6`MG^3>!#fhX8qv5;o?7e*Z{0iexTP7@ zWOkHrrq_(Fk%;=>u^!qv(n%aUR@*&TN7zTwFIe#rxn^XArgk46;-w zq|S>Q*gqnK>`=s72?hy0qC$s}n8Hu#b(}*6fAIbk8E71RV5kmUE8bq7*}uaW308C% zXwS6{@ZTnCX^KwwH^Eo?gmHH{vrNR+h+0Oloq=#uJu4LWM>$la8l7(Qad!rIT|+Xa zi8o3r%et;o(y!Yyibue0jNwy!?H9+7#t%E|@OuWsz+m?(#=(Z+Z{-gM;w+!i1iOO4 zVc|f(F;qk#b=Mi(r`m{MP?e47v0@Bv@h))=u2c_SylJ>J+@|XoAA1L?fBg1x3|LW+ zZe1*A)yd3>MQCsOHDxtJLol=0<+#BxM7))Dv;W^e0F6fap)*~MpK0o z6uP*h!p4({;W%9b8Eonj*3r0bj2^R1LLvNG#8QL7i2S*0j>5uwXd?DQl&u-O=pcv^ zk4Kz~IHOWu$|IHwd?Q#;HjxW|0PuHMXb5U+wvig<=S(wsg?_eG}*_hCBxXZV0=`+1`K)^ z`4z;ajvv(4xfG}NDc~j1-Kn0~u{y(=h5GhFjmr@eSh21imlD{u=^1WXG>J=w2U1Z{ zg9RcN%LWA#r!wi%Gw~RvP}VhjMbJR zdh^v0NrnfBgdIBq4$dI;Shn1hkWAle9Z7YHM1fsLB-?VEUsx+&=df8%^V1)42e*+Q z#<8;*cu-u!;H_WCP{8vDK>L%OJv(! zFqlbwseMu*8O?HU`{0nCDF%bi>P_)?oU81qF3FAzg=PmB^xRENa_c%z)2*vpO0?FY zz@XqszEGZ0kKX5o?W_?YnP3n>$`};&a5FKqDiwE1y$uX5^y`VG%m!n!$`gD)v-Z@3 z!E5f4NTDu#I;2*n*%9M_1A_$~XQ*T6<02YnxB2s{g1KNYJ;Ki;q&?P6m0r=yrD(uA zPLwm(5?no|by#A3RvUa9tS2q*PbtS{p#ylpBM zUh+9aBEJalOFNvf<@Oyf-6goGmIK3C)m51_`I}@bNV7P2uX_Kulvt3aTCcp-YWh~b z;}W=YhF2QbFOv9owq|WnK2D0<3@&Xq!`|&Mr#>gXuX-3I59$G}YNxte(j;9|nU7Nz}?2@uH^6qXi!< zCTii%N~W*r8_HB7%;QFj~V2q(T$0bn!~?R~J2{0p1$ z0$GLl3}+M!syuP3@3&>Q%L-%JS?5CGuHzb8qEq~^i>mroPLZ+O2zQSaFLXCnC^}?*z1-`45r}v?{3$aW~(QQz@S~{j9m3)<|mZfO~a1DNAM6pTWWxv18U{a z5-CY$;S43nu3HS>t!_Rc#=pMZ z{rv)3OH^2Q0@znYTKiiRz5YV?B1vK5rj~LgxQ#v1ZALLO_XuxPMU6K5!(#_cp9Q6D zvhTFZ*GYAL2&x0Dh%F1 zD`sdoR9TGOLaK*{$Tg2wJ2aK?fA=t-DIgb>wSg7KqSX9>MzQ~zV^ioC@L+K8T-m~|%06M}B7S-F-~+gO)L_`Kpo`5f@(YeHj#zvg9+HMWS%zZ(})vr$2zel*Eg~{zRGp1Sb#6~gL`t6 z6>;W9L$%O@6g$iMxSHOfQ~TP2O{MTYBHgic+@Hcea^ij=)tm4L=7uNc(2KjD!q<);=XduHt`s{S{QC8)2a8MKL#`Hy&vdQF&%d6y zFh8fb2|fT4bt8B~B!af|?V+W1n^(YtInNw*vhxYg0vFbBm@lsefCUlu@@EImK4p5A z7qe1dd`y9_i)%Iy%Fe+dkm()4`$kS`tM+?ncbHL!8fB(2N-m)=AE8i^r>2EMN>Ga&L zaQ3^fgnI`JW3$&L!JzHQEgPzjyS)AF%>1ffYI@7T;Lv=vSIP_iPnwj=tB%$5HG)Ce zC87PK)BM=dh{-g(GzdP%N0#h%GoDvp`Qp-Y!B=jF;gwP2(ks8p@={(>PLu?>Sw6;r znu_|LZ+GSqEB|BlPoWs{pC$kKTkU$O@(i@ba`NjksZ*!r(#r-67;HibrN-7WEE$b5VEf}M!QfF!@5W|~nyYZe{NEjY%NV&Do?B zf)#h?*E%h5zvb`k+c6`!nhwu&#-x{)c%Z?|C8}ysKm|AG( zpc+Vi$O6o|HH$b2a5EWacmd@8K0-zHW`gY+N+(nec_680nWsIMj^64e?OA~O01Rr0 zB54cnrb*d<$-N@l4(@LT>+Tm)$C={`PC{&^VFxD4Y!iJlOTmf-yd1)4fIVc2O9pdwCNqj+TXt}z>3v4OH7(*h+sI`u@rv8S*%HP4DOZ@@~ zV=sBBriQ|cIe8cU4v)Fq6%NFC#uwQaqWf1nMS>M~vvn#7Sy^G|6*(jyVTqw2N|%H& zXex{!lJ8?vdfnb-f>$l%vL_s6Z5?(<1vmo2=3I2 zxH;^Mas~HH2p6CFU@Q|1O5a$sw}iN4fFc`M| zJ>ThT6wk2YFwA*YNe39roi0{!Xq0ad%NFMx0R>;HN;{W+vp{ekGv|zL9>)q}!HUUO zwC1?MtkKXCeEk=H55YavsGr9g#u2e*n@SoUfbOcraX$0<8 zu~G$gGv4-H6k_wKWaA&xV8!EYwLVG3f98r8QNs*d*MO%ggmu(g5dBwYZLGPO-t`3m z?m8mmY|=FoF5#l8W9_IwDE+t(BQ~K>;=wE{4fA4w!LohfElT;Z-0y^G0crYE4Pda?yOx5^RNOC# z&Ni@Lr*%U?lmqeFdOq5-c#OP*=N#}Z-YSCqShBZK8)Ppp#)cc=gS=yiYKp3^TrDXf z9oE`%xKLA(mH-mHLS%GuSkSN2RwcpbobieZ#k#CgY70MPkz?&UIGwn?+{tMFQoQAu zhkt#50kEmtL`iORwJCQyAFsn_=4~yxt!ST1jesRE77> z6p6n@LXmek{n@XcqEKCC`IQ)|ka}P#xwoT5M*9R#<~gJw~r}ZS)tO z%MhRRyZ+HZa0CcR^!$K$H7`MO!k?1s)$#d#uwqD%V>(y6qwqWTVwAlcfzLSz;)8n< z;2c^vco9ue=yJe{c|o-?FKC4-b@I0v`M2UTz~CmYMYjfS2ZWheC5rk;*Ay_QXbf5J zYK&!931_nJ(htGc4psw=?h;haFxi%GrUt*{G0s1V5ry^Wq;0ErXRp|wU$>EfI-rSNknJe zey&GCtG_OIA`J|Fd40;CwSsapwODk*SuzNZ=GDd-aS`kRM|>Z}D7s67Kga$Z{a zEh;Uu+;SAiVS^QyT;mjU^_&b_JQo_2W4C297-XVx!$WtyVp3{T8*@6FhQXk~;UQ9b zJ9`U)xW2l5;8r*obUiXt7BF;M9U&<{@y6T?UjjaT=GyT5cIJ}ZGRlT;-rI-=E86NV z_}-wcGRJ=wEe!NJ^%e~BUXFwg4J`it-Z$U9dHdUHG8pte5{BjUFK-t~!KaNYcqgnw%}5W&7*FDu7>>60(#|FL|g0R=5b zYAku8-Aq)fWg9MllQX8Qyrhq=imM8>;WklOg!+j@B71E%YVCYL$Gu0 zC3xt$mh;E!7n)bef4q9JJFQsm16Dk)d0pJ^`^^6MIQ^Hu7r8cp!R6~x9(q1~?EZA> zv-!+>^EF^_$(*eAN_caBt!+*q;ZFD%6hu8+{SV#LX^G3K%9Dr&c*#m>9UbjG6d;{s zvi5mf{thaLSP)MOQfev9*s-9??fK+}qH6Uhy8A zUEc6yC)dQgLAPYoX?7h8F?IdzP(cLaiE>zEGfB_9HN{hCd*Go?M`|j&C|Av$bzfXa z7&|usR%ChJq)erx6Fcjp^)8|C!yOSM0O2g?Bx|FzQTpN&VggvPE*CTLsM{|3kXxCr zA~6i^$!+yb-%9Du9GNmqi=qd9hC3^tA@!ePX0G$S-O_#1J9FU!M=)xIM-U;QM7$7f zi$PT2HnKQ^LNZsP++H0bi2NuUzO%w}cia6i=wGd%X{c@S?{FXtYQ3x9Mg}?()1eQf z@ZKT4=8%Z_`QB+%d-lc3m7j!&=8HG|v`~Nu)sGI0@p;sMwADs>c8T)v|F0c6V47E!j!-)=$ ztc~}l)W3+yoNn{?WqrF;3wIpLGrLy{8b`yOi*%uMttJX=>HrUw({6c&l60GN8%7n4!bN9IGS5cmdbkROfd$s`b`a z@Lnxr`!@W0rU#lw(i@!B0si166>`;Qi zL)Faxww;KgA1N(8)-c8L1B1s%1AO<2g4&QMhma}$c6bCpJf_;V0aKRgwQ}5}NIdio zYtG}C?_cnalV$F%$(T+g8EmTMkl{9C*Sad)m_D1{ZA=7%5sdQPa#O|a9#XJTW@`s8 zujdl+U3Bvg8w+bXZ=%>~@ChLE^oqtBTmQ_8#7(0=Q#^2BQwzczmpxOba}&j#x46-5 z;KMoQk)y+UZceG+=XL|7#onG^!3K5}mWw4aax+gPPQ8b~EgiUDpNiwu+G0E3;zZiV z@ReiVkwy`%*OKojeOQ71hEH6CVDY#W}2{G?#MUCFFqP5OPV|Y`%SuH@Z1K z4emI`CLL)AW##Vnr)XTZ3OnFK6&q^jtNVC!0@Z3Q*d8fs`=jrSrjXq{a_@!-2|Zc=+jnvIR{&XGx~gm;DHfbI^p zsxNIEzE*XgR>`0B5KVEEjHc77SZA=QeM`kOU5eaGv7@wvk!45lEGGM?qf=bmE) z`X-6NV1LO-mvy|XJ9G!%Pu{JI0fVg_?Sjv9ZPMLWk*fHaKJd;lbSwK)jPm9&fpm&E zV4n+C3|_@;RN{?6DgH>}=CO0|vUPut1k0`SXp*!^dSVxj1P=kq@qxq^jbZV~>ic3- zR3F^b>o&J{k8Sy4w)tT04d*iL9Jq~z{!Z*hP1Mft#Wo=|?!UvA$J|eojgO1+s%V1u zY(B!762OX)H%#aIWHvXfg+Jm)rp~}ua-nJ#MMZU^GpnTa8J4*YtVsGare%j`(@0d4 zL=;J)!rQ3ieI6yQb*}t6^IMmw!t3yKMd0v#%*fzJ?mhV%-LE&=!n5-3XBOp~Rlzi# zek@j~3E2m3BQikG8Chz%Kn1Cfpw`gfi&c`cz&7lNwnJ3fPmYGEPUDWaQ-3t z*nDm1fwvj(S#JJ+xY5kF)=nQh^9L(hz8;_2?9XqM;cx!((d%n_z+hwG`ktwXhsPT) zgy&|(m&40z7==n+*<|`$V72cEwKCZitk^Lz{_)bUUfvGBlOp!_{Bj5iqGoJdBi>e8 zt`uu-aPvVoLph`&V#%1alJVxipLt;M0rFhCL`<^q@?Y7)X#v>~7k z7BvY067C=>TH6MUT-3IJ)S|T-LVyGjLqG&Xzx%8g5iFRhgA`Xc{t zk4x6tV*0-An%He498vt7Rr-SZ#f81K;unQ2n~BeKvRihP{dnMa?IpjKw+5#Fop=Sf zsJUhMz>(Xl{G!0Gx5ZApj_;}K8nr$)Z4AA$xjb^~Uc%cskQd$_=bml%eFiAbPnzx$ zf5*yQM=aO4Y=4on(*CF2UBXZ?yNZm`;dQ6Nf4I-d*h)O(m`-nawXd{p)W^1M+-p2| z8{vr0qaOE79%Mb9|CVI-`+a+_5;mM@e&l!Z`SXzhQ9)h9lD_4H4YyLaPkg)ooXaf_ z|Fl1T%RWcg@bcegMeWkOQ0(f=@=IT=9U^Lo*vqdzU;l`YeLSHqsO{<*{gBKtwtgVMBMCsp>!im2;7Efj5nvo<-QO!1Y9P zWA$8CP#zVBSy~rso5%e#W)iZd3M#4p9 z+2k}23L6c2Q-4CRbx=>(aDMKwG)7PA6*nKJz4Brz@x-w*S=K*NX|~i+C9F9DP)jr- z_H3S4b?t;>$PSsKEP9mqy0cSkiP>^Ey_XgLhLa{Fv6N^);OgMO3^y9sDp_@5yEl_? zHy+U%sS<^Urk5(iww~GU5e{hTosG#l*fUlSzDV4A4%A_Cvkrh%KH9fbS8) zMGcbr#$|`H{jca!SP@~R#8YE?Z|)LyL&!YcJ|yf&Ch=D#AtKJC$eds``VPz7ut(ns zmy~N`qD+053RO`HgDC2B!iF;IePNs739Ts74ZV?8Z6$1|(=YZCPGyS~vKnTuP?AK{ z5DE6?OOkQB{A4KzArEUkV!bA4)Cfs9*pzIW1)OgVG*6MVNI6T_iF{aBylr;4T%|l zTS3?`zqkMVZh2>Gq19UZ5n~_mNu!)v8>333Zo2AIED7}UA)ZmQpOse5%-u|nxTrdq z43-1JMFomR=^HlA(Fm5{72#ks@o8hxc@C9xA*G(3o>GG?In*NDTrdT>oaDQneUde+R`8$`35Ed&Dt2V_tlyJl!)g_EN>RwHW zFn#x!IfHPE3L;B;qRV_j;)9qKA)FO1pAwEZ+qo<}wkn~&`J}Oon(y&8VZ%o08Q#J3 zzMrULgF3<&nTgMg3V1eEBlZY5pkqC_*jKcKBU+MI%+F;argic#PuI44#QSjICWu%2 zn(NHXUc(>Ny{aJ`aYt;Im*rjhv-RRVo%=gR0|^^e{`yv^Q<1NXf5U5y3tL1uA_B0_ z2ztCOLie0>OeQ{L44h-Su3p-$+<&0949!y!zo(?xy%*PLr6wO1zNly8+Q$W~I7EEoRA5JZQc**VTH@rE-Fa8z&4r5JVI%VZ+=`T33qavaa zk(&1gIx2hT@n~TW#wr)S%oZ1riG5pvuQ2RU6E-9b)=_N>qN~Q1fBBRHNTayvMPaHn!8pP*YWwvMHPM+uFOKdr8sI6Y=PRhBa9|$I{16%A!j(6H|3L7Q%);Y74qc z!H79L=BO6 zEJ0x@3Y*>tnyZT>o{xjaP^wQbGjgnT_e!4aGVzjT8Eq5I*mUD?@gQsLbI}>1B?Zao zgE4h}OpC2m*XxsYvYD`9^&XAm+sd?o?s{zwN8BMMYKQ=b*fL>gh$3f)A}x~m$T)PR z;D-34fbhDg{`5M!e-qJopse9_c1)R9N>p8pQ?>1kJ7Gg(PkwAowqTC!xZA`p>s7=T z8&72WW{D14?injX)ag5ngfBmmU!Td`8-18-RAP<)V&ZJ>?^)XykUgr``prBw8uB&q z0p}X*%Sw6NdS(gQQzf0AG>tGDi+9f_zM0VRgby{ds0Ex{Kb>f2OljXTvU18TU-I1T@ zu8FPBs5wh8FA07S)0_0J3V@6R0W&9y#wJ!diT4#)TZva)+)b-ZlXouh;! z+FJYMM^4Uf%=l=^_M#WJh_C(I&t2ji8VyWv`9=9Heb)9`!V&lWdR{PTuRHscJNq9C zGOu+JHr)Tm>9jwd`Tu|(E`O0f^Vto;hMDhAd%`oG+4*AKLI=*tBgC)cz7@k;+}|CW zJzlim-hh1sUjOVFq&^6cy7gdWb_*+8zlnpj*yiAu)e6Z?x()um`bioXz`&EZ5 zeLrzHi0d$;^L2f_JU7WtCg`IQE~*Z_GgxS}trK`TQIJjU(+L}@s9HA_g1xMcO6|y@ zyvz$W6Zj=L*x%-4kiZ|VB7TmY=Bt4^#qdFcLJy=Ozjne!6_h$KZMu?tS)>YtcL*ee z4gEWLR_uEah%}xy1;2R$vwvZan=^z}jI6l5MzJENz#y^8C8@|K? z>kX&|;iIS)=qg218PuJGBRV_j*kCtsa-QSAPNrfJujDj+PJ+PPSxu86mV?|L;#AEv z9dM(Fr$^Idb959R;tevA=qoULQX>t^Suzq+gP}CEj%Y98Ms9-u6fSzf$T<%|-7S2pit-@b^4y#l|@CG%L1qocN6#?x%~@ zMe3@fmBkFrWA~4w{2QS!8&z)_f5l{+1%b6##LGpSt+yFgxN64e%s;X=28s`MfW1iSBOKcNVN{PPtBAoBHb=F@|0bnF*24rOv8FkEzI0c1R86D9{gbj}|xs_qqYe(mLeCV-ZR!T5YLuAcsj#`V7 z!lwX-H7_wcZnVh`QOvPb<;(=vpUYM+BpMF@PA=HKLr`#o+r?4fiHP|g*Y8Y%n0(hN-UHrp>;67D%?cW5J_-tQP8}O>1pbZj%cVaQQ@#890_7v zJ5Xzb538L)IA;K1rEAs4F(I8JMjfNWCM5odqd_s;x~p(NA{*gung97N;#X0Wc$@VI z-RD@T$8vzon|Or-Ks9Ax@=KXV7o(w$M-L@R73^dVtF_4;XRhebp(sFqO4u+?N7e2< zWF8)mkIyk&5fXlI6gkdo5Z(Crhz$F%Pi6c|Y*X@-@kdY@2oGaxhI~aY@v7_e*m@b7 zE2oyM|K>>l7TPf3Qw%aZIQB8mr=vK1Ve}Ba=NMtb&^+GAsXb-#{^_&<02*In-v9t> zKxCG#o4Qu>ZR|bbD^49vjj504ap;W`JRhZg<=+VxwWL;CIE@ZesObIJnj{JF1&5rb zP~Asd$>H?yfY9TybBNF5nXxw&jr=(wPZ5Lq6dmD)5zuS6`7ucy9_w;?v{|boiFY^a zK&PdL`x(ve3`bVWDkpBp|E^6suP`80*MDZ^(6}UxFx3XRkM}7hKnp#z>DZr!s3Ep# zG<}cp?YpKh$)t0kAwq$?q zKStPa?P?MBkm^w3b6dP1! z@C1?|!pm_0+k=%ZkIqgXDX7iJ+nr0?@N#TooG{1a>dZ1J_sE&Vw*VP~=Cbn0M% z@|(&EA>JR4oh~@w6)@z*96Mu1`Hm{WREHFiwb;w5L_UByE~)AzK93h2=Pl{{!c}Jp zVYVVIh2pbm9np&J%<$WZxt)yU+i_C9+p9h!-f|3W_^1Bg|JqOZ@`J+hjP=rz zThEs5dNI>!_6y>JPU=?D&GUd5nSZt`teC3F%rkrI~qC^etK-bC6^-*3_gcG&_Iu(d!DnU31laoU zT-#2cD}Ft02;sBC3TfjST%4Us%(dOE-fH6UhULLW@_Z@B(!F?&gmV)DoKfIRJP0NB zolmIw5(huxCWf4Js&}M=*v2J1EU*Jdo+6FEj83>N*@5AST)+%Wr`irWh`oUmD?F4B2m=71 z4@-r$t0^q0CeN@`_Y$lNl{|#nL=jveT0lGC+JriVrh$>ZZwhfE_tl^OEpLmOnExYQx0jfirs%6n~u8e3g?ZC#Y<^X2H z%j9kTvPM+@IbV6o96O6oJd!L&N-d$#WZu_?i5g)IXEdS$lsZ3(>?P{O@EW?rQPV0i zNt{!Nh6146h=_p~s-ZTx4zqNGvx^Y3?F2zonEzmg;c5MfGmDniKD`+k+VRI4* zW;LLFL@zobFgR%d;k~g4U{F$D;@+ZgWd5oWx`0BoJa%x178J`T{s^ocP-s@vS4TX6 zX_%cO%LGIXUaB%Urm61kEB0#4aS{{tZwC_hz_mO|6ZY%jOnkR_RM>D(q!&^gWV(x# z#g$u$#zR=Tpz&bq6+lUgP2YSYnW&u|G(7ohkZ6j#iU<&6_dHyK{)uQ zHa&-pS@8d>`P2T&fB)aVKkDU**zI4PwA)_;6bhi2{ov!)M4F?@9tkLChLJWv`LDqJ zUta~|{`Wup$D1mY0R$UP3B0-GRwYe_0)VI> z1(K!%4pbcg^kkhzLxbxJaP%*%O%!rkKn7LLHv<@i9VpH)+TL{F7iJwnrz8zRG3-Ee zY_Det?N!r6%NBMtbR4V2RIG4ZN)96RMrxtsfLXYnPH%P`(oq2NrxH@wL7yUPiVMX| z^+r(WC>U`~qs88J2x%>>1?bYI|EWv=0ci&oV}-L?=c+7~Lgv`{38W~UHDLSoUOx}v zKmtSuoJ7EZt<%AW0EkAI0TeCD2hPw@JMfKnt`o?{+5Vnv`TyK%|0xzC@rn}%2ME0R zD0bpjoEl&Ufsc_$_1|4rcEM+bu;N+qv9-uTiI5K*aiZrucH&bRqbvh-3@PLZiejr* zcN*KNCM*}hca>iUYG$+x{+*z(ZwLOj(1C*#)@%L%L{R}sx8j&u_$v@*CR=T|cz_KZ z1}pn#AWc>A`Vf6anzVufAcY+m`q6O2sk*@Eu7IHdROSV!2WeD>Bv)jJ;2R+ah^ji? zz}AZae9r)@;36$pk=F8(khrQ$P;v z;6|Ee87SOB(TyC4!x_tOgiC5Wld9)b&R2REDQJcLn{T0sNM1_2JJRYjx845C`9 zJ`oCzpup+RRHD(~#2x~)P9Wz4sy9c6%8X8swH+K&6r?a1O@_Aq1|%Lj4ggCB;%N^- zqYU+*s$;`3?7*a9)-#%vooW_rE@J9Xol%^npPQV-PIM@P71c;lxHO(-b>adg0H_95 zAS!_PE%noz5kJI{kDIQVt;uv$=Z`9Oz&ATUqCt3z<97JY3aoRVD=h5eswTajKaWt7j3r<9V+4YdwXsj=#V@iuC;l6~m|e zPPww`SRJuCSOKVaqZ}fYJ1YC@@94P);k*hO6IBi6OyFSP7}FZU8KbZdZYGvaCG&(i z36c+5PSfD_0pu2Q3Z{Se*k>W$`sEpdl6u^pjnyEwTi--|{ zvBbH|Tn{UZOwOn7DNJd28ZbNRWU;WqLuC3j^^PUfXu0e(GlY8$R*X3wVqr-#qRAxe zSIk9)u%cfk0)VLsZ*j;1)d-4nZEd|uiaCOc1ad=08J;30qhpgF3R5BBjFLia0w;;PwRQ`|qGF)K{p&av!XcBhw%s zh@-Sr-w@sr4=5~3{zEv)fCgE_LiCEz4?Q90#xrr6OyGHtQYWDtUfLj|QCBmm@VyEE z;GCuPb}Y(!=;maYLW*{|yA zo)NVI;c()p>I`#7A*@gURFRcwTj9lN<+N}nUxO7<4m*?U*C}45@#BI;@;48|3V$@w zBcpf;?OJ$=L&&Ho3sxj~U99OI5LmRk2lutBYT_P( zuMnZ*&Ww}IJ8MO+;3P27da*5#p=ZZ-xkc-CTQ9*rM76;VLe#J^x+jmz8Vx=MD?%UA z4*2Y23^aA07Ot#n#kui8Br}qF2fG;@t$=Bu;8Zc!)7eI@wNyWn5!-2@iQC{Pm6tjS zLX0yhY=P@!cx>_`Si!7n>GrJ&&GQTPk9P{~#kujRnci6cT3jrqDP@4_1h-~DY4kCL zIVrmZUT;uqY2N$bD6i4?8>2dv#)Od5A&c4Q0IcY3jta}k*{!}9WlCT$(t{y|9n@w7 zC9ii%KIxYzV7lVu(lni~haY-g=2bX7e4eQo=Tr_+Wa)>7+x-hg58IjEd>a%59IWZN z9KG4C%hv0v|A3PwgB6YbRzSsSPg?S8bh85kz=}8ZX*n?k4&t<`bbpb)pb}PC#33T| z#CbHZJD$xgFr~qYB4PCir|o>`s{GipXC}*ISdn;nmTB?u@x^LkYI;YN(HBx6U-ltX zG`O4E!37kR$sZB`*E>NGQiSogaRjxc`zPZxah0{58#G#l!qcz+R6Lb+0rs)zg}ZZk zXLw-w46gj06s8xfs6_#4tvA@pI<^(Xi&cZ%kR5ya>K3psg?r z>v;B5U3nzTX-kr(!al4<;J&j^BJHhB`BkIwt%4Qe2p>i{0%}yKMCp?y%7Ybko;mZ- zdy^lXne({!cBCu=RED^Eos!3A44tq-JLg+h zxm#A^6%>@QU701Y!j0})_zI2ja8H75CM&cOr@I-scK&4^<22SAXPpvwXmQfZ5CCab zh9BFzw$jfyON78tf4C;)ioT0uWOvvVF_N52Fin5$TKh?RY6yZpidc1xyPB~U(w6EGS z^EK^0(Swe*?zRW84==@l@7F4NoMRv-;(A&FJm3UPmQU!ewV7yR4#m%hQ=^1^H0Jrz zSF$(v=%y5+gK2s#tVq`i3s^T44d_rGPa;o|z>0X|?s*Z$tIgh*5yqB)3vyV|5`M6I zm!ZDkrhYZIMs>FqR_vn!9m`aCAhtXf>jUX3U8F4k1Sf^h?71XMgf~+ z6ojvIGU)TEwh7orzKA+xtGV}-VOiOH!!Ze`8C+;u`)Ds3+*1wE&IQGVI2pN})eJ=b zXnAo!q)G&e7sFBfd%AttBPNGJFaN$(j2@i3vRygK3=j2DSUgQlM`}_%VIQtZ!+BNO z1VvU;E<39>{dHKuM-tH%<>6#+wl@bGUf{G04@XzppS0bz-}T;auaDpU0``%&^69=5 zx5TS=_f8A1+kfaTtQZ$`{`UKC8wUIqJas8_et$l!a1EEgcw)ZutnY8ThW|L{jN{{J z$Wx!5ieGv+f4wGnls-)a`vAy`>`?oY-c0*=)qZ{g^7s86`?>P6r zUii;nWeS?I8CF=v^EF-5Bc4`l_50&?voFq-+x5NrvxoQ3()d4#fAp)G)WALlUa-?n zEmB0$35c|JU*D(Tl>5VAQu`1%eg-EFyLe|1I(Vdm0R2=YXB7 zZhw}3;FLV;TR!aLx1-c|k1B)a+z6dIA}BKB5CgQn=%6qLpR%-i<3`-$}TRyWKilu zwZg$Bz7akbJ5YU6ru1>(^Chv4)4Z0$K|EdW_cA^V8Ely580_%oFixUVC73$|F8-da zf*0m3OmFELYWYDLt%4QF<}R}#-iv^T& zbmKwJ6&cRCW-)y#vdX9O<*qDqG?R*xqpY{R8&OkYj3qayYq~t73oeGyth1y%jB=e= zNc~<`qrvF{4_D;GyHhk?EUXEuMRJQ^A2|Zasq9CdJkc9Iog8^l7OY70@r{&deCA{& z_Z7CVZ_k4jdPbz;<`$Yxw&#>r45LE|DUgIYl^rKPHnI)FX0*8gXBruZyek&5Lo=dk zBRbo6h#HnbJ^-VsJVcr1Xk}h>az%NUE0)GA?P zjJB%m6izDL;)=%8H4%Xq`wv$8&}8s+1^O&oU;wZG>L8UrFw&S0!$6n@Y_W&SZ9qq5 zfRceX?}6~09l~Pgr7mPhw3}LUa2g-S3)CG=v9XcnNWB+hw{!%Ckyo3YBbktV-}nZ5 zp!V20c>V>6X<%=TejIqx=nWhYcp3>C(D?N64Ah|sG3U+xkF4m&TxZj%86e-F4IEe*V-upao5skl}oqlHdalQ{u6ImYjrWcoe000VgBQ@3qr|Z%g81S2>Q1X*i z8yeeCvm57T8_TAZOMFTic_(;HHTN=4z-JpatJmuWWBIpLA#bvm7cK6E6|s548}@Y8 zhx|0dX<$Qd2u^l7yjNavfw};2bovmvEw&E!!Bs_q3^Yhb<9qQ(X{jBsBII7$nO*E- zF*C=#L?^v8f98^?)HUv1j&VF?WFLILfw{EK zRI}PKHZsR+Uzv;*2>Y0h>M{W`e;#_4+UlET#u?To3(pG^!aNvEJ^Dn%*~o@{QI_vq1+Mvmf~%=s)%j{e#`hs>fg- zqE(_V=UXP<2$XobPi1TjhZW{p59Ly|C-;rlo#xMqOU{NBhS-V?9mlc~!I!{;A7Cqh z6@^kj1GJt^$O2)U;{y*IrfO`P1wu@=UvKJ;&hjOv3G zF)h)SnfkMNu_bnAH$0Fj?s5$>7(5wSb?ozR?wRURaUZ3Pl2b481_*Z#6&DA-h4e)g8+q#GbBx>ETX$AlMKvW)&{Yl z5hrWUFASrfa9bKRdVGCbLbLaAIEt5(B}_d}r3RHNP_MYAaaciJyIW+~*c@(&*{wh+ zl6+W^s{@(JCTi?b!T0Qdy-hd+ET#Y8RaZ};_J;O`=g@W2TR1)#&l>zs9C~H2UDM-J zTk;;Puq>nQbY|9gmQCT6>~-nGX$g%J{f{{QJA|WwQB~n#eQ@TtgO4u@J>FaF5ER`Y zalolzrhK;1lvXM@F>%H?19UgTrAP>T%4T%Lrlt(V6w7yePr!;G?s&Xqk<&J(%%!u` z>*Eq&MN2+4@vYj+#xbew8(U{{Kdea2WM0gEz*1ibmnx%DhIFtZ$e6tQ3btyETAhoV zdZcPtF?`P0pmw||s?v`8i=MIJjyxDGVOfudsYZP#?)&AXW|YD{#Jjrm^XCn2J*bSl zc%mU0XFj~BGQvH)$SvCTNodySd{3CE9h9VMYWB|OA)jn@9gU;HL0WgEr(-M2bB2}a z=BUm%92_CF{6^}5j-wfz)WqT>?3)`-fu1#4>~To=0H_&6q|F~hsFEGOo) z=hMFQI1Bq=s2M9=b8Fjz4xp-`NE%MM6>D|C08lyCFkIvRo(Lzscm&?-msw)cuLL_B z+9UD7L8^I6dwB}0r>$P(IX%s>;8VC98yRWF3+7KctHzgW%_CJf4b*V+U)kxEKbba8 zZIx%8^v7xBvY#?zrm$;P78*?sSVu50x6Dp-oau1O4tKQ>O3{?r_od4L#lG)b=@y&` zuOgP_*3q|)ZC~=6r~N?d_c(pzuin(hUYJ;RT|NHCar=i`YvE!nsq?r=o%pe>=akC6 zQu{N`n89ezFPYh&&xqRIb$sRv)&H`;@?V=BT|v)}jR}8D?0R7rbv@epn%e*zMfBak zS2t(1Y0~a3?vcH7Zw{nD_zy)pdEOdqPmjHA$8(&A>_AOqF+lun%A#%U+oKuT4JU^X$yu?KgF| zU_}q(>a(OQ88+y2Fz_v*J+R{4EJMJfrR=Y;sk_>XpBrhgqQ`})8(}CLY}%ahV9`c1 ztl*eELs3%?&B~AJ1TvhBq=*$z5XVmRiY4c~R~F8u6yPnK7uCtG)X#K(?YQA#8_t9m zm0h@o$q#AxLSkeARvK} z4lDdJsaD$Ua$wT|$DW3@v9Mz1bhPmhCztDyb+_@o;J7AOaelfvxmqt8{oq^rh8a%v zS+L@adff45hM`e)$M^NbibOf2KuS~rlsPh%jwWJV#4Zpd0PaJKlBtKfsQo$Gz!~yz z97U6vNrDtTws-+Izy4zQ1+o}9yLM}K;a=FP8BjYs9dij`KDh!)<2-qfMmCMONv zXc2Mjj}bZM@C^Ol`XmMpj%aB-b)IE|d1Wt_QpCNOK0owxByl} zD;lC~-L=JaG^6sNnX7>nB{?-YK$N2s0$`>#2-9GNw5RI)YlU&M^uB7h39Bp)R;-(c z?whF`vhs^!H`DIazX>ZkGZgif)zwIcx2K}uu8#p$V6$!}foNkofGtDz= zUAOQctBc=l65@1lW>N=2-W2Y=8%!HmTDJBL7r3Oyx}^R?7J1;<#0RK$X<;a&K>l0? zq0oooW;vI4EGYJX1Yp&-{yR_CrRyW7e&CSHx`i{Ld4X%$CY)MolZ^_?woMb^6qMod zPLW6-KSdrvS$TrD5vTuqTAdoUQKpWc>J*>#rt2}BWsZmrZ}BI=>8~ny*tB@S35m?r7`sDlCI*sT~Z+*0LASt9)7lik)a< zu#3rq+JH3cpe%KSWevByz5-UrL(Iz#UG|CSkac36vDL4`3PHt&-$V z48e*ErDDmtV~*`G zPSQ7t54WEWJdm3)ATI>lyyd7i?$IoF=vP zQZwwst76_AWA`V1Z9)E3S9Y$#+4H8S&Nu!N3BVfmMScUN2`8r`qTts(qNqmtvhbp0 z+WitZ%6cagdgu{1Y2q~lD|-L#4p?!@?fEAM+?HCh<_1+}rMAt46~SfKj_goOum$xi zXy&d(hhRleZLZ;UXVr~w7ida0DgjPTN1AK8!cE^CS7A0{tT|Apj1DcTb{ny>syQT1Xoaj(;-anI6B;VC&WF* z^w!qgaSxm}PV1Rsyelt`uBI@lDjUx8NLa&$6ka{A@J$c8PjS%3S>cj)No}Wj1p)n8 zl|vg6M^?nZiX{%B-#bgzdz-ehhs-0XHds-sz09%1y)9iET5`clo+p77eb)th^b4qx zl>YP;K2a`k3x)*RHXaiLz~3nb4)PA1J`%qt+wdSQE{qx*5SsoM5l$bwi`(uZD2^_5 zK0rqgd=O!Qi?RDM%M@9ko!_uRxHE8NIh?S;bjx17ceEwL&63Yd=x4zNwF6y`DB!&c z@9rzFTUwXk+>E@+UYGwy~; z-@Ab8)1!4^;0&;gdleOZ(P1;zRMuvEJ9jzGb=#Wkyt9syaoEN2ihuY-xiX_SDX(jX~SkbuI!`IvMX@|{x*{9#ujN>D6NJ#35AD}$x3hJD=99t!zn>b9)HDJi?Sbs;$OvVu9L zlC0$`m$w#tRM?o3u7rIEm9l6bj_we)cr5K3{jwca@VxghMwW?U>xbMI8D5RSxvzVJ zl|zS%G$&~3N7rD-xX25AiM8xq_6=97HsRbL)5i z`4|+XV0Z6=2vN{_4o)qM;OI@PVN%EMGswj-RB)x!3|lb@^r;I4YXY0hs9g`U`4^43RYofm!~f)JvPAgL^iAl zENwacw&m+7ipiC9X$VgYD{cs`2ktIPOX=&PehjdVETq6Xib!35>l3;1mBx2}If64a z_rr_v)~hA7Yny+0|A)OxMrS}Sz`0G&?Bg59{Ej>S)Hiu(`!BHK?1rn)H!k`6IeT5H z<#JZqb6D|*^Uto_UCf`J{eJiNul6s(Q9Sv_t)A_l?|nF)x_#Tb!vG$&BF;@sP1xy- zZ@*%H($S1F(`5N0{oUX{cAR_o8xnCM?FCLpOWfEO^~J7VueMzs7|0mzI|di@@(Oy= z(v4)U`%^)V;0=FAn#hSLCGs8SM)83J?HY#5jaTIcfU=xrX20NB(|RuUwTpw zD}vTDp3OTxZ|e7pmMki4`3Psy>_%u^OV^F|%+qgVE<2Xp_zd=Ob`edXNy+lK+T@OWq8i~WkZ@bk%ozTf+G4ZOIx@F47C z`U@SHy4~o9?f(N5p4R}ZU_?gI)03lGxVwLy$Osm0gcZD~P$aaxceRZz-N;+f%!L)E zP_%+tIGZ7h|JNU^kYO_>Os@tGmUC<7HF0nTtsQQD^Zh3^F}_qSU#h3fgMA3BZM!{y zZgtN)Z*Vv7jkL7}4t3f1txHr?Y!HaC%y`ULvk-G_PM6|K}e?1N*?92ULdn z=xh5mha9HJP@FNkB!oHKL7S3fsJOqO%TWI|>|<$V2K&N-7|#`JQNWwJ9ikyUvq5;iAoGTYMU8djQ zL3ypE^JtL(Tf>HZgdO^*sXj_DOS}5`=&SzpMiaFRRw&@ zEY`wVWm~lM1?ljR0R&R=raK^%W4AZ>#&sw7LSu6E$lu#Qd z-Z*@h>chN3`-OQGr)fZgZv|B*Y?Xm%(3rb~i!+3ZkMMkW#cRLDWs0UwlAhfFM{yJE zR=DmeDiaN&T zE+r>#j)K==lgZOi$OqEP6nQX$MQ{5>4o0r$<1G%Y%epjZ4<5*ced{rjx59*|16AD4_*;hWMt-v9gg3~cwF7S!7%~FaZ7Eia#bPz{D z9zbXGp8OqxSntv4^Y&;HEI1jvGFVWX;lkeJCQAG!=K3(s5~tUZ&$Z)H@1HNK+xI)| z^YVtHC=~{;Mt|Fu3^9FG%EZBBSOGLvup!XmAjtYwRl#$>xvmK_f`-!*T+$evE8*@R ziE!40_c*>8u|Bz!eYm%yHa#c~rzQPv*6vrCd)T^1!l(|ZAr+@D<``BrPR*!dj5O)H z{X=$3;gb5@9o;;`b!;ehXS2LBc3BgoKsv;L5>2734e6bg)_&Ow5&(7F634KD8sP-G z^a<-B6K7_ULQjS%QiFTrqhn=UGA_8DVmS%60?Rad) zldsT%b_Vw3AM}KScsS2=cFKrWeDJH;Q~OvtSiuAgE;^bt$3H8vKK9-kHLM7`LSHrc zy#;-n{W~jGm>mo&Xm1-EKP(iLFQDdR_;39(1y($o_`+!_`l5u96&&a6cnoKPX6A#@ zxL}6m^~5pNow~sLO4!H2`pQj=Vjts(Z)A_zrvIeK!SYX|2T6$ih?vKY_cmb$5J|biHd8u=dNdd7Zf!OR?(L&Xz4sv4J+>D@|JQ_BnKMl>5+6r0ZtVI(UgtyNMm?F$lx38zWplL z$C`d+khSMToX_U*S%KfW8(_s=gL!Y@s8`2Xs&|okGdBrVSnu;n!adEGH+&|U%U;gI z8DGnVqnoCBY!>%$zH<$WbUOz7P^Hg{ROV!@^1D(X5=c$2!3u-2!HEGlQJ#axdG{jw zGhjvaaPG&Q)8**>2=gT;uRxrclT)f({|$;FLATd=pCeguCfG+<`AP2H)Sadrm1xxa zNLV(kn5Dj)%L~k#6nC*|6R7puV1-Z89OoF%mGO+Y1wq^xW*w~Hh4qa4VCxjBok3`D ztfUQASUO7>R&8o>uwGi8taQg&vU9CA-RaQ=sqbVbU$;p8e}sKl2PQYW2E{k-i;p$; z34QutMeBl<-aXCw&`snd4w8Ig$keK_hLWzz3vA&)mp;o!G zzbXf3Z1cDC9G>~X+#Sj*o7I^n=26&(Q*O=W`fFpo$2OGaMj5+s#uQxv8!AnKef$S$ zquNsa(Pr33am&Oi(O*wSyuqliIb6BC8&)tpT%v^a69q>uHV?0@}i2EBu6 zY+VQTY;+;c^orD!Su$&xGtHU$<&`z6Vi!1yZBK}5XKvVrIRV{m`%1EKTFQ(JleNQ^ z5SV}dn0J@dfYbj~emdvCJkvE%PsUKN-vZhLI7;jwx~Ju0zTfa(Rw?_MdK^~x3gQrU zF7}rLKt9cYGX{^}rKp&HXGm?n-`~4bf!Bz+U3ner+Fout5oqDI%fo(yqj>KzjHFe1 zF1?u5;2yWUbv3Lw>$0pRSsvU}(N|g$U%!|ID{3X&_7RROUv%hr);mkXa$$vOtv;p4 z)+cV%V6RH*R9Ij|94#y{E?C)B;9526%hcfb&<4dbIz*leQtMMT^7;KZ_kOy*?)KNx z)RaLf_sslB%>W!_WH5ZXW82j=t{=&JT5CLU%Aq_#U88pommFld7l$GtX4uDlTI)x# zqnxGQLD*o96Bz_6R82np%OZtwO})z!H?n(iGXI&?5g`SVHS8LfHI-Sb7&zHM;QAoW z$s4_XzBwemRWOXh!+&AlQo$aD?L==r?{OgB^MaKs{buRBl4ntZ{w?a8@9cz2+Az6M z)q7A^#uZd2*i@<>STQb&v36HtGet?t#rOXBm5HNpUG&1*Z0xr_scUMP^$X5+vTe`5 z4@rE!<@fE6=f8E?k-h}>apCtrUbSDZ!?s`kd}7I0^-o~Mq&?5?`AFBq-X-6Rd^b_Q z3s!8KeapD%!y?Y3xAsjv`NKM#S-!1jw%ba7eSe!`XVU(DtNjk_W4q0Ddqd5C9*{&s)@Wu9e>UMP=Ou zoNc0j9_;t~`PyxsKRmvbVS@N#L_b6|u98yIOu4 z8~?|yhu5`mIc|igCjZ#T`1Z!FhJCjl&YTS^ZqIIc^||-DiT^x?4J-crcy<;5JAP^v zH{(2!Wk+-S0|t2WbO42gqu5zKL#$2 z%nZ9B=hY8%Mqv|G;VX?_LJkBONAr9zFzpKW_UB~WA2&R>UW$i-(iRC79IEiR@fgc zPJ8|<^TqZOQ&iLTAq}j^5B*x$7iBEjC3$80kLyaHR;`I5Ikl5dz?V4T|s6GH|Zn*gOjw@=b?N@VtC!38zse5$MACHYX4-Q|Ur zaCrC&E>wyn{yrx2W$%e}FNRAp?BiN`A|jBQgLOy%)>u;fU`1Ybe{)Ix2>XI#v}_tZ z-3lvQ7_}dBdKbPkrL();dZ!czn9Gh!l$Nxj9A!{K5QkCz3FHIGpIBduZV1Sowrrso zpwMxUu*l1ZhB2sKK1s>^QKR{E*c8PcT6tD+xpI#OPFVd=?Sij<#EbwfAC zdci(=4){h{41=AGdEC3PtRX(Ez*Y~C&Md#4Q`}rxiI_rx6>QgIIz2b7{QqI>O`w`Q z+Q0uhA!33Nvw;alOhO0*QIilA5H%Z+K-f`1sbz@}tZf5Q#n#pkwj?YjVG$6K-L)3A zwY0XCB`7E=pgz?;T>ufW^{Fhjwbjad_kDlw@AsZF^FQZ*Jm)#*X+C_fx#ymH=9+6} zuHl6`F3x$;`T!(|qMIwSaDHivz5$TM-N*=E$n8vCW*v9qX$ATg4W+4u% zDedVLg+K&5f1PaiDB!a5Xv1wJuI-@=@=_4n*$S?Mjhie2iIgOj&wD(zN`y=4X0y$Z29|Nve>H(Lx;=%+ zy@u~GLK>-p+8b2R%owoTQWx@Pr=2UR%sb zo&h3v z+#$J%3lh&sViJx)EO4Mpi37-PNJD0oqHBz5*=|k5+1w=OT~44zh|BeG$F8EVUB?^C zS1)vg%+#1`-w)Khs8X&G{6KNBHbTbyxTi}c?E&=o)%l*~$HMrtpcQqos^0LLCt4$1 zyRP-t`Q;#ysT4LTEj6hu?o~ZNV4O~%OT&v-<2E?(&5OOi0szF2njltC*oApB zwApH%bqXZL-25L(?rRR)CSG`(o|+-O?b_|FzpNZeu;%sFsEFa8@l3BJ}2MQvKE5!~>- z7`z~cR|jzln(B1rvGo;fQR28cpsgA*AvmJ2XS;2?+Ax`tbC8lthY&o|&WPqPGl3U! zj9W({r2@}_SmYeOJyU|VBJ1iBW4Q_>{xS|)uD3+hM2Xkmu9lYG1PRWdkF)0o$@=1+ z8IK+`X#hwRnYyNvI0V-8XN-gsN;4$DB6e#Vs;3DOxi6ZRJE~eCuDUF0Pmp5vgn@V` zrhk{g_c3Ti+MuL`?U~gc{QEhD)Xial5JYj^zi=nKsbMFRVJ;mhROqYY2{gzJwGLNHm8N8fU|@Xcb{{ zdtifdr4^PO2{- zC8_5)kmlhLZmr*%Y(LS{RA|$5ZfylMM9froTe`|Uu0!R;aF;=5>F$L!C$_XU*7hV1 zakZv3Do_LGe?(G=MbLzR$kt=r&moHh!Z+hKsfOP8$fY!W!74Ms25O}7pSOGFN1VQ{ zu}sB@d{=^m%C@CG(i3M>R>aha;|Hrig7_D|hE<)pt};5Dr4QxWL86Wr*d4>=tmY8z z>HK09^#FlEbNh0f^H0_m(V0}EEeZe-PUZ{7!vJ2Pu}yi*GO!4;NKk&xF_WwF<4wBp zQr;=_g}6A`w0G~Y3-4b#=fS_q(|x4?t;~fEC1*_rRSO$$4_;av44LTb)&{#JSVBhA z``by9^2Cn;4NMt>?Z)Lx&=s$mZ(K?sV=aGI<)CL>YJchg-|Ohway%e`T%c?t6l$V5 zW_%7`?G^_4toeauixl=pV?MKu7gd%#h^Lis+MI9{%kSTH#i%vO-p>QAaAE>@e5OdN z?BvImrt&c$K}V>@`&+vc+P^?oqo$i6Exl2*P8X9Je_I^Db>m)w?X682BAhRAno;*I z;!2q#;gDHc5bb^Lo?e>Z6UPASSZ!$}SPl=zK7ls&PPMjTbmS(_vkN5VmSepSMlNeC z_xX8>TSfdFB(AF%D`{aQ39b>{C|;Mk5hR>qS5x~9Sm7dmitf5yFKyOwl48He28qPBh*O?6;z~}UuXkL<=yxFT*DrNcS+FTp zb??qna?r03uhB*F<;1{M*?mkdg5h@WWPlpRK07|iMxXI+6?wOHO+Zd=tbD;}tKMW- zp3e?v{>px&1vS(@l^?pQ4q6^;+SLr&_X`RtL^eJe%h{bQ`7mPwWm@jFr2}3tVlKNBFr`<(6AoHKDU{m@A zkvhDpq(!K<;UWHhish#@QsZcDYn`);DHV3=!u*~aF^+eMp}gQB7|)?YI!n!}@S0s6 z-S?HXj;A!kv5?+jh+A48#;Q(67rZdRPTr95N514(Fmdy2#&dc8fwR4T$AEPzzx{Ho z<@lk_mvc>_KfeCp3y}Ewr#~;hJbU|-x99i%Fw6coWdH3zgGQX?eC22K6m|Zql=+LG z#+&oZkACcX|3vK{Cx025Km0F{xc0{%pUroF-qZ5y{>N7~{4@y?XKv5mnETD+GTJ#{ zet$2_4bAm{&P#d&OdY>BqnL9XD?@F-dyST?BQJ2$Gsqt`p3g>X9I#7 zIGg1=D~{XKK;mBZ2JhaEXZr`=o=y4J!K09w{CrT3`lF$a0pYTTJsks^AT@Tyx#YI( za9z;5jTO$l9y5DED+KTHv~Nc=djbn;YaesxAn)b$Kj}BMl>LVWlmCfFLFyx@ck_IQ z{mD=)8(AMQ52qRfleZr)6Lbr2+q-#qb@@i%?_W2?}eZGEp4ByN*G zx)}cXjQ{#8FUPB9av^;Xd3FyoRCN2Vk4KhJysA3GAC?F9d%d%d3ATx~YTI=})gNf64ws z8)H1V@#Ri5u_;he%;UeK(8Q*B!RU-1-Ahaa03=fRTuwo=2sktIm=g<~B_M&Oi%jKC z;2#TXnE|Er0LaU)2}rV{2`#e;R5W%=wSZj^W(8h~W*Jb9k+!4JTgcvgG?}un&4Sbk zardw>`ERW10*fIuvO~|}+Z-1Pe^n2*iQWMTx7>RLTsyh0J21|P_0SoRXh4qH702`O zFN`g&p-ci~0$u0NZQu~YaYgczIs5hZ1_ z16Gr*VnZg-no~96FNyC3-_7REXtl#3pa!R)rhI*q5Stn>r;jwK?tnx%uA)N9eIh|S zmt^+8;vnT<*_8HzNnJr99jD}yn;;RoaN;=kU`Pvdc#b^9OI31~yhgx_$C3qBk07J}`32t0Y8Cy#;Cn4`C0q?&#iSvrj+VcmBpE zkmwcPX)7dm^UB5NpI;>36axgN`|TDs%a(bqDnHd`C7xXamcxF(Y_%Uz$~?G8(8ssu@Im6cX7SgK!HMk!gdu}K>4|^@ z!XZgX%KnU6zPLB9TgKXed{t&IOvyE}QGXBOpJA{ zK1`12d4rR&fW0!gTn*{gX+>Y87yT*Fj=ZAmF?Dh;faMr5=h6%oMDCAnJ;^uPA>aPO zpn662HxW+R8yb7cqa5#p8X8^Axj43mi~U5c`dSJn2qaeKsko|7Z1FWV#`{jWjAoDs z-YI7$zT>hW`(E{yCVtTlkeE1T5}Z9+^D}*$OILSI@H&v#;yYI4g&t!;GN+A8m zxM!Wxru9>r6Jl=JcXfXSY8ac(F;f%oi~nAD{<^A14C(lTyqtzw@=DhFKcMVBmG0&W zY814l3U|QS@LffDh%QwBZ#mpfk9*i_dX>LKwY zYlf72F~ZkI4!7z2O+pQ*p%ZE!34O+@_jztm{7&Do7$gKOYQaTIp-e6#&aS*mvyI1nP8 z>G@5W@zw`KlSg4;x;x~}eN~>W%v+aO7v)}`|t-5Wwlh!!YX-+vzFM>2= zHySgZ$7oJTk{w)G5Sd2->of;n@y{5?uZgVlXB*qSLE<8&N|TVoKT(~%vd+%G0QvMK z6|%vc2z)gkXY?GTG^;_4bNdR~myoWuA1O$qwwIPcqD5uHmf-GSs#Bd?w(3h_FeJ|R zitu5#NQnLupurlYc@^-Lai0*Sjj zDGAx}_p8H&Lb0W{Rt6Ge)Pn?B@92#L54pwIwcG7Iu=R|-!PGc^mm93Q)%@n2H+XrVhMW6R zN<-?Y%rqlJs?)Dw4i%xsf)YhvRE1ptBh=TagE zOm~XDmn%0z2L1dH7LK~dje;jlZ(sSub{0@T(qsngu3BP{89mLk)nj!9NQ{r|($`jp zy6x207VTTSs2?N-*0~cn-tE=m&dT9m{3wu~P~H9_Eh20+d#%tT*dM(n2h<>q$A)5j z19`z4D7ymD+ekse&zR7+413F29T@*z8e;;o3R&&tU{^;hm|VylYVGy$>H{^n$7r*m zz8Ajmex8s~Rh@hTB!t}09z}QAoA2i?6RF!fc_8t7+!n{h-2OAw*&#A+7#HTgqS<*~ zJK?`B+W+g?=lu3>L5;^nSHAw_)#AG1EA!s#U+jdOc}RZt`VktAlK*f$e=hw{{!LJ$ z>DeFe?w>v|7xBq3k@@|1$3TKKynD%SfBf+j4Fqq#cpJ7~=jqe=E2)21?0>-+e7dRd z&?KnwzxUVv&jwsb`}pTtq<=QxV)9y>sMG1&L5;M?c}-qXrpcpuV}RGq7m$7~nDXJP z!5nVa98u(Jj`~XpYD~}1s!hx0Dr)CE=B6$Vje~^X*?XOP`e=KIYaClPf4_MVNThve z%Mz#59)HG5c^NeS5u~pS5|s#EKK$V?f}i!Zvg_y1K@EqgRp@{J@Bf923}{W94)xU5 zX)Kx6$y2NpP{Zu}pQ7lAsnidtmnk>;{+Iy?&7pkj-wkV~u1^JBWehgH0*OZtE`PPm z;nJJ4-=F_=vizANNDR-eGB`MlGb6~_FQ|t$KzzOdrq=f8kn~>o;eW3_z4wJXs1g3o z!jT<$6PHFm^z3v;{|`uv?06l9KJl3u($(PKHy_FZiMrcPnT_aHac#ytP3!pDo3|J&g+P~+9VGamoiTl>d8?R?JK zTU{?fqWGsjK7aFz6Mx^?|0i|PEcrc7Ab=oOsFehgI*g#_;R^KFXn?>VcwEdsuCvhs{Dxo=DPAJy;LxkeJ8%dA^vy5^ zv?WAWA{fU^Z!EX*Q&0lI4B=#oji{L}1|APdmoSfD3HrFoC&D7|j}@!}4BkH^OfJH7 z<5);IKw#*I16ELqMWb7K{6H7*I~vUtRO>>N&Uz}PqJJ3%j3>_{D!$0HQb6!wfq(5; z5llTt<+C}|eq3wZ1xQ=>BeF#-JP)tLO({PK!{>n-bObF#vNjp(w~&h{Mm`*|K91Kz`Tni#_A#~DWv`$BS@S`SQR1(^V%hQF3XW= zQo*lf9{D26e;d-oRhl5Kq9v*~3*WD5JRTNIuWfQX1sK54#sm&V3#nkH08K^={EQ$@ zVfte%9t$bemlpjdgG30rMhbLjGbdX^I!3?18wSzASVZ zf)%{M=@^EO>5%vU0tkV8i%dFg+uMjqnkprBp8$w?B;U^3f)7DRby$dFDbq+33ao-s zlkb3STSviV;O`N=tOOJ;h01(83g~RHw zEe@WnymrDcq+k2XyEyrJ;Zp&vypKU73c$94@y1OROcit?3s-~s3%blYre#Wh=t3m$E4s_D5ATv!L(-pTbdkx&&IO_y1FZ z|IepE?bJ{`$$vkhnzETuU7%IsKEA6hh02oDBo+M4QwEp^(;H^7d zVfaFj;A&1OSc@Ayze7m+NW@VM5~N=LBF0EU(Fg2$UX@i2x*o_t)952>P3Q*c&hni8 zUA9j=Ip6k^4%LPdO%M@MR~Sx)cu zWP_hOl08knRZ>~jeT|lN)0JZ$0n3pfqy@PyP99AjW|@fluSbDI&l=9*#^JA&j|Y;_ zCFO8$kQf#Z^xGo+NtB*?tM61h86-4%G{?CVM_9a9nnx(LK>8gfVGm*JOjr1)h~T_FsdFiC;|9n&`RVW`%^>klQi8n+4bfk z9pugBjoJkvf^(FZB~F(r{Y;R#`E~gcI{p%Vs5byzqDC`FfmYD--#Y#A8rd+uJ)9WV zuLFsIVo70A=J;V_y_Y%jstU3^)syLmAFH>nUuZc|r1Lsz2Q}&&2pOT>Tb~oA{U-_O zkQoOi?s}oW7dpb?l8nJ!1_w~WWW`RGYn>ef(nUI^R zI%?3RzM*R)vh39q3V!S;=u9FFcu%E0C7pf1F_!Kgivc@+G`TLKjA|2_7~3pNiKWUH zEQc_P=i)T*$Xv@2Y+A@sL8jHJBrN}C>MFA6?hf2v@e^R*i9C0`(ViLoalU9uaQD$W zj*vkxt;gDIOY*6G7&4A~VU|PuiSo=CG@&0CA#sfAIzrVYu%t4LQMYk{^J05q&fNCc z_WK}_L;utGYlUny*SGzxDvO5{Bv{(5$@f^*u5_<-H;ziT3ncvZ(bIgoFEC9T>z9%p zO&E|6{aPSaW;9?A`rx~2{gE7yK#(#HO*`B|j;zikoYB4k5(_20iL}{pTyA+v(1(tG z5Xa_*uPjzY(xj&;EpIgv*S9kTO(`7D5)V8_N&JjF$%SxiegXOQd zLE29PUt&R!baaNsV2$q1gbWN7+uOz?_IYwAW?8lCPA$QLRvNymy%ootludbf1@DR8 zGXN6zV;RP{*1GtC&Y~m6_68A1_)limD;|*g2v@o7G(reut$%g5KYHH}>OZVZCpu^H zAqyCT6zYrUt9y>5Y`=SNov9OI1wF9Ft*OqbE!Y~ok}^wxJWIfLOUZ?MG@I0S+U#E` zcXfg#9bRSIv`8lJYRlcOewr4$4J6i9L~P)u6I0(2`o6@{pp$Y0y`*_f6>h4(lkYK% zJpgJvKj)OmGZWU>ob#%+`m#MBk(IZUBww+hx!$#6?M(jA5s*kpqgT#I7d2NND|~A) z*$C+?bAs$&(xze~YqY+}=4k!`Km)@<;|I--F3n*agDi+Y1OP}Nez-RfKW1IzneU?6 zeIC*gx*hPe=g|JMh_25UYnfkeuI9`{qUq3cOy z2Y>g#_dq^5uNpHHb`w8=xMJ;@AubHes=*}+ zO0b>Rt^hSMPyLghldMm^UpWxBjS24aKzwwUDZ^ishbUG%?Q`joLj0F)r=-MJcYD5B zz-*0+>PZ2|7No7eRn;dK`xeWJQn$92tHE;gD&DY3Jq$+$qZ)erkR0NyHGdekXRB+M zOMyvYk|3B4P=jFq95);4GubxaQ(LQYf{e!Rjm3rf>O%Q$WS+-rV_6}n5x)38l-z{D z;YhU^zn#(mnab&&u4Ocr34dNabgqzET-FY1jKyh%15Hxjec?&esed&?oOvrzm71fv z(;SIJMz9pH>&=IBnYC1f{S)%-3eqJ4?i_f zymf)|4L*Z?kq8pk&zCLiuDmLaTqG=yzYe?JrqQ~2LAR%{SQ4IWj#+#X;vx^AXCJXn zdE77Jzs8Y0f)9dL{&e;<;WyPxdYrXe_K+taV_0gfAt<&cx!QZoEFzjEkY1g(GHIyE zS|eUfNu1@r*H{Kxag2Mz(h*cx5;B@qFw2V)gM>GWFQog{DLo?8)~p3Q$oGQaA0m9J zxrJC+=ihuZ4^rzgDd&M@XWi79qk^b>ZICl)g(i51@}M)GREl2tlr%dHd6pYYoi?uZ zMdM-P-6pxaq8HTgJT?{KVLIMjcQWCKq?f%BATTBa;q+l+(eqeO3RXmd?N#-2Xlq#d zpmp-249}ydzWooRhmoBoy}w3ONb_@J=ldP~=?}mPGW>Gx&_^#XKYrliB>3ZUAmrP3 zo!_(O@8}qh&A$#sUfTBz^4)$nzpwxLDyiGyFJ8TTw73LP>vc$Sj&}ob{?)|A`8m~X z@Q4EDR`}*v1dBdV)l!#jD-A6P=GXjC+gA<}gYz}(GF}M(t;@K)=6Ega-rwL(vFoJ! z{Mgc%$vs3x805u`EZOH{yP&=DY3B;j=RQXuf!}e(l^=uiGybHVDhcyJSD%4$VE$`W zdLD6*A8&XD{Eoc4{0YJ~#BT_B*fG^W7(pYd?4%c$z&4j`_&N%gKAIdoREI^29Gc^g7;L z3u>%5ML{Z}QA64M?0aC#(y0 z8Bb^%q$eY6i5?_uSPL5K#Gwm}`q62-5%SS0o)nDX1J60xMgFEar;H*{V_!j?`vTuP z@_?X@8PT;YNbDpbtF*+>OHEB$N?_??VLdk0{*5x1p=7GZaLr6_HUe5f(EZ1^@XfeL zeR8E3}Nd1=_R@dMApAsUfK72}Id$&t02 zOwEJG+)_Y|0Bp{j$!a+W33ZDHY2g7#5;8@r7>9Fw$!FiuWJUpqM;fc}p zR2if*EyQV!pGF!8o&~AK7AXSpaITW095-eyJDDnNv}{}FVFXHwX{1Py1-Omt7x7Xc z7C7ewA=Lh>q>7qtB0uF_I?X{Zs%%D>EJ*9wrAIKdxm%$@qr$h{5pCYNAV7zIn821|ikb>!TZguwl#v|&VLBgwHfsAv2x>Q$76C|9z4{1DO zUiZZVNq))2u0`1XweGQ?#y(GzMn+XvSo{1L=|{OzfWVm2a8_M~?QQBqd`6!Sw3%aZ zc}cU6Y-bv9-GR6{8K8l%BFhzq--5Whl(4vvoA|vTK{)SkyJe`fgtK@>3BE@l-C%H2 zxcJ-VyD7oTRmmgmC6E<{(;74!lKIOzrkkq0nhv}73PI3j=s=f@EzRp1mJWGH~3R+Tf7<1#L#BOdVfGJKqOBOLuxq*g3Z|o+%0TJn>)=q#G#{Ewh%0B`KyY9Vx0%$oN&( zb8R73=)D)~|BJt=aR^eSnxXS$&dR~wgm3KGPYE8^fnp$+2y^%u^-BJ^2tG0M(O3>h zDE@Zz+#cbh4J_>r>Nj~D28n`lRr?m3lsNiN<)cUBK%zz>^k$)ZP&o{q#lUZdj9-*& z`nmGd&71+FEyU)Nlm==PC_@TqL-)8tw>$8b?u|1b5w&x9(DV(OUz9ltcY#|1nOz&E z%^Dt)_9cQ2*5^qW$d_N*we-scqKCLS7QSU1FHQulq+c-(C0)-QjVvKHeERz!WMql^ zeynjEk!l7eDio(i(joPsO=^u%pMH?VKkO8gwLt-Hc0&pp-iz`0;=1mBX|}&4stbH` zX#av6Nq#__NDnJG8XOV~7BoO89vUE`xAvJx+z`qLq(kOrid<#_T)S!HmNV(LU#3Bg zlkIhZY3BbJq>JcL)*b7?c8qY31&HE*>#9o}YGHSON`edw2vtwHVJDkWC#3}01(sBAL`Z^@84TyHx`atv~t3Ap} zqtOFt6F*7@U?hP$R5j?MvyQE)X}gxs)r@p+ItJqce{WSV3AtDC`P%AczsXpg z25G0`6&0$Dxux`0VZ+w?tMwxWtuLC-NqP#F??=p_`xh9HmTu=D8_& z?j}fF&9!K^^%jM8{A7J&E72kc2?tqSpr+`-xnk*8NF)L~V2%|jlM6^@{luMt`4O1^I5d5uP&&X?}ROsB*@` z6J5Fou1P@<&K6?7$%~}5$$9c-2}ndrgD|e=9fK_c`0lpy>Ozp9yq!j7nLgsLPHB^y z!YB5C#Ai3BzvXH^M+89~+slSI>AYbJN&%GP}xSO+NUodU+m&>;hK@Dfq#h_cvHABfC z#*5Kwt6qbI;LnlB!GXo!JoxhKzhD2fmI@L9M-%5?wY;iZG86ijp=hBDBpj|x#z*&d zq2DYbcy&ksi6#C19{Kn$(<<45z)aPljhe$dVWUCi_qGd!$023H61uQer6if zh&Gq(`a>L&!R$O#>q6TMaZg2SdM{U(-ts!`^X;38%RERA7#|QHT_dopPkOCx94}Bl>=J2`|KV7^f+P$F@GS8~x{qpLC z?q&KfFJJ82V^#)&8YgwH%>6;nT~Cg)fB1cocQZ(=*qHIy@7Yt|XHy@}=RBCN1&Jkd z!F5-nTl(vq^Fm4YqQ?LN^L*`JYl}}laDm4nytM3TP+Cl5d z8JV(9`^OJ_59upEL>fN8&D<0Q_+$lUbr~R4DjIblB8Zq&B3+1e#vvN899*8Lh{~6# zch*FRV&Bn2MtvfGpUbz`5-)5r z0=e@UIq|>uy!MdSUF_4wKE!4L0tn}zfZV+(x4|Nyz*3mnP^xXaHH^Oz~0s1jAP<4>v{{r zeL>=>qQF3iGwD6_qwVF06f$A#e?av9RZ?5SdUNB`B6=(i)OcXP_uvvb^m0t85=kC~ zlmo#|rPTlIN*Fc`*!fKau#-bfWPDW-m~Q&+U|S~d6qKIpvHeT8)5|%ij`4j_mr@a=KknVBIL6U=Ql+K(ERq)7M!x~;(rRMbrPajKyTEdUMDz&tAqbkUA4|fJLVG~MBh;?edHW{}hAjAw@*l@c zkRZCzGwd3x(3TZYO$*;q01{Svl$A+#Qk>$}be}lJoB@fcuOufFW4H!a)5-!bttb>A z=8>V13@0JEofV&3?y*Y&07!*JYI@+DY~#09&~~PFs6nEt#^Yb@r{dU0OG}S8PH`n5 zahx(B^sOkYi-==HObK^FJTd8*=8es`vYd6R##a|h2Vo!f(}Ztc2u@OieZA9hT}V1; z1wDe)ZtLDyO&GK2**&&Ykci=w?^D_mO3eX& zphTl*HJ*Yl6S=Ddej?c(lo%Uhnx#mKeyN@t*ty zu!3pzj1nLDn9Dn2q_vdtq0StEM>0^}aQbSwV02sZ9>}nen0B-=l55x}r|GbZX{TyRINviV*W0Wu&28bzjq=Rk#5y+YfP*3 zAc3xj)F2M*EQe$fx$6h!6OhR5w?-KsCAH9xazAOla1ioMDqqA(OeT4mPEP)~Mh&}e zxBuZ)f7R#P@?QHC4fX* z#|hEL2B$3FHI!;$P9UU@vi7L^Gi=J1F_B`5Jm6{oHNw~Mo76;GScV))-8Oa}valy# zor31a!cr8?ic@C+tcFwYNlwp(>nxv3aAl#%YNZ%u+uF^@pr_LsdJD{ zO01d1&@nyOoN7fwHrnDr4ax@zt-Ji1N8*}g{;?D~q#SC&$8pj+R^=BtUwOq9-Gt0q zLx&&YMy|i(+gq^3_hyqbB&OwiZc)LICY&j-j3tV75eLC?AOq~Yk)`NCVWc63j;169 zi7?IXJ2(nflE;m?);JKI3KDTS2A0ZZP^Yl%J-7er2Dn78z7=dfvQ^Oj=@N2;eS#i0e0XfW*lhrKaYZhqQ5Ykncq$E(M9;3#sczv-)U$p$@Hm+i4d- zBGnSwXpJ9HpJBJFo@v&BT_KWE5f+IkF=w$coPYj7)=c*HA*nWn$ElT02Ku6ALnde? zFS^f>0evTGU=2fA4l>_vE_6?%mm=m&W5!0`Tqh&b6z{Tzx7-WYM{HK zrnbq2O~J(5KfLqm#(t1!3f8=s)>U%|X{q zAhEJJ=vIk$^TtEQilxmPfBF?9DoT1EHkb93=uUedO~3V!3lc<82!mN%Yfrg4HW}r< z3k@t_mSNrU^w|GC1gBD*?-=m9?@{G7cJM&`ETqC->#b9)OQB@xFfZ_<6SRIdjlRFC=EGy6but$ zUVFM-d3DI^6@p#(XX9hY-pa>l-sU>zL$7s-Xkuryxq^>^0_Ew&qq{$q|1d*MKL}~1 zrb~O)4;I&s^Xwl@dQAF#1Zw;p`eJbU1R1^iQ?z3L;L+P4G1c_k`{Lh!j}3EkYwI@; zZUu>h_(N0Q9lzrIlN&$f}0DvqC8D7w$&F{7bEdFh(h*J&{d&!|abW;EZy<(7NKqGJ>;S}DH@kSHx~Ie5=RLMJyb`Ka7wWFVG&lP#GK7d zk~kKCge_Yuqt9Ui*=9LT2#&GpykZ>iKD%zs()a%r1j3ty* zElA|jE;Kb{j`VgtCxzGOl9(W2pvPRL5?-h}Rbxd5t~o%qUusFycdiEFA9__90_^l{ zct8Wg>gkjz1?SLg4LBuk9QYlHp~wyDDE}-=zgIP;dk>@(=oKp;Jgzy0NUB6%cpVFR z2h?!N*<;q;+4^Zp#lMAacPAjv>R*nN+I3uA788#KYY@ot0M6Q;@0b#e48=+6hzwsN zXoYN-65Oy9oN%Y%0{h^I0VLLDb)*pc6K=Wi9FIy1@sKu{7%LeXvs!GmcoBIe8>s;_ z&|MN9l{Hff#3hmilCW_|pvX~OWU-w}9Uw=(;g~FrE(RnJnu7yLZY-cEC6#&Yo+NM# z#Au9ok<2Z5053t~-S#J-gsF$|5W(h5OsUv)j4>sozt$D!>E-^E;6TRmg_5F=@<9z5 zd(5lAbJ$DnrXW0OfaM*y&mLpHfeT_8+)3yO=nRMhgy4Eanhy=kF?%E)LA*|bR)qdu z5t#uL{w;kxIXI{o@+GtnWNoI@i&yK9VS-L)K=$ThxYTK`C92ElH7apIcVmG@=ynp0 zWC&8?l=wU$R+S18lCBv}Yr&s{{16x1{glcskkA`8d2kj}1TslAX@Db&0SJtrCrcEI zI2a>{F_a2OZ%sGs@$sWu@2)crOxQ2*iGTvKgl&{ni`?}ljyC+>jrSpO{T!_>fP2I# zRNN4sd)H4q0BR(k=r@1Re0Q?Av8VAXF(e}yCQRCm;PfUZyiM7z0tH5TA}n?rId3Y? zBdky;fST>0j(lcyydw=9uCvhg9eJ0N3vdio(%w zmlsliAQ_;B9${4OJrUuSO~$cIdHGHtQLXj(ei!?&C}R0<;_%70Wgw9=Fw|Ei?PZ&d9 z%wEG834=_XxP4SS^;&!#B{d!!Qh7lMYCJqUg?|{eX-jpK2;HdF_BBW}-drD@JT!G~ zk*)gz{aFL#%?TS=Wm~xzGC3Np&_X>9)c9FdM6AUhO)lc3R!vya!L9`fDeez5^Td%t zQn{GA&G|D>W5q(VTwM`0)O68^-izh-Hb^x1cQQ`&d7V?Kh28Rv7RZEz&9EyQ&>c^R z6WW`r*JwZuTkN*AStN{Uw={@JYkdOg&yfd6q{_=uYiaTrJyW|r8Pq6I_j=ggb$a!d z;7HH$?r~p`u>SUDfMdRwgmvE|&6&alH82R8=fZ6V7kA|1f>?;l;k(jwPZf7nalEa@ zjLTL+UcGTxb$1ylXraJO|}HG>c|J7Eok#xao$^aLnNR&Ye7 zQz=eG02)X>xyFXW)!6Sjx)4XAN+BiH@dUmD*{iC&B<1c-8-0R64Rhvrf2%#StuXXG zKd(=U=pYg2R7dfB%Rv5jggwj3iR6Gpq?DpVhZBtNpR77U+a#nMp|%;^#oj=<*+{xc zJgJ2Aay%@)XYDae(!ksK#GVSD&p|5=;X_ZO6_*{VKTP#cHXMNTgPRBwWxRsQFW(<` zZIRV7AWz%hg^&@f1iRS#UtF1E@Cax{&OJ5j9eb0)j4op^r(p{N^);1oj=Z8J?J;?+ zV-&@gphmscDmW@D(!})CGQH8==pbQo+kHUsHf3McGBl}fh8_bF#B!4Q45NnVEa05p zZeKqG5`?M=RYjv=9K&uj&Sahd+Za;x7J4jGJ{*vcAe;Hhl5!!lxc+m{K=d_y8+9ASKE&2hT_F@xAR31rQ@U|jl_-dU-M-_An00M(JsLh-Ju}oJYO9_E^ zKLLsC`+_q*^4id$)LJKgBcOno>vvGX%^vZgwc(DH_D)xjF!txDt25av?dM&lp1q}n z1UoKddTF_*Y)_0K5h zGf6|wuxHcjNJY5*3jd`sOTdEKJk2}vG{dRF=c28)gX2jcK^*g}xH!}}?sd1hzp4BK zh%@Nls4QplgV2O5`^jj~4ie~kr0iGqql=%Crptd8&z{)=T9MY?oZQ`6we02VpMLs% zFtPZ%sN362F&JG`)M7Vmc)8$`~(QRtgfY9zCFohr*gLt{K(4 zVjAl~q9Nu==@QS+9iFV}n%$w>1nCCR`(^(5dEOI!apuF1J^?lCErZh27uPnVpILM$ z|MgFhSlIlP8`P8IzERH46yG_yAF2U0j{erio}RD$@-O;||E$Zn+Y1uMUtUUi`HKGo z?o{dPoaL|XgG9#uC4VxEon^0g2RcwMo`%%Nv2CO8yS_W|Pr~5&f71Vg8rp#QKf5#L z|1W@m1RCW;&>dpsdl|M(OSQR>A?_v4wW8+wCYoKNNEL;`5>%F2r`rYpTY;&s*Vo%Y zD;hKaW(ycp)Y~pRw^++_;a+YVX-EVCJgHcIT-VW^X4#du5DgLu%2 z9`|S@&uHJx_He{v_PH(v2_;_RqQs!v+wu5r9Ts|CBZ^g|L;oF!MWR@v6_6V1vE266 z%SKNW$P9=-*Sj6G!Y+0o+4V&^k`N^#?`DfYg5SgFLJyo`{38i>JR=c^+prW*)e{~g zUXk*kKzt;%8`LO_jI4DSnQINpqaQKgyGM3eUAwCQD zqyQvly7|mgUFc{XN$5gX;viP!-g>n@L|++7l5vKTDNM#`|*BcmP`G5wd5Z$$aBk5%Zngl_N!0(8}jFsRgEEq?jxQo~w76TF;B)T;S zJyNpD?L)Uc?(u#Afl1r2Kx0#2Sy;p&4K|B2+9fBk7Ij4_DT?;1IVliOKyS#(B0tEF zB=avMrJjxr@c;>Fy)u+Ye!gJjn%knbQCOax{#NuZ$5n z)tS@DcvzjIUr`7WPV2^X)$_>hM6mfG94oEjY`C~*%%~@J+c}Ue9tE<|mcx0&BFPy2 z{k2~lhSUZ(`XTu_?$`pW0c~XxPe`4kDG?V9Pk$wG>m}CLGMoZ{XFW$?NSQv<{9IQ4gcL_juU?9(G=>CjRF zni}_ivG?Y2O&;6-_&nhuBp5K8njm5}0w`)&)PSf-2#_E<+Nz~(z=&Yg3rH(kTS9=a zh!_GQASxi@T8rB)b~7w0C@Q$L*y|FeOI?I0NAXlu^FZuUy7DI(L zYpgv|;i7e6<uOqZ<&Jm!@VZpX z#jeMd2+wlTCJ?_g!%7fKBnjK{|7}=ak}A2tcOJf2h$5<*nw#AsJ->@l7WM}yM~H<| zJ(*k8MV+C+hi35Qle|ah$9p3-*)JwVxl)oh*F`kU8b0EXpOc38atftrC(ZCt{J0mx z1VuUf-At7$+A4~ehfK*QJqCuCSRN-Ll3hM0Q`H02!Q!LqhnL{|Q@D|Jmd5gOF3h;= z<9>d43GumF{cp>sJJ{Kh3(9Ji4%a`3!$HhFsxnm>uEDjJbt4$i@?DHCohPcRHC+*b z<6Zqn7?UwZZFFnc5n-4@!6VLZmk*Z%KS_&n#CN{s+3)M2DWFatULwDmZbZ2H&YNC_ z#^mURmtdaeRC3RRhpkf6dg`dXBg{@AC1G!6GmVsUA5kt)SYEv0@94IZb?|PR0yp-n zPaJX?DVpAu;nBf6>_<%aiCn(7*YHpSB7({Z^3ddjzKn{*w5_Qll(-NU6)s3AVB0YY zl-uO=5rVGyUelPwU9l-7iI=+r!*_%^E^GpSk8sKrA$_39i1Tb!!|QTI5nMqeAB)6@ ze#g7Cqhff8&~R7pmao`4lP`U|d@u9x@DlkHay}y`{{*A5!bv^li<;pja$Ov97niyo zSW$1t_{fpGa##s$&CaxbgfU%rF8uQ#IMT2ZD85(UmU-vD7XS?}@uGw9YW^y4A*O%g ztl=d(J2MTpo+nE)?{%zrd3F5=wRH~+nHM!N@A-p4p-e8naBTQH?AfYoE0ikt1uIVy z>4WaW{cnq<`uyaJTQ5B6SbO7oz^mb19rLu<5P|Tc!RHOXEd3&W1pTtAY0b5RA5EI| zcY(CwQgnB>sgJGdzLV_!ddgYLNQrDSEW#SeN@ixj%avq@uPnvG-|-;7gH$kU=R?Qn z<;-AJ&j=Qf={m1)b}gSn90fNi%djJB_&W?c^!a9lLa|%-Ppn@0#R#MJ%Bnvf{QcXm z;q8U8?j(L7HQai+Xv^zKbp8dq`4*|C^@DhoMsSc-xx>77x^ye*Rm!F51aNhEw@~*)#&*i}#erspsli?*6OdR{9uk~ff z+kdnMeg2?l1f5-J{CMb*Tf<(TBm`tdAk& zK&P6id#Pf|u;&Ql$PgoRrm~N%DPkCv_^=Wdq-$ZOik0USfx{mnoeG80l_(Ge$O@@) zNzw@L=1_M!r){(NqI>%|Y`6r(``b7;Q=#~2%NOL1KCJ4E~Lf^0*n;4<}fAQ+s1u_XE`Ye6xU!INgHSQENMZuTtz%@k^S)IB<@{#A?GuFwqYZ@ zvy6;ky_#iA#qcN`aT1&)I)^_z(r7_upF+hZX)PMzh4~tLVmq2>37IKm4SS4Hna|IB-|AX$BYO0czTZ~RCttTykadyH^YDW(&~1xk<&Ycr7+ z(@07g_Fjyz;xQ6Wh-?H?1>%v0<@w+w3az1b95cK{J8}I($<2PYIn6im4E((w!t5sl|Gi z*?Ze+c8dzU?G_FLBUF@691ADJHI!<0FGDxH>se6!a{D1g6Bp+X4{KQvGs8{SE-DSh zhI=o>7AszieS$JrNMYM&4R2J;UPolw5+{THx0ejNzhu~7{7(if!OZ0A$RiB|y-JcV z(krNrBRxEZ`7o+SxY7*c=a4mM`05jeXr#p>eNGZf=Akm!^GU>1zBlj2wyYZ7E3iv8bLmipXC4k7yt8F5D{TQByY)^tH>p+Gu6YV6b$2Xki&nt{s(A5=p6s!&HwEe z|9v12phRLUvuJ=kT%TD`RvbN-;D5*_;e!Qpl*$wF??5p7ERGi3xRuC(W(OpE3B zp<&NRmj4d3|9gX2ORz9R|L>@m4Q_mSe1cQ z8CaEpj%3w^R$XY-g;rf?)rD4F_R0@7+DP?t6}u!R8^~8XtfKicA?cSwAzJMU1+rnt#+Z+ zF0|T(R=dz@7GqYk*lHGA&0?!rY&DCmX0g>QwwlFOv)F1DTg_stS!~_G{hwn1tZOG$ zC(-I8TAf6zlW27ktxlrVNwhkNRwvQwBwC$BtCMJT60J_+U$?efePpYTZ1s_?KC;zE zw))6cAKB_7TYY4!k332rnL%Np{{Pt1Z~pJU$NXE(ORITlH7~8^rPaK&nwM7d(rR8> z%}c9!IZE@=I(b?rPwV7qojk3Rr*-nQPM+4u)0)3v&0nzQFZ?IoYK^d3Bdpd4tJO)g zI*C>%(dr~xokXjXXmt{;PNLOGv^t4aC(-I8T9e$ZX9!y(B-RLtHA3?LuL#MTEL5BS zOn*!sF#>Ql@!vR-1y6bNFkqyI78Hp7e7fP!r*F!QO-Zz;)3G-eH4|eY#6~D($(sij zHsXy#!as{^|9aVA9_h~~Z~jl~G@v6<2t*2*!m^}LNyMM*=q!sRg=Awx8Z&4|$KI5+ zOZi(i)Z%c}@PCs|@|SeeQ%lfL{r@u!~C)Qi<45*YV)tNvY` z|1Sy)5-EikUKi!X$z>K$pbRKKi;hSrRQ!#Z=Acn?Ze~*7a(_$D+<14C_ zx*{?LWw4+M(sEf`iKp{e{$eNy^JZ!gazkUF01M(t@>t{KMz6|I)E$r4VeSa8FhFUr z4>d-FXfBQU#_>923x!!w@C*vuEYng1;7^KC5#l2UIEA{#8@JEpmHyysj2LHz;xJ?z zuR~<;u*B4I38G+mIy8zNfJai3>NPfS66C-Fe?|+6*++4WRPb(KjnGs6OfrRjar4yDh&e0854;62**cNL|$PDt$auI_xygD@+*|dh|L% zx(K-1v>;g>Ln_iy(!o01f@*j^m95>ReM}mH%4b21y(D^LS_;ROO(os z^gs$CLqQf~h{PCCcNk7F!h9$Q+e^{q>s6)1%!grY8Qcu8AdK3pYG;D`5ysQYjK~&~ z!aovW1Qe!dG&r?|C!@9_J`Y+eVgPE%C64=JqCCJ~3ZXU`rG_FW=2J?%vC=^RCBry) zS3QkJRS>OLn5+XUN5n%aDoIU}X-$+gdNz3h6DPDeUNM=&s|kr(Xb zju4Mls3E4mP%x0HSfYq>r3VXkdEhm;mktWFps0CtZnJHG`M~-@IlxvSVDNcF{G^dSPaSiI6?qE+Ph4RlThuX>WvnnnutEsg- z3gAb$z6q3brWIe)F70=k6-nG|xPg6}@FF0TvB~!`rC{d`VU(;e)eAV|S9MHGE^6oefw#!rt+T z!hbubP+=H9I|9M`1>ufJFv9)I1-FE|E4`MkiZDb4k3w@16i9^ZWE4gon2662IO{Y| za6}l%$c7EZ8Fh$Cf0hpK<)aE+k(le!5j+HmsI(vs+*lipDD-|09ioAo1(7*^#D|8K zw;+0PB13ElYw)sxyLE_mjDaYs7SC=1LZ?M&&)D6@ZOe$EY8ro=olY@fjC~9NVcuzF!WIf*NMS15c&l%5kfeV zv>>74JM!2#Fk=fxA@$|fa1-okD9N(}{C&`;ep*Mp;{&a-FF;z3b_j0mIE56Kcl zy-3K!d%(amv7ZVzo_?GqCA>ZvZZ?8}ge}QzL`6zOF*67?n*#<4@>z62VRY}(%5fQ0 z3-LNA(1P|UYfL1OVk0>L-q)xy`rC{1$0$+^4!E2ndjMraZhTYv2a|MP`etdqX(8ee zP@n}B^iq_0k|VvCD-?q$&AwT*>pEPd^8XsX6y<^@U~J2t13;%p)Nt6lg(;Buda_UVW?kLXs`mP(Uh#Q|KaJ z1ro(q=RBY34dp}4=2l795&lP8?RX&xe$fR`pau2H1Mnh4Ag-_zK|x63uO|t(CRRj| z!EwO{{Aw`p=ybgENTlM$v1ze6eX}OP`wOXp=|avEM8_Pn!No}k9uy*_X%M!|jPPn6 z-UycSxf45yG?O>5`1CPPMd_GuC=hEFZYwEO93LtTi$Ekg+}o#P6Wk?@bgCJVSUE}= zln;f_%QcM8L%W4t8B7n)K_M8}+t3kT{5{nr+vyW#nMnX{P$FQv0$b5R0uKemIL~MQ z!o;sAH??oe59&Mv7IBDvffgGSM!(?W(4OHU<3oX1J_*@MhD3;j4?;00$LuY`JB`c$ zs$0TRhbvdWz#FQrCikC8a|-dV#U6DD$zb4~O%TeHygX|`y=bl0g_RZ5oPFcgSQ?5dZiP2lMn^sN+<1nwXZAvTO&T|@+WvZTr+ zC><(@V>|IWw4Gm4o~j1aB@4j7&5PQF232Coc3GZTTz#Ee%ONTdS9ikON8PPjP zpH%bC=1AK8;EmoB821-DT(rMxd_)AqHBg`hF-d223cLskKw{=4ZyvKGM8FZWCl<58 zOxRY>A1LB5SNs5>+Gzpcm@&p9W&$Bght~xAa_g(WGYQH#Nn5FnKI-24MQAanzI-mY zhItzzy4DQw2=n$$z!cvN2AYYEY2QpijbV*}&Z2MNqB3nng`$1^+hz-TcWLh!r$PO3E8U z^AXN~t0h9m+hzIqIIvD-iVs4m&@-RRxo5j9U*Ao=dvyNem1Chm>|(Zg-4h~KXB|b4M-``3DH$Jx3eZ8dzo_X{pgvoK^z4;a5NAl|gH-)yE zh@9I7_7drOPz=h-euwdCWkd%%C$HA|uwXhExPUVY--m@A*%Mkaen-~=_zW(1;*Z+z zH@Lg@C+uqq$p&jl3o7ek9~4K1^1LZD@O*`OH%yy8muhaUZS55d9&bAeuApZ9!Yf+$ z>0Kp*iv;=E-j!fro!ZW|&doG$jG}<=kbfKQ6jn`NpufC^#KK;YD0dbt-(M|IC#nO+fq|VnHyYGO z*h;$GSei4xzK7S0@r~+Q%>yv_*_!hQvrIh{Rk~H`&fr&$$bhG(}Qtq8X?H zxv^Pn=Y$V|fll^{&&V9rBTk}B(8}M=2LoHBVJ>gQw8!F?i;bMQ2}~#uTioRA#3rHw zSX>PvF;bv7RFNS4*ugZ7X_Pml#Gb{#;dNp$W{*J?TX))RhbUvVykQZTkxf#>IW6%H z(QM{yGRjNLP$1UeS{|&Yy@gPILxv8%7(|$TGNhkGUQ$uy?@8W$4equ@w`iA+oyl9vTR-Qc5q?G^CW=a>@2Hgw%l%le>1Yz^xx#!L1>zrj^?Rb9T%URW0t%)`Eeq#m{{^`u{z> z`2;s6sfww90uMgmk=$- z#jB<_xly_tDk?H5eFWuXyKL(8__BK^{oertqf$%H*DfgX<)pbNlC%c}V4!}Q(?{;5 zv|{&+xYDvL(I6Noq~%j&iYXW^F(+PEfy7`S={MJa^UdDLqTn`DF-}bc15<5i+wyf| zF0Z3V-4FCn1>3bKvFhCf5m#K`|8hm>ndO1?V8#pn(t3)i^Rl*Fts~Me!3zR}1#VQ~ z$AUH{iD)I+S|2cB(K5e&ak)ps4(A&_oCN{Tz`&u>0r!sDou81`$(fWr)4RaH#ObH` zo7=V8GuZ+31$J4ja9{w%u<*;G#z7up5jia@z`!>x`3dfPfTHYi7F|g=1_mZb@|#@n z5-0Z|>4viIlH*|D(hO%GbD9gj_1339b)|Tvf`L&H-?#BP0hW{@EGxgL z5V{UcQ@5+<6~NW;wGdO&SE(zXdc^N(Op00q&kan&FNZqvs^$<$T3{(zP76B@Re$F( z%cFkClv27B4CL>)s%oX`Ke%&|>y|afX*(FG7!VtKi#ECTH<+#;7hQud>4|eUEGRv= zpsd+ZLRDSCz!^?N?1)|y+?FL^uPR6fi%F6uZ=KTPu*IhN^KQ!BNVpaj$+_dFna%A7 zx4tjWtaX9cFXc$m;xoCcrn&mr&r@i~F;G!0C~F~|OKR2ePW;2o?HSy#73XPx_7|5H zgb#?c5xQ)+L)7DE)3n(?z_fb&jl4121@Ldb@4VZN8N6a@t--Hp^SItnXcf`vxtpg@ z9);^UFR9U2x+1_)G87cQ1GyFN^PYwyij0{hfie;k4YM{_P`of@53@C(sRN2b(zq;_ z?v@nkELFd2b4gqq7vt^Z!UX>^9fiu3XIad;!fBEvAa_+$9Ncj{n4A&B+?bm&};>*x+une+^tm##i6(9 z)3dxqUZE8koW$G?`5Z8i{eIqBC))OD`KAqV6PO3#{z-XU!;%C4e7ZyKl+5q?yuA*} zh=p%JNKk2eSuSx!HW<98BD_Z3lIrc+en6igPKbRUN{9|*FhAe6Ra~{CWxek<+kn$x z;D++p+K53x;0zn@^^a!=oWVdJQ(wlVY3u-6Ku&b3_t&;y;9!4SV(}93J8jINm=K0^ z6uvtOMf3t0Nk+|ZQK;^MGo{f{CzZ79Nr6O5<(!wl^9~s-s!o^T9K1U%xuRiO$twEN z&0rw=qbuxV zcf3grt|Luyaa-25;D!WlhQ|&&1~_;}Y@Vij%*L=B*3`rU_u%egjf_>YN)kLHsiN#N zrn8qPSkOUn8t3rlZSk9(0yM5$7!hD#$)51J-zuZDezfaa|LNIrVBk*t5B%g9#SuJV zq3JZAIA;O4ZbhUccu^2>(!#nfi*M3g%O7B1$BJ)$n)?a8`)=cfUyr0eI+Te)jSQw=R8CbLZ3w+iJ@-IM8z6H~Q_n zFHY{d5c1&1!Gmyf;Wqo@Uq5;A(s%g<%d-UE`QJk8h`kCz==$VSH^x3U`L1AqT(>J(3U(0plnfy8vm3P1fF}5X- zSf0nExKD#{R28I^NPC!C(~m8IHLWG^C6MUT{+pmd#r===`m9q37d|yE?e;QT>q@`V7~0>xqkTC2xYfZ7(>hztpx)ar(FvC zKVi%kM0Bg}w)zHufwLF(E>DWi7>jvdU@EV)1c8C!_l{4BS#3MW67FMH3FV`(6iCDt zeQdyYBF?3{aNhzG?siBO|EvgapvE+f_sZtLjRoQ2bFt#>3{eN?(D*Z@9v^}kJ%bMg zWA6!ZH9as}A*X@+8)oN$VXhiPI)q3b<-uS+^43OyLVk#T$wu(*+~;K~Ffc=Pa*TM) zlD5@zgjbrjKGA}K)#05^6^9w=%v1`O{%rs_Oo*lVMTZqeiJJGimW@I!;^yMjcKQl+ zb5bP(_ZPvVi#5H+Yq}clcf?m^h?8Q|FmMI!Gowqw?o^GtqAh4>Z!rH048(t*l~bCt zclusUxK}`Qga!)4lJ3gd&GJvPvrb209N8$=F^RkfHEEgWw|-5WBl*IL6euI|3io3s zKN_#v&Myu->bExm49r25U6B)mdL$Q_8F#v!7lMIzrta=t?vvpCc3slq!-2VlP#|_C zqSCdtZf|l4vCo8LhG+5-JJ+_l=y~0~oJg$396}aC84=}!rj*j;FO$QSZi422k--x` zav>|$GZvYzPqv+zmTo1r?qDwWuwBHAl_P8wb}? zrn+u{iBsE=xUJ^uk#PHaP(IXX)Wc=bOo=(BW$J1$u&Y$l)x5@iXY%^|+Fgom3NSFdeHHWe_?R2K!;>-J zX|eE`xHD~m`r0IXV{VU=Izdncw{G_0bRAVktwnEzA>`@BgNur-4dl<4Uv)aiX5C2rMd}*ek>97w3viyO@I~j<{zx2EM!))Rq>(Ogh}b->FKdqC~^HoU=#G7G?#p51FAO z_JECIlAD2efzC%3cM~dd_oB=(UEn%~*e|(Bwp;aKcyADUViBVi44hPX^`-LpvckxP zsRPDK1?$1U4Br_f+A)2fYt>ZEz%0isFwkpW$|<&qGw^M!S(2n7!6$M;PZ8Ut@ERId zFliz!5x(4mmv)3*=`4(MJkRg(+DvW-i>fh&IVuh;?{iiA8UrWIgm-|Fq__$4mFp9K z!sEuD$rJqqX7py8I?ji^ZQ>Qj%;AUo=0ky)4v}~8+^QBACTxacP-s&BE^-eZu)@_d z?QMP=+zt1qRWrHEwgrZlXM_iJG{dLHejl~-_=K?jjHcMdg*F1XEmkUB`IE2OtvpGY zyKec82jqfPU|^wIdp*E? zz%;$s@9Fjrg5gTay}0H1oye*LKi@M2Ey@9SEG0G4UhIVHTu~0?K0*%mU{U2$6H>i* z3%A*j&E=oyak#D#Xho9Kjf@p^tnmKt-xj9x{u52^805`oi@>V`pMI)wP5i1lCkoTsf6K zkW;@#5EY6@Z>hkN$}rvpw}m-FW12X(Ki`*I0tQBgI-kq%@@UjviNt$~MiKbA?{wls zWV0k$+j}Rs_nmWcFyn?K?|t`*wOuLI+jPf*4DiJsxgq6;v9_Y?4YcM4Sz8Pf%4k7D zgUn!(&{M!kTG2YO7K%gKw(V%-W5Yt*ZJeSRh zmiGDOj~u7?mB`z_FN$;oiz+NhDE++eA3b#SbcdOq!B4?J3jYhynA#pOk-@67sevD7 zLL6(3@p3b&tCDY*zsLKm=sK9OHr#g_H9MmBh`W@V=#~2(7-;aCDClwhVrHN3r19MJ zsqkgAo$008Dwo`%gn5Ar56opQ1~WePP7;}W!)Gn16}M%$ucttP7BtXt&z@;3G15cB z&IsZ2e;OmiX;o09mv3B-YDn7!SL67%b{@9ZRxYYp)XXg|#UDZ?Me<3nY@2Gy+)iGv zI^jpbPB3uw6!%Aw*o(HvkHr&b22c&-nH| z{mLfK*qm^1*Fi?5z z^}|c;+kI~J-TdRlk)?bn5R0nWekwZe)UDq%qd0+ra^k=&lH-$8L$f17&txiN4uNBlU{!~F)y<& zz8k!1kB(;E`sva$&8t_>2P{)My9dCG>9aQoFAesH?ksy2RNYxU)dB((H~IfB0|KH8-C6umEms?0$XI{l}Y@uV!}#p0a44orN-DH>*@z zexLv8Cw0-&!<8C%xQK9WZ6{@9pL*zaYw+Ob@O?J%4=vZfIQ6O1eEYJ%^9kM`Lj^^z zl=FXOF3ZgJt6Lp%GhzKpFt99Y_bXH3Fr8oz`rbuI1>|} z{R{@y$A1gMs&s7e9Z@RPoQfhmjWM z?}2-n$ENQ{u0OHaKK*gZ;Qa;)3(833p`XKp%i2RLK2Qoi^nk+9fh^lAROvL9vHYD3 zkCX1pz`!ka+f8~|Zv&I^Q11I;oDUdCY*k+w7j&6l{=jLY(+byKFwi$SCv~^ZuqsCz zt4WF)gm-XCB1RnUi@i@Q7*RCiPs8n~4Wie0REVUH6_K>rc8(HmN4equTSb*)#bT-^3k*b6Uk7s@sZKX(6Bh5$P9H^7qdBXnVHrO+ z`@~^eHm_R*WyE9y0v;2QDiEoZKMnr%_wPw~m&|RMkX{lQDW~0o2Ygyvh_fNhiQpOzFyE%#&?g4@_LlGe*TS35VBis{$7Vds zd6m-|vP+CAu^kN5lqV&cVz@>562B$s-`@tCipbaF`2MUc9b%D)U>M?sff<9$4TH>P zm+VGyhoDPU2M6XdliN!pdEHXw`l1c&4W(el0@Jdb`|P@1obc(ALD$ODVBqaZZRrQ9 z`15P+mmf`Ig>`^|u2sot9saxf$LAg;%$ z^=P?-#Odn#BFB6@{kAfTKr?*|5$1VM(>k_^-T~*T#*ET=%mr2{m z+}_sgh%Nl)njkP^;o0%~+k+xJ+-yC4`;D=_VBq4NxsLj$yyExt;})N_X{iGP_qEE< zo0IVIKpP`7&;(ZfD6ejlD8C`bvzWVLi7;!M0L*y(Cj;9n)G*zSdFK1u&cUu=VA>2D z#g+a0*;oGUoD<;sE*T6APFTulr>nxvhr-DoErH;93Jc43VtSQ^OX!FciZCz^DL*Dj znXJJDCAaZo#)i{y?f;$X2gluhWLI8c^rw3!X2HjBQ%Fn4Z2s}3r|VaVm=_ngfZIkg zAZ|at{~v?Xx2JEJAS#0gCY^JYu}wNLLK0%RCt?;G%osIwXIR6^iiuO&)hnu80^!DH zo@e#WN#yUcxlGd6%k;fpf*Hx#+5911%2L|#N9EdR8GJZ4C;4ok$5$M>5z8P0Y@#E8L*c!xezB-=DU2_H=vBo$I3DhWFuXp_HQv)!KbO88*aAt_BbR zacHYz(m21(rSHxW7aibAu8(47lnfzBvy|!Dfj?GBxqDSmLL{Ftew$pPrQdd*;^!-R z0oST=jy=vfhbQFktuf4tj^s}TGqw-;reAlN+Pl*I1*hho+ZSM9&<}2d%c@jUt_ZVP zdnTpGpg=4_lGGH{+dy1{*$&SSrN(;H-*yYGN~T|otU0QB4rN0Z6?1;-KF+m|3*-#) z4(5XQb)nS;4=LYKIN6JK!@b)#A`r}|*q;B9(RaGSBO^bZyCmTgFwnN8wJXQQQyb^r9Vtg z-W(j9>w9P$?ISRd**4VJL9cHwS(#Dv#9K5D3bde~m+mS3YQJk%b5}rMDcsyBBGziR zrk|B}1$jRHDf%|tF!Gw#Ci%kIK#Of8EaO4fY^bEjtpE0NM*H5brEMvph187-Fz^)m zlFI4`@Y$PPRk~*@ZUh4(ooMlbISGBGodylUMiJX0mfNB*T25MPVXME7ybJF6v+tLu z*^$0nx?oRNZAp<9K8~HKOJ~~(Ouv>sp@kk_7i0^rV?h1Y=VW2Y0`fG0)X5=P3I=+t z;Jbd?-sI-ssoxMy)nQ;@6fqJ7nDcKP0pi&DOTPEPz=r)-JDfLez3i)ee63B`1$T|! zof3)kpYrm^`+d6u_lCn~M(?+J_b)IHb+;DEi<+xDR)aSF6W$BqgH zitU`e5~M{}j*FZk^o6r+z(AjzLQY!MW3fZ6yfDS<3_P=Vd4SzG+_<2<|D%5IcWVZh zfEj5OSFvoV+DuFXxCT*ogMrkVepbUayjwmoNsP0Um=o37nevV`A%#%g% z#gy~D)e*u~hYr8!F;!idvKH=e^tf)(bRBW?>I`x1nbqt8Ki6R*{RmrIEK^H~3m$bC z4}t3_&`YEGD`{G<$o2Vcg<oMYA$&b1GSSzOy?TE%`2W?Z~eC|=?m{b5W( zWmwPY8WI>7MU{!f2(wqUFUxK86~ULq)MHu<>mPCJ6y?hnRj4Q#V8(3WCjC8M_o43@ zwcLe2(BR)Or0tSpps1%l<$RZ#ZMp=H9JwrNT;SbN@|?5N1253F$Ad+EbikXbA=Z6l zZ&FkOFO`FVQJ;53w*@{Zi|QQg`uOz|cpYz9e*Wn9$s2!(?9p5~{_ZPyWyj8o~@u1Iz!?!H=_E~mkg7*kwmdqO(;#2IaJJp;GUx>;4CG+9ryt%&*-WvMl zQ-{`DU^%a)yngc6F(f})&i(NOzV7>k{b}lprwd+nXGd@8+)X|MX8d(h_E(!fzxzjC z)^kl~rlt)H?3pFJd4KY)b=jG#^*IZp;EqG4`vvz)j}Kd3ZujZwBhpi#jM%Byw=+Nd z>x0;3LQ&{N>#jn6=gSu-ocK>>zt{&?HBRnbA6uU32?_u4~Jf4boqm~q|%C%<2v7tYU={PFsZUC_H=pyk=v z%Akc&FMpe5In^4(a)$yjL!tOT*)UKLDhgHI@$wLM(}--CPwK|51Oru1mpO^O*lR1w zN-i#o326lbjl#Zm5s?RDn&+%nJx^nTfor+Gf1~b-Li(9tE9}h;wI?=d3ywF2i_UKf z0P}Sx$DC9zVYJA@yn|XI@ylS~-nP}1*%IF~f$V#prX^Z27&z$Ju-N-zU_^BouQD6& z0K0F*h3c}kTbs0-YN;Yh;uJHO5Xs)!+MHCKt=whkmNFyY!QwTsdg=a?cCy~%5iRL? zqsUBhEZyXBP~TO3X6&p*z7@srpl@?Sv2Ap7S1M_6LqJa0PIypkle#@6x!<5MBssg) z(yoBJ4Jt#JR21Z$tfL|)UV%4!AzjjbT>YdiX0YIg<;Nnk6QaSNL!9)3n{jXcwnb-H zPM`gH0lq#F8Zyg{_L^MKP|UB3U8se7sPck$@U`KQ4EB?0Vco2TFtDhpn5PaAw=nY% z@@2Q*m;wf_H4nz=*D)P!CuV==c}kfE22%J5N5e^^cm6eH-fn&%4GxrT6NMX3w}_d` z7#CF^IKw-+s2wY-E1VwavB^k8w-9`RiYY@y#L;|RLA}bSUs7Jc{eJyUkM{MHCbl2_ z-0IJqJ7d9(QzKt!-bL%Tl}o2PCy>h{udy;bZ-Pxj11k+BcBJ7ii&E4s0VFBI^Pfar|*qY>}EavVl zO!pT#@fhGXt?d?M1<(ulRf|=L=C1G(DA0l$&NNUQBPx#d9$G|VltOVRIH@G5w7*nY z5wz-tK65$TS#%Q0!@B*cOGPmuD_<%{ap547@^pp`?eg*=X^!?v$#M8x?5z&ZauRi{ z*&(^Z()#nj*#Z`%*EsvzI;P8>QuibX`@n5edS9Zt>qM<{qEc&mOc}jkp#HkVk7xJ? zDY?@$o1cIBDi|2v?#1qD$n~2i;Rm|+CNzVA-_U|zjTP}iyBdj;)|Pu{!N4Jsj97tr zn_{opi*Q4s1`J%=cCNN8CH7{3bVoxiZAt5%;{~s+|;mtA(&CBT|a)e zZ^RhE3dULQz+|wcf?66j90@Zx=)W1$Co-V{aM;&^@)s2er*inl&Ve5oE5L$M(wNcX z?TWlrwc!V<>l@&PKe@p9E8A_?OD@!$lo+ya))w*wL^Y{`^fE&0I zJO&0DAH~cl^%@XuVV1Ojt61&EDC-c`W|PgGv30kX?EnL3dzB;|Ig7s?|KXng{XN=m z!9Y&q8abzV&wEo5T579nm4SgQL|mI}Q$tS)dQ>p*4p|QdZeLEuT}z^vvY9=l6wD#twoM`18IPTi|q;yaE+Y?>SrDZ!E=%vnZl(yuCs3fb5B znJ2t$n5py*A6lTDZEaeqy6ws|Fyo`+l^1I-OV^N3{7&1bY#aas-Kd`a^`++CibHF^ zYrn`l4h33J%YgQ2SdIE4aw?oHfFkK&;hnSA8jB(}8;9V5G}Yh{j?lP`T=jl%xSg>f z2`VOf{+?ojvB!CQuIGb9b!yJnVBol=?2>oPy;mPOjpa9n*PMp}EvPu{Q|XrRn1Y#L z178ZGpXpk$^8qh%${7B%0`}GKp>)WpEhcC(b>7yQZK+Aof$U^3P_l-Vrj1)O?SqQ; zqivID@JVW1w`_+gp>!bTUZp7IrjQM0)W18XrkK$d_qVpufq}$jM%ChPxuuuFuF%gM zaoi6En&PWJtDohTP&L-pDQM`90Sqk2q@E2opD|=`v>93-FZho6F@|gWEjiuw+XUrf zu$Fh=#>OhvKzT`i>{9#(ZQlp7-&Tf5e-rM*|Yt}^1Q)7#i#btH9J32_lBqYq%zL8gMl-Z9^Z@& zT-oPo_(CHu@$m!$oxbrZObZCHt*P(xRep>2fPqEckC_v+O=p&Q)jZ;|^5L2znSPSy zwB)B1^fjz$EFHZX%&3d65o0_Q!8?k_(#7g7Fwk{rWV+j)%i6d@X^&U~KJfi>Gx!cy z(idyji}wH2Cook00%rV$9~5wMVfUQ;Zz$fJ`eJwl=kCwV$qvgl^5SHqW6z`<<`svO8Dn_7Pf^~8`F z@UXA>Qk!B|u<7GFjg&{+Ceagc4d0z?L%Wg?XU~l~;^7_U1m7k?Y}5)+Yl~Gs?MxP) z%HD1SGj3tD?HObYHkFOLQ1atE_}&{-amdj=rTm6Ln6I9kQyd{nO?H}Kd zHEj7&{tzswM%GYb7A9kFw{1BP>`Z1W1 z`|wpJQGTLjJ%>o$)*&d6i2Q7N|MiV8o@76(eAxW@85D;er5|^{bg1*?#cZD^{MUo< zwn^MMf9mH4r`A2NEV|*h^R+*i@#{19f+xND_2cY0t&N$bDR58a$xHu&fhY5x-~Tcs zGjGm|8DPep{sA`T=wKoT=eu>45941$f!N)i_t)?Ied66r&M1z(!JhS%WuACqxj6Y> z>nw&ByP#~SZ^xo>-Nbb@yNK&*K6!OB4-9<&?aXJbXV$IF%#TZKUjIHk1}|Rmu=m!( z%*I4t&8>CY8~*`je0j#9;H7=QZ*yMzy&gl}-3tb;%lvoPA15N8ygu)4Ie5$GJ{UOr z>q{HPKAUI$qw|^BvUX?`0|QZr?cvHFuF-$7{4*P#CG@O%yd`L<<=`}qsw>zyBl@^8U4>MwSuEGsT$-Vb^6Tas}UUjv(hNaUHK4g3Np zmu|R1E!z?#|3&Rma9n;*?NYQX23*AuzoL%G#mn4i%e+J09N7W}4&Ct)yt$I6#E&$O zc5-qS6o?&{_c_h$wmT-;Nc?PsTX4kXw!s+`wpmXvnC3rW!##L|~n<*?+PE}NwtO5$OAd^W#FUG(M6vN{&_6k0asz{)!)zr~^ zYtsjGu8giw!|iklg@zSgS$I=U^)uQ@7 zT2W!jJtz>PxaPYC6EwX8c<@aAAkFwtdZ=NMsn+)$xw{)U zIFDszpCcN?R!A`uJC~r9LsTq4=H^zwmC8c+Lqek)6i5UCN%qZrFYg$Flng}?DJK&s zVx>amR+=OjVphxs17%IY#|;^c9o-XUn;WV9MNl9XL234nA=Cnnk7DC5j_4Q57!j&N zs-6`Ax{2VfiK=;9`3x_HI(tx^UqF$8zXP#&Os^tQdF))r_3+RNwV6Z3lg*MeS*T{Y zh6J8OFrF)-V180X0<;;Ca%TM`8=7QImY22zbjNWOlvupkQS>V-CVG4r>&xSrkDZ;>UBdDwg1AN7B=Y z;MUB_GBacmdNPNnqN>E01`5Ow#euBpN~ANP2*gP7iO-4sOfbYY>OE}8Q=veNv73?O zqa&(FT=`-H4h$0mk3}6vH|2LR-opHPp=?Mf*pW)=P&L@eigLAWOUzIpMx5Ae6GmJx zNFvE*ltEEwMn%>qYipK!Up$hrsO+5UIWX`e5;ET7cOhAYu3@*7&hchafB`SL6!((*5q|_T4yfFaVX7OASPw;f0~Oo@ zi4_8zRYKwfk`2@rYP%6`Xa`b=o5TE=1j;PH33jNcSU!Wq(NvRo7)=rZS68F>xWoj3 z78GgDm=Ke!qAGm-prRqZr=~w)N3Cc1Vy>gzAtBtu%nlbj*d7UVIxk7~(v8mnuY4id zca-QK1b2j+wXu6~>Qf$ARD_C(Wf8U!_6cks``W5hFwimQu)41TKWkfaNo4M-^aTSi zGg|B34LDr2M*jsrJ4^;QvyXFs-eUerU8U{b6FA>i1vm2U=)+E`a4wqb-%(4i`Leg{1a<1u^{sVyzlDLETNLtw_%7GG{t@-H#no||jqk2Hf_ z3AD--EUDUfOqn0#KSk3mE(SBcOLp+`j8#{CUYN`=t449p1fuRmJQ2#WUtg1=!Ls0q zcAjxLd?$KV7=3qf5~m~ptZdO~(UTN$-c-gr{;P7*ScgpDI*LxxW}T!SXLPBJ4JFeR za6`)5K8hp>#cNc^5EB&<3Kuokx07w6B&3ljo=Xf7JLABjZmQu487VR4&DoJ+nzj_4 z{17{@(e0h-wBK-ge>T~36cGfv8$!f+M+y1$I)iBmA1rA%e?%cK ziOh~13l`N_{)y^LtdKb9qKnJ$Gve#fNn;^fL z&5Kc6B3v5_)(94Jsbq(Cc^p?uZyFC~>~oBz-5l5UL@NpOeKN4L9t>Q($*;ZPD~7ng z!(*pl2{Q={^cO94_P*~twZ%B#EDO)70|SXo1SoYXlvr03v>1L~`6lw-su zUFO%WZEYfWrUv1xycHzfj0&dHl!Py)%>s)m6;k&G4T!fA$5w{;EDVSDoScZPX>qKu zodGk(Z(W$W9{wGD-?I@V@N0T6CM>8)`S5+XLwx1yB5xO`wjp{C^X!{5mcVrk%+p0s zjFmC($?`R6x=|d=B%i{fsYMlKt4z$DiV4@?%4+UF-~mlfaqg<6VzuXoLrcM;(ylvJ z26+8H?7ewZQ^)`RKQ~+;!GKAK8W1r%pok$v1&Wx2u!Mb6L1_((ES4%DRkXH*0AUd^ zghfD5HgTzK5q-CAtzlDeK|tHuzHJ*RRcaSe`>tBW{H}d}-|z3|oXhWf#&f>k|E``R zNA5i5HS@Ul&b;O|b7zJmk9ge~d1dWo(8B(ZJ0asrJI7kXC5PV%b$n=H1vy3yK$etF zVpnT+m%cI(W)w|D@!;Zeq2?^-D`bde|A`7UDklNt34OCilD|#Hj(rO7*S2xt_y08hK~VY z2k{84$>6wFADbr@r({4|jN$R8SO!$)6>%N9&fm7iOONSsVjDA}i!bXlKbSfP+f04G_=? zXgEGa8EIOt&O@$S(*u?ED)^$RN23vUE{T zLsE1K{4!6sA<2!l${lUp3wq<&tTF&=5nIVx6l%kk`AjK$0vR`bV0A#KxKE#`oIB^X zizm-V;1L2Xv_hZJORpP)jXCi@?W`Ez0WEC*f*MlT`M#CiU$f$BMM>}@tLt_g$yVW{ zq`tL$n_d6fh0qo`OX<711Se?@czP?dp@nX|qJu3{?ylv7*%cvGh49Ww_eS(k5tOJ+?+p4ZO{tO1_I;aK8OKv~c3HmyeYXo)3rQn@%-7 znTCHmK708{wBVl}zSq8c{{Dk=E$}Zg{mA1x-+cb(s=vBc{mb8a4g7ul?q1(h`@PR> zET4y&V!!h^16{|HtDe1lT)yhF?eabE2YRe{04qekKKB=M;cu2tqeQ^W+Zt8|G~}%N zjE$4sADgCrc;m$i_?z*-Wc}E;&vg3 zoV6{#{#wE4_6sj>n!4`$KwEsaoII5j6g6^tMd$;Y?j0*iv27WgxG(B~m zP zFK8k2y^nV5_PS3lc-b@0IN&o2R)}2xYwceEbuPI&Eo_AkbBi}_cwmlw{4_iN<89`-?siNC6r5%qQ75AZ_9CLh1P3H~pWC1wxq zmmhf#+M?;~C)Xdm_w4=ngZb7LCgXB=;a?FyjC` zCfWHOv_;HFle+1m@@mSRtEmd12v%qUmlBSU8p!|BIXE!R!m2*3_O585I>Oz*DD^5Us7YhduikP9G9YJ1yV1xfgjy~QcxeJ5A$T} zl}Y=Hs-PE&f{h**57(-`H0MNOItp@2On%eSuGke zdk-l##!#z|sOW=+<0`s_EsJO>niN#7Os1#6FHVcTt#$cB8hW_3N7rH#vB4Sp zj=A8X?v+=K9_6ip7Lxn<++6{_NkPJ)#QXGT@X@A;j`tM_Y3hi=>^Y@pE4$O7Ek0r; zpXzF=Z+5KIY01j^PFNxG`Q@vH^1p`-<|6p$rk>RJ6g%+fnk~08?v%0>+8nU^rQEK1 zk@oF#)GF(xq?;bFW@TOKr$Q>cN>lf9 zM|0q#V)w2_Ut6Fb8y9V6WN@cA@S*?HAJ0-e^l>sv5IvH>7w zTzO3etPYr;?(}O2Xa1vvvVxB4{Vkz|bixhjahf@KnrcG@;WQY;`&W> z&wf1^{0a2&dSIlzFt%BDdk^<;SRJ72(w%Ry zLd&h%*_W%8Kf$jWdBcD85EFgIlV9FJIo$1N3vJP6@7Q4HsQaAJpF~3|%nRC~g#*z) z9Wbx-lkGK3F#5FaA3+P}9{oePrTMai|MNI!3VDr%5nOC1Q0(=UQKvrA`HyhmedETI zwFdvT-yHnUSqO~Ak!#RJEz6EfUwxhN{W5Pio@~DX{)yubxM_Vns2X2sL$1frYwSY1 zTQ_oo#lJ-!u?^5FA2dSyR3>mvao>GSBHHv8ztE)=x`vIcG8*l}%Gh=NyEKpNlHoT^ zX|3F%@j5)rzmZtGoIe%!5ZdBIp2wj~dS2vT4t0xtPSy@U3kPzo#;fU}icT*<&mm)z z0$R9JEK(rsB|t8~o}Orp3$$=Z%`cDp(b#D`>iKoemT?1z zpoLOiBV|eX(f0n%3AVMeTwEx?OM8I zo`qiuv_&`hE)U7L*e;%#wR*nbqC2$EF17CJZvEil!IsJ_0AAxG4v<`Az}8~O9XX3! zhSr4dg|=u&uabT~C;fC;JVS9J$<+~B7?j&yq?`z}D5KhDyXkN1p@sFkC}+_s$2wl= z&oQAI6h4?HRrucNeEGpo{u}RUoe{Yd<>n z&_}tv_)s9Ua8Tw_@#bL2e1Gk=jjdU(UqK5K4l|P?okqn$SsA=%J}yPj!l148H)0$u z*LO{@`^P%Jg%0B(WXkQ&Xkk9%S=if10SL6gQW+W8*_7s3)QA-){t&-LfaAuFY`FdOSmCH&O( zQLlt!JH9&qj`@7*fbI1~@Jo$O?={!PcU;wa3aUnAmgWu64?r%RyH_(oQ&gxy1RFb? z9a;#`u>yWiLC27LAcud;AsbrA>Q7*Fyf-Ve%1se=Gcg<9|6fmCiSD%C&%e4mG4a+} zauu{i|B(P=xBZXVd*)6Y9r~@#30lZ&S~4s+04UXJl0>cwhlgV>MdeZ*THk@L8GL8m zYwQbr<4t}=?Txmq)nmKO%KBsAU58*!Y5EG;p}ZAK`dh}5cbh@ivHYzh&rVrmU?1Ic zvsL`sA!woR32v%C#V!cj_C^E{J9s}XA~wablxk!DhkwlAw{iXO&dO8Pr)8_sg#3c~ zYjcN6FDapmTH0P2_f<%3*tR{b%B8BxIB4N%hmf3&2~GvB2^BszqT8*|LgR_bp_<=# z`m)jipSmO+{OH&bJrRU087T_K{CLh|69wAh1$O;xkJYMN_wVl--hCX^>GyJbS}gp2bnksy=HQ#}zGB1rCr@ssX1#>2 zqv_=JkDdv~SLN-xW|BQHeGe^swT$L~X?o%_(_f-jTed?B0pR~=y6s(1b&*uIaN+~# zH7a2H>13aQVaBm1yS(@K9yh@Y&pmjtsDJX@W7DQ5>F2Ib!>@~&JzVj|ldqr5J~ylH z_~2(&Z$Q`av?*w!@9V_p$7`Y%UXbsFr}|*kySG=Ztokx)?Kg@Aci)5d0gx>Xf6o6t z?L4;KW&pNiVIhm-zhd zesP<gd|Fd+eNoi1g`dW}gr3JoPCjV(SM$Am-)9Ha0Dj^CUDa%xn!M!*Rb0CDEdR@$ z(B(Y5>i3~L52-d~EB|7xsuIF4r!;!3e3^OOkow+>Z<;Av&mMuc=ok1MZ^P!7ZF?CD zS8e%lDSUA3W|WY3p)c@2`-S{}z8|?|3fkhcgMYRkFr9p0`eT78hPlb#pmakEZCkV- zn5zahujP_Na=<8q6(Sw=fD~XQbt=$Zk`(2B4XXo{GPjJO%O@F^$JrOzpKgV3ix1AO zb28WSb?5jE+O91K7uup5#ih^>?e8XM7coTd#6XWy5UYn$K;mP<aMz;5Q@$wO4xl zIs?nrue>3SwvXn+H;jqC#hqDP>?qjO;?{IG4m_GN{SJ}%=;3;8Vg+Y!=^glY%1ivg zEcpQ+{qe@6j5`Mu6VObJuNLkr$ZGN-5K5_-uYneZ%9_@P-ex`yTdp+bI>_swg_e>D zk?KY%JEryM6s5}t9?tjjhOS{tPo5rWxo$W^>4de2?7#U-Qk>E|BllX+fgRYB04p?s zjm8lswjDKpJEeGWwGLJX{IVTT_b}9c7DF*9Qe6&%7A9FN&dJ= ziI~80zk&Fa6Md}`W%sI+&=!@PKp(Le)uXgg;WO`=n?JNLw7!Wp)DWSUod_ryD7S+T zr;R66cwE#>>L%Ypv*?v-=)trJD6$wzE-I5W*o6I=4DX2Pm7$J{Ld9d7<<8$yv7^19 zt7y19;TeBy^v}@7_vbd;oqHHsDEwkq3De)neb+m4Ybxng-q1pFLuX-ZW_fKwKo7go z?iPF>t^gFN0-zqnY~cTfF02jOB4=aF#c^7=4<)ry$<-vChZb4~*B^+r9X_WFukuwY zTjA$Z>bxo56j92f^t^J4d&z5T-xA)vX7@7p_A{Gg=>S+zQP`p)SldLeUtWmbF1or~ zJ}H3J0ey()Ued1RgHDq^ZvK{>erTb;KsOOHr1hu}H%RPQ3*hhn-1uBta5dAI>Yk7q z^ig9lw8d=K@=wgfmHpGGr#@EI49&&_zBQy-El*4{(3A((`!k>o{z^{>4T#>&E&u7e z;v3f{Gogj^g+bbkO-8?#-MT$yvcXf(LasCC2I?^xkxAObn}U7h1!gjKg`Wt%2gi22zKI2x z$s}uk>X^%$uJE4!4d$EZ_OJE~+CGRqde~bFPZe>R<2D%9y0muFFypHyLwLBDlI)t@PQTL=^uAo2tJG|e0h(B_Mk`oFmMAlI{umc!K{+`%5B+k|Ugw+AQ5BGhyxbusD_aBe1$|Pk# z3m*>sG{o!AsEhk}=xEcp%omCzQsAGdj>l{@T~pIG@; zjJ^q8m=P~{+V8{M!FXDi`9xWj1Z^=gsmX6~IfZfEvS5zKc+)ayp}5a_SBb58&KZYf zkAO-=4z#dask>Yp#04Y~pr}b%(A^>!322OccuM)Jj7mGTU>*y8&bL3;C3P>;xUtc@ z)2JHi@`5gErmp{;0b!-xVrz@os(?onXyLf_^m3*+)xpgQH4Ab5}X3@yj@CUjBv6kI*~#Ip37osYMTvN;RhFJfk{HH59q z+2C3=9wpOFMnYS>baZ3nBir$P>5{2OyvpC;mr~@D#JhI;>C^404^=k;*@4g&***XS zvqV^24Co!{zR}RalA;K)i_>mdfen9bV}DCGw6NhL<87Oz9$A_N%D3r$q0oI5*fQ(= znk#Pn#-KmkglAeq;0Fzf{pa~!%x`OsrtTipla2MzMXgk7+Z~p(?F~RCvXUas&_dwn zToJlwQKIV;!-4g@gYYqfz^*|@)Z;oot6Op7_w3;SXp4ftZ~ePekCURVRV5`C)WVN% zqkk3*(NCA|AP;PF*X~Z4fVF4>6T7@@kMOT8rUjGC;akQ9%nMPG>qOY+`DRF@J_FZYy63Ed&?j`)&>Jk{ztK`ZKd_ zp(oN1E7rC_o^^o-6Ob5c^kZm)Y5*7l26hw~gCDlJ*a!Y)^pi|%PkxhHdgqR39e-~r z{OqKCMci`#9;e)jB!>Z}ivWH(gdjaA$L$#FTb}GfRGsfh_@Q65wKkoL&Dhs({5E8S z-IxUn2m2P%7CY26|L-$PvCsBlb)W7kc@xf}oW<+{Dlt!?pUO0p@mUThL+4rG}Xp#uG;u=;zSgz5ShQU_IUs>-|{DR4lJw) z{JojT-X5CSU#rs-n=t5|V+kRLx?|IYJnh2X8 z&JFE*xfxc7q?R9 zKnn-4y*;pPLH;csmhqv5n32Jz0*AX|Y;%!zY=040A;PiX*TV zk;6JZKy^H9*xwsjlL9LPF~POev9LvUhbzyIFQE9GfEK2&n-lYuHl5AcPanK$zZrfN zTUkx6Lug`8_MG~+W^?jM5?G7KBKZRHB<)j6S`i?vL1?f#fPKG~Bv*yr;S2p1QyU$J zpoPoJB!5LVl=<^_G9P!OM=GI(6@jkb@?RR#*P$OguNtol4f&jnIa% zZKdJwB1j{t0Le}Y!kC(rpKs8i>lnzqAsME)F+u7=>5cUnBfBQf62ONQs5m$|-Empu6 z39;qac}?#75*rM#tJX@u9GHAq5$b~fsMg^7IR{J7mwzkmy8_1URDu?1L zvK@+pp7Fn}gdgpfxK@U9Z5Bt5bk?PxIMN9}N!a&hTZ;G$>cLH>2USlr?}4o#h#Nh1 z{F3`c&MkI*eJR-te*P2y5=%FnhP8^vgJ#7-cZ}dfSZhM+sLnWYxj!qPGy+py?OArk$>`%)moaj8gT{^U60{4T1Ehx zKsaSEu`w@7pV>GUx~SHnF+)CHREoP|J*xZJ9p2eYpe)Erc2I0jI-ADJ&~?MNQ_Mcp zBcd^n*5kUe=~rJVbWssCAf;g&EjQ^G=;6D?x|Xv~Qw>i`^WHRH-8I!{1r26b^paWi z2hHl9=B5dHImcq5g}P2ZU%y2=Z06btQbaNVbVqCgx8fueL9rw1wX<>zn;(!t)SOj4;`Hhmit0CrHFS^bxTt- z4Oqe#l1o}GC_*3mANfij^ou43eiBo4hjV{^K&_dMo$k``50`dmEb_IB90Dx_vq|ZH zgi~g5p`9TUXd7bJ`g9@;rN&7EZB7*8svB;${&u#@8)nUediYf@y8BU=rv!I82dAz^ z4{g++fwuU&aUyVGbyp76gSA=maLz?&;jN8z3eg`Fo+gQnb=#-`S_sk@m;g}1>0Yj} zQy(va7V^Ve%fisdZ=m0yi!wL4>Y;@R#XWu-Z0E-G2f8*{Ej5F86Aoh^AJht}28@Ad z_2fF;T4;-tY>lv(B)L(A9kWO-VtGOf0XT(CDTK@|JQNuFk%fZ@S~!xZagvUn);jGG zAK`u)w-H)cyn$XGVc}=RQtBSs&n<(WiKgG-4tP;oo#yrIiFnU$p90n*@~$tMU{mXz zQJ>8;pjZ$ER`{w*1HhW`c1weJQpn}_Lko4Sb$N%1yX@yYt?=-e>;4+e>1Cht1BD~s zb`J47owqcuhqf5+Fj*SkkM6M5R8iMaAMs#?*xs|zxstb*xTsx!{f)Lae} z(>$9>9nJ*_K)7W!Ok zFSy_}y5w@}fySNW)6i>>5gGqIX3m%Ef_MkkvIjqhe{QhDQJP9DvC~dNId>df^ze^O zX!rHgqPOWoV<{d_mw&YvUbud4F-i;Eb!O4q-NBJhquZd__zi}*FsRXJ^u}cloB4f_ z(84gEuJoc}U0+jp7uFbSvS5XX6Az1G&S#~2$7Zlc5*uN4K)F_NGn>^?$<1XQI(fYU ze*MCnoNuV-ES;8e3=>Bpd-U)l6IX4+NZ{ejWjzwl!CSd@*|0@5fv&z)Vr8{R=DY^p zfmRfISiXr~nJ2T2t!6e}TnuXsba}dF2y!BpBpl}TN;;MBVO~=3!#Q8}--^_)Z;Pl^ zy177GbbUq*O;+`hGyCct;%Z8uA5(-zz8j6U0E92Z))e-`cf=E&aZy7F!CXO6lw0{u;+>E$LSc4jKy!8slyl zMh^9K!$L(G8f@tg*>x#u8bCPki+ZsR%5wUH{FgcLre_`ZO!ow^2EoDSHD6BqHH^Dm z@YwP~ar1p>;mE|Y3;AbGO)d2%@H({6+KKR4=m)wQ$pMW>L`)X$Y$-ciQ_@7ikcW(%=uy|j4@AG?!2cAHevVQY>-*2<~ zy|7S4wjW*+>4r`>b`ZLqf4ZLBiD5A*Nk|Fihu?{>BCGLrJI=DzzLw8fI< zCzq!4|5@^bB3CAu^$+;5W%FP689V+6Ea+%&>Jz_s0v!WE{yt&k`g_)oFI2qF^d7K$ zKlQ!ubL}4N`1=QR1%Kc5;fuQRJL8|*b)6gk`XvQg*uC`6-#v``bt_EIRTI9Y&{1=+ zVOwUz^yc3RADd!7cy2Kuhqg$au9%*B^75DMe$ylEv!dXiw_oQUxc2I_ke5&X+}`}+ zIrQob zr&FYaWBU~3p!Qy{LInN0X4Jp`g^!gZBm-Te!hAh@i5Am3+*JxP}|23KzBu0BHor4S(Ew`=G+5||KffTlnCjpA^8zs!dWUC^nFy+~o$ z%Ey7#>3e4BQf@#CdG!}9c>AMiPUUa)kYbPAgcTx%h8iBKqG9oM%|3yc>T+Q1fp6NIQi4y-w~^{^dTewNzz>&eddxY@ zZq$HnV^^Rir@;?kU#)IH<>`F;xh2fWv}y@-QT@uow659=w}TpgD*fW&7HDBs{c^w7 z=*l;8oU_9%B!fS}3Xzm%aS*LwP+r4OW9yEfW!RVRG`g^M9{Xs`z)|@6xkQImoDMJK z*KM|PtzK8Y1J)i$lFjn0R*kb9Vshh|Bd0^5g;xd)kN29{78ZQov$lQppaE8h_=(5{ zghq;Nq+t_XBpR#^3!cFTv^_r1!m!Sa_C0M6<(@b6?|;5(Xb=C?wnuCJ9p*di}SxBdca5!)DQ zqcLYusFk=Vl00C9m0>NE!B%ZG(IC11;Xk4&)$kFo1}^`5>`;)JA^wgf9$jbPS7F?p zv)&=clUHyc_GX{fDX9#$s7MbLTVPDWzGR~piD5-R&|Ds7t8M0IE?+l#9dSJmEp(#u z$HuSCu}>{6p`SE-4t?tpT2jo3c(H@FLsv^L@PzNVO&}^wQs&Mmh@*u`?03(CF6n%k zqkqdFJDZ&6nQhChwtyCD9Sc=hY{k*f7#~wwE8Yn$e57;`CO4(K2l5%$-uX5bdRH)n z6iv~orNAsruO>-f$8SSK4uzc1%|W?~H`cm3CqtKXNX*)Ge7DO5R-l7x`EM3+(8Bhq z!w1gn*949CA8*LKQnm?N=pO0EreMv68I@B51SIHL0IZ?m+Z2}Wv46`VNBo3#p9^hK zBbIz??V-vH_T?%@xDn94KH#D6UM*t|`79*GS4#r`bVLZ-rDZ~TQz4?n28UQe7n45M zP+;XLpehD)6fT0YUT7i9ValRst}rXXPtlB4C5d2#$TwCLjnV*6?7S4{6-@xJSio@e zS9{yG1774CL(Q<(K$zF2m;Sykt?6FY(d(I8;bXvMN#|GB^6#_HEbrXQJ+=yZSP2UK zXVZOlEbpynH^c$*5VTJNK%!cRh)}659a}U&4OT+ev9*t-uX8T3I1rz`xT?k23N0M{ za053^IGV<_s|CR&x)UabPJDw?$to%Ey*41%k^Fv3-RP*?FOtx z1d!%(k2Eto(2MR8)z>TvMs+)M zNwMbQOmyrRhe2w76WUn6XW8W+_n?oz6e>$E?w1Tf3*8<44E?7<%0|cb8GhoI!B_9D z^ZwzVHaoeF0K2w&$17o*n|s-j%hbZsvaa_Cve<+o9`s zX6X4xKOEap{~ooq^4Dvx@x_$g{)pclHmF~o)}$Rg*EKy2YZ0k@e*AiuCAP;stOD!G z>_5TYp~*7O@*k)3-Qh#PvvUs~Y;~M{Z|L{O5AW=MaRA!lgYOnB{Po}$Tecm%z1d-% zH+)N>mwfQSgSD#^c@NI5W(GLIk9<|YOaRRLo}W1gUC2V}N7}Ws@7=rVSAHPE-3Gpp z_pVJpzw7u<(?tE-^yhc_OwbnJETp$if3V4UyJ^?$X)9mo_#tv(Ct?Ivv!M+cM3--E zd?(_V$MXD=3kM&;M}G5@Wx` zM0}?gcX#?!JrlPJ7;byLAY8!4<1!H!xoNBBps z2B~hmhMP>%)#=PyNTOVT%9V+vL|AhsFdEIZ4+`P9m!i-ySWs1k?X)YPq@cbah>?>vU$)# zHZ4e?kyh(a4cbzVpwM>@Op-gZYSbi`#xxq>0XcL}iN#?6iPk`&F~kgaPp8+o^9-dk z$~c5}7oAiOMji&Q(RsBhtGuOLPk~zu8y1WSv`E`%4h}z|HB;<*crGSD+b!`}rt|;quQ7!HAV49F~G8VR+h&ZDR^Qh>W$R=#asZl}efEhyO>*Tgb)gcNA z`tbxQex~RKS9a5v_0P^8wY7YFIcZUijAYPJv;i0q1q+DMOv_-LA9~V`>f>zN%L9magpqajU z)H+a(P`WQjP!a<_G)ksuxi`pRO!WXctYYvqbl4UdIgB1Ha=|9*us1PH4P8H10OClI z<{G9tSgMzj;qM_?SyV>qp*t_;0_=ld_&vc)z|)iDq^_cchg%iGk8cXx3u?pFI>Y5s zp$+wv`V@2p)rLU|c^BG>?I5TE0G zyjy1B0L&=>up9K)(*|n{&@^mo@|t?aaOe?jRuLV#!8QSNm3ol2sEB(Vx@KV3Ve}3M z;V>Tou7G{&bpnJg6mBRxs*z-lK-bKhIjRf3MJ5LUIpqY$8$PN;9s|;KPGl(}0`=I5 zvj$j;*g7$GT`s?44)&HqhoZ2Pg7dg6QaHoL2AVzgWKq<4q%4|RHO93SGGGe``qCRj zA`gou?pIj+18|@n2@_yHC0AHU*|FprKlqiJ()05sd8{CQDPwS6DMz0KTTTdyGj=%1-B~K%K`&S$f>4w6ThW zo>en}{>jPp-zYd}7rB~l32jeGQYbPEv`_(WkDfAYu7ws3hMx+rQ5)_F$g=vnvN7n_ z4;iL~($v;!gbhG_ksLlUivZ~M{56uA09sU<$*>;hv9k`Rxe)zCaj0G1u#Jmv;Ml7&k1G4l*i@Q zc)Cffhh_KZrODX6K;17vKWkX1(+nxer(-uCdMJ#I+3APDENJw|+)&IhHXeg_tq@>I zon2Z3FE9bdY(=%P;4M#TitUfkHww|`VeyBFCV-YKm~wv#dz+ABz=E^qHHd-6EK-Jn zp+>eaftlHD5p)#W1PUW*5hPoKVv6DgJ@PSuCiYs?)=)GB-54Xl2HJ5VrI{>y)!@}1 zSYjp+eCiQLy6~?lSOv)h-3Yx#r%fa!2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8oL4Y7Y z5FiK;1PB5I0fGQQfFM8+AP5iy2m%BFf&f8)AV3fx2oMAa0t5kq06~BtKoB4Z5CjMU z1Ob8oL4Y7Y5FiK;1PB5I0fGQQfFM8+AP5iy2m%BFf&f8)AV3fx2oMAa0t5kq06~Bt zKoB4Z5CjMU1Ob8oL4Y7Y5FiK;1PB5I0fGQQfFM8+AP5iy2m%BFf&f8)AV3fx2oMAa z0t5kq06~BtKoB4Z5CjMU1Ob8oL4Y7Y5FiK;1PB5I0fGQQfFM8+AP5iy2m%BFf&f8) zAV3fx2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8oL4Y7Y5FiK;1PB5I0fGQQfFM8+AP5iy z2m%BFf&f8)AV3fx2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8oL4Y7Y5FiK;1PB5I0fGQQ zfFM8+AP5iy2m%BFf&f8)AV3fx2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8oL4Y7Y5FiK; z1PB5I0fGQQfFM8+AP5iy2m%BFf&f8)AV3fx2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8o zL4Y7Y5FiK;1PB5I0fGQQfFM8+AP5iy2m=4N35;jakohG00yT+Fwgom>3^ii=f7=F; zD?xxDKoB4Z5CjMU1Ob8oL4Y7Y5FiK;1PB5I0fGQQfFM8+AP5iy2m%BFf&f8)AV3fx z2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8oL4Y7Y5FiK;1PB5I0fGQQfFM8+AP5iy2m%BF zf&f8)AV3fx2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8oL4Y7Y5FiK;1PB5I0fGQQfFM8+ zAP5iy2m%BFf&f8)AV3fx2oMAa0t5kq06~BtKoB4Z5CjMU1Ob8oLE!%l0kbRy8#{gr z&3bhhm*2mS<|_a9(Of?NJ*ey7Ntjr&IVRu-{!W{e#lRHo|E77RAO7$E{@0;iOvGgR z{G`eB1|X3DiDHGn?rbiK3^D}((rF{o0Z9K%F!$f5g0cSli~r3L4c1INkP#6$N*O++%Nu9 zNCZ$276$b{C!PK0_W=7dA_Zz&hCzRm9mG)MQXpU!0?hEgMyM(YztvL!ED+p96R0O` zlqOWUI?U$8;jSWLh6(^DFbj9Z1lXby+c`3wd&5ixK@-)8GeGOLI3e<`N(TVdv8z-! zR}IW@*G(W`DVb@IrjWUK1_%WJ4zQjkbm=isg&O>C@a(q#1v zH_rq(4&(^LT*m=;9YAPzjKCZTCiXk#{L68gs87WjDF_Oc6jL8-N*UgmNWFlZeY089>?PS#yHBzX3oUKEnfU0@60R zCtpp@o$0-6VS6<6jgpQqr~sF>33M4rw62^imbtC_|7wV^GXnqf<{+M`x0T0>9B6)I zU@?PO8-dUx@6zp~d8N3k$YHX&R1;KU!a=0CZc075Ya4Kna35w=FE1Llb5 z43)*2ner@^3Z?Y2rIbOyVdE@gcRt0U%I0Wvqzk^r0Q5`AEo2$iCXf?#4c1(o9ATj& z9aJhsj+MDQLydpB0UHESNJ^44MNiJ56tY4$|aFqZN4SNK%CD z1V|~k{1FZtSki|nBQzEMngJkuU^PP;c(3o755HKiM8jhsElS?7<&XO zGff?UOM&ooz(OSIrfFGZ+(i%*%xMBD6)CF-HDVdyi-x_9GHzlMgVkhii<2XR^l$(S zW11|0TFvlSB3PUCCCO8GAM1DU;sAe7e{T^mqp5c@Su=I;dbvy|=QuBGD;dG7-MJ(= zYrY)~ZJD7RKmrh|u?e7ZfRIOKdQ6>1DnUV%DBEME=82oqz&;$5K|hb`r8vVTP-IL+ zLLa*30o*l=AU&MqVz3aEzgwgtsqiT<*9rB^1Nb{(0xQW1p&5IaHmJhoi;$(ZYOML+ zh~-_)JUSJbpR#htfbEPB5)E& z$A>Q_(#|CGCidg?tt-sT;@NvRh5DJjg8mqCIN&=6n$1N2q2k0cS53J2Oix4yDfE!^ ze670yu4&_rYXnOSC&EWY3>=Em60*z%JoEgW6Hr5QeFtV#5UME|@j z4?+-5VK|t97}iya5Ul4f#uv+3Kx?H1g=-@NW_nOD5#R$$DVbh^mvUHK2es-k3a}mq zm@)AQbZS7MJ<0ta_vruNijo-HbHNO*H=t1cS^uNK{r}H`HtwPZRD3aj1+M1ObX2{@95I;Q-$WxA_E*hHY&QP^c=F*S5 zV&?<|^SK99xE#R!Wd(*#_F7S3T%N{JO@9}k0!3R>EzDb4bWJ2c)k6Hc34Q|%007D$ zg(TH~WidMepGPlC?&)q1=oQ=DTWe*T)$CNaQ zZv;FBdJCW8V$27;T?3B_Jh84`iW+qI6j(dX=mHfAKsL~^SD^@>f?H}!&kgB+Y=EBBia3E1f0J(psZ3mh^X=9yoFIxop$UTw*RNdg^wJtsJ5v3E~BbvbZOSz&Vi`6vSV4HdP?6Eo-0E*vdjGD=8*flFZm@^rHQ7`vm-IhJIOZ=paCK*=<| zL=O0gO+`$G9R=;>xarM`M9e<eGt6y0v<)e{l&XD64$6x~_AU7-@siMWB2uJY-BkW8xK#)X47+LgAA|l;psmp&0QXun3I%GNX*cv*mmP``O(Dz}EF+yvq!2HJo zPenQ|15lR0v}X^cTs=$vBWOZd6@pK(XZ0XY8TGm8;;N5OJ6Qh0kcwsHbY+rfQ~XU z9I8QVcDMXW$_$>5&p)M7;@#_@9k#ludx(vnRJar-z#v^x%h3wl6(D3>7qb~vfm{}M zFtw72*CMs9-;#x)0`wU6wo!fX!xw~&y@fnmHQEv&vFm8Wzpfzf40TgVRJXJ7v*1cr zN8L(%DN1&Rk8GY|V;#(^;R4!@Phr4rf>jS0bcJ^LIq*N9!3x8SU(P==zHbHB*uK9d zYlh~N{gG>!CZz-g46Q|%9N?cA1iRhXjUY)8Hflqr%+N;j7`F5#*05l1?0HxdwXw04A%_Dhbc_lWDvP&vvDbq;X=dq z$C!t$`ybBRf5)T1%(7tqR;xFjEtN$46@e3j9}Ighv}c(qhMPOn1*DhJv^9Q$Q@Th(>y?p<-!sk!EUt{Xp@zU%OUT#Ww`7;0dswrSj z`XA2g|1P|R`5a&N*V9japMiVnXWn)@0-Ii}_?M&khFU7VZpc>W9j03|1Ug@h0$5J$ zSAPS&NM2X*TNip=b_8Ga8 zr~13`g;4E?y^-SVHc~aYnp;{ZZosE#Q(6kzob4oyR^y^Oa)D*tIj6BzJrnb{kc1XMqG#a}fchlQ_pJ3x7&=*JR?H;?KTg9&wTHApF>M1*&HTI- zvd-1`JeVYTf_=O=P_>7(TPLeB;8Gx+g1P_=bqxTeoq6gR#>rTtE(Mwe7V-5J-mVty zU(VnSMD?buo4t(gu&d}FqIW13_~9TZk$owY4Tbh66m-UIIe9F-^HY~cbCrdIORB>0jRLq69R}+436Xa8 zZWgSwGZq7_p=pPF7_lW;uK3p#n2nukSTrPY<2GY%S_`E; z-C25dh6XMx(zwepFoosl-eSz?^4y5C0`v+GZk>f?A;m4R=I1ls>+vZfv#YPPhEzyc zIgax5ln=T16q+UW+nlSZmCkty)inkDNqh<(wUjKCFG8rPMTzQqAjGF2{VDLd(j(5` z2lVSJQA#R4MYb7rU#WW5*mkm~^Re;8_znl8Holp}w-c6mzeo$dxY4fzpT{+C&knNw z>R3vhQjN_J;D?J?uciw^Px|jl=ToZ+Q#|llR3v+i3+r4un;mX@utI#E;8RRhPdE>? z9(dnkyNp3TNG!c0?c=yzJCFSD{X72yM8=>=R>W1Y!!PFAvpwhQ&hWF{qK>g`+*_-}wNj%h*9=Umj_<9aH z7Hq?Ad;<&q;tkl^#||BD`pRXwOUINxt9l(i1*iFDP#;C}_T6DSr-E7b`|&B{6GEM_ zVz*$tQ~%8={+BaE8id6=L#jUvsp+v1QG#wD_^2%A#?o2>`U|+s%(7g(1(Ih*?V?-O zd(C=2871F~nBg_z%k1VZF&G9vtlc2XZ*`oZ3|S}A<1Q9wE)jTH`N~xm(Kst6P!LPA zBlW4-|JdT>^kjw}M_7__-&xau z^HO#trB&;7de0nVFs>M2VC9}g*dm9NsQ)YL>Ctw)`6 zopC9!SlUIZIk!(8Nk57@^?BkFfVDKY0x{n`xIT}ST0A6s1D}Gqp=7H)b^nr5{mz7W zj1On%fa?-EhzEBy1-D+y?V8nMeT4kQwd@KwFf(*ck-?;Vfs*g zilVZ`=gsjcCdd0zE8~Uh`x#TwfppKATq_U^Xk}88l#=Ht54wk+a{}G=L7p{_%S0&@ z))m?M^%i(5YIUANKzmL`edm&@Oxn6V_!P`-H<-JagMX3V<&Vnp8I|}HZu1HTBpqF6 z5eYWY0jP=i6rOZzY<2|A8ZYB&&v3_Q7?M@TRWW0{(6JxwY2|rIelv_i{6ig)l&TQH z%DI9iXQ=D&&O7+1x;DgBl)3CzhW`?AqF#wF2URq@uV7z5XOdl>OS2^%@4aJdb7(Fr z5TwX$?7P|JITjJl=_y|FT$kH>~8v65E$!TQ|(m&+CWZznp!R(>}dD|HCQMn=_1M zX0ICD|DZMS&Wh<{eZQ-=!1+clmdBG>d(;{~ujv9@o_I{`->Z|9S&&)Yz&dl>X^UTaelNFHra2a+Z4fw}q-T&hv9)2aYJnz{U2hU-~yMcoKi!#q|)+2Gn@JXu37#Y+dz8T;|)1 zP392);pvRqLht-Hf~9wSI$N?v_@KtY-G?q3+Kw#yLFc|9I(}t*!}R)rek8oyJHXwbERU_%ZCFO>z`bX z*RR#xfe^YE{E)RzKb}2w!}sMMlRrTEwnwyG|Lpnrg}>>B?!A=1@)A%F%vWy&xjX;z zgV`&``XOm==;y=KEGJ*tJ3B#f4gCjXENCwEB0OQJo$2hc!Cj#+=XDEtr|pL{x(!3) z+8-x+0uD)-(tI?Eg%RLfTG;SPkjexjRGH?FF0cCTGKg;*((6V#7RB2|F0bk&CBKE3 z2|u0=^q*qgO5E4Ay)0CyX$Kw!B9g|kx@~^rluC*_3UU}VAi)~p2mafmF#OO|NEHq; zWbtpQH}DMfjPugeSKRE*LJSEuvvyJ|8_lGklx@>yYEDfhHzxC*83_QJ5-Lq3CT zi6Fr|P*fwJlKqp{`6t|;TL4;b7%%-?7crWE6pET)Idee;g=3y8E-g?rWadxd(m81$ zLFu(BblXE&$_gA3KkeqbgT&JC(M<^<8M86G8&uJ7mp4cRJUe3y`WjH8$tZ>U+%uqs7}`G9Sz!w4+1L@+!ng-0oIcazbFY-!eFthd z_#F4aY-HmkWG{uMkOV$*jDZ~nV;zlPk0V&SN*_=GzpstuDLhUd&|_^_{-Ht)5*gyN zv$(S&d$ufN54Z1|mVrcVK)+el2}(LOg+M1?atAGcOsZ>$e^D@}v(>r+_7&hdO12ot zt0bKX)fAi?2jUsjkDjR?Y2usC)l`zZ-Df53)GiO*<*rILe_!A^>pO)m7 z=e9bwMh7^%hXh6g1Sa9Bhqgoby&|VK7-Q-Ii;SQ_ISDq_;gV~+>B$0iRWhJ~I0v{= z6JO62A7GaFpK@)Lfqnen(<`FA{->1ENB|t zYU_r^*2FS&QWx6+iO!>`1^cYzj3K^h5T?Gv7taPX5W=_Z$>oXX5(7jwtj<62VCRKc z;XN}ct2^$_*I%4qtx1Fg#Y|-!IXzU}pHCVLT{E{t36!EkRM-De^%QI|mC*9%K$@_o zafqccZRm^JUw`{#fZ;Ph0cla_l`;oom3Cuy1-6anJ3!)xTR|GBh;l`{R$A6w7Wf<_ z7$c1@om?IJQWr6?>*8~YL1L$5tRx~TcZG4-Li=MEOXMKIKoDv+YT+93sFB)}b_+p5 z(-m368KIkyG;z6_SV=8N43+A%*XH-hC%wC z{?t{HJC?ZJc_U^LDXRw3i?-s(*~DyO1G2^+K^&YJkWz4IH?J_x8m;|1>;|U!Dx{{P z!|FSlAliG6GTi2)`OM9r#s-J&6Dgg>$(8POhh-bXApPj+pfc~>RIc2iC?blV_7-A< zGWOBUb_q?b(Q2ZZ=GiK+6ec>S%oyk9aW#jilcq8^kRap~MGrS+P*SK@m&i4OA3>tW zZ=1riJSUSX4GDZ^Fbfji@a{NYW1GgTC49A)%MZ_;*{1AQw=N@nEkh+%H12LZ5NVQaY z?0&C+%8UT-zD`KjG43L5mBdL0=5h88qna?kHSR7{f_whfFpj$Qpu&wVo-jn&0mC6A()>CCHF#hRe1_atSXG#K;gVMYuqk!fRsh*TZ*I?vdjl?UNj|R^VE4#3aD{+H=XmX>qfkJY%xff~*# zkMD>vHBQQ8)OM~SW`hJGmI$Voc#6xtooR2TL=aboCz)v3ig#pcu1s*t>t%O94brf1 zLRJ%TM$){Sa$~R=GB%lJG#6#E)%|hlMC&rVH`t6ZQI$mUL~ip|R55Ov!8zs>U2t!jXud6U4KmoYV1tl z9eGwF8%(al>HZAV#xeghrd8Z^c6BIAvJnu$dO&S>z5;r5I{&Z`*vAt`VQ2V8jFS>kB4*um#5ND!F6a%MG*aM7ujY`uC&8Y8;648zFFsI5tSRJoDyqv|fG z(Gb92NK^!lp0pLv*6uKU4Hfw81DL=?9 zyFh~HP>K8Dc|`%bssJ6Pogl-XCsyQ1bE1kaWo)W5Y|=o!g_fRlJCguH>|F5#(L_=N z@p-}`aS^R^<`$}NGW30BgFYu;Ax~xN=G@YE@#T zWN>6b5Pce9+03;1p>A^WYve~?P~+02%=5Z?Ru2a^UmojmJ_~6;H~VKUygx0vy?wKL z-_Psj8-N<`?yS@%1hniV>+biA{74=G3DKRIR|DDuE)T~ZeExWH9TOlh!Sx3&hvZ*= z_%0fjc1QU6*b=Pq^yR6g{U1MMg+2v-k9=NYB%1u9KmW|d^Z4GZzGjfvoBx_L@G#`% z3W(W*!A*Zq)J|1`<{q^gI37via&;+QFzH}#h zU~+`>B=&u%ZK+5C5SaHvrieb_=bxU3=|NiXGM(4%fvJI?UY;m&y74mO0`Pm}ie*>Q zouPuU3VU7KhpBgCAW^MLx$x1&&1vhaha*eiw4(FJMr zZvYKUQ&j;&*rY*l6$s){4O~aaMFeTi8Y6p)!g)-~_p&OGh-YJyc#cL6HZl4=CSJ>J zLE_n&k`HgFV&=7t7;JdKVTd_$+VNmw^Ur$?)88adzGxws02=5_-8Gy~h1Rd?TM_F! zJK#EUEJuHsC|GEsu3VpCch)u*BuX0(XyhKFEmXoQA^+nX7mz@+r#44<-(pt2G}~6C|-cp(R{mbPh-$H5YtLUyFO&WzvYl zGDnyN*qNhhiDl*~em;i4g?6_?#$7goNUAdi<;C3 z!ynY}?r52$c3LUgxP7caaU+Dtqb6$0gBU{sQKo7qZD%>CQK*T{eL-tHWE$Y;G-+Mk z3lfhkd(w~9FjqDhZaS4};@<}n)-{QTRcI)Pswe2|Kw!S1Fo0g)WTq`Ub~tk5HRd59 zsDb|hC&v++dtz$DPjYC^kWvb|X{Q5J4;&6pO$__>#DG2sqM;;dU2<~T0UNDZ82xv--83Ved*$QEu@7$ zXT}P8@buAcMPMnjv)&ujD7rfLsMb5s&PLyXKduhrgG5AKp0WHbqhzCePQ+Ecu11hJ z((Qr#yJisQrKhHPX~3@$$!{#?6tsjol+fcN**W`JpvK+DN}98u($Ro=<@ZMxKGqggdQn>4kidzlrY|H@V`i8AT!AA2!c{G@f?fuD+$rGwXVrlQ`6ytE|9^ zI!$o3XO3>0bUct=I*(HU@g6MlL}BgOTm*4KeeJ*{G*BaWL7jig<|=c0tt7t2$_p}P zXS>k_F(5cu9vGUP#pax!{U`{cT*OAV=u9Ss%K$=Hqg3C^FOx5xGVU&(H2iobN zM#zSK*Fve($-mfoFzzS~GD#KvoyWB}3$68?k`iDh4DF;i9?wg-$Z^BMW<1KIbFk zYl$)*vB*6!ub{PFxgsQpxd7DAPVv+4S}hpeZ2Qr){+Z3MAmM$_W-_)$Y(LCam>jlD z_5cV>pi@G7@MsIVeTNn@8$t}TYkp+oQPSM$j}RbcYih z59Xy5Wxfs|(z}H2)wBax+8c=XIwwu5^!Lm7U3#>v4-G60fu($d`%``bpSah@Cy#%8 zKWRHiPkgNnKWd%RIq2?H4(S9{XoO~8`c>hex5Jyq zA&($Et@FYjr(Z3Uq_8%0Y?`!I0EHkO@=HHaw5@~ddXoK$h`T*O;xclMXwv8I(yFK_ zKfDj828kduQVeUEbgaBziLO(C8O~@ZAs9o-P3sTK3EU;=G!0e?6Ot(g)D)YQKA4O?Bbc$m$dCRMh^0w zA;fG9NCcxTgN3np*XPa+YaZag0Ew2PxBD!1@4Lkpy}8rF9)yhM8|;G+`S*-`{89dp zS8D*I=isdwJ-Vu6YN)$NsOqfk+X9yIhXLE+Ah)oPae%egCWi&-NI#PL>a{X2yd1Tk z5mN!=UIYla7rA!wkjDutS~a;c0xad7(!9*6?+a~6V5M)d%zy|ITmuVdsX#S+hGP~e zFIuVx5-zz#rl~b=xJC`aqGabQkQt^;?gn#k>Q&nD?c=-+^^=jH2C3>cMj?=NpkF2~ z8X-1;1hIbHq-DQ)ll`WS`yx(XFi3beUMb@2!DTcrGtOIlRt0f~uk&jI*-6Jwd>ql# z+^|oB474NGrO|^YZJhgktw)x0+CdWK%*iKdvJwx80Nqd{8^b`rda&ez;PGmb%sD8t zpr^mxAL*^ff#+2^pYR58s{vV=vA~bMo~; z2~9Hqv2CqZx2@v!m3=U+v%?k2v@u{QuaEs_lQMKF3=L0u4OD_e@K1vwJzg&>g8L^2 zcg;*g>hVzbeEX;QyZ;Uvi5@<);VZ;cdo{iJl3v>TxW2FXugs?_AwJy0DWRaIbcIFG zp%4*2pS{@FbLC8$xN?5zG+ zm2Sozd$Kk^>jETKXl!6SW5?64FD<`Pj%aeT&Vm{b8=8!NaJg~fq3+ocT~ijAXo1mX z-H%4^^ho37P6fng&iXs+)%^VBpC%tp{r$aB_d~FVJIOQC|IK0iLwD`-G$gDuP5VCO z=7jFc0hf_6G&BilU@p%*%KGlV_iK;^Tt+^2A1Y$@fBE>c8FPB+$0LyDX=XdP zOZQ%mif@~K@a4@~P~(l$HT$6*@19=1@!(N`>qm$Mb@`^ni=OEZyNx$pepK@P&eNdA zikD`t|5${t%yRlX^Tfb=14!uJ&#v|k5B~CQiSBZ@w}~x4V3bAN{~g-|t|BTw@e^k| z_7Dk;ZSHBDy%{9LZ)454&a||uin5!rp}yT9p=OV1IcQWNP-j{4s%W_~V~6`pAe;9M_u2Ni}AL(fVgDP2N;o_ALe?iNV2_H3zEIPtG|(VjVI zB4u2Vm~?1~;NA2Jto3J9D{y_Fv4Cz0<&n0pT~^#cs z4TLyMTf^jnqh}2~M$ZIxrRT%KxW?thc0b4mYp={+vYKC20`Z4BTT1jpItNp*lRMpW z{p%p6b+JU7oH(wGRwh{3G?0eD2Z~f67y-wdmzYgN%ov3{NOa0cdqy(d6FOOVZ`0`@ zg){`bTW-QV8+B{J{?%7Z%zpgm2EpY|)7 zm|i3Z;jy0+pziJBQe!DM#ot;$-W*4Zsc0;6^s*~fqoy+gaqOuchzdb4gWjW}x912S zA@-NN&Q6<2Xs5Z7uWk9!qCX6*X}vJK;}B_FUtoFar2Q5@$hbx%N}9cK>h<-N<4#^Y zNW!HK`CBx{Q{q*1&n#Cl8{#F%+&ESI;Tt^qS;Er|OF1yx`>Z(7FcHmVN|&$;aYK;6 zw`SG81ZPnRy|pOajbp~3fOpa`#L96e7cy%i#Bm*i0c8N8Lt3u15R3z>PLCd6jir_J7rf;0?@s@a4${qtNTK>XG{M3xtXhtN~k7zPR zK|+4l$(5nphE43(EM*q--Uf*Ptut+;CC_z*6VuCfRN4s=7fC)}XLA^SgKcO!_$E6U zNK9cpP-l59!BE_a;FLwtAd%K{t)U`0?18)BU`uie1u|q9g}e=pDd&4G8*RJQ-f}b? z)DXxr=Qi;JXR+cbS9xBEU`L5`wd_3UuQZZhoHfSLAQPZRq(cf;tJn)nnd<(Ddz5&v z3_>b3WUhgVCvFHhR@>YH86NS47U%W%-z~e*m~Jv{Rsr$L6!?=1(1iqi%j>k%sYuNO zu#|?>c>Vg`IlRU`mhz~}kC3lEV~(QhAkmeKMmM`MJmSHqHM*YR=fWVq%(l44?i@}E z8F}W}O-!`C4qa64Ji#fYmUV&EsI{R~^syTh_>TUt#z(OSL1L+MS;EPyxV16g9UebA zBD(|0ZB^>^Mjnb^U;WMxSIQ5M$lt7jo(*oZrP&HiV8%J86fbwUj*vk}x_)rhN>blh2RC1eGm zQNe;d(?YMa7G61>C+(Wb>Z|9x2aQdP5JzkkMe^sMyIG^VLy5pb5R8Qfv0a{27VLYZ z|3?Q%MX4#|J{OXgfqp}3xuj=!A*k{CO!du%TY|0lpFfdyi`phY!iMPJ)?D5(T6H|_ zH|Y02{2H% zBmgBKA2xcuGqJ@CnX`oiufep{tI z)niG5eDZUKJPvB4zF}5<38g3Me_CiZNT939Yq^)`|Snu}vF^2Nd84iVR_irL)F7%3N}- z58%5kK~EWz?QJST_v6XNF|b1Sko90S%q6|SzTCW`fP`bq-Y(RKbfdD1BtgaAtD-vI zZlzu85EIlGciJ4$=1CQf5VY$Zb;M^`M#2uD}dRCa3pi~gcRnn%hi^PF2L;&x>o zDWo|NO9o3JP>}ds)I^lH8q(ZmGk753`MsfFYu$FqXh6D43gx;MBo>S8F3$GaJm#SM zHCkBa;s6q67oCez-F@}zo5%Q~OR&8pRlGOUd9wB^vCj3c=_Un`Mwm!GOEQam98cbA zvd|=(TnmvcitHivJ?qK>D&HkojNBseT$8V#pM$TB%c zACIw=)qjH;e>1(^&xQ{zE4WDDnKqX|EYhb7-nbrRdX{?bHO2?=gG~SpjCB;EXM?dd zDQ02Z@8<&75ml_ba;rQ8>kyh|>RGgv4HBX&q0du#RRJpNjyD$OYDipac~j$l{BQ2K zook6lAF9V8&x@!^s2Et8gGX1OU-QrF8URYc7@aP^lVrkH4(^u>5wam^Q|K4VLD0Q> zd>8)xB)4a9-i8&ejPQNyds&)|EelUxo{Rk2Tf})UQ zhXT1BzmIONmO@5_t2j%2-i=eSA)PYkmUH%?Z>B@4Co(D)G!Gynp?C_!BkCCF@jT?C z+4ZE2@S5JvnFedIVZI(|SQ=$W4?bzf^EZP`?4ncs?h;vv_;Fn#`?BJI8q_GI^crXU z0D+pU#ox@_|8-jNzWPk{2zql1nOt1Lx;+$_*KDvb+s8Q$UuGbObgT_dI z+fn^0W(FWIPe;DVtovmCG|Lp0Hi~&aR+07dwC?8oKX>Sq9}fY)N5&4Wo->55iavy{ zir(|}K|V-)vo`B}_mv%KSp`vXotfW2ygzRItI>zAvfASK(GPbVXxj#Ae7Ry&_{Gru z-Le_inOXRzQIOb?^_TzWpM$1nuG{Kls9Q?S>H5YV(I z(Y-t5zjePTAOYC-wR3ge>vVt3e*Y@L^`}UPiy6QC@rH+{jYa2XE`CVm#q0sAv2(WE zU)P^+GX4Cs^M|Zj@RcCP-Lwfh``>4tKJB?v@(*O^K19Atmv*_~r;qBHy6^m$49!e@rvE3ews6IRJqvm5=h4bq#Vo7VVb zpvR-g$%PBuV7o`L$l}@@extUb)`meP|h%jSj(%F~#Bb>4%JjpggN_P8Hp_lVBpwtqC6Vr~(Kb zqR}{!OEBPvfx*RKXz@%2(Njv4NQlsfqxqIh_aJ*pAcLF}fq@&$Mbr!t)&pIj3~2)d zk`H=vk3N^^fuP1ZkYM21%rKF&h_#&NF_Nk%`58c92-XGGKIqU;kX_;g-KzkHW1wC$ zhfB!xU_fRVy`$&)k^PjbH4XgrLR%Zq|HI@cuA#NlXQSt=K<*zsILO_@#-@-i@bG0$ zvDG$U715s=b~2rLp{NWVxQvDy=MlIfPq9sT0&9v|wG<>g+I`L_Gurxw%suwD5yw>k zfe9pZx`m=G42Of|=im_X%?e7O__%l^-aXqKd<{q~V;_^^Opz!iB?W~94=hju8toz1 zV2KP`o^d9`f+TjD5^;$gPN^P#(VL>N;FpSFSfeNYxC%U_fHWdn+-#{wa@v~XEbGIV z>VpAOjB_x7aGgjX;fu5s~jPCiE?NJO|MWPw|S^_&Jyq77O(MRP*01536q0zUNV5u7VJ~Gu5vRlu; zM@lfz>epA~R^&peD4xsJ<`x#n));CfxI{t|Py}X`V3iv^5AVjKyNtEFY+~$ni!M0V!sfsciHZsfY$h?|vJ2L3( zVk)xLxd;wpY680lRUmna8AH#hio_uY6W*GG_mGp*LGcKb<4qZ2qL_<`1_%s7Fv3R< z#*wMOCG_MFmzdnJA6Zj0wcJh*zW^XGlqO29OEy{!bRDuD=mnt-!Gt)6tSK0ztiiaB z0>4Mttb-}oK5>hIhbm9j6WIX}7WXXD z*Fa)B79Tq6@j-LTJy%CM$hcqOrms8vJ8CoclJ zTYxJSz1+dVp?W|mm;wscG`becz>u8&?-RcMzqgHke8?(Q^c4+4#fyoad{;mcVLC*Q zOAj_UR7TK^4UV%RHiaU9YoveD%j~*SqI34#T+o?EJbojD++#gq@0EqM;)rhXk0Tnrm(Qb58u_k?7u3U^h%et^?4Sj`8CTa@m`4elpuw#t8HD*QblL(>`h z^U{vTk;fHy2bk?ewm}dy zQ&w8goUPPEGQmQIC_gA;IBs)2^*!yLR}}653F4A~mT;vY-O+H9EA7@*$jvs?L~QD2 z4pDpZg(c3I1;(Jpki9&(DBXlY=y5cR5ujZ>VCiNf{@C<>Q!}oen@lpS2l?a%vyDu0 zjSclrx19E$hzn=|HKe)eEtToN1$^UC(;wrWat0(=3k^*xTPDsK=2CC64mvLZ2pw`P zK7PM3Pc05B=(Wj*RFsk9Fo{7J_-H1ZwOxr)|ZU=y|&??uV0^kRY=$0)|gHQ?mspv|_XMK%!K0`z)?@PNwlDivze3J|rgDC!6ZD zJLA;VZru{etb8yF)F_Cl^_s62CHlA zc1B4PwQozE6)WKbXsaP()onrynnFXpVBOQhfrRqV(RhuwU@ubWND`sefGh_rMZhMu zdQWiop^G1UUBUw(&onnMXJM3yf1UfHx%$A+MAFhoT`c>4Ykg5-W^CwUOwS< zEPA9QFKHcD;_%(nIW?DaD`$KXH&xKTDEEej!--hqQZvguT@5 z;Pz|%m7VI>!RK(NBSE6``doBdJsV*ZWioVhlIsf+_8B>gXb9p!K!`ol4HXb$J3Ge~ zwG$c7Y!2>@5-!EA1~q7Fsh!)|1ruu~mQF;54MLt+y8Jw)q34HIpH(>z+GOH4poYU5 z;%-$jtK_vT*_-c%j=TTw2!#nhh57^t;>Ez3*-8`;i%-jKHaX*HP*77X-C*t91n~+& zj;(I&Dy7sImL<0(bIl=RzJgV1RCgdHpr$gp*UiC<1ylp6a1>5Rmm!1EQzq-g2SXvY z7`nKcYeYbfD>dO6Jf18O)Cgm9rc66@Q;7F_4=p(UQQi=6y=`)?53{;005Zx&y|{I5^U=yB&WfZn&v;=Fvp~V*lg|R_tHHG^+)yKtvgb!C`9EUh6nXKY?~=bBYYubsAihfjeTncL9-589c@qXUN+ zT--B|Krmzv|6=E%IbW%sLShia#8F>OYcu1I-1Ho2ldbbh7zQ;ykd*HE?7YGRr_O3= zC~PY*$3FgWV@YP?Da)=1hG`)JXrOZ^x&Fosq5G7i)0cYN9RLun=s9JgWbT~%b^^A$ zwaY4yFvNYN6by{|jiyFE-l-bT1c|0gq*aQRJ%;p8vm*96Ng<>D0G-KC<4*Fc8j7~l zd)CeeHJFPiyH8oi6118ZIH?E10|_);@rt#zgNKl|RUW*G&j1N;p6!0snoEWWFE1Ke zhT7c%3E!m(_3!Sdu69wwECgjhP4`^7 zJNX;1rUv?j0i&@-hE;7B_g7_xLVDz`J1b7oP9}r}6h^1C2SLvNMZ$jEcRShnTH!YR zoIaf90mPzHTdUAe?%p;8*-xc<$eqD@@Wia+y_SetFX!0qYMMnpNC>SYTAv$Jh9L3yyij|x#Bi(rY$id$41k2!yOrMBt0PkP{*#l=UR49TL5(t*Q8?Avnj|We?KbVz%G&cAgpbLNCau%$|>6IU6 zri)hoy2Eqt9$%NGuK)t``}t3_`F|UH2tf}kb~6I5BXUCWbLytaQzvv&50`ye3c1%; zI-}_o-MahlQQ$+z);FNW&}lcLKmBaaAFJCuZ`;f!NS4b*)9qPRH*$t{T%NhDYkTev zYJ6Nmn39S^2JbKRe`Wk&as(u7ecumpy-)i-7~<+a*iM2L4yH*|qL}JtXWcqG(t%+8 zK?%%%JZV1d#VS6d1%*cc0gt&U)DN4kV^; zXP~pYI?l>{)R5o1A3_M~W_Pdd3C>@W`FgLO7aiFJYUs}WH1KNI$32mUvW)P$(IpV# zQ_#b~?{|NVJhbuEWH}_W8`J3fHp>OUEgDkAiA10P)wg>Kc^5j_iEca1^X=LK666fT zglwX28r5=2^PQ_9mP_pw*}qp74fXr@8pql`1vSv0)n?aTk@U;P&^@iWP5_}pu0|cf zRuleFTUb!f0hf_nQhB`qD1bQXOh7OV%oHg{SUwusq$NXXVodtyLhIMh#> z%4Z<{Xc)1IYYZ8ukpiSDKocNfXe81DxnH=G;o4E>IQ4-;B*6x+12JwT9+)3rN|(0@6h{7 zySEL^b4C5{0ERotUIP+@9u8}_&kCuS+ZXek@)2VAPBiZk zMa5?aDN^PXoGUq%0BXE3jXl#=TXoQ?M6D!9s#*X7bMacg0zLc^9Yyt>AijnMTk`>3 zI)1~1)q?Kc*Z>M3^uLPe<@U;N&y&iG7GZC@07W2_tJ@WO0~UBz=iK(PpBn%%1S8^Y z_SSbdw(@>7lyq7oKpq!rn#ZC$O?V(wBA>i!HiQ^pdoCz{+f3ZJZ5L`*Nc0ul#0 zc1F06N~60SlnF!9wUBl$e~G^vd)F>ClJgL^x zn9bQS(FiuS1HtIAJS$WHfatfkcvT0|e$FQ@rQkH)1|UJ{xHXz8xaG7tR#CWY*4P+G z7#n7^ln{7Tn=3!QIOO*exElmA*rW(QsJ_3KH60PAl7@Z+G|-iVA1A}@c={>5qo!T! z(*XdXs1s~QO#O=tn;6&1C66KT#bw^B`)Ih2Y|m?%#MV<*CZL9K=`C%`kn^0O$4-4q z^>dm)qBrz$oqmazu(V@>+O2f{5hUgweJj~^@EV`4PnzDOL}jH06vC22FgFl2&Ski=I2LiNV!wZA z{OOPmouYO1z@460M=Bo=Y|-;C0Thsk@o^s48(%mWG%=}u{u0uPIhS55Q`~dsOzmE@ za30=E25LBZ?snmi^XQSZr0Xm1U5;F#O8LOp+8S6roCO? z8rYd`9SLO~7w06j7e-P=C#4QnU@7ACrd-K{FTRjulH#bjuK|gw-NbXaGOJ2rjS@HQr2yvz^T)u$1o&ec6S{2XMDuyGxej z9rgtYt!RWcw zau2lQF$CiMU&#UP02AR-u0qCiMM=*9)9_zIrr45l!F@Yg04J;N0C}>b1;>z1_<=n`nm3Nx=pihwwEuY zmQw)$F&47D(~0v|bxN$=IHvqmkQnI9h%!3*sN1=^dCca#5Yp0*G;3u)7JesCrS&P3 zkDEirw`yE1?VlKR!aC~yS>Z0pkjUZvc{zomAbua3ODUTW!1j?rbHwcp51glm8duefTch2w4z_A&cmqeZZ@4je^{ryP z!k#clKj+6RNLVU7oUwFaPyMafVm+`PMH{7p7GaHVH$|}3Fmi1lNUS)?it{GY#R!6N zLNIhlpB@x0vnn7No4xf8)832df%KIhOn)g{8PDb9RNa`{S8!DVmQv7E67k!reF59| zHb@plmqdU>yTz*1O;I*E4pAz1W2gHKATfHfq_5&{wx+P4*S%7zhFCyWxRYYkEy@i< z2SMhvjtFX8W>n2~Ssk73{O8yqT}eEokBZLx{9yQY@byovD=*(TG6?Y{cYHjvVYT+j zbV!TW%#QeQNGkfSUkWW&WH~SWX8rs3x8ss$z-?Xm8?H>t> zH&_qd%IKc2gh<*Q-H6M~f!UC!9`pIh0bZk-j(EzAsnr=NK#k~|Q`^2bQjB-EB`p4` zF!%=~%yrMZXFjCr9z6VfWbv1<&mi%+;q&LOa@Bx+$m03Ggw25AF3jmy)&CrPnziEN zA=HNl1#l}5n#9F!J3`_Wq@Cm3*$EP@D_{1Fy(SqKF8^e@vWyFvm>6|gK9e-i5x48h z-Gjumb4Nf8FW(33Z??`fmQv@h-1fsFh>3kWgv-9%?OWG$IqQ!-!P}-ljgN=kHPz`( zztX+6)Ma*VdkYZgIs}{#n-Pn8*WwRpz-5H4`D)tppXi|3zbh*swu|)Ng%&DwqnN1N z-6&!KYD^dy$MVqquLV3SPh#;zDL`QI7YPCyXZ!dP&j?4Mv1`|Z zEC)4+95-Vx^>6ti54!c_n}v9gcw&mny`#y|HdA}EQ1vq*x zBc1{YlX~U%`q8~x*Rrrqo(Q!NATZ77F4{hZ9yU4ZtNh&b-vIzA5jrOJT{}&^HqN-h z_$3YUF&&y+X``>(bYe|lE8-82xeHJJK=jWjP8xM2`>;DlGI8h=Ok5ai@kx!~8H{y~hCE1{5q(el>R0#_wcp3dn9z_ zKUj^9YZHRVV?*!!Yxc~oeloWeB)FG$=hM7xoOf@TTTwzOa{~!Nb&DcAsc2u6PbZ^> zJ_6~ULM^WbwDGi!Q2#fWt<%7PK+y&u;kJUAYtTJRTpk@^SmUmY=uP9 z0P%<`-H2{PC)t~Xj3T0QJ}eP4@YI^(#m-GNrC`v8OQ~9-z}?U7FZP_Y z1^`5}N>Ga3y+ms>>F(%l!0Z7DZ)^2LSfA2Gg`NgRH?@R3u(^@xWWRFSXqWOLKw*qXjAE3u;Xe z&@;oJdsyq?Ld|g}8oe%(gBDFW8Wn{>-= zg9BuI9Hwo+?f7l4*5p{mjYP@&fTVvfT31Y4QiFk{ToW@e*x%*w{{m>hEiMZkGnpoaj@?lV;S73M2Zd1N8 z`v+#ew+MllqXCwTwphwYh@zNK*G~>E)Kt z7Z~Bg%Y5DtL1J9lzJ$hGbuH5HaoGlS8N{AA$jW#}lyYmL5lmIKNDK~c2#cC6u9V!e z_S?%lOHMVp4VJPur~ll0gMu4$cQ<3n!DL8BOG{eY5wJY<8;7#-5TSZ97}U6WbW`vf zlkxot{HZtWlD{DVy(}zmcd?fy!Ho1edf1oY3u-XX13&#tolxr<(O6Mdgn~qVZV=DT zrdXI`%(=CxrygP!SN}MA-*}NrvfNVgEyc?p{PK})v-VV6cjVNF-#T*7Hmrh-p)oxd zIIgsN6-VQWwHm@`6F<@3oI{c;8XCo_z>nr1`dK zt#B>_oa9rY;g=~leLxLs-+SI|(bLk98)eeioP7|}CiIzgAEmt@lhC`}Sy?Qb05s4e z@pikK9O2wpK=#AxL%x=bVL~5SdcWtE>2c@dzD+TJ0&*&$%A#k)-L#qH7s#gMM}tIA zdy<97IILnc>|MZu#-c?afn4_7Khn#NwJ=KarlpvGu>*{u>2@vKD943{V5!--6QD#k zdNhnR72RZj$_dz-2RXnS@#0VHh}}Rc7#kB*a!LyzVGuJ_#1ijLn{<`bqL*f84T;rR zCx}xWkD1`D9VkL2`n_QRki8fszLOadZ4Cg(uWDU(M#5UwoXB_y#N4d zMzg)FFY9g(iQET1^Z8yN;h8j3kf!_F$LdtROIl7&K1d8U4IS7qWxC=;)5{&7d8OZj z#Qe{fL%aq?=D(b|`T6V-T@grFeZ_zOm(C_@CgAtaZAWZZ0t6-#jW@-QY|E^BXZ{4Z zitJIMo4drIn@hja-7bCi6q5MAHtX`$BHbU#tdkpb-?T>#fExE31NCxQhHILGeF%h_AQl-d==+a6ci=o)h{!8ZTe^oUibv3)fp+&ET!sBGz>ywSVG(M^{-FW&<-tg={>ts}M#4~E*j zzVvH~=-h5S#!)rH=iowVuZgkT9ssC*snab`La7y%Zyr;ZncLodevx;wE; zme8U;Smqyyg?TahE{G>?6!o^Hc1nA60Sj2ldP=o1Df(Lr(H6YcKv)48u?ljio1?uG z6rz%lxa3MgAgEy&)rv1%MJGa<$sNB!@9&xC9igC~j-g_VOE*jY*HVr3u2 zm-jJAnN$wGdc@@Q$-)@FZf9E&5f>-51EVY$J@sG=j)&mTTzkC&99V`4uEpEMlUa?P z!NrvWU$x3(jn`fw2*-#n?_ou!x28TXR{8qRHR^eZG)T1Q>KEdv~P|k9{&n z+vYj)g^`tv+R`jeN@7WFRL6J|JPedZEMtl*`iEoLMQ?WD@11H*yNV!T0ID95OCepe zMZ;nd-2%w=?NIc_muB+{gMSzOP-Z0RDt0Lg7g{fj9%!x3IB~eu2zSxBt~u5HEbbvp zVFXu>@7qN%0>llTKK`{^x8NGTrba_CGs3X|K;r27)8QaE9y}|S=s3WMu%?8xLEXr} zrLM^AYGX(3!^fTXmHTc#8PH_Er}=x)*F-Z^YI~cpC9WlF1!ZCC_vaXC4$-NvEmzaM zRhSq^b?tg%0|9_~5Kiq$s>_Y4$f~m?YOxB9>GkoVQQhQgaox{uM&^tJ>MP0=p8UP! zbLsY(x|2paF}oA@h^Wh@x4SH>zqedQ)Pku1DIK1fs;_vZ!id|bZanuiP5)GryUu)N z+f-Y{lkU(VI2uco(6#z6_g}Ep+Lr5(D)Dt7x*h|#7ALLpr8VHS z(M0%VGr=yGs7~fSe2^CJa$ZD~a1Ze0}CVN3rQ;-3h>7Phrg=`{)c+A5n3d1RB(50;2tv_Kf}59Gv@VUOYGN6ae6?dCNjh8(Z{MI4a6E|;0Gx&i=L*~WgF&$$lX()N z#6XhTNj7+<$Z41RVd3X-8;BBxZ!k(C$o`fbh3=u9t=0%f#26J`^rAL7&1v5i@jmw> zIiU>fo#l9f^&aocnryZnhan_EV%ie`V8wj1vDSUkQ78x?O6Z!Za}O4_+1WfT_3*HD zGd4^v`II!|5B$*DD{2+LUALB4Mm%p)6W@hzWvR<)YiN(`2@>$cO>~ZQ{UT?T%RSLT z;v4_~PhNE?$YJx9BkT9*FE9Hip#<Y8BthSmI@FO9S)JS1FSYymH2 z2^Ea;oGXkpXz0l+XC!YjdWTXyo-X-rw-Jf8wuLx7X#3d(Z=MW^d>Y+MG}OOmg)@^D zjYn@-%zI1J8A+4~^J&W{DAaY+Xt5iLZE-k-17<=wY!A|7MOaE4Gqd*S(N{2W_4%nGTyH79||A?~t}CjATHhkcT!` zyRJo6tZk0iqi}U5mf`X{Ei@&ulake0!;7mbCcYAkPML_t8vzEtU`C>L8F4-1t#MJk z36yAAp<^ZQdbkl%?+a$byYfr*v{zc*`}tSJ93$~(#iV=2s;PSG{Bp(efCI*k_Aly6 z?CBZF&#Q|Y)(;$PKS`(xR$I$rJmgoWs^|a{7+DH}!`sDTflvh4 z|E%ij3;)_N*9#tRKbL>|0a0RLeDQ@HXHQSP>RqV)o8jRVqJ+U?b>8_aU%rSuP`l&Y zvFBw(iH#mkJNhpF@y+c0H_yKm&Ns5Pss5d5rt7zl{v^D9D<^sd43Nnm6y5pqPEx~f zLGNEIvqk|EC=8gROu5AR2Lh`?2TMC8J|sa@)Qb`}<2OQR3vQ|Ge)pvRAj% z@GNnBxrUg=fj8dGig@wXFZquRu^&DoU-ToEL3>g9V(Pb-|9H>;#lV4CQAV2l-rR=E z(kDrR7t5<@1Q}zy2NmIRS|wx6)ps#C+>N_nBQ<&Vy%F zi`=S+5?geC9#KsVhkMO7<91#I2@L;JJMGUujU;avNzYIxLI-ar<%+tZiRmBEx(8Wg zwJhAEAeV@It*yL?Do8R$N4V4_+P7U~tXpDnjxgn?9t7@OjlF&%l~4d!LyMIAGE==% z-Gb>H=};I^VnC94K%LaCOtQ6@E36f>2oeTxOOZIm-^4B;%Lora|9C*NTsSDGkjF$U zS4fTYYTvhN~T@}N|uG^`ng|v|paY7kz zd;*D{0&l#H{hlT=lCQL!Tw*`h+P&V6Gc4QBt=>#10epX;J~ia@Tx(gyxA03=4n|_1 zs&;b$`y{T1TiNqelyoDp%QW?d`(=piY>U~G>6KEV7JqG6kxNmg>wa|rjnRFmktm_8 zS>oRmUG~~$adtRa+H;#Afu-(q52ok!_*F4gkfbF(huf>@497il_(!TP9x-Brb97kg znecp3^;?!Mm1|125=sEczOy_l6UR8bn4Ea_z?o2@#5Wi9k9V7~^7FoIUwvR@kDefb z`AaBzj82NIqr;Tn*f&Y~0fp0&nOw<+=YoFbI~kdNT9^C9PwdSbib{1(Iec=#HG&eb zEW?vMU|;3Sepr2j;uT2@ZQ$w}#*gg;I7?-#86pd zVY8OE+0#C+A@FNtl1(UW6N#Jlr~T6B9Dd7eg`k^w}eOSNvyyf}K8)Nbc2qLR73 z^8y-s_}P?P&uo^kl1!8+nwOslL&$mlBk?hsJ?`6x5|0!-$CUaEw;&Po@}?hRiMypS zQZ!Ykk^!^y3KdCa)Q4jdUcMmot>B!68}_(}Q;14>-8tKj?{vPv3F5hw{6dZ+N*tIv z)NppMI(V$>cx~1<+KogBw@80J74|?gnxG0ekcg=x?3^O&e9bPq_2kX&ztQgsiDjtW zr9W7CBxZ#y7s>~O5yTl0*yHc?Y1zF#^GWfQvOqwLS>eXYaoM+W2{krkg#}Rq!&aYX z>FGd|_iUCsJ7_zI5**$Xx!u-Lncy$qhnFWy2ol)$mQ=Mu4{&%um`LaXz~KP>xA*K= z%?)0Z;of}&JP7mJ_%dL*b5n+wRrFf+79)9(Hu?O@J)*n(vrAfc3y;1|j6Xnrz-)%k z)+HS^{MtA`=_UG30FqRWm;{%x7?2jDg(!%2G<9++s>Q|RhWPA-<&7gvM2W#;ZwTWY z2h&Amv4YZ$fnNv`SlN1kxfd<7MHK>YBVjYfAt@PJJ+8tBZm}5tuM!FXew~izGLjp% zmItia{7Zi0$3%&+>k(ng55B?wS^o1a*YF6UGXPoFq@!@xREIAIe*G18K|&eudNW($ z;eG5DyxUF6nQ!E+EvfanSClD=@hJGr+M&6>f=~nyZE?tGd9;@4b;p-CTzP<~1ophM z(Xm4UCTZU~BD~8}d+F9L{P9&sg{FJ2w3jI1HqT$*b$W$%aOflbZIRZ92@~SI{kPw8 zav8{3xzV%Ljp$DdpynG_u1{BzrjhS?mFV8#E$Hv~HmAKM{QS*_+`aD+Z8+Qe?Bkn9 zx7NH*Ybv{U+1OG%cW=af-W#fyXVmHYzi4~$f=~ul_U!nTHVb&Lknjk40J~4&tDe+) zmfU)=!_7zLS7F+0`r*y_yTy- zJYG(C2Kr%|*};LwnWocC_|u4luYD2UGnr~%qpHuFZ!IH8VDLP;IVL*X7o0e3Y(^sK zs&!_KBuNgy{S-;0BtiiOFc>Yg3tk~`)8NFc1(cV=Q#}sURD3xIrkpdjs4uLJURi0r zg&gb`;Z7CQ8yN~0ql#uz0^pZpFo|P5!2lRY$?9=6d$Lt#ZFxGzcMeg4PY-rb%PMua z8gHz@aAGTfNlL4-N=0(6OQ!>S;74>BFs=k7dM%aCbZ5GGIvHy!rb3J}58@{aPN{k# z4;lHyg#k1v%DrVmPY2f+KEX-@Xp}Y6dA!?r)fB(Rh>`Fcu=0ac67f}lRDVrJ zeXSCNfDn2o2N3gl3^E2qG?tU1Rtby{NiB&W0rQf66dpR8LdsdLCYIq|Q4tqavy@)iLWLiLFmk8NbZfWZ0!P_L z!4AbSMyBl)YLRf562?|tq=c3BoS_qRU;~HnBL&WoR)9StT}5~fTmXn8MVhPGst{R) zjAEoMD2f6tshuHSC6BGvS2Gho5y3`7KT?EmAUdgd(uUa7gYS;`QQt#P8rFbSxEH_7M;Wk431 zU!5arv4Q=F80W&9baI6pQaIDvnpid1xKvdxNl8~F4hdO~OhVb9Gow}_@gUa=zk|^q z5D?v)0q~zvN-bslSW1<@k#z~#`8kvJoM4fL*)vBYs7NNLfFBPZZ}g~5^9SM;%N0Zg zFw!8&FvkUyuT{Db4wrz(GH09d!%1#pnV(2zc)MhfWn?T-9IK@s z`M!0EfpSv(urG0%Fo2UejoYY;npKLbRLfD~Ol|;abgo)dJRn-%!}e38608KWnv$y* z)AVt89@xc(U7a9d0OFxcL8;n}ys7jI$l?vkn zP*dRdUy>HW_fQD`@E_lWF#x*}L+hI2hJWAHMI2TJ;JYMSYI#blx9OMe_X;Ff2Ef_U zh}Y(&_|Qh&COq{0XNeM}*(}x9HCH@50l3KNBa4X=-P!b6HC>NSOc!7V%OXmIj!DQq z-CJw*@B+QQ^je~!AP_(u_TCe2J|k{{9vUP4Rx)kse;5H(61C8xO7#idPW4b#F1IU@ z$gp70N);dly^h=OS97iy$?H04>3O3CTc-TEBe|*3Da6nMO!;{|6>xyepSPvoo}thX z%)nqJ0|6z-=aG?6_=-=fhyF?%)V*8}C29z00H3t8Yp$62oKTcbd0aB~%1E4t+B*zQ z3al#b_BFA&VX9z;74Klc)*{9&Fg9Ww0<(xU!)!z095Zs%hZjC4#BtCz|8ErgqSuN zKz<}Wg2d9xr>I`US=Ru+$hR72=?kWa!v+J^MBhnDH&}G2!1R9vI}IS@^do_6{vT6> zMDM>UXiKZmclq8yxL{pMzN)k442g*$F)<`2hQ!2>m>3chLtBCO*T&XPA;i6QA+Fk)EFDY}0zSi6JpDBqoN$#E_U65)(sWVn|F3 z$^SlvWO^5>*}qd(CLczvI2-=9AsKMx^g|zG4-LQ{{P}d-pHHXdW-HSy>2z%R9WyZ& z0Biu1@zW0sY{0hx_J4|}{#DpyG3n1I(|=2~8&{DifDEW+ETFXDunY!+l4NE^nl))b z$EL+Bl>agdbXa{`^nWu<@|R(*N+yKT|I!C-nl9+SsY;&sFUWuM_+JIy`FBxF8Ehm9 zY$VE`b-MYV59qMou;O^44Tv!O`B3?%8InImrcHpYbbS`{&#;CAdvt`XZ~Mx8Gj@Hg84>@slkRoKsqymwJZY|GVou` z`mg%@PdZ?8V6#<1Tt?!{<#HgzQFQ>BhQz1j(Qz3A{!{@CG7w;NA#j&XE0Y&My{JF~ zX!esZ1BJpCSu)enmx7AJQ~*F5Wxx^{0jT~GfZP-quwIW^v;mYieq_7FyiMEW!?Py; z)%_9P69&L46|0=pUqea+I161}Gq=!kw6R;3j9UuOI}k(6YnFuC2Lm%4fWRtrb(M{) zC}oz7T1ARGhOEv2N-w!F6;<6bdI%{OT^UxD&h)t*QagzX!SaG#0FF1NtI*%B0kFI3 zsEHVIcQAk{e+S$$52x4wRKpAaV~V=MZPDfB1FzDAVYH%D5qIbR&wKq(qul_=$-+|; z9S$mVMVb+YtGgLzCT~+Ce|WNY2__5XYj|>WO+xljvL8z&r*rd2s3_>a9BM$Q728fM zjSQu>HzNa8R29{4Vkb9W8YcsJeB_a60D7G2QJ~~kQ`jA)$m;9?z#Y=a!3+(vl%^w% zAOm3yDKcPBqor%~cw#976=(qMq2gXUdrfK@J0l3aMGc@LmsUVlMovAYsAteB8s~C~ zgZi{iAQi|^ZN!2@08YwKr4MH`0`zz8itB+!0V*=m0pC2apa5ANut=b7w=ab*4Y^_f zkR+wxEaJe2Nx=qbLIcA+IOw3!Y?P$meC zA7v$-#1{bI2+SzHs5n3gKJM?6K!M#XK(8agkO@^G$rUG2{gfhx3;_O2{3(4?z<#Gn z`a+U@1gbIvs8O^P*5Z0!5gv>V^3J6c54Y-`N-xb1uN9!;z(}i{qMM4LG}ZLsU}H6M zlR(!HyxlH~t*&XLbA6HfvjOZ*JMIPqKIQ@kR2wmX6#xr==_(bnLjY?^#O)j{C$MCQ zAGk9qA_G+y@RY8CJtMqikfWjkK+~fF4S?=ax>S*U%2By+i4!smgqA3Q`S?IUu3tcN zKv%F3RUbyxLT8EV1$dLCG90~20>HB4jW`r>RrF4G+>70Tsu1u>lB@&VTqJ!VbV1K) zM+Gua0yXhh)KJ=TpgLYjGBQv}xy}~?ItIfQ+u^t3p$-B>tqSY(+P|Mw6-Zt`X*l&vo2(9 z&_=r5!81}Eu;goKPLrdYk!e9C{s8v6V|VrqpD;3_+`reA{$U(_%Q7ARz3_R zeKOASApf8xg094B~z#Jb*nL85)VUEA+Tak2R8B8XhBU?v@-Zk8w;;D3mL>MXx zsGu(g0FVrbNs4WJ;KXARinmW}9;V3N7?_r%m1nhF&I8SoT9At8&iyC6|% zF9GHhEFT%9@*zo8fE<^w2YL8mc);KR81@G8NnQ$$^*Gxz?`a)!9@kc zMAQI$6We?O=M6VCchp%~&A{(jQIK;WOl;>k(rhQLQ;Fg4nG9JPB?CRMtg>P$qxM7v z9+9zE9f)n5L0zoTmle#-G{v3GA>v4LrZ{qDRe3uR^{rr|^UG3JUp=5ou{^Cr?=^5( zQ)IyaPiI|3)dUtv(wMEEk{fce&ry}BPBK&=_KEnN0_B-_PmN?Va|R7z0HV3IppyF* zPL4v32Z4*^M;B#pVVEd%p=I6n;%HPWK_zpb@@{Udw`1@Wo-1851CF?PGF8D*b#riZ z<{vUSkRGG397|T`@wy&|p=Y$M2Ws`_sI7VYItn8rJiiCEeg;ta_IYMxUflRb26D0o zC#EWUKR1&Z)lfc0 z#+9!BlfcF4tL%HvAXAkfUevzs8ZT9GaAif6N+LOqtd9lE=}%xrfC>P>OrDWoThuUb zmbxY*!3KGv2UD7DnW~0)EcMT=wtNTWDpZY_ilny(W*gLrGoTG&YPtDUft$~9=_ygse8MI%0;GO0SMya zcD9N869XLt_gYK-+S!DXNe|HzYV!{CiTr51J_a9sMZy3CJkRKFc9n2?ioMYn*Ps`p zx01D_jF_||IpXIo$U!FH4&Oa%nLA#$o~2(LcSeI8U>Lw~T*@k8l`L)b!u7~+0V72M z5=E7`rCgNkD#&|+{Msdrb@H$%vc)?w<;lU{)gTi|29W+w4A-}d1~z;|RiUbbEE1l2 z-CuCRyk|m<3IcC&HGSniTMOE5)GO@1A8bbjVpb<8ELtigH_bZrjF}k8uiZ|wjvKWN zI*O_bXm4FiFLY6!(R|N7b4m0*@-%|=}ijONb zN0vCetNAKdu-kJtGM!)my6cJ2Kzsab8>*3zSqXHD{XD|XYobv42tAGM!G zxQ2L+RqaG45SPRS*JQv~-QyW4b(W!?kMjF{feuV{>eOKApY~uy9!qnZKHYA<`;ytqlXSXa#pV- z0Uv<_m+71foKQ7Fr%s{xC#upYiHYx`f$W#(9Ah?|N7!?Crc4~qH@_jqjm*qaxgxhAJ0sRN;Mg?M-FpbCga3kFex+U=Vl`U@O z%`T|h{d<6=7*!W2&b!@ubzAF>Q*K|4{{DOE>!?6%huC6tNqVtr2KycW-n>y!LC4{nH;diV=9&%d>}#CK9B$?S$mVtjk>42D z5F54O1=%J5V&MO#AWw~;{#v4g*L zK?9S;EaJAlTT_i(!3|kM6HI|%q-ifZo87d(2pQ;K9>%^G!fjh(VO{99#DRti#JZAn zDh9w9seBJo>M;8F27n|BW}0zyYMWuo$^PU_RE^-IoN+o_b(fXH+~xRTryM=zF7y0H zNmgLZMChP=K(xXQ`6Xg7^>7S2sG8ocgz;eHhiocb=W4X~%UcxMve%*gfWHkguuYUv z*O%RZRgHVip&q?>7a17fvZ}k>wnR6$s9hBTS1?e47{03d>s(+?62*{^({YfsAhzxA z*$%-QYJ~f6E;9sG8yM|pa#qb2F}j8Fe&HCa2^DAn-Qsro)7b0n=r4i8)XXt2Pf1{3 zOC1u_iFK&Dz{6q2==y5ykgVg(A{JRNf($$@)@*k^XC|C%&6~5KeGM|#X8@<;wzwBX z#y{GMK6#NMMI@=dwf1R9b{JzM0GXr!VNE>I!^)MflHy|Dpn zqxR}S8OM)%HWnFpuY8GO3*%JnP_CTb9b}F?0Y z(M_e9vfUnp{3b9!a;R_cTyY?%U0EK~9fYb3ScW(IRI2waaOQ8bS=rKi92pqC+ri(7 zu6}ME+};&GkA@s?89*a$w+x=9Af+MeN~09?;McwlRSXC#tp;k)7gBSx8a$tF@`#S1 z{m5SO9v8WrfuEyVd$u0QZkUh*Dp8S>eYZ{Tg!Te&UlHsnp%-H<{on8bUQR_Dpdf?1sJk} zz*LU#fT#-~9Ts#;x{!C=f?H~l`#Z}lNR@&;fIhm)8`)4YZADvv_w_`^WxTvKv~&i8 z0lSD_(gO<-`o!lgJC?Y|@nA)tB0n`IsS-W%{MtIe&RKUN*x#%yBQb8#yU21Lm@vh{`8uSez`eB;2yJyzt>zKz*-iWZ2A!}qxK2~Q7BVhul z=+Sr2V52Y~hgz;pD|B@}_$sop68zDMid@bbp9Rh~ZT*L|$iTWKii*GMJ0?>r^TPS6 zZsc^s05ttL%NNcj=I+SK%#{Ti?H@ZU9x^`}X>5o`4pl)Ns7@$~++*ib?e|XPNg;CR zhz*{0hEWG8QG`xh0lbb*m(_p2yflSb-m!8X`W6k}4vNNQy?=X5j%TSCdowzDPS&yq zAC+fQGJ)AHzCChtLbpkQwM!OwS%y|5XN)2P)teP$kG zqsST;hlsyfYIv4&&*R?G^H<(S-(~jr_2Xa`GO-4V)VmnZet#?dK~z`#r@w|GuX}*T zQ&*W!u>pqn4?>oxcMBh3iH-s&M z>^mdCtC@=4F$>1{nPv8kz7@*owhY}ltEnTx97fMb!ls&9dIxcoBF0M@L)cfe3B~GLU|EjcuD?pyaeT z?V5c?JhDau7>k9+`6wff%8(jlZGaT2pTi2NWe+Att+3UikD+or^Q2;e?(3wYmVc|+ zTZpW2H*LaA(R?eRBlXcOYV{%H{({v25(|^~OV?64=v%4*Nagn^ZjCOPgLj+`3w)J{ zY$tVDzPc!S8GDRQf0Jvu9evNmI#yCgWyTtZ5alKm}G6Wtk zWn8M-ZP8B;+{@|Zl%eN%!8-%nk9YIy@bNM6=GbWTR1~*qKW@j)d^6R(LOzq%AS!OH zsew*SNZPz*pjeICC}2=9a42!ukvaso=@uRfKu^`U_6;A-Dya*Oq05TZ1I_5Md++9$ zz=nC2S=OmOwpvTqS*WHOz}K6OQfQ4QQ>W1H^?@5ggf*YU29NFY$ZH7`*&+{juyF7_ zEW6ov&FLQ;wO{8_PokSyk}&>LPf@5kk)E;GT8WB-yc#_GNXph}NUIb>?da*rJiXJ- zrn7lnNhjo2y*Q$LRE5AS^-NYm%b-%2wI#1`ZoxPz5Q|nptWHe_B)S%P`h!crRO%E(Dnb>POzr!Ak@@s{Ka2RTTl6jR8+qs^bqV$>IT=4(36sB=e>QGu9D z0L(LO8104q) zyFInH3O@H)kYZLOMdx)GeE?4_jRhEq+YyPZjx+#fxoJ;q{PdHWq)^|&SY%*Wp|arc z=B%Z0VXh$~M=BCffmlc!drY`7Sr8_aCmx@{{sS7#7WPqL4GZ7QP@u=34{=&x!1tCf zEYpQu2gg%qFi*JgqI2!nvfuh4PU7ZhkE{_JS5tKG+*`UzgI+s$2@5}BUOQ#dE{VBp zp&*-u+MFP$DLLNJuXA&RncL?*w~CROD=>7VGtH^Njp1@C{IF;@vl3M!M)s_>ag_iw znh&F3WJYWA^*|jr!gS=XBL|<2K(8W?$Ij}s8Fd$ByE<0Z1h}AD3bw?o{B|^YLHl6A z_t647xgHe=?;)8B1mXapMF1)U`1`nr%`U7-Jr!C)745bE3K?kQZCmJSe`FbDq?#&J zRv@oyVC-S`c-8oJk$fL;j`fkdhTA* zbD(hXq9v}BvCl#SW~+LTHMUmt4kyR-eL^XtV6%>{Kn_O?;Kmww1D08no*%QYz!JSl z1yc)UhnPCa5tjWP+Ll!0-41~LzGz$Mmc~5W6D|)kPw3D!{=lv)3609XtUs~HF+*Qf zhT1l85Byar?j+;{TP2~tLN}?NGR#+J{t{5~+`W_Y392^mZTVO{ixYtV!Qcgn%FZGu zkl5y0O`BH>yi*KMRUzAni2=!86G&;@BaAIw$Uu*lr4P?}m9MGvD_bw+)#5kEXm^QZ;_u zR*V8j1^&o5c*E;+b>6>Nc~lfI#0)sV6$iUToZHD{v=T2;U<;NR+ z?03+I?rhE8m1BY*wk&3gnPMg%M0#p*RiP})Ry!}aEPP~8Z?b;_F%;`b~ z_S7u>tnA(^#n=11o!u|EBd-8})z9{JH+Xq!-FThW&--S}ku`SK{dFBfiQuvLnpfR? zR3J7Q0L&fW4cZ~72$1-#mBH$P$4{NxuiU!-YXW)%B0T2$$B7$5W%tj2wG8`?6TeG4v-b5TKcI&L$E+Vbb^Ge}{+DmxY>XO- zM~~&Fp6)29ifq;{-NyUHcH;#Ra&?CUCH~p9M;u`qv`{D z@*@@vjn~W1`?^}xumX_dV{r0p=;z$0ehJm_w{CCd+)hH)*kvDg)=7cWJ71@a;XlhC zq5=)z;K~A4ud1T!^Hg7S+H}(_b#+G0t2XR`(a4Z6+7PNb(7V*UJkza7=<6_b`E{x* z`fl~|uw{?@t-M>E#YuH_?jrQ0e=@(_OilTmljd8I(e`%_8nVV~Nqb5>d0gJL z4M%7dgM8#D23|W$icbY3dWGOJLso=L*Mhj)-wBJZHIOB0S9{MA_DN(*TZ&RR+MHRI zM|bOkvSOa12Q!pt{!Vg(sAh?uc0n@V8#(_l0NnrQ;V7M=VXu=K+04Nt!AN76XgPaG z50_dVAvY*kF*|H2<)UDuHSEYFJYkWBtkH_+!@fZdaCI17%kE-@>_r9&$6NRKEMI*1 zPS3ebH2?Oss6fmmeAdySQ|8GqPsZ|8smQp>N_b8T}S4gT_b&gJakld)UuQ8i-lo@f&0 zww^Y9I0Igmfy_C8wbqHb)g8aEvQ@CJb#1L`MSYK8CC`1T&41nz($7_&G$NV@*z5C= zfl)o5d=(m$|3&kW@DS> z$iRn(D#o(X3rf;#3YD*tJki7Afy$N4Z~J2kzH6;tSF+$l7pg|guQcp+vv)SxL?3CL zUIj5Kk zp0wYEtnr#Co#orSc|qFLn%IY9N3xND#cp;-7_BR$e7J!S-kpaW`T-d9XQY-y+g9SW zOvNW-p2!-VTgsc1XI{JN7slOT=JG!Jq}u+TU3j5pvLf9!h8DGc7dmNe;m(}UihS4) zFDnj2*anDEO*Md_)f3g6c5{8pQ<53FPo1*wiSuYoJ|3*}tjdhUb*TElYMMhr*&c0b zXi;bidE^K5rm14wVqiQ`tZj$%6Xg7FU)c+>>3kKZDOg%58cCSUU5gY6x=9% zD<+52^7oABhg9Ky3GzgRwaG6ssy>~x53N6@F7iX);0k~amr*e&Z zlOuLm-N7FX&K32HhoaMcXC{({Hh8A3&<&M&(tBNNku^Ga^z}53rJu}-VOIa#@`(Ty z2)B<$ANid2GSETDts*N?VbE)^Xqr)JXa!wUORMNViwujIreQa$|H?@K+a zhLK-C_NJ{r9v$zMp9QbWBjM=IU*ZE=V9U^ZYTF_f2DG;!S8<5LuU&p*-gqth$iXnp zln*k{zhLN4_4?+xO(WZ~0*zPF zoriSiQBB3}dE?D~1YCMpd0wy)?4wu*q=9?VP;q8>0hE}($5SpULgm_ zZ`Rqp-uuJ`}hP@N>iU9 z{xCA|$Dh(`9ajh16i@9f+HvCodg}h%Kd5%`{36<8*4EJXE=9>uHNt^Qrag)=d+?gU z9~A>$T$$>7V0J_DV5w`xuHo4Skbw&fl4r{=xgTF}dGO`!RY|*%fw%J8FVNmo_DSx2 z@%X{75m%6b&n|uT#^tVR~U+-F;jtso%Xp@rG z^r>O@gH!Kv>pjtL`JA7A$8Y!j(B+zp`!0su-_R%S$x|-{dnVl9e&YFu=)ic?II^j| zL8I0?o?rgrH~L^eUI6+{HSkErG8n9Fq4&<)b=vnAWPNXt3zB25Hgi@^-@3Q`Loa0D zE_kBQTb?gCBtKkHG8I&qH4r^SoAC8vJ?Qi;Z6kPJRisb zSx!yQX8f6gdE#ep@UgNsTx?+sh~p z2eQU(1H>Q@hya7q?9Y5t zi>$G^ZcMQqAIfEgaqVs}Gmjwy!|5AjP$?$^>VTIqbk%82yWvnBs9cd#;dt7`dI%Fyuz|Tag;Rjvdm)-nG z?X=~E$Qr}mSt;anc9hL~v%=qQoftj(7M^ak3jE3YmyqD5jQDEXi^v*96Nk#gxpq+( z2c(NE7rUTuteq#cSls*uhpB?sKKfBo&?#k^2!8ySA}e<+Ri8PunA47IYQk^5(r-uJ z2`qBdF6qU$Au^lrt3i4&yOkBVh=}A?2%^;1E8fA z1{TH9cY5#XLDqJ%BE!F(-Ya!eu63z9eocZ5oZ^pB#=CBfY>nri%G9~d(OJqUkT}(M$}n_O;m77{gy9{-rJ;#gyDVcl$fhQI&(Mqp z`Ho~9R-B28el&x{7S1X5HHXgi-4JkmGI zGcV!eil3ibCm~ZOAl&}UPW`UZE8fy0PR9iDeq=i(T@O=l1lq)A&HGB|In{%{l?*?# z%EsI0C@qEj)xkCFzh6Sthz*>rZ7DNLJPr?WljqG~yA(VblrJbboV=P6B&n!LMdvVi z84uYxU0sUgj+5M>&bBvDEd}n&nKv!U_ga>`L82Z|i(f?rVs)OM`nkz9g8(lDU=At_ z^Z@wr(1Wxi6AVWfqx7P0Tivy49@B~&F0|X*s2O;Dd z(HF}P)FfB?S|s+|8WVh5$K!<~YqTowed}ONMCuQrF;nH2r2(iw19%dc!*=$}%VB5G z+DWJ|z}JLkCeWHXc!BJlf?5|JWZ)+!mTgvgR5~=+xa{PX)FLMt;HomKJM+=;-JG>F z-DS;KG_uB{d1>~`k65ql=oO9k4x(R*Y5<&)*>gep9ZJy98|W>wR4(a`naGGqs^yjE zIQyY5drq?4gE)=n*@e4k4>LWx;tspY(6?ocxyP*4tXTC8`@Co%ExHpuHr1_|t-8(m$V@oL zVWZuFqAv9MHO0Fx<%GA$LeOXJ2+uG&C-zZy`D=bfR)IOcqbdVMVdYG@Kfa6FzQTz+ zuo#`nSa5w|OLjs~0K+?Tv%laYC8|cO{ZMaft#cEj`6RBDp`XJCB%XA7g$&=~8oE1H z+Yy1P5VQ*yerd@nCaE|;ZO!o~k5EF%4(uy{*gw?@~ zfs7Dz!p#5@kJH1pnGFbehpRmz&|kkwxSHM1ROgksMOWn0Mj~PE!Sh+LgwfnImkt?4$`+ zdZABEZlVKuYv-8rrh*nFxM{}Gn^dXULTPl-o%?X-n)b$g@|(y_N^#p|m)gb(T~L>r z;AbgA&PfeG!eqb7(#sO}Wp?c?N8WP;j<~T8KXs-%2I#K%-1~@w?%JjnKKVRg$u~R9 z9Gx}4C>(YoSJC?@#bJ=UD!}KwgZt(L8|1dZ(z-WQngwWDH1LC}w#W%7CWE{Gju zYsz+7U%b)Qw`~7Q^nQ9w^4@m&mEPi)R`V|u?XE?RgfRMlx%ku!IS$4k8H~x-KKOOf z{I6#J^qv8^g5=-#uY>aNN5In$w|tm^49u2ZTNgPfzhN+&f9JaR5&B};efc)eCC5(P zo4=Y-yrW@5EwaX9M)B6#f@^P#<|pZTYab$W17NZ${^ph9w|=iHoxW~$aw)1t3|_Zt zft?<$yNbSS)w;ua&dWPr9eQ^2Har-9_ia>Np!Q|_%a`X4ebI9}Zn^eo3i5i_^jFA^ zCe@UFu*0Gx{bk`+TV#!MO5T{f{loGr=RR1IW_3Mm2{O>4Z{+5&*p8R?&V?VToh-eA z3^Y5n|FQ7dR`|X=)2X0ip_h@wD1Fp{t+gH%t@AdaA_P@Wl@5ar+^roj? z`_Y-?;-)(Wb4rHc;|GSHX6%e3?jXsryQl~-2#;tlygU8p^eOF)e;@-- zZ-ED{+1=rs?r?bQ`dAP$Q1I0e&D+O<+>Q%j}04p7D!nY#yB*n)!tV=gIayv$vtYJmyKv3L z$Y#QCS;75`1vLfq9^~N!=Fpo-(KcRGtcE(&A6|tV`(khpGVVZyJ3dlS4FpQOE2;qJ z>&{G3N<(tU$UHTcxWy5#Y=XQa4!6@FtAhtRRi(ky!QFteK;olE&grnJp;vvy_JVS5 zUbz`_CLRsL0p7w=D?{l+$ioqYx2$O6?^namphtL%dn}O`i!cFQSPv|byD?C~`^Ex< zl4vT4s*yRkA}=l(fGh=WA4YC>ybEs?`g_vkRpC`7iwlt5Cng7$xC}#ffIt?QID7yw z@+AV1Kr|0nqFRV)wg7-h07Y1j3IURKNq}d-h!Ci$MQloGH7XDzUmlP&%4MqpJkf8i zF@QK1(ms+bMP4CZJ*~TD|m_IM5K}LmJs}JL!rQrbRdu8a9lL5?8MIEMdy0b%3RRLXl9yN(Q zN{!pY#fo%s$i58&|8GRCgvj0t$ViSfNk(J61{XTgguY(Lm1a_VlFi5re!Yf%F=sTt z9~mg8=)(Q!9G?-01sXZ>_yZ~+D5CZxsg;x@^%n9Bj%fS~vzhb%vG?XtO#bNj*gE8Uy!UzT_gU-kTWkBrZ+-vS>khV_{obF?er2D%KYKWP zNAmQ0t@tRktIQsJLe>?=rrZD9GUO*3AfFE+!WgmyfD>}!PgsjjRU=%86;R4D);Zw< z+HzO}fFVo^p%b6di$|I{73SP-Xkpk?ZhK$bK6}ruTd6(4T=-82tk&n^0zIcnFH^R9 zH}>swfwhPktm>gSVtkf>Hvxdd_a~k$?;eYc-QV(&rG}S2cqjtaAYgm!(DF~P865&EBqAh=OMo3v7@7LbU%{`~Qt(F$-RpQ+ zBUowPZnO0jSbKoyBdIaPw)~faa3isBX zvTd>^$zJ7~qGmt~eFD-N4d#>r%I1t%-ER2R6b!g9Y#Gl|kJj18;M@7uadDBmC~~s3 za!qaIXsaID&5@q2)%%L>u4e9cYuKEkYJnEARQ>VZn}c>0e04z)V7Uf88;g}J7(2n- zkQ%!aP<2l+s-$#)X!&7QPBlw1z)GB33hijS1`DS3w{j-qIyALeyr+2ayCii}qP8;I zh;SEvG~))eMMYp~b6lv^US1`sl|}fDzzVSo#71`(z{^^`NQK`Zuu&13zG$Imz--EL z-!-%b_^R#V%ah+PKb#R{2>N_BZ73bqO;C|3dv74twy<@MimEv+%Q#bh}=33EtJ?QpK;qGC_TlD7QTKo?FU#PR_c=r zDD)!YN*|ZxSomMj&d*HMY?s&v{r6M1`{ck+3b5%-bbht`-o(4!m*O26t6?1l-0&8h z8GFuf(PvILBU;@EEmUL={*ay&PsvG%E1FDN2jAcr{Q)%#P(0iQx;YGJbM&NNYFXz7 zzdyBd?wAnIho2bp9dfX4tu^`FIG4V&a@l5hi`Cs@dA{9YqkS89hc54mfDWWE!%N|o zeh+%Z`8@IIM8(rIsl37j-~}+|B<`k*dy1n)XEPfYCDXoV%nJ@ESkTyNIy%P9;+*$fB+TQwOmIv@=m%?&nBw8J1TbO)`bCGHxdW>Ltl2K& z(?ZoVXT`T?r40$-rz&f5GICza@Qq5#YWTUREDk<+i)Q&Z&o1(;d8NXKF)vPFfOQqy zJt9xtS*kuFYZ3uW3{M6Cz)Wx`t;?qDm1!N~0qD6l5T-4-(oJvkuTf+@qt24SpV{Sp zJRvaZ^_flP!qKxYrDzVpmJt+qT`g5r(~kyw#h=Mlxtd^wn1L8sN{AB%B>aJ(0Qjxz z{OCo2!8(g}Z`>OjWBuuau=aph#JuQ}mR~D;PiIqP+n~oZU=DlVlA#J!cfv}sOV!%g zL|BWMB>1i7s=MsXk#mfIa;yYaNBsI0EXYe7kEgaxGMD@2LklMq@^@S}v}+h?>G(j1 zPcO7kQ16JHstiu+jxMsgs+Ykp{PPYSa`4S(D8b8gdQ;wLG_=JSzyh?A5hF2yrNrbo z{N@I{cb7QzqO3|=bB^)(_my$b7TtU0S9VtSJb&iPs;FIFv*9aFu)N_}tvICLCoD+X zIvOp7wm21<8xx~W?eUR*f2vAH0kA@1F>fKxG1A5vJZ~{;G6hx#L`Q3|FtIG2DN2y_ z-`uZ)7Mh99a8T=eW;Rz}xUx8W7+QF1wfO5>32q1Pc?)ha$Cq7%7S8iA#t`RkRXH#R z0MxKPXklxX@9vOrj&MhQhgr+7ut5tKn6m2Gg~RIZ4tcM&I%X}sEkT&d1L#?>W^u;|`p%d6y0q>0InB3y}Rj?u;evxYKD-0|PuocSs zumI>71%$h;S>aynSMxD(gJ6X3NAR`gxt>|xS9%RqYmV7R4~;FdLc5w(IhS3v$h5#M zzrMYRSQmm8vekBCt2RcT&C1Ybs{H4}3w2trT5)xv82_d>px{<6w9uAz<5jlG{y``$ zNSY_DcZU}K-SZa>9&kuC&wI9}Yl|;@OuRK{QmF4Q3`o83iEl0ZDmxKf5EGMNms^Z~ z6jMK#xCGkMQqMJBqvHzgydt+~Wug#ziWqb)jqq7#+MMNGQfTc~4#5jwsXcGzhckj> za4f{9*usQ$75kPr!kkHTrrt;X_+#oVSQ&8s^MP~ovk$)OiGJ&O?{8;8$C^&(o#Z>= zd*1$M?VXS6Ge+Q-uI@bO|C{sI&1K7){{C0;&!;`0Jr(+1_SiFP(lhxA!ZuioSl452(#>~o8G$Rjv3mUevzr_5&-r27tOtL@J$?Xd z40MLxQFp$+ZC3sDhjVVe^VVi)VdInZMb0yKh~uRO><4B-3%ia#KGae%XKFl@vD72? z_l?j(&+N}T%^{-Rb9KkE6T3tAZD^=|gfJ5w9y{7`ow%eeC#n?MP zY@39(_qY1To*xX=#s56^kAHf%?SUUFto_-#-w~rn< zm;K-zIQ?=){R7wJx@1_3*n_d1$#q-5hhJb1)TZdA?w4u0pf_roRG z+txoCJ$?PJC)YB;kJ+z3VEuc??SS)f^6&8$*x~`=Qt_p$1>?>=(kb4KZ4&6_0^C&X zAM$_sH&tCmaPlXr%kcaAYu-J)>7K@!erIyeHfQto-(g+Fa*3u%fJ@3cBEE;!fS2c1 zW~3}{sr&M`oNv{0zx)ka_#`=T%F`Y~^iSX3iDS^h=%BE9Lj%P9PwQEVP3%ukKns0) z4<1tm9pQO1swZ2;x~FI^s82#6w(0&2)3TG9(DtO)q>V1}HjycA>XqDn|69;PPy2gK z8#)_fmF1?|!-bv`(85#Kx$TF>1^xZP*f^hnz9Lv579b^-<^iP$FY)D$z^cGSIdifm zV*8?ivyr^qQ;IQYVVQb&rb6zh>d6gMEE|fifEMyHN1DrYl>uYsFYab+=E9Gj28z2I zVzLWX^NYI&Tlr(Huoj84z%MWZiX_Sm=KR}{-PkDA1pl*643e-D}3wDD|oAYFRt*_udWFLJop)Kz}hICX(#qWgKjH(A{D-l zyD!q6uqJ%Ua@*_|RZ;WIY-l*L?E+m&%)}eQP|cdus=aDxVbV+MW*ukrS@iu$v9UE8 zF{}_9N&r;muOobbaX2U8hruBU-R+7j)ttz|Hq}+bYCfzz(A^nuXb-i_+@O^ZM^w## zU-|CJQMpaFR`5sDR+NsUSfJ+zKu5hLd;vSRsn|StU+6IhnkgnMHW8PqQGBIpVnP}V zhAyI5`+7cn%v{Sio7ZPkEyPFOtc|vxYuUusd~r_xCw#RTlvL^gW&W_8xDsmhNoafFZ;lT8ZID&{Iw!$1 z^L8q9?*>e1Y1x#WCub{Haf(c|PWa;*Pi17Jy9}xrYZyV|F@@I*XjfOY*l$WU%3Ke) z&cJKGiGgo5cz{X;Ul}#D0;Z9sV9~9 zJRCo7IRd>H1-h*9%>}6^S9Qvno!aCsS7Uj z4}?q;J4FE1RClPxrp@r#(fVxvh ztb<*as@j!<9nix1{DZrWX%@@-@nZq;vyEnGVZkQu=r?Q5iqj4b-eByo?0^=sYBr`E zKD1|fnVX}vF-r?ySGf&!7jDT8<~8Eg{oJHW&^5;if`hy}R>|u4$uDm_e<%am)3u-^ zLg&$Cxx8J|!Y}t5f);L}bFw;DSO+44V^%Q?C*a$vP*v6Sg`eZ!aR2zWqkxm4gSHr( zdyVleBb7A~F7XVp@7@Y6JQ{bi$ST?i=yoq-meB$Y6#yZH-ZHs_R;cy-#n1333);S!VLP4&o!hd0eF^8K&zRQTC2)`;9kd_U9Ge#RC!87#dE zYZ0sedACTC5FsR1>19)_5?CD=CGL(9AFtk8RkcQT_>Gdcp@ptN6}{apHSCXEN=4fb z#VvvsE|JX1+}#;!DR!G@ z9sD?B#|&mmh4%msu5P^K?}t%#7-EFOvJSc6S-9# zY0IF6BaCY^3y2MC@Av0f?n_s3p@m78%?8EpWqrKa5_ z48F_X8=1UtMnTG1y5Zn2l7XajSaTpHx+SJ&iAmR{mW=A-R>4;`N3Va!?lf=iR77_) z{^LD(SAz!B`)1l3)rVGEZ|6GuW&e52ECUAERe-5RBdq$w0e0L zZ&Y-{Pum^Pgxf~C3VdR{JG3iq1j4@;CAN!eYP`52Rj6f$ri|DY2>EFe#$Gv}yWHp1 zL%Y-3GObUu>xqT|pr$EBfR@@MXk5|_YY`|mh=UiZjboCuGkCSC6n+=Vi|j&12F^)z zqdgxW3e~~KwHq(&on8=v7i~x{`is2|K5?;VI7CK6u!(w?55wIXcIP@t<5J~}@mKtyg|e0ej^ums(UTtB%FW^v@Pl_& zyLgg4rQ+305gR6$0DdOr$zdJ3+;BH4;~alt`vK^U2%ucjI4?yrsvbNgT9$calRI=7 zIbt*ZUgi=;TE#$Io#_qer5+&ET0I5lydCoX3%ND%v#Vh(V#WRQxZkTS&BTSOcH-j& zSREklH*Yb$DUBIlgeT?U_d}tDaqs%E1AE$w*w3(@qtx7jZ#Zmz>&< zixm!SajT^C#lb}Ps!PQedexoskD-OW@>98Q(P&wx^h9x&8H}((%#aEw(xvpzmj3SZ z;_uO4!s>u(Mp@_#)m!JUzxU9&lzzAcTKMcG>qpzVz8il%q_gbre`I|JEp*ns{n?h+ zP6vmCbzH7)-3T85IH$_~_V^p8<7ekT{h$9SED+k_ooj7xKO8&od+esiCfnSn`Fe~( ztY{^N^pr1cdBq>T+gKjuKI5;h$?~a|zukLOt~&tjsQ&iU6~ntnO2-Rd@V@rqXKz9a z7yQH8epaB8Y`Pl#!q~!kFKD5s?aw_f%bs_Z>$~s$bb4tBw6JNQqwk~7etG%#;#r%% zpZoAStPnd-TvQfMtc6mns~WvOg_VKFf0ix3pT71TZ&SsK%U^ecfB7#gI+6OEGyj70 zyBD1!^BfPMEe@n|eht38vh!Ss^R2+|9>ce&sWX2GZe!lQKl#VvmGa(gG-!)?FH;MC z4juUW@`o?zvM={+f)*|fX&<4 zF;|X#{ip1nV(VpSFImMuY})pn`o(Qyq4jFTwtqqkLqGd6%=xCy*;%%fXlNc!LJQyi z?B?a`e}C)#)^8tAUVhjMzj5M+o@=kwB-fvQoPX`>ys64Wf_IX*b12_gDI%ksNjbb1mk*Mmt*fKD1DpF`B29@NH`{@HGJp zBXkLgqlw-Rw&lm_LZ{YxF15nXqKqDCOntxMo#gJ!)rrrDe}-R^$gP{}$>=RDRW&Oc zc-oQO&_(Pudmk9w?w0!x56{}1NROwmnD4*7HfOa&Jz97oxPK73g>r%;Bd_9aL0Q^^ z%cWXRXh&OeY7bd;zsR*6{r5f3is5&8boVsOrZ1%mzin-e>4@1H3vE$5Y6|#qlNNehc7Rth{ zE&8i|K^iajz3p1)pt?KAO)o4U<)cf!?ZY&W$%v+S7C8~?(P&2Bb+nXno z#8bp@fj&0m58v2)-Vrd;p4(YrwcP(kB4X@?E}w@cc=HdVt<{#EE?pJHe@i`xqYeGE-Q8dmFTnKG=Efh*Uq6|9o8d=V`uautMya&WgZpP5XqN*xOC9vtV_g zglK9wDn~^3*Or?#nS(jd!j=7C^z=g3EWg02FYP^!TxenS)ZoSB;^+D~-IJ&0&nt_D z7VdGYy!xSs(e{p;Zk}771pcLJr_Z}blVRyl?UM46{^!LXNowF5|JCAwtTm~T+C>E`a@6z# z&{J9^k&XNb!2Iy9V+%N3b%qWC~V-$#*+ zYc%i!cd@zuW(`jfI~L~_??$^Ogtq8*D7N8|+p3tX3~QS^O%(?#bb>=EH*k;nQG0I- ze0P?>%D}?9F;THwuskqm25YogLlw{(>mSzoCX{!h^xGc#5e(5u?ShGcECLfZ@9RW0FBw%l`{ z=WgnmXLGD!!0)-+nVGOC>_*}&eQWN4s{JJz=ra1&;zr^dIgDj?1yuM|VsmF($-stz zaF2O8h2o)f_;tdl6IGqI0&UY+eaV1r{s^?AfE#j=d)9N!fygpNvHHCt8*B*y?^p5g zRB~eY3Z10#P51C`VTHsQ>D~OANS9Yl;wv^I;W%}6ewn_1O`tIt>rQ&XA;fLC$ zp;Ws~R zc+YK2R9||z>ench%f~DUw8hfuJYKbpu80WERl43Vty4 zjaPYt=>Gbg_KDPaQM*Q=dp8icVIYkd?3(Dg zhc?0ronUOaoI+P_aPz%U4j*YanpC2B30j*WQ80UXcLsE21797Wi*xhl<$mTK_ndz6 zDb7;cEfuxSuRd7DF5;eDnC?r1Eg;Yys$~c#7n)*D$V(iAWf6vcq5O0cnDU5m;x`-1eZH@q&;b5?#(D8h{ z9KN4XSQmS=c+BfhJF1=8a^ZFO+Sc4x5Zg3Bxn0}D+m+Yz9J60>Jhu*7xOoY_B3SX0_KS_O zh{dhzpM@5tugO_?w&a@x#tC^4AZGkvg~Sd7Ow1tWGm2TqYX#;tusWb&@D57TcL-{7 z$8xp7fy<$VxLaml9*@pT+8NM4bf2CCE%YD4iEZmI%hkignQwPF&~1hj9M5Upr^A$e zVnZVaKXSk9r5RLKdN*d+VP#RJyES=5a!=HEI2nGueb(bYoHHI=A0>`OSn}t7{THyVV$Zy*1~bYZ-1!4~ z(G>h#5o`;Y_1D(m9mNLO(WUS!$~}^n#VZHS$<796dE3@6F~d3ume>C_r`3OQrMZyT zHa0nW1zNbx@ma=>ko(W;vO9Ygy*~~=VOL+gh5P!>%@wwap1+UF9^ZquxcK1<1J0Ru zLawVGU7i}a3mtl6o9lattyut1zNvzD^FgTd3zaj^>n-P2#nR^N2heUhRr~+=<&}3b z7hey_-ewMQLJQvvCPrdZW2i8^WN%~d)^hz@C_(c!D7KJS)E+Z3f3D_cUghgE9S!jFEnk1NdsX#V?fI72@h06lF?7K01m1O@`q1@?{I6F34Svuy z*PqpQFmiPLq#~I+@e(5j_Ll(fm!}KgGk>FR;AM@zULFEJE7*QMaA9qFM#8+e_0>zf z5B9)X#PE(E_vkpP=b8_HOr!9hVs4i*Ka$u}4WdAm2X20gS_Eqme0Mw%KQ*kGPu0As zFQf&)zZge26Jgwzk8jv_GeSBi{ddAz#6-*Gf&&T1>!LlacKBAGC>+oMR!LTTb7H*@ z*8#m%2Bfdphlg{A1-)l)?G;zuhp#up{^EsFI3DIt~ zC8fE=@bCU?isP6(SP|XhjU^F;-LGkwIurn{zB%rN3yK8#=!? zXUa6L(84YcPe~4}pB^dZS z+^Di=pe>rx@sZihb>(iJtgaUEF*j)8*;i^tUUmO8XRJ*;>3Pt!7Fy`P$d=W|Z#9Wlqo*0p`PRth*#se=(kPJ~Y4qEfmGiV%zTDjdU%y zpQp#mE<+28wa+A9b*pc)1q@exOe=%00LL%+0i0;b^G9iY-xF6*KwD&AbJgoJGw*%w z$hW9{UWKnYrl2qMo7%5_Z@;m@FG=NYg|;Xf+`H_4#ohGOU!P%|R#m~zEx2-vHgsi) zFotQ)9b*3r^jsaV7X|UMiLd>EgzpEKci{uE)*g(VFvAknTduGibhM>Gm(lOEzCR#7 zd}A`>?y<6>8U?HnlOG%iR#Bq`?9H!K;l!j5tdO|SbC#Q96i|YhqMago5cF&vNcM^u zin27kJ=AqT_kR5e_yY=dFDv$QoMz0AY>1TeGV{;Fx{8HKIVlVM8)g#yF>!JXbPR zMJ$P(UTY-wt;v*tDu#a-cSkV3D3?U=i{=I|t88Pz_Z#V@xr?q9R*Fiw-Pc(kb8$Ingn_PzZaT}&ux;kMkV&Z&Nv2wtFhg%h~4N(E#_1gh) z;WBX*s;{=XFm-k&{A+0O5vmz68kgixE&eaBIeiY+Q&97{&oc46G3AB;R%=weq7+&f zc$!6Y7!-jF2=K^u<|Sw$wnkarr)AttY+*MK9;$~Ai=zW)(3|so-G9+~%ZDRP8=x%? zFMn2ZLS0_6%NEV%<;B4Nj3py$=WQ&HJjd$}=#l{{tU)KJk@oRx`$WN$e+!*o4l4u0 z8Fkx}{4TU6%By5@ZwYkx4&-&q@^e>?t;Okv~SfdhWH^5pGc`F)tm~ zRcwh^Wx4AzQbSblA|w4Ev@VahEZq`EVbn(MV3ZZX%D_k5nD}8q28|QV8?e+2SU6i-iz=4Nl+q!Jx>%^zj zpTRG=Y!3Y6@v+5sp1b^ZpL5%ixz}OKh}{7*FeLz&-yeWq#<)}*JR-O=c}4nQ>Tf+$ z>9=8xfjRej=6q@`-r`=IrN3Ubza3hbJfO0+4xN@3zJK(!J;Jg_&_d_4zb0M&zF#8I&+Bl7P{rTpoUYo;g3%`d~I&j^5VxntsxT|(vB_bg?4po#j!`u z(+NHG7d~?Sb@AR3XkpLW1AlZ}fAQgGk1lVEzqj;rSRvN-;I!M~D|X^kF%7H+7-xL) z`m0|VR$VT9C^c6;j)xX*6Xs=oR;v1Lvch?^Z0V8x&_ZX`XM0}QX7Y9Zd3x!WtDN_s zg?`+~mRM=oHs^^u&Z~bsh8AMUm$&_6=C+o;2c4T=5yMAp#KpV4L>IU?Kr|F;Sq$&y z>afzjIy13q`Q*c72mA(!9qOQCPd-Z~ls=yvsDnTM;UtBLA4(K8MYJRa{+1zw4lOXg4&WS{ z-LFhYoFxofIAVFlt4LOARRt9?$5vPj$DoDE%v4qBYC-o2Nk(c;w>Nx$ZBzyEM7W;# zrlBVYgitbIEn>ugFot;`p1wL$$+}3Zgw=t;c!o;zadgWse-<-xniTLMK3fSWNdU~} z1la8=IY9^Vs4ZXzet<^5GDqDZ{7{~1)gLEhc38^OExQ*$3(XS$XEx7F zHVTG~40ov?boWARq)jsXn=!nn>>bK-DU!u}#quRJ(c33X~0LrzM23fn^PZ+CV(vo3?Siwo! z*)*$gRA=$)G&13v3F6>_4a|TyYgTDXSA=mXC9noTWGt(MUsCF}Ats_&mBL#HEi{LE z9{iO(rd!FbXWXr;DuWebuF=G0R1~JlH-%9px&YlQVSpM-6S?rIJW0fHiVW5qm=p!5 ze0x|8xmY_*O%?NDg-*cL%wbthFPl6CU^T?ldm61rTUMm>11TnswiZ^13CsbvtAq22 zZVZ!!L8}Zr8`0*{y29Da%SmkbA06+FB<3mXCPj#g*j2CWf;9+QzcMy(Jc`11nThTJ zQ^2<@_-J+wF~dpWvaAP)#Y1R=Ri2^>{EaxGdKT;p7^6TB$1ztLh6fM^Wo5HM;9nzR zBE5q6?{-5VKSRUOA0GNUNmK;TN>5)l?aNS~xqh zEFeG#5+NRn8ouq4oEjyyi8X34&F%7+k*IPTAL=!nz3p5T-YLF3%2NO3+c0~M*Q{v zP(H;+qlBk^GlK`JOA;}7FZ;IQCtZK^Ke~h&?NHl?qhY-S5>=Sb45OcDe?T2A!c`A% z(GKV)UteO;9MB|qU$zR`Vj95gm+K^@o=OTM7L)FR6=J%8?M#~E@ROCZxx`8etPX5s z5R;$+!cV0zYP*-`JXj%?tMsm>D=Ou7A&qFIpko8#2b8X$NlcMiejTnk2Wt-CIY&e; zy)`>ycBcAn$-D*KpJ77U$K@^iSvCW}#X?wfL_pEb2OuGV{-t9)oDM&E^L^W1jM3>6 zzQa{6W!{Pzf;RY7;+k8y72r4@e)LXsvr39}r%J;COBsuAx*K7w0d8OqciBT(Z@T&U zM=N|ULvPB)>deI-JW?%xlzz_+AD9y~sjf{}L{ygsVBYXc<#so(blbcqUTOw?_W$V( zTRhDF-SQ6}Z4e&#Z6JIK{#_s@L!P*)dF6#z>2X+FfXba8q+6Vp{1W4w^yr7)@JlrF zK3{Y+g#Ou;{>8tp-S+nYPgslCv+t+>U<5Qw39A5v z&@1$v_6b-aw!wK^WK0Duu5u!0c`8>PxRvF@{zUc>q|8 z#CuMJW4aXLiW#EUQ*vN+K%wogieXxfR%vDg1MG#Lq2-PN?f_?i643IazedJ{9&>;I zJD&SwTIgfS{Fv(10DguqN0ZB=ouHkFU^Ho7VN~&<%Lss(xFwv!~`JD)Y221lkMQlESF&DqJ?#@u?J#=LLAN= z@G%Hrh1h6^`ZO^yWcim#`1x6k5vL#y4zN=)`4mjXgnpBV9or?k0>BXuUiz;Z)28lhXMi9XR4kI6zN^rdwY!QhgM>0l}*18V1 zd2PijU{%CA0;pgaX?98yO&RS?gYL7PV6>NKZ@+Lw1hJFPXmaa$WC2OG;QtL4SL+(0qZ6~(td)6R|Vk0rl-)bHsTzt%6{Z` zTLH@suN#e^C4fUub6c6)G8GVTDOBjK=NKPg3BZNIr(24iqVoytvP8%!Ea(vs!EM#| z86|2dg$liW*9lw#@G7RaKm5`HadpR(H;v0Ns%0#>+bBF~%P2oQCK_Ygb7@?O5niXw zYH*ba6f{X&5%h|@6C4!(_JhR5U>p!i8?km+Ye0xMVNy(rkIps<^HYs%SRpaER(NaO zSVk@XO_PfrUUopK#n~JVGd$7)D*|Gniyjd7I}z^|Zp3(g&_aGtupY!b7gIr0Nh0K! zf)!!_y52rj(isArXrCiXphI~l%^0H(oKFYM>C#xUn-I1DPC-%=&FmJyH}Y#}ROnU~ zlmIi+?4?)HFa|$_!h>F+0!0iyE;~)(Me5<^nvZU@pc;8Ne9O7S}!*DNr`|WlTy4 zqd!20;+W0wFKfZ8h;yK*&`g0YWAl}iuph9}AnOn72eONx9o_31-dpH>C6(7`;NA0{ zfbOvgn7jkt#`ATTMG8i8g`Ed&(N3MaK3sP@;91ra;W+%;NSI95t+(ur0^N0vdncoy zErwW(Pnhg`0ted>1V5E1F#yaKRL9s{F%|NpsL&RvFA`;Bj0W8dv0oAao*h>BWKFDi zJ?}Dg5%0#hzy1oW4)lf$Tqvcg(TlR75E>pV%m0>?X3jtrY zalQ9=w#s*_`UVfz!wRtqV!J4#&~eYw1uFp+w1d6+C*JYw|0*Q3@L%N$Z$IyQ&q(3j zwL+H;V-*uc>IE)6pIO>qtvOd+Qu610=~yXwCue2i2U1ua7S-4>nN8^!#a6A(OM{=t zCnnA~vvtIg<`mpSAwJiFonLUNqTp2&54S$H7e-M6BdicB;v0dh>kJ36D-KpeOkUnF zh57Ss3SlMffGG?*x+hu}X0$)mH`7qSE)3EJ!|y8Z!t)aVzfvKr$)_Di^eKdO73(hS z8|ekO;QUs`yYpdHM59FE4MpoFlAE`4bJiQGp@k*MBVAF<-Z4>YzCrU$2=vcDjFr+R zPhM?|su0LsKjT8%!-{_9Z7U}BgNzb4G811;!3v!~+s7EAbn+Ww_Ay{$W zIinjocPF4MZ>x3#utlIaXRafRz$gFzXUKqZMFbE5L;w*$1P}p401-e05CKF05kLeG z0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF0 z5kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e0 z5CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p4 z01-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$ z1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0 zL;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1 zKm-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG z0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF0 z5kLeG0Ym^1Km-s0L;w*$1P}p401-e05CKF05kLeG0Ym^1Km-s0L;w-^e@0;3z{KWI ze2R<|7L5Zu3~VFD!NC7BcaQ^!03v`0AOeU0B7g`W0*C-2fCwN0hyWsh2p|H803v`0 zAOeU0B7g`W0*C-2fCwN0hyWsh2p|H803v`0AOeU0B7g`W0*C-2fCwN0hyWsh2p|H8 z03v`0AOeU0B7g`W0*C-2fCwN0hyWsh2p|H803v`0AOeU0B7g`W0*C-2fCwN0hyWsh z2p|H803v`0AOeU0B7g`W0*C-2fCwN0hyWsh2p|H803v`0AOeU0B7g`W0*Js<5TF{^ zeB$~o-0`%m8HKo# z!dI)+K!}r5C@mB|t%!*$S;U`4U?Haf7*hy>l~3gA5+Wy33MXiZl(D0P!h^~Twj_c^ zN`M&wAhK5iH}WGuSIG#Z|8vjT|9Fl8k9DNKbb{)p_q;Z_v|F3QeLY*Qr^%qUX$7s) zt;wogAB>SRaDs{pL2T{LUL`Y@QaFtq+nLP{|30>UlJpEKiU|Zb-jr>e28R=H9Sw9n zMh4{sQz}2)tq7-i0#cq%fU(7n1g~ixs0W{82;&*%OtE*lY?|k;8N$;yyZwyQJhF_k z76wy!(-z;NzI&=a6jR3VExzh$v_kGt*GP_0&Gas!kRB7&)vpfd+_^qdd6JIa)k02T zq#NmxH_N??sO-9oJW|NGY74ODFC35m_>`xH-|&l*0*X3K=D?hNP+cG}Cl0S^}zRex{Bpfn1;@ zWsk+g0-Ta#%pS>U0@FZRh}(fh3u5g0#k7MFG>a7?g!Lg&t`Tvy=evr+p!quW9!C*D~i*M2RE=PEe<9FRjPz z5n?=Mnx~5jX=Nj=Rrlo=o=vD1kP?8=RyD0^DwWn;H-Ljzc9Z=hYFW%ypN(8oT@%wg zg8U;n!H%rsK|m1hBJd++j{&R%%uvZ!7|C@DthPzJcvfDNZI~Zbo}QRPQUis21;H%A zHpDa10btlkDV%^ASn+~3@3h1)Kh&T69O!HY;4(3&DU8Þ#@QVtm1O1uQPU4S>c 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 0: + os.close(fd) + return True, val_list + + +def getPMCreg(location): + retval = 'ERR' if not os.path.isfile(location): return "%s %s notfound" % (retval, location) try: - with open(location, "r") as fd: + with open(location, 'r') as fd: retval = fd.read() - except Exception: - pass - # logging.error("Unable to open ", location, "file !") + except Exception as error: + return "ERR %s" % str(error) - retval = retval.rstrip("\r\n") + retval = retval.rstrip('\r\n') retval = retval.lstrip(" ") return retval # Get a mailbox register def get_pmc_register(reg_name): - retval = "ERR" - if reg_name[0:4] == "/rif" or reg_name[0:4] == "/ma1" or reg_name[0:4] == "/eth": - mb_reg_file = PORTS_DIR + reg_name - else: - mb_reg_file = MAILBOX_DIR + reg_name + retval = 'ERR' + mb_reg_file = reg_name filepath = glob.glob(mb_reg_file) if len(filepath) == 0: return "%s %s notfound" % (retval, mb_reg_file) - mb_reg_file = filepath[0] # use first found patch + mb_reg_file = filepath[0] if not os.path.isfile(mb_reg_file): + # print mb_reg_file, 'not found !' return "%s %s notfound" % (retval, mb_reg_file) try: - with open(mb_reg_file, "r") as fd: + with open(mb_reg_file, 'rb') as fd: retval = fd.read() - except Exception: - pass - # logging.error("Unable to open ", mb_reg_file, "file !") + retval = typeTostr(retval) + except Exception as error: + retval = "%s %s read failed, msg: %s" % (retval, mb_reg_file, str(error)) - retval = retval.rstrip("\r\n") + retval = retval.rstrip('\r\n') retval = retval.lstrip(" ") return retval -class checktype: +class checktype(): def __init__(self, test1): self.test1 = test1 @staticmethod - def check(name, location, bit, value, tips, err1): - psu_status = int(get_pmc_register(location), 16) - val = (psu_status & (1 << bit)) >> bit - if val != value: - err1["errmsg"] = tips - err1["code"] = -1 - return -1 - else: - err1["errmsg"] = "none" - err1["code"] = 0 - return 0 - - @staticmethod - def getValue(location, bit, type): - value_t = get_pmc_register(location) - if value_t.startswith("ERR"): + def getValue(location, bit, data_type, coefficient=1, addend=0): + try: + value_t = get_pmc_register(location) + if value_t.startswith("ERR") or value_t.startswith("NA"): + return value_t + if data_type == 1: + return float('%.1f' % ((float(value_t) / 1000) + addend)) + if data_type == 2: + return float('%.1f' % (float(value_t) / 100)) + if data_type == 3: + psu_status = int(value_t, 16) + return (psu_status & (1 << bit)) >> bit + if data_type == 4: + return int(value_t, 10) + if data_type == 5: + return float('%.1f' % (float(value_t) / 1000 / 1000)) + if data_type == 6: + return Decimal(float(value_t) * coefficient / 1000).quantize(Decimal('0.000')) return value_t - if type == 1: - return float(value_t) / 1000 - elif type == 2: - return float(value_t) / 100 - elif type == 3: - psu_status = int(value_t, 16) - return (psu_status & (1 << bit)) >> bit - elif type == 4: - return int(value_t, 10) - else: + except Exception as e: + value_t = "ERR %s" % str(e) return value_t - # temperature + # fanFRU @staticmethod - def getTemp(self, name, location, ret_t): - ret2 = self.getValue(location + "temp1_input", " ", 1) - ret3 = self.getValue(location + "temp1_max", " ", 1) - ret4 = self.getValue(location + "temp1_max_hyst", " ", 1) - ret_t["temp1_input"] = ret2 - ret_t["temp1_max"] = ret3 - ret_t["temp1_max_hyst"] = ret4 + def decodeBinByValue(retval): + fru = ipmifru() + fru.decodeBin(retval) + return fru @staticmethod - def getLM75(name, location, result): - c1 = checktype - r1 = {} - c1.getTemp(c1, name, location, r1) - result[name] = r1 + def getfruValue(prob_t, root, val): + try: + ret, binval_bytes = dev_file_read(val, 0, 256) + if ret is False: + return binval_bytes + binval = byteTostr(binval_bytes) + fanpro = {} + ret = checktype.decodeBinByValue(binval) + fanpro['fan_type'] = ret.productInfoArea.productName + fanpro['hw_version'] = str(int(ret.productInfoArea.productVersion, 16)) + fanpro['sn'] = ret.productInfoArea.productSerialNumber + fan_display_name_dict = status.getDecodValue(root, "fan_display_name") + fan_name = fanpro['fan_type'].strip() + if len(fan_display_name_dict) == 0: + return fanpro + if fan_name not in fan_display_name_dict: + prob_t['errcode'] = -1 + prob_t['errmsg'] = '%s' % ("ERR fan name: %s not support" % fan_name) + else: + fanpro['fan_type'] = fan_display_name_dict[fan_name] + return fanpro + except Exception as error: + return "ERR " + str(error) + @staticmethod + def getslotfruValue(val): + try: + binval = checktype.getValue(val, 0, 0) + if binval.startswith("ERR"): + return binval + slotpro = {} + ret = checktype.decodeBinByValue(binval) + slotpro['slot_type'] = ret.boardInfoArea.boardProductName + slotpro['hw_version'] = ret.boardInfoArea.boardextra1 + slotpro['sn'] = ret.boardInfoArea.boardSerialNumber + return slotpro + except Exception as error: + return "ERR " + str(error) + + @staticmethod + def getpsufruValue(prob_t, root, val): + try: + psu_match = False + binval = checktype.getValue(val, 0, 0) + if binval.startswith("ERR"): + return binval + psupro = {} + ret = checktype.decodeBinByValue(binval) + psupro['type1'] = ret.productInfoArea.productPartModelName + psupro['sn'] = ret.productInfoArea.productSerialNumber + psupro['hw_version'] = ret.productInfoArea.productVersion + psu_dict = status.getDecodValue(root, "psutype") + psupro['type1'] = psupro['type1'].strip() + if len(psu_dict) == 0: + return psupro + for psu_name, display_name in psu_dict.items(): + if psu_name in psupro['type1']: + psupro['type1'] = display_name + psu_match = True + break + if psu_match is not True: + prob_t['errcode'] = -1 + prob_t['errmsg'] = '%s' % ("ERR psu name: %s not support" % psupro['type1']) + return psupro + except Exception as error: + return "ERR " + str(error) -class status: + +class status(): def __init__(self, productname): self.productname = productname @@ -119,10 +241,12 @@ def getETroot(filename): @staticmethod def getDecodValue(collection, decode): - decodes = collection.find("decode") + decodes = collection.find('decode') testdecode = decodes.find(decode) test = {} - for neighbor in testdecode.iter("code"): + if testdecode is None: + return test + for neighbor in testdecode.iter('code'): test[neighbor.attrib["key"]] = neighbor.attrib["value"] return test @@ -136,37 +260,67 @@ def getETValue(a, filename, tagname): for neighbor in root.iter(tagname): prob_t = {} prob_t = neighbor.attrib - prob_t["errcode"] = 0 - prob_t["errmsg"] = "" + prob_t['errcode'] = 0 + prob_t['errmsg'] = '' for pros in neighbor.iter("property"): - ret = dict(neighbor.attrib.items() + pros.attrib.items()) - if "type" not in ret.keys(): + ret = dict(list(neighbor.attrib.items()) + list(pros.attrib.items())) + if ret.get('e2type') == 'fru' and ret.get("name") == "fru": + fruval = checktype.getfruValue(prob_t, root, ret["location"]) + if isinstance(fruval, str) and fruval.startswith("ERR"): + prob_t['errcode'] = -1 + prob_t['errmsg'] = fruval + break + prob_t.update(fruval) + continue + + if ret.get("name") == "psu" and ret.get('e2type') == 'fru': + psuval = checktype.getpsufruValue(prob_t, root, ret["location"]) + if isinstance(psuval, str) and psuval.startswith("ERR"): + prob_t['errcode'] = -1 + prob_t['errmsg'] = psuval + break + prob_t.update(psuval) + continue + + if ret.get("gettype") == "config": + prob_t[ret["name"]] = ret["value"] + continue + + if 'type' not in ret.keys(): val = "0" else: val = ret["type"] - if "bit" not in ret.keys(): + if 'bit' not in ret.keys(): bit = "0" else: bit = ret["bit"] - s = checktype.getValue(ret["location"], int(bit), int(val)) + if 'coefficient' not in ret.keys(): + coefficient = 1 + else: + coefficient = float(ret["coefficient"]) + if 'addend' not in ret.keys(): + addend = 0 + else: + addend = float(ret["addend"]) + + s = checktype.getValue(ret["location"], int(bit), int(val), coefficient, addend) if isinstance(s, str) and s.startswith("ERR"): - prob_t["errcode"] = -1 - prob_t["errmsg"] = s - if "default" in ret.keys(): - rt = status.getDecodValue(root, ret["decode"]) - prob_t["errmsg"] = rt[str(s)] + prob_t['errcode'] = -1 + prob_t['errmsg'] = s + break + if 'default' in ret.keys(): + rt = status.getDecodValue(root, ret['decode']) + prob_t['errmsg'] = rt[str(s)] if str(s) != ret["default"]: - prob_t["errcode"] = -1 + prob_t['errcode'] = -1 break else: - if "decode" in ret.keys(): - rt = status.getDecodValue(root, ret["decode"]) - if ( - ret["decode"] == "psutype" - and s.replace("\x00", "").rstrip() not in rt.keys() - ): # PSU type detect - prob_t["errcode"] = -1 - prob_t["errmsg"] = "%s" % ("The power type does not match, please check whether the power is correct!") + if 'decode' in ret.keys(): + rt = status.getDecodValue(root, ret['decode']) + if (ret['decode'] == "psutype" and s.replace("\x00", "").rstrip() not in rt): + prob_t['errcode'] = -1 + prob_t['errmsg'] = '%s' % ("ERR psu name: %s not support" % + (s.replace("\x00", "").rstrip())) else: s = rt[str(s).replace("\x00", "").rstrip()] name = ret["name"] @@ -187,46 +341,39 @@ def getCPUValue(a, filename, tagname): for i in range(len(L)): prob_t = {} prob_t["name"] = getPMCreg("%s/temp%d_label" % (location, i + 1)) - prob_t["temp"] = ( - float(getPMCreg("%s/temp%d_input" % (location, i + 1))) / 1000 - ) - prob_t["alarm"] = ( - float(getPMCreg("%s/temp%d_crit_alarm" % (location, i + 1))) / 1000 - ) - prob_t["crit"] = ( - float(getPMCreg("%s/temp%d_crit" % (location, i + 1))) / 1000 - ) + prob_t["temp"] = float(getPMCreg("%s/temp%d_input" % (location, i + 1))) / 1000 + prob_t["alarm"] = float(getPMCreg("%s/temp%d_crit_alarm" % (location, i + 1))) / 1000 + prob_t["crit"] = float(getPMCreg("%s/temp%d_crit" % (location, i + 1))) / 1000 prob_t["max"] = float(getPMCreg("%s/temp%d_max" % (location, i + 1))) / 1000 a.append(prob_t) @staticmethod def getFileName(): - return os.path.dirname(os.path.realpath(__file__)) + "/" + CONFIG_NAME - - @staticmethod - def getFan(ret): - _filename = status.getFileName() - _tagname = "fan" - status.getvalue(ret, _filename, _tagname) + fpath = os.path.dirname(os.path.realpath(__file__)) + for file in DEV_XML_FILE_LIST: + xml = fpath + "/" + file + if os.path.exists(xml): + return xml + return fpath + "/" + CONFIG_NAME @staticmethod def checkFan(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() + # _filename = "/usr/local/bin/" + status.getFileName() _tagname = "fan" status.getETValue(ret, _filename, _tagname) @staticmethod def getTemp(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() + # _filename = "/usr/local/bin/" + status.getFileName() _tagname = "temp" status.getETValue(ret, _filename, _tagname) @staticmethod def getPsu(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() + # _filename = "/usr/local/bin/" + status.getFileName() _tagname = "psu" status.getETValue(ret, _filename, _tagname) @@ -237,8 +384,19 @@ def getcputemp(ret): status.getCPUValue(ret, _filename, _tagname) @staticmethod - def getMgmtRx(ret): + def getDcdc(ret): + _filename = status.getFileName() + _tagname = "dcdc" + status.getETValue(ret, _filename, _tagname) + + @staticmethod + def getmactemp(ret): + _filename = status.getFileName() + _tagname = "mactemp" + status.getETValue(ret, _filename, _tagname) + + @staticmethod + def getmacpower(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() - _tagname = "mgmt_rx" + _tagname = "macpower" status.getETValue(ret, _filename, _tagname) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml index 90ebf1740641..7b026cec395e 100644 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml @@ -82,6 +82,12 @@ id: 8c10 name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 (rev d5)' +- bus: '00' + dev: 1c + fn: '1' + id: 8c12 + name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express + Root Port #2 (rev d5)' - bus: '00' dev: 1d fn: '0' @@ -109,9 +115,8 @@ - bus: '01' dev: '00' fn: '0' - id: '1533' - name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev - 03)' + id: b873 + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device b873 (rev 01)' - bus: '03' dev: '00' fn: '0' @@ -149,8 +154,14 @@ - bus: '07' dev: '00' fn: '0' - id: b873 - name: 'Ethernet controller: Broadcom Limited Device b873 (rev 01)' + id: '1537' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Backplane Connection + (rev 03)' +- bus: 08 + dev: '00' + fn: '0' + id: '7022' + name: 'Memory controller: Xilinx Corporation Device 7022' - bus: ff dev: 0b fn: '0' diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json deleted file mode 100644 index ffa06ff74303..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "XCVR": { - "xcvr_present": { - "i2c": { - "valmap-SFP28": { - "1": true, - "0": false - }, - "valmap-QSFP28": { - "1": true, - "0": false - } - } - } - }, - - "PSU": { - "psu_present": { - "i2c": { - "valmap": { - "1": true, - "0": false - } - } - }, - - "psu_power_good": { - "i2c": { - "valmap": { - "1": true, - "0": false - } - } - }, - - "psu_fan_dir": { - "i2c": { - "valmap": { - "F2B": "EXHAUST", - "B2F": "INTAKE" - } - } - }, - "PSU_FAN_MAX_SPEED": "18000" - }, - - "FAN": { - "direction": { - "i2c": { - "valmap": { - "1": "INTAKE", - "0": "EXHAUST" - } - } - }, - "present": { - "i2c": { - "valmap": { - "1": true, - "0": false - } - } - }, - "duty_cycle_to_pwm": "lambda dc: dc*255/100", - "pwm_to_duty_cycle": "lambda pwm: pwm*100/255" - } -} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json deleted file mode 100644 index e9fc701bb8df..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json +++ /dev/null @@ -1,6502 +0,0 @@ -{ - "PLATFORM": { - "num_psus": 2, - "num_fantrays": 4, - "num_fans_pertray": 1, - "num_ports": 56, - "num_temps": 3, - "pddf_dev_types": { - "description": "RA-B6510-48v8c", - "CPLD": [ - "i2c_cpld" - ], - "PSU": [ - "psu_eeprom", - "psu_pmbus" - ], - "FAN": [ - "fan_ctrl", - "fan_cpld", - "fan_eeprom" - ], - "PORT_MODULE": [ - "pddf_xcvr", - "optoe1", - "optoe2" - ] - }, - "std_kos": [ - "i2c-ismt", - "i2c-i801", - "i2c_dev", - "i2c_gpio", - "i2c_algo_bit", - "i2c_mux_pca9641", - "i2c_mux_pca954x force_create_bus=1 close_chan_force_reset=1", - "lm75", - "optoe", - "at24", - "pmbus_core" - ], - "pddf_kos": [ - "pddf_client_module", - "pddf_cpld_module", - "pddf_cpld_driver", - "pddf_mux_module", - "pddf_xcvr_module", - "pddf_xcvr_driver_module", - "pddf_psu_driver_module", - "pddf_psu_module", - "pddf_fan_driver_module", - "pddf_fan_module", - "pddf_led_module", - "pddf_sysstatus_module" - ], - "custom_kos": [ - "ragile_platform", - "ragile_common dfd_my_type=0x404a", - "rg_cpld", - "rg_fan", - "rg_psu", - "rg_gpio_xeon", - "csu550" - ] - - }, - - "SYSTEM": { - "dev_info": { - "device_type": "CPU", - "device_name": "ROOT_COMPLEX", - "device_parent": null - }, - "i2c": { - "CONTROLLERS": [{ - "dev_name": "i2c-0", - "dev": "SMBUS0" - }, { - "dev_name": "i2c-2", - "dev": "SMBUS1" - }, { - "dev_name": "i2c-1", - "dev": "I2C-GPIO0" - }] - } - }, - - "SMBUS0": { - "dev_info": { - "device_type": "SMBUS", - "device_name": "SMBUS0", - "device_parent": "SYSTEM" - }, - "i2c": { - "topo_info": { - "dev_addr": "0x0" - }, - "DEVICES": [{ - "dev": "CPU_CPLD" - }, - { - "dev": "CONNECT_BOARD_CPLD1" - } - ] - } - }, - - "CPU_CPLD": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CPU_CPLD", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x0d", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "CONNECT_BOARD_CPLD1": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CONNECT_BOARD_CPLD1", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x32", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "SMBUS1": { - "dev_info": { - "device_type": "SMBUS", - "device_name": "SMBUS1", - "device_parent": "SYSTEM" - }, - "i2c": { - "topo_info": { - "dev_addr": "0x2" - }, - "DEVICES": [{ - "dev": "MAC_BOARD_CPLD1_A" - }, - { - "dev": "MAC_BOARD_CPLD2_A" - }, - { - "dev": "CONNECT_BOARD_CPLD2" - }, - { - "dev": "FAN-CTRL" - }, - { - "dev": "TEMP1" - }, - { - "dev": "TEMP2" - }, - { - "dev": "TEMP3" - }, - { - "dev": "EEPROM1" - }, - { - "dev": "MUX1" - } - ] - } - }, - - "MAC_BOARD_CPLD1_A": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD1_A", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x33", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "MAC_BOARD_CPLD2_A": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD2_A", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x35", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "FAN-CTRL": { - "dev_info": { - "device_type": "FAN", - "device_name": "FAN-CTRL", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x66", - "dev_type": "fan_cpld" - }, - "dev_attr": { - "num_fantrays": "4" - }, - "attr_list": [{ - "attr_name": "fan1_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x1", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan2_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x2", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan3_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x4", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan4_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x8", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan1_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x1b", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan2_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x1d", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan3_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x1f", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan4_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x21", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan1_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - }, - { - "attr_name": "fan2_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - }, - { - "attr_name": "fan3_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - }, - { - "attr_name": "fan4_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - } - ] - } - }, - - "CONNECT_BOARD_CPLD2": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CONNECT_BOARD_CPLD2", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x37", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "TEMP1": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "MAC_TEMP_INLET", - "device_parent": "SMBUS1" - }, - "dev_attr": { - "display_name": "Temp_1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x48", - "dev_type": "lm75" - }, - "attr_list": [{ - "attr_name": "temp1_high_threshold", - "drv_attr_name": "temp1_max" - }, - { - "attr_name": "temp1_max_hyst" - }, - { - "attr_name": "temp1_input" - } - ] - } - }, - - "TEMP2": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "MAC_TEMP_OUTLET", - "device_parent": "SMBUS1" - }, - "dev_attr": { - "display_name": "Temp_2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x49", - "dev_type": "lm75" - }, - "attr_list": [{ - "attr_name": "temp1_high_threshold", - "drv_attr_name": "temp1_max" - }, - { - "attr_name": "temp1_max_hyst" - }, - { - "attr_name": "temp1_input" - } - ] - } - }, - - "TEMP3": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "MAC_TEMP_HOTEST", - "device_parent": "SMBUS1" - }, - "dev_attr": { - "display_name": "Temp_3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x4a", - "dev_type": "lm75" - }, - "attr_list": [{ - "attr_name": "temp1_high_threshold", - "drv_attr_name": "temp1_max" - }, - { - "attr_name": "temp1_max_hyst" - }, - { - "attr_name": "temp1_input" - } - ] - } - }, - - "EEPROM1": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "EEPROM1", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x57", - "dev_type": "24c02" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "MUX1": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX1", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x70", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x3" - }, - "channel": [{ - "chn": "0", - "dev": "FAN1-EEPROM" - }, - { - "chn": "1", - "dev": "FAN2-EEPROM" - }, - { - "chn": "2", - "dev": "FAN3-EEPROM" - }, - { - "chn": "3", - "dev": "FAN4-EEPROM" - }, - { - "chn": "4", - "dev": "PSU1" - }, - { - "chn": "5", - "dev": "PSU2" - } - ] - } - }, - - "FAN1-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN1-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "FAN2-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN2-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x4", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "FAN3-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN3-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x5", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "FAN4-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN4-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x6", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PSU1": { - "dev_info": { - "device_type": "PSU", - "device_name": "PSU1", - "device_parent": "MUX1" - }, - "dev_attr": { - "dev_idx": "1", - "num_psu_fans": "1" - }, - "i2c": { - "interface": [{ - "itf": "pmbus", - "dev": "PSU1-PMBUS" - }, - { - "itf": "eeprom", - "dev": "PSU1-EEPROM" - } - ] - } - }, - - "PSU1-PMBUS": { - "dev_info": { - "device_type": "PSU-PMBUS", - "device_name": "PSU1-PMBUS", - "device_parent": "MUX1", - "virt_parent": "PSU1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x7", - "dev_addr": "0x58", - "dev_type": "psu_pmbus" - }, - "attr_list": [{ - "attr_name": "psu_present", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x1", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "psu_model_name", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x9a", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "12" - }, - { - "attr_name": "psu_power_good", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x2", - "attr_cmpval": "0x2", - "attr_len": "1" - }, - { - "attr_name": "psu_mfr_id", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x99", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "10" - }, - { - "attr_name": "psu_fan_dir", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0xc3", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "5" - }, - { - "attr_name": "psu_v_out", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x8b", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_i_out", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x8c", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_p_out", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x96", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_fan1_speed_rpm", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x90", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_temp1_input", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x8d", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - } - ] - } - }, - - "PSU1-EEPROM": { - "dev_info": { - "device_type": "PSU-EEPROM", - "device_name": "PSU1-EEPROM", - "device_parent": "MUX1", - "virt_parent": "PSU1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x7", - "dev_addr": "0x50", - "dev_type": "psu_eeprom" - }, - "attr_list": [{ - "attr_name": "psu_serial_num", - "attr_devaddr": "0x50", - "attr_devtype": "eeprom", - "attr_offset": "0x38", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "20" - }] - } - }, - - "PSU2": { - "dev_info": { - "device_type": "PSU", - "device_name": "PSU2", - "device_parent": "MUX1" - }, - "dev_attr": { - "dev_idx": "2", - "num_psu_fans": "1" - }, - "i2c": { - "interface": [{ - "itf": "pmbus", - "dev": "PSU2-PMBUS" - }, - { - "itf": "eeprom", - "dev": "PSU2-EEPROM" - } - ] - } - }, - - "PSU2-PMBUS": { - "dev_info": { - "device_type": "PSU-PMBUS", - "device_name": "PSU2-PMBUS", - "device_parent": "MUX1", - "virt_parent": "PSU2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x8", - "dev_addr": "0x5b", - "dev_type": "psu_pmbus" - }, - "attr_list": [{ - "attr_name": "psu_present", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x10", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "psu_model_name", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x9a", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "12" - }, - { - "attr_name": "psu_power_good", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x20", - "attr_cmpval": "0x20", - "attr_len": "1" - }, - { - "attr_name": "psu_mfr_id", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x99", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "10" - }, - { - "attr_name": "psu_fan_dir", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0xc3", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "5" - }, - { - "attr_name": "psu_v_out", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x8b", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_i_out", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x8c", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_p_out", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x96", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_fan1_speed_rpm", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x90", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_temp1_input", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x8d", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - } - ] - } - }, - - "PSU2-EEPROM": { - "dev_info": { - "device_type": "PSU-EEPROM", - "device_name": "PSU2-EEPROM", - "device_parent": "MUX1", - "virt_parent": "PSU2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x8", - "dev_addr": "0x53", - "dev_type": "psu_eeprom" - }, - "attr_list": [{ - "attr_name": "psu_serial_num", - "attr_devaddr": "0x53", - "attr_devtype": "eeprom", - "attr_offset": "0x38", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "20" - }] - } - }, - - "I2C-GPIO0": { - "dev_info": { - "device_type": "I2C-GPIO", - "device_name": "I2C-GPIO0", - "device_parent": "SYSTEM" - }, - "i2c": { - "topo_info": { - "dev_addr": "0x1" - }, - "DEVICES": [{ - "dev": "MAC_BOARD_CPLD1_B" - }, - { - "dev": "MAC_BOARD_CPLD2_B" - }, - { - "dev": "PORT-MUX1" - }, - { - "dev": "PORT-MUX2" - }, - { - "dev": "PORT-MUX3" - }, - { - "dev": "PORT-MUX4" - }, - { - "dev": "PORT-MUX5" - }, - { - "dev": "PORT-MUX6" - }, - { - "dev": "PORT-MUX7" - }, - { - "dev": "PORT-MUX8" - } - ] - } - }, - - "MAC_BOARD_CPLD1_B": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD1_B", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x34", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "MAC_BOARD_CPLD2_B": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD2_B", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x36", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "PORT-MUX1": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX1", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x70", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0xb" - }, - "channel": [{ - "chn": "0", - "dev": "PORT1" - }, - { - "chn": "1", - "dev": "PORT2" - }, - { - "chn": "2", - "dev": "PORT3" - }, - { - "chn": "3", - "dev": "PORT4" - }, - { - "chn": "4", - "dev": "PORT5" - }, - { - "chn": "5", - "dev": "PORT6" - }, - { - "chn": "6", - "dev": "PORT7" - }, - { - "chn": "7", - "dev": "PORT8" - } - ] - } - }, - - "PORT-MUX2": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX2", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x71", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x13" - }, - "channel": [{ - "chn": "0", - "dev": "PORT9" - }, - { - "chn": "1", - "dev": "PORT10" - }, - { - "chn": "2", - "dev": "PORT11" - }, - { - "chn": "3", - "dev": "PORT12" - }, - { - "chn": "4", - "dev": "PORT13" - }, - { - "chn": "5", - "dev": "PORT14" - }, - { - "chn": "6", - "dev": "PORT15" - }, - { - "chn": "7", - "dev": "PORT16" - } - ] - } - }, - - "PORT-MUX3": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX3", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x72", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x1b" - }, - "channel": [{ - "chn": "0", - "dev": "PORT17" - }, - { - "chn": "1", - "dev": "PORT18" - }, - { - "chn": "2", - "dev": "PORT19" - }, - { - "chn": "3", - "dev": "PORT20" - }, - { - "chn": "4", - "dev": "PORT21" - }, - { - "chn": "5", - "dev": "PORT22" - }, - { - "chn": "6", - "dev": "PORT23" - }, - { - "chn": "7", - "dev": "PORT24" - } - ] - } - }, - - "PORT-MUX4": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX4", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x73", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x23" - }, - "channel": [{ - "chn": "0", - "dev": "PORT25" - }, - { - "chn": "1", - "dev": "PORT26" - }, - { - "chn": "2", - "dev": "PORT27" - }, - { - "chn": "3", - "dev": "PORT28" - }, - { - "chn": "4", - "dev": "PORT29" - }, - { - "chn": "5", - "dev": "PORT30" - }, - { - "chn": "6", - "dev": "PORT31" - }, - { - "chn": "7", - "dev": "PORT32" - } - ] - } - }, - - "PORT-MUX5": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX5", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x74", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x2b" - }, - "channel": [{ - "chn": "0", - "dev": "PORT33" - }, - { - "chn": "1", - "dev": "PORT34" - }, - { - "chn": "2", - "dev": "PORT35" - }, - { - "chn": "3", - "dev": "PORT36" - }, - { - "chn": "4", - "dev": "PORT37" - }, - { - "chn": "5", - "dev": "PORT38" - }, - { - "chn": "6", - "dev": "PORT39" - }, - { - "chn": "7", - "dev": "PORT40" - } - ] - } - }, - - "PORT-MUX6": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX6", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x75", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x33" - }, - "channel": [{ - "chn": "0", - "dev": "PORT41" - }, - { - "chn": "1", - "dev": "PORT42" - }, - { - "chn": "2", - "dev": "PORT43" - }, - { - "chn": "3", - "dev": "PORT44" - }, - { - "chn": "4", - "dev": "PORT45" - }, - { - "chn": "5", - "dev": "PORT46" - }, - { - "chn": "6", - "dev": "PORT47" - }, - { - "chn": "7", - "dev": "PORT48" - } - ] - } - }, - - "PORT-MUX7": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX7", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x76", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x3b" - }, - "channel": [{ - "chn": "0", - "dev": "PORT49" - }, - { - "chn": "1", - "dev": "PORT50" - }, - { - "chn": "2", - "dev": "PORT51" - }, - { - "chn": "3", - "dev": "PORT52" - }, - { - "chn": "4", - "dev": "PORT53" - }, - { - "chn": "5", - "dev": "PORT54" - }, - { - "chn": "6", - "dev": "PORT55" - }, - { - "chn": "7", - "dev": "PORT56" - } - ] - } - }, - - "PORT-MUX8": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX8", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x77", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x43" - }, - "channel": [] - } - }, - - "PORT1": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT1", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "1" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT1-EEPROM" - }, { - "itf": "control", - "dev": "PORT1-CTRL" - }] - } - }, - - "PORT1-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT1-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xb", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT1-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT1-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xb", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT2": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT2", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "2" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT2-EEPROM" - }, { - "itf": "control", - "dev": "PORT2-CTRL" - }] - } - }, - - "PORT2-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT2-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xc", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT2-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT2-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xc", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT3": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT3", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "3" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT3-EEPROM" - }, { - "itf": "control", - "dev": "PORT3-CTRL" - }] - } - }, - - "PORT3-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT3-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xd", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT3-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT3-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xd", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT4": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT4", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "4" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT4-EEPROM" - }, { - "itf": "control", - "dev": "PORT4-CTRL" - }] - } - }, - - "PORT4-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT4-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT4" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xe", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT4-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT4-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT4" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xe", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT5": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT5", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "5" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT5-EEPROM" - }, { - "itf": "control", - "dev": "PORT5-CTRL" - }] - } - }, - - "PORT5-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT5-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT5" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xf", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT5-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT5-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT5" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xf", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT6": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT6", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "6" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT6-EEPROM" - }, { - "itf": "control", - "dev": "PORT6-CTRL" - }] - } - }, - - "PORT6-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT6-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT6" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x10", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT6-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT6-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT6" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x10", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT7": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT7", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "7" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT7-EEPROM" - }, { - "itf": "control", - "dev": "PORT7-CTRL" - }] - } - }, - - "PORT7-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT7-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT7" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x11", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT7-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT7-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT7" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x11", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT8": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT8", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "8" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT8-EEPROM" - }, { - "itf": "control", - "dev": "PORT8-CTRL" - }] - } - }, - - "PORT8-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT8-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT8" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x12", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT8-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT8-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT8" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x12", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT9": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT9", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "9" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT9-EEPROM" - }, { - "itf": "control", - "dev": "PORT9-CTRL" - }] - } - }, - - "PORT9-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT9-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT9" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x13", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT9-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT9-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT9" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x13", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT10": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT10", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "10" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT10-EEPROM" - }, { - "itf": "control", - "dev": "PORT10-CTRL" - }] - } - }, - - "PORT10-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT10-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT10" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x14", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT10-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT10-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT10" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x14", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT11": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT11", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "11" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT11-EEPROM" - }, { - "itf": "control", - "dev": "PORT11-CTRL" - }] - } - }, - - "PORT11-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT11-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT11" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x15", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT11-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT11-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT11" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x15", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT12": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT12", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "12" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT12-EEPROM" - }, { - "itf": "control", - "dev": "PORT12-CTRL" - }] - } - }, - - "PORT12-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT12-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT12" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x16", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT12-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT12-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT12" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x16", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT13": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT13", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "13" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT13-EEPROM" - }, { - "itf": "control", - "dev": "PORT13-CTRL" - }] - } - }, - - "PORT13-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT13-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT13" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x17", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT13-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT13-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT13" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x17", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT14": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT14", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "14" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT14-EEPROM" - }, { - "itf": "control", - "dev": "PORT14-CTRL" - }] - } - }, - - "PORT14-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT14-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT14" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x18", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT14-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT14-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT14" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x18", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT15": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT15", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "15" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT15-EEPROM" - }, { - "itf": "control", - "dev": "PORT15-CTRL" - }] - } - }, - - "PORT15-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT15-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT15" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x19", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT15-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT15-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT15" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x19", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT16": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT16", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "16" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT16-EEPROM" - }, { - "itf": "control", - "dev": "PORT16-CTRL" - }] - } - }, - - "PORT16-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT16-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT16" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1a", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT16-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT16-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT16" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT17": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT17", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "17" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT17-EEPROM" - }, { - "itf": "control", - "dev": "PORT17-CTRL" - }] - } - }, - - "PORT17-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT17-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT17" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1b", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT17-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT17-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT17" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT18": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT18", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "18" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT18-EEPROM" - }, { - "itf": "control", - "dev": "PORT18-CTRL" - }] - } - }, - - "PORT18-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT18-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT18" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1c", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT18-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT18-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT18" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT19": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT19", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "19" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT19-EEPROM" - }, { - "itf": "control", - "dev": "PORT19-CTRL" - }] - } - }, - - "PORT19-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT19-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT19" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1d", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT19-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT19-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT19" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT20": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT20", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "20" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT20-EEPROM" - }, { - "itf": "control", - "dev": "PORT20-CTRL" - }] - } - }, - - "PORT20-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT20-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT20" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1e", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT20-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT20-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT20" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT21": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT21", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "21" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT21-EEPROM" - }, { - "itf": "control", - "dev": "PORT21-CTRL" - }] - } - }, - - "PORT21-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT21-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT21" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1f", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT21-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT21-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT21" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT22": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT22", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "22" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT22-EEPROM" - }, { - "itf": "control", - "dev": "PORT22-CTRL" - }] - } - }, - - "PORT22-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT22-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT22" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x20", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT22-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT22-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT22" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x20", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT23": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT23", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "23" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT23-EEPROM" - }, { - "itf": "control", - "dev": "PORT23-CTRL" - }] - } - }, - - "PORT23-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT23-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT23" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x21", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT23-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT23-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT23" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x21", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT24": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT24", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "24" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT24-EEPROM" - }, { - "itf": "control", - "dev": "PORT24-CTRL" - }] - } - }, - - "PORT24-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT24-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT24" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x22", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT24-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT24-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT24" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x22", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT25": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT25", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "25" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT25-EEPROM" - }, { - "itf": "control", - "dev": "PORT25-CTRL" - }] - } - }, - - "PORT25-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT25-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT25" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x23", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT25-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT25-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT25" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x23", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT26": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT26", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "26" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT26-EEPROM" - }, { - "itf": "control", - "dev": "PORT26-CTRL" - }] - } - }, - - "PORT26-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT26-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT26" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x24", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT26-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT26-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT26" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x24", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT27": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT27", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "27" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT27-EEPROM" - }, { - "itf": "control", - "dev": "PORT27-CTRL" - }] - } - }, - - "PORT27-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT27-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT27" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x25", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT27-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT27-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT27" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x25", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT28": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT28", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "28" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT28-EEPROM" - }, { - "itf": "control", - "dev": "PORT28-CTRL" - }] - } - }, - - "PORT28-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT28-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT28" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x26", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT28-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT28-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT28" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x26", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT29": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT29", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "29" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT29-EEPROM" - }, { - "itf": "control", - "dev": "PORT29-CTRL" - }] - } - }, - - "PORT29-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT29-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT29" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x27", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT29-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT29-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT29" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x27", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT30": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT30", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "30" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT30-EEPROM" - }, { - "itf": "control", - "dev": "PORT30-CTRL" - }] - } - }, - - "PORT30-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT30-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT30" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x28", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT30-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT30-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT30" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x28", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT31": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT31", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "31" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT31-EEPROM" - }, { - "itf": "control", - "dev": "PORT31-CTRL" - }] - } - }, - - "PORT31-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT31-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT31" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x29", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT31-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT31-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT31" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x29", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT32": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT32", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "32" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT32-EEPROM" - }, { - "itf": "control", - "dev": "PORT32-CTRL" - }] - } - }, - - "PORT32-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT32-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT32" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2a", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT32-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT32-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT32" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT33": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT33", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "33" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT33-EEPROM" - }, { - "itf": "control", - "dev": "PORT33-CTRL" - }] - } - }, - - "PORT33-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT33-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT33" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2b", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT33-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT33-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT33" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT34": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT34", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "34" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT34-EEPROM" - }, { - "itf": "control", - "dev": "PORT34-CTRL" - }] - } - }, - - "PORT34-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT34-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT34" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2c", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT34-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT34-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT34" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT35": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT35", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "35" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT35-EEPROM" - }, { - "itf": "control", - "dev": "PORT35-CTRL" - }] - } - }, - - "PORT35-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT35-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT35" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2d", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT35-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT35-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT35" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT36": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT36", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "36" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT36-EEPROM" - }, { - "itf": "control", - "dev": "PORT36-CTRL" - }] - } - }, - - "PORT36-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT36-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT36" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2e", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT36-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT36-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT36" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT37": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT37", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "37" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT37-EEPROM" - }, { - "itf": "control", - "dev": "PORT37-CTRL" - }] - } - }, - - "PORT37-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT37-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT37" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2f", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT37-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT37-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT37" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT38": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT38", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "38" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT38-EEPROM" - }, { - "itf": "control", - "dev": "PORT38-CTRL" - }] - } - }, - - "PORT38-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT38-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT38" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x30", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT38-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT38-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT38" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x30", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT39": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT39", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "39" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT39-EEPROM" - }, { - "itf": "control", - "dev": "PORT39-CTRL" - }] - } - }, - - "PORT39-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT39-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT39" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x31", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT39-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT39-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT39" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x31", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT40": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT40", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "40" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT40-EEPROM" - }, { - "itf": "control", - "dev": "PORT40-CTRL" - }] - } - }, - - "PORT40-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT40-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT40" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x32", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT40-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT40-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT40" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x32", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT41": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT41", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "41" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT41-EEPROM" - }, { - "itf": "control", - "dev": "PORT41-CTRL" - }] - } - }, - - "PORT41-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT41-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT41" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x33", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT41-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT41-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT41" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x33", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT42": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT42", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "42" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT42-EEPROM" - }, { - "itf": "control", - "dev": "PORT42-CTRL" - }] - } - }, - - "PORT42-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT42-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT42" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x34", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT42-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT42-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT42" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x34", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT43": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT43", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "43" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT43-EEPROM" - }, { - "itf": "control", - "dev": "PORT43-CTRL" - }] - } - }, - - "PORT43-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT43-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT43" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x35", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT43-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT43-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT43" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x35", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT44": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT44", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "44" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT44-EEPROM" - }, { - "itf": "control", - "dev": "PORT44-CTRL" - }] - } - }, - - "PORT44-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT44-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT44" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x36", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT44-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT44-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT44" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x36", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT45": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT45", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "45" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT45-EEPROM" - }, { - "itf": "control", - "dev": "PORT45-CTRL" - }] - } - }, - - "PORT45-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT45-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT45" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x37", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT45-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT45-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT45" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x37", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT46": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT46", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "46" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT46-EEPROM" - }, { - "itf": "control", - "dev": "PORT46-CTRL" - }] - } - }, - - "PORT46-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT46-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT46" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x38", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT46-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT46-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT46" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x38", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT47": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT47", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "47" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT47-EEPROM" - }, { - "itf": "control", - "dev": "PORT47-CTRL" - }] - } - }, - - "PORT47-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT47-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT47" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x39", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT47-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT47-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT47" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x39", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT48": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT48", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "48" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT48-EEPROM" - }, { - "itf": "control", - "dev": "PORT48-CTRL" - }] - } - }, - - "PORT48-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT48-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT48" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3a", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT48-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT48-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT48" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT49": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT49", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "49" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT49-EEPROM" - }, { - "itf": "control", - "dev": "PORT49-CTRL" - }] - } - }, - - "PORT49-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT49-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT49" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3b", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT49-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT49-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT49" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT50": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT50", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "50" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT50-EEPROM" - }, { - "itf": "control", - "dev": "PORT50-CTRL" - }] - } - }, - - "PORT50-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT50-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT50" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3c", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT50-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT50-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT50" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT51": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT51", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "51" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT51-EEPROM" - }, { - "itf": "control", - "dev": "PORT51-CTRL" - }] - } - }, - - "PORT51-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT51-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT51" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3d", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT51-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT51-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT51" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT52": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT52", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "52" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT52-EEPROM" - }, { - "itf": "control", - "dev": "PORT52-CTRL" - }] - } - }, - - "PORT52-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT52-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT52" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3e", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT52-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT52-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT52" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT53": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT53", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "53" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT53-EEPROM" - }, { - "itf": "control", - "dev": "PORT53-CTRL" - }] - } - }, - - "PORT53-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT53-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT53" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3f", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT53-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT53-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT53" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT54": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT54", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "54" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT54-EEPROM" - }, { - "itf": "control", - "dev": "PORT54-CTRL" - }] - } - }, - - "PORT54-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT54-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT54" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x40", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT54-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT54-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT54" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x40", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT55": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT55", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "55" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT55-EEPROM" - }, { - "itf": "control", - "dev": "PORT55-CTRL" - }] - } - }, - - "PORT55-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT55-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT55" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x41", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT55-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT55-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT55" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x41", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT56": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT56", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "56" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT56-EEPROM" - }, { - "itf": "control", - "dev": "PORT56-CTRL" - }] - } - }, - - "PORT56-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT56-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT56" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x42", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT56-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT56-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT56" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x42", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "FRONT_BOARD_BMC_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "DIAG_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - } - ] - } - }, - - "FRONT_BOARD_CPU_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "SYS_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - } - ] - } - }, - - "FRONT_BOARD_PSU_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "LOC_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - } - ] - } - }, - - "FRONT_BOARD_FAN_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FAN_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - } - ] - } - }, - - "FAN1_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - } - ] - } - }, - - "FAN2_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "1" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - } - ] - } - }, - - "FAN3_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "2" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - } - ] - } - }, - - "FAN4_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "3" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - } - ] - } - } -} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json new file mode 100644 index 000000000000..6e9b40b80516 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json @@ -0,0 +1,402 @@ +{ + "chassis": { + "name": "RA-B6510-48V8C", + "thermal_manager": false, + "status_led": { + "controllable": false, + "colors": ["green", "blinking_green", "amber", "blinking_amber"] + }, + "components": [ + { + "name": "CPU_CPLD" + }, + { + "name": "CONNECT_CPLD" + }, + { + "name": "CONNECT_CPLD-FAN" + }, + { + "name": "MAC_CPLD1" + }, + { + "name": "MAC_CPLD2" + }, + { + "name": "FPGA" + }, + { + "name": "BIOS" + } + ], + "fans": [ + { + "name": "Fantray1_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray1_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray2_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray2_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray3_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray3_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray4_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray4_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + } + ], + "fan_drawers":[ + { + "name": "Fantray1", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray1_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray1_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Fantray2", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray2_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Fantray3", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray3_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Fantray4", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray4_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + } + ], + "psus": [ + { + "name": "Psu1", + "voltage": true, + "current": true, + "power": true, + "max_power": false, + "voltage_high_threshold": true, + "voltage_low_threshold": true, + "temperature": true, + "fans_target_speed": true, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU1_FAN1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Psu2", + "voltage": true, + "current": true, + "power": true, + "max_power": false, + "voltage_high_threshold": true, + "voltage_low_threshold": true, + "temperature": true, + "fans_target_speed": true, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU2_FAN1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + } + ], + "thermals": [ + { + "name": "ASIC_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "CPU_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "INLET_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "OUTLET_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "MAC_OUT_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "MAC_IN_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "PSU1_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "PSU2_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + } + ], + "modules": [], + "sfps": [] + }, + "interfaces": {} +} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json new file mode 100644 index 000000000000..2e6f4b8d1217 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json @@ -0,0 +1,37 @@ +{ + "chassis": { + "RA-B6510-48V8C": { + "component": { + "CPU_CPLD": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/cpu_cpld_upgrade_header.vme", + "version": "27190516" + }, + "CONNECT_CPLD": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version": "49191230" + }, + "CONNECT_CPLD-FAN": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version": "49191230" + }, + "MAC_CPLD1": { + "firmware" : "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version" : "16190108" + }, + "MAC_CPLD2": { + "firmware" : "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version" : "17200110" + }, + "FPGA": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/fpga_upgrade_header.bin", + "version": "7a150016" + }, + "BIOS": { + "firmware" : "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin", + "version" : "5.11(3BARB029)" + } + } + } + } +} + diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py deleted file mode 100755 index cf7215e0c9ac..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py +++ /dev/null @@ -1,25 +0,0 @@ -try: - import os - import sys - import json - sys.path.append('/usr/share/sonic/platform/plugins') - import pddfparse - #from sonic_eeprom import eeprom_base - from sonic_eeprom import eeprom_tlvinfo -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class board(eeprom_tlvinfo.TlvInfoDecoder): - _TLV_INFO_MAX_LEN = 256 - - def __init__(self, name, path, cpld_root, ro): - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - # system EEPROM always has device name EEPROM1 - self.eeprom_path = pddf_obj.get_path("EEPROM1", "eeprom") - super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py deleted file mode 100755 index 58c38d1d7367..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py +++ /dev/null @@ -1,187 +0,0 @@ -# Sample pddf_fanutil file -# All the supported FAN SysFS aattributes are -#- fan_present -#- fan_direction -#- fan_input -#- fan_pwm -#- fan_fault -# where idx is in the range [1-12] -# - - -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json - -try: - from sonic_fan.fan_base import FanBase -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class FanUtil(FanBase): - """PDDF generic FAN util class""" - - def __init__(self): - FanBase.__init__(self) - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - - self.num_fans = (self.platform['num_fantrays'] * self.platform['num_fans_pertray']) - - def get_num_fans(self): - return self.num_fans - - def get_presence(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return False - - attr_name = "fan" + str(idx) + "_present" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr_name) - if not output: - return False - - mode = output['mode'] - presence = output['status'].rstrip() - - vmap = plugin_data['FAN']['present'][mode]['valmap'] - - if presence in vmap: - status = vmap[presence] - else: - status = False - - return status - - def get_status(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return False - - speed = self.get_speed(idx) - status = True if (speed != 0) else False - return status - - def get_direction(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return None - - attr = "fan" + str(idx) + "_direction" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr) - if not output: - return None - - mode = output['mode'] - val = output['status'] - - val = val.rstrip() - vmap = plugin_data['FAN']['direction'][mode]['valmap'] - - if val in vmap: - direction = vmap[val] - else: - direction = val - - return direction - - def get_directions(self): - num_fan = self.get_num_fan() - - for i in range(1, num_fan+1): - attr = "fan" + str(i) + "_direction" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr) - if not output: - return None - - mode = output['mode'] - val = output['status'] - - val = val.rstrip() - vmap = plugin_data['FAN']['direction'][mode]['valmap'] - - direction = vmap[str(val)] - - print("FAN-%d direction is %s" % (i, direction)) - - return 0 - - def get_speed(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return 0 - - attr = "fan" + str(idx) + "_input" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr) - if not output: - return 0 - - #mode = output['mode'] - val = output['status'].rstrip() - - if val.isalpha(): - return 0 - else: - rpm_speed = int(float(val)) - - return rpm_speed - - def get_speeds(self): - num_fan = self.get_num_fan() - ret = "FAN_INDEX\t\tRPM\n" - - for i in range(1, num_fan+1): - attr1 = "fan" + str(i) + "_input" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr1) - if not output: - return "" - - #mode = output['mode'] - val = output['status'].rstrip() - - if val.isalpha(): - frpm = 0 - else: - frpm = int(val) - - ret += "FAN-%d\t\t\t%d\n" % (i, frpm) - - return ret - - def set_speed(self, val): - if val < 0 or val > 100: - print("Error: Invalid speed %d. Please provide a valid speed percentage" % val) - return False - - #num_fan = self.num_fans - if 'duty_cycle_to_pwm' not in plugin_data['FAN']: - print("Setting fan speed is not allowed !") - return False - else: - print("setspeed nothing to do") - return False - - #return True - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('fan') - - def get_change_event(self): - """ - TODO: This function need to be implemented - when decide to support monitoring FAN(fand) - on this platform. - """ - raise NotImplementedError diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py deleted file mode 100755 index 5f9e2e99dbfa..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse - - -class LedUtil: - color_map = { - "STATUS_LED_COLOR_GREEN": "on", - "STATUS_LED_COLOR_RED": "faulty", - "STATUS_LED_COLOR_OFF": "off" - } - - def __init__(self): - global pddf_obj - pddf_obj = pddfparse.PddfParse() - self.path = "pddf/devices/led" - self.cur_state_path = "pddf/devices/led/cur_state" - - def set_status_led(self, led_device_name, color, color_state="SOLID"): - if (not led_device_name in list(pddf_obj.data.keys())): - status = "ERROR: " + led_device_name + " is not configured" - return (status) - - if (not color in list(self.color_map.keys())): - status = "ERROR: Invalid color" - return (status) - - index = pddf_obj.data[led_device_name]['dev_attr']['index'] - pddf_obj.create_attr('device_name', led_device_name, self.path) - pddf_obj.create_attr('index', index, self.path) - pddf_obj.create_attr( - 'color', self.color_map[color], self.cur_state_path) - pddf_obj.create_attr('color_state', color_state, self.cur_state_path) - pddf_obj.create_attr('dev_ops', 'set_status', self.path) - return ("Executed") - - def get_status_led(self, led_device_name): - if (not led_device_name in list(pddf_obj.data.keys())): - status = "ERROR: " + led_device_name + " is not configured" - return (status) - - index = pddf_obj.data[led_device_name]['dev_attr']['index'] - pddf_obj.create_attr('device_name', led_device_name, self.path) - pddf_obj.create_attr('index', index, self.path) - pddf_obj.create_attr('dev_ops', 'get_status', self.path) - color_f = "/sys/kernel/" + self.cur_state_path + "/color" - color_state_f = "/sys/kernel/" + self.cur_state_path + "/color_state" - - try: - with open(color_f, 'r') as f: - color = f.read().strip("\r\n") - with open(color_state_f, 'r') as f: - color_state = f.read().strip("\r\n") - except IOError: - status = "ERROR :" + color_f + " open failed" - return (status) - status = "%s-%s:\t%s %s\n" % (led_device_name, - index, color, color_state) - return (status) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py deleted file mode 100755 index dccb1ac1a155..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py +++ /dev/null @@ -1,270 +0,0 @@ -# -# Sample pddf_psuutil file -# -# All the supported PSU SysFS aattributes are -#- psu_present -#- psu_model_name -#- psu_power_good -#- psu_mfr_id -#- psu_serial_num -#- psu_fan_dir -#- psu_v_out -#- psu_i_out -#- psu_p_out -#- psu_fan1_speed_rpm -# - -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json - -try: - from sonic_psu.psu_base import PsuBase -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class PsuUtil(PsuBase): - """PDDF generic PSU util class""" - - def __init__(self): - PsuBase.__init__(self) - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - - def get_num_psus(self): - return int(self.platform['num_psus']) - - def get_psu_status(self, index): - if index is None: - return False - - device = "PSU" + "%d" % index - output = pddf_obj.get_attr_name_output(device, "psu_power_good") - if not output: - return False - - mode = output['mode'] - val = output['status'] - - val = val.rstrip() - vmap = plugin_data['PSU']['psu_power_good'][mode]['valmap'] - - if val in vmap: - return vmap[val] - else: - return False - - def get_psu_presence(self, index): - if index is None: - return False - - status = 0 - device = "PSU" + "%d" % index - output = pddf_obj.get_attr_name_output(device, "psu_present") - if not output: - return False - - mode = output['mode'] - status = output['status'] - - vmap = plugin_data['PSU']['psu_present'][mode]['valmap'] - - if status.rstrip('\n') in vmap: - return vmap[status.rstrip('\n')] - else: - return False - - def get_powergood_status(self, idx): - if idx is None: - return False - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return False - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_power_good") - if not output: - return False - - mode = output['mode'] - status = output['status'] - - vmap = plugin_data['PSU']['psu_power_good'][mode]['valmap'] - - if status.rstrip('\n') in vmap: - return vmap[status.rstrip('\n')] - else: - return False - - def get_model(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_model_name") - if not output: - return None - - model = output['status'] - - # strip_non_ascii - stripped = (c for c in model if 0 < ord(c) < 127) - model = ''.join(stripped) - - return model.rstrip('\n') - - def get_mfr_id(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_mfr_id") - if not output: - return None - - mfr = output['status'] - - return mfr.rstrip('\n') - - def get_serial(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_serial_num") - if not output: - return None - - serial = output['status'] - - return serial.rstrip('\n') - - def get_direction(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_fan_dir") - if not output: - return None - - mode = output['mode'] - direction = output['status'].rstrip('\n') - - vmap = plugin_data['PSU']['psu_fan_dir'][mode]['valmap'] - if direction in vmap: - airflow_dir_real = vmap[direction] - else: - airflow_dir_real = direction - - return airflow_dir_real - - def get_output_voltage(self, idx): - if idx is None: - return 0.0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0.0 - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_v_out") - if not output: - return 0.0 - - v_out = output['status'] - - # value returned by the psu driver is in mV - return float(v_out)/1000 - - def get_output_current(self, idx): - if idx is None: - return 0.0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0.0 - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_i_out") - if not output: - return 0.0 - - i_out = output['status'] - - # current in mA - return float(i_out)/1000 - - def get_output_power(self, idx): - if idx is None: - return 0.0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0.0 - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_p_out") - if not output: - return 0.0 - - p_out = output['status'] - - # power is returned in micro watts - return float(p_out)/1000000 - - def get_fan_rpm(self, idx, fan_idx): - if idx is None or fan_idx is None: - return 0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0 - - device = "PSU"+"%d" % (idx) - num_fans = pddf_obj.get_num_psu_fans(device) - - if fan_idx < 1 or fan_idx > num_fans: - print("Invalid PSU-fan index %d\n" % fan_idx) - return 0 - - output = pddf_obj.get_attr_name_output(device, "psu_fan"+str(fan_idx)+"_speed_rpm") - if not output: - return 0 - - #mode = output['mode'] - output['status'] = output['status'].rstrip() - if output['status'].isalpha(): - return 0 - else: - speed = int(output['status']) - - return speed - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('psu') diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py old mode 100755 new mode 100644 index 1ca925610822..3e195a36f6cb --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py @@ -1,236 +1,243 @@ -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import time - from ctypes import create_string_buffer + import os + import traceback from sonic_sfp.sfputilbase import SfpUtilBase except ImportError as e: - raise ImportError(str(e) + "- required module not found") - + raise ImportError("%s - required module not found" % str(e)) class SfpUtil(SfpUtilBase): - """Platform generic PDDF SfpUtil class""" + """Platform-specific SfpUtil class""" + + PORT_START = 1 + PORT_END = 56 + PORTS_IN_BLOCK = 57 + + EEPROM_OFFSET = 32 + SFP_DEVICE_TYPE = "optoe2" + QSFP_DEVICE_TYPE = "optoe1" + I2C_MAX_ATTEMPT = 3 _port_to_eeprom_mapping = {} - _port_start = 0 - _port_end = 0 - _port_to_type_mapping = {} - _qsfp_ports = [] - _sfp_ports = [] + port_to_i2cbus_mapping ={} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(49, self.PORTS_IN_BLOCK) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping def __init__(self): + for x in range(self.PORT_START, self.PORTS_IN_BLOCK): + self.port_to_i2cbus_mapping[x] = x + self.EEPROM_OFFSET - 1 SfpUtilBase.__init__(self) - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - self._port_start = 0 - self._port_end = self.get_num_ports() - - for port_num in range(self._port_start, self._port_end): - device = "PORT" + "%d" % (port_num+1) - port_eeprom_path = pddf_obj.get_path(device, "eeprom") - self._port_to_eeprom_mapping[port_num] = port_eeprom_path - port_type = pddf_obj.get_device_type(device) - self._port_to_type_mapping[port_num] = port_type - self.populate_port_type(port_num) - - def get_num_ports(self): - return int(self.platform['num_ports']) - - def is_valid_port(self, port_num): - if port_num < self._port_start or port_num > self._port_end: + + def _sfp_read_file_path(self, file_path, offset, num_bytes): + attempts = 0 + while attempts < self.I2C_MAX_ATTEMPT: + try: + file_path.seek(offset) + read_buf = file_path.read(num_bytes) + except Exception: + attempts += 1 + time.sleep(0.05) + return True, read_buf + return False, None + + def _sfp_eeprom_present(self, sysfs_sfp_i2c_client_eeprompath, offset): + """Tries to read the eeprom file to determine if the + device/sfp is present or not. If sfp present, the read returns + valid bytes. If not, read returns error 'Connection timed out""" + + if not os.path.exists(sysfs_sfp_i2c_client_eeprompath): return False + with open(sysfs_sfp_i2c_client_eeprompath, "rb", buffering=0) as sysfsfile: + rv, buf = self._sfp_read_file_path(sysfsfile, offset, 1) + return rv + + def _add_new_sfp_device(self, sysfs_sfp_i2c_adapter_path, devaddr, devtype): + try: + sysfs_nd_path = "%s/new_device" % sysfs_sfp_i2c_adapter_path + + # Write device address to new_device file + nd_str = "%s %s" % (devtype, hex(devaddr)) + with open(sysfs_nd_path, "w") as nd_file: + nd_file.write(nd_str) + + except Exception as err: + print("Error writing to new device file: %s" % str(err)) + return 1 else: - return True + return 0 - def get_presence(self, port_num): - if port_num < self._port_start or port_num > self._port_end: - return False + def _get_port_eeprom_path(self, port_num, devid): + sysfs_i2c_adapter_base_path = "" - device = "PORT" + "%d" % (port_num+1) - output = pddf_obj.get_attr_name_output(device, 'xcvr_present') - if not output: - return False + if port_num in self.port_to_eeprom_mapping: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[port_num] + else: + sysfs_i2c_adapter_base_path = "/sys/class/i2c-adapter" + + i2c_adapter_id = self._get_port_i2c_adapter_id(port_num) + if i2c_adapter_id is None: + print("Error getting i2c bus num") + return None + + # Get i2c virtual bus path for the sfp + sysfs_sfp_i2c_adapter_path = "%s/i2c-%s" % (sysfs_i2c_adapter_base_path, + str(i2c_adapter_id)) + + # If i2c bus for port does not exist + if not os.path.exists(sysfs_sfp_i2c_adapter_path): + print("Could not find i2c bus %s. Driver not loaded?" % sysfs_sfp_i2c_adapter_path) + return None + + sysfs_sfp_i2c_client_path = "%s/%s-00%s" % (sysfs_sfp_i2c_adapter_path, + str(i2c_adapter_id), + hex(devid)[-2:]) + + # If sfp device is not present on bus, Add it + if not os.path.exists(sysfs_sfp_i2c_client_path): + if port_num in self.qsfp_ports: + ret = self._add_new_sfp_device( + sysfs_sfp_i2c_adapter_path, devid, self.QSFP_DEVICE_TYPE) + else: + ret = self._add_new_sfp_device( + sysfs_sfp_i2c_adapter_path, devid, self.SFP_DEVICE_TYPE) + if ret != 0: + print("Error adding sfp device") + return None - #mode = output['mode'] - modpres = output['status'].rstrip() - if 'XCVR' in plugin_data: - if 'xcvr_present' in plugin_data['XCVR']: - ptype = self._port_to_type_mapping[port_num] - vtype = 'valmap-'+ptype - if vtype in plugin_data['XCVR']['xcvr_present']: - vmap = plugin_data['XCVR']['xcvr_present'][vtype] - if modpres in vmap: - return vmap[modpres] - else: - return False - # if plugin_data doesn't specify anything regarding Transceivers - if modpres == '1': - return True + sysfs_sfp_i2c_client_eeprom_path = "%s/eeprom" % sysfs_sfp_i2c_client_path - return False + return sysfs_sfp_i2c_client_eeprom_path - def populate_port_type(self, port): - if self._port_to_type_mapping[port] == 'QSFP' or self._port_to_type_mapping[port] == 'QSFP28': - self._qsfp_ports.append(port) - elif self._port_to_type_mapping[port] == 'SFP' or self._port_to_type_mapping[port] == 'SFP28': - self._sfp_ports.append(port) + def _read_eeprom_specific_bytes(self, sysfsfile_eeprom, offset, num_bytes): + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") - @property - def port_start(self): - return self._port_start + rv, raw = self._sfp_read_file_path(sysfsfile_eeprom, offset, num_bytes) + if rv is False: + return None - @property - def port_end(self): - return (self._port_end - 1) + try: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + except Exception: + return None - @property - def port_to_eeprom_mapping(self): - return self._port_to_eeprom_mapping + return eeprom_raw - @property - def qsfp_ports(self): - return self._qsfp_ports + def get_eeprom_dom_raw(self, port_num): + if port_num in self.qsfp_ports: + # QSFP DOM EEPROM is also at addr 0x50 and thus also stored in eeprom_ifraw + return None + # Read dom eeprom at addr 0x51 + return self._read_eeprom_devid(port_num, self.IDENTITY_EEPROM_ADDR, 256) - def reset(self, port_num): - if port_num < self._port_start or port_num > self._port_end: + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: return False - device = "PORT" + "%d" % (port_num+1) - port_ps = pddf_obj.get_path(device, "xcvr_reset") - if port_ps is None: - return False + presence_path = "/sys/wb_plat/sff/sff%d/present" % port_num try: - reg_file = open(port_ps, 'w') - except IOError as e: - print("Error: unable to open file: %s" % str(e)) + with open(presence_path, "rb") as data: + presence_data = data.read(2) + if presence_data == "": + return False + result = int(presence_data, 16) + except IOError: return False - try: - reg_file.seek(0) - reg_file.write('1') - time.sleep(1) - reg_file.seek(0) - reg_file.write('0') - reg_file.close() + if result == 1: return True - except IOError as e: - return False + return False def get_low_power_mode(self, port_num): # Check for invalid port_num - if port_num < self._port_start or port_num > self._port_end: - return False - if not self.get_presence(port_num): + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: return False - device = "PORT" + "%d" % (port_num+1) - output = pddf_obj.get_attr_name_output(device, 'xcvr_lpmode') - if not output: - if port_num not in self.qsfp_ports: - return False # Read from eeprom only for QSFP ports - try: - eeprom = None - eeprom = open(self.port_to_eeprom_mapping[port_num], "rb") - # check for valid connector type - eeprom.seek(2) - ctype = eeprom.read(1) - if ctype in ['21', '23']: - return False + return True - eeprom.seek(93) - lpmode = ord(eeprom.read(1)) + def get_transceiver_change_event(self, timeout=0): + return False, {} - if ((lpmode & 0x3) == 0x3): - return True # Low Power Mode if "Power override" bit is 1 and "Power set" bit is 1 - else: - # High Power Mode if one of the following conditions is matched: - # 1. "Power override" bit is 0 - # 2. "Power override" bit is 1 and "Power set" bit is 0 - return False - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom is not None: - eeprom.close() - time.sleep(0.01) - else: - #mode = output['mode'] - status = int(output['status'].rstrip()) + def get_highest_temperature(self): + offset = 0 + hightest_temperature = -9999 - if status == 1: - return True - else: - return False + presence_flag = False + read_eeprom_flag = False + temperature_valid_flag = False - def set_low_power_mode(self, port_num, lpmode): - # Check for invalid port_num - if port_num < self._port_start or port_num > self._port_end: - return False + for port in range(49, self.PORTS_IN_BLOCK): + if self.get_presence(port) is False: + continue - if not self.get_presence(port_num): - return False # Port is not present, unable to set the eeprom + presence_flag = True - device = "PORT" + "%d" % (port_num+1) - port_ps = pddf_obj.get_path(device, "xcvr_lpmode") - if port_ps is None: - if port_num not in self.qsfp_ports: - return False # Write to eeprom only for QSFP ports - try: - eeprom = None - eeprom = open(self.port_to_eeprom_mapping[port_num], "r+b") - # check for valid connector type - eeprom.seek(2) - ctype = eeprom.read(1) - if ctype in ['21', '23']: - return False + if port in self.qsfp_ports: + offset = 22 + else: + offset = 96 - # Fill in write buffer - regval = 0x3 if lpmode else 0x1 # 0x3:Low Power Mode, 0x1:High Power Mode - buffer = create_string_buffer(1) - buffer[0] = chr(regval) - - # Write to eeprom - eeprom.seek(93) - eeprom.write(buffer[0]) - return True - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom is not None: - eeprom.close() - time.sleep(0.01) - else: + eeprom_path = self._get_port_eeprom_path(port, 0x50) try: - f = open(port_ps, 'w') - if lpmode: - f.write('1') - else: - f.write('0') - f.close() - return True - except IOError as e: - return False - - def get_transceiver_change_event(self): - """ - TODO: This function need to be implemented - when decide to support monitoring SFP(Xcvrd) - on this platform. - """ - raise NotImplementedError - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('xcvr') + with open(eeprom_path, mode="rb", buffering=0) as eeprom: + read_eeprom_flag = True + eeprom_raw = self._read_eeprom_specific_bytes(eeprom, offset, 2) + msb = int(eeprom_raw[0], 16) + lsb = int(eeprom_raw[1], 16) + + result = (msb << 8) | (lsb & 0xff) + result = float(result / 256.0) + if -50 <= result <= 200: + temperature_valid_flag = True + hightest_temperature = max(hightest_temperature, result) + except Exception: + print(traceback.format_exc()) + + # all port not presence + if presence_flag is False: + hightest_temperature = -10000 + + # all port read eeprom fail + elif read_eeprom_flag is False: + hightest_temperature = -9999 + + # all port temperature invalid + elif read_eeprom_flag is True and temperature_valid_flag is False: + hightest_temperature = -10000 + + hightest_temperature = round(hightest_temperature, 2) + + return hightest_temperature diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py new file mode 100755 index 000000000000..89d3ccd770bd --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py @@ -0,0 +1,311 @@ +# +# ssd_util.py +# +# Generic implementation of the SSD health API +# SSD models supported: +# - InnoDisk +# - StorFly +# - Virtium + +try: + import re + import os + import subprocess + from sonic_platform_base.sonic_ssd.ssd_base import SsdBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +SMARTCTL = "smartctl {} -a" +INNODISK = "iSmart -d {}" +VIRTIUM = "SmartCmd -m {}" +DISK_LIST_CMD = "fdisk -l -o Device" +DISK_FREE_CMD = "df -h" +MOUNT_CMD = "mount" + +NOT_AVAILABLE = "N/A" +PE_CYCLE = 3000 +FAIL_PERCENT = 95 + +# Set Vendor Specific IDs +INNODISK_HEALTH_ID = 169 +INNODISK_TEMPERATURE_ID = 194 + +class SsdUtil(SsdBase): + """ + Generic implementation of the SSD health API + """ + model = NOT_AVAILABLE + serial = NOT_AVAILABLE + firmware = NOT_AVAILABLE + temperature = NOT_AVAILABLE + health = NOT_AVAILABLE + remaining_life = NOT_AVAILABLE + sata_rate = NOT_AVAILABLE + ssd_info = NOT_AVAILABLE + vendor_ssd_info = NOT_AVAILABLE + + def __init__(self, diskdev): + self.vendor_ssd_utility = { + "Generic" : { "utility" : SMARTCTL, "parser" : self.parse_generic_ssd_info }, + "InnoDisk" : { "utility" : INNODISK, "parser" : self.parse_innodisk_info }, + "M.2" : { "utility" : INNODISK, "parser" : self.parse_innodisk_info }, + "StorFly" : { "utility" : VIRTIUM, "parser" : self.parse_virtium_info }, + "Virtium" : { "utility" : VIRTIUM, "parser" : self.parse_virtium_info } + } + + """ + The dict model_attr keys relate the vendors + LITEON : "ER2-GD","AF2MA31DTDLT" + Intel : "SSDSCKKB" + SMI : "SM619GXC" + samsung: "MZNLH" + ADATA : "IM2S3134N" + """ + self.model_attr = { + "ER2-GD" : { "temperature" : "\n190\s+(.+?)\n", "remainingLife" : "\n202\s+(.+?)\n" }, + "AF2MA31DTDLT" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n202\s+(.+?)\n" }, + "SSDSCK" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n233\s+(.+?)\n" }, + "SM619GXC" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n169\s+(.+?)\n" }, + "MZNLH" : { "temperature" : "\n190\s+(.+?)\n", "remainingLife" : "\n245\s+(.+?)\n" }, + "IM2S3134N" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n231\s+(.+?)\n" } + } + + self.key_list = list(self.model_attr.keys()) + self.attr_info_rule = "[\s\S]*SMART Attributes Data Structure revision number: 1|SMART Error Log Version[\s\S]*" + self.dev = diskdev + # Generic part + self.fetch_generic_ssd_info(diskdev) + self.parse_generic_ssd_info() + self.fetch_vendor_ssd_info(diskdev, "Generic") + + # Known vendor part + if self.model: + model_short = self.model.split()[0] + if model_short in self.vendor_ssd_utility: + self.fetch_vendor_ssd_info(diskdev, model_short) + self.parse_vendor_ssd_info(model_short) + else: + # No handler registered for this disk model + pass + else: + # Failed to get disk model + self.model = "Unknown" + + def _execute_shell(self, cmd): + process = subprocess.Popen(cmd.split(), universal_newlines=True, stdout=subprocess.PIPE) + output, error = process.communicate() + exit_code = process.returncode + if exit_code: + return None + return output + + def _parse_re(self, pattern, buffer): + res_list = re.findall(pattern, str(buffer)) + return res_list[0] if res_list else NOT_AVAILABLE + + def fetch_generic_ssd_info(self, diskdev): + self.ssd_info = self._execute_shell(self.vendor_ssd_utility["Generic"]["utility"].format(diskdev)) + + # Health and temperature values may be overwritten with vendor specific data + def parse_generic_ssd_info(self): + if "nvme" in self.dev: + self.model = self._parse_re('Model Number:\s*(.+?)\n', self.ssd_info) + + health_raw = self._parse_re('Percentage Used\s*(.+?)\n', self.ssd_info) + if health_raw == NOT_AVAILABLE: + self.health = NOT_AVAILABLE + else: + health_raw = health_raw.split()[-1] + self.health = 100 - float(health_raw.strip('%')) + + temp_raw = self._parse_re('Temperature\s*(.+?)\n', self.ssd_info) + if temp_raw == NOT_AVAILABLE: + self.temperature = NOT_AVAILABLE + else: + temp_raw = temp_raw.split()[-2] + self.temperature = float(temp_raw) + else: + self.model = self._parse_re('Device Model:\s*(.+?)\n', self.ssd_info) + model_key = "" + for key in self.key_list: + if re.search(key, self.model): + model_key = key + break + if model_key != "": + self.remaining_life = self._parse_re(self.model_attr[model_key]["remainingLife"], re.sub(self.attr_info_rule,"",self.ssd_info)).split()[2] + self.temperature = self._parse_re(self.model_attr[model_key]["temperature"], re.sub(self.attr_info_rule,"",self.ssd_info)).split()[8] + self.health = self.remaining_life + # Get the LITEON ssd health value by (PE CYCLE - AVG ERASE CYCLE )/(PE CYCLE) + if model_key in ["ER2-GD", "AF2MA31DTDLT"]: + avg_erase = int(self._parse_re('\n173\s+(.+?)\n' ,re.sub(self.attr_info_rule,"",self.ssd_info)).split()[-1]) + self.health = int(round((PE_CYCLE - avg_erase)/PE_CYCLE*100,0)) + if self.remaining_life != NOT_AVAILABLE and int(self.remaining_life) < FAIL_PERCENT: + self.remaining_life = "Fail" + self.sata_rate = self._parse_re('SATA Version is:.*current: (.+?)\)\n', self.ssd_info) + self.serial = self._parse_re('Serial Number:\s*(.+?)\n', self.ssd_info) + self.firmware = self._parse_re('Firmware Version:\s*(.+?)\n', self.ssd_info) + + def parse_innodisk_info(self): + if self.vendor_ssd_info: + self.health = self._parse_re('Health:\s*(.+?)%', self.vendor_ssd_info) + self.temperature = self._parse_re('Temperature\s*\[\s*(.+?)\]', self.vendor_ssd_info) + else: + if self.health == NOT_AVAILABLE: + health_raw = self.parse_id_number(INNODISK_HEALTH_ID) + self.health = health_raw.split()[-1] + if self.temperature == NOT_AVAILABLE: + temp_raw = self.parse_id_number(INNODISK_TEMPERATURE_ID) + self.temperature = temp_raw.split()[-6] + + def parse_virtium_info(self): + if self.vendor_ssd_info: + self.temperature = self._parse_re('Temperature_Celsius\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info) + nand_endurance = self._parse_re('NAND_Endurance\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info) + avg_erase_count = self._parse_re('Average_Erase_Count\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info) + try: + self.health = 100 - (float(avg_erase_count) * 100 / float(nand_endurance)) + except (ValueError, ZeroDivisionError): + # Invalid avg_erase_count or nand_endurance. + pass + + def fetch_vendor_ssd_info(self, diskdev, model): + self.vendor_ssd_info = self._execute_shell(self.vendor_ssd_utility[model]["utility"].format(diskdev)) + + def parse_vendor_ssd_info(self, model): + self.vendor_ssd_utility[model]["parser"]() + + def check_readonly2(self, partition, filesystem): + # parse mount cmd output info + mount_info = self._execute_shell(MOUNT_CMD) + for line in mount_info.split('\n'): + column_list = line.split() + if line == '': + continue + if column_list[0] == partition and column_list[2] == filesystem: + if column_list[5].split(',')[0][1:] == "ro": + return partition + else: + return NOT_AVAILABLE + return NOT_AVAILABLE + + def check_readonly(self, partition, filesystem): + ret = os.access(filesystem, os.W_OK) + if ret == False: + return partition + else: + return NOT_AVAILABLE + + def get_health(self): + """ + Retrieves current disk health in percentages + + Returns: + A float number of current ssd health + e.g. 83.5 + """ + return float(self.health) + + def get_temperature(self): + """ + Retrieves current disk temperature in Celsius + + Returns: + A float number of current temperature in Celsius + e.g. 40.1 + """ + return float(self.temperature) + + def get_model(self): + """ + Retrieves model for the given disk device + + Returns: + A string holding disk model as provided by the manufacturer + """ + return self.model + + def get_firmware(self): + """ + Retrieves firmware version for the given disk device + + Returns: + A string holding disk firmware version as provided by the manufacturer + """ + return self.firmware + + def get_serial(self): + """ + Retrieves serial number for the given disk device + + Returns: + A string holding disk serial number as provided by the manufacturer + """ + return self.serial + def get_sata_rate(self): + """ + Retrieves SATA rate for the given disk device + Returns: + A string holding current SATA rate as provided by the manufacturer + """ + return self.sata_rate + def get_remaining_life(self): + """ + Retrieves remaining life for the given disk device + Returns: + A string holding disk remaining life as provided by the manufacturer + """ + return self.remaining_life + def get_vendor_output(self): + """ + Retrieves vendor specific data for the given disk device + + Returns: + A string holding some vendor specific disk information + """ + return self.vendor_ssd_info + + def parse_id_number(self, id): + return self._parse_re('{}\s*(.+?)\n'.format(id), self.ssd_info) + + def get_readonly_partition(self): + """ + Check the partition mount filesystem is readonly status,then output the result. + Returns: + The readonly partition list + """ + + ro_partition_list = [] + partition_list = [] + + # parse fdisk cmd output info + disk_info = self._execute_shell(DISK_LIST_CMD) + begin_flag = False + for line in disk_info.split('\n'): + if line == "Device": + begin_flag = True + continue + if begin_flag: + if line != "": + partition_list.append(line) + else: + break + + # parse df cmd output info + disk_free = self._execute_shell(DISK_FREE_CMD) + disk_dict = {} + line_num = 0 + for line in disk_free.split('\n'): + line_num = line_num + 1 + if line_num == 1 or line == "": + continue + column_list = line.split() + disk_dict[column_list[0]] = column_list[5] + + # get partition which is readonly + for partition in partition_list: + if partition in disk_dict: + ret = self.check_readonly(partition, disk_dict[partition]) + if (ret != NOT_AVAILABLE): + ro_partition_list.append(ret) + + return ro_partition_list diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py deleted file mode 100755 index af4dd5915361..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py +++ /dev/null @@ -1,82 +0,0 @@ -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json - - -class SYSStatusUtil(): - """Platform-specific SYSStatus class""" - - def __init__(self): - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - - def get_board_info(self): - device = "SYSSTATUS" - node = pddf_obj.get_path(device, "board_info") - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("board_info : %s" % status) - except IOError: - return False - - def get_cpld_versio(self): - device = "SYSSTATUS" - node = pddf_obj.get_path(device, "cpld1_version") - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("cpld1_version : %s" % status) - except IOError: - return False - - def get_power_module_status(self): - device = "SYSSTATUS" - node = pddf_obj.get_path(device, "power_module_status") - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("power_module_status : %s" % status) - except IOError: - return False - - def get_system_reset_status(self): - device = "SYSSTATUS" - for i in range(1, 8): - node = pddf_obj.get_path(device, "system_reset"+str(i)) - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("system_reset%s : %s" % (i, status)) - except IOError: - print("system_reset%s not supported" % i) - - def get_misc_status(self): - device = "SYSSTATUS" - for i in range(1, 3): - node = pddf_obj.get_path(device, "misc"+str(i)) - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("misc%s : %s" % (i, status)) - except IOError: - print("system_reset%s not supported" % i) - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('sys-status') diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py deleted file mode 100755 index 6aef47b7e924..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py +++ /dev/null @@ -1,75 +0,0 @@ -import os.path -import sys -import json -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse - - -class ThermalUtil: - def __init__(self): - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - self.num_thermals = self.platform['num_temps'] - self.info = [] - - def get_num_thermals(self): - return (self.num_thermals) - - def get_thermal_info(self): - list = [] - pddf_obj.get_device_list(list, "TEMP_SENSOR") - list.sort() - for dev in list: - data = {} - device_name = dev['dev_info']['device_name'] - topo_info = dev['i2c']['topo_info'] - label = "%s-i2c-%d-%x" % (topo_info['dev_type'], - int(topo_info['parent_bus'], 0), int(topo_info['dev_addr'], 0)) - attr_list = dev['i2c']['attr_list'] - data['device_name'] = device_name - data['label'] = label - for attr in attr_list: - attr_name = attr['attr_name'] - node = pddf_obj.get_path(device_name, attr_name) - if node is None: - return False - try: - with open(node, 'r') as f: - attr_value = int(f.read()) - except IOError: - return False - data[attr_name] = attr_value/float(1000) - self.info.append(data) - - def show_thermal_temp_values(self, idx): - if idx < 1 or idx > self.num_thermals: - print("Invalid temperature sensor idx %d" % idx) - return None - self.get_thermal_info() - thermal_name = "TEMP"+"%d" % idx - label = "" - value = "" - for temp in self.info: - if thermal_name == temp['device_name']: - label = temp['label'] - value = "temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" % ( - temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst']) - else: - continue - - return (label, value) - - def show_temp_values(self): - self.get_thermal_info() - for temp in self.info: - print(temp['label']) - print("temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" % - (temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst'])) - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('temp-sensors') diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json index 50c21289d260..94592fa8cebc 100644 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json @@ -1,3 +1,3 @@ -{ - "skip_ledd": true -} +{ + "skip_ledd": true +} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf deleted file mode 100755 index 9b0569d1541d..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf +++ /dev/null @@ -1,21 +0,0 @@ -# libsensors configuration file -# ---------------------------------------------- -# - -bus "i2c-2" "i2c-0-mux (chan_id 0)" - -chip "lm75-i2c-2-48" - label temp1 "LM75_0 air_inlet" - set temp1_max 80 - set temp1_max_hyst 75 - -chip "lm75-i2c-2-49" - label temp1 "LM75_1 air_outlet" - set temp1_max 80 - set temp1_max_hyst 75 - -chip "lm75-i2c-2-4a" - label temp1 "LM75_2 hottest" - set temp1_max 80 - set temp1_max_hyst 75 - diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json deleted file mode 100644 index c5ea46918ff2..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "eeprom": {"bus": 2, "loc": "0057"} -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json deleted file mode 100644 index 35f4b4586447..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "components": [ - { - "name": "CPLD1 (MAC Board A)", - "firmware_version": { - "bus": 2, - "addr": 51, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 0 - }, - { - "name": "CPLD2 (MAC Board B)", - "firmware_version": { - "bus": 2, - "addr": 53, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 0 - }, - { - "name": "CPLD3 (CONNECT Board A)", - "firmware_version": { - "bus": 2, - "addr": 55, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 0 - }, - { - "name": "CPLD4 (CPU Board)", - "firmware_version": { - "bus": 0, - "addr": 13, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 1 - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json deleted file mode 100644 index de7030ec1f90..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "fans": [ - { - "name": "fan1", - "e2loc": {"bus": 3, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 0 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 0 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/3-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/3-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan0_led", - "format": 6, - "mask": 11 - }, - "led_colors": { - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan1_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - }, - { - "name": "fan2", - "e2loc": {"bus": 4, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 1 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 1 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/4-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/4-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan1_led", - "format": 6, - "mask": 11 - }, - "led_colors": { - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan2_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - }, - { - "name": "fan3", - "e2loc": {"bus": 3, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 2 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 2 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/5-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/5-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan2_led", - "format": 6, - "mask": 11 - }, - "led_colors": { - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan3_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - }, - { - "name": "fan4", - "e2loc": {"bus": 3, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 3 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 3 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/6-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/6-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan3_led", - "format": 6, - "mask": 11 - }, - "led_colors":{ - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan4_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json deleted file mode 100644 index c807b51fc4b6..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "psus": [ - { - "name": "psu1", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 0 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 1 - }, - "sn": {"loc": "/sys/bus/i2c/devices/7-0050/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr1_input", - "format": 4 - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in1_input", - "format": 4 - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in2_input", - "format": 4 - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr2_input", - "format": 4 - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/temp1_input", - "format": 4 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/7-0050/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/7-0050/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_fault" - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 1 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_input" - }, - "speed_max": 28000 - } - ] - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power1_input", - "format": 5 - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power2_input", - "format": 5 - } - }, - { - "name": "psu2", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 4 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 5 - }, - "sn": {"loc": "/sys/bus/i2c/devices/8-0053/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr1_input", - "format": 4 - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in1_input", - "format": 4 - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in2_input", - "format": 4 - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr2_input", - "format": 4 - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/temp1_input", - "format": 4 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/8-0053/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/8-0053/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_fault" - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 5 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_input" - }, - "speed_max": 28000 - } - ] - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power1_input", - "format": 5 - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power2_input", - "format": 5 - } - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json deleted file mode 100644 index 319336673534..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json +++ /dev/null @@ -1,130 +0,0 @@ -{"thermals": [ - { - "name": "INLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": null, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_input", - "format": 4 - } - }, - { - "name": "OUTLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": null, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_input", - "format": 4 - } - }, - { - "name": "BOARD TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": null, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_input", - "format": 4 - } - }, - { - "name": "PHYSICAL ID 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp1_input", - "format": 4 - } - }, - { - "name": "CPU CORE 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp2_input", - "format": 4 - } - }, - { - "name": "CPU CORE 1", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp3_input", - "format": 4 - } - }, - { - "name": "CPU CORE 2", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp4_input", - "format": 4 - } - }, - { - "name": "CPU CORE 3", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp5_input", - "format": 4 - } - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf_support b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/system_health_monitoring_config.json old mode 100644 new mode 100755 similarity index 100% rename from device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf_support rename to device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/system_health_monitoring_config.json diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py deleted file mode 100644 index 38e9ff6aa0c9..000000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: UTF-8 -*- -""" -* onboard temperature sensors -* FAN trays -* PSU -""" -import time -import datetime -from monitor import status - -def doWork(): - a=[]; - ''' - return: [{'status': '1', 'hw_version': '1.00', 'errcode': 0, 'fan_type': 'M6510-FAN-F', 'errmsg': 'OK', 'Speed': '9778', 'id': 'fan1', 'present': '0', 'sn': '1000000000014'}, - {'id': 'fan2', 'errmsg': 'not present', 'errcode': -1}, - {'id': 'fan3', 'errmsg': 'not present', 'errcode': -1}, - {'id': 'fan4', 'errmsg': 'not present', 'errcode': -1} - ] - description: 1.get id - 2.errcode equal 0 : dev normal - not equal 0 : get errmsg - 3.other message add when all check success - ''' - status.checkFan(a) - #status.getTemp(a) - #status.getPsu(a) - - nowTime=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') - print(nowTime) - print(a) -def run(interval): - while True: - try: - time_remaining = interval - time.time()%interval - time.sleep(time_remaining) - doWork() - except Exception as e: - print(e) - -if __name__ == '__main__': - interval = 1 - run(interval) diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 82c96104a015..d4289fd4e2bd 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -78,9 +78,6 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELTA_AGC032_PLATFORM_MODULE) \ $(RUIJIE_B6510_48VS8CQ_PLATFORM_MODULE) \ $(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE) \ - $(RAGILE_RA_B6910_64C_PLATFORM_MODULE) \ - $(RAGILE_RA_B6510_32C_PLATFORM_MODULE) \ - $(RAGILE_RA_B6920_4S_PLATFORM_MODULE) \ $(NOKIA_IXR7250_PLATFORM_MODULE) \ $(TENCENT_TCS8400_PLATFORM_MODULE) \ $(TENCENT_TCS9400_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-ragile.mk b/platform/broadcom/platform-modules-ragile.mk index 12236b1e72ce..b0cc3b91b2a0 100644 --- a/platform/broadcom/platform-modules-ragile.mk +++ b/platform/broadcom/platform-modules-ragile.mk @@ -10,25 +10,25 @@ SONIC_DPKG_DEBS += $(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE) SONIC_STRETCH_DEBS += $(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE) ## RA-B6910-64C -RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION = 1.0 -export RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION +## RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION = 1.0 +## export RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION -RAGILE_RA_B6910_64C_PLATFORM_MODULE = platform-modules-ragile-ra-b6910-64c_$(RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION)_amd64.deb -$(RAGILE_RA_B6910_64C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6910-64c-r0 -$(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6910_64C_PLATFORM_MODULE))) +## RAGILE_RA_B6910_64C_PLATFORM_MODULE = platform-modules-ragile-ra-b6910-64c_$(RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION)_amd64.deb +## $(RAGILE_RA_B6910_64C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6910-64c-r0 +## $(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6910_64C_PLATFORM_MODULE))) ## RA-B6510-32C -RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION = 1.0 -export RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION +## RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION = 1.0 +## export RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION -RAGILE_RA_B6510_32C_PLATFORM_MODULE = platform-modules-ragile-ra-b6510-32c_$(RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION)_amd64.deb -$(RAGILE_RA_B6510_32C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6510-32c-r0 -$(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6510_32C_PLATFORM_MODULE))) +## RAGILE_RA_B6510_32C_PLATFORM_MODULE = platform-modules-ragile-ra-b6510-32c_$(RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION)_amd64.deb +## $(RAGILE_RA_B6510_32C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6510-32c-r0 +## $(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6510_32C_PLATFORM_MODULE))) ## RA-B6920-4s -RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION = 1.0 -export RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION +## RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION = 1.0 +## export RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION -RAGILE_RA_B6920_4S_PLATFORM_MODULE = platform-modules-ragile-ra-b6920-4s_$(RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION)_amd64.deb -$(RAGILE_RA_B6920_4S_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6920-4s-r0 -$(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6920_4S_PLATFORM_MODULE))) +## RAGILE_RA_B6920_4S_PLATFORM_MODULE = platform-modules-ragile-ra-b6920-4s_$(RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION)_amd64.deb +## $(RAGILE_RA_B6920_4S_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6920-4s-r0 +## $(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6920_4S_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-ragile/LICENSE b/platform/broadcom/sonic-platform-modules-ragile/LICENSE old mode 100755 new mode 100644 index d37122689f3e..5681cac34476 --- a/platform/broadcom/sonic-platform-modules-ragile/LICENSE +++ b/platform/broadcom/sonic-platform-modules-ragile/LICENSE @@ -1,5 +1,4 @@ Copyright (C) 2016 Microsoft, Inc -Copyright (C) 2018 Ragile Network Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/Makefile index 6daf3d2b2fd1..578d65b3bf3e 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/common/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/common/Makefile @@ -9,33 +9,34 @@ SUB_BUILD_DIR = $(PWD)/build DIR_KERNEL_SRC = $(PWD)/modules SCRIPT_DIR = $(PWD)/script SERVICE_DIR = $(PWD)/service -DEPMOD_CONF_DIR = $(PWD)/depmod_conf +BLACK_DRIVER_CONF_DIR = $(PWD)/modprobe_conf -KBUILD_EXTRA_SYMBOLS += $(DIR_KERNEL_SRC)/Module.symvers -export KBUILD_EXTRA_SYMBOLS +app_dir = $(PWD)/app +app_build_dir = $(app_dir)/build +modules_build_dir = $(DIR_KERNEL_SRC)/build INSTALL_MODULE_DIR = $(SUB_BUILD_DIR)/$(KERNEL_SRC)/$(INSTALL_MOD_DIR) INSTALL_SCRIPT_DIR = $(SUB_BUILD_DIR)/usr/local/bin INSTALL_SERVICE_DIR = $(SUB_BUILD_DIR)/lib/systemd/system -INSTALL_LIB_DIR = $(SUB_BUILD_DIR)/usr/lib/python3.7/dist-packages -INSTALL_DEPMOD_CONF = $(SUB_BUILD_DIR)/etc/depmod.d +INSTALL_LIB_DIR = $(SUB_BUILD_DIR)/usr/lib/python3/dist-packages +INSTALL_BLACK_DRIVER = $(SUB_BUILD_DIR)/etc/modprobe.d all: - $(MAKE) -C $(KERNEL_SRC)/build M=$(DIR_KERNEL_SRC) modules + $(MAKE) -C $(app_dir) + $(MAKE) -C $(DIR_KERNEL_SRC) @if [ ! -d ${INSTALL_MODULE_DIR} ]; then mkdir -p ${INSTALL_MODULE_DIR} ;fi @if [ ! -d ${INSTALL_SCRIPT_DIR} ]; then mkdir -p ${INSTALL_SCRIPT_DIR} ;fi @if [ ! -d ${INSTALL_SERVICE_DIR} ]; then mkdir -p ${INSTALL_SERVICE_DIR} ;fi @if [ ! -d ${INSTALL_LIB_DIR} ]; then mkdir -p ${INSTALL_LIB_DIR} ;fi @if [ -d $(PWD)/lib/ ]; then cp -r $(PWD)/lib/* ${INSTALL_LIB_DIR} ;fi - @if [ -d $(PWD)/lib/ ]; then cp -r $(PWD)/lib/* ${INSTALL_LIB_DIR2} ;fi - @if [ ! -d ${INSTALL_DEPMOD_CONF} ]; then mkdir -p ${INSTALL_DEPMOD_CONF} ;fi - cp -r $(DEPMOD_CONF_DIR)/* $(INSTALL_DEPMOD_CONF) - cp -r $(DIR_KERNEL_SRC)/*.ko $(INSTALL_MODULE_DIR) + @if [ -d $(PWD)/sonic_platform/ ]; then cp -rf $(PWD)/sonic_platform ${INSTALL_LIB_DIR} ;fi + cp -r $(app_build_dir)/module/*.ko $(INSTALL_MODULE_DIR) + cp -r $(modules_build_dir)/*.ko $(INSTALL_MODULE_DIR) + cp -r $(app_dir)/build/app/* $(INSTALL_SCRIPT_DIR) cp -r $(SCRIPT_DIR)/* $(INSTALL_SCRIPT_DIR) cp -r $(SERVICE_DIR)/* $(INSTALL_SERVICE_DIR) @if [ -d $(INSTALL_SCRIPT_DIR) ]; then chmod +x $(INSTALL_SCRIPT_DIR)/* ;fi + @if [ ! -d ${INSTALL_BLACK_DRIVER} ]; then mkdir -p ${INSTALL_BLACK_DRIVER} ;fi + cp -r $(BLACK_DRIVER_CONF_DIR)/* $(INSTALL_BLACK_DRIVER) clean: - rm -f ${DIR_KERNEL_SRC}/*.o ${DIR_KERNEL_SRC}/*.ko ${DIR_KERNEL_SRC}/*.mod.c ${DIR_KERNEL_SRC}/.*.cmd - rm -f ${DIR_KERNEL_SRC}/Module.markers ${DIR_KERNEL_SRC}/Module.symvers ${DIR_KERNEL_SRC}/modules.order - rm -rf ${DIR_KERNEL_SRC}/.tmp_versions rm -rf $(SUB_BUILD_DIR) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile new file mode 100644 index 000000000000..25ba3c5a9156 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile @@ -0,0 +1,25 @@ +pes_parent_dir:=$(shell pwd)/$(lastword $(MAKEFILE_LIST)) +pes_parent_dir:=$(shell dirname $(pes_parent_dir)) + +SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "build") print $$9}') +INC = -I./inc + +COMMON_OUT_PUT := $(shell pwd)/build +common_out_put_dir := $(COMMON_OUT_PUT)/app +common_module_dir := $(COMMON_OUT_PUT)/module/ +export common_out_put_dir common_module_dir + +all : CHECK $(SUBDIRS) +CHECK : + @echo $(pes_parent_dir) + +$(SUBDIRS):ECHO + #@echo $@ + make -C $@ + +ECHO: + @echo $(SUBDIRS) + +.PHONY : clean +clean : + -rm -rf $(COMMON_OUT_PUT) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile new file mode 100644 index 000000000000..e4078716eb33 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile @@ -0,0 +1,30 @@ +top_srcdir:=$(shell pwd) +#include $(top_srcdir)/Rules.mk +DIR=$(shell pwd) +BUILD_OUTPUT=$(DIR)/tmp +SRCS=$(wildcard *.c) +OBJS=$(patsubst %.c, $(BUILD_OUTPUT)/%.o, $(SRCS)) +DEPS=$(patsubst %.o, %.d, $(OBJS)) +CFLAGS+=-Wall -W -g -I$(DIR)/include +LDFLAGS= +PROGRAM=dfd_debug + +.PHONY: all + +all:$(OBJS) + $(CC) $(OBJS) $(LDFLAGS) -o $(BUILD_OUTPUT)/$(PROGRAM) + @if [ ! -d ${common_out_put_dir} ]; then mkdir -p ${common_out_put_dir} ;fi + cp -p $(BUILD_OUTPUT)/$(PROGRAM) $(common_out_put_dir) + +$(OBJS):$(SRCS) + @if [ ! -d ${BUILD_OUTPUT} ]; then mkdir -p ${BUILD_OUTPUT} ;fi + $(CC) -c $(CFLAGS) $(INCLUDE) $(*F).c -o $@ + +.PHONY: install +install: + @mkdir -p $(common_out_put_dir) + cp -p $(BUILD_OUTPUT)/$(PROGRAM) $(common_out_put_dir) + +rebuild: clean all +clean: + @rm -rf $(BUILD_OUTPUT)/* diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c new file mode 100644 index 000000000000..93ed6066efed --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "dfd_utest.h" + +int g_dfd_debug_sw = 0; +int g_dfd_debugpp_sw = 0; + +void dfd_debug_set_init(void) +{ + FILE *fp; + char buf[10]; + + mem_clear(buf, sizeof(buf)); + fp = fopen(DFD_DEBUGP_DEBUG_FILE, "r"); + if (fp != NULL) { + + g_dfd_debug_sw = 1; + fclose(fp); + } + + fp = fopen(DFD_DEBUGPP_DEBUG_FILE, "r"); + if (fp != NULL) { + + g_dfd_debugpp_sw = 1; + fclose(fp); + } + + return; +} + +int main(int argc, char* argv[]) +{ + dfd_debug_set_init(); + dfd_utest_cmd_main(argc, argv); + + return 0; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c new file mode 100644 index 000000000000..9c711830958e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c @@ -0,0 +1,1802 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "dfd_utest.h" + +#define DFD_UTEST_MAX_RDWR_NUM (256) +#define DFD_UTEST_DEFAULT_WR_NUM (1) + +#define DEV_MEM_NAME "/dev/mem" +#define DEV_KMEM_NAME "/dev/kmem" + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) +#define DFD_UTEST_MAX_BIT_WIDTH (4) + +#ifdef DFD_UTEST_ITEM +#undef DFD_UTEST_ITEM +#endif +#define DFD_UTEST_ITEM(_id, _type_str, _help_info, _help_info_detail) {_id, #_type_str, dfd_utest_##_type_str, _help_info, _help_info_detail}, +static dfd_utest_t g_dfd_unit_test[] = { + DFD_UTEST_ITEM_ALL +}; + +static int g_sys_page_size; +#define SYS_PAGE_SIZE g_sys_page_size +#define SYS_PAGE_MASK (~(SYS_PAGE_SIZE - 1)) + +void dfd_utest_print_cmd(int argc, char* argv[]) +{ + int i; + + for (i = 1; i < argc; i++) { + if (i != 1) { + printf(" "); + } + printf("%s", argv[i]); + } + return; +} + +void dfd_utest_print_all_help(void) +{ + int i, tbl_size; + + tbl_size = sizeof(g_dfd_unit_test) / sizeof(g_dfd_unit_test[0]); + + for (i = 0; i < tbl_size; i++) { + printf("%-20s\t\t\t%s\r\n", g_dfd_unit_test[i].type_str, g_dfd_unit_test[i].help_info); + } + + return; +} + +void dfd_utest_printf_single_help(int utest_type) +{ + int i, tbl_size; + + tbl_size = sizeof(g_dfd_unit_test) / sizeof(g_dfd_unit_test[0]); + for (i = 0; i < tbl_size; i++) { + if (g_dfd_unit_test[i].utest_type == utest_type) { + printf("%-20s\t\t\t%s\r\n", g_dfd_unit_test[i].type_str, g_dfd_unit_test[i].help_info_detail); + return; + } + } + + DFD_DEBUG_DBG("type: %d not match.\n", utest_type); + return; + +} + +void dfd_utest_printf_reg(uint8_t *buf, int buf_len, uint32_t offset_addr) +{ + int i, j, tmp; + + j = offset_addr % 16; + tmp = j; + offset_addr -= j; + printf("\n "); + + for (i = 0; i < 16; i++) { + printf("%2x ", i); + } + + for (i = 0; i < buf_len + j; i++) { + if ((i % 16) == 0) { + printf("\n0x%08x ", offset_addr); + offset_addr = offset_addr + 16; + } + if (tmp) { + printf(" "); + tmp--; + } else { + printf("%02x ", buf[i-j]); + } + } + + printf("\n"); + return; +} + +#define I2C_RETRIES 0x0701 +#define I2C_TIMEOUT 0x0702 +#define I2C_RDWR 0x0707 + +#define I2C_SLAVE 0x0703 /* Use this slave address */ + +#define I2C_SLAVE_FORCE 0x0706 /* Use this slave address, even if it + is already in use by a driver! */ +#define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ +#define I2C_SMBUS 0x0720 /* SMBus transfer */ + +struct i2c_msg +{ + unsigned short addr; + unsigned short flags; +#define I2C_M_TEN 0x0010 +#define I2C_M_RD 0x0001 + unsigned short len; + unsigned char *buf; +}; + +struct i2c_rdwr_ioctl_data +{ + struct i2c_msg *msgs; + int nmsgs; + +}; + +#define DFD_I2C_SHORT_ADDR_TYPE 0 +#define DFD_I2C_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define DFD_I2C_RETRY_TIME (50000 / DFD_I2C_RETRY_SLEEP_TIME) +/* i2c_smbus_xfer read or write markers */ +#define I2C_SMBUS_READ 1 +#define I2C_SMBUS_WRITE 0 + +/* SMBus transaction types (size parameter in the above functions) + Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ +#define I2C_SMBUS_QUICK 0 +#define I2C_SMBUS_BYTE 1 +#define I2C_SMBUS_BYTE_DATA 2 +#define I2C_SMBUS_WORD_DATA 3 +#define I2C_SMBUS_PROC_CALL 4 +#define I2C_SMBUS_BLOCK_DATA 5 +#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 +#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ +#define I2C_SMBUS_I2C_BLOCK_DATA 8 + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) +/* fix tjm */ + +#ifndef __ASSEMBLY__ +/* + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the + * header files exported to user space + */ +typedef __signed__ char __s8; +typedef unsigned char __u8; + +typedef __signed__ short __s16; +typedef unsigned short __u16; + +typedef __signed__ int __s32; +typedef unsigned int __u32; + +typedef __signed__ long __s64; +typedef unsigned long __u64; + +#endif /* __ASSEMBLY__ */ + +#else +/* do noting add tjm */ +#endif + +/* + * Data for SMBus Messages + */ +#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */ + /* and one more for user-space compatibility */ +}; + +/* This is the structure as used in the I2C_SMBUS ioctl call */ +struct i2c_smbus_ioctl_data { + __u8 read_write; + __u8 command; + __u32 size; + union i2c_smbus_data *data; +}; +int32_t dfd_read_port_i2c_one_time_smbus(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *recv_buf, int32_t size, int addr_type) +{ + union i2c_smbus_data data; + struct i2c_smbus_ioctl_data ioctl_data; + unsigned long addr = dev_addr; + int fd; + int rc; + int rv; + int i; + + mem_clear(&ioctl_data, sizeof(struct i2c_smbus_ioctl_data)); + if (i2c_name == NULL || recv_buf == NULL) { + DFD_DEBUG_ERROR("i2c_num = NULL, recv_buf = NULL\r\n"); + return -1; + } + + DFD_DEBUG_DBG("i2c name: %s, dev_addr: 0x%x, offset_addr: 0x%x, size: %d, addr_type: %d.\n", i2c_name, dev_addr, + offset_addr, size, addr_type); + + rv = 0; + fd = open(i2c_name, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + rv = fd; + goto err; + } + if (ioctl(fd, I2C_SLAVE_FORCE , addr) < 0) { + DFD_DEBUG_ERROR("ioctl 2C_SLAVE_FORCE %d.\n", errno); + rv =-1; + goto fail; + } + for (i = 0 ;i < size; i++) { + data.byte = 0; + ioctl_data.read_write = I2C_SMBUS_READ; + ioctl_data.command = (offset_addr + i); + ioctl_data.size = I2C_SMBUS_BYTE_DATA; + ioctl_data.data= &data; + + rc = ioctl(fd, I2C_SMBUS, &ioctl_data); + if (rc < 0) { + DFD_DEBUG_ERROR("read, I2C_SMBUS failed: %d.\n", errno); + rv = -1; + goto fail; + } + *(recv_buf + i) = data.byte; + } + fail: + close(fd); + err: + return rv; + +} + +int32_t dfd_read_port_i2c_one_time(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *recv_buf, int32_t size, int addr_type) +{ + + int32_t fd, rv; + struct i2c_rdwr_ioctl_data ioctl_data; + struct i2c_msg msgs[2]; + uint8_t buf[2]; + + if (i2c_name == NULL || recv_buf == NULL) { + DFD_DEBUG_ERROR("i2c_num = NULL, recv_buf = NULL\r\n"); + return -1; + } + + DFD_DEBUG_DBG("i2c name %s, dev_addr 0x%x, offset_addr 0x%x, size %d, addr_type %d.\n", i2c_name, dev_addr, + offset_addr, size, addr_type); + + rv = 0; + fd = open(i2c_name, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + return -1; + } + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(msgs, sizeof(msgs)); + mem_clear(buf, sizeof(buf)); + if (ioctl(fd, I2C_SLAVE, dev_addr) < 0) { + + DFD_DEBUG_ERROR("%s %dioctl fail(ret:%d, errno:%s)!\r\n", __func__ , __LINE__, rv, strerror(errno)); + rv = -1; + goto fail; + } + + buf[0] = (uint8_t)(offset_addr); + msgs[0].addr= dev_addr; + msgs[0].len= 2; + msgs[0].buf= buf; + msgs[1].addr= dev_addr; + msgs[1].flags|= I2C_M_RD; + msgs[1].len= 1; + msgs[1].buf= recv_buf; + ioctl_data.nmsgs= 1; + ioctl_data.msgs= msgs; + + rv = ioctl(fd, I2C_RDWR, &ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("%s %dioctl fail(ret:%d, errno:%s)!\r\n", __func__ , __LINE__, rv, strerror(errno)); + goto fail; + } + ioctl_data.msgs= &msgs[1]; + DFD_DEBUG_DBG("ioctlread, return :%d/n", ioctl(fd, I2C_RDWR, &ioctl_data)); + DFD_DEBUG_DBG("dfd_read_port_i2c addr: 0x%X, offset: 0x%X, value: 0x%X\n", dev_addr, offset_addr, *recv_buf); + fail: + close(fd); + return rv; + +} + +int32_t dfd_read_port_i2c(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *recv_buf, int32_t size) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_read_port_i2c_one_time_smbus(i2c_name, dev_addr, offset_addr, recv_buf, size, DFD_I2C_SHORT_ADDR_TYPE); + if (rv < 0) { + DFD_DEBUG_ERROR("(read times %d)i2c name %s, dev_addr 0x%X, offset_addr 0x%X, addr_type %d\n", i, i2c_name, dev_addr, offset_addr, DFD_I2C_SHORT_ADDR_TYPE); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +int32_t dfd_write_port_i2c_one_time(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *write_buf, int32_t size,int addr_type) +{ + int32_t fd, rv; + int index; + struct i2c_smbus_ioctl_data ioctl_data; + union i2c_smbus_data data; + uint8_t addr_buf[2]; + uint8_t write_buf_tmp[256]; + + if (i2c_name == NULL || write_buf == NULL ) { + DFD_DEBUG_ERROR("i2c_num = NULL \r\n"); + return -1; + } + + if (size <= 0) { + DFD_DEBUG_ERROR("error:size\n"); + return -1; + } + DFD_DEBUG_DBG("i2c name %s, dev_addr 0x%x, offset_addr 0x%x, size %d, addr_type %d\n",i2c_name, dev_addr, + offset_addr, size, addr_type); + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(addr_buf, sizeof(addr_buf)); + mem_clear(write_buf_tmp, sizeof(write_buf_tmp)); + + rv = 0; + + fd = open(i2c_name, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + return -1; + } + + if (ioctl(fd, I2C_SLAVE_FORCE, dev_addr) < 0) { + DFD_DEBUG_ERROR("ioctl, I2C_SLAVE failed: %d.\n", errno); + rv = -1; + goto fail; + } + + for (index = 0; index < size; index++) { + data.byte = *(write_buf + index); + ioctl_data.read_write = I2C_SMBUS_WRITE; + ioctl_data.command = (offset_addr + index); + ioctl_data.size = I2C_SMBUS_BYTE_DATA; + ioctl_data.data= &data; + rv = ioctl(fd, I2C_SMBUS, (unsigned long)&ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("ioctl fail(ret:%d, errno:%s %d) !\r\n", rv, strerror(errno),errno); + break; + } + DFD_DEBUG_DBG("ret:%d value:0x%02x\n", rv, data.byte); + usleep(5000); + } + +fail: + close(fd); + return rv; +} + +int32_t dfd_write_port_i2c(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *write_buf, int32_t size) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_write_port_i2c_one_time(i2c_name, dev_addr, offset_addr, write_buf,size, DFD_I2C_SHORT_ADDR_TYPE); + if (rv < 0) { + DFD_DEBUG_ERROR("(write times %d)i2c name %s, dev_addr 0x%X, offset_addr 0x%X, addr_type %d\n", + i, i2c_name, dev_addr, offset_addr, DFD_I2C_SHORT_ADDR_TYPE); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +static int dfd_read_io_port(uint16_t offset_addr, uint8_t *recv_buf, int32_t size) +{ + int fd; + int ret; + + fd = open("/dev/port", O_RDWR); + if (fd < 0) { + printf("open failed ret %d.\n", fd); + return -1; + } + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek failed ret %d.\n", ret); + goto exit; + } + + ret = read(fd, recv_buf, size); + if (ret != size) { + printf("read failed ret %d size %d.\n", ret, size); + ret = -1; + goto exit; + } + +exit: + close(fd); + return ret; +} + +static int dfd_write_io_port(uint16_t offset_addr, uint8_t *write_buf, int32_t size) +{ + int fd; + int ret; + + fd = open("/dev/port", O_RDWR); + if (fd < 0) { + printf("open failed ret %d.\n", fd); + return -1; + } + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek failed ret %d.\n", ret); + goto exit; + } + + ret = write(fd, write_buf, size); + if (ret != size) { + printf("write failed ret %d size %d.\n", ret, size); + ret = -1; + goto exit; + } + +exit: + close(fd); + return ret; +} + +static int dfd_process_mem(char *dev_name, char is_wr, char width, off_t offset, uint8_t *buf, int32_t size) +{ + int mfd, ret = 0; + void *base; + int i, j; + unsigned int val; + off_t map_offset; + size_t map_size; + + if (size & (width - 1)) { + printf("size %d invalid.\n", size); + return -1; + } + + mfd = open(dev_name, O_RDWR); + if (mfd < 0) { + printf("Cannot open %s.\n", dev_name); + return -1; + } + + g_sys_page_size = getpagesize(); + map_offset = offset & SYS_PAGE_MASK; + map_size = size + offset - map_offset; + base = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, map_offset); + if (base == MAP_FAILED) { + printf("mmap offset 0x%lx failed error(%s).\n", map_offset, strerror(errno)); + close(mfd); + return -1; + } + printf("width %d map_offset 0x%lx, offset 0x%lx, mmap base %p, g_sys_page_size %d\n", + width, map_offset, offset, base, g_sys_page_size); + + if (is_wr) { + for (i = 0; i < size; i = i + width) { + val = 0; + for (j = 0; j < width; j++) { + val |= buf[i + j] << (8 * j); + } + switch (width) { + case 1: + *((volatile unsigned char*)(base + i + offset - map_offset)) = val; + break; + case 2: + *((volatile unsigned short*)(base + i + offset - map_offset)) = val; + break; + case 4: + *((volatile unsigned int*)(base + i + offset - map_offset)) = val; + break; + default: + ret = -1; + printf("Not support width %d.\n", width); + goto exit; + } + } + } else { + for (i = 0; i < size; i = i + width) { + switch (width) { + case 1: + val = *((volatile unsigned char*)(base + i + offset - map_offset)); + break; + case 2: + val = *((volatile unsigned short*)(base + i + offset - map_offset)); + break; + case 4: + val = *((volatile unsigned int*)(base + i + offset - map_offset)); + break; + default: + ret = -1; + printf("Not support width %d.\n", width); + goto exit; + } + for (j = 0; j < width; j++) { + buf[i + j] = (val >> (8 * j)) & 0xff; + } + } + } +exit: + munmap(base, map_size); + close(mfd); + return ret; +} + +int32_t dfd_i2c_gen_read_one_time(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *recv_buf, int32_t rd_len) +{ + int32_t fd, rv, i; + struct i2c_rdwr_ioctl_data ioctl_data; + struct i2c_msg msgs[2]; + uint8_t buf[DFD_UTEST_MAX_BIT_WIDTH]; + + fd = open(i2c_path, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd:%d\n", fd); + return -1; + } + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(msgs, sizeof(msgs)); + mem_clear(buf, sizeof(buf)); + + i = 0; + + switch (addr_bitwidth) { + case WIDTH_4Byte: + buf[i++] = (offset_addr >> 24) & 0xFF; + buf[i++] = (offset_addr >> 16) & 0xFF; + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_2Byte: + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_1Byte: + buf[i++] = offset_addr & 0xFF; + break; + default: + DFD_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set %u addr_bitwidth \n", addr_bitwidth); + rv = -1; + goto fail; + } + + msgs[0].addr = dev_addr; + msgs[0].flags = 0; + msgs[0].len = addr_bitwidth; + msgs[0].buf = buf; + msgs[1].addr = dev_addr; + msgs[1].flags |= I2C_M_RD; + msgs[1].len = rd_len; + msgs[1].buf = recv_buf; + ioctl_data.nmsgs = 2; + ioctl_data.msgs = msgs; + + rv = ioctl(fd, I2C_RDWR, &ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("%s %d Error: Sending messages failed:(ret:%d, errno:%s)!\n", __func__ , __LINE__, rv, strerror(errno)); + goto fail; + } + +fail: + close(fd); + return rv; +} + +int32_t dfd_i2c_gen_read(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *recv_buf, int32_t rd_len) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_i2c_gen_read_one_time(i2c_path, dev_addr, addr_bitwidth, offset_addr, recv_buf, rd_len); + if (rv < 0) { + DFD_DEBUG_ERROR("(read times:%d) i2c_path:%s, dev_addr:0x%x, addr_bitwidth:%u, offset_addr:0x%x, rd_len:%u\n", + i, i2c_path, dev_addr, addr_bitwidth, offset_addr, rd_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +int dfd_utest_i2c_gen_rd(int argc, char* argv[]) +{ + int ret; + uint32_t i2c_bus, dev_addr, addr_bitwidth, offset_addr, data_bitwidth, rd_len, i, j; + char *stopstring; + char i2c_path[32]; + uint8_t tmp_value[DFD_UTEST_MAX_RDWR_NUM]; + uint8_t rd_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc != 8) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_RD); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + addr_bitwidth = strtol(argv[4], &stopstring, 10); + offset_addr = strtol(argv[5], &stopstring, 16); + data_bitwidth = strtol(argv[6], &stopstring, 10); + rd_len = strtol(argv[7], &stopstring, 10); + + if (rd_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", rd_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + mem_clear(tmp_value, sizeof(tmp_value)); + ret = dfd_i2c_gen_read(i2c_path, dev_addr, addr_bitwidth, offset_addr, tmp_value, rd_len); + if (ret < 0) { + printf("read failed. ret:%d\n", ret); + goto exit; + } + + mem_clear(rd_value, sizeof(rd_value)); + if (data_bitwidth == WIDTH_1Byte) { + memcpy(rd_value, tmp_value, rd_len); + } else { + for (i = 0; i < rd_len; i += data_bitwidth) { + for (j = 0; (j < data_bitwidth) && (i + j < rd_len); j++) { + rd_value[i + data_bitwidth - j - 1] = tmp_value[i + j]; + } + } + } + + dfd_utest_printf_reg(rd_value, rd_len, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int32_t dfd_i2c_gen_write_one_time(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *wr_value, uint32_t wr_len) +{ + int32_t fd, rv, i; + struct i2c_rdwr_ioctl_data ioctl_data; + struct i2c_msg msgs[1]; + uint8_t buf[DFD_UTEST_MAX_BIT_WIDTH + DFD_UTEST_MAX_RDWR_NUM]; + + fd = open(i2c_path, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + return -1; + } + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(msgs, sizeof(msgs)); + mem_clear(buf, sizeof(buf)); + + i = 0; + + switch (addr_bitwidth) { + case WIDTH_4Byte: + buf[i++] = (offset_addr >> 24) & 0xFF; + buf[i++] = (offset_addr >> 16) & 0xFF; + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_2Byte: + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_1Byte: + buf[i++] = offset_addr & 0xFF; + break; + default: + DFD_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set %u addr_bitwidth \r\n", addr_bitwidth); + rv = -1; + goto fail; + } + + memcpy(buf + addr_bitwidth, wr_value, wr_len); + + msgs[0].addr= dev_addr; + msgs[0].flags = 0; + msgs[0].len= addr_bitwidth + wr_len; + msgs[0].buf= buf; + + ioctl_data.nmsgs= 1; + ioctl_data.msgs= msgs; + + rv = ioctl(fd, I2C_RDWR, &ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("%s %dError: Sending messages failed:(ret:%d, errno:%s)!\n", __func__ , __LINE__, rv, strerror(errno)); + goto fail; + } else if (rv < ioctl_data.nmsgs) { + DFD_DEBUG_ERROR("%s %dWarning: only %d/%d messages were sent\n", __func__ , __LINE__, rv, ioctl_data.nmsgs); + } + +fail: + close(fd); + return rv; +} + +int32_t dfd_i2c_gen_write(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *wr_value, uint32_t wr_len) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_i2c_gen_write_one_time(i2c_path, dev_addr, addr_bitwidth, offset_addr, wr_value, wr_len); + if (rv < 0) { + DFD_DEBUG_ERROR("(write times:%d)i2c_path:%s, dev_addr:0x%x, addr_bitwidth:%u, offset_addr:0x%x, wr_len:%u\n", + i, i2c_path, dev_addr, addr_bitwidth, offset_addr, wr_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +int dfd_utest_i2c_gen_wr(int argc, char* argv[]) +{ + int ret; + uint32_t i2c_bus, dev_addr, addr_bitwidth, offset_addr, data_bitwidth, wr_len, tmp_data, para_len, i, j; + char *stopstring; + char i2c_path[32]; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 8) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_WR); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + addr_bitwidth = strtol(argv[4], &stopstring, 10); + offset_addr = strtol(argv[5], &stopstring, 16); + data_bitwidth = strtol(argv[6], &stopstring, 10); + + para_len = argc - 7; + wr_len = para_len * data_bitwidth; + + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_WR); + goto exit; + } + + if (data_bitwidth == WIDTH_1Byte) { + for (i = 0; i < para_len; i++) { + wr_value[i] = strtol(argv[7 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value 0x%x\n", i , wr_value[i]); + } + } else { + for (i = 0; i < para_len; i++) { + tmp_data = strtol(argv[7 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value 0x%x\n", i , tmp_data); + for (j = 0; j < data_bitwidth; j++) { + tmp_data = strtol(argv[7 + i], &stopstring, 16); + wr_value[j + i * data_bitwidth] = (tmp_data >> (24 - 8 * j)) & 0xFF; + } + } + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + + ret = dfd_i2c_gen_write(i2c_path, dev_addr, addr_bitwidth, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("write failed. ret:%d\n", ret); + } else { + printf("write success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_i2c_rd(int argc, char* argv[]) +{ + int ret; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + uint16_t dev_addr, offset_addr; + char *stopstring; + int num, i2c_bus; + char i2c_path[32]; + + if (argc != 6) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_RD); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + offset_addr = strtol(argv[4], &stopstring, 16); + num = strtol(argv[5], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + mem_clear(value, sizeof(value)); + ret = dfd_read_port_i2c(i2c_path, dev_addr, offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; + +} + +int dfd_utest_i2c_wr(int argc, char* argv[]) +{ + int ret; + uint16_t dev_addr, offset_addr; + char *stopstring; + int i2c_bus; + char i2c_path[32]; + uint8_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 6) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_WR); + goto exit; + } + + wr_len = argc - 5; + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + offset_addr = strtol(argv[4], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[5+i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + + ret = dfd_write_port_i2c(i2c_path, dev_addr, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_io_rd(int argc, char* argv[]) +{ + int ret; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + uint16_t offset_addr; + char *stopstring; + int num; + + if (argc != 4) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_RD); + goto exit; + } + + offset_addr = strtol(argv[2], &stopstring, 16); + num = strtol(argv[3], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + mem_clear(value, sizeof(value)); + ret = dfd_read_io_port(offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_io_wr(int argc, char* argv[]) +{ + int ret; + uint16_t offset_addr; + char *stopstring; + int32_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 4) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_WR); + goto exit; + } + + wr_len = argc - 3; + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_WR); + goto exit; + } + + offset_addr = strtol(argv[2], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[3 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + ret = dfd_write_io_port(offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_phymem_rd(int argc, char* argv[]) +{ + int ret, width; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + off_t offset_addr; + char *stopstring; + int num; + + if (argc != 5) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_RD); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + num = strtol(argv[4], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + mem_clear(value, sizeof(value)); + ret = dfd_process_mem(DEV_MEM_NAME, 0, width, offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_phymem_wr(int argc, char* argv[]) +{ + int ret, width; + off_t offset_addr; + char *stopstring; + int32_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 5) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_WR); + goto exit; + } + + wr_len = argc - 4; + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_WR); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[4 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + ret = dfd_process_mem(DEV_MEM_NAME, 1, width, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_kmem_rd(int argc, char* argv[]) +{ + int ret, width; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + uint16_t offset_addr; + char *stopstring; + int num; + + if (argc != 5) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_RD); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + num = strtol(argv[4], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + mem_clear(value, sizeof(value)); + ret = dfd_process_mem(DEV_KMEM_NAME, 0, width, offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_kmem_wr(int argc, char* argv[]) +{ + int ret; + uint16_t offset_addr, width; + char *stopstring; + int32_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 5) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_WR); + goto exit; + } + + wr_len = argc - 4; + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_WR); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[4 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + ret = dfd_process_mem(DEV_KMEM_NAME, 1, width, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +static unsigned long dfd_utest_get_file_size(const char *path) +{ + unsigned long filesize; + struct stat statbuff; + + if (stat(path, &statbuff) < 0) { + filesize = -1; + } else { + filesize = statbuff.st_size; + } + + return filesize; +} + +int dfd_utest_i2c_file_wr(int argc, char* argv[]) +{ + int ret; + uint16_t dev_addr, offset_addr; + char *stopstring; + int i2c_bus; + char i2c_path[32]; + char *file_name; + unsigned long filesize; + int fd; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len; + int bpt; /* byte per times*/ + int page_left; + + if (argc != 7) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_FILE_WR); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + offset_addr = strtol(argv[4], &stopstring, 16); + bpt = strtol(argv[5], &stopstring, 10); + file_name = argv[6]; + + if ((bpt <= 0) || (bpt > DFD_UTEST_MAX_RDWR_NUM)) { + bpt = DFD_UTEST_MAX_RDWR_NUM; + } + + if ((bpt & (bpt - 1)) != 0) { + printf("Bytes per times %d isn't power of two.\n",bpt); + goto exit; + } + + filesize = dfd_utest_get_file_size(file_name); + if (filesize <= 0) { + printf("Input invalid file %s, filesize %lu.\n", file_name, filesize); + goto exit; + } + + fd = open(file_name, O_RDONLY); + if (fd < 0) { + printf("open file[%s] fail.\n", file_name); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + + while (filesize > 0) { + mem_clear(wr_buf, DFD_UTEST_MAX_RDWR_NUM); + len = bpt; + if (offset_addr & (bpt - 1)) { + page_left = bpt - (offset_addr & (bpt - 1)); + len = len > page_left ? page_left : len; + } + + len = read(fd, wr_buf, len); + + ret = dfd_write_port_i2c(i2c_path, dev_addr, offset_addr, wr_buf, len); + if (ret < 0) { + break; + } + offset_addr += len; + filesize -= len; + } + + close(fd); + + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } + +exit: + return DFD_RV_MODE_NOTSUPPORT; + +} + +/* compare with sys_flie_wr, One more step is read back verification */ +int dfd_utest_sysfs_file_upg(int argc, char* argv[]) +{ + int ret = 0; + uint32_t offset_addr; + char *file_name; + char *sysfs_loc; + char *stopstring; + unsigned long filesize; + int fd, file_fd; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len, write_len, per_wr_len; + int i; + uint8_t reread_buf[DFD_UTEST_MAX_RDWR_NUM]; + int reback_len, reread_len; + int j = 0; + + if (argc != 5 && argc != 6) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_FILE_UPG); + goto exit; + } + + sysfs_loc = argv[2]; + offset_addr = strtol(argv[3], &stopstring, 16); + file_name = argv[4]; + + if (argc == 6) { + per_wr_len = strtol(argv[5], &stopstring, 10); + if (per_wr_len > DFD_UTEST_MAX_RDWR_NUM || per_wr_len <= 0) { + printf("per_wr_byte %d invalid, not in range (0, 256]\n", per_wr_len); + goto exit; + } + } else { + per_wr_len = DFD_UTEST_DEFAULT_WR_NUM; + } + DFD_DEBUG_DBG("per_wr_byte: %d\n", per_wr_len); + filesize = dfd_utest_get_file_size(file_name); + if (filesize <= 0) { + printf("Input invalid file %s, filesize %lu.\n", file_name, filesize); + goto exit; + } + + fd = open(sysfs_loc, O_RDWR | O_SYNC); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + + file_fd = open(file_name, O_RDONLY); + if (file_fd < 0) { + printf("open file[%s] fail.\n", file_name); + goto open_dev_err; + } + + dfd_utest_print_cmd(argc, argv); + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek file[%s offset=%d] fail,\n", sysfs_loc, offset_addr); + goto fail; + } + + printf(":\n"); + while (filesize > 0) { + if (filesize > (unsigned long)per_wr_len) { + len = per_wr_len; + } else { + len = filesize; + } + + mem_clear(wr_buf, DFD_UTEST_MAX_RDWR_NUM); + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + len = read(file_fd, wr_buf, len); + if (len < 0) { + DFD_DEBUG_ERROR("read file[%s] fail, offset = 0x%x retrytimes = %d ret = %d\n", + sysfs_loc, offset_addr, i ,len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("read file[%s] fail, offset = 0x%x, ret = %d\n", sysfs_loc, offset_addr, len); + goto fail; + } + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + write_len = write(fd, wr_buf, len); + if (write_len != len) { + DFD_DEBUG_ERROR("write file[%s] fail,offset = 0x%x retrytimes = %d len = %d,write_len =%d\n", + sysfs_loc, offset_addr, i ,len, write_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("write file[%s] fail, offset = 0x%x, len = %d,write_len =%d\n", + sysfs_loc, offset_addr, len, write_len); + goto fail; + } + + reback_len = write_len; + ret = lseek(fd, -reback_len, SEEK_CUR); + if (ret < 0) { + printf("reread lseek file[%s offset=%d] fail,lseek len=%d\n", + sysfs_loc, offset_addr, reback_len); + goto fail; + } + + mem_clear(reread_buf, DFD_UTEST_MAX_RDWR_NUM); + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + reread_len = read(fd, reread_buf, reback_len); + if (reread_len != reback_len) { + DFD_DEBUG_ERROR("reread file[%s] fail,offset = 0x%x retrytimes = %d reread_len = %d,reback_len =%d\n", + sysfs_loc, offset_addr, i ,reread_len, reback_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("reread file[%s] fail, offset = 0x%x, reread_len = %d,reback_len = %d\n", + sysfs_loc, offset_addr, reread_len, reback_len); + goto fail; + } + + if (memcmp(reread_buf, wr_buf, reread_len) != 0) { + if (j < DFD_I2C_RETRY_TIME) { + DFD_DEBUG_ERROR("memcmp file[%s] fail,offset = 0x%x retrytimes = %d\n", + sysfs_loc, offset_addr, j); + j++; + ret = lseek(file_fd, -len, SEEK_CUR); + if (ret < 0) { + printf("retry file_fd lseek fail,lseek len=%d\n", len); + goto fail; + } + ret = lseek(fd, -write_len, SEEK_CUR); + if (ret < 0) { + printf("retry fd lseek fail,lseek len=%d\n", write_len); + goto fail; + } + continue; + } + + printf("upgrade file[%s] fail, offset = 0x%x.\n", sysfs_loc, offset_addr); + printf("want to write buf :\n"); + for (i = 0; i < reread_len; i++) { + printf("0x%x ", wr_buf[i]); + } + printf("\n"); + + printf("actually reread buf :\n"); + for (i = 0; i < reread_len; i++) { + printf("0x%x ", reread_buf[i]); + } + printf("\n"); + + goto fail; + } + + offset_addr += len; + filesize -= len; + usleep(5000); + } + + printf("success\n"); + close(file_fd); + close(fd); + return DFD_RV_OK; + +fail: + close(file_fd); +open_dev_err: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_sysfs_file_wr(int argc, char* argv[]) +{ + int ret = 0; + uint32_t offset_addr; + char *file_name; + char *sysfs_loc; + char *stopstring; + unsigned long filesize; + int fd, file_fd; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len, write_len, per_wr_len; + int i; + + if (argc != 5 && argc != 6) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_FILE_WR); + goto exit; + } + + sysfs_loc = argv[2]; + offset_addr = strtol(argv[3], &stopstring, 16); + file_name = argv[4]; + + if (argc == 6) { + per_wr_len = strtol(argv[5], &stopstring, 10); + if (per_wr_len > DFD_UTEST_MAX_RDWR_NUM || per_wr_len <= 0) { + printf("per_wr_byte %d invalid, not in range (0, 256]\n", per_wr_len); + goto exit; + } + } else { + per_wr_len = DFD_UTEST_DEFAULT_WR_NUM; + } + DFD_DEBUG_DBG("per_wr_byte: %d\n", per_wr_len); + filesize = dfd_utest_get_file_size(file_name); + if (filesize <= 0) { + printf("Input invalid file %s, filesize %lu.\n", file_name, filesize); + goto exit; + } + + fd = open(sysfs_loc, O_RDWR | O_SYNC); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + + file_fd = open(file_name, O_RDONLY); + if (file_fd < 0) { + printf("open file[%s] fail.\n", file_name); + goto open_dev_err; + } + + dfd_utest_print_cmd(argc, argv); + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek file[%s offset=%d] fail,\n", sysfs_loc, offset_addr); + goto fail; + } + + printf(":\n"); + while (filesize > 0) { + if (filesize > (unsigned long)per_wr_len) { + len = per_wr_len; + } else { + len = filesize; + } + + mem_clear(wr_buf, DFD_UTEST_MAX_RDWR_NUM); + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + len = read(file_fd, wr_buf, len); + if (len < 0) { + DFD_DEBUG_ERROR("read file[%s] fail, offset = 0x%x retrytimes = %d ret = %d\n", + sysfs_loc, offset_addr, i ,len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("read file[%s] fail, offset = 0x%x, ret = %d\n", sysfs_loc, offset_addr, len); + goto fail; + } + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + write_len = write(fd, wr_buf, len); + if (write_len != len) { + DFD_DEBUG_ERROR("write file[%s] fail,offset = 0x%x retrytimes = %d len = %d,write_len =%d\n", sysfs_loc, offset_addr, i ,len, write_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + if(i == DFD_I2C_RETRY_TIME) { + printf("write file[%s] fail, offset = 0x%x, len = %d,write_len =%d\n", sysfs_loc, offset_addr, len, write_len); + ret = -1; + goto fail; + } + offset_addr += len; + filesize -= len; + usleep(5000); + } + + printf("success\n"); + close(file_fd); + close(fd); + return DFD_RV_OK; + +fail: + close(file_fd); +open_dev_err: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_sysfs_file_rd(int argc, char* argv[]) +{ + int ret = 0; + uint32_t offset_addr; + char *sysfs_loc; + char *stopstring; + int fd; + uint8_t rd_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len, read_len;; + + if (argc != 5) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_FILE_RD); + goto exit; + } + + sysfs_loc = argv[2]; + offset_addr = strtol(argv[3], &stopstring, 16); + len = strtol(argv[4], &stopstring, 10); + + if (len > DFD_UTEST_MAX_RDWR_NUM) { + printf("Input num %d exceed max 256.\n", len); + goto exit; + } + + fd = open(sysfs_loc, O_RDONLY); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek failed ret %d.\n", ret); + goto fail; + } + + mem_clear(rd_buf, DFD_UTEST_MAX_RDWR_NUM); + read_len = read(fd, rd_buf, len); + if (read_len != len) { + printf("read failed read_len %d len %d.\n", read_len, len); + goto fail; + } + dfd_utest_printf_reg(rd_buf, read_len, offset_addr); + close(fd); + return DFD_RV_OK; + +fail: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_msr_rd(int argc, char* argv[]) +{ + int fd; + char msr_file_name[64]; + uint64_t data; + uint64_t read_result; + char *stopstring; + uint8_t cpu_index, width; + uint64_t offset; + + if (argc != 5) { + printf("rdmsr failed: Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_MSR_RD); + goto exit; + } + + cpu_index = strtol(argv[2], &stopstring, 10); + offset = strtol(argv[3], &stopstring, 16); + width = strtol(argv[4], &stopstring, 10); + + if (width != 8 && width != 16 && width != 32 && width != 64) { + printf("rdmsr failed: width:%u Input invalid.only support 8 16 32 64\n", width); + goto exit; + } + + mem_clear(msr_file_name, sizeof(msr_file_name)); + sprintf(msr_file_name, "/dev/cpu/%u/msr", cpu_index); + + fd = open(msr_file_name, O_RDONLY); + if (fd < 0) { + if (errno == ENXIO) { + fprintf(stderr, "rdmsr failed: No CPU %u\n", cpu_index); + } else if (errno == EIO) { + fprintf(stderr, "rdmsr failed: CPU %u doesn't support MSRs\n", cpu_index); + } else if (errno == ENOENT) { + fprintf(stderr, "rdmsr failed: can't find %s file, Please check if modprobe msr driver already\n", msr_file_name); + } else { + printf("rdmsr failed: %s open failed. errno:%d\n", msr_file_name, errno); + } + goto exit; + } + + if (pread(fd, &data, sizeof(data), offset) != sizeof(data)) { + fprintf(stderr, "rdmsr failed: CPU:%u offset:0x%lx read failed\n", cpu_index, offset); + goto fail; + } + + switch (width) { + case 8: + read_result = (volatile uint8_t)data; + break; + case 16: + read_result = (volatile uint16_t)data; + break; + case 32: + read_result = (volatile uint32_t)data; + break; + case 64: + read_result = (volatile uint64_t)data; + break; + default: + printf("rdmsr failed: width:%u illegal width.\n", width); + goto fail; + } + + printf("0x%lx\n", read_result); + close(fd); + return DFD_RV_OK; + +fail: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_sysfs_data_wr(int argc, char* argv[]) +{ + uint32_t offset; + char *sysfs_loc; + char *stopstring; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int ret, i; + int fd, len, write_len, index; + + if (argc < 5) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_DATA_WR); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + + sysfs_loc = argv[2]; + offset = strtol(argv[3], &stopstring, 16); + len = argc - 4; + mem_clear(wr_buf, sizeof(wr_buf)); + for (i = 0; i < len; i++) { + wr_buf[i] = strtol(argv[4 + i], &stopstring, 16); + DFD_DEBUG_DBG("index :%d value %x\n", i , wr_buf[i]); + } + + fd = open(sysfs_loc, O_RDWR | O_SYNC); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + + ret = lseek(fd, offset, SEEK_SET); + if (ret < 0) { + printf("lseek file[%s offset=%d] fail,\n", sysfs_loc, offset); + goto fail; + } + index = 0; + while (len > 0) { + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + write_len = write(fd, &wr_buf[index], len); + if (write_len < 0) { + DFD_DEBUG_ERROR("write file[%s] fail, retrytimes: %d, offset: 0x%x, len: %d, write_len: %d\n", + sysfs_loc, offset, i, len, write_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + if (write_len == 0) { + DFD_DEBUG_ERROR("write file[%s] EOF, offset: 0x%x, len: %d, write_len: %d\n", + sysfs_loc, offset, len, write_len); + goto fail; + } + break; + } + if(i == DFD_I2C_RETRY_TIME) { + printf("write file[%s] fail, offset: 0x%x, len: %d, write_len: %d\n", + sysfs_loc, offset, len, write_len); + goto fail; + } + offset += write_len; + index += write_len; + len -= write_len; + usleep(5000); + } + printf("success\n"); + close(fd); + return DFD_RV_OK; +fail: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +dfd_utest_proc_fun dfd_utest_get_proc_func(char *type_str) +{ + int i, tbl_size; + + tbl_size = sizeof(g_dfd_unit_test) / sizeof(g_dfd_unit_test[0]); + + for (i = 0; i < tbl_size; i++) { + if (!strncmp(g_dfd_unit_test[i].type_str, type_str, strlen(g_dfd_unit_test[i].type_str))) { + return g_dfd_unit_test[i].utest_func; + } + } + DFD_DEBUG_DBG("type: %s not match.\n", type_str); + return NULL; +} + +void dfd_utest_cmd_main(int argc, char* argv[]) +{ + dfd_utest_proc_fun pfunc; + int ret; + + if (argc < 2) { + dfd_utest_print_all_help(); + return; + } + + pfunc = dfd_utest_get_proc_func(argv[1]); + if (pfunc == NULL) { + DFD_DEBUG_DBG("utest type %s in not support.\n", argv[1]); + dfd_utest_print_all_help(); + return; + } + ret = pfunc(argc, argv); + if ((ret != DFD_RV_MODE_NOTSUPPORT) && (ret != DFD_RV_INDEX_INVALID)) { + if (ret == DFD_RV_OK) { + DFD_DEBUG_DBG(" [SUCCESS]\n"); + } else { + DFD_DEBUG_DBG(" [FAIL(%d)]\n", ret); + } + } + + return; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h new file mode 100644 index 000000000000..aa194a4dcdd7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h @@ -0,0 +1,103 @@ +/* monitor_utest.h */ +#ifndef __DFD_UTEST_H__ +#define __DFD_UTEST_H__ + +#include + +extern int g_dfd_debug_sw; +extern int g_dfd_debugpp_sw; + +#define DFD_UTEST_TRUE_FALSE_STRING(flag) ((flag == true) ? "true" : "false") + +#define DFD_DEBUG_DBG(fmt, args...) do { \ + if (g_dfd_debug_sw) { \ + printf("" fmt,\ + ##args); \ + } \ +} while (0) + +#define DFD_DEBUG_ERROR(fmt, args...) do { \ + if (g_dfd_debugpp_sw) { \ + printf("" fmt,\ + ##args); \ + } \ +} while (0) + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum dfd_rv_s { + DFD_RV_OK = 0, + DFD_RV_INIT_ERR = 1, + DFD_RV_SLOT_INVALID = 2, + DFD_RV_MODE_INVALID = 3, + DFD_RV_MODE_NOTSUPPORT = 4, + DFD_RV_TYPE_ERR = 5, + DFD_RV_DEV_NOTSUPPORT = 6, + DFD_RV_DEV_FAIL = 7, + DFD_RV_INDEX_INVALID = 8, + DFD_RV_NO_INTF = 9, + DFD_RV_NO_NODE = 10, + DFD_RV_NODE_FAIL = 11, +} dfd_rv_t; + +#define DFD_DEBUG_BUF_LEN (32) +#define DFD_DEBUGP_DEBUG_FILE "/sbin/.dfd_debugp_flag" +#define DFD_DEBUGPP_DEBUG_FILE "/sbin/.dfd_debugpp_flag" + +#define DFD_UTEST_MAX_PARA_NUM (4) +#define DFD_UTEST_TYPE_STRING_LEN (64) +#define DFD_UTEST_MATCH_STRING_LEN (64) +#define DFD_UTEST_HELP_STRING_LEN (256) +#define DFD_UTEST_INVALID_PARA (-1) +#define DFD_UTEST_BUFF_LEN (64) + +typedef enum dfd_fpga_cpld_flag_e { + DFD_CPLD_RW_FLAG = 0x00, + DFD_FPGA_RW_FLAG = 0x01, +} dfd_fpga_cpld_flag_t; + +typedef int (* dfd_utest_proc_fun)(int argc, char* argv[]); + +#define DFD_UTEST_ITEM_ALL \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_RD, i2c_rd, "i2c_rd [i2c_bus] [slave_addr] [offset] [len]", "i2c_rd [i2c_bus] [slave_addr] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_WR, i2c_wr, "i2c_wr [i2c_bus] [slave_addr] [offset] [data0] ... [dataN]", "i2c_wr [i2c_bus] [slave_addr] [offset] [data0] ... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_IO_RD, io_rd, "io_rd [offset] [len]", "io_rd [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_IO_WR, io_wr, "io_wr [offset] [data0]... [dataN]", "io_wr [offset] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_PHYMEM_RD, phymem_rd, "phymem_rd [bit_width] [offset] [len]", "phymem_rd [bit_width] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_PHYMEM_WR, phymem_wr, "phymem_wr [bit_width] [offset] [data0]... [dataN]", "phymem_wr [bit_width] [offset] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_KMEM_RD, kmem_rd, "kmem_rd [bit_width] [offset] [len]", "kmem_rd [bit_width] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_KMEM_WR, kmem_wr, "kmem_wr [bit_width][offset] [data0]... [dataN]", "kmem_wr [bit_width] [offset] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_FILE_WR, i2c_file_wr, "i2c_file_wr [i2c_bus] [slave_addr] [offset] [bpt] [filename]", "i2c_file_wr [i2c_bus] [slave_addr] [offset] [bpt] [filename]\nbpt:bytes per times") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_FILE_WR, sysfs_file_wr, "sysfs_file_wr [sysfs_loc] [offset] [filename] [per_wr_byte]", "sysfs_file_wr [sysfs_loc] [offset] [filename] [per_wr_byte]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_FILE_RD, sysfs_file_rd, "sysfs_file_rd [sysfs_loc] [offset] [len]", "sysfs_file_rd [sysfs_loc] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_FILE_UPG, sysfs_file_upg, "sysfs_file_upg [sysfs_loc] [offset] [filename] [per_wr_byte]", "sysfs_file_upg [sysfs_loc] [offset] [filename] [per_wr_byte]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_GEN_RD, i2c_gen_rd, "i2c_gen_rd [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [len]", "i2c_gen_rd [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_GEN_WR, i2c_gen_wr, "i2c_gen_wr [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [data0]... [dataN]", "i2c_gen_wr [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_MSR_RD, msr_rd, "msr_rd [cpu_index] [offset] [width]", "msr_rd [cpu_index] [offset] [width]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_DATA_WR, sysfs_data_wr, "sysfs_data_wr [sysfs_loc] [offset] [data0] ... [dataN]", "sysfs_data_wr [sysfs_loc] [offset] [data0] ... [dataN]]") \ + +#ifdef DFD_UTEST_ITEM +#undef DFD_UTEST_ITEM +#endif +#define DFD_UTEST_ITEM(_id, _type_str, _help_info, _help_info_detail) _id, +typedef enum dfd_utest_item_id_s { + DFD_UTEST_ITEM_ALL +} dfd_utest_item_id_t; + +typedef struct { + int utest_type; + char type_str[DFD_UTEST_TYPE_STRING_LEN]; + dfd_utest_proc_fun utest_func; + char help_info[DFD_UTEST_HELP_STRING_LEN]; + char help_info_detail[DFD_UTEST_HELP_STRING_LEN]; +} dfd_utest_t; + +void dfd_utest_cmd_main(int argc, char* argv[]); + +#ifdef DFD_UTEST_ITEM +#undef DFD_UTEST_ITEM +#endif +#define DFD_UTEST_ITEM(_id, _type_str, _help_info, _help_info_detail) int dfd_utest_##_type_str(int argc, char* argv[]); +DFD_UTEST_ITEM_ALL + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile new file mode 100644 index 000000000000..62663efdbbd5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile @@ -0,0 +1,19 @@ +top_srcdir:=$(shell pwd) +include $(top_srcdir)/Rules.mk + +firmware-y:= +firmware-y += firmware_driver +firmware-y += firmware_upgrade + +.PHONY: all +all: build + +.PHONY: build +build: $(firmware-y) +$(foreach dir,$(firmware-y),$(eval $(call compile_dirs,$(dir)))) + +.PHONY: rpmpkg +rpmpkg: +ifeq ("$(CONFIG_CPLD_UPGRADE_ISPVME)", "y") + #$(RPMPKG) $(install_cpld_dir) firmware-cpld-ispvme.spec git +endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk new file mode 100644 index 000000000000..5fb5a09d34fd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk @@ -0,0 +1,42 @@ +CC ?= $(CROSS)gcc +AR ?= $(CROSS)ar +AS ?= $(CROSS)as +LD ?= $(CROSS)ld +STRIP ?= $(CROSS)strip + +install_root:=${top_srcdir}/images + +install_header_dir:=${install_root}/header +install_adir:=$(install_root)/lib +install_symbol_dir:=$(install_root)/symbol +symbol_files:=$(shell find $(EXPORT_SYMBOL) -name 'Module.symvers') +# +# symbol_files += $(shell find $(install_symbol_dir) -name 'Module.symvers') +# KBUILD_EXTRA_SYMBOLS += $(symbol_files) +# export KBUILD_EXTRA_SYMBOLS + +# top root: install_rootfs_dir +install_rootfs_dir:=$(install_root)/rootfs + +install_sodir:=$(install_rootfs_dir)/$(INSTALL_SODIR) + +install_usr_bin_dir:=$(install_rootfs_dir)/usr/bin +install_sbin_dir:=$(install_rootfs_dir)/sbin +install_etc_dir:=$(install_rootfs_dir)/etc + +export INSTALL_MOD_PATH:=$(ROOT) + +BUILD_CFLAGS:=$(CFLAGS) -I$(install_header_dir) +BUILD_LDFLAGS:=$(LDFLAGS) -L/$(install_sodir) -L/$(install_adir) + +define compile_dirs +.PHONY: $(1) +$(1): + @echo;echo "building $(1)..." + @$(MAKE) -C ${1} +endef + +compile.c = $(CC) $(BUILD_CFLAGS) -d -c -o $@ $< +%.o: %.c + $(compile.c) + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile new file mode 100644 index 000000000000..e8879aeff5e7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile @@ -0,0 +1,19 @@ +include $(top_srcdir)/Rules.mk + +firmware-y:= +firmware-y += firmware_driver_ispvme +firmware-y += firmware_driver_cpld +firmware-y += firmware_driver_sysfs + +.PHONY: all +all: build + +.PHONY: build +build: $(firmware-y) +$(foreach dir,$(firmware-y),$(eval $(call compile_dirs,$(dir)))) + +.PHONY: rpmpkg +rpmpkg: +ifeq ("$(CONFIG_CPLD_UPGRADE_ISPVME)", "y") + #$(RPMPKG) $(install_cpld_dir) firmware-cpld-ispvme.spec git +endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile new file mode 100644 index 000000000000..0add28cb9056 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile @@ -0,0 +1,23 @@ +#include $(top_srcdir)/debian/rules +#KERNELDIR := ${KBUILD_OUTPUT} + +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../include) +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) +EXTRA_CFLAGS+= -Wall + +firmware_driver_cpld-objs := firmware.o +firmware_driver_cpld-objs += firmware_cpld.o firmware_cpld_upgrade.o +firmware_driver_cpld-objs += jbicomp.o jbijtag.o jbimain.o jbistub.o + +#ifndef CONFIG_FRM_PRODUCT_FILE + +$(warning $(firmware_driver_cpld-objs)) +obj-m := firmware_driver_cpld.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(common_module_dir) ]; then mkdir -p $(common_module_dir) ;fi + cp -p $(PWD)/*.ko $(common_module_dir) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c new file mode 100644 index 000000000000..db72b369465a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c @@ -0,0 +1,144 @@ +#include +#include +#include + +int g_firmware_driver_debug = 0; +module_param(g_firmware_driver_debug, int, S_IRUGO | S_IWUSR); + +static LIST_HEAD(drv_list); +static LIST_HEAD(dev_list); + +/** + * firmware_driver_register + * function:Registered Device Driver + * @fw_drv:param[in] Driver information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_driver_register(firmware_driver_t *fw_drv) +{ + int ret; + + if (fw_drv == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + + ret = platform_driver_register(fw_drv->drv); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: failed to register firmware upgrade driver \n"); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_drv->list, &drv_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware upgrade driver register sucess \n"); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_driver_unregister + * function:unregister Device Driver + * @fw_drv:param[in] Driver information + */ +void firmware_driver_unregister(firmware_driver_t *fw_drv) +{ + list_del_init(&fw_drv->list); + platform_driver_unregister(fw_drv->drv); +} + +/* + * firmware_get_device_by_minor + * function: Get device information based on minor + */ +firmware_device_t *firmware_get_device_by_minor(int minor) +{ + firmware_device_t *tmp; + + list_for_each_entry(tmp, &dev_list, list) { + if (tmp->dev.minor == minor) { + return tmp; + } + } + + return NULL; +} + +/** + * firmware_device_register + * function:Registered Driver Device + * @fw_dev: param[in] Driver information + * return value:success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_device_register(firmware_device_t *fw_dev) +{ + int ret; + firmware_device_t *tmp; + + if (fw_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + /* Check whether the device file name already exists in the device linked list */ + list_for_each_entry(tmp, &dev_list, list) { + if (strcmp(tmp->name, fw_dev->name) == 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("devie %s already exists.\n", fw_dev->name); + return FIRMWARE_FAILED; + } + } + + /* Registere device */ + ret = misc_register(&fw_dev->dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("register misc error, ret=%d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Adds a device to the device list */ + list_add(&fw_dev->list, &dev_list); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_device_unregister + * function: unregister Driver Device + */ +void firmware_device_unregister(firmware_device_t *fw_dev) +{ + list_del(&fw_dev->list); + misc_deregister(&fw_dev->dev); +} + +static int __init firmware_driver_init(void) +{ + int ret; + + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver init.\n"); + ret = firmware_cpld_init(); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware driver init failed.\n"); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +static void __exit firmware_driver_exit(void) +{ + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver exit.\n"); + firmware_cpld_exit(); + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + return; +} + +module_init(firmware_driver_init); +module_exit(firmware_driver_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Firmware upgrade driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("1.0"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c new file mode 100644 index 000000000000..18ec509d0f2e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c @@ -0,0 +1,384 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_cpld_open(struct inode *inode, struct file *file) +{ + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Open cpld device.\n"); + frm_dev = firmware_get_device_by_minor(MINOR(inode->i_rdev)); + if (frm_dev == NULL) { + return -ENXIO; + } + file->private_data = frm_dev; + + return FIRMWARE_SUCCESS; +} + +static ssize_t firmware_cpld_read (struct file *file, char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static ssize_t firmware_cpld_write (struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static loff_t firmware_cpld_llseek(struct file *file, loff_t offset, int origin) +{ + return 0; +} + +/* + * firmware_cpld_ioctl + * function: ioctl command parsing function + * @file: param[in] device file name + * @cmd: param[in] command + * @arg: param[in] the parameters in the command + * return value: success-FIRMWARE_SUCCESS; fail:other value + */ +static long firmware_cpld_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret; + char *buf; + void __user *argp; + char version[FIRMWARE_NAME_LEN]; + char chip_name[FIRMWARE_NAME_LEN]; + cmd_info_t cmd_info; + firmware_device_t *frm_dev; + firmware_cpld_t *cpld_info; + + /* Get device private data */ + mem_clear(&cmd_info, sizeof(cmd_info_t)); + frm_dev = (firmware_device_t *)file->private_data; + cpld_info = NULL; + if (frm_dev != NULL) { + if (frm_dev->priv != NULL) { + cpld_info = (firmware_cpld_t *)frm_dev->priv; + } + } + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to frm_dev->priv sysfs info.\n"); + return FIRMWARE_FAILED; + } + argp = (void __user *)arg; + + switch (cmd) { + case FIRMWARE_GET_CHIPNAME: + /* get chip name */ + if (copy_from_user(&cmd_info, argp, sizeof(cmd_info_t))) { + return -EFAULT; + } + mem_clear(chip_name, FIRMWARE_NAME_LEN); + ret = fmw_cpld_upg_get_chip_name(frm_dev->chain, cpld_info, chip_name, FIRMWARE_NAME_LEN); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get chip name.\n"); + return -ENXIO; + } + if (copy_to_user(cmd_info.data, chip_name, cmd_info.size)) { + return -EFAULT; + } + break; + case FIRMWARE_PROGRAM: + case FIRMWARE_PROGRAM_JBI: + /* firmware upgrade */ + if (copy_from_user(&cmd_info, argp, sizeof(cmd_info_t))) { + return -EFAULT; + } + buf = (char *) kzalloc(cmd_info.size + 1, GFP_KERNEL); + if (buf == NULL) { + return -ENOMEM; + } + if (copy_from_user(buf, cmd_info.data, cmd_info.size)) { + kfree(buf); + return -EFAULT; + } + buf[cmd_info.size] = 0; + if (cmd == FIRMWARE_PROGRAM_JBI) { + /* JBI firmware upgrade */ + ret = fmw_cpld_upg_program_jbi(frm_dev->chain, cpld_info, buf, cmd_info.size); + } else { + /* ISC firmware upgrade */ + ret = fmw_cpld_upg_program(frm_dev->chain, cpld_info, buf, cmd_info.size); + } + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program cpld.\n"); + kfree(buf); + return -ESRCH; + } + kfree(buf); + break; + case FIRMWARE_GET_VERSION: + /* get version */ + if (copy_from_user(&cmd_info, argp, sizeof(cmd_info_t))) { + return -EFAULT; + } + mem_clear(version, FIRMWARE_NAME_LEN); + ret = fmw_cpld_upg_get_version(frm_dev->chain, cpld_info, version, FIRMWARE_NAME_LEN); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get version.\n"); + return -ENXIO; + } + if (copy_to_user(cmd_info.data, version, cmd_info.size)) { + return -EFAULT; + } + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("not find cmd: %d\r\n", cmd); + return -ENOTTY; + } /* End of switch */ + + return FIRMWARE_SUCCESS; +} + +static int firmware_cpld_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static const struct file_operations cpld_dev_fops = { + .owner = THIS_MODULE, + .llseek = firmware_cpld_llseek, + .read = firmware_cpld_read, + .write = firmware_cpld_write, + .unlocked_ioctl = firmware_cpld_ioctl, + .open = firmware_cpld_open, + .release = firmware_cpld_release, +}; + +static int of_firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int ret; + char *name; + int i; + char buf[64]; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + ret = 0; + ret += of_property_read_string(dev->of_node, "type", (const char **)&name); + ret += of_property_read_u32(dev->of_node, "tdi", &cpld_info->tdi); + ret += of_property_read_u32(dev->of_node, "tck", &cpld_info->tck); + ret += of_property_read_u32(dev->of_node, "tms", &cpld_info->tms); + ret += of_property_read_u32(dev->of_node, "tdo", &cpld_info->tdo); + + ret += of_property_read_u32(dev->of_node, "chain", &cpld_info->chain); + ret += of_property_read_u32(dev->of_node, "chip_index", &cpld_info->chip_index); + + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config error, ret:%d.\n", ret); + return -ENXIO; + } + + strncpy(cpld_info->type, name, sizeof(cpld_info->type) - 1); + + ret = of_property_read_u32(dev->of_node, "tck_delay", &cpld_info->tck_delay); + if(ret != 0) { + cpld_info->tck_delay = 60; + } + + cpld_info->gpio_en_info_num = 0; + /* Enable through GPIO */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_gpio_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_gpio); + if(ret != 0) { + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_level_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_level); + if(ret != 0) { + break; + } + cpld_info->gpio_en_info_num++; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, en_info_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int i; + + firmware_upgrade_device_t *firmware_upgrade_device; + firmware_jtag_device_t jtag_upg_device; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + if (dev->platform_data == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("platform data config error.\n"); + return -1; + } + firmware_upgrade_device = dev->platform_data; + jtag_upg_device = firmware_upgrade_device->upg_type.jtag; + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + + strncpy(cpld_info->type, firmware_upgrade_device->type, sizeof(cpld_info->type) - 1); + cpld_info->tdi = jtag_upg_device.tdi; + cpld_info->tck = jtag_upg_device.tck; + cpld_info->tms = jtag_upg_device.tms; + cpld_info->tdo = jtag_upg_device.tdo; + cpld_info->chain = firmware_upgrade_device->chain; + cpld_info->chip_index = firmware_upgrade_device->chip_index; + + if (jtag_upg_device.tck_delay == 0) { + cpld_info->tck_delay = 60; + FIRMWARE_DRIVER_DEBUG_VERBOSE("no config tck_delay, use default value:%u\n", cpld_info->tck_delay); + } else { + cpld_info->tck_delay = jtag_upg_device.tck_delay; + } + + if (firmware_upgrade_device->en_gpio_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_gpio_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_gpio_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + cpld_info->gpio_en_info_num = firmware_upgrade_device->en_gpio_num; + /* Enable through GPIO */ + for (i = 0; i < cpld_info->gpio_en_info_num; i++) { + cpld_info->gpio_en_info[i].en_gpio = firmware_upgrade_device->en_gpio[i]; + cpld_info->gpio_en_info[i].en_level = firmware_upgrade_device->en_level[i]; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, en_info_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_cpld_probe(struct platform_device *pdev) +{ + int ret; + firmware_cpld_t *cpld_info; + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_cpld_probe\r\n"); + /* Gets the information in the device tree */ + cpld_info = devm_kzalloc(&pdev->dev, sizeof(firmware_cpld_t), GFP_KERNEL); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc cpld device tree.\n"); + return -EPERM; + } + + if (pdev->dev.of_node) { + ret = of_firmware_upgrade_config_init(&pdev->dev, cpld_info); + } else { + ret = firmware_upgrade_config_init(&pdev->dev, cpld_info); + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("get config init from dts error.\n"); + return -EPERM; + } + + frm_dev = devm_kzalloc(&pdev->dev, sizeof(firmware_device_t), GFP_KERNEL); + if (frm_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc firmware device.\n"); + return -EPERM; + } + + /* Based on the link number, determine the name of the device file */ + frm_dev->chain = cpld_info->chain; + snprintf(frm_dev->name, FIRMWARE_NAME_LEN - 1, "firmware_cpld%d", frm_dev->chain); + strncpy(cpld_info->devname, frm_dev->name, strlen(frm_dev->name) + 1); + + INIT_LIST_HEAD(&frm_dev->list); + frm_dev->dev.minor = MISC_DYNAMIC_MINOR; + frm_dev->dev.name = frm_dev->name; + frm_dev->dev.fops = &cpld_dev_fops; + frm_dev->priv = cpld_info; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Register cpld firmware chain:%d, name:%s.\n", frm_dev->chain, frm_dev->name); + + ret = firmware_device_register(frm_dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to register firmware device.\n"); + return -EPERM; + } + + platform_set_drvdata(pdev, frm_dev); + return 0; +} + +static int __exit firmware_cpld_remove(struct platform_device *pdev) +{ + firmware_device_t *frm_dev; + + frm_dev = (firmware_device_t *)platform_get_drvdata(pdev); + firmware_device_unregister(frm_dev); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct of_device_id cpld_match[] = { + { + .compatible = "firmware_cpld", + }, + {}, +}; + +static struct platform_driver cpld_driver = { + .driver = { + .name = "firmware_cpld", + .owner = THIS_MODULE, + .of_match_table = cpld_match, + }, + .probe = firmware_cpld_probe, + .remove = firmware_cpld_remove, +}; + +static firmware_driver_t fmw_drv_cpld = { + .name = "firmware_cpld", + .drv = &cpld_driver, +}; + +int firmware_cpld_init(void) +{ + int ret; + + INIT_LIST_HEAD(&fmw_drv_cpld.list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("cpld upgrade driver register \n"); + ret = firmware_driver_register(&fmw_drv_cpld); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("cpld upgrade driver register failed.\n"); + return ret; + } + return 0; +} + +void firmware_cpld_exit(void) +{ + firmware_driver_unregister(&fmw_drv_cpld); + INIT_LIST_HEAD(&fmw_drv_cpld.list); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c new file mode 100644 index 000000000000..8252c2a39bb2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c @@ -0,0 +1,1879 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* CPLD file parses the relevant parameters */ +#define CPLD_HEX 16 +#define DEC_VAL 10 +#define CPLD_INIT_CNT 4 +#define CPLD_UNIT_SZ 4 +#define CPLD_HEAD_KEYWORD "Header" +#define CPLD_NAME_KEYWORD "Entity" +#define CPLD_INIT_KEYWORD "INITIALIZE" +#define CPLD_REPEAT_KEYWORD "REPEAT" +#define CPLD_END_CHAR ',' + +/* TCK clock MAX 16MHz */ +#define TCK_DELAY (current_fmw_cpld->tck_delay) + +/* + * The instruction format of the MAX II CPLD is 10 bits + * For shift_ir state machine use + */ +#define BYPASS 0x3FF +#define EXTEST 0xF +#define SAMPLE 0x5 +#define IDCODE 0x6 +#define USERCODE 0x7 +#define CLAMP 0xA +#define HIGHZ 0xB + +/* Following 7 instructions are IEEE 1532 instructions */ +#define ISC_ENABLE 0x2CC +#define ISC_DISABLE 0x201 +#define ISC_PROGRAM 0x2F4 +#define ISC_ERASE 0x2F2 +#define ISC_ADDRESS_SHIFT 0x203 +#define ISC_READ 0x205 +#define ISC_NOOP 0x210 + +/* + * MAX II devices support the real-time in-system programmability (ISP) + * feature that allows you to program the device while it is still in operation. + * when there is either a power cycle to the device (powering down and powering + * up again) or with the execution of certain ISP instructions to start the SRAM + * download process when realtime ISP has completed. + */ +#define RT_ISC_ENABLE 0x199 +#define RT_ISC_DISABLE 0x166 + +/* Chip ID */ +#define EPM240_G 0x020A10DD +#define EPM570_G 0x020A20DD +#define EPM1270_G 0x020A30DD +#define EPM2210_G 0x020A40DD +#define EPM240_Z 0x020A50DD +#define EPM570_Z 0x020A60DD + +/* The size of the output data for ID validation */ +#define VERIFY_IDCODE_SIZE 0x5 + +/* Erasure and programmatic delay handling */ +#define ERASE_DELAY 0x1024 +#define PROGRAM_DELAY 0x5 + +/* Chip instruction register */ +#define CPLD_INSTRUCTION_SIZE 10 + +/* + * Currently, only two connectors are supported + * The size of the instruction register needs to be changed + * when more than two connectors are used + */ +#ifndef CPLD_MAX_CHIP +#define CPLD_MAX_CHIP 2 +#endif + +typedef struct cpld_chip_id { + char *name; + uint id; + int addr_register_length; + int data_register_length; + int eeprom_array_length; + int first_blank_check_length; + int second_blank_check_length; + int first_erase_addr; + int second_erase_addr; + int third_erase_addr; + int verify_idcode_addr; +} cpld_chip_id_t; + +static cpld_chip_id_t cpld_id_table[] = { + {"EPM240T100", EPM240_G, 13, 16, 4604, 3327, 511, 0x0, 0x1, 0x11, 0x89}, + {"EPM570T144", EPM570_G, 14, 16, 8700, 3327, 511, 0x0, 0x1, 0x21, 0x111}, + {"EPM1270F256", EPM1270_G, 15, 16, 16892, 16383, 511, 0x0, 0x1, 0x41, 0x221}, + {"5M240Z", EPM240_Z, 13, 16, 4604, 3327, 511, 0x0, 0x1, 0x11, 0x89}, + {"5M570Z", EPM570_Z, 14, 16, 8700, 3327, 511, 0x0, 0x1, 0x21, 0x111}, + {NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +}; + +static cpld_chip_id_t *chip_cpld_info = NULL; + +/* The following variables are used when cascading multiple chips */ +static int chip_num, current_chip_index; +static firmware_cpld_t *current_fmw_cpld; + +static int TDI_PULL_UP(void); +static int TDI_PULL_DOWN(void); +static int TMS_PULL_UP(void); +static int TMS_PULL_DOWN(void); +static int TCK_PULL_UP(void); +static int TCK_PULL_DOWN(void); + +/* + * set_currrent_cpld_info + * function: Save the current device information + * @info: param[in] Information about the device to be updated + */ +static void set_currrent_cpld_info(firmware_cpld_t *info) +{ + current_fmw_cpld = info; +} + +/* + * firmware_upgrade_en + * function: Upgrade access enabling switch + * @flag: !0:enable 0:disable + */ +static int firmware_upgrade_en(int flag) +{ + int i; + int ret; + + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (flag) { + ret = gpio_request(current_fmw_cpld->gpio_en_info[i].en_gpio, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade EN[%d] GPIO[%d] failed!\n", + i, current_fmw_cpld->gpio_en_info[i].en_gpio); + goto free_gpio; + } + gpio_direction_output(current_fmw_cpld->gpio_en_info[i].en_gpio, current_fmw_cpld->gpio_en_info[i].en_level); + current_fmw_cpld->gpio_en_info[i].flag = 1; + } else { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } + } + return 0; +free_gpio: + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (current_fmw_cpld->gpio_en_info[i].flag == 1) { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } else { + break; + } + } + + return -1; +} + +/* + * init_cpld + * function:Initialize CPLD + * return value: 0 success ; -1 fail + */ +static int init_cpld(void) +{ + int ret; + + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = gpio_request(current_fmw_cpld->tdi, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TDI GPIO failed!\n"); + return ret; + } + ret = gpio_request(current_fmw_cpld->tck, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TCK GPIO failed!\n"); + goto free_tdi; + } + ret = gpio_request(current_fmw_cpld->tms, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TMS GPIO failed!\n"); + goto free_tck; + } + ret = gpio_request(current_fmw_cpld->tdo, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TDO GPIO failed!\n"); + goto free_tms; + } + + gpio_direction_output(current_fmw_cpld->tdi, 1); + gpio_direction_output(current_fmw_cpld->tck, 1); + gpio_direction_output(current_fmw_cpld->tms, 1); + + gpio_direction_input(current_fmw_cpld->tdo); + ret = firmware_upgrade_en(1); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: open firmware upgrade en failed, ret %d.\n", ret); + goto free_tdo; + } + + /* test GPIO */ + if (TDI_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_UP failed.\n"); + goto free_tdo; + } + if (TDI_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TMS_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_UP failed.\n"); + goto free_tdo; + } + if (TMS_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TCK_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_UP failed.\n"); + goto free_tdo; + } + if (TCK_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_DOWN failed.\n"); + goto free_tdo; + } + + mdelay(10); + return 0; + +free_tdo: + gpio_free(current_fmw_cpld->tdo); +free_tms: + gpio_free(current_fmw_cpld->tms); +free_tck: + gpio_free(current_fmw_cpld->tck); +free_tdi: + gpio_free(current_fmw_cpld->tdi); + return ret; +} + +/* + * finish_cpld + * function: finish CPLD upgrade operation + * return value: 0 success ; -1 fail + */ +static int finish_cpld(void) +{ + int ret; + + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = firmware_upgrade_en(0); + if (ret < 0){ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: close firmware upgrade en failed, ret %d.\r\n", ret); + } + + gpio_free(current_fmw_cpld->tdi); + gpio_free(current_fmw_cpld->tck); + gpio_free(current_fmw_cpld->tms); + gpio_free(current_fmw_cpld->tdo); + mdelay(10); + return 0; +} + +/* Loop waiting for */ +static int pull_wait(int gpio, int value) { + int i, j; + /* Timeout time is two seconds */ + for (i = 0; i < 20; i++) { + for (j = 0; j < 100; j++) { + if (!!gpio_get_value(gpio) == !!value ) { + return 0; + } + /* The first loop does not delay, normally the first loop can immediately return the result */ + if (i) { + mdelay(1); + } + } + /* The CPU is released every 100ms */ + schedule(); + } + /* timeout */ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Wait gpio %d pull to %d failed.\n", gpio, value); + return -1; +} + +/* TDI pull-up */ +static int pull_tdi_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 1); +} + +/* TDI pull-down */ +static int pull_tdi_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 0); +} + +/* TCK pull-up */ +static int pull_tck_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 1); +} + +/* TCK pull-down */ +static int pull_tck_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 0); +} + +/* TMS pull-up */ +static int pull_tms_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 1); +} + +/* TMS pull-down */ +static int pull_tms_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 0); +} + +/* Read TDO */ +static int read_tdo(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + return gpio_get_value(current_fmw_cpld->tdo); +} + +static firmware_cpld_function_t function_fmw_cpld = { + .pull_tdi_up = pull_tdi_up, + .pull_tdi_down = pull_tdi_down, + .pull_tck_up = pull_tck_up, + .pull_tck_down = pull_tck_down, + .pull_tms_up = pull_tms_up, + .pull_tms_down = pull_tms_down, + .read_tdo = read_tdo, + .init_cpld = init_cpld, + .finish_cpld = finish_cpld, +}; + +/* + * TDI_PULL_DOWN + * function: Lower TDI + */ +static int TDI_PULL_DOWN(void) +{ + if ( function_fmw_cpld.pull_tdi_down != NULL) { + return function_fmw_cpld.pull_tdi_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TDI_PULL_UP + * function: High TDI + */ +static int TDI_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tdi_up != NULL) { + return function_fmw_cpld.pull_tdi_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_UP.\n"); + return -1; + } +} + +/* + * TCK_PULL_DOWN + * function: Lower TCK + */ +static int TCK_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tck_down != NULL) { + return function_fmw_cpld.pull_tck_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TCK_PULL_UP + * function: High TCK + */ +static int TCK_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tck_up != NULL) { + return function_fmw_cpld.pull_tck_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_UP.\n"); + return -1; + } +} + +/* + * TMS_PULL_DOWN + * function: Lower TMS + */ +static int TMS_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tms_down != NULL) { + return function_fmw_cpld.pull_tms_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TMS_PULL_UP + * function: High TMS + */ +static int TMS_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tms_up != NULL) { + return function_fmw_cpld.pull_tms_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_UP.\n"); + return -1; + } +} + +/* + * TDO_READ + * function:Read the TDO level + */ +static int TDO_READ(void) +{ + if (function_fmw_cpld.read_tdo != NULL) { + return function_fmw_cpld.read_tdo(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDO_READ.\n"); + return -1; + } +} + +/* + * tap_test_logic_reset + * function: reset JTAG + * No matter what the original state of the controoler, it will enter + * Test_Logic_Reset when TMS is held high for at least five rising + * edges of TCK (16MHz) + * The controller remains in this state while TMS is high + */ +static void tap_test_logic_reset(void) +{ + int i; + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + + for (i = 0; i < 5; i++) { + TCK_PULL_UP(); + ndelay(TCK_DELAY); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + } + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_run_test_idle + * function: A controller state between scan operations.Once entered, the controller + * will remain in the Run_Test/Idle state as long as TMS is held low. + */ +static void tap_run_test_idle(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_select_dr_scan + * function :This is a temporary controller state in which all test data registers + * selected by the current instruction retain their previous state. + */ +static void tap_select_dr_scan(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_capture_dr + * function : In this controller state data may be parallel-loaded into test data + * register selected by the current instruction on the rising edge of TCK + */ +static void tap_capture_dr(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_shift_dr + * function: In this controller state.the test data register connected between TDI + * and TDO as a result of the current instruction shifts one stage + * toward its serial output on each rising edge of TCK. + */ +static void tap_shift_dr(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_exit1_dr + * function: This is a temporary controller state. + */ +static void tap_exit1_dr(int data) +{ + int j; + if (data) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + + /* need to idle here */ + for (j = 1; j < current_chip_index; j++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + } + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_update_dr + * function : Some test data registers may be provided with a latched parallel output to + * prevent changes at the parallel out-put while data is shifted in the + * associated whift-register path in response to certain instructions.Data is + * latched onto the parallel output of these test data registers from the + * shift-register path on the falling edge of TCK in the Update-DR controler state. + */ +static void tap_update_dr(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_select_ir_scan + * function:This is a temporarily controler state in which all test data register selected + * by the current instruction retain their previous state. + */ +static void tap_select_ir_scan(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_capture_ir + * function :In this controller state the shift-register contained in the instruction + * register loads a pattern of fixed logic values on the rising edge of + * TCK.design-specific data may be loaded into shift-register stages that + * are not required to be set to fixed values. + */ +static void tap_capture_ir(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_exit1_ir + * function : enter exit1 ir state. This is a temporary controller state. + */ +static void tap_exit1_ir(int data) +{ + if (data) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_shift_ir + * function: In this controller state the shift-register contained in the instruction + * register is connected between TDI and TDO and shifts data one stage + * toward its serial output on each rising edge of TCK. + */ +static void tap_shift_ir(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * The instruction shifted into the instruction register is latched onto the parallel output + * from the shift-register path on the falling edge of TCK in this controller state.Once the + * new instruction has been latched,it becomes the current instruction. + * + */ +static void tap_update_ir(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +static void tap_send_instruction(int instruction, int ins_len) +{ + int i; + for (i = 0; i < (ins_len - 1); i++) { + if (instruction & 0x1) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + instruction = instruction >> 1; + } +} + +static void tap_send_data(int data, int data_len) +{ + int i; + for (i = 0; i < (data_len - 1); i++) { + if (data & 0x1) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + data = data >> 1; + } +} + +/* + * tap_rcv_byte + * function : Receive data from the device side + * @data : param[out] Received data */ +static void tap_rcv_byte(u8 *data) +{ + int i; + u8 rec_data = 0; + unsigned char tmp; + ndelay(TCK_DELAY); + for (i = 0; i < 8; i++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + tmp = TDO_READ(); + rec_data |= (tmp << i); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + } + *data = rec_data; +} + +/* + * tap_idle + * function :Used for state machine idling + */ +static void tap_idle(void) +{ + int i; + for (i = 0; i < 0x100; i++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + + /* Timely release of CPU */ + schedule(); + } +} + +/* + * jtag_read_data + * function :Read the JTAG output data + * @size: param[in] buffer size + * @data: param[out] read data buffer + */ +static void jtag_read_data(u8 *buf, int size) +{ + int i, j; + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_capture_dr(); + tap_shift_dr(); + for (j = current_chip_index; j < chip_num; j++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + } + /* Receive data from the device side */ + for (i = 0; i < size; i++) { + tap_rcv_byte(&buf[i]); + } + /* JTAG state switching */ + tap_exit1_dr(0); + tap_update_dr(); + tap_run_test_idle(); +} + +/* + * jtag_send_instruction + * function :JTAG instruction sending interface + * @instruction: param[in] Instruction to be sent + * @ins_length: param[in] Instruction length + */ +static void jtag_send_instruction(int instruction, int ins_length) +{ + int i, j; + i = 1 << (ins_length - 1); + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_select_ir_scan(); + tap_capture_ir(); + tap_shift_ir(); + + for (j = chip_num; j > 1; j--) { + if (j == current_chip_index) { + tap_send_instruction(instruction, ins_length + 1); + } else { + tap_send_instruction(BYPASS, ins_length + 1); + } + } + + if (current_chip_index == 1) { + tap_send_instruction(instruction, ins_length); + /* Gets the highest bit of the instruction */ + tap_exit1_ir((instruction & i) >> (ins_length - 1)); + } else { + tap_send_instruction(BYPASS, ins_length); + /* Gets the highest bit of the instruction */ + tap_exit1_ir((BYPASS & i) >> (ins_length - 1)); + } + + /* JTAG state switching */ + tap_update_ir(); + tap_run_test_idle(); +} + +/* + * jtag_send_data + * function :JTAG data sending interface + * @buf : param[in] Data that needs to be sent + * @data_length: param[in] Data length + */ +static void jtag_send_data(unsigned int buf, int data_length) +{ + int i; + i = 1 << (data_length - 1); + + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_capture_dr(); + tap_shift_dr(); + tap_send_data(buf, data_length); + /* Gets the highest bit of the instruction */ + tap_exit1_dr((buf & i) >> (data_length - 1)); + tap_update_dr(); + tap_run_test_idle(); +} + +/* + * jtag_program_donebit + * JTAG programming end point */ +static void jtag_program_donebit(void) +{ + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + + switch (chip_cpld_info->id) { + case EPM240_G: + case EPM570_G: + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x7BFF, chip_cpld_info->data_register_length); + tap_idle(); + break; + case EPM1270_G: + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x7FFF, chip_cpld_info->data_register_length); + tap_idle(); + + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0xFFFF, chip_cpld_info->data_register_length); + tap_idle(); + + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0xFFBF, chip_cpld_info->data_register_length); + tap_idle(); + + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0xFFFF, chip_cpld_info->data_register_length); + tap_idle(); + break; + default: + break; + } /* End of switch */ +} + +/* + * jtag_rt_disable + * JTAG Disable state machine under Real-Time ISP + */ +static void jtag_rt_disable(void) +{ + jtag_send_instruction(RT_ISC_DISABLE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_instruction(BYPASS, CPLD_INSTRUCTION_SIZE); + tap_idle(); +} + +/* + * jtag_verify_idcode + * function :JTAG internal ID reading + */ +static void jtag_verify_idcode(void) +{ + int data, i; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->verify_idcode_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + for (i = 0; i < VERIFY_IDCODE_SIZE; i++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + + /* When validating the ID, the data is compared to the corresponding chip value, + which is retrieved from the BSDL file*/ + data = (buf[1] << 8) | buf[0]; + } +} + +/* + * jtag_rt_enable + * Enter Real-Time ISP mode; JTAG Enable State Machine under Real-Time ISP + */ +static void jtag_rt_enable(void) +{ + jtag_send_instruction(RT_ISC_ENABLE, CPLD_INSTRUCTION_SIZE); + tap_idle(); +} + +/* + * jtag_erase + * JTAG erases the timing + */ +static void jtag_erase(void) +{ + int i; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->first_erase_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + jtag_send_instruction(ISC_ERASE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + for (i = 0; i < ERASE_DELAY; i++) { + tap_idle(); + tap_idle(); + } + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->second_erase_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + jtag_send_instruction(ISC_ERASE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + for (i = 0; i < ERASE_DELAY; i++) { + tap_idle(); + tap_idle(); + } + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->third_erase_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + jtag_send_instruction(ISC_ERASE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + for (i = 0; i < ERASE_DELAY; i++) { + tap_idle(); + tap_idle(); + } +} + +/* + * jtag_blank_check + * JTAG blank detection */ +static void jtag_blank_check(void) +{ + int j; + int data; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->first_blank_check_length; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + } + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x1, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->second_blank_check_length; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + } +} + +/* + * jtag_verify1 + * function :JTAG content validation + * @buffer : param[in] original data + * return value 0 validation success; -1 validation failed + */ +static int jtag_verify1(unsigned int *buffer) +{ + int j, ret = 0; + unsigned int data; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->eeprom_array_length; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + + if (data != buffer[j]) { + FIRMWARE_DRIVER_DEBUG_ERROR("%d: %02x, %02x.\n", j, data, buffer[j]); + ret = -1; + break; + } + } + return ret; +} + +/* + * jtag_read_buffer + * function:JTAG internal data reading + * @size: param[in] Read size + * @buffer: param[out] Pointer to read data + */ +static void jtag_read_buffer(unsigned int *buffer, int size) +{ + int j; + int data; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < size; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + buffer[j] = data; + } +} + +/* + * jtag_program + * function:JTAG programming timing + * @buffer: param[in] data pointer to program + */ +static void jtag_program(unsigned int *buffer) +{ + int i, j; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->eeprom_array_length; j++) { + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_send_data(buffer[j], chip_cpld_info->data_register_length); + for (i = 0; i < PROGRAM_DELAY; i++) { + tap_idle(); + tap_idle(); + } + } +} + +/* + * cpld_read_id + * function: CPLD chip ID read + * @chip: param[in] chip index + * id : param[out] ID point */ +static void cpld_read_id(int chip, unsigned int *id) +{ + u8 data[sizeof(int)]; + if (!chip_num || chip > chip_num) { + return; + } + current_chip_index = chip; + /* Send instructions */ + jtag_send_instruction(IDCODE, CPLD_INSTRUCTION_SIZE); + /* Read Data */ + jtag_read_data(data, sizeof(int)); + *id = (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]; +} + +/* + * chip_num_init + * function:CPLD number of chips initialized */ +static void chip_num_init(void) +{ + unsigned int i, id; + unsigned char buf[sizeof(int) * CPLD_MAX_CHIP]; + chip_num = 0; + + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_capture_dr(); + tap_shift_dr(); + + for (i = 0; i < sizeof(int) * CPLD_MAX_CHIP; i++) { + tap_rcv_byte(&buf[i]); + } + + /* JTAG state switching */ + tap_exit1_dr(0); + tap_update_dr(); + tap_run_test_idle(); + + for (i = 0; i < sizeof(int) * CPLD_MAX_CHIP; i += 4) { + id = (buf[i + 3] << 24) | (buf[i + 2] << 16) | (buf[i + 1] << 8) | buf[i]; + FIRMWARE_DRIVER_DEBUG_VERBOSE("ID: %04x\n", id); + if (id != 0xFFFFFFFF && id != 0) { + chip_num++; + } + } +} + +/* + * cpld_reset + * function: reset JTAG + * @chip: param[in] chip index + */ +static void cpld_reset(int chip) +{ + unsigned int chip_type_id = 0; + int i; + /* JTAG enters the reset state */ + tap_test_logic_reset(); + /* Gets the number of chips in the CPLD */ + chip_num_init(); + if (!chip_num) { + pr_notice("There is no CPLD chip or the chip is not supported!!\r\n"); + FIRMWARE_DRIVER_DEBUG_ERROR("chip_num == NULL.\n"); + } else { + FIRMWARE_DRIVER_DEBUG_VERBOSE("enter cpld read id.\n"); + current_chip_index = chip; + /* Read chip ID */ + cpld_read_id(current_chip_index, &chip_type_id); + FIRMWARE_DRIVER_DEBUG_VERBOSE("get cpld id: 0x%x.\n", chip_type_id); + for (i = 0; cpld_id_table[i].name != NULL; i++) { + if (cpld_id_table[i].id == chip_type_id) { + chip_cpld_info = &cpld_id_table[i]; + break; + } + } + } + current_chip_index = -1; + tap_test_logic_reset(); +} + +/* + * cpld_program + * function: CPLD programming interface + * @chip: param[in] Chip serial number/chip index + * @buffer: param[in] data pointer to program + * return value: 0 success; -1 fail + */ +static int cpld_program(int chip, unsigned int *buffer) +{ + int ret; + int counte; + + if (!chip_num || chip > chip_num + || chip_cpld_info == NULL) { + return -1; + } + current_chip_index = chip; + + /* Enter Real-Time ISP mode */ + jtag_rt_enable(); + /* JTAG internal ID reading */ + jtag_verify_idcode(); + /* JTAG erases */ + jtag_erase(); + /* JTAG blank detection */ + jtag_blank_check(); + /* JTAG programming timing */ + jtag_program(buffer); + + /* In the process of upgrade, there is a problem with reading data, + * which may occur in the process of reading. Some bit reading fails, + * but the reason is not found. + * Avoidance resolution: perform multiple checks */ + for (counte = 0; counte < 4; counte++) { + ret = jtag_verify1(buffer); + if (counte > 0) { + pr_notice("Verify again(%d).\n", counte + 1); + } + + if (ret == 0) { + break; + } + } + pr_notice("Write chip %d cpld success(%d).\n", chip, ret); + jtag_program_donebit(); + + /* JTAG Disable state machine under Real-Time ISP */ + jtag_rt_disable(); + + return ret; +} + +static void cpld_read_buffer(int chip, unsigned int *buffer, unsigned int size) +{ + if (!chip_num || chip > chip_num + || chip_cpld_info == NULL) { + return; + } + current_chip_index = chip; + + /* Enter Real-Time ISP mode */ + jtag_rt_enable(); + + /* JTAG internal ID reading */ + jtag_verify_idcode(); + + /* JTAG internal data reading */ + jtag_read_buffer(buffer, size); + + jtag_rt_disable(); + +} + +/* + * cpld_eeprom_size + * function:CPLD chip capacity size + * return value :Returns chip capacity on success, or 0 on failure + */ +static int cpld_eeprom_size(void) +{ + int ret; + + if (!chip_num || chip_cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("chip_num:%d or chip_cpld_info == NULL.\n", chip_num); + ret = 0; + } else { + ret = chip_cpld_info->eeprom_array_length; + FIRMWARE_DRIVER_DEBUG_ERROR("chip_cpld_info->eeprom_array_length = %d.\n", + chip_cpld_info->eeprom_array_length); + } + + return ret; +} + +/* + * cpld_read_name + * function: Gets the CPLD chip name + * @chip: param[in] Chip serial number/chip index + * return value :chip name */ +static char *cpld_read_name(int chip) +{ + uint chip_type_id; + int i; + + chip_type_id = 0; + cpld_read_id(chip, &chip_type_id); + for (i = 0; cpld_id_table[i].name != NULL; i++) { + if (cpld_id_table[i].id == chip_type_id) { + return cpld_id_table[i].name; + } + } + + return NULL; +} + +/* + * cpld_upgrade_init + * function:Initialize GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_init(void) +{ + int ret; + + if (function_fmw_cpld.init_cpld != NULL) { + ret = function_fmw_cpld.init_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +/* + * cpld_upgrade_finish + * function:Release GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_finish(void) +{ + int ret; + + if (function_fmw_cpld.finish_cpld != NULL) { + ret = function_fmw_cpld.finish_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +static int cpld_str_hex_to_dec(char *str, char end_char) +{ + int i; + int result; + + if (str == NULL) { + return FIRMWARE_FAILED; + } + + i = 0; + result = 0; + while (str[i] != end_char) { + /* Check for hexadecimal characters:0123456789abcdef */ + if (!isxdigit(str[i]) || i >= CPLD_UNIT_SZ) { + return FIRMWARE_FAILED; + } + /* Check for a number between 0 and 9 */ + if (isdigit(str[i])) { + result = result * CPLD_HEX + str[i] - '0'; + } + /* Check if the character is uppercase */ + else if (isupper(str[i])) { + result = result * CPLD_HEX + str[i] - 'A' + DEC_VAL; + } else { + result = result * CPLD_HEX + str[i] - 'a' + DEC_VAL; + } + + i++; + } + + return result; +} + +static int cpld_check_upgrade_data(char *src, int src_len, int *dst, int dst_len) +{ + int i, init_lcnt, tmp; + char *ptr; + int ret; + + if (src == NULL || dst == NULL) { + return FIRMWARE_FAILED; + } + /* Pointers the ptr pointer to the data following the CPLD_INIT_KEYWORD */ + ret = FIRMWARE_SUCCESS; + ptr = strstr(src, CPLD_INIT_KEYWORD); + if (ptr == NULL) { + return FIRMWARE_FAILED; + } else { + ptr += strlen(CPLD_INIT_KEYWORD); + while (*ptr == '(' || *ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + /* Converts a hexadecimal string to decimal, with 4 groups of 4 bytes each */ + i = 0; + init_lcnt = 0; + for (init_lcnt = 0; init_lcnt < CPLD_INIT_CNT; init_lcnt++) { + tmp = cpld_str_hex_to_dec(ptr, CPLD_END_CHAR); + if (tmp < 0) { + ret = tmp; + return ret; + } + /* int type is 4 bytes */ + dst[i++] = tmp; + if (i >= dst_len) { + return FIRMWARE_SUCCESS; + } + + ptr += CPLD_UNIT_SZ + 1; + + while (*ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + /* Point the ptr pointer to the data after CPLD_REPEAT_KEYWORD */ + ptr = strstr(src, CPLD_REPEAT_KEYWORD); + if (ptr == NULL) { + return FIRMWARE_FAILED; + } else { + ptr += strlen(CPLD_REPEAT_KEYWORD); + while (*ptr == '(' || *ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + while (1) { + /* Converts the 4 bytes before ',' to base 10 */ + tmp = cpld_str_hex_to_dec(ptr, CPLD_END_CHAR); + if (tmp < 0) { + ret = tmp; + break; + } + dst[i++] = tmp; + if (i >= dst_len) { + return FIRMWARE_SUCCESS; + } + + ptr += CPLD_UNIT_SZ + 1; + + while (*ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_get_chip_name + * function:get chip name + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @len: param[in] chip name length + * @info: param[out] chip name + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_get_chip_name(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int ret; + char *name; + + /* Check the input and output parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to get chip name.\n"); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit." + "(chain = %d, current chain = %d, current name: %s)\n", + chain, current_fmw_cpld->chain, current_fmw_cpld->devname); + } + + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error:Failed to get chip name when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG */ + cpld_reset(current_fmw_cpld->chip_index); + /* Read chip name */ + name = cpld_read_name(current_fmw_cpld->chip_index); + if (name == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get chip name when read name.(chain %d, index %d)\n", + chain, current_fmw_cpld->chip_index); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + /* Release GPIO */ + ret = cpld_upgrade_finish( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get chip name when finish upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + strncpy(info, name, len); + + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_program + * function:Upgrade CPLD(ISC file format) + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @info: param[in] Data to be written + * @len: param[in] Length of data to be written + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_program(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int i; + int time; + int ret; + int target_len; + int *target_buf; + + /* Check the input parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to program chip.\n"); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG */ + cpld_reset(current_fmw_cpld->chip_index); + /* CPLD chip capacity size */ + target_len = cpld_eeprom_size(); + if (target_len <= 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get cpld size.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + target_buf = (int *) kzalloc(target_len * sizeof(int), GFP_KERNEL); + if (target_buf == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to malloc target buffer.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("cpld_check_upgrade_data start.(chain = %d, %d)\n", + chain, target_len); + /* Remove extraneous information */ + ret = cpld_check_upgrade_data(info, len, target_buf, target_len); + if (ret < 0){ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to check data.(chain = %d)\n", + chain); + kfree(target_buf); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + for (i = 0; i < 16 * 8; i += 8) { + FIRMWARE_DRIVER_DEBUG_VERBOSE(" %x %x %x %x %x %x %x %x\n", + target_buf[i], target_buf[i + 1], + target_buf[i + 2], target_buf[i + 3], + target_buf[i + 4], target_buf[i + 5], + target_buf[i + 6], target_buf[i + 7]); + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("cpld_check_upgrade_data finish.(chain = %d)\n", chain); + + /* CPLD device writing */ + for (time = 0; time < 10; time++) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("Start upgrade cpld: %d.(chain = %d)\n", time, chain); + ret = cpld_program(current_fmw_cpld->chip_index, target_buf); + if (ret >= 0) { + break; + } + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program.(chain = %d)\n", chain); + kfree(target_buf); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("SUCCESS PROGRAM.\n"); + + /* Release GPIO */ + ret = cpld_upgrade_finish(); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program when finish upgrade.(chain = %d)\n", + chain); + } + + kfree(target_buf); + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_program_jbi + * function: Upgrade CPLD(JBI file format) + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @info: param[in] Data to be written + * @len: param[in] Length of data to be written + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_program_jbi(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int time, ret; + int argc = 3; + char *argv[] = { + "-r", + "-aprogram", + "-ddo_real_time_isp=1" + }; + + /* Check the input parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to program chip %d(%p,%p,%d).\n", + chain, cpld, info, len); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG */ + cpld_reset(current_fmw_cpld->chip_index); + + for (time = 0; time < 30; time++) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("Start upgrade cpld: %d.(chain = %d)\n", time, chain); + ret = jbi_main((unsigned char *) info, (unsigned long) len, argc, argv); + if (ret == 0) { + break; + } + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program.(chain = %d)\n", chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + FIRMWARE_DRIVER_DEBUG_VERBOSE("SUCCESS PROGRAM.\n"); + + /* Release GPIO and CPLD */ + ret = cpld_upgrade_finish( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program when finish upgrade.(chain = %d)\n", + chain); + } + + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_get_version + * function: get version + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @len: param[in] Data length + * @info: param[out] Version information buffer + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_get_version(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int ret; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to get version.\n"); + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + + /* CPLD device can't get version */ + if (function_fmw_cpld.get_version != NULL) { + ret = function_fmw_cpld.get_version(chain, info, len); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed get version in chain: %d.\n", chain); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("The get_version is NULL in chain: %d.\n", chain); + } + + return FIRMWARE_FAILED; +} + +/** + * fmw_cpld_upg_get_chip_info + * function: Get chip content + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @len: param[in] Data length + * @info: param[out] Read Data Buffer + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_get_chip_info(int chain, firmware_cpld_t *cpld, void *info, int len) +{ + int i; + int ret; + int target_len; + int *target_buf; + + /* Check input and output parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to read chip.\n"); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to read chip: %s.\n",current_fmw_cpld->devname); + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG*/ + cpld_reset(current_fmw_cpld->chip_index); + /* CPLD chip capacity size */ + target_len = cpld_eeprom_size(); + if (target_len <= 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get cpld size.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + target_buf = (int *) kzalloc(target_len * sizeof(int), GFP_KERNEL); + if (target_buf == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to malloc target buffer.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + /* Read chip */ + cpld_read_buffer(current_fmw_cpld->chip_index, target_buf, target_len); + + for (i = 0; i < 16 * 8; i += 8) { + FIRMWARE_DRIVER_DEBUG_VERBOSE(" %x %x %x %x %x %x %x %x\n", + target_buf[i], target_buf[i + 1], + target_buf[i + 2], target_buf[i + 3], + target_buf[i + 4], target_buf[i + 5], + target_buf[i + 6], target_buf[i + 7]); + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Success Read.\n"); + + /* Release GPIO and CPLD */ + ret = cpld_upgrade_finish( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program when finish upgrade.(chain = %d)\n", + chain); + } + + if (copy_to_user(info, target_buf, (len > target_len) ? target_len : len)) { + kfree(target_buf); + return FIRMWARE_FAILED; + } + + kfree(target_buf); + return FIRMWARE_SUCCESS; +} + +/** + * jbi_jtag_io_ + * function: JBI GPIO operation + * @tms: param[in] TMS signal level + * @tdi: param[in] TDI signal level + * @read_tdo: param[in] Whether to read the level of the TDO + * return value : tdo + */ +int __attribute__ ((weak)) jbi_jtag_io_(int tms, int tdi, int read_tdo) +{ + int tdo = 0; + + if (tms) { + TMS_PULL_UP(); + } else { + TMS_PULL_DOWN(); + } + + if (tdi) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + + TCK_PULL_UP(); + ndelay(TCK_DELAY); + + if (read_tdo) { + tdo = TDO_READ(); + } + + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + + return tdo; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h new file mode 100644 index 000000000000..3a6ab117df5d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h @@ -0,0 +1,82 @@ +#ifndef __FIRMWARE_H__ +#define __FIRMWARE_H__ + +#include +#include + +#include + +/* Debug switch level */ +typedef enum { + FIRWMARE_VERBOSE, + FIRWMARE_WARN, + FIRWMARE_ERROR, + FIRWMARE_END, +} firmware_debug_level_t; + +#define FIRMWARE_DRIVER_DEBUG_VERBOSE(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_VERBOSE)) { \ + printk(KERN_INFO "[FIRMWARW_DRIVER_CPLD][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_DRIVER_DEBUG_ERROR(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_ERROR)) { \ + printk(KERN_ERR "[FIRMWARW_DRIVER_CPLD][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_NAME_LEN 48 + +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS 0 + +/* ioctl publi command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ + +/* firmware cpld driver ioctl command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_TYPE 'J' +#define FIRMWARE_PROGRAM _IOW(FIRMWARE_TYPE, 1, char) /* firmware upgrade ISC */ +#define FIRMWARE_READ_CHIP _IOR(FIRMWARE_TYPE, 5, int) /* read the contents of the chip */ +#define FIRMWARE_PROGRAM_JBI _IOW(FIRMWARE_TYPE, 6, char) /* firmware upgrade JBI */ + +typedef struct cmd_info_s { + uint32_t size; + void __user *data; +} cmd_info_t; + +typedef struct firmware_device_s { + struct list_head list; /* device list */ + uint32_t chain; /* chain number */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct miscdevice dev; /* device */ + void *priv; /* private data */ +} firmware_device_t; + +typedef struct firmware_driver_s { + struct list_head list; /* list */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct platform_driver *drv; /* driver */ + void *priv; /* private data */ +} firmware_driver_t; + +extern int g_firmware_driver_debug; + +/* Get device information based on minor */ +extern firmware_device_t *firmware_get_device_by_minor(int minor); +/* Registere device */ +extern int firmware_device_register(firmware_device_t *fw_dev); +/* Unregister device */ +extern void firmware_device_unregister(firmware_device_t *fw_dev); +/* Registere driver */ +extern int firmware_driver_register(firmware_driver_t *fw_drv); +/* Unregister driver */ +extern void firmware_driver_unregister(firmware_driver_t *fw_drv); +/* CPLD upgrade initialized */ +extern int firmware_cpld_init(void); +/* CPLD unload function */ +extern void firmware_cpld_exit(void); + +#endif /* end of __FIRMWARE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h new file mode 100644 index 000000000000..ef69655a4b2e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h @@ -0,0 +1,64 @@ +#ifndef __FIRMWARE_CPLD_H__ +#define __FIRMWARE_CPLD_H__ + +#define FIRMWARE_DEV_NAME_LEN 32 +#define FIRMWARE_MAX_CPLD_NUM 16 +#define FIRMWARE_TYPE_LEN 10 +#define FIRMWARE_EN_INFO_MAX 16 +#define FIRMWARE_EN_INFO_BUF 128 + +typedef struct firmware_gpio_jtag_en_s { + uint32_t en_gpio; /* GPIO enable pin */ + uint32_t en_level; /* GPIO enable level */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_gpio_jtag_en_t; + +typedef struct firmware_cpld_s { + char devname[FIRMWARE_DEV_NAME_LEN]; /* Device name */ + char type[FIRMWARE_TYPE_LEN]; /* interface type */ + uint32_t tdi; /* TDI signal corresponding to GPIO pin information */ + uint32_t tck; /* TCK signal corresponding to GPIO pin information */ + uint32_t tms; /* TMS signal corresponding to GPIO pin information */ + uint32_t tdo; /* TDO signal corresponding to GPIO pin information */ + uint32_t chain; /* chain num */ + uint32_t chip_index; /* chip index */ + uint32_t tck_delay; /* Delay time */ + uint32_t gpio_en_info_num; /* GPIO Enable Number */ + firmware_gpio_jtag_en_t gpio_en_info[FIRMWARE_EN_INFO_MAX]; /* GPIO Enable Information */ +} firmware_cpld_t; + +typedef struct firmware_cpld_function_s{ + int (*pull_tdi_up)(void); /* TDI pull-up */ + int (*pull_tdi_down)(void); /* TDI pull-down */ + int (*pull_tck_up)(void); /* TCK pull-up */ + int (*pull_tck_down)(void); /* TCK pull-down */ + int (*pull_tms_up)(void); /* TMS pull-up */ + int (*pull_tms_down)(void); /* TCK pull-down */ + int (*read_tdo)(void); /* Read TDO */ + int (*init_cpld)(void); /* CPLD upgrade initializes the operation */ + int (*init_chip)(int chain); /* chip initializes the operation */ + int (*finish_chip)(int chain); /* chip completes the operation*/ + int (*finish_cpld)(void); /* CPLD upgrade completes the operation */ + int (*get_version)(int chain, char *ver, int len); /* get version */ +}firmware_cpld_function_t; + +/* get chip name */ +extern int fmw_cpld_upg_get_chip_name(int chain, firmware_cpld_t *cpld, char *info, int len); +/* ISC firmware upgrad */ +extern int fmw_cpld_upg_program(int chain, firmware_cpld_t *cpld, char *info, int len); +/* get version */ +extern int fmw_cpld_upg_get_version(int chain, firmware_cpld_t *cpld, char *info, int len); +/* Read the contents of Chip */ +extern int fmw_cpld_upg_get_chip_info(int chain, firmware_cpld_t *cpld, void *info, int len); +/* operate TDI */ +extern int fwm_cpld_tdi_op(int value); +/* operate TCK */ +extern int fwm_cpld_tck_op(int value); +/* operate TMS */ +extern int fwm_cpld_tms_op(int value); +/* operate TDO */ +extern int fwm_cpld_tdo_op(void); +/* JBI firmware upgrad */ +extern int fmw_cpld_upg_program_jbi(int chain, firmware_cpld_t *cpld, char *info, int len); + +#endif /* __FIRMWARE_CPLD_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h new file mode 100644 index 000000000000..865c8d352174 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h @@ -0,0 +1,15 @@ +#ifndef __JBI_H__ +#define __JBI_H__ + +#include + +/* JTAG operation interface*/ +extern int jbi_jtag_io_(int tms, int tdi, int read_tdo); +/* delay function */ +extern void jbi_jtag_udelay(unsigned long us); +/* Debug switch */ +extern int jbi_debug(int level); +/* JBI upgrade function */ +extern int jbi_main(unsigned char *addr, unsigned long size, int argc, char * const argv[]); + +#endif /* __JBI_JTAG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c new file mode 100644 index 000000000000..064d0ae50ec4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c @@ -0,0 +1,438 @@ +/****************************************************************************/ +/* */ +/* Module: jbicomp.c */ +/* */ +/* Copyright (C) Altera Corporation 1997-2001 */ +/* */ +/* Description: Contains the code for compressing and uncompressing */ +/* Boolean array data. */ +/* */ +/* This algorithm works by searching previous bytes in the */ +/* data that match the current data. If a match is found, */ +/* then the offset and length of the matching data can */ +/* replace the actual data in the output. */ +/* */ +/* Revisions: 2.2 fixed /W4 warnings */ +/* */ +/****************************************************************************/ + +#include "jbiport.h" +#include "jbiexprt.h" +#include "jbicomp.h" +#include "jbistub.h" + +#define SHORT_BITS 16 +#define CHAR_BITS 8 +#define DATA_BLOB_LENGTH 3 +#define MATCH_DATA_LENGTH 8192 +#define JBI_ACA_REQUEST_SIZE 1024 +#define JBI_ACA_BUFFER_SIZE (MATCH_DATA_LENGTH + JBI_ACA_REQUEST_SIZE) + +unsigned long jbi_in_length = 0L; +unsigned long jbi_in_index = 0L; /* byte index into compressed array */ +unsigned int jbi_bits_avail = CHAR_BITS; + +#if PORT == DOS +int jbi_current_variable_id = -1; +int jbi_current_page = -1; +int jbi_version = 0; +unsigned long jbi_out_length = 0L; +unsigned int jbi_out_index = 0; /* byte index into jbi_aca_out_buffer[] */ +unsigned long jbi_aca_in_offset = 0L; +unsigned char jbi_aca_out_buffer[JBI_ACA_BUFFER_SIZE]; +#endif + +/****************************************************************************/ +/* */ +/* The following functions implement incremental decompression of Boolean */ +/* array data, using a small memory window. */ +/* */ +/* This algorithm works by searching previous bytes in the data that match */ +/* the current data. If a match is found, then the offset and length of */ +/* the matching data can replace the actual data in the output. */ +/* */ +/* Memory usage is reduced by maintaining a "window" buffer which contains */ +/* the uncompressed data for one 8K page, plus some extra amount specified */ +/* by JBI_ACA_REQUEST_SIZE. The function jbi_uncompress_page() is used to */ +/* request a subrange of the uncompressed data, starting at a particular */ +/* bit position and extending a maximum of JBI_ACA_REQUEST_SIZE bytes. */ +/* */ +/****************************************************************************/ + +/****************************************************************************/ +/* */ + +unsigned int jbi_bits_required(unsigned int n) + +/* */ +/* Description: Calculate the minimum number of bits required to */ +/* represent n. */ +/* */ +/* Returns: Number of bits. */ +/* */ +/****************************************************************************/ +{ + unsigned int result = SHORT_BITS; + + if (n == 0) + { + result = 1; + } + else + { + /* Look for the highest non-zero bit position */ + while ((n & (1 << (SHORT_BITS - 1))) == 0) + { + n <<= 1; + --result; + } + } + + return (result); +} + +/****************************************************************************/ +/* */ + +unsigned int jbi_read_packed +( +#if PORT!=DOS + unsigned char *buffer, +#endif + unsigned int bits +) + +/* */ +/* Description: Read the next value from the input array "buffer". */ +/* Read only "bits" bits from the array. The amount of */ +/* bits that have already been read from "buffer" is */ +/* stored internally to this function. */ +/* */ +/* Returns: Up to 16 bit value. -1 if buffer overrun. */ +/* */ +/****************************************************************************/ +{ + unsigned int result = 0; + unsigned int shift = 0; + unsigned int databyte = 0; + + while (bits > 0) + { +#if PORT==DOS + databyte = GET_BYTE(jbi_aca_in_offset + jbi_in_index); +#else + databyte = buffer[jbi_in_index]; +#endif + result |= (((databyte >> (CHAR_BITS - jbi_bits_avail)) + & (0xFF >> (CHAR_BITS - jbi_bits_avail))) << shift); + + if (bits <= jbi_bits_avail) + { + result &= (0xFFFF >> (SHORT_BITS - (bits + shift))); + jbi_bits_avail -= bits; + bits = 0; + } + else + { + ++jbi_in_index; + shift += jbi_bits_avail; + bits -= jbi_bits_avail; + jbi_bits_avail = CHAR_BITS; + } + } + + return (result); +} + +#if PORT==DOS + +/****************************************************************************/ +/* */ + +void jbi_uncompress_next_page(int version) + +/* */ +/* Description: Uncompresses one page of compressed data, using */ +/* data page as reference for repeated sections. */ +/* Overwrites previous page of data in buffer. */ +/* */ +/* Returns: TRUE for success, FALSE if error encountered */ +/* */ +/****************************************************************************/ +{ + unsigned int i, j, offset, length; + unsigned int end_index; + unsigned long tmp_in_index = jbi_in_index; + unsigned int tmp_out_index = jbi_out_index; + unsigned int tmp_bits_avail = jbi_bits_avail; + unsigned int prev[3]; + unsigned long long_end; + unsigned int match_data_length = MATCH_DATA_LENGTH; + + if (version > 0) --match_data_length; + + if (jbi_current_page < 0) + { + /* this is the first page of the array */ + jbi_current_page = 0; + jbi_in_index = 4; /* skip over length field */ + jbi_out_index = 0; + end_index = (jbi_out_length < JBI_ACA_BUFFER_SIZE) ? + (unsigned int) jbi_out_length : JBI_ACA_BUFFER_SIZE; + } + else + { + /* this is not the first page */ + ++jbi_current_page; + jbi_out_index -= MATCH_DATA_LENGTH; + long_end = jbi_out_length - + ((long) jbi_current_page * (long) MATCH_DATA_LENGTH); + end_index = (long_end < JBI_ACA_BUFFER_SIZE) ? + (unsigned int) long_end : JBI_ACA_BUFFER_SIZE; + + /* copy extra data from end of circular buffer to beginning */ + for (i = 0; i < jbi_out_index; ++i) + { + jbi_aca_out_buffer[i] = jbi_aca_out_buffer[i + MATCH_DATA_LENGTH]; + } + } + + while (jbi_out_index < end_index) + { + /* save state so we can undo the last packet when we reach the end */ + tmp_in_index = jbi_in_index; + tmp_out_index = jbi_out_index; + tmp_bits_avail = jbi_bits_avail; + + /* A 0 bit indicates literal data. */ + if (jbi_read_packed(1) == 0) + { + for (i = 0; i < DATA_BLOB_LENGTH; ++i) + { + if (jbi_out_index < end_index) + { + if (version == 0) + { + prev[i] = jbi_aca_out_buffer[jbi_out_index] & 0xff; + } + jbi_aca_out_buffer[jbi_out_index++] = + (unsigned char) jbi_read_packed(CHAR_BITS); + } + } + } + else + { + /* A 1 bit indicates offset/length to follow. */ + offset = jbi_read_packed(jbi_bits_required( + (jbi_current_page > 0) ? match_data_length : + (jbi_out_index > match_data_length ? match_data_length : + jbi_out_index))); + length = jbi_read_packed(CHAR_BITS); + + if ((version == 0) && (offset == match_data_length + 3)) + { + jbi_aca_out_buffer[jbi_out_index++] = (unsigned char) prev[0]; + jbi_aca_out_buffer[jbi_out_index++] = (unsigned char) prev[1]; + jbi_aca_out_buffer[jbi_out_index++] = (unsigned char) prev[2]; + length -= 3; + } + + for (i = 0; i < length; ++i) + { + if (jbi_out_index < end_index) + { + if (offset > jbi_out_index) + { + j = jbi_out_index + MATCH_DATA_LENGTH - offset; + } + else j = jbi_out_index - offset; + jbi_aca_out_buffer[jbi_out_index] = jbi_aca_out_buffer[j]; + ++jbi_out_index; + } + } + + if (version == 0) + { + prev[0] = jbi_aca_out_buffer[jbi_out_index - 3] & 0xff; + prev[1] = jbi_aca_out_buffer[jbi_out_index - 2] & 0xff; + prev[2] = jbi_aca_out_buffer[jbi_out_index - 1] & 0xff; + } + } + } + + /* restore the state before the previous packet */ + jbi_in_index = tmp_in_index; + jbi_out_index = tmp_out_index; + jbi_bits_avail = tmp_bits_avail; +} + +/****************************************************************************/ +/* */ + +void jbi_uncompress_page +( + int variable_id, + int page, + int version +) + +/* */ +/* Description: Uncompress requested page of variable data. Stores */ +/* uncompressed data in jbi_aca_out_buffer[]. */ +/* */ +/* Returns: TRUE if successful, otherwise FALSE if: */ +/* 1) variable is not a compressed array */ +/* 2) compressed data is illegal or corrupted */ +/* 3) requested page is beyond the end of the array */ +/* 4) internal error in the code */ +/* */ +/****************************************************************************/ +{ + unsigned long symbol_table; + unsigned long data_section; + unsigned long offset; + unsigned long value; + int delta = version * 2; + + if (variable_id != jbi_current_variable_id) + { + /* initialize to uncompress the desired variable */ + symbol_table = GET_DWORD(16 + (version * 8)); + data_section = GET_DWORD(20 + (version * 8)); + offset = symbol_table + ((11 + delta) * variable_id); + value = GET_DWORD(offset + 3 + delta); + jbi_current_variable_id = variable_id; + jbi_current_page = -1; + jbi_bits_avail = CHAR_BITS; + jbi_in_length = GET_DWORD(offset + 7 + delta); + jbi_out_length = + (((unsigned long) GET_BYTE(data_section + value)) | + (((unsigned long) GET_BYTE(data_section + value + 1)) << 8) | + (((unsigned long) GET_BYTE(data_section + value + 2)) << 16) | + (((unsigned long) GET_BYTE(data_section + value + 3)) << 24)); + jbi_in_index = 4; /* skip over length field */ + jbi_out_index = 0; + jbi_aca_in_offset = data_section + value; + } + + /* to look back at an earlier page, start over at the beginning */ + if (page < jbi_current_page) + { + jbi_current_page = -1; + jbi_in_index = 4; /* skip over length field */ + jbi_bits_avail = CHAR_BITS; + } + + /* uncompress sequentially up to the desired page */ + while (page > jbi_current_page) + { + jbi_uncompress_next_page(version); + } +} + +#else + +/****************************************************************************/ +/* */ + +unsigned long jbi_uncompress +( + unsigned char *in, + unsigned long in_length, + unsigned char *out, + unsigned long out_length, + int version +) + +/* */ +/* Description: Uncompress data in "in" and write result to "out". */ +/* */ +/* Returns: Length of uncompressed data. -1 if: */ +/* 1) out_length is too small */ +/* 2) Internal error in the code */ +/* 3) in doesn't contain ACA compressed data. */ +/* */ +/****************************************************************************/ +{ +#ifdef CONFIG_64BIT + unsigned int data_length = 0; +#else + unsigned long data_length = 0L; +#endif + unsigned long i, j; + unsigned int offset, length; + unsigned int match_data_length = MATCH_DATA_LENGTH; + + if (version > 0) --match_data_length; + + jbi_in_length = in_length; + jbi_bits_avail = CHAR_BITS; + jbi_in_index = 0L; + for (i = 0; i < out_length; ++i) out[i] = 0; + + /* Read number of bytes in data. */ +#ifdef CONFIG_64BIT + for (i = 0; i < sizeof(unsigned int); ++i) + { + data_length = data_length | ((unsigned int) + jbi_read_packed(in, CHAR_BITS) << (i * CHAR_BITS)); + } +#else + for (i = 0; i < sizeof (in_length); ++i) + { + data_length = data_length | ((unsigned long) + jbi_read_packed(in, CHAR_BITS) << (i * CHAR_BITS)); + } +#endif + + if (data_length > out_length) + { +#ifdef CONFIG_64BIT + jbi_dbg(DEBUG_ERR, "data_length(0x%x,0x%lx)\n", + data_length, out_length); + data_length = 0; +#else + jbi_dbg(DEBUG_ERR, "data_length(0x%lx,0x%lx)\n", + data_length, out_length); + data_length = 0L; +#endif + } + else + { + i = 0; + while (i < data_length) + { + /* A 0 bit indicates literal data. */ + if (jbi_read_packed(in, 1) == 0) + { + for (j = 0; j < DATA_BLOB_LENGTH; ++j) + { + if (i < data_length) + { + out[i] = (unsigned char) jbi_read_packed(in, CHAR_BITS); + i++; + } + } + } + else + { + /* A 1 bit indicates offset/length to follow. */ + offset = jbi_read_packed(in, jbi_bits_required((short) (i > match_data_length ? match_data_length : i))); + length = jbi_read_packed(in, CHAR_BITS); + + for (j = 0; j < length; ++j) + { + if (i < data_length) + { + out[i] = out[i - offset]; + i++; + } + } + } + } + } + + return (data_length); +} + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h new file mode 100644 index 000000000000..4dacdcd5d773 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h @@ -0,0 +1,37 @@ +/****************************************************************************/ +/* */ +/* Module: jbicomp.h */ +/* */ +/* Copyright (C) Altera Corporation 1997-2001 */ +/* */ +/* Description: Contains the function prototypes for compressing */ +/* and uncompressing Boolean array data. */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBICOMP_H +#define INC_JBICOMP_H + +#if PORT==DOS + +void jbi_uncompress_page +( + int variable_id, + int page, + int version +); + +#else + +unsigned long jbi_uncompress +( + unsigned char *in, + unsigned long in_length, + unsigned char *out, + unsigned long out_length, + int version +); + +#endif /* PORT==DOS */ + +#endif /* INC_JBICOMP_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h new file mode 100644 index 000000000000..ef4699dd6db3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h @@ -0,0 +1,224 @@ +/****************************************************************************/ +/* */ +/* Module: jbiexprt.h */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Jam STAPL ByteCode Player Export Header File */ +/* */ +/* Revisions: */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBIEXPRT_H +#define INC_JBIEXPRT_H + +/****************************************************************************/ +/* */ +/* Return codes from most JBI functions */ +/* */ +/****************************************************************************/ + +#define JBI_RETURN_TYPE int + +#define JBIC_SUCCESS 0 +#define JBIC_OUT_OF_MEMORY 1 +#define JBIC_IO_ERROR 2 +/* #define JAMC_SYNTAX_ERROR 3 */ +#define JBIC_UNEXPECTED_END 4 +#define JBIC_UNDEFINED_SYMBOL 5 +/* #define JAMC_REDEFINED_SYMBOL 6 */ +#define JBIC_INTEGER_OVERFLOW 7 +#define JBIC_DIVIDE_BY_ZERO 8 +#define JBIC_CRC_ERROR 9 +#define JBIC_INTERNAL_ERROR 10 +#define JBIC_BOUNDS_ERROR 11 +/* #define JAMC_TYPE_MISMATCH 12 */ +/* #define JAMC_ASSIGN_TO_CONST 13 */ +/* #define JAMC_NEXT_UNEXPECTED 14 */ +/* #define JAMC_POP_UNEXPECTED 15 */ +/* #define JAMC_RETURN_UNEXPECTED 16 */ +/* #define JAMC_ILLEGAL_SYMBOL 17 */ +#define JBIC_VECTOR_MAP_FAILED 18 +#define JBIC_USER_ABORT 19 +#define JBIC_STACK_OVERFLOW 20 +#define JBIC_ILLEGAL_OPCODE 21 +/* #define JAMC_PHASE_ERROR 22 */ +/* #define JAMC_SCOPE_ERROR 23 */ +#define JBIC_ACTION_NOT_FOUND 24 + +/****************************************************************************/ +/* */ +/* Macro Definitions */ +/* */ +/****************************************************************************/ + +/* +* For DOS port, program data is stored in a set of 16K pages, accessed +* through a pointer table. For 32-bit version, the buffer is continuous. +* The macro GET_BYTE gets a single byte for either case. +*/ +#if PORT==DOS +#define PROGRAM_PTR unsigned char ** +#else +#define PROGRAM_PTR unsigned char * +#endif + +#if PORT==DOS +#define GET_BYTE(x) (jbi_program[(x) >> 14L][(x) & 0x3fffL]) +#else +#define GET_BYTE(x) (program[x]) +#endif + +#define GET_WORD(x) \ + (((((unsigned short) GET_BYTE(x)) << 8) & 0xFF00) | \ + (((unsigned short) GET_BYTE((x)+1)) & 0x00FF)) + +#define GET_DWORD(x) \ + (((((unsigned long) GET_BYTE(x)) << 24L) & 0xFF000000L) | \ + ((((unsigned long) GET_BYTE((x)+1)) << 16L) & 0x00FF0000L) | \ + ((((unsigned long) GET_BYTE((x)+2)) << 8L) & 0x0000FF00L) | \ + (((unsigned long) GET_BYTE((x)+3)) & 0x000000FFL)) + +/****************************************************************************/ +/* */ +/* Structured Types */ +/* */ +/****************************************************************************/ + +typedef struct JBI_PROCINFO_STRUCT +{ + char *name; + unsigned char attributes; + struct JBI_PROCINFO_STRUCT *next; +} +JBI_PROCINFO; + +/****************************************************************************/ +/* */ +/* Global Data Prototypes */ +/* */ +/****************************************************************************/ + +#if PORT==DOS +extern unsigned char jbi_aca_out_buffer[8192 + 1024]; +#endif + +extern PROGRAM_PTR jbi_program; + +extern char *jbi_workspace; + +extern long jbi_workspace_size; + +/****************************************************************************/ +/* */ +/* Function Prototypes */ +/* */ +/****************************************************************************/ + +JBI_RETURN_TYPE jbi_execute +( + PROGRAM_PTR program, + long program_size, + char *workspace, + long workspace_size, + char *action, + char **init_list, + int reset_jtag, + long *error_address, + int *exit_code, + int *format_version +); + +JBI_RETURN_TYPE jbi_get_note +( + PROGRAM_PTR program, + long program_size, + long *offset, + char *key, + char *value, + int length +); + +JBI_RETURN_TYPE jbi_check_crc +( + PROGRAM_PTR program, + long program_size, + unsigned short *expected_crc, + unsigned short *actual_crc +); + +JBI_RETURN_TYPE jbi_get_file_info +( + PROGRAM_PTR program, + long program_size, + int *format_version, + int *action_count, + int *procedure_count +); + +JBI_RETURN_TYPE jbi_get_action_info +( + PROGRAM_PTR program, + long program_size, + int index, + char **name, + char **description, + JBI_PROCINFO **procedure_list +); + +int jbi_jtag_io +( + int tms, + int tdi, + int read_tdo +); + +void jbi_message +( + char *message_text +); + +void jbi_export_integer +( + char *key, + long value +); + +void jbi_export_boolean_array +( + char *key, + unsigned char *data, + long count +); + +void jbi_delay +( + long microseconds +); + +int jbi_vector_map +( + int signal_count, + char **signals +); + +int jbi_vector_io +( + int signal_count, + long *dir_vect, + long *data_vect, + long *capture_vect +); + +void *jbi_malloc +( + unsigned int size +); + +void jbi_free +( + void *ptr +); + +#endif /* INC_JBIEXPRT_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c new file mode 100644 index 000000000000..f013100eecb8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c @@ -0,0 +1,1679 @@ +/****************************************************************************/ +/* */ +/* Module: jbijtag.c */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Contains JTAG interface functions */ +/* */ +/* Revisions: 2.2 updated state transition paths */ +/* 2.0 added multi-page scan code for 16-bit PORT */ +/* */ +/****************************************************************************/ + +#include "jbiport.h" +#include "jbiexprt.h" +#include "jbicomp.h" +#include "jbijtag.h" + +#define NULL 0 + +char *jbi_workspace = NULL; +long jbi_workspace_size = 0L; + +/****************************************************************************/ +/* */ +/* Enumerated Types */ +/* */ +/****************************************************************************/ + +/* maximum JTAG IR and DR lengths (in bits) */ +#define JBIC_MAX_JTAG_IR_PREAMBLE 256 +#define JBIC_MAX_JTAG_IR_POSTAMBLE 256 +#define JBIC_MAX_JTAG_IR_LENGTH 512 +#define JBIC_MAX_JTAG_DR_PREAMBLE 1024 +#define JBIC_MAX_JTAG_DR_POSTAMBLE 1024 +#define JBIC_MAX_JTAG_DR_LENGTH 2048 + +/* +* Global variable to store the current JTAG state +*/ +JBIE_JTAG_STATE jbi_jtag_state = JBI_ILLEGAL_JTAG_STATE; + +/* +* Store current stop-state for DR and IR scan commands +*/ +JBIE_JTAG_STATE jbi_drstop_state = IDLE; +JBIE_JTAG_STATE jbi_irstop_state = IDLE; + +/* +* Store current padding values +*/ +unsigned int jbi_dr_preamble = 0; +unsigned int jbi_dr_postamble = 0; +unsigned int jbi_ir_preamble = 0; +unsigned int jbi_ir_postamble = 0; +unsigned int jbi_dr_length = 0; +unsigned int jbi_ir_length = 0; +unsigned char *jbi_dr_preamble_data = NULL; +unsigned char *jbi_dr_postamble_data = NULL; +unsigned char *jbi_ir_preamble_data = NULL; +unsigned char *jbi_ir_postamble_data = NULL; +unsigned char *jbi_dr_buffer = NULL; +unsigned char *jbi_ir_buffer = NULL; + +/* +* This structure shows, for each JTAG state, which state is reached after +* a single TCK clock cycle with TMS high or TMS low, respectively. This +* describes all possible state transitions in the JTAG state machine. +*/ +struct JBIS_JTAG_MACHINE +{ + JBIE_JTAG_STATE tms_high; + JBIE_JTAG_STATE tms_low; +} jbi_jtag_state_transitions[] = +{ +/* RESET */ { RESET, IDLE }, +/* IDLE */ { DRSELECT, IDLE }, +/* DRSELECT */ { IRSELECT, DRCAPTURE }, +/* DRCAPTURE */ { DREXIT1, DRSHIFT }, +/* DRSHIFT */ { DREXIT1, DRSHIFT }, +/* DREXIT1 */ { DRUPDATE, DRPAUSE }, +/* DRPAUSE */ { DREXIT2, DRPAUSE }, +/* DREXIT2 */ { DRUPDATE, DRSHIFT }, +/* DRUPDATE */ { DRSELECT, IDLE }, +/* IRSELECT */ { RESET, IRCAPTURE }, +/* IRCAPTURE */ { IREXIT1, IRSHIFT }, +/* IRSHIFT */ { IREXIT1, IRSHIFT }, +/* IREXIT1 */ { IRUPDATE, IRPAUSE }, +/* IRPAUSE */ { IREXIT2, IRPAUSE }, +/* IREXIT2 */ { IRUPDATE, IRSHIFT }, +/* IRUPDATE */ { DRSELECT, IDLE } +}; + +/* +* This table contains the TMS value to be used to take the NEXT STEP on +* the path to the desired state. The array index is the current state, +* and the bit position is the desired endstate. To find out which state +* is used as the intermediate state, look up the TMS value in the +* jbi_jtag_state_transitions[] table. +*/ +unsigned short jbi_jtag_path_map[16] = +{ +/* RST RTI SDRS CDR SDR E1DR PDR E2DR */ + 0x0001, 0xFFFD, 0xFE01, 0xFFE7, 0xFFEF, 0xFF0F, 0xFFBF, 0xFFFF, +/* UDR SIRS CIR SIR E1IR PIR E2IR UIR */ + 0xFEFD, 0x0001, 0xF3FF, 0xF7FF, 0x87FF, 0xDFFF, 0xFFFF, 0x7FFD +}; + +/* +* Flag bits for jbi_jtag_io() function +*/ +#define TMS_HIGH 1 +#define TMS_LOW 0 +#define TDI_HIGH 1 +#define TDI_LOW 0 +#define READ_TDO 1 +#define IGNORE_TDO 0 + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_init_jtag() + +/* */ +/****************************************************************************/ +{ + /* initial JTAG state is unknown */ + jbi_jtag_state = JBI_ILLEGAL_JTAG_STATE; + + /* initialize global variables to default state */ + jbi_drstop_state = IDLE; + jbi_irstop_state = IDLE; + jbi_dr_preamble = 0; + jbi_dr_postamble = 0; + jbi_ir_preamble = 0; + jbi_ir_postamble = 0; + jbi_dr_length = 0; + jbi_ir_length = 0; + + if (jbi_workspace != NULL) + { + jbi_dr_preamble_data = (unsigned char *) jbi_workspace; + jbi_dr_postamble_data = &jbi_dr_preamble_data[JBIC_MAX_JTAG_DR_PREAMBLE / 8]; + jbi_ir_preamble_data = &jbi_dr_postamble_data[JBIC_MAX_JTAG_DR_POSTAMBLE / 8]; + jbi_ir_postamble_data = &jbi_ir_preamble_data[JBIC_MAX_JTAG_IR_PREAMBLE / 8]; + jbi_dr_buffer = &jbi_ir_postamble_data[JBIC_MAX_JTAG_IR_POSTAMBLE / 8]; + jbi_ir_buffer = &jbi_dr_buffer[JBIC_MAX_JTAG_DR_LENGTH / 8]; + } + else + { + jbi_dr_preamble_data = NULL; + jbi_dr_postamble_data = NULL; + jbi_ir_preamble_data = NULL; + jbi_ir_postamble_data = NULL; + jbi_dr_buffer = NULL; + jbi_ir_buffer = NULL; + } + + return (JBIC_SUCCESS); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_drstop_state +( + JBIE_JTAG_STATE state +) + +/* */ +/****************************************************************************/ +{ + jbi_drstop_state = state; + + return (JBIC_SUCCESS); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_irstop_state +( + JBIE_JTAG_STATE state +) + +/* */ +/****************************************************************************/ +{ + jbi_irstop_state = state; + + return (JBIC_SUCCESS); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_dr_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_DR_PREAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_preamble = count; + } + } + else + { + if (count > jbi_dr_preamble) + { + jbi_free(jbi_dr_preamble_data); + jbi_dr_preamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_dr_preamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_preamble = count; + } + } + else + { + jbi_dr_preamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (preamble_data == NULL) + { + jbi_dr_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (preamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_dr_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_dr_preamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_ir_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_IR_PREAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_preamble = count; + } + } + else + { + if (count > jbi_ir_preamble) + { + jbi_free(jbi_ir_preamble_data); + jbi_ir_preamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_ir_preamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_preamble = count; + } + } + else + { + jbi_ir_preamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (preamble_data == NULL) + { + jbi_ir_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (preamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_ir_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_ir_preamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_dr_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_DR_POSTAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_postamble = count; + } + } + else + { + if (count > jbi_dr_postamble) + { + jbi_free(jbi_dr_postamble_data); + jbi_dr_postamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_dr_postamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_postamble = count; + } + } + else + { + jbi_dr_postamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (postamble_data == NULL) + { + jbi_dr_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (postamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_dr_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_dr_postamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_ir_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_IR_POSTAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_postamble = count; + } + } + else + { + if (count > jbi_ir_postamble) + { + jbi_free(jbi_ir_postamble_data); + jbi_ir_postamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_ir_postamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_postamble = count; + } + } + else + { + jbi_ir_postamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (postamble_data == NULL) + { + jbi_ir_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (postamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_ir_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_ir_postamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_jtag_reset_idle(void) + +/* */ +/****************************************************************************/ +{ + int i; + + /* + * Go to Test Logic Reset (no matter what the starting state may be) + */ + for (i = 0; i < 5; ++i) + { + jbi_jtag_io(TMS_HIGH, TDI_LOW, IGNORE_TDO); + } + + /* + * Now step to Run Test / Idle + */ + jbi_jtag_io(TMS_LOW, TDI_LOW, IGNORE_TDO); + + jbi_jtag_state = IDLE; +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_goto_jtag_state +( + JBIE_JTAG_STATE state +) + +/* */ +/****************************************************************************/ +{ + int tms; + int count = 0; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int tmp_state; + + if (jbi_jtag_state == JBI_ILLEGAL_JTAG_STATE) + { + /* initialize JTAG chain to known state */ + jbi_jtag_reset_idle(); + } + + if (jbi_jtag_state == state) + { + /* + * We are already in the desired state. If it is a stable state, + * loop here. Otherwise do nothing (no clock cycles). + */ + if ((state == IDLE) || + (state == DRSHIFT) || + (state == DRPAUSE) || + (state == IRSHIFT) || + (state == IRPAUSE)) + { + jbi_jtag_io(TMS_LOW, TDI_LOW, IGNORE_TDO); + } + else if (state == RESET) + { + jbi_jtag_io(TMS_HIGH, TDI_LOW, IGNORE_TDO); + } + } + else + { + while ((jbi_jtag_state != state) && (count < 9)) + { + /* + * Get TMS value to take a step toward desired state + */ + if (state < 0) { + tmp_state = 0; + } else { + tmp_state = state; + } + tms = (jbi_jtag_path_map[jbi_jtag_state] & (1 << tmp_state)) ? + TMS_HIGH : TMS_LOW; + + /* + * Take a step + */ + jbi_jtag_io(tms, TDI_LOW, IGNORE_TDO); + + if (tms) + { + jbi_jtag_state = + jbi_jtag_state_transitions[jbi_jtag_state].tms_high; + } + else + { + jbi_jtag_state = + jbi_jtag_state_transitions[jbi_jtag_state].tms_low; + } + + ++count; + } + } + + if (jbi_jtag_state != state) + { + status = JBIC_INTERNAL_ERROR; + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_wait_cycles +( + long cycles, + JBIE_JTAG_STATE wait_state +) + +/* */ +/* Description: Causes JTAG hardware to loop in the specified stable */ +/* state for the specified number of TCK clock cycles. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int tms; + long count; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + + if (jbi_jtag_state != wait_state) + { + status = jbi_goto_jtag_state(wait_state); + } + + if (status == JBIC_SUCCESS) + { + /* + * Set TMS high to loop in RESET state + * Set TMS low to loop in any other stable state + */ + tms = (wait_state == RESET) ? TMS_HIGH : TMS_LOW; + + for (count = 0L; count < cycles; count++) + { + jbi_jtag_io(tms, TDI_LOW, IGNORE_TDO); + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_wait_microseconds +( + long microseconds, + JBIE_JTAG_STATE wait_state +) + +/* */ +/* Description: Causes JTAG hardware to sit in the specified stable */ +/* state for the specified duration of real time. If */ +/* no JTAG operations have been performed yet, then only */ +/* a delay is performed. This permits the WAIT USECS */ +/* statement to be used in VECTOR programs without causing */ +/* any JTAG operations. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + + if ((jbi_jtag_state != JBI_ILLEGAL_JTAG_STATE) && + (jbi_jtag_state != wait_state)) + { + status = jbi_goto_jtag_state(wait_state); + } + + if (status == JBIC_SUCCESS) + { + /* + * Wait for specified time interval + */ + jbi_delay(microseconds); + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_jtag_concatenate_data +( + unsigned char *buffer, + unsigned char *preamble_data, + unsigned int preamble_count, + unsigned char *target_data, + unsigned long start_index, + unsigned int target_count, + unsigned char *postamble_data, + unsigned int postamble_count +) + +/* */ +/* Description: Copies preamble data, target data, and postamble data */ +/* into one buffer for IR or DR scans. */ +/* */ +/* Returns: nothing */ +/* */ +/****************************************************************************/ +{ + unsigned long i; + unsigned long j; + unsigned long k; + + for (i = 0L; i < preamble_count; ++i) + { + if (preamble_data[i >> 3L] & (1L << (i & 7L))) + { + buffer[i >> 3L] |= (1L << (i & 7L)); + } + else + { + buffer[i >> 3L] &= ~(unsigned int) (1L << (i & 7L)); + } + } + + j = start_index; + k = preamble_count + target_count; + for (; i < k; ++i, ++j) + { + if (target_data[j >> 3L] & (1L << (j & 7L))) + { + buffer[i >> 3L] |= (1L << (i & 7L)); + } + else + { + buffer[i >> 3L] &= ~(unsigned int) (1L << (i & 7L)); + } + } + + j = 0L; + k = preamble_count + target_count + postamble_count; + for (; i < k; ++i, ++j) + { + if (postamble_data[j >> 3L] & (1L << (j & 7L))) + { + buffer[i >> 3L] |= (1L << (i & 7L)); + } + else + { + buffer[i >> 3L] &= ~(unsigned int) (1L << (i & 7L)); + } + } +} + +int jbi_jtag_drscan +( + int start_state, + int count, + unsigned char *tdi, + unsigned char *tdo +) +{ + int i = 0; + int tdo_bit = 0; + int status = 1; + + /* + * First go to DRSHIFT state + */ + switch (start_state) + { + case 0: /* IDLE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(0, 0, 0); /* DRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* DRSHIFT */ + break; + + case 1: /* DRPAUSE */ + jbi_jtag_io(1, 0, 0); /* DREXIT2 */ + jbi_jtag_io(1, 0, 0); /* DRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(0, 0, 0); /* DRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* DRSHIFT */ + break; + + case 2: /* IRPAUSE */ + jbi_jtag_io(1, 0, 0); /* IREXIT2 */ + jbi_jtag_io(1, 0, 0); /* IRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(0, 0, 0); /* DRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* DRSHIFT */ + break; + + default: + status = 0; + } + + if (status) + { + /* loop in the SHIFT-DR state */ + for (i = 0; i < count; i++) + { + tdo_bit = jbi_jtag_io( + (i == count - 1), + tdi[i >> 3] & (1 << (i & 7)), + (tdo != NULL)); + + if (tdo != NULL) + { + if (tdo_bit) + { + tdo[i >> 3] |= (1 << (i & 7)); + } + else + { + tdo[i >> 3] &= ~(unsigned int) (1 << (i & 7)); + } + } + } + + jbi_jtag_io(0, 0, 0); /* DRPAUSE */ + } + + return (status); +} + +int jbi_jtag_irscan +( + int start_state, + int count, + unsigned char *tdi, + unsigned char *tdo +) +{ + int i = 0; + int tdo_bit = 0; + int status = 1; + + /* + * First go to IRSHIFT state + */ + switch (start_state) + { + case 0: /* IDLE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(1, 0, 0); /* IRSELECT */ + jbi_jtag_io(0, 0, 0); /* IRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* IRSHIFT */ + break; + + case 1: /* DRPAUSE */ + jbi_jtag_io(1, 0, 0); /* DREXIT2 */ + jbi_jtag_io(1, 0, 0); /* DRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(1, 0, 0); /* IRSELECT */ + jbi_jtag_io(0, 0, 0); /* IRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* IRSHIFT */ + break; + + case 2: /* IRPAUSE */ + jbi_jtag_io(1, 0, 0); /* IREXIT2 */ + jbi_jtag_io(1, 0, 0); /* IRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(1, 0, 0); /* IRSELECT */ + jbi_jtag_io(0, 0, 0); /* IRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* IRSHIFT */ + break; + + default: + status = 0; + } + + if (status) + { + /* loop in the SHIFT-IR state */ + for (i = 0; i < count; i++) + { + tdo_bit = jbi_jtag_io( + (i == count - 1), + tdi[i >> 3] & (1 << (i & 7)), + (tdo != NULL)); + + if (tdo != NULL) + { + if (tdo_bit) + { + tdo[i >> 3] |= (1 << (i & 7)); + } + else + { + tdo[i >> 3] &= ~(unsigned int) (1 << (i & 7)); + } + } + } + + jbi_jtag_io(0, 0, 0); /* IRPAUSE */ + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_jtag_extract_target_data +( + unsigned char *buffer, + unsigned char *target_data, + unsigned int start_index, + unsigned int preamble_count, + unsigned int target_count +) + +/* */ +/* Description: Copies target data from scan buffer, filtering out */ +/* preamble and postamble data. */ +/* */ +/* Returns: nothing */ +/* */ +/****************************************************************************/ +{ + unsigned int i; + unsigned int j; + unsigned int k; + + j = preamble_count; + k = start_index + target_count; + for (i = start_index; i < k; ++i, ++j) + { + if (buffer[j >> 3] & (1 << (j & 7))) + { + target_data[i >> 3] |= (1 << (i & 7)); + } + else + { + target_data[i >> 3] &= ~(unsigned int) (1 << (i & 7)); + } + } +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_irscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned int start_index +) + +/* */ +/* Description: Shifts data into instruction register */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_ir_preamble + count + jbi_ir_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_IR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_ir_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_ir_buffer); + jbi_ir_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_ir_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, IR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_ir_buffer, + jbi_ir_preamble_data, + jbi_ir_preamble, + tdi_data, + start_index, + count, + jbi_ir_postamble_data, + jbi_ir_postamble + ); + + /* + * Do the IRSCAN + */ + jbi_jtag_irscan + ( + start_code, + shift_count, + jbi_ir_buffer, + NULL + ); + + /* jbi_jtag_irscan() always ends in IRPAUSE state */ + jbi_jtag_state = IRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_irstop_state != IRPAUSE) + { + status = jbi_goto_jtag_state(jbi_irstop_state); + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_swap_ir +( + unsigned int count, + unsigned char *in_data, + unsigned int in_index, + unsigned char *out_data, + unsigned int out_index +) + +/* */ +/* Description: Shifts data into instruction register, capturing output */ +/* data */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_ir_preamble + count + jbi_ir_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_IR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_ir_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_ir_buffer); + jbi_ir_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_ir_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, IR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_ir_buffer, + jbi_ir_preamble_data, + jbi_ir_preamble, + in_data, + in_index, + count, + jbi_ir_postamble_data, + jbi_ir_postamble + ); + + /* + * Do the IRSCAN + */ + jbi_jtag_irscan + ( + start_code, + shift_count, + jbi_ir_buffer, + jbi_ir_buffer + ); + + /* jbi_jtag_irscan() always ends in IRPAUSE state */ + jbi_jtag_state = IRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_irstop_state != IRPAUSE) + { + status = jbi_goto_jtag_state(jbi_irstop_state); + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Now extract the returned data from the buffer + */ + jbi_jtag_extract_target_data + ( + jbi_ir_buffer, + out_data, + out_index, + jbi_ir_preamble, + count + ); + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_drscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned long start_index +) + +/* */ +/* Description: Shifts data into data register (ignoring output data) */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_dr_preamble + count + jbi_dr_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_DR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_dr_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_dr_buffer); + jbi_dr_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_dr_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, DR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_dr_buffer, + jbi_dr_preamble_data, + jbi_dr_preamble, + tdi_data, + start_index, + count, + jbi_dr_postamble_data, + jbi_dr_postamble + ); + + /* + * Do the DRSCAN + */ + jbi_jtag_drscan + ( + start_code, + shift_count, + jbi_dr_buffer, + NULL + ); + + /* jbi_jtag_drscan() always ends in DRPAUSE state */ + jbi_jtag_state = DRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_drstop_state != DRPAUSE) + { + status = jbi_goto_jtag_state(jbi_drstop_state); + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_swap_dr +( + unsigned int count, + unsigned char *in_data, + unsigned long in_index, + unsigned char *out_data, + unsigned int out_index +) + +/* */ +/* Description: Shifts data into data register, capturing output data */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_dr_preamble + count + jbi_dr_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_DR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_dr_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_dr_buffer); + jbi_dr_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_dr_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, DR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_dr_buffer, + jbi_dr_preamble_data, + jbi_dr_preamble, + in_data, + in_index, + count, + jbi_dr_postamble_data, + jbi_dr_postamble + ); + + /* + * Do the DRSCAN + */ + jbi_jtag_drscan + ( + start_code, + shift_count, + jbi_dr_buffer, + jbi_dr_buffer + ); + + /* jbi_jtag_drscan() always ends in DRPAUSE state */ + jbi_jtag_state = DRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_drstop_state != DRPAUSE) + { + status = jbi_goto_jtag_state(jbi_drstop_state); + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Now extract the returned data from the buffer + */ + jbi_jtag_extract_target_data + ( + jbi_dr_buffer, + out_data, + out_index, + jbi_dr_preamble, + count + ); + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_free_jtag_padding_buffers(int reset_jtag) + +/* */ +/* Description: Frees memory allocated for JTAG IR and DR buffers */ +/* */ +/* Returns: nothing */ +/* */ +/****************************************************************************/ +{ + /* + * If the JTAG interface was used, reset it to TLR + */ + if (reset_jtag && (jbi_jtag_state != JBI_ILLEGAL_JTAG_STATE)) + { + jbi_jtag_reset_idle(); + } + + if (jbi_workspace == NULL) + { + if (jbi_dr_preamble_data != NULL) + { + jbi_free(jbi_dr_preamble_data); + jbi_dr_preamble_data = NULL; + } + + if (jbi_dr_postamble_data != NULL) + { + jbi_free(jbi_dr_postamble_data); + jbi_dr_postamble_data = NULL; + } + + if (jbi_dr_buffer != NULL) + { + jbi_free(jbi_dr_buffer); + jbi_dr_buffer = NULL; + } + + if (jbi_ir_preamble_data != NULL) + { + jbi_free(jbi_ir_preamble_data); + jbi_ir_preamble_data = NULL; + } + + if (jbi_ir_postamble_data != NULL) + { + jbi_free(jbi_ir_postamble_data); + jbi_ir_postamble_data = NULL; + } + + if (jbi_ir_buffer != NULL) + { + jbi_free(jbi_ir_buffer); + jbi_ir_buffer = NULL; + } + } +} + +#if PORT==DOS + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_drscan_multi_page +( + unsigned int variable_id, + unsigned long count, + unsigned long start_index, + int version +) + +/* */ +/* Description: Shifts data into data register (ignoring output data) */ +/* Scan data comes from compressed Boolean array. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned long shift_count = jbi_dr_preamble + count + jbi_dr_postamble; + unsigned long i; + unsigned long j; + unsigned long k; + unsigned int bi; + + if (status == JBIC_SUCCESS) + { + status = jbi_goto_jtag_state(DRSHIFT); + } + + if (status == JBIC_SUCCESS) + { + /* + * Get preamble data, DR data, and postamble data one bit at a time + * and immediately scan it into the JTAG chain + */ + + for (i = 0L; i < jbi_dr_preamble; ++i) + { + jbi_jtag_io((i == shift_count - 1), + (int) (jbi_dr_preamble_data[i >> 3L] & (1L << (i & 7L))), 0); + } + + j = start_index; + k = jbi_dr_preamble + count; + + jbi_uncompress_page(variable_id, (unsigned int) (j >> 16L), version); + + for (; i < k; ++i, ++j) + { + bi = (unsigned int) (j & 0x0000ffffL); + + /* check for page boundary - load next page if necessary */ + if (bi == 0) + { + jbi_uncompress_page(variable_id, (unsigned int) (j >> 16L), version); + } + + jbi_jtag_io((i == shift_count - 1), + (int) (jbi_aca_out_buffer[bi >> 3] & (1 << (bi & 7))), 0); + } + + j = 0L; + k = jbi_dr_preamble + count + jbi_dr_postamble; + for (; i < k; ++i, ++j) + { + jbi_jtag_io((i == shift_count - 1), + (int) (jbi_dr_postamble_data[j >> 3L] & (1L << (j & 7L))), 0); + } + + jbi_jtag_io(0, 0, 0); /* DRPAUSE */ + + /* jbi_jtag_drscan() always ends in DRPAUSE state */ + jbi_jtag_state = DRPAUSE; + + if (jbi_drstop_state != DRPAUSE) + { + status = jbi_goto_jtag_state(jbi_drstop_state); + } + } + + return (status); +} + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h new file mode 100644 index 000000000000..fab2dac0266a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h @@ -0,0 +1,146 @@ +/****************************************************************************/ +/* */ +/* Module: jbijtag.h */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Definitions of JTAG constants, types, and functions */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBIJTAG_H +#define INC_JBIJTAG_H + +/****************************************************************************/ +/* */ +/* Function Prototypes */ +/* */ +/****************************************************************************/ +typedef enum +{ + JBI_ILLEGAL_JTAG_STATE = -1, + RESET = 0, + IDLE = 1, + DRSELECT = 2, + DRCAPTURE = 3, + DRSHIFT = 4, + DREXIT1 = 5, + DRPAUSE = 6, + DREXIT2 = 7, + DRUPDATE = 8, + IRSELECT = 9, + IRCAPTURE = 10, + IRSHIFT = 11, + IREXIT1 = 12, + IRPAUSE = 13, + IREXIT2 = 14, + IRUPDATE = 15 + +} JBIE_JTAG_STATE; + +JBI_RETURN_TYPE jbi_init_jtag +( + void +); + +JBI_RETURN_TYPE jbi_set_drstop_state +( + JBIE_JTAG_STATE state +); + +JBI_RETURN_TYPE jbi_set_irstop_state +( + JBIE_JTAG_STATE state +); + +JBI_RETURN_TYPE jbi_set_dr_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +); + +JBI_RETURN_TYPE jbi_set_ir_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +); + +JBI_RETURN_TYPE jbi_set_dr_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +); + +JBI_RETURN_TYPE jbi_set_ir_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +); + +JBI_RETURN_TYPE jbi_goto_jtag_state +( + JBIE_JTAG_STATE state +); + +JBI_RETURN_TYPE jbi_do_wait_cycles +( + long cycles, + JBIE_JTAG_STATE wait_state +); + +JBI_RETURN_TYPE jbi_do_wait_microseconds +( + long microseconds, + JBIE_JTAG_STATE wait_state +); + +JBI_RETURN_TYPE jbi_do_irscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned int start_index +); + +JBI_RETURN_TYPE jbi_swap_ir +( + unsigned int count, + unsigned char *in_data, + unsigned int in_index, + unsigned char *out_data, + unsigned int out_index +); + +JBI_RETURN_TYPE jbi_do_drscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned long start_index +); + +JBI_RETURN_TYPE jbi_swap_dr +( + unsigned int count, + unsigned char *in_data, + unsigned long in_index, + unsigned char *out_data, + unsigned int out_index +); + +void jbi_free_jtag_padding_buffers +( + int reset_jtag +); + +JBI_RETURN_TYPE jbi_do_drscan_multi_page +( + unsigned int variable_id, + unsigned long long_count, + unsigned long long_index, + int version +); + +#endif /* INC_JBIJTAG_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c new file mode 100644 index 000000000000..b8cab4857074 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c @@ -0,0 +1,3362 @@ +/****************************************************************************/ +/* */ +/* Module: jbimain.c */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Jam STAPL ByteCode Player (Interpreter) */ +/* */ +/* Revisions: 2.2 fixed /W4 warnings */ +/* 2.0 added support for STAPL ByteCode format */ +/* */ +/****************************************************************************/ + +#include "jbiport.h" +#include "jbiexprt.h" +#include "jbijtag.h" +#include "jbicomp.h" +#include "jbistub.h" + +/****************************************************************************/ +/* */ +/* MACROS */ +/* */ +/****************************************************************************/ + +#ifndef NULL +#define NULL 0 +#endif + +#define JBI_STACK_SIZE 128 + +#define JBIC_MESSAGE_LENGTH 1024 + +/* +* This macro checks if enough parameters are available on the stack. The +* argument is the number of parameters needed. +*/ +#define IF_CHECK_STACK(x) \ + if (stack_ptr < (int) (x)) \ + { \ + status = JBIC_STACK_OVERFLOW; \ + } \ + else + +/* +* This macro checks if a code address is inside the code section +*/ +#define CHECK_PC \ + if ((pc < code_section) || (pc >= debug_section)) \ + { \ + status = JBIC_BOUNDS_ERROR; \ + } + +/****************************************************************************/ +/* */ +/* GLOBAL VARIABLES */ +/* */ +/****************************************************************************/ + +#if PORT==DOS +/* +* jbi_program is a global pointer used by macros GET_BYTE, GET_WORD, and +* GET_DWORD to read data from the JBC file +*/ +PROGRAM_PTR jbi_program; +#endif + +/****************************************************************************/ +/* */ +/* UTILITY FUNCTIONS */ +/* */ +/****************************************************************************/ + +int jbi_strlen(char *string) +{ + int len = 0; + + while (string[len] != '\0') ++len; + + return (len); +} + +long jbi_atol(char *buffer) +{ + long result = 0L; + int index = 0; + + while ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + result = (result * 10) + (buffer[index] - '0'); + ++index; + } + + return (result); +} + +void jbi_ltoa(char *buffer, long number) +{ + int index = 0; + int rev_index = 0; + char reverse[32]; + + if (number < 0L) + { + buffer[index++] = '-'; + number = 0 - number; + } + else if (number == 0) + { + buffer[index++] = '0'; + } + + while (number != 0) + { + reverse[rev_index++] = (char) ((number % 10) + '0'); + number /= 10; + } + + while (rev_index > 0) + { + buffer[index++] = reverse[--rev_index]; + } + + buffer[index] = '\0'; +} + +char jbi_toupper(char ch) +{ + return ((char) (((ch >= 'a') && (ch <= 'z')) ? (ch + 'A' - 'a') : ch)); +} + +int jbi_stricmp(char *left, char *right) +{ + int result = 0; + char l, r; + + do + { + l = jbi_toupper(*left); + r = jbi_toupper(*right); + result = l - r; + ++left; + ++right; + } + while ((result == 0) && (l != '\0') && (r != '\0')); + + return (result); +} + +void jbi_strncpy(char *left, char *right, int count) +{ + char ch; + + do + { + *left = *right; + ch = *right; + ++left; + ++right; + --count; + } + while ((ch != '\0') && (count != 0)); +} + +void jbi_make_dword(unsigned char *buf, unsigned long num) +{ + buf[0] = (unsigned char) num; + buf[1] = (unsigned char) (num >> 8L); + buf[2] = (unsigned char) (num >> 16L); + buf[3] = (unsigned char) (num >> 24L); +} + +unsigned long jbi_get_dword(unsigned char *buf) +{ + return + (((unsigned long) buf[0]) | + (((unsigned long) buf[1]) << 8L) | + (((unsigned long) buf[2]) << 16L) | + (((unsigned long) buf[3]) << 24L)); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_execute +( + PROGRAM_PTR program, + long program_size, + char *workspace, + long workspace_size, + char *action, + char **init_list, + int reset_jtag, + long *error_address, + int *exit_code, + int *format_version +) + +/* */ +/* Description: */ +/* */ +/* Returns: */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned long first_word = 0L; + unsigned long action_table = 0L; + unsigned long proc_table = 0L; + unsigned long string_table = 0L; + unsigned long symbol_table = 0L; + unsigned long data_section = 0L; + unsigned long code_section = 0L; + unsigned long debug_section = 0L; + unsigned long action_count = 0L; + unsigned long proc_count = 0L; + unsigned long symbol_count = 0L; + /*char message_buffer[JBIC_MESSAGE_LENGTH + 1];*/ + char *message_buffer; + addr_t *variables = NULL; + long *variable_size = NULL; + char *attributes = NULL; + unsigned char *proc_attributes = NULL; + unsigned long pc; + unsigned long opcode_address; + unsigned long args[3]; + unsigned int opcode; + unsigned long name_id; + addr_t stack[JBI_STACK_SIZE] = {0}; + unsigned char charbuf[4]; + long long_temp; + unsigned int variable_id; + unsigned char *charptr_temp; + unsigned char *charptr_temp2; + long *longptr_temp; + int version = 0; + int delta = 0; + int stack_ptr = 0; + unsigned int arg_count; + int done = 0; + int bad_opcode = 0; + unsigned int count; + unsigned int index; + unsigned int index2; + long long_count; + long long_index; + long long_index2; + unsigned int i; + unsigned int j; + unsigned long uncompressed_size, uncompressed_result; + unsigned int offset; + unsigned long value; + int current_proc = 0; + char *equal_ptr; + int length; + int reverse; + + unsigned long debug_cnt = 0; + +#if PORT==DOS + char name[33]; +#else + char *name; +#endif + + jbi_workspace = workspace; + jbi_workspace_size = workspace_size; + +#if PORT==DOS + jbi_program = program; +#endif + + /* Resolve compilation warnings: the frame size of 1664 bytes is larger than 1024 bytes */ + message_buffer = (char *) kzalloc(JBIC_MESSAGE_LENGTH + 1, GFP_KERNEL); + if (message_buffer == NULL) { + jbi_dbg(DEBUG_DETAIL, "Memory not enough jbi_execute \n"); + return JBIC_OUT_OF_MEMORY; + } + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + version = (int) (first_word & 1L); + *format_version = version + 1; + delta = version * 8; + + action_table = GET_DWORD(4); + proc_table = GET_DWORD(8); + string_table = GET_DWORD(4 + delta); + symbol_table = GET_DWORD(16 + delta); + data_section = GET_DWORD(20 + delta); + code_section = GET_DWORD(24 + delta); + debug_section = GET_DWORD(28 + delta); + action_count = GET_DWORD(40 + delta); + proc_count = GET_DWORD(44 + delta); + symbol_count = GET_DWORD(48 + (2 * delta)); + + jbi_dbg(DEBUG_DETAIL, "version: %d\n", version); + jbi_dbg(DEBUG_DETAIL, "delta: %d\n", delta); + jbi_dbg(DEBUG_DETAIL, "action_table: 0x%08lx\n", action_table); + jbi_dbg(DEBUG_DETAIL, "proc_table: 0x%08lx\n", proc_table); + jbi_dbg(DEBUG_DETAIL, "string_table: 0x%08lx\n", string_table); + jbi_dbg(DEBUG_DETAIL, "symbol_table: 0x%08lx\n", symbol_table); + jbi_dbg(DEBUG_DETAIL, "data_section: 0x%08lx\n", data_section); + jbi_dbg(DEBUG_DETAIL, "code_section: 0x%08lx\n", code_section); + jbi_dbg(DEBUG_DETAIL, "debug_section: 0x%08lx\n", debug_section); + jbi_dbg(DEBUG_DETAIL, "action_count: 0x%08lx\n", action_count); + jbi_dbg(DEBUG_DETAIL, "proc_count: 0x%08lx\n", proc_count); + jbi_dbg(DEBUG_DETAIL, "symbol_count: 0x%08lx\n", symbol_count); + jbi_dbg(DEBUG_DETAIL, "\n"); + } + + if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) + { + jbi_dbg(DEBUG_ERR, "first_word 0x%lx\n", first_word); + done = 1; + status = JBIC_IO_ERROR; + } + + if ((status == JBIC_SUCCESS) && (symbol_count > 0)) + { + variables = (addr_t *) jbi_malloc( + (unsigned int) symbol_count * sizeof(long)); + + if (variables == NULL) status = JBIC_OUT_OF_MEMORY; + + if (status == JBIC_SUCCESS) + { + variable_size = (long *) jbi_malloc( + (unsigned int) symbol_count * sizeof(long)); + + if (variable_size == NULL) status = JBIC_OUT_OF_MEMORY; + } + + if (status == JBIC_SUCCESS) + { + attributes = (char *) jbi_malloc((unsigned int) symbol_count); + + if (attributes == NULL) status = JBIC_OUT_OF_MEMORY; + } + + if ((status == JBIC_SUCCESS) && (version > 0)) + { + proc_attributes = (unsigned char *) jbi_malloc((unsigned int) proc_count); + + if (proc_attributes == NULL) status = JBIC_OUT_OF_MEMORY; + } + + if (status == JBIC_SUCCESS) + { + delta = version * 2; + + for (i = 0; i < (unsigned int) symbol_count; ++i) + { + offset = (unsigned int) (symbol_table + ((11 + delta) * i)); + + value = GET_DWORD(offset + 3 + delta); + + attributes[i] = GET_BYTE(offset); + + /* use bit 7 of attribute byte to indicate that this buffer */ + /* was dynamically allocated and should be freed later */ + attributes[i] &= 0x7f; + + variable_size[i] = GET_DWORD(offset + 7 + delta); + + jbi_dbg(DEBUG_NOISY, "symbol %03d: 0x%02x,0x%08lx,0x%08lx\n", + i, attributes[i], value, variable_size[i]); + + /* + * Attribute bits: + * bit 0: 0 = read-only, 1 = read-write + * bit 1: 0 = not compressed, 1 = compressed + * bit 2: 0 = not initialized, 1 = initialized + * bit 3: 0 = scalar, 1 = array + * bit 4: 0 = Boolean, 1 = integer + * bit 5: 0 = declared variable, + * 1 = compiler created temporary variable + */ + + if ((attributes[i] & 0x0c) == 0x04) + { + /* initialized scalar variable */ + variables[i] = value; + } + else if ((attributes[i] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ +#if PORT==DOS + /* for DOS port, get the size but do not uncompress */ + long_index = data_section + value; + uncompressed_size = + (((unsigned long) GET_BYTE(long_index)) | + (((unsigned long) GET_BYTE(long_index + 1L)) << 8L) | + (((unsigned long) GET_BYTE(long_index + 2L)) << 16L) | + (((unsigned long) GET_BYTE(long_index + 3L)) << 24L)); + variable_size[i] = uncompressed_size; +#else + uncompressed_size = jbi_get_dword( + &program[data_section + value]); + + /* allocate a buffer for the uncompressed data */ + variables[i] = (addr_t) jbi_malloc(uncompressed_size); + + if (variables[i] == (addr_t) 0L) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* set flag so buffer will be freed later */ + attributes[i] |= 0x80; + + /* uncompress the data */ + uncompressed_result = + jbi_uncompress( + &program[data_section + value], + variable_size[i], + (unsigned char *) variables[i], + uncompressed_size, + version); + if (uncompressed_result != uncompressed_size) + { + /* decompression failed */ + jbi_dbg(DEBUG_ERR, "uncompress fail(0x%lx,0x%lx,0x%lx)(0x%lx)\n", + variable_size[i], uncompressed_result, uncompressed_size, value); + status = JBIC_IO_ERROR; + } + else + { + variable_size[i] = uncompressed_size * 8L; + } + } +#endif + } + else if ((attributes[i] & 0x1e) == 0x0c) + { + /* initialized Boolean array */ +#if PORT==DOS + /* flag attributes so that memory is freed */ + attributes[i] |= 0x80; + + if (variable_size[i] > 0) + { + unsigned int size = (unsigned int) + ((variable_size[i] + 7L) / 8L); + + variables[i] = (long) jbi_malloc(size); + + if (variables[i] == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + unsigned char *p = (unsigned char *) variables[i]; + /* copy array values into buffer */ + for (j = 0; j < size; ++j) + { + p[j] = GET_BYTE(data_section + value + j); + } + } + } + else + { + variables[i] = 0; + } +#else + variables[i] = value + data_section + (addr_t) program; +#endif + } + else if ((attributes[i] & 0x1c) == 0x1c) + { + /* initialized integer array */ + variables[i] = value + data_section; + } + else if ((attributes[i] & 0x0c) == 0x08) + { + /* uninitialized array */ + + /* flag attributes so that memory is freed */ + attributes[i] |= 0x80; + + if (variable_size[i] > 0) + { + unsigned int size; + + if (attributes[i] & 0x10) + { + /* integer array */ + size = (unsigned int) + (variable_size[i] * sizeof(long)); + } + else + { + /* Boolean array */ + size = (unsigned int) + ((variable_size[i] + 7L) / 8L); + } + + variables[i] = (addr_t) jbi_malloc(size); + + if (variables[i] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* zero out memory */ + for (j = 0; j < size; ++j) + { + ((unsigned char *)(variables[i]))[j] = 0; + } + } + } + else + { + variables[i] = 0; + } + } + else + { + variables[i] = 0; + } + + jbi_dbg(DEBUG_NOISY, " variables: 0x%08lx,0x%016llx\n", + variable_size[i], (long long) variables[i]); + } + } + + jbi_dbg(DEBUG_NOISY, "\n"); + } + + /* + * Initialize variables listed in init_list + */ + if ((status == JBIC_SUCCESS) && (init_list != NULL) && (version == 0)) + { + delta = version * 2; + count = 0; + while (init_list[count] != NULL) + { + equal_ptr = init_list[count]; + length = 0; + while ((*equal_ptr != '=') && (*equal_ptr != '\0')) + { + ++equal_ptr; + ++length; + } + if (*equal_ptr == '=') + { + ++equal_ptr; + value = jbi_atol(equal_ptr); + jbi_strncpy(message_buffer, init_list[count], length); + message_buffer[length] = '\0'; + for (i = 0; i < (unsigned int) symbol_count; ++i) + { + offset = (unsigned int) (symbol_table + ((11 + delta) * i)); + name_id = (version == 0) ? GET_WORD(offset + 1) : + GET_DWORD(offset + 1); +#if PORT==DOS + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + name_id]; +#endif + + if (jbi_stricmp(message_buffer, name) == 0) + { + variables[i] = value; + } + + jbi_dbg(DEBUG_NOISY, "init_list %03d: 0x%08lx,%s,0x%016llx\n", + i, name_id, name, (long long) variables[i]); + } + } + + ++count; + } + + jbi_dbg(DEBUG_NOISY, "\n"); + } + + if (status != JBIC_SUCCESS) done = 1; + + jbi_init_jtag(); + + pc = code_section; + message_buffer[0] = '\0'; + + /* + * For JBC version 2, we will execute the procedures corresponding to + * the selected ACTION + */ + if (version > 0) + { + if (action == NULL) + { + status = JBIC_ACTION_NOT_FOUND; + done = 1; + } + else + { + int action_found = 0; + + for (i = 0; (i < action_count) && !action_found; ++i) + { + name_id = GET_DWORD(action_table + (12 * i)); + +#if PORT==DOS + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + name_id]; +#endif + + if (jbi_stricmp(action, name) == 0) + { + action_found = 1; + current_proc = (int) GET_DWORD(action_table + (12 * i) + 8); + } + + jbi_dbg(DEBUG_NOISY, "action %03d: 0x%08lx,%s, %d,%d\n", + i, name_id, name, action_found, current_proc); + } + + if (!action_found) + { + status = JBIC_ACTION_NOT_FOUND; + done = 1; + } + } + + if (status == JBIC_SUCCESS) + { + int first_time = 1; + i = current_proc; + while ((i != 0) || first_time) + { + first_time = 0; + /* check procedure attribute byte */ + proc_attributes[i] = (unsigned char) + (GET_BYTE(proc_table + (13 * i) + 8) & 0x03); + + jbi_dbg(DEBUG_NOISY, " proc_attributes %03d: 0x%02x\n", + i, proc_attributes[i]); + + if (proc_attributes[i] != 0) + { + /* + * BIT0 - OPTIONAL + * BIT1 - RECOMMENDED + * BIT6 - FORCED OFF + * BIT7 - FORCED ON + */ + if (init_list != NULL) + { + name_id = GET_DWORD(proc_table + (13 * i)); +#if PORT==DOS + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + name_id]; +#endif + + jbi_dbg(DEBUG_NOISY, " init_list %03d: 0x%08lx,%s\n", + i, name_id, name); + + count = 0; + while (init_list[count] != NULL) + { + equal_ptr = init_list[count]; + length = 0; + while ((*equal_ptr != '=') && (*equal_ptr != '\0')) + { + ++equal_ptr; + ++length; + } + if (*equal_ptr == '=') + { + ++equal_ptr; + jbi_strncpy(message_buffer, init_list[count], length); + message_buffer[length] = '\0'; + + if (jbi_stricmp(message_buffer, name) == 0) + { + if (jbi_atol(equal_ptr) == 0) + { + proc_attributes[i] |= 0x40; + } + else + { + proc_attributes[i] |= 0x80; + } + } + } + + jbi_dbg(DEBUG_NOISY, " proc_attributes %03d: 0x%02x\n", + i, proc_attributes[i]); + + ++count; + } + } + } + + i = (unsigned int) GET_DWORD(proc_table + (13 * i) + 4); + } + + /* + * Set current_proc to the first procedure to be executed + */ + i = current_proc; + while ((i != 0) && + ((proc_attributes[i] == 1) || + ((proc_attributes[i] & 0xc0) == 0x40))) + { + i = (unsigned int) GET_DWORD(proc_table + (13 * i) + 4); + } + + if ((i != 0) || ((i == 0) && (current_proc == 0) && + ((proc_attributes[0] != 1) && + ((proc_attributes[0] & 0xc0) != 0x40)))) + { + current_proc = i; + pc = code_section + GET_DWORD(proc_table + (13 * i) + 9); + CHECK_PC; + } + else + { + /* there are no procedures to execute! */ + done = 1; + } + } + + jbi_dbg(DEBUG_NOISY, "\n"); + } + + message_buffer[0] = '\0'; + + jbi_dbg(DEBUG_NOISY, "excute pc: 0x%lx,%d\n", pc, current_proc); + while (!done) + { + opcode = (unsigned int) (GET_BYTE(pc) & 0xff); + debug_cnt++; + jbi_dbg(DEBUG_NOISY, "op: 0x%02x(%03d:0x%08lx,%08lx)", + opcode, stack_ptr, pc, debug_cnt); + opcode_address = pc; + ++pc; + + arg_count = (opcode >> 6) & 3; + jbi_dbg(DEBUG_NOISY, " - %u:", arg_count); + for (i = 0; i < arg_count; ++i) + { + args[i] = GET_DWORD(pc); + jbi_dbg(DEBUG_NOISY, " 0x%08lx", args[i]); + pc += 4; + } + jbi_dbg(DEBUG_NOISY, "\n"); + + switch (opcode) + { + case 0x00: /* NOP */ + /* do nothing */ + break; + + case 0x01: /* DUP */ + IF_CHECK_STACK(1) + { + stack[stack_ptr] = stack[stack_ptr - 1]; + ++stack_ptr; + } + break; + + case 0x02: /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + break; + + case 0x03: /* ADD */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] += stack[stack_ptr]; + } + break; + + case 0x04: /* SUB */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] -= stack[stack_ptr]; + } + break; + + case 0x05: /* MULT */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] *= stack[stack_ptr]; + } + break; + + case 0x06: /* DIV */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] /= stack[stack_ptr]; + } + break; + + case 0x07: /* MOD */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] %= stack[stack_ptr]; + } + break; + + case 0x08: /* SHL */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] <<= stack[stack_ptr]; + } + break; + + case 0x09: /* SHR */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] >>= stack[stack_ptr]; + } + break; + + case 0x0A: /* NOT */ + IF_CHECK_STACK(1) + { + stack[stack_ptr - 1] ^= (-1L); + } + break; + + case 0x0B: /* AND */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] &= stack[stack_ptr]; + } + break; + + case 0x0C: /* OR */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] |= stack[stack_ptr]; + } + break; + + case 0x0D: /* XOR */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] ^= stack[stack_ptr]; + } + break; + + case 0x0E: /* INV */ + IF_CHECK_STACK(1) + { + stack[stack_ptr - 1] = stack[stack_ptr - 1] ? 0L : 1L; + } + break; + + case 0x0F: /* GT */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] = + (stack[stack_ptr - 1] > stack[stack_ptr]) ? 1L : 0L; + } + break; + + case 0x10: /* LT */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] = + (stack[stack_ptr - 1] < stack[stack_ptr]) ? 1L : 0L; + } + break; + + case 0x11: /* RET */ + if ((version > 0) && (stack_ptr == 0)) + { + /* + * We completed one of the main procedures of an ACTION. + * Find the next procedure to be executed and jump to it. + * If there are no more procedures, then EXIT. + */ + i = (unsigned int) GET_DWORD(proc_table + (13 * current_proc) + 4); + while ((i != 0) && + ((proc_attributes[i] == 1) || + ((proc_attributes[i] & 0xc0) == 0x40))) + { + i = (unsigned int) GET_DWORD(proc_table + (13 * i) + 4); + } + + if (i == 0) + { + /* there are no procedures to execute! */ + done = 1; + *exit_code = 0; /* success */ + } + else + { + current_proc = i; + pc = code_section + GET_DWORD(proc_table + (13 * i) + 9); + CHECK_PC; + } + } + else IF_CHECK_STACK(1) + { + pc = stack[--stack_ptr] + code_section; + CHECK_PC; + if (pc == code_section) + { + status = JBIC_BOUNDS_ERROR; + } + } + break; + + case 0x12: /* CMPS */ + /* + * Array short compare + * ...stack 0 is source 1 value + * ...stack 1 is source 2 value + * ...stack 2 is mask value + * ...stack 3 is count + */ + IF_CHECK_STACK(4) + { + long a = stack[--stack_ptr]; + long b = stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[stack_ptr - 1]; + + if ((count < 1) || (count > 32)) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + long_temp &= ((-1L) >> (32 - count)); + + stack[stack_ptr - 1] = + ((a & long_temp) == (b & long_temp)) ? 1L : 0L; + } + } + break; + + case 0x13: /* PINT */ + /* + * PRINT add integer + * ...stack 0 is integer value + */ + IF_CHECK_STACK(1) + { + jbi_ltoa(&message_buffer[jbi_strlen(message_buffer)], + stack[--stack_ptr]); + } + break; + + case 0x14: /* PRNT */ + /* + * PRINT finish + */ + jbi_message(message_buffer); + message_buffer[0] = '\0'; + break; + + case 0x15: /* DSS */ + /* + * DRSCAN short + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_do_drscan(count, charbuf, 0); + } + break; + + case 0x16: /* DSSC */ + /* + * DRSCAN short with capture + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[stack_ptr - 1]; + jbi_make_dword(charbuf, long_temp); + status = jbi_swap_dr(count, charbuf, 0, charbuf, 0); + stack[stack_ptr - 1] = jbi_get_dword(charbuf); + } + break; + + case 0x17: /* ISS */ + /* + * IRSCAN short + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_do_irscan(count, charbuf, 0); + } + break; + + case 0x18: /* ISSC */ + /* + * IRSCAN short with capture + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[stack_ptr - 1]; + jbi_make_dword(charbuf, long_temp); + status = jbi_swap_ir(count, charbuf, 0, charbuf, 0); + stack[stack_ptr - 1] = jbi_get_dword(charbuf); + } + break; + + case 0x19: /* VSS */ + /* + * VECTOR short + * ...stack 0 is scan data + * ...stack 1 is count + */ + bad_opcode = 1; + break; + + case 0x1A: /* VSSC */ + /* + * VECTOR short with capture + * ...stack 0 is scan data + * ...stack 1 is count + */ + bad_opcode = 1; + break; + + case 0x1B: /* VMPF */ + /* + * VMAP finish + */ + bad_opcode = 1; + break; + + case 0x1C: /* DPR */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_dr_preamble(count, 0, NULL); + } + break; + + case 0x1D: /* DPRL */ + /* + * DRPRE with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_dr_preamble(count, 0, charbuf); + } + break; + + case 0x1E: /* DPO */ + /* + * DRPOST + * ...stack 0 is count + */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_dr_postamble(count, 0, NULL); + } + break; + + case 0x1F: /* DPOL */ + /* + * DRPOST with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_dr_postamble(count, 0, charbuf); + } + break; + + case 0x20: /* IPR */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_ir_preamble(count, 0, NULL); + } + break; + + case 0x21: /* IPRL */ + /* + * IRPRE with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_ir_preamble(count, 0, charbuf); + } + break; + + case 0x22: /* IPO */ + /* + * IRPOST + * ...stack 0 is count + */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_ir_postamble(count, 0, NULL); + } + break; + + case 0x23: /* IPOL */ + /* + * IRPOST with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_ir_postamble(count, 0, charbuf); + } + break; + + case 0x24: /* PCHR */ + IF_CHECK_STACK(1) + { + unsigned char ch; + count = jbi_strlen(message_buffer); + ch = (char) stack[--stack_ptr]; + if ((ch < 1) || (ch > 127)) + { + /* character code out of range */ + /* instead of flagging an error, force the value to 127 */ + ch = 127; + } + message_buffer[count] = ch; + message_buffer[count + 1] = '\0'; + } + break; + + case 0x25: /* EXIT */ + IF_CHECK_STACK(1) + { + *exit_code = (int) stack[--stack_ptr]; + } + done = 1; + break; + + case 0x26: /* EQU */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] = + (stack[stack_ptr - 1] == stack[stack_ptr]) ? 1L : 0L; + } + break; + + case 0x27: /* POPT */ + IF_CHECK_STACK(1) + { + --stack_ptr; + } + break; + + case 0x28: /* TRST */ + bad_opcode = 1; + break; + + case 0x29: /* FRQ */ + bad_opcode = 1; + break; + + case 0x2A: /* FRQU */ + bad_opcode = 1; + break; + + case 0x2B: /* PD32 */ + bad_opcode = 1; + break; + + case 0x2C: /* ABS */ + IF_CHECK_STACK(1) + { + if (stack[stack_ptr - 1] < 0) + { + stack[stack_ptr - 1] = 0 - stack[stack_ptr - 1]; + } + } + break; + + case 0x2D: /* BCH0 */ + /* + * Batch operation 0 + * SWP + * SWPN 7 + * SWP + * SWPN 6 + * DUPN 8 + * SWPN 2 + * SWP + * DUPN 6 + * DUPN 6 + */ + + /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWPN 7 */ + index = 7 + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWPN 6 */ + index = 6 + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* DUPN 8 */ + index = 8 + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + + /* SWPN 2 */ + index = 2 + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* DUPN 6 */ + index = 6 + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + + /* DUPN 6 */ + index = 6 + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + break; + + case 0x2E: /* BCH1 */ + /* + * Batch operation 1 + * SWPN 8 + * SWP + * SWPN 9 + * SWPN 3 + * SWP + * SWPN 2 + * SWP + * SWPN 7 + * SWP + * SWPN 6 + * DUPN 5 + * DUPN 5 + */ + bad_opcode = 1; + break; + + case 0x2F: /* PSH0 */ + stack[stack_ptr++] = 0; + break; + + case 0x40: /* PSHL */ + stack[stack_ptr++] = (long) args[0]; + break; + + case 0x41: /* PSHV */ + stack[stack_ptr++] = variables[args[0]]; + break; + + case 0x42: /* JMP */ + pc = args[0] + code_section; + CHECK_PC; + break; + + case 0x43: /* CALL */ + stack[stack_ptr++] = pc; + pc = args[0] + code_section; + CHECK_PC; + break; + + case 0x44: /* NEXT */ + /* + * Process FOR / NEXT loop + * ...argument 0 is variable ID + * ...stack 0 is step value + * ...stack 1 is end value + * ...stack 2 is top address + */ + IF_CHECK_STACK(3) + { + long step = stack[stack_ptr - 1]; + long end = stack[stack_ptr - 2]; + long top = stack[stack_ptr - 3]; + long iterator = variables[args[0]]; + int break_out = 0; + + if (step < 0) + { + if (iterator <= end) break_out = 1; + } + else + { + if (iterator >= end) break_out = 1; + } + + if (break_out) + { + stack_ptr -= 3; + } + else + { + variables[args[0]] = iterator + step; + pc = top + code_section; + CHECK_PC; + } + } + break; + + case 0x45: /* PSTR */ + /* + * PRINT add string + * ...argument 0 is string ID + */ +#if PORT==DOS + long_index = string_table + args[0]; + index2 = jbi_strlen(message_buffer); + + do + { + i = GET_BYTE(long_index); + message_buffer[index2] = (char) i; + ++long_index; + ++index2; + } + while ((i != '\0') && (index2 < JBIC_MESSAGE_LENGTH)); +#else + count = jbi_strlen(message_buffer); + jbi_strncpy(&message_buffer[count], + (char *) &program[string_table + args[0]], + JBIC_MESSAGE_LENGTH - count); +#endif + message_buffer[JBIC_MESSAGE_LENGTH] = '\0'; + break; + + case 0x46: /* VMAP */ + /* + * VMAP add signal name + * ...argument 0 is string ID + */ + bad_opcode = 1; + break; + + case 0x47: /* SINT */ + /* + * STATE intermediate state + * ...argument 0 is state code + */ + status = jbi_goto_jtag_state((int) args[0]); + break; + + case 0x48: /* ST */ + /* + * STATE final state + * ...argument 0 is state code + */ + status = jbi_goto_jtag_state((int) args[0]); + break; + + case 0x49: /* ISTP */ + /* + * IRSTOP state + * ...argument 0 is state code + */ + status = jbi_set_irstop_state((int) args[0]); + break; + + case 0x4A: /* DSTP */ + /* + * DRSTOP state + * ...argument 0 is state code + */ + status = jbi_set_drstop_state((int) args[0]); + break; + + case 0x4B: /* SWPN */ + /* + * Exchange top with Nth stack value + * ...argument 0 is 0-based stack entry to swap with top element + */ + index = ((int) args[0]) + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + break; + + case 0x4C: /* DUPN */ + /* + * Duplicate Nth stack value + * ...argument 0 is 0-based stack entry to duplicate + */ + index = ((int) args[0]) + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + break; + + case 0x4D: /* POPV */ + /* + * Pop stack into scalar variable + * ...argument 0 is variable ID + * ...stack 0 is value + */ + IF_CHECK_STACK(1) + { + variables[args[0]] = stack[--stack_ptr]; + } + break; + + case 0x4E: /* POPE */ + /* + * Pop stack into integer array element + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is value + */ + IF_CHECK_STACK(2) + { + variable_id = (unsigned int) args[0]; + + /* + * If variable is read-only, convert to writable array + */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x1c)) + { + /* + * Allocate a writable buffer for this array + */ + count = (unsigned int) variable_size[variable_id]; + long_temp = variables[variable_id]; + longptr_temp = (long *) jbi_malloc(count * sizeof(long)); + variables[variable_id] = (addr_t) longptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + /* copy previous contents into buffer */ + for (i = 0; i < count; ++i) + { + longptr_temp[i] = GET_DWORD(long_temp); + long_temp += 4L; + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x9c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + /* check that variable is a writable integer array */ + if ((attributes[variable_id] & 0x1c) != 0x18) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + longptr_temp = (long *) variables[variable_id]; + + /* pop the array index */ + index = (unsigned int) stack[--stack_ptr]; + + /* pop the value and store it into the array */ + longptr_temp[index] = stack[--stack_ptr]; + } + } + break; + + case 0x4F: /* POPA */ + /* + * Pop stack into Boolean array + * ...argument 0 is variable ID + * ...stack 0 is count + * ...stack 1 is array index + * ...stack 2 is value + */ + IF_CHECK_STACK(3) + { + variable_id = (unsigned int) args[0]; + + /* + * If variable is read-only, convert to writable array + */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x0c)) + { + /* + * Allocate a writable buffer for this array + */ + long_temp = (variable_size[variable_id] + 7L) >> 3L; + charptr_temp2 = (unsigned char *) variables[variable_id]; + charptr_temp = jbi_malloc((unsigned int) long_temp); + variables[variable_id] = (addr_t) charptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* zero the buffer */ + for (long_index = 0L; + long_index < long_temp; + ++long_index) + { + charptr_temp[long_index] = 0; + } + + /* copy previous contents into buffer */ + for (long_index = 0L; + long_index < variable_size[variable_id]; + ++long_index) + { +#if PORT==DOS + if ((attributes[variable_id] & 0x02) && + ((long_index & 0x0000FFFF) == 0L)) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index2 = long_index & 0xFFFF; + } +#else + long_index2 = long_index; +#endif + + if (charptr_temp2[long_index2 >> 3] & + (1 << (long_index2 & 7))) + { + charptr_temp[long_index >> 3] |= + (1 << (long_index & 7)); + } + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x8c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + /* check that variable is a writable Boolean array */ + if ((attributes[variable_id] & 0x1c) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + charptr_temp = (unsigned char *) variables[variable_id]; + + /* pop the count (number of bits to copy) */ + long_count = stack[--stack_ptr]; + + /* pop the array index */ + long_index = stack[--stack_ptr]; + + reverse = 0; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + + if (long_index > long_count) + { + reverse = 1; + long_temp = long_count; + long_count = 1 + long_index - long_count; + long_index = long_temp; + + /* reverse POPA is not supported */ + status = JBIC_BOUNDS_ERROR; + break; + } + else + { + long_count = 1 + long_count - long_index; + } + } + + /* pop the data */ + long_temp = stack[--stack_ptr]; + + if (long_count < 1) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + for (i = 0; i < (unsigned int) long_count; ++i) + { + if (long_temp & (1L << (long) i)) + { + charptr_temp[long_index >> 3L] |= + (1L << (long_index & 7L)); + } + else + { + charptr_temp[long_index >> 3L] &= + ~ (unsigned int) (1L << (long_index & 7L)); + } + ++long_index; + } + } + } + } + break; + + case 0x50: /* JMPZ */ + /* + * Pop stack and branch if zero + * ...argument 0 is address + * ...stack 0 is condition value + */ + IF_CHECK_STACK(1) + { + if (stack[--stack_ptr] == 0) + { + pc = args[0] + code_section; + CHECK_PC; + } + } + break; + + case 0x51: /* DS */ + case 0x52: /* IS */ + /* + * DRSCAN + * IRSCAN + * ...argument 0 is scan data variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_index = stack[--stack_ptr]; + long_count = stack[--stack_ptr]; + + reverse = 0; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + /* stack 2 = count */ + long_temp = long_count; + long_count = stack[--stack_ptr]; + + if (long_index > long_temp) + { + reverse = 1; + long_index = long_temp; + } + } + +#if PORT==DOS + if (((long_index & 0xFFFF0000) == 0) && + ((long_count & 0xFFFF0000) == 0)) + { + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + long_index &= 0x0000ffff; + charptr_temp = jbi_aca_out_buffer; + } + else + { + charptr_temp = (unsigned char *) variables[variable_id]; + } + + if (reverse) + { + /* allocate a buffer and reverse the data order */ + charptr_temp2 = charptr_temp; + charptr_temp = jbi_malloc((unsigned int) + ((long_count >> 3L) + 1L)); + + if (charptr_temp == NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + long_temp = long_index + long_count - 1; + long_index2 = 0; + while (long_index2 < long_count) + { + if (charptr_temp2[long_temp >> 3] & + (1 << (long_temp & 7))) + { + charptr_temp[long_index2 >> 3] |= + (1 << (long_index2 & 7)); + } + else + { + charptr_temp[long_index2 >> 3] &= + ~(1 << (long_index2 & 7)); + } + + --long_temp; + ++long_index2; + } + } + } + + if (opcode == 0x51) /* DS */ + { + status = jbi_do_drscan((unsigned int) long_count, + charptr_temp, (unsigned long) long_index); + } + else /* IS */ + { + status = jbi_do_irscan((unsigned int) long_count, + charptr_temp, (unsigned int) long_index); + } + + if (reverse) jbi_free(charptr_temp); + } + else if ((opcode == 0x51) && !reverse) + { + status = jbi_do_drscan_multi_page( + (unsigned int) args[0], + (unsigned long) long_count, + (unsigned long) long_index, version); + } + else + { + /* reverse multi-page scans are not supported */ + /* multi-page IR scans are not supported */ + status = JBIC_BOUNDS_ERROR; + } +#else + charptr_temp = (unsigned char *) variables[args[0]]; + + if (reverse) + { + /* allocate a buffer and reverse the data order */ + charptr_temp2 = charptr_temp; + charptr_temp = jbi_malloc((long_count >> 3) + 1); + if (charptr_temp == NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + long_temp = long_index + long_count - 1; + long_index2 = 0; + while (long_index2 < long_count) + { + if (charptr_temp2[long_temp >> 3] & + (1 << (long_temp & 7))) + { + charptr_temp[long_index2 >> 3] |= + (1 << (long_index2 & 7)); + } + else + { + charptr_temp[long_index2 >> 3] &= + ~(1 << (long_index2 & 7)); + } + + --long_temp; + ++long_index2; + } + } + } + + if (opcode == 0x51) /* DS */ + { + status = jbi_do_drscan((unsigned int) long_count, + charptr_temp, (unsigned long) long_index); + } + else /* IS */ + { + status = jbi_do_irscan((unsigned int) long_count, + charptr_temp, (unsigned int) long_index); + } +#endif + + if (reverse && (charptr_temp != NULL)) + { + jbi_free(charptr_temp); + } + } + break; + + case 0x53: /* DPRA */ + /* + * DRPRE with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_dr_preamble(count, index, charptr_temp); + } + break; + + case 0x54: /* DPOA */ + /* + * DRPOST with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_dr_postamble(count, index, charptr_temp); + } + break; + + case 0x55: /* IPRA */ + /* + * IRPRE with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_ir_preamble(count, index, charptr_temp); + } + break; + + case 0x56: /* IPOA */ + /* + * IRPOST with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_ir_postamble(count, index, charptr_temp); + } + break; + + case 0x57: /* EXPT */ + /* + * EXPORT + * ...argument 0 is string ID + * ...stack 0 is integer expression + */ + IF_CHECK_STACK(1) + { +#if PORT==DOS + name_id = args[0]; + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + args[0]]; +#endif + long_temp = stack[--stack_ptr]; + jbi_export_integer(name, long_temp); + } + break; + + case 0x58: /* PSHE */ + /* + * Push integer array element + * ...argument 0 is variable ID + * ...stack 0 is array index + */ + IF_CHECK_STACK(1) + { + variable_id = (unsigned int) args[0]; + index = (unsigned int) stack[stack_ptr - 1]; + + /* check variable type */ + if ((attributes[variable_id] & 0x1f) == 0x19) + { + /* writable integer array */ + longptr_temp = (long *) variables[variable_id]; + stack[stack_ptr - 1] = longptr_temp[index]; + } + else if ((attributes[variable_id] & 0x1f) == 0x1c) + { + /* read-only integer array */ + long_temp = variables[variable_id] + (4L * index); + stack[stack_ptr - 1] = GET_DWORD(long_temp); + } + else + { + status = JBIC_BOUNDS_ERROR; + } + } + break; + + case 0x59: /* PSHA */ + /* + * Push Boolean array + * ...argument 0 is variable ID + * ...stack 0 is count + * ...stack 1 is array index + */ + IF_CHECK_STACK(2) + { + variable_id = (unsigned int) args[0]; + + /* check that variable is a Boolean array */ + if ((attributes[variable_id] & 0x18) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + charptr_temp = (unsigned char *) variables[variable_id]; + + /* pop the count (number of bits to copy) */ + count = (unsigned int) stack[--stack_ptr]; + + /* pop the array index */ + index = (unsigned int) stack[stack_ptr - 1]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + if ((count < 1) || (count > 32)) + { + status = JBIC_BOUNDS_ERROR; + } + else + { +#if PORT==DOS + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (stack[stack_ptr - 1] >> 16), version); + charptr_temp = jbi_aca_out_buffer; + } +#endif + long_temp = 0L; + + for (i = 0; i < count; ++i) + { + if (charptr_temp[(i + index) >> 3] & + (1 << ((i + index) & 7))) + { + long_temp |= (1L << i); + } + } + + stack[stack_ptr - 1] = long_temp; + } + } + } + break; + + case 0x5A: /* DYNA */ + /* + * Dynamically change size of array + * ...argument 0 is variable ID + * ...stack 0 is new size + */ + IF_CHECK_STACK(1) + { + variable_id = (unsigned int) args[0]; + long_temp = stack[--stack_ptr]; + + if (long_temp > variable_size[variable_id]) + { + variable_size[variable_id] = long_temp; + + if (attributes[variable_id] & 0x10) + { + /* allocate integer array */ + long_temp *= 4; + } + else + { + /* allocate Boolean array */ + long_temp = (long_temp + 7) >> 3; + } + + /* + * If the buffer was previously allocated, free it + */ + if ((attributes[variable_id] & 0x80) && + (variables[variable_id] != (addr_t) NULL)) + { + jbi_free((void *) variables[variable_id]); + variables[variable_id] = (addr_t) NULL; + } + + /* + * Allocate a new buffer of the requested size + */ + variables[variable_id] = (addr_t) + jbi_malloc((unsigned int) long_temp); + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* + * Set the attribute bit to indicate that this buffer + * was dynamically allocated and should be freed later + */ + attributes[variable_id] |= 0x80; + + /* zero out memory */ + count = (unsigned int) + ((variable_size[variable_id] + 7L) / 8L); + charptr_temp = (unsigned char *) + (variables[variable_id]); + for (index = 0; index < count; ++index) + { + charptr_temp[index] = 0; + } + } + } + } + break; + + case 0x5B: /* EXPR */ + bad_opcode = 1; + break; + + case 0x5C: /* EXPV */ + /* + * Export Boolean array + * ...argument 0 is string ID + * ...stack 0 is variable ID + * ...stack 1 is array right index + * ...stack 2 is array left index + */ + IF_CHECK_STACK(3) + { + if (version == 0) + { + /* EXPV is not supported in JBC 1.0 */ + bad_opcode = 1; + break; + } +#if PORT==DOS + name_id = args[0]; + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + args[0]]; +#endif + variable_id = (unsigned int) stack[--stack_ptr]; + long_index = stack[--stack_ptr]; /* right index */ + long_index2 = stack[--stack_ptr]; /* left index */ + + if (long_index > long_index2) + { + /* reverse indices not supported */ + status = JBIC_BOUNDS_ERROR; + break; + } + + long_count = 1 + long_index2 - long_index; + + charptr_temp = (unsigned char *) variables[variable_id]; + charptr_temp2 = NULL; + +#if PORT==DOS + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index &= 0x0000FFFF; + } +#endif + + if ((long_index & 7L) != 0) + { + charptr_temp2 = jbi_malloc((unsigned int) + ((long_count + 7L) / 8L)); + if (charptr_temp2 == NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + long k = long_index; + for (i = 0; i < (unsigned int) long_count; ++i) + { + if (charptr_temp[k >> 3] & (1 << (k & 7))) + { + charptr_temp2[i >> 3] |= (1 << (i & 7)); + } + else + { + charptr_temp2[i >> 3] &= ~(1 << (i & 7)); + } + + ++k; + } + charptr_temp = charptr_temp2; + } + } + else if (long_index != 0) + { + charptr_temp = &charptr_temp[long_index >> 3]; + } + + jbi_export_boolean_array(name, charptr_temp, long_count); + + /* free allocated buffer */ + if (((long_index & 7L) != 0) && (charptr_temp2 != NULL)) + { + jbi_free(charptr_temp2); + } + } + break; + + case 0x80: /* COPY */ + /* + * Array copy + * ...argument 0 is dest ID + * ...argument 1 is source ID + * ...stack 0 is count + * ...stack 1 is dest index + * ...stack 2 is source index + */ + IF_CHECK_STACK(3) + { + long copy_count = stack[--stack_ptr]; + long copy_index = stack[--stack_ptr]; + long copy_index2 = stack[--stack_ptr]; + long destleft; + long src_count; + long dest_count; + int src_reverse = 0; + int dest_reverse = 0; + + reverse = 0; + + if (version > 0) + { + /* stack 0 = source right index */ + /* stack 1 = source left index */ + /* stack 2 = destination right index */ + /* stack 3 = destination left index */ + destleft = stack[--stack_ptr]; + + if (copy_count > copy_index) + { + src_reverse = 1; + reverse = 1; + src_count = 1 + copy_count - copy_index; + /* copy_index = source start index */ + } + else + { + src_count = 1 + copy_index - copy_count; + copy_index = copy_count; /* source start index */ + } + + if (copy_index2 > destleft) + { + dest_reverse = 1; + reverse = !reverse; + dest_count = 1 + copy_index2 - destleft; + copy_index2 = destleft; /* destination start index */ + } + else + { + dest_count = 1 + destleft - copy_index2; + /* copy_index2 = destination start index */ + } + + copy_count = (src_count < dest_count) ? src_count : dest_count; + + if ((src_reverse || dest_reverse) && + (src_count != dest_count)) + { + /* If either the source or destination is reversed, */ + /* we can't tolerate a length mismatch, because we */ + /* "left justify" the arrays when copying. This */ + /* won't work correctly with reversed arrays. */ + status = JBIC_BOUNDS_ERROR; + } + } + + count = (unsigned int) copy_count; + index = (unsigned int) copy_index; + index2 = (unsigned int) copy_index2; + + /* + * If destination is a read-only array, allocate a buffer + * and convert it to a writable array + */ + variable_id = (unsigned int) args[1]; + if ((version > 0) && ((attributes[variable_id] & 0x9c) == 0x0c)) + { + /* + * Allocate a writable buffer for this array + */ + long_temp = (variable_size[variable_id] + 7L) >> 3L; + charptr_temp2 = (unsigned char *) variables[variable_id]; + charptr_temp = jbi_malloc((unsigned int) long_temp); + variables[variable_id] = (addr_t) charptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + /* zero the buffer */ + for (long_index = 0L; + long_index < long_temp; + ++long_index) + { + charptr_temp[long_index] = 0; + } + + /* copy previous contents into buffer */ + for (long_index = 0L; + long_index < variable_size[variable_id]; + ++long_index) + { +#if PORT==DOS + if ((attributes[variable_id] & 0x02) && + ((long_index & 0x0000FFFF) == 0L)) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index2 = long_index & 0xFFFF; + } +#else + long_index2 = long_index; +#endif + + if (charptr_temp2[long_index2 >> 3] & + (1 << (long_index2 & 7))) + { + charptr_temp[long_index >> 3] |= + (1 << (long_index & 7)); + } + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x8c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + charptr_temp = (unsigned char *) variables[args[1]]; + charptr_temp2 = (unsigned char *) variables[args[0]]; + +#if PORT==DOS + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (copy_index >> 16), version); + charptr_temp2 = jbi_aca_out_buffer; + } +#endif + + /* check that destination is a writable Boolean array */ + if ((attributes[args[1]] & 0x1c) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + break; + } + + if (count < 1) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + if (reverse) + { + index2 += (count - 1); + } + + for (i = 0; i < count; ++i) + { + if (charptr_temp2[index >> 3] & (1 << (index & 7))) + { + charptr_temp[index2 >> 3] |= (1 << (index2 & 7)); + } + else + { + charptr_temp[index2 >> 3] &= + ~(unsigned int) (1 << (index2 & 7)); + } + ++index; + if (reverse) --index2; else ++index2; + } + } + } + break; + + case 0x81: /* REVA */ + /* + * ARRAY COPY reversing bit order + * ...argument 0 is dest ID + * ...argument 1 is source ID + * ...stack 0 is dest index + * ...stack 1 is source index + * ...stack 2 is count + */ + bad_opcode = 1; + break; + + case 0x82: /* DSC */ + case 0x83: /* ISC */ + /* + * DRSCAN with capture + * IRSCAN with capture + * ...argument 0 is scan data variable ID + * ...argument 1 is capture variable ID + * ...stack 0 is capture index + * ...stack 1 is scan data index + * ...stack 2 is count + */ + IF_CHECK_STACK(3) + { + long scan_right, scan_left; + long capture_count = 0; + long scan_count = 0; + long capture_index = stack[--stack_ptr]; + long scan_index = stack[--stack_ptr]; + if (version > 0) + { + /* stack 0 = capture right index */ + /* stack 1 = capture left index */ + /* stack 2 = scan right index */ + /* stack 3 = scan left index */ + /* stack 4 = count */ + scan_right = stack[--stack_ptr]; + scan_left = stack[--stack_ptr]; + capture_count = 1 + scan_index - capture_index; + scan_count = 1 + scan_left - scan_right; + scan_index = scan_right; + } + long_count = stack[--stack_ptr]; + + /* + * If capture array is read-only, allocate a buffer + * and convert it to a writable array + */ + variable_id = (unsigned int) args[1]; + if ((version > 0) && ((attributes[variable_id] & 0x9c) == 0x0c)) + { + /* + * Allocate a writable buffer for this array + */ + long_temp = (variable_size[variable_id] + 7L) >> 3L; + charptr_temp2 = (unsigned char *) variables[variable_id]; + charptr_temp = jbi_malloc((unsigned int) long_temp); + variables[variable_id] = (addr_t) charptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + /* zero the buffer */ + for (long_index = 0L; + long_index < long_temp; + ++long_index) + { + charptr_temp[long_index] = 0; + } + + /* copy previous contents into buffer */ + for (long_index = 0L; + long_index < variable_size[variable_id]; + ++long_index) + { +#if PORT==DOS + if ((attributes[variable_id] & 0x02) && + ((long_index & 0x0000FFFF) == 0L)) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index2 = long_index & 0xFFFF; + } +#else + long_index2 = long_index; +#endif + + if (charptr_temp2[long_index2 >> 3] & + (1 << (long_index2 & 7))) + { + charptr_temp[long_index >> 3] |= + (1 << (long_index & 7)); + } + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x8c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + charptr_temp = (unsigned char *) variables[args[0]]; + charptr_temp2 = (unsigned char *) variables[args[1]]; + +#if PORT==DOS + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (scan_index >> 16), version); + scan_index &= 0x0000ffff; + charptr_temp = jbi_aca_out_buffer; + } +#endif + + if ((version > 0) && + ((long_count > capture_count) || (long_count > scan_count))) + { + status = JBIC_BOUNDS_ERROR; + } + + /* check that capture array is a writable Boolean array */ + if ((attributes[args[1]] & 0x1c) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + } + + if (status == JBIC_SUCCESS) + { + if (opcode == 0x82) /* DSC */ + { + status = jbi_swap_dr((unsigned int) long_count, + charptr_temp, (unsigned long) scan_index, + charptr_temp2, (unsigned int) capture_index); + } + else /* ISC */ + { + status = jbi_swap_ir((unsigned int) long_count, + charptr_temp, (unsigned int) scan_index, + charptr_temp2, (unsigned int) capture_index); + } + } + } + break; + + case 0x84: /* WAIT */ + /* + * WAIT + * ...argument 0 is wait state + * ...argument 1 is end state + * ...stack 0 is cycles + * ...stack 1 is microseconds + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + + if (long_temp != 0L) + { + status = jbi_do_wait_cycles(long_temp, (unsigned int) args[0]); + } + + long_temp = stack[--stack_ptr]; + + if ((status == JBIC_SUCCESS) && (long_temp != 0L)) + { + status = jbi_do_wait_microseconds(long_temp, (unsigned int) args[0]); + } + + if ((status == JBIC_SUCCESS) && (args[1] != args[0])) + { + status = jbi_goto_jtag_state((unsigned int) args[1]); + } + + if (version > 0) + { + --stack_ptr; /* throw away MAX cycles */ + --stack_ptr; /* throw away MAX microseconds */ + } + } + break; + + case 0x85: /* VS */ + /* + * VECTOR + * ...argument 0 is dir data variable ID + * ...argument 1 is scan data variable ID + * ...stack 0 is dir array index + * ...stack 1 is scan array index + * ...stack 2 is count + */ + bad_opcode = 1; + break; + + case 0xC0: /* CMPA */ + /* + * Array compare + * ...argument 0 is source 1 ID + * ...argument 1 is source 2 ID + * ...argument 2 is mask ID + * ...stack 0 is source 1 index + * ...stack 1 is source 2 index + * ...stack 2 is mask index + * ...stack 3 is count + */ + IF_CHECK_STACK(4) + { + long a, b; + unsigned char *source1 = (unsigned char *) variables[args[0]]; + unsigned char *source2 = (unsigned char *) variables[args[1]]; + unsigned char *mask = (unsigned char *) variables[args[2]]; + unsigned long index1 = stack[--stack_ptr]; + unsigned long index2 = stack[--stack_ptr]; + unsigned long mask_index = stack[--stack_ptr]; + long_count = stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = source 1 right index */ + /* stack 1 = source 1 left index */ + /* stack 2 = source 2 right index */ + /* stack 3 = source 2 left index */ + /* stack 4 = mask right index */ + /* stack 5 = mask left index */ + long mask_right = stack[--stack_ptr]; + long mask_left = stack[--stack_ptr]; + a = 1 + index2 - index1; /* source 1 count */ + b = 1 + long_count - mask_index; /* source 2 count */ + a = (a < b) ? a : b; + b = 1 + mask_left - mask_right; /* mask count */ + a = (a < b) ? a : b; + index2 = mask_index; /* source 2 start index */ + mask_index = mask_right; /* mask start index */ + long_count = a; + } + + long_temp = 1L; + + if (long_count < 1) + { + status = JBIC_BOUNDS_ERROR; + } + else + { +#if PORT==DOS + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + jbi_uncompress_page(variable_id, + (int) (index1 >> 16), version); + index1 &= 0x0000ffff; + source1 = jbi_aca_out_buffer; + } + + variable_id = (unsigned int) args[1]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + jbi_uncompress_page(variable_id, + (int) (index2 >> 16), version); + index2 &= 0x0000ffff; + source2 = jbi_aca_out_buffer; + } +#endif + count = (unsigned int) long_count; + + for (i = 0; i < count; ++i) + { + if (mask[mask_index >> 3] & (1 << (mask_index & 7))) + { + a = source1[index1 >> 3] & (1 << (index1 & 7)) + ? 1 : 0; + b = source2[index2 >> 3] & (1 << (index2 & 7)) + ? 1 : 0; + + if (a != b) long_temp = 0L; /* failure */ + } + ++index1; + ++index2; + ++mask_index; + } + } + + stack[stack_ptr++] = long_temp; + } + break; + + case 0xC1: /* VSC */ + /* + * VECTOR with capture + * ...argument 0 is dir data variable ID + * ...argument 1 is scan data variable ID + * ...argument 2 is capture variable ID + * ...stack 0 is capture index + * ...stack 1 is scan data index + * ...stack 2 is dir data index + * ...stack 3 is count + */ + bad_opcode = 1; + break; + + default: + /* + * Unrecognized opcode -- ERROR! + */ + bad_opcode = 1; + break; + } + + if (bad_opcode) + { + status = JBIC_ILLEGAL_OPCODE; + } + + if ((stack_ptr < 0) || (stack_ptr >= JBI_STACK_SIZE)) + { + status = JBIC_STACK_OVERFLOW; + } + + if (status != JBIC_SUCCESS) + { + done = 1; + *error_address = (long) (opcode_address - code_section); + } + } + jbi_dbg(DEBUG_DETAIL, "debug_cnt(total): 0x%lx\n", debug_cnt); + + jbi_dbg(DEBUG_NOISY, "jbi_free_jtag_padding_buffers\n"); + jbi_free_jtag_padding_buffers(reset_jtag); + + /* + * Free all dynamically allocated arrays + */ + jbi_dbg(DEBUG_NOISY, "jbi_free_attributes\n"); + if ((attributes != NULL) && (variables != NULL)) + { + for (i = 0; i < (unsigned int) symbol_count; ++i) + { + if ((attributes[i] & 0x80) && (variables[i] != (addr_t) NULL) + && (variables[i] != (addr_t) 1)) + { + jbi_free((void *) variables[i]); + } + } + } + + if (variables != NULL) jbi_free(variables); + + if (variable_size != NULL) jbi_free(variable_size); + + if (attributes != NULL) jbi_free(attributes); + + if (proc_attributes != NULL) jbi_free(proc_attributes); + + jbi_dbg(DEBUG_NOISY, "return status %d\n", status); + kfree(message_buffer); + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_get_note +( + PROGRAM_PTR program, + long program_size, + long *offset, + char *key, + char *value, + int length +) + +/* */ +/* Description: Gets key and value of NOTE fields in the JBC file. */ +/* Can be called in two modes: if offset pointer is NULL, */ +/* then the function searches for note fields which match */ +/* the key string provided. If offset is not NULL, then */ +/* the function finds the next note field of any key, */ +/* starting at the offset specified by the offset pointer. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_UNEXPECTED_END; + unsigned long note_strings = 0L; + unsigned long note_table = 0L; + unsigned long note_count = 0L; + unsigned long first_word = 0L; + int version = 0; + int delta = 0; + char *key_ptr; + char *value_ptr; + int i; + +#if PORT==DOS + int count = 0; + int done = 0; + long long_index = 0; + char key_buffer[256]; + char value_buffer[256]; + + jbi_program = program; +#endif + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + version = (int) (first_word & 1L); + delta = version * 8; + + note_strings = GET_DWORD(8 + delta); + note_table = GET_DWORD(12 + delta); + note_count = GET_DWORD(44 + (2 * delta)); + } + + if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) + { + status = JBIC_IO_ERROR; + } + else if (note_count > 0L) + { + if (offset == NULL) + { + /* + * We will search for the first note with a specific key, and + * return only the value + */ + for (i = 0; (i < (int) note_count) && (status != JBIC_SUCCESS); ++i) + { +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + GET_DWORD(note_table + (8 * i)); + while ((count < 255) && !done) + { + key_buffer[count] = GET_BYTE(long_index); + if (key_buffer[count] == '\0') done = 1; + ++long_index; + ++count; + } + key_buffer[255] = '\0'; + key_ptr = key_buffer; +#else + key_ptr = (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i))]; +#endif + if ((key != NULL) && (jbi_stricmp(key, key_ptr) == 0)) + { + status = JBIC_SUCCESS; + +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + GET_DWORD(note_table + (8 * i) + 4); + while ((count < 255) && !done) + { + value_buffer[count] = GET_BYTE(long_index); + if (value_buffer[count] == '\0') done = 1; + ++long_index; + ++count; + } + value_buffer[255] = '\0'; + value_ptr = value_buffer; +#else + value_ptr = (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i) + 4)]; +#endif + + if (value != NULL) + { + jbi_strncpy(value, value_ptr, length); + } + } + } + } + else + { + /* + * We will search for the next note, regardless of the key, and + * return both the value and the key + */ + + i = (int) *offset; + + if ((i >= 0) && (i < (int) note_count)) + { + status = JBIC_SUCCESS; + + if (key != NULL) + { +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + + GET_DWORD(note_table + (8 * i)); + + while ((count < length) && !done) + { + key[count] = GET_BYTE(long_index); + if (key[count] == '\0') done = 1; + ++long_index; + ++count; + } +#else + jbi_strncpy(key, (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i))], length); +#endif + } + + if (value != NULL) + { +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + + GET_DWORD(note_table + (8 * i) + 4); + + while ((count < length) && !done) + { + value[count] = GET_BYTE(long_index); + if (value[count] == '\0') done = 1; + ++long_index; + ++count; + } +#else + jbi_strncpy(value, (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i) + 4)], length); +#endif + } + + *offset = i + 1; + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_check_crc +( + PROGRAM_PTR program, + long program_size, + unsigned short *expected_crc, + unsigned short *actual_crc +) + +/* */ +/* Description: This function reads the entire input file and computes */ +/* the CRC of everything up to the CRC field. */ +/* */ +/* Returns: JBIC_SUCCESS for success, JBIC_CRC_ERROR for failure */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned short local_expected, local_actual, shift_reg = 0xffff; + int bit, feedback; + unsigned char databyte; + unsigned long i; + unsigned long crc_section = 0L; + unsigned long first_word = 0L; + int version = 0; + int delta = 0; + +#if PORT==DOS + jbi_program = program; +#endif + + if (program_size > 52L) + { + first_word = GET_DWORD(0); + version = (int) (first_word & 1L); + delta = version * 8; + + crc_section = GET_DWORD(32 + delta); + } + + if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) + { + status = JBIC_IO_ERROR; + } + + if (crc_section >= (unsigned long) program_size) + { + status = JBIC_IO_ERROR; + } + + if (status == JBIC_SUCCESS) + { + local_expected = (unsigned short) GET_WORD(crc_section); + if (expected_crc != NULL) *expected_crc = local_expected; + + for (i = 0; i < crc_section; ++i) + { + databyte = GET_BYTE(i); + for (bit = 0; bit < 8; bit++) /* compute for each bit */ + { + feedback = (databyte ^ shift_reg) & 0x01; + shift_reg >>= 1; /* shift the shift register */ + if (feedback) shift_reg ^= 0x8408; /* invert selected bits */ + databyte >>= 1; /* get the next bit of input_byte */ + } + } + + local_actual = (unsigned short) ~shift_reg; + if (actual_crc != NULL) *actual_crc = local_actual; + + if (local_expected != local_actual) + { + status = JBIC_CRC_ERROR; + } + } + + return (status); +} + +JBI_RETURN_TYPE jbi_get_file_info +( + PROGRAM_PTR program, + long program_size, + int *format_version, + int *action_count, + int *procedure_count +) +{ + JBI_RETURN_TYPE status = JBIC_IO_ERROR; + unsigned long first_word = 0; + int version = 0; + +#if PORT==DOS + jbi_program = program; +#endif + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + + if ((first_word == 0x4A414D00L) || (first_word == 0x4A414D01L)) + { + status = JBIC_SUCCESS; + + version = (int) (first_word & 1L); + *format_version = version + 1; + + if (version > 0) + { + *action_count = (int) GET_DWORD(48); + *procedure_count = (int) GET_DWORD(52); + } + } + + } + + return (status); +} + +JBI_RETURN_TYPE jbi_get_action_info +( + PROGRAM_PTR program, + long program_size, + int index, + char **name, + char **description, + JBI_PROCINFO **procedure_list +) +{ + JBI_RETURN_TYPE status = JBIC_IO_ERROR; + JBI_PROCINFO *procptr = NULL; + JBI_PROCINFO *tmpptr = NULL; + unsigned long first_word = 0L; + unsigned long action_table = 0L; + unsigned long proc_table = 0L; + unsigned long string_table = 0L; + unsigned long note_strings = 0L; + unsigned long action_count = 0L; + unsigned long proc_count = 0L; + unsigned long act_name_id = 0L; + unsigned long act_desc_id = 0L; + unsigned long act_proc_id = 0L; + unsigned long act_proc_name = 0L; + unsigned char act_proc_attribute = 0; + +#if PORT==DOS + int i, length; + jbi_program = program; +#endif + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + + if (first_word == 0x4A414D01L) + { + action_table = GET_DWORD(4); + proc_table = GET_DWORD(8); + string_table = GET_DWORD(12); + note_strings = GET_DWORD(16); + action_count = GET_DWORD(48); + proc_count = GET_DWORD(52); + + if (index < (int) action_count) + { + act_name_id = GET_DWORD(action_table + (12 * index)); + act_desc_id = GET_DWORD(action_table + (12 * index) + 4); + act_proc_id = GET_DWORD(action_table + (12 * index) + 8); + +#if PORT==DOS + length = 0; + while (GET_BYTE(string_table + act_name_id + length) != 0) ++length; + *name = jbi_malloc(length + 1); + if (*name == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + for (i = 0; i < length; ++i) + { + (*name)[i] = GET_BYTE(string_table + act_name_id + i); + } + (*name)[length] = '\0'; + } +#else + *name = (char *) &program[string_table + act_name_id]; +#endif + + if (act_desc_id < (note_strings - string_table)) + { +#if PORT==DOS + length = 0; + while (GET_BYTE(string_table + act_desc_id + length) != 0) ++length; + *description = jbi_malloc(length + 1); + if (*description == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + for (i = 0; i < length; ++i) + { + (*description)[i] = GET_BYTE(string_table + act_desc_id + i); + } + (*description)[length] = '\0'; + } +#else + *description = (char *) &program[string_table + act_desc_id]; +#endif + } + + do + { + act_proc_name = GET_DWORD(proc_table + (13 * act_proc_id)); + act_proc_attribute = (unsigned char) + (GET_BYTE(proc_table + (13 * act_proc_id) + 8) & 0x03); + + procptr = (JBI_PROCINFO *) jbi_malloc(sizeof(JBI_PROCINFO)); + + if (procptr == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { +#if PORT==DOS + length = 0; + while (GET_BYTE(string_table + act_proc_name + length) != 0) ++length; + procptr->name = jbi_malloc(length + 1); + if (procptr->name == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + for (i = 0; i < length; ++i) + { + procptr->name[i] = + GET_BYTE(string_table + act_proc_name + i); + } + procptr->name[length] = '\0'; + } +#else + procptr->name = (char *) + &program[string_table + act_proc_name]; +#endif + procptr->attributes = act_proc_attribute; + procptr->next = NULL; + + /* add record to end of linked list */ + if (*procedure_list == NULL) + { + *procedure_list = procptr; + } + else + { + tmpptr = *procedure_list; + while (tmpptr->next != NULL) tmpptr = tmpptr->next; + tmpptr->next = procptr; + } + } + + act_proc_id = + GET_DWORD(proc_table + (13 * act_proc_id) + 4); + } + while ((act_proc_id != 0) && (act_proc_id < proc_count)); + } + } + + } + + return (status); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h new file mode 100644 index 000000000000..28669dc81ff6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h @@ -0,0 +1,45 @@ +/****************************************************************************/ +/* */ +/* Module: jbiport.h */ +/* */ +/* Copyright (C) Altera Corporation 2000-2001 */ +/* */ +/* Description: Defines porting macros */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBIPORT_H +#define INC_JBIPORT_H + +/* +* PORT defines the target platform: DOS, WINDOWS, UNIX, or EMBEDDED +* +* PORT = DOS means a 16-bit DOS console-mode application +* +* PORT = WINDOWS means a 32-bit WIN32 console-mode application for +* Windows 95, 98, 2000, ME or NT. On NT this will use the +* DeviceIoControl() API to access the Parallel Port. +* +* PORT = UNIX means any UNIX system. BitBlaster access is support via +* the standard ANSI system calls open(), read(), write(). +* The ByteBlaster is not supported. +* +* PORT = EMBEDDED means all DOS, WINDOWS, and UNIX code is excluded. +* Remaining code supports 16 and 32-bit compilers. +* Additional porting steps may be necessary. See readme +* file for more details. +*/ + +#define DOS 2 +#define WINDOWS 3 +#define UNIX 4 +#define EMBEDDED 5 + +#define PORT EMBEDDED + +#ifndef PORT +/* change this line to build a different port */ +#define PORT WINDOWS +#endif + +#endif /* INC_JBIPORT_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c new file mode 100644 index 000000000000..396c92caca2b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c @@ -0,0 +1,2518 @@ +/****************************************************************************/ +/* */ +/* Module: jbistub.c */ +/* */ +/* Copyright (C) Altera Corporation 1997-2001 */ +/* */ +/* Description: Jam STAPL ByteCode Player main source file */ +/* */ +/* Supports Altera ByteBlaster hardware download cable */ +/* on Windows 95 and Windows NT operating systems. */ +/* (A device driver is required for Windows NT.) */ +/* */ +/* Also supports BitBlaster hardware download cable on */ +/* Windows 95, Windows NT, and UNIX platforms. */ +/* */ +/* Revisions: 1.1 fixed control port initialization for ByteBlaster */ +/* 2.0 added support for STAPL bytecode format, added code */ +/* to get printer port address from Windows registry */ +/* 2.1 improved messages, fixed delay-calibration bug in */ +/* 16-bit DOS port, added support for "alternative */ +/* cable X", added option to control whether to reset */ +/* the TAP after execution, moved porting macros into */ +/* jbiport.h */ +/* 2.2 added support for static memory */ +/* fixed /W4 warnings */ +/* */ +/****************************************************************************/ + +#ifndef NO_ALTERA_STDIO +#define NO_ALTERA_STDIO +#endif + +#if 0 +#if ( _MSC_VER >= 800 ) +#pragma warning(disable:4115) +#pragma warning(disable:4201) +#pragma warning(disable:4214) +#pragma warning(disable:4514) +#endif +#endif + +#include "jbiport.h" + +#if PORT == WINDOWS +#include +#else +typedef int BOOL; +typedef unsigned char BYTE; +typedef unsigned short WORD; +#if PORT == EMBEDDED +typedef unsigned int DWORD; +#else +typedef unsigned long DWORD; +#endif +#define TRUE 1 +#define FALSE 0 +#endif + +#if PORT != EMBEDDED +#include +#include +#include +#include +#include +#include +#endif + +#include + +#include "jbiexprt.h" +#include "jbistub.h" + +#if defined(USE_STATIC_MEMORY) + #define N_STATIC_MEMORY_KBYTES ((unsigned int) USE_STATIC_MEMORY) + #define N_STATIC_MEMORY_BYTES (N_STATIC_MEMORY_KBYTES * 1024) + #define POINTER_ALIGNMENT sizeof(DWORD) +#else /* USE_STATIC_MEMORY */ + /* #include */ + #define POINTER_ALIGNMENT sizeof(BYTE) +#endif /* USE_STATIC_MEMORY */ + +#if PORT != EMBEDDED +#include +#include +#include +#include +#include +#endif + +#if PORT == DOS +#include +#endif + +int jbi_debug_level = DEBUG_NONE; +static long jbi_delay_us = 0, jbi_delay_count = 0, jbi_peak_us = 0; + +void __jbi_jtag_udelay(unsigned long us) +{ + udelay(us); +} +void jbi_jtag_udelay(unsigned long us) __attribute__((weak, alias("__jbi_jtag_udelay"))); + +#if PORT == WINDOWS +#define PGDC_IOCTL_GET_DEVICE_INFO_PP 0x00166A00L +#define PGDC_IOCTL_READ_PORT_PP 0x00166A04L +#define PGDC_IOCTL_WRITE_PORT_PP 0x0016AA08L +#define PGDC_IOCTL_PROCESS_LIST_PP 0x0016AA1CL +#define PGDC_READ_INFO 0x0a80 +#define PGDC_READ_PORT 0x0a81 +#define PGDC_WRITE_PORT 0x0a82 +#define PGDC_PROCESS_LIST 0x0a87 +#define PGDC_HDLC_NTDRIVER_VERSION 2 +#define PORT_IO_BUFFER_SIZE 256 +#endif + +#if PORT == WINDOWS +#ifdef __BORLANDC__ +/* create dummy inp() and outp() functions for Borland 32-bit compile */ +WORD inp(WORD address) { address = address; return(0); } +void outp(WORD address, WORD data) { address = address; data = data; } +#else +#pragma intrinsic (inp, outp) +#endif +#endif + +/* +* For Borland C compiler (16-bit), set the stack size +*/ +#if PORT == DOS +#ifdef __BORLANDC__ +extern unsigned int _stklen = 50000; +#endif +#endif + +/************************************************************************ +* +* Global variables +*/ + +/* file buffer for Jam STAPL ByteCode input file */ +#if PORT == DOS +unsigned char **file_buffer = NULL; +#else +unsigned char *file_buffer = NULL; +#endif +long file_pointer = 0L; +long file_length = 0L; + +/* delay count for one millisecond delay */ +long one_ms_delay = 0L; + +/* serial port interface available on all platforms */ +BOOL jtag_hardware_initialized = FALSE; +char *serial_port_name = NULL; +BOOL specified_com_port = FALSE; +int com_port = -1; +void initialize_jtag_hardware(void); +void close_jtag_hardware(void); + +#if defined(USE_STATIC_MEMORY) + unsigned char static_memory_heap[N_STATIC_MEMORY_BYTES] = { 0 }; +#endif /* USE_STATIC_MEMORY */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + unsigned int n_bytes_allocated = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + unsigned int peak_memory_usage = 0; + unsigned int peak_allocations = 0; + unsigned int n_allocations = 0; +#if defined(USE_STATIC_MEMORY) + unsigned int n_bytes_not_recovered = 0; +#endif /* USE_STATIC_MEMORY */ + const DWORD BEGIN_GUARD = 0x01234567; + const DWORD END_GUARD = 0x76543210; +#endif /* MEM_TRACKER */ + +#if PORT == WINDOWS || PORT == DOS +/* parallel port interface available on PC only */ +BOOL specified_lpt_port = FALSE; +BOOL specified_lpt_addr = FALSE; +int lpt_port = 1; +int initial_lpt_ctrl = 0; +WORD lpt_addr = 0x3bc; +WORD lpt_addr_table[3] = { 0x3bc, 0x378, 0x278 }; +BOOL alternative_cable_l = FALSE; +BOOL alternative_cable_x = FALSE; +void write_byteblaster(int port, int data); +int read_byteblaster(int port); +#endif + +#if PORT==WINDOWS +#ifndef __BORLANDC__ +WORD lpt_addresses_from_registry[4] = { 0 }; +#endif +#endif + +#if PORT == WINDOWS +/* variables to manage cached I/O under Windows NT */ +BOOL windows_nt = FALSE; +int port_io_count = 0; +HANDLE nt_device_handle = INVALID_HANDLE_VALUE; +struct PORT_IO_LIST_STRUCT +{ + USHORT command; + USHORT data; +} port_io_buffer[PORT_IO_BUFFER_SIZE]; +extern void flush_ports(void); +BOOL initialize_nt_driver(void); +#endif + +/* function prototypes to allow forward reference */ +extern void delay_loop(long count); + +/* +* This structure stores information about each available vector signal +*/ +struct VECTOR_LIST_STRUCT +{ + char *signal_name; + int hardware_bit; + int vector_index; +}; + +struct VECTOR_LIST_STRUCT vector_list[] = +{ + /* add a record here for each vector signal */ + { "", 0, -1 } +}; + +#define VECTOR_SIGNAL_COUNT ((int)(sizeof(vector_list)/sizeof(vector_list[0]))) + +BOOL verbose = FALSE; + +/************************************************************************ +* +* Customized interface functions for Jam STAPL ByteCode Player I/O: +* +* jbi_jtag_io() +* jbi_message() +* jbi_delay() +*/ + +int jbi_jtag_io(int tms, int tdi, int read_tdo) +{ +#if PORT == WINDOWS || PORT == DOS + int data = 0; +#endif + int tdo = 0; + int i = 0; + int result = 0; + char ch_data = 0; + + if (!jtag_hardware_initialized) + { + initialize_jtag_hardware(); + jtag_hardware_initialized = TRUE; + } + + if (specified_com_port) + { + ch_data = (char) + ((tdi ? 0x01 : 0) | (tms ? 0x02 : 0) | 0x60); + + write(com_port, &ch_data, 1); + + if (read_tdo) + { + ch_data = 0x7e; + write(com_port, &ch_data, 1); + for (i = 0; (i < 100) && (result != 1); ++i) + { + result = read(com_port, &ch_data, 1); + } + if (result == 1) + { + tdo = ch_data & 0x01; + } + else + { + fprintf(stderr, "Error: BitBlaster not responding\n"); + } + } + + ch_data = (char) + ((tdi ? 0x01 : 0) | (tms ? 0x02 : 0) | 0x64); + + write(com_port, &ch_data, 1); + } + else + { +#if PORT == WINDOWS || PORT == DOS + data = (alternative_cable_l ? ((tdi ? 0x01 : 0) | (tms ? 0x04 : 0)) : + (alternative_cable_x ? ((tdi ? 0x01 : 0) | (tms ? 0x04 : 0) | 0x10) : + ((tdi ? 0x40 : 0) | (tms ? 0x02 : 0)))); + + write_byteblaster(0, data); + + if (read_tdo) + { + tdo = read_byteblaster(1); + tdo = (alternative_cable_l ? ((tdo & 0x40) ? 1 : 0) : + (alternative_cable_x ? ((tdo & 0x10) ? 1 : 0) : + ((tdo & 0x80) ? 0 : 1))); + } + + write_byteblaster(0, data | (alternative_cable_l ? 0x02 : (alternative_cable_x ? 0x02: 0x01))); + + write_byteblaster(0, data); +#elif PORT == EMBEDDED + /* Output variables TDI, TMS to the corresponding pin; As read_tdo, return the corresponding pin to the variable tdo */ + tdo = jbi_jtag_io_(tms, tdi, read_tdo); +#else + /* parallel port interface not available */ + tdo = 0; +#endif + } + + return (tdo); +} + +void jbi_message(char *message_text) +{ + puts(message_text); + puts("\n"); + fflush(stdout); +} + +void jbi_export_integer(char *key, long value) +{ + if (verbose) + { + printf("Export: key = \"%s\", value = %ld\n", key, value); + fflush(stdout); + } +} + +#define HEX_LINE_CHARS 72 +#define HEX_LINE_BITS (HEX_LINE_CHARS * 4) + +char conv_to_hex(unsigned long value) +{ + char c; + + if (value > 9) + { + c = (char) (value + ('A' - 10)); + } + else + { + c = (char) (value + '0'); + } + + return (c); +} + +void jbi_export_boolean_array(char *key, unsigned char *data, long count) +{ + char string[HEX_LINE_CHARS + 1]; + long i, offset; + unsigned long size, line, lines, linebits, value, j, k; + + if (verbose) + { + if (count > HEX_LINE_BITS) + { + printf("Export: key = \"%s\", %ld bits, value = HEX\n", key, count); + lines = (count + (HEX_LINE_BITS - 1)) / HEX_LINE_BITS; + + for (line = 0; line < lines; ++line) + { + if (line < (lines - 1)) + { + linebits = HEX_LINE_BITS; + size = HEX_LINE_CHARS; + offset = count - ((line + 1) * HEX_LINE_BITS); + } + else + { + linebits = count - ((lines - 1) * HEX_LINE_BITS); + size = (linebits + 3) / 4; + offset = 0L; + } + + string[size] = '\0'; + j = size - 1; + value = 0; + + for (k = 0; k < linebits; ++k) + { + i = k + offset; + if (data[i >> 3] & (1 << (i & 7))) value |= (1 << (i & 3)); + if ((i & 3) == 3) + { + string[j] = conv_to_hex(value); + value = 0; + --j; + } + } + if ((k & 3) > 0) string[j] = conv_to_hex(value); + + printf("%s\n", string); + } + + fflush(stdout); + } + else + { + size = (count + 3) / 4; + string[size] = '\0'; + j = size - 1; + value = 0; + + for (i = 0; i < count; ++i) + { + if (data[i >> 3] & (1 << (i & 7))) value |= (1 << (i & 3)); + if ((i & 3) == 3) + { + string[j] = conv_to_hex(value); + value = 0; + --j; + } + } + if ((i & 3) > 0) string[j] = conv_to_hex(value); + + printf("Export: key = \"%s\", %ld bits, value = HEX %s\n", + key, count, string); + fflush(stdout); + } + } +} + +void jbi_delay(long microseconds) +{ + if (jbi_peak_us < microseconds) { + jbi_peak_us = microseconds; + } + jbi_delay_us += microseconds; + jbi_delay_count++; + +#if PORT == WINDOWS + /* if Windows NT, flush I/O cache buffer before delay loop */ + if (windows_nt && (port_io_count > 0)) flush_ports(); +#endif + +#if PORT == EMBEDDED + udelay(microseconds); +#else + delay_loop(microseconds * + ((one_ms_delay / 1000L) + ((one_ms_delay % 1000L) ? 1 : 0))); +#endif +} + +int jbi_vector_map +( + int signal_count, + char **signals +) +{ + int signal, vector, ch_index, diff; + int matched_count = 0; + char l, r; + + for (vector = 0; (vector < VECTOR_SIGNAL_COUNT); ++vector) + { + vector_list[vector].vector_index = -1; + } + + for (signal = 0; signal < signal_count; ++signal) + { + diff = 1; + for (vector = 0; (diff != 0) && (vector < VECTOR_SIGNAL_COUNT); + ++vector) + { + if (vector_list[vector].vector_index == -1) + { + ch_index = 0; + do + { + l = signals[signal][ch_index]; + r = vector_list[vector].signal_name[ch_index]; + diff = (((l >= 'a') && (l <= 'z')) ? (l - ('a' - 'A')) : l) + - (((r >= 'a') && (r <= 'z')) ? (r - ('a' - 'A')) : r); + ++ch_index; + } + while ((diff == 0) && (l != '\0') && (r != '\0')); + + if (diff == 0) + { + vector_list[vector].vector_index = signal; + ++matched_count; + } + } + } + } + + return (matched_count); +} + +int jbi_vector_io +( + int signal_count, + long *dir_vect, + long *data_vect, + long *capture_vect +) +{ + int signal, vector, bit; + int matched_count = 0; + int data = 0; + int mask = 0; + int dir = 0; + int i = 0; + int result = 0; + char ch_data = 0; + + if (!jtag_hardware_initialized) + { + initialize_jtag_hardware(); + jtag_hardware_initialized = TRUE; + } + + /* + * Collect information about output signals + */ + for (vector = 0; vector < VECTOR_SIGNAL_COUNT; ++vector) + { + signal = vector_list[vector].vector_index; + + if ((signal >= 0) && (signal < signal_count)) + { + bit = (1 << vector_list[vector].hardware_bit); + + mask |= bit; + if (data_vect[signal >> 5] & (1L << (signal & 0x1f))) data |= bit; + if (dir_vect[signal >> 5] & (1L << (signal & 0x1f))) dir |= bit; + + ++matched_count; + } + } + + /* + * Write outputs to hardware interface, if any + */ + if (dir != 0) + { + if (specified_com_port) + { + ch_data = (char) (((data >> 6) & 0x01) | (data & 0x02) | + ((data << 2) & 0x04) | ((data << 3) & 0x08) | 0x60); + write(com_port, &ch_data, 1); + } + else + { +#if PORT == WINDOWS || PORT == DOS + + write_byteblaster(0, data); + +#endif + } + } + + /* + * Read the input signals and save information in capture_vect[] + */ + if ((dir != mask) && (capture_vect != NULL)) + { + if (specified_com_port) + { + ch_data = 0x7e; + write(com_port, &ch_data, 1); + for (i = 0; (i < 100) && (result != 1); ++i) + { + result = read(com_port, &ch_data, 1); + } + if (result == 1) + { + data = ((ch_data << 7) & 0x80) | ((ch_data << 3) & 0x10); + } + else + { + fprintf(stderr, "Error: BitBlaster not responding\n"); + } + } + else + { +#if PORT == WINDOWS || PORT == DOS + + data = read_byteblaster(1) ^ 0x80; /* parallel port inverts bit 7 */ + +#endif + } + + for (vector = 0; vector < VECTOR_SIGNAL_COUNT; ++vector) + { + signal = vector_list[vector].vector_index; + + if ((signal >= 0) && (signal < signal_count)) + { + bit = (1 << vector_list[vector].hardware_bit); + + if ((dir & bit) == 0) /* if it is an input signal... */ + { + if (data & bit) + { + capture_vect[signal >> 5] |= (1L << (signal & 0x1f)); + } + else + { + capture_vect[signal >> 5] &= ~(unsigned long) + (1L << (signal & 0x1f)); + } + } + } + } + } + + return (matched_count); +} + +void *jbi_malloc(unsigned int size) +{ + unsigned int n_bytes_to_allocate = +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + sizeof(unsigned int) + +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ +#if defined(MEM_TRACKER) + (2 * sizeof(DWORD)) + +#endif /* MEM_TRACKER */ + (POINTER_ALIGNMENT * ((size + POINTER_ALIGNMENT - 1) / POINTER_ALIGNMENT)); + + unsigned char *ptr = 0; + +#if defined(MEM_TRACKER) + if ((n_bytes_allocated + n_bytes_to_allocate) > peak_memory_usage) + { + peak_memory_usage = n_bytes_allocated + n_bytes_to_allocate; + } + if ((n_allocations + 1) > peak_allocations) + { + peak_allocations = n_allocations + 1; + } +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) + if ((n_bytes_allocated + n_bytes_to_allocate) <= N_STATIC_MEMORY_BYTES) + { + ptr = (&(static_memory_heap[n_bytes_allocated])); + } +#else /* USE_STATIC_MEMORY */ + ptr = (unsigned char *) malloc(n_bytes_to_allocate); +#endif /* USE_STATIC_MEMORY */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + if (ptr != 0) + { + unsigned int i = 0; + +#if defined(MEM_TRACKER) + for (i = 0; i < sizeof(DWORD); ++i) + { + *ptr = (unsigned char) (BEGIN_GUARD >> (8 * i)); + ++ptr; + } +#endif /* MEM_TRACKER */ + + for (i = 0; i < sizeof(unsigned int); ++i) + { + *ptr = (unsigned char) (size >> (8 * i)); + ++ptr; + } + +#if defined(MEM_TRACKER) + for (i = 0; i < sizeof(DWORD); ++i) + { + *(ptr + size + i) = (unsigned char) (END_GUARD >> (8 * i)); + /* don't increment ptr */ + } + + ++n_allocations; +#endif /* MEM_TRACKER */ + + n_bytes_allocated += n_bytes_to_allocate; + } +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + + jbi_dbg(DEBUG_MM, "malloc 0x%p(%d,%d)\n", ptr, size, n_bytes_to_allocate); + + return ptr; +} + +void jbi_free(void *ptr) +{ + jbi_dbg(DEBUG_MM, "free 0x%p\n", ptr); + + if + ( +#if defined(MEM_TRACKER) + (n_allocations > 0) && +#endif /* MEM_TRACKER */ + (ptr != 0) + ) + { + unsigned char *tmp_ptr = (unsigned char *) ptr; + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + unsigned int n_bytes_to_free = 0; + unsigned int i = 0; + unsigned int size = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ +#if defined(MEM_TRACKER) + DWORD begin_guard = 0; + DWORD end_guard = 0; + + tmp_ptr -= sizeof(DWORD); +#endif /* MEM_TRACKER */ +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + tmp_ptr -= sizeof(unsigned int); +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + ptr = tmp_ptr; + +#if defined(MEM_TRACKER) + for (i = 0; i < sizeof(DWORD); ++i) + { + begin_guard |= (((DWORD)(*tmp_ptr)) << (8 * i)); + ++tmp_ptr; + } +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + for (i = 0; i < sizeof(unsigned int); ++i) + { + size |= (((unsigned int)(*tmp_ptr)) << (8 * i)); + ++tmp_ptr; + } +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + tmp_ptr += size; + + for (i = 0; i < sizeof(DWORD); ++i) + { + end_guard |= (((DWORD)(*tmp_ptr)) << (8 * i)); + ++tmp_ptr; + } + + if ((begin_guard != BEGIN_GUARD) || (end_guard != END_GUARD)) + { + fprintf(stderr, "Error: memory corruption detected for allocation #%d... bad %s guard\n", + n_allocations, (begin_guard != BEGIN_GUARD) ? "begin" : "end"); + } + + --n_allocations; +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + n_bytes_to_free = +#if defined(MEM_TRACKER) + (2 * sizeof(DWORD)) + +#endif /* MEM_TRACKER */ + sizeof(unsigned int) + + (POINTER_ALIGNMENT * ((size + POINTER_ALIGNMENT - 1) / POINTER_ALIGNMENT)); +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) + if ((((unsigned long) ptr - (unsigned long) static_memory_heap) + n_bytes_to_free) == (unsigned long) n_bytes_allocated) + { + n_bytes_allocated -= n_bytes_to_free; + } +#if defined(MEM_TRACKER) + else + { + n_bytes_not_recovered += n_bytes_to_free; + } +#endif /* MEM_TRACKER */ +#else /* USE_STATIC_MEMORY */ +#if defined(MEM_TRACKER) + n_bytes_allocated -= n_bytes_to_free; +#endif /* MEM_TRACKER */ + free(ptr); +#endif /* USE_STATIC_MEMORY */ + } +#if defined(MEM_TRACKER) + else + { + if (ptr != 0) + { + fprintf(stderr, "Error: attempt to free unallocated memory\n"); + } + } +#endif /* MEM_TRACKER */ +} + +#if PORT == WINDOWS || PORT == DOS +/************************************************************************ +* +* get_tick_count() -- Get system tick count in milliseconds +* +* for DOS, use BIOS function _bios_timeofday() +* for WINDOWS use GetTickCount() function +* for UNIX use clock() system function +*/ +DWORD get_tick_count(void) +{ + DWORD tick_count = 0L; + +#if PORT == WINDOWS + tick_count = GetTickCount(); +#elif PORT == DOS + _bios_timeofday(_TIME_GETCLOCK, (long *)&tick_count); + tick_count *= 55L; /* convert to milliseconds */ +#else + /* assume clock() function returns microseconds */ + tick_count = (DWORD) (clock() / 1000L); +#endif + + return (tick_count); +} +#endif + +#define DELAY_SAMPLES 10 +#define DELAY_CHECK_LOOPS 10000 + +void calibrate_delay(void) +{ +#if PORT == WINDOWS || PORT == DOS + int sample = 0; + int count = 0; + DWORD tick_count1 = 0L; + DWORD tick_count2 = 0L; +#endif + + one_ms_delay = 0L; + +#if PORT == WINDOWS || PORT == DOS + for (sample = 0; sample < DELAY_SAMPLES; ++sample) + { + count = 0; + tick_count1 = get_tick_count(); + while ((tick_count2 = get_tick_count()) == tick_count1) {}; + do { delay_loop(DELAY_CHECK_LOOPS); count++; } while + ((tick_count1 = get_tick_count()) == tick_count2); + one_ms_delay += ((DELAY_CHECK_LOOPS * (DWORD)count) / + (tick_count1 - tick_count2)); + } + + one_ms_delay /= DELAY_SAMPLES; +#else + /* This is system-dependent! Update this number for target system */ + one_ms_delay = 1000L; +#endif +} + +char *error_text[] = +{ +/* JBIC_SUCCESS 0 */ "success", +/* JBIC_OUT_OF_MEMORY 1 */ "out of memory", +/* JBIC_IO_ERROR 2 */ "file access error", +/* JAMC_SYNTAX_ERROR 3 */ "syntax error", +/* JBIC_UNEXPECTED_END 4 */ "unexpected end of file", +/* JBIC_UNDEFINED_SYMBOL 5 */ "undefined symbol", +/* JAMC_REDEFINED_SYMBOL 6 */ "redefined symbol", +/* JBIC_INTEGER_OVERFLOW 7 */ "integer overflow", +/* JBIC_DIVIDE_BY_ZERO 8 */ "divide by zero", +/* JBIC_CRC_ERROR 9 */ "CRC mismatch", +/* JBIC_INTERNAL_ERROR 10 */ "internal error", +/* JBIC_BOUNDS_ERROR 11 */ "bounds error", +/* JAMC_TYPE_MISMATCH 12 */ "type mismatch", +/* JAMC_ASSIGN_TO_CONST 13 */ "assignment to constant", +/* JAMC_NEXT_UNEXPECTED 14 */ "NEXT unexpected", +/* JAMC_POP_UNEXPECTED 15 */ "POP unexpected", +/* JAMC_RETURN_UNEXPECTED 16 */ "RETURN unexpected", +/* JAMC_ILLEGAL_SYMBOL 17 */ "illegal symbol name", +/* JBIC_VECTOR_MAP_FAILED 18 */ "vector signal name not found", +/* JBIC_USER_ABORT 19 */ "execution cancelled", +/* JBIC_STACK_OVERFLOW 20 */ "stack overflow", +/* JBIC_ILLEGAL_OPCODE 21 */ "illegal instruction code", +/* JAMC_PHASE_ERROR 22 */ "phase error", +/* JAMC_SCOPE_ERROR 23 */ "scope error", +/* JBIC_ACTION_NOT_FOUND 24 */ "action not found", +}; + +#define MAX_ERROR_CODE (int)(sizeof(error_text)/sizeof(error_text[0])) + +/************************************************************************/ + +#if 0 +int main(int argc, char **argv) +{ + BOOL help = FALSE; + BOOL error = FALSE; + char *filename = NULL; + long offset = 0L; + long error_address = 0L; + JBI_RETURN_TYPE crc_result = JBIC_SUCCESS; + JBI_RETURN_TYPE exec_result = JBIC_SUCCESS; + unsigned short expected_crc = 0; + unsigned short actual_crc = 0; + char key[33] = {0}; + char value[257] = {0}; + int exit_status = 0; + int arg = 0; + int exit_code = 0; + int format_version = 0; + time_t start_time = 0; + time_t end_time = 0; + int time_delta = 0; + char *workspace = NULL; + char *action = NULL; + char *init_list[10]; + int init_count = 0; + FILE *fp = NULL; + struct stat sbuf; + long workspace_size = 0; + char *exit_string = NULL; + int reset_jtag = 1; + int execute_program = 1; + int action_count = 0; + int procedure_count = 0; + int index = 0; + char *action_name = NULL; + char *description = NULL; + JBI_PROCINFO *procedure_list = NULL; + JBI_PROCINFO *procptr = NULL; + + verbose = FALSE; + + init_list[0] = NULL; + + /* print out the version string and copyright message */ + fprintf(stderr, "Jam STAPL ByteCode Player Version 2.2\nCopyright (C) 1998-2001 Altera Corporation\n\n"); + + for (arg = 1; arg < argc; arg++) + { +#if PORT == UNIX + if (argv[arg][0] == '-') +#else + if ((argv[arg][0] == '-') || (argv[arg][0] == '/')) +#endif + { + switch(toupper(argv[arg][1])) + { + case 'A': /* set action name */ + if (action == NULL) + { + action = &argv[arg][2]; + } + else + { + error = TRUE; + } + break; + +#if PORT == WINDOWS || PORT == DOS + case 'C': /* Use alternative ISP download cable */ + if(toupper(argv[arg][2]) == 'L') + alternative_cable_l = TRUE; + else if(toupper(argv[arg][2]) == 'X') + alternative_cable_x = TRUE; + break; +#endif + + case 'D': /* initialization list */ + if (argv[arg][2] == '"') + { + init_list[init_count] = &argv[arg][3]; + } + else + { + init_list[init_count] = &argv[arg][2]; + } + init_list[++init_count] = NULL; + break; + +#if PORT == WINDOWS || PORT == DOS + case 'P': /* set LPT port address */ + specified_lpt_port = TRUE; + if (sscanf(&argv[arg][2], "%d", &lpt_port) != 1) error = TRUE; + if ((lpt_port < 1) || (lpt_port > 3)) error = TRUE; + if (error) + { + if (sscanf(&argv[arg][2], "%x", &lpt_port) == 1) + { + if ((lpt_port == 0x3bc) || + (lpt_port == 0x378) || + (lpt_port == 0x278)) + { + error = FALSE; + specified_lpt_addr = TRUE; + lpt_addr = (WORD) lpt_port; + lpt_port = 1; + } + } + } + break; +#endif + + case 'R': /* don't reset the JTAG chain after use */ + reset_jtag = 0; + break; + + case 'S': /* set serial port address */ + serial_port_name = &argv[arg][2]; + specified_com_port = TRUE; + break; + + case 'M': /* set memory size */ + if (sscanf(&argv[arg][2], "%ld", &workspace_size) != 1) + error = TRUE; + if (workspace_size == 0) error = TRUE; + break; + + case 'H': /* help */ + help = TRUE; + break; + + case 'V': /* verbose */ + verbose = TRUE; + break; + + case 'I': /* show info only, do not execute */ + verbose = TRUE; + execute_program = 0; + break; + + default: + error = TRUE; + break; + } + } + else + { + /* it's a filename */ + if (filename == NULL) + { + filename = argv[arg]; + } + else + { + /* error -- we already found a filename */ + error = TRUE; + } + } + + if (error) + { + fprintf(stderr, "Illegal argument: \"%s\"\n", argv[arg]); + help = TRUE; + error = FALSE; + } + } + +#if PORT == WINDOWS || PORT == DOS + if (specified_lpt_port && specified_com_port) + { + fprintf(stderr, "Error: -s and -p options may not be used together\n\n"); + help = TRUE; + } +#endif + + if (help || (filename == NULL)) + { + fprintf(stderr, "Usage: jbi [options] \n"); + fprintf(stderr, "\nAvailable options:\n"); + fprintf(stderr, " -h : show help message\n"); + fprintf(stderr, " -v : show verbose messages\n"); + fprintf(stderr, " -i : show file info only - does not execute any action\n"); + fprintf(stderr, " -a : specify an action name (Jam STAPL)\n"); + fprintf(stderr, " -d : initialize variable to specified value (Jam 1.1)\n"); + fprintf(stderr, " -d : enable optional procedure (Jam STAPL)\n"); + fprintf(stderr, " -d : disable recommended procedure (Jam STAPL)\n"); +#if PORT == WINDOWS || PORT == DOS + fprintf(stderr, " -p : parallel port number or address (for ByteBlaster)\n"); + fprintf(stderr, " -c : alternative download cable compatibility: -cl or -cx\n"); +#endif + fprintf(stderr, " -s : serial port name (for BitBlaster)\n"); + fprintf(stderr, " -r : don't reset JTAG TAP after use\n"); + exit_status = 1; + } + else if ((workspace_size > 0) && + ((workspace = (char *) jbi_malloc((size_t) workspace_size)) == NULL)) + { + fprintf(stderr, "Error: can't allocate memory (%d Kbytes)\n", + (int) (workspace_size / 1024L)); + exit_status = 1; + } + else if (access(filename, 0) != 0) + { + fprintf(stderr, "Error: can't access file \"%s\"\n", filename); + exit_status = 1; + } + else + { + /* get length of file */ + if (stat(filename, &sbuf) == 0) file_length = sbuf.st_size; + + if ((fp = fopen(filename, "rb")) == NULL) + { + fprintf(stderr, "Error: can't open file \"%s\"\n", filename); + exit_status = 1; + } + else + { + /* + * Read entire file into a buffer + */ +#if PORT == DOS + int pages = 1 + (int) (file_length >> 14L); + int page; + file_buffer = (unsigned char **) jbi_malloc( + (size_t) (pages * sizeof(char *))); + + for (page = 0; page < pages; ++page) + { + /* allocate enough 16K blocks to store the file */ + file_buffer[page] = (unsigned char *) jbi_malloc (0x4000); + if (file_buffer[page] == NULL) + { + /* flag error and break out of loop */ + file_buffer = NULL; + page = pages; + } + } +#else + file_buffer = (unsigned char *) jbi_malloc((size_t) file_length); +#endif + + if (file_buffer == NULL) + { + fprintf(stderr, "Error: can't allocate memory (%d Kbytes)\n", + (int) (file_length / 1024L)); + exit_status = 1; + } + else + { +#if PORT == DOS + int pages = 1 + (int) (file_length >> 14L); + int page; + size_t page_size = 0x4000; + for (page = 0; (page < pages) && (exit_status == 0); ++page) + { + if (page == (pages - 1)) + { + /* last page may not be full 16K bytes */ + page_size = (size_t) (file_length & 0x3fffL); + } + if (fread(file_buffer[page], 1, page_size, fp) != page_size) + { + fprintf(stderr, "Error reading file \"%s\"\n", filename); + exit_status = 1; + } + } +#else + if (fread(file_buffer, 1, (size_t) file_length, fp) != + (size_t) file_length) + { + fprintf(stderr, "Error reading file \"%s\"\n", filename); + exit_status = 1; + } +#endif + } + + fclose(fp); + } + + if (exit_status == 0) + { + /* + * Get Operating System type + */ +#if PORT == WINDOWS + windows_nt = !(GetVersion() & 0x80000000); +#endif + + /* + * Calibrate the delay loop function + */ + calibrate_delay(); + + /* + * Check CRC + */ + crc_result = jbi_check_crc(file_buffer, file_length, + &expected_crc, &actual_crc); + + if (verbose || (crc_result == JBIC_CRC_ERROR)) + { + switch (crc_result) + { + case JBIC_SUCCESS: + printf("CRC matched: CRC value = %04X\n", actual_crc); + break; + + case JBIC_CRC_ERROR: + printf("CRC mismatch: expected %04X, actual %04X\n", + expected_crc, actual_crc); + break; + + case JBIC_UNEXPECTED_END: + printf("Expected CRC not found, actual CRC value = %04X\n", + actual_crc); + break; + + case JBIC_IO_ERROR: + printf("Error: File format is not recognized.\n"); + exit(1); + break; + + default: + printf("CRC function returned error code %d\n", crc_result); + break; + } + } + + if (verbose) + { + /* + * Display file format version + */ + jbi_get_file_info(file_buffer, file_length, + &format_version, &action_count, &procedure_count); + + printf("File format is %s ByteCode format\n", + (format_version == 2) ? "Jam STAPL" : "pre-standardized Jam 1.1"); + + /* + * Dump out NOTE fields + */ + while (jbi_get_note(file_buffer, file_length, + &offset, key, value, 256) == 0) + { + printf("NOTE \"%s\" = \"%s\"\n", key, value); + } + + /* + * Dump the action table + */ + if ((format_version == 2) && (action_count > 0)) + { + printf("\nActions available in this file:\n"); + + for (index = 0; index < action_count; ++index) + { + jbi_get_action_info(file_buffer, file_length, + index, &action_name, &description, &procedure_list); + + if (description == NULL) + { + printf("%s\n", action_name); + } + else + { + printf("%s \"%s\"\n", action_name, description); + } + +#if PORT == DOS + if (action_name != NULL) jbi_free(action_name); + if (description != NULL) jbi_free(description); +#endif + + procptr = procedure_list; + while (procptr != NULL) + { + if (procptr->attributes != 0) + { + printf(" %s (%s)\n", procptr->name, + (procptr->attributes == 1) ? + "optional" : "recommended"); + } + +#if PORT == DOS + if (procptr->name != NULL) jbi_free(procptr->name); +#endif + + procedure_list = procptr->next; + jbi_free(procptr); + procptr = procedure_list; + } + } + + /* add a blank line before execution messages */ + if (execute_program) printf("\n"); + } + } + + if (execute_program) + { + /* + * Execute the Jam STAPL ByteCode program + */ + time(&start_time); + exec_result = jbi_execute(file_buffer, file_length, workspace, + workspace_size, action, init_list, reset_jtag, + &error_address, &exit_code, &format_version); + time(&end_time); + + if (exec_result == JBIC_SUCCESS) + { + if (format_version == 2) + { + switch (exit_code) + { + case 0: exit_string = "Success"; break; + case 1: exit_string = "Checking chain failure"; break; + case 2: exit_string = "Reading IDCODE failure"; break; + case 3: exit_string = "Reading USERCODE failure"; break; + case 4: exit_string = "Reading UESCODE failure"; break; + case 5: exit_string = "Entering ISP failure"; break; + case 6: exit_string = "Unrecognized device"; break; + case 7: exit_string = "Device revision is not supported"; break; + case 8: exit_string = "Erase failure"; break; + case 9: exit_string = "Device is not blank"; break; + case 10: exit_string = "Device programming failure"; break; + case 11: exit_string = "Device verify failure"; break; + case 12: exit_string = "Read failure"; break; + case 13: exit_string = "Calculating checksum failure"; break; + case 14: exit_string = "Setting security bit failure"; break; + case 15: exit_string = "Querying security bit failure"; break; + case 16: exit_string = "Exiting ISP failure"; break; + case 17: exit_string = "Performing system test failure"; break; + default: exit_string = "Unknown exit code"; break; + } + } + else + { + switch (exit_code) + { + case 0: exit_string = "Success"; break; + case 1: exit_string = "Illegal initialization values"; break; + case 2: exit_string = "Unrecognized device"; break; + case 3: exit_string = "Device revision is not supported"; break; + case 4: exit_string = "Device programming failure"; break; + case 5: exit_string = "Device is not blank"; break; + case 6: exit_string = "Device verify failure"; break; + case 7: exit_string = "SRAM configuration failure"; break; + default: exit_string = "Unknown exit code"; break; + } + } + + printf("Exit code = %d... %s\n", exit_code, exit_string); + } + else if ((format_version == 2) && + (exec_result == JBIC_ACTION_NOT_FOUND)) + { + if ((action == NULL) || (*action == '\0')) + { + printf("Error: no action specified for Jam STAPL file.\nProgram terminated.\n"); + } + else + { + printf("Error: action \"%s\" is not supported for this Jam STAPL file.\nProgram terminated.\n", action); + } + } + else if (exec_result < MAX_ERROR_CODE) + { + printf("Error at address %ld: %s.\nProgram terminated.\n", + error_address, error_text[exec_result]); + } + else + { + printf("Unknown error code %ld\n", exec_result); + } + + /* + * Print out elapsed time + */ + if (verbose) + { + time_delta = (int) (end_time - start_time); + printf("Elapsed time = %02u:%02u:%02u\n", + time_delta / 3600, /* hours */ + (time_delta % 3600) / 60, /* minutes */ + time_delta % 60); /* seconds */ + } + } + } + } + + if (jtag_hardware_initialized) close_jtag_hardware(); + + if (workspace != NULL) jbi_free(workspace); + if (file_buffer != NULL) jbi_free(file_buffer); + +#if defined(MEM_TRACKER) + if (verbose) + { +#if defined(USE_STATIC_MEMORY) + fprintf(stdout, "Memory Usage Info: static memory size = %ud (%dKB)\n", N_STATIC_MEMORY_BYTES, N_STATIC_MEMORY_KBYTES); +#endif /* USE_STATIC_MEMORY */ + fprintf(stdout, "Memory Usage Info: peak memory usage = %ud (%dKB)\n", peak_memory_usage, (peak_memory_usage + 1023) / 1024); + fprintf(stdout, "Memory Usage Info: peak allocations = %d\n", peak_allocations); +#if defined(USE_STATIC_MEMORY) + if ((n_bytes_allocated - n_bytes_not_recovered) != 0) + { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", (n_bytes_allocated - n_bytes_not_recovered), ((n_bytes_allocated - n_bytes_not_recovered) + 1023) / 1024); + } +#else /* USE_STATIC_MEMORY */ + if (n_bytes_allocated != 0) + { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", n_bytes_allocated, (n_bytes_allocated + 1023) / 1024); + } +#endif /* USE_STATIC_MEMORY */ + if (n_allocations != 0) + { + fprintf(stdout, "Memory Usage Info: allocations not freed = %d\n", n_allocations); + } + } +#endif /* MEM_TRACKER */ + + return (exit_status); +} +#endif + +#if PORT==WINDOWS +#ifndef __BORLANDC__ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* SEARCH_DYN_DATA +* +* Searches recursively in Windows 95/98 Registry for parallel port info +* under HKEY_DYN_DATA registry key. Called by search_local_machine(). +*/ +void search_dyn_data +( + char *dd_path, + char *hardware_key, + int lpt +) +{ + DWORD index; + DWORD size; + DWORD type; + LONG result; + HKEY key; + int length; + WORD address; + char buffer[1024]; + FILETIME last_write = {0}; + WORD *word_ptr; + int i; + + length = strlen(dd_path); + + if (RegOpenKeyEx( + HKEY_DYN_DATA, + dd_path, + 0L, + KEY_READ, + &key) + == ERROR_SUCCESS) + { + size = 1023; + + if (RegQueryValueEx( + key, + "HardWareKey", + NULL, + &type, + (unsigned char *) buffer, + &size) + == ERROR_SUCCESS) + { + if ((type == REG_SZ) && (stricmp(buffer, hardware_key) == 0)) + { + size = 1023; + + if (RegQueryValueEx( + key, + "Allocation", + NULL, + &type, + (unsigned char *) buffer, + &size) + == ERROR_SUCCESS) + { + /* + * By "inspection", I have found five cases: size 32, 48, + * 56, 60, and 80 bytes. The port address seems to be + * located at different offsets in the buffer for these + * five cases, as shown below. If a valid port address + * is not found, or the size is not one of these known + * sizes, then I search through the entire buffer and + * look for a value which is a valid port address. + */ + + word_ptr = (WORD *) buffer; + + if ((type == REG_BINARY) && (size == 32)) + { + address = word_ptr[10]; + } + else if ((type == REG_BINARY) && (size == 48)) + { + address = word_ptr[18]; + } + else if ((type == REG_BINARY) && (size == 56)) + { + address = word_ptr[22]; + } + else if ((type == REG_BINARY) && (size == 60)) + { + address = word_ptr[24]; + } + else if ((type == REG_BINARY) && (size == 80)) + { + address = word_ptr[24]; + } + else address = 0; + + /* if not found, search through entire buffer */ + i = 0; + while ((i < (int) (size / 2)) && + (address != 0x278) && + (address != 0x27C) && + (address != 0x378) && + (address != 0x37C) && + (address != 0x3B8) && + (address != 0x3BC)) + { + if ((word_ptr[i] == 0x278) || + (word_ptr[i] == 0x27C) || + (word_ptr[i] == 0x378) || + (word_ptr[i] == 0x37C) || + (word_ptr[i] == 0x3B8) || + (word_ptr[i] == 0x3BC)) + { + address = word_ptr[i]; + } + ++i; + } + + if ((address == 0x278) || + (address == 0x27C) || + (address == 0x378) || + (address == 0x37C) || + (address == 0x3B8) || + (address == 0x3BC)) + { + lpt_addresses_from_registry[lpt] = address; + } + } + } + } + + index = 0; + + do + { + size = 1023; + + result = RegEnumKeyEx( + key, + index++, + buffer, + &size, + NULL, + NULL, + NULL, + &last_write); + + if (result == ERROR_SUCCESS) + { + dd_path[length] = '\\'; + dd_path[length + 1] = '\0'; + strcpy(&dd_path[length + 1], buffer); + + search_dyn_data(dd_path, hardware_key, lpt); + + dd_path[length] = '\0'; + } + } + while (result == ERROR_SUCCESS); + + RegCloseKey(key); + } +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* SEARCH_LOCAL_MACHINE +* +* Searches recursively in Windows 95/98 Registry for parallel port info +* under HKEY_LOCAL_MACHINE\Enum. When parallel port is found, calls +* search_dyn_data() to get the port address. +*/ +void search_local_machine +( + char *lm_path, + char *dd_path +) +{ + DWORD index; + DWORD size; + DWORD type; + LONG result; + HKEY key; + int length; + char buffer[1024]; + FILETIME last_write = {0}; + + length = strlen(lm_path); + + if (RegOpenKeyEx( + HKEY_LOCAL_MACHINE, + lm_path, + 0L, + KEY_READ, + &key) + == ERROR_SUCCESS) + { + size = 1023; + + if (RegQueryValueEx( + key, + "PortName", + NULL, + &type, + (unsigned char *) buffer, + &size) + == ERROR_SUCCESS) + { + if ((type == REG_SZ) && + (size == 5) && + (buffer[0] == 'L') && + (buffer[1] == 'P') && + (buffer[2] == 'T') && + (buffer[3] >= '1') && + (buffer[3] <= '4') && + (buffer[4] == '\0')) + { + /* we found the entry in HKEY_LOCAL_MACHINE, now we need to */ + /* find the corresponding entry under HKEY_DYN_DATA. */ + /* add 5 to lm_path to skip over "Enum" and backslash */ + search_dyn_data(dd_path, &lm_path[5], (buffer[3] - '1')); + } + } + + index = 0; + + do + { + size = 1023; + + result = RegEnumKeyEx( + key, + index++, + buffer, + &size, + NULL, + NULL, + NULL, + &last_write); + + if (result == ERROR_SUCCESS) + { + lm_path[length] = '\\'; + lm_path[length + 1] = '\0'; + strcpy(&lm_path[length + 1], buffer); + + search_local_machine(lm_path, dd_path); + + lm_path[length] = '\0'; + } + } + while (result == ERROR_SUCCESS); + + RegCloseKey(key); + } +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* GET_LPT_ADDRESSES_FROM_REGISTRY +* +* Searches Win95/98 registry recursively to get I/O port addresses for +* parallel ports. +*/ +void get_lpt_addresses_from_registry() +{ + char lm_path[1024]; + char dd_path[1024]; + + strcpy(lm_path, "Enum"); + strcpy(dd_path, "Config Manager"); + search_local_machine(lm_path, dd_path); +} +#endif +#endif + +void initialize_jtag_hardware() +{ + if (specified_com_port) + { + com_port = open(serial_port_name, O_RDWR); + if (com_port == -1) + { + fprintf(stderr, "Error: can't open serial port \"%s\"\n", + serial_port_name); + } + else + { + int i = 0, result = 0; + char data = 0; + + data = 0x7e; + write(com_port, &data, 1); + + for (i = 0; (i < 100) && (result != 1); ++i) + { + result = read(com_port, &data, 1); + } + + if (result == 1) + { + data = 0x70; write(com_port, &data, 1); /* TDO echo off */ + data = 0x72; write(com_port, &data, 1); /* auto LEDs off */ + data = 0x74; write(com_port, &data, 1); /* ERROR LED off */ + data = 0x76; write(com_port, &data, 1); /* DONE LED off */ + data = 0x60; write(com_port, &data, 1); /* signals low */ + } + else + { + fprintf(stderr, "Error: BitBlaster is not responding on %s\n", + serial_port_name); + close(com_port); + com_port = -1; + } + } + } + else + { +#if PORT == WINDOWS || PORT == DOS + +#if PORT == WINDOWS + if (windows_nt) + { + initialize_nt_driver(); + } + else + { +#ifdef __BORLANDC__ + fprintf(stderr, "Error: parallel port access is not available\n"); +#else + if (!specified_lpt_addr) + { + get_lpt_addresses_from_registry(); + + lpt_addr = 0; + + if (specified_lpt_port) + { + lpt_addr = lpt_addresses_from_registry[lpt_port - 1]; + } + + if (lpt_addr == 0) + { + if (lpt_addresses_from_registry[3] != 0) + lpt_addr = lpt_addresses_from_registry[3]; + if (lpt_addresses_from_registry[2] != 0) + lpt_addr = lpt_addresses_from_registry[2]; + if (lpt_addresses_from_registry[1] != 0) + lpt_addr = lpt_addresses_from_registry[1]; + if (lpt_addresses_from_registry[0] != 0) + lpt_addr = lpt_addresses_from_registry[0]; + } + + if (lpt_addr == 0) + { + if (specified_lpt_port) + { + lpt_addr = lpt_addr_table[lpt_port - 1]; + } + else + { + lpt_addr = lpt_addr_table[0]; + } + } + } + initial_lpt_ctrl = windows_nt ? 0x0c : read_byteblaster(2); +#endif + } +#endif + +#if PORT == DOS + /* + * Read word at specific memory address to get the LPT port address + */ + WORD *bios_address = (WORD *) 0x00400008; + + if (!specified_lpt_addr) + { + lpt_addr = bios_address[lpt_port - 1]; + + if ((lpt_addr != 0x278) && + (lpt_addr != 0x27c) && + (lpt_addr != 0x378) && + (lpt_addr != 0x37c) && + (lpt_addr != 0x3b8) && + (lpt_addr != 0x3bc)) + { + lpt_addr = lpt_addr_table[lpt_port - 1]; + } + } + initial_lpt_ctrl = read_byteblaster(2); +#endif + + /* set AUTO-FEED low to enable ByteBlaster (value to port inverted) */ + /* set DIRECTION low for data output from parallel port */ + write_byteblaster(2, (initial_lpt_ctrl | 0x02) & 0xDF); +#endif + } +} + +void close_jtag_hardware() +{ + if (specified_com_port) + { + if (com_port != -1) close(com_port); + } + else + { +#if PORT == WINDOWS || PORT == DOS + /* set AUTO-FEED high to disable ByteBlaster */ + write_byteblaster(2, initial_lpt_ctrl & 0xfd); + +#if PORT == WINDOWS + if (windows_nt && (nt_device_handle != INVALID_HANDLE_VALUE)) + { + if (port_io_count > 0) flush_ports(); + + CloseHandle(nt_device_handle); + } +#endif +#endif + } +} + +#if PORT == WINDOWS +/**************************************************************************/ +/* */ + +BOOL initialize_nt_driver() + +/* */ +/* Uses CreateFile() to open a connection to the Windows NT device */ +/* driver. */ +/* */ +/**************************************************************************/ +{ + BOOL status = FALSE; + + ULONG buffer[1]; + ULONG returned_length = 0; + char nt_lpt_str[] = { '\\', '\\', '.', '\\', + 'A', 'L', 'T', 'L', 'P', 'T', '1', '\0' }; + + nt_lpt_str[10] = (char) ('1' + (lpt_port - 1)); + + nt_device_handle = CreateFile( + nt_lpt_str, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (nt_device_handle == INVALID_HANDLE_VALUE) + { + fprintf(stderr, + "I/O error: cannot open device %s\nCheck port number and device driver installation", + nt_lpt_str); + } + else + { + if (DeviceIoControl( + nt_device_handle, /* Handle to device */ + PGDC_IOCTL_GET_DEVICE_INFO_PP, /* IO Control code */ + (ULONG *)NULL, /* Buffer to driver. */ + 0, /* Length of buffer in bytes. */ + &buffer, /* Buffer from driver. */ + sizeof(ULONG), /* Length of buffer in bytes. */ + &returned_length, /* Bytes placed in data_buffer. */ + NULL)) /* Wait for operation to complete */ + { + if (returned_length == sizeof(ULONG)) + { + if (buffer[0] == PGDC_HDLC_NTDRIVER_VERSION) + { + status = TRUE; + } + else + { + fprintf(stderr, + "I/O error: device driver %s is not compatible\n(Driver version is %lu, expected version %lu.\n", + nt_lpt_str, + (unsigned long) buffer[0], + (unsigned long) PGDC_HDLC_NTDRIVER_VERSION); + } + } + else + { + fprintf(stderr, "I/O error: device driver %s is not compatible.\n", + nt_lpt_str); + } + } + + if (!status) + { + CloseHandle(nt_device_handle); + nt_device_handle = INVALID_HANDLE_VALUE; + } + } + + if (!status) + { + /* error message already given */ + exit(1); + } + + return (status); +} +#endif + +#if PORT == WINDOWS || PORT == DOS +/**************************************************************************/ +/* */ + +void write_byteblaster +( + int port, + int data +) + +/* */ +/**************************************************************************/ +{ +#if PORT == WINDOWS + BOOL status = FALSE; + + int returned_length = 0; + int buffer[2]; + + if (windows_nt) + { + /* + * On Windows NT, access hardware through device driver + */ + if (port == 0) + { + port_io_buffer[port_io_count].data = (USHORT) data; + port_io_buffer[port_io_count].command = PGDC_WRITE_PORT; + ++port_io_count; + + if (port_io_count >= PORT_IO_BUFFER_SIZE) flush_ports(); + } + else + { + if (port_io_count > 0) flush_ports(); + + buffer[0] = port; + buffer[1] = data; + + status = DeviceIoControl( + nt_device_handle, /* Handle to device */ + PGDC_IOCTL_WRITE_PORT_PP, /* IO Control code for write */ + (ULONG *)&buffer, /* Buffer to driver. */ + 2 * sizeof(int), /* Length of buffer in bytes. */ + (ULONG *)NULL, /* Buffer from driver. Not used. */ + 0, /* Length of buffer in bytes. */ + (ULONG *)&returned_length, /* Bytes returned. Should be zero. */ + NULL); /* Wait for operation to complete */ + + if ((!status) || (returned_length != 0)) + { + fprintf(stderr, "I/O error: Cannot access ByteBlaster hardware\n"); + CloseHandle(nt_device_handle); + exit(1); + } + } + } + else +#endif + { + /* + * On Windows 95, access hardware directly + */ + outp((WORD)(port + lpt_addr), (WORD)data); + } +} + +/**************************************************************************/ +/* */ + +int read_byteblaster +( + int port +) + +/* */ +/**************************************************************************/ +{ + int data = 0; + +#if PORT == WINDOWS + + BOOL status = FALSE; + + int returned_length = 0; + + if (windows_nt) + { + /* flush output cache buffer before reading from device */ + if (port_io_count > 0) flush_ports(); + + /* + * On Windows NT, access hardware through device driver + */ + status = DeviceIoControl( + nt_device_handle, /* Handle to device */ + PGDC_IOCTL_READ_PORT_PP, /* IO Control code for Read */ + (ULONG *)&port, /* Buffer to driver. */ + sizeof(int), /* Length of buffer in bytes. */ + (ULONG *)&data, /* Buffer from driver. */ + sizeof(int), /* Length of buffer in bytes. */ + (ULONG *)&returned_length, /* Bytes placed in data_buffer. */ + NULL); /* Wait for operation to complete */ + + if ((!status) || (returned_length != sizeof(int))) + { + fprintf(stderr, "I/O error: Cannot access ByteBlaster hardware\n"); + CloseHandle(nt_device_handle); + exit(1); + } + } + else +#endif + { + /* + * On Windows 95, access hardware directly + */ + data = inp((WORD)(port + lpt_addr)); + } + + return (data & 0xff); +} + +#if PORT == WINDOWS +void flush_ports(void) +{ + ULONG n_writes = 0L; + BOOL status; + + status = DeviceIoControl( + nt_device_handle, /* handle to device */ + PGDC_IOCTL_PROCESS_LIST_PP, /* IO control code */ + (LPVOID)port_io_buffer, /* IN buffer (list buffer) */ + port_io_count * sizeof(struct PORT_IO_LIST_STRUCT),/* length of IN buffer in bytes */ + (LPVOID)port_io_buffer, /* OUT buffer (list buffer) */ + port_io_count * sizeof(struct PORT_IO_LIST_STRUCT),/* length of OUT buffer in bytes */ + &n_writes, /* number of writes performed */ + 0); /* wait for operation to complete */ + + if ((!status) || ((port_io_count * sizeof(struct PORT_IO_LIST_STRUCT)) != n_writes)) + { + fprintf(stderr, "I/O error: Cannot access ByteBlaster hardware\n"); + CloseHandle(nt_device_handle); + exit(1); + } + + port_io_count = 0; +} +#endif /* PORT == WINDOWS */ +#endif /* PORT == WINDOWS || PORT == DOS */ + +#if 0 +#if !defined (DEBUG) +#pragma optimize ("ceglt", off) +#endif +#endif + +void delay_loop(long count) +{ + while (count != 0L) count--; +} + +#if PORT == EMBEDDED + +static void jbi_init_mm(void) +{ +#if defined(USE_STATIC_MEMORY) + int i; +#endif /* USE_STATIC_MEMORY */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + n_bytes_allocated = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + peak_memory_usage = 0; + peak_allocations = 0; + n_allocations = 0; +#if defined(USE_STATIC_MEMORY) + n_bytes_not_recovered = 0; +#endif /* USE_STATIC_MEMORY */ +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) + jbi_dbg(DEBUG_DETAIL, "static_memory_heap: 0x%p(0x%x)\n", + static_memory_heap, N_STATIC_MEMORY_BYTES); + for (i = 0; i < N_STATIC_MEMORY_BYTES; i++) { + static_memory_heap[i] = 0; + } +#endif /* USE_STATIC_MEMORY */ + + jbi_delay_us = 0; + jbi_delay_count = 0; + jbi_peak_us = 0; +} + +static void jbi_exit_mm(void) +{ +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + jbi_dbg(DEBUG_DETAIL, "n_bytes_allocated: %u\n", n_bytes_allocated); + n_bytes_allocated = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + jbi_dbg(DEBUG_DETAIL, "peak_memory_usage: %u\n", peak_memory_usage); + jbi_dbg(DEBUG_DETAIL, "peak_allocations: %u\n", peak_allocations); + jbi_dbg(DEBUG_DETAIL, "n_allocations: %u\n", n_allocations); + peak_memory_usage = 0; + peak_allocations = 0; + n_allocations = 0; +#if defined(USE_STATIC_MEMORY) + jbi_dbg(DEBUG_DETAIL, "n_bytes_not_recovered: %u\n", n_bytes_not_recovered); + n_bytes_not_recovered = 0; +#endif /* USE_STATIC_MEMORY */ +#endif /* MEM_TRACKER */ + + jbi_dbg(DEBUG_DETAIL, "jbi_delay: %ld us, %ld count, peak %ld us\n", + jbi_delay_us, jbi_delay_count, jbi_peak_us); +} + +static char *get_exit_string(int format_version, int exit_code) +{ + char *exit_string = NULL; + + if (format_version == 2){ + switch (exit_code) { + case 0: + exit_string = "Success"; + break; + case 1: + exit_string = "Checking chain failure"; + break; + case 2: + exit_string = "Reading IDCODE failure"; + break; + case 3: + exit_string = "Reading USERCODE failure"; + break; + case 4: + exit_string = "Reading UESCODE failure"; + break; + case 5: + exit_string = "Entering ISP failure"; + break; + case 6: + exit_string = "Unrecognized device"; + break; + case 7: + exit_string = "Device revision is not supported"; + break; + case 8: + exit_string = "Erase failure"; + break; + case 9: + exit_string = "Device is not blank"; + break; + case 10: + exit_string = "Device programming failure"; + break; + case 11: + exit_string = "Device verify failure"; + break; + case 12: + exit_string = "Read failure"; break; + case 13: + exit_string = "Calculating checksum failure"; + break; + case 14: + exit_string = "Setting security bit failure"; + break; + case 15: + exit_string = "Querying security bit failure"; + break; + case 16: + exit_string = "Exiting ISP failure"; + break; + case 17: + exit_string = "Performing system test failure"; + break; + default: + exit_string = "Unknown exit code"; + break; + } + } else { + switch (exit_code) { + case 0: + exit_string = "Success"; + break; + case 1: + exit_string = "Illegal initialization values"; + break; + case 2: + exit_string = "Unrecognized device"; + break; + case 3: + exit_string = "Device revision is not supported"; + break; + case 4: + exit_string = "Device programming failure"; + break; + case 5: + exit_string = "Device is not blank"; + break; + case 6: + exit_string = "Device verify failure"; + break; + case 7: + exit_string = "SRAM configuration failure"; + break; + default: + exit_string = "Unknown exit code"; + break; + } + } + + return exit_string; +} + +static void jbi_help(void) +{ + fprintf(stderr, "Usage: jbi [options]\n"); + fprintf(stderr, "\nAvailable options:\n"); + fprintf(stderr, " -h : show help message\n"); + fprintf(stderr, " -v : show verbose messages\n"); + fprintf(stderr, " -i : show file info only - does not execute any action\n"); + fprintf(stderr, " -a : specify an action name (Jam STAPL)\n"); + fprintf(stderr, " -d : initialize variable to specified value (Jam 1.1)\n"); + fprintf(stderr, " -d : enable optional procedure (Jam STAPL)\n"); + fprintf(stderr, " -d : disable recommended procedure (Jam STAPL)\n"); + fprintf(stderr, " -r : don't reset JTAG TAP after use\n"); +} + +int jbi_debug(int level) +{ + jbi_debug_level = level; + + return 0; +} + +int jbi_main(unsigned char *addr, unsigned long size, int argc, char * const argv[]) +{ + BOOL help = FALSE; + BOOL error = FALSE; + long offset = 0L; + long error_address = 0L; + JBI_RETURN_TYPE crc_result = JBIC_SUCCESS; + JBI_RETURN_TYPE exec_result = JBIC_SUCCESS; + unsigned short expected_crc = 0; + unsigned short actual_crc = 0; + char key[33] = {0}; + char value[257] = {0}; + int exit_status = 0; + int arg = 0; + int exit_code = 0; + int format_version = 0; + char *workspace = NULL; + char *action = NULL; + char *init_list[10]; + int init_count = 0; + long workspace_size = 0; + char *exit_string = NULL; + int reset_jtag = 1; + int execute_program = 1; + int action_count = 0; + int procedure_count = 0; + int index = 0; + char *action_name = NULL; + char *description = NULL; + JBI_PROCINFO *procedure_list = NULL; + JBI_PROCINFO *procptr = NULL; + char *endp = NULL; + + verbose = FALSE; + + init_list[0] = NULL; + + /* print out the version string and copyright message */ + printf("Jam STAPL ByteCode Player Version 2.2\n"); + printf("Copyright (C) 1998-2001 Altera Corporation\n\n"); + + for (arg = 0; arg < argc; arg++) { + if (argv[arg][0] == '-') { + switch (toupper(argv[arg][1])) { + case 'A': /* set action name */ + if (action == NULL) { + action = &argv[arg][2]; + } else { + error = TRUE; + } + break; + case 'D': /* initialization list */ + if (argv[arg][2] == '"') { + init_list[init_count] = &argv[arg][3]; + } else { + init_list[init_count] = &argv[arg][2]; + } + init_list[++init_count] = NULL; + break; + case 'R': /* don't reset the JTAG chain after use */ + reset_jtag = 0; + break; + case 'M': /* set memory size */ + workspace = (char *) simple_strtoul(&argv[arg][2], &endp, 16); + if (workspace == NULL) { + printf("Error workspace\n"); + error = TRUE; + } else { + if (*endp == '.') { + workspace_size = simple_strtoul(endp + 1, &endp, 16); + if (*endp != '\0') { + printf("Error workspace size end\n"); + error = TRUE; + } + } else { + printf("No workspace size\n"); + error = TRUE; + } + } + break; + case 'H': /* help */ + help = TRUE; + break; + case 'V': /* verbose */ + verbose = TRUE; + break; + case 'I': /* show info only, do not execute */ + verbose = TRUE; + execute_program = 0; + break; + default: + error = TRUE; + break; + } + } else { + error = TRUE; + } + + if (error) { + fprintf(stderr, "Illegal argument: \"%s\"\n", argv[arg]); + help = TRUE; + error = FALSE; + } + } + + if (help) { + jbi_help(); + return 0; + } + + /* Calibrate the delay loop function */ + calibrate_delay(); + + jbi_init_mm(); + + /* Check CRC */ + crc_result = jbi_check_crc(addr, size, &expected_crc, &actual_crc); + if (verbose || (crc_result == JBIC_CRC_ERROR)) { + switch (crc_result) { + case JBIC_SUCCESS: + printf("CRC matched: CRC value = %04X\n", actual_crc); + break; + case JBIC_CRC_ERROR: + printf("CRC mismatch: expected %04X, actual %04X\n", expected_crc, actual_crc); + return -1; + case JBIC_UNEXPECTED_END: + printf("Expected CRC not found, actual CRC value = %04X\n", actual_crc); + return -1; + case JBIC_IO_ERROR: + printf("Error: File format is not recognized.\n"); + return -1; + default: + printf("CRC function returned error code %d\n", crc_result); + return -1; + } + } + + if (verbose) { + /* Display file format version */ + jbi_get_file_info(addr, size, &format_version, + &action_count, &procedure_count); + + printf("File format is %s ByteCode format\n", + (format_version == 2) ? "Jam STAPL" : "pre-standardized Jam 1.1"); + + /* Dump out NOTE fields */ + while (jbi_get_note(addr, size, &offset, key, value, 256) == 0) { + printf("NOTE \"%s\" = \"%s\"\n", key, value); + } + + /* Dump the action table */ + if ((format_version == 2) && (action_count > 0)) { + printf("\nActions available in this file:\n"); + + for (index = 0; index < action_count; ++index) { + jbi_get_action_info(addr, size, + index, &action_name, &description, &procedure_list); + + if (description == NULL) { + printf("%s\n", action_name); + } else { + printf("%s \"%s\"\n", action_name, description); + } + + procptr = procedure_list; + while (procptr != NULL) { + if (procptr->attributes != 0) { + printf(" %s (%s)\n", procptr->name, + (procptr->attributes == 1) ? "optional" : "recommended"); + } + + procedure_list = procptr->next; + jbi_free(procptr); + procptr = procedure_list; + } + } + + /* add a blank line before execution messages */ + if (execute_program) + printf("\n"); + } + } + + if (execute_program) { + /* Execute the Jam STAPL ByteCode program */ + exec_result = jbi_execute(addr, size, workspace, + workspace_size, action, init_list, reset_jtag, + &error_address, &exit_code, &format_version); + if (exec_result == JBIC_SUCCESS) { + exit_string = get_exit_string(format_version, exit_code); + printf("Exit code = %d... %s\n", exit_code, exit_string); + } else if ((format_version == 2) && (exec_result == JBIC_ACTION_NOT_FOUND)) { + if ((action == NULL) || (*action == '\0')) { + printf("Error: no action specified for Jam STAPL file.\n" + "Program terminated.\n"); + } else { + printf("Error: action \"%s\" is not supported for this Jam STAPL file.\n" + "Program terminated.\n", action); + } + } else if (exec_result < MAX_ERROR_CODE) { + printf("Error at address %ld: %s.\nProgram terminated.\n", + error_address, error_text[exec_result]); + } else { + printf("Unknown error code %d\n", exec_result); + } + } + + if (jtag_hardware_initialized) { + close_jtag_hardware(); + jtag_hardware_initialized = FALSE; + } + +#if defined(MEM_TRACKER) + if (verbose) { +#if defined(USE_STATIC_MEMORY) + fprintf(stdout, "Memory Usage Info: static memory size = %uBytes (%dKB)\n", + N_STATIC_MEMORY_BYTES, N_STATIC_MEMORY_KBYTES); +#endif /* USE_STATIC_MEMORY */ + fprintf(stdout, "Memory Usage Info: peak memory usage = %uBytes (%dKB)\n", + peak_memory_usage, (peak_memory_usage + 1023) / 1024); + fprintf(stdout, "Memory Usage Info: peak allocations = %u\n", + peak_allocations); +#if defined(USE_STATIC_MEMORY) + if ((n_bytes_allocated - n_bytes_not_recovered) != 0) { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", + (n_bytes_allocated - n_bytes_not_recovered), + ((n_bytes_allocated - n_bytes_not_recovered) + 1023) / 1024); + } +#else /* USE_STATIC_MEMORY */ + if (n_bytes_allocated != 0) { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", + n_bytes_allocated, (n_bytes_allocated + 1023) / 1024); + } +#endif /* USE_STATIC_MEMORY */ + if (n_allocations != 0) { + fprintf(stdout, "Memory Usage Info: allocations not freed = %d\n", n_allocations); + } + } +#endif /* MEM_TRACKER */ + + jbi_exit_mm(); + + if (exec_result != JBIC_SUCCESS) { + return (-exec_result); + } + + if (exit_code != 0) { + return (exit_code); + } + + return (exit_status); +} + +#endif /* PORT == EMBEDDED */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h new file mode 100644 index 000000000000..5e5c5332f385 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h @@ -0,0 +1,95 @@ +#ifndef __JBISTUB_H__ +#define __JBISTUB_H__ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_64BIT +typedef s64 addr_t; +#else +typedef s32 addr_t; +#endif +/* typedef long addr_t; */ + +/* #define USE_STATIC_MEMORY 100 */ +/* #define MEM_TRACKER */ + +/* #define O_RDWR 1 */ + +#define stdout (1) +#define stderr (2) + +#define puts printk +#define printf printk + +#define fprintf(std, fmt, arg...) \ + do { \ + printf(fmt, ##arg); \ + } while (0) + +#define DEBUG_NONE 0 +#define DEBUG_ERR 1 +#define DEBUG_DETAIL 2 +#define DEBUG_NOISY 3 +#define DEBUG_MM 4 + +#define jbi_dbg(level, fmt, arg...) \ + do { \ + if (level <= jbi_debug_level) { \ + printf(fmt, ##arg); \ + } \ + } while (0) + +extern int jbi_debug_level; + +static inline int open(char *path, int flag) +{ + return 0; +} + +static inline int close(int fd) +{ + return 0; +} + +static inline int read(int fd, char *buf, int count) +{ + return 0; +} + +static inline int write(int fd, char *buf, int count) +{ + return 0; +} + +static inline int fflush(int fd) +{ + return 0; +} + +static inline int clock(void) +{ + return 0; +} + +static inline int atoi(const char *nptr) +{ + return (int) simple_strtol(nptr, (char **) NULL, 10); +} + +static inline void *malloc(size_t size) +{ + return kmalloc(size, GFP_KERNEL); +} + +static inline void free(void *ptr) +{ + kfree(ptr); +} + +#endif /* __JBISTUB_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile new file mode 100644 index 000000000000..caad44948030 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile @@ -0,0 +1,22 @@ +#include $(top_srcdir)/debian/rules +#KERNELDIR := ${KBUILD_OUTPUT} + +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../include) +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) +EXTRA_CFLAGS+= -Wall + +firmware_driver_ispvme-objs := firmware_ispvme.o +firmware_driver_ispvme-objs += firmware_cpld_ispvme.o firmware_cpld_upgrade_ispvme.o + +#ifndef CONFIG_FRM_PRODUCT_FILE + +$(warning $(firmware_driver_ispvme-objs)) +obj-m := firmware_driver_ispvme.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(common_module_dir) ]; then mkdir -p $(common_module_dir) ;fi + cp -p $(PWD)/*.ko $(common_module_dir) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c new file mode 100644 index 000000000000..9841782290c1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c @@ -0,0 +1,450 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_cpld_open(struct inode *inode, struct file *file) +{ + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Open cpld device.\n"); + frm_dev = firmware_get_device_by_minor(MINOR(inode->i_rdev)); + if (frm_dev == NULL) { + return -ENXIO; + } + file->private_data = frm_dev; + + return FIRMWARE_SUCCESS; +} + +static ssize_t firmware_cpld_read (struct file *file, char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static ssize_t firmware_cpld_write (struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static loff_t firmware_cpld_llseek(struct file *file, loff_t offset, int origin) +{ + return 0; +} + +/* + * firmware_cpld_ioctl + * function: ispvme driver ioctl command parsing function + * @file: param[in] device file name + * @cmd: param[in] command + * @arg: param[in] the parameters in the command + * return value: success-FIRMWARE_SUCCESS; fail:other value + */ +static long firmware_cpld_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret; + void __user *argp; + firmware_device_t *frm_dev; + firmware_cpld_t *cpld_info; + char value; + + /* Get device private data */ + frm_dev = (firmware_device_t *)file->private_data; + cpld_info = NULL; + if (frm_dev != NULL) { + if (frm_dev->priv != NULL) { + cpld_info = (firmware_cpld_t *)frm_dev->priv; + } + } + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to frm_dev->priv sysfs info.\n"); + return FIRMWARE_FAILED; + } + argp = (void __user *)arg; + + switch (cmd) { + case FIRMWARE_JTAG_TDI: + /* Set the TDI signal */ + if (copy_from_user(&value, argp, sizeof(value))) { + return -EFAULT; + } + if (fwm_cpld_tdi_op(value) < 0 ) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_TCK: + /* Set the TCK signal */ + if (copy_from_user(&value, argp, sizeof(value))) { + return -EFAULT; + } + if (fwm_cpld_tck_op(value) < 0) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_TMS: + /* Set the TMS signal */ + if (copy_from_user(&value, argp, sizeof(value))) { + return -EFAULT; + } + if (fwm_cpld_tms_op(value) < 0) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_TDO: + /* Read the TDO signal */ + value = fwm_cpld_tdo_op(); + if (copy_to_user(argp, &value, sizeof(value))) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_INIT: + /* The VME upgrade mode initializes the operation */ + ret=firmware_init_vme(cpld_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to init upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + case FIRMWARE_JTAG_FINISH: + /* The VME upgrade mode completes the operation */ + ret=firmware_finish_vme(cpld_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to release upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("not find cmd: %d\r\n", cmd); + return -ENOTTY; + } /* End of switch */ + + return FIRMWARE_SUCCESS; +} + +static int firmware_cpld_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static const struct file_operations cpld_dev_fops = { + .owner = THIS_MODULE, + .llseek = firmware_cpld_llseek, + .read = firmware_cpld_read, + .write = firmware_cpld_write, + .unlocked_ioctl = firmware_cpld_ioctl, + .open = firmware_cpld_open, + .release = firmware_cpld_release, +}; + +static int of_firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int ret; + char *name; + int i; + char buf[64]; + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + ret = 0; + ret += of_property_read_string(dev->of_node, "type", (const char **)&name); + ret += of_property_read_u32(dev->of_node, "tdi", &cpld_info->tdi); + ret += of_property_read_u32(dev->of_node, "tck", &cpld_info->tck); + ret += of_property_read_u32(dev->of_node, "tms", &cpld_info->tms); + ret += of_property_read_u32(dev->of_node, "tdo", &cpld_info->tdo); + + ret += of_property_read_u32(dev->of_node, "chain", &cpld_info->chain); + ret += of_property_read_u32(dev->of_node, "chip_index", &cpld_info->chip_index); + + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config error, ret:%d.\n", ret); + return -ENXIO; + } + + strncpy(cpld_info->type, name, sizeof(cpld_info->type) - 1); + + ret = of_property_read_u32(dev->of_node, "tck_delay", &cpld_info->tck_delay); + if(ret != 0) { + cpld_info->tck_delay = 60; + } + + cpld_info->gpio_en_info_num = 0; + /* Enable through GPIO */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_gpio_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_gpio); + if(ret != 0) { + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_level_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_level); + if(ret != 0) { + break; + } + cpld_info->gpio_en_info_num++; + } + + cpld_info->logic_dev_en_num = 0; + /* Enable through register */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + firmware_logic_dev_en_point = &cpld_info->logic_dev_en_info[i]; + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dev_%d", i); + ret = 0; + ret += of_property_read_string(dev->of_node, buf, (const char **)&name); + if(ret != 0) { + /* Failure to resolve to EN_LOGIC_DEV means no logical device is enabled. No failure is returned */ + ret = 0; + break; + } + strncpy(firmware_logic_dev_en_point->dev_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_addr_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->addr); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_addr_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_mask_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->mask); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_mask_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_en_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->en_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_en_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dis_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->dis_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_dis_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_width_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->width); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_width_%d ret =%d.\n", i, ret); + break; + } + + cpld_info->logic_dev_en_num++; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, gpio_en_info_num:%u logic_dev_en_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num, cpld_info->logic_dev_en_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int i; + + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + firmware_upgrade_device_t *firmware_upgrade_device; + firmware_jtag_device_t jtag_upg_device; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + if (dev->platform_data == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("platform data config error.\n"); + return -1; + } + firmware_upgrade_device = dev->platform_data; + jtag_upg_device = firmware_upgrade_device->upg_type.jtag; + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + strncpy(cpld_info->type, firmware_upgrade_device->type, sizeof(cpld_info->type) - 1); + cpld_info->tdi = jtag_upg_device.tdi; + cpld_info->tck = jtag_upg_device.tck; + cpld_info->tms = jtag_upg_device.tms; + cpld_info->tdo = jtag_upg_device.tdo; + cpld_info->chain = firmware_upgrade_device->chain; + cpld_info->chip_index = firmware_upgrade_device->chip_index; + + if (jtag_upg_device.tck_delay == 0) { + cpld_info->tck_delay = 60; + FIRMWARE_DRIVER_DEBUG_VERBOSE("no config tck_delay, use default value:%u\n", cpld_info->tck_delay); + } else { + cpld_info->tck_delay = jtag_upg_device.tck_delay; + } + + if (firmware_upgrade_device->en_gpio_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_gpio_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_gpio_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + cpld_info->gpio_en_info_num = firmware_upgrade_device->en_gpio_num; + /* Enable through GPIO */ + for (i = 0; i < cpld_info->gpio_en_info_num; i++) { + cpld_info->gpio_en_info[i].en_gpio = firmware_upgrade_device->en_gpio[i]; + cpld_info->gpio_en_info[i].en_level = firmware_upgrade_device->en_level[i]; + } + + if (firmware_upgrade_device->en_logic_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_logic_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_logic_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + cpld_info->logic_dev_en_num = firmware_upgrade_device->en_logic_num; + /* Enable through register */ + for (i = 0; i < cpld_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_point = &cpld_info->logic_dev_en_info[i]; + strncpy(firmware_logic_dev_en_point->dev_name, firmware_upgrade_device->en_logic_dev[i], + FIRMWARE_DEV_NAME_LEN - 1); + firmware_logic_dev_en_point->addr = firmware_upgrade_device->en_logic_addr[i]; + firmware_logic_dev_en_point->mask = firmware_upgrade_device->en_logic_mask[i]; + firmware_logic_dev_en_point->en_val = firmware_upgrade_device->en_logic_en_val[i]; + firmware_logic_dev_en_point->dis_val = firmware_upgrade_device->en_logic_dis_val[i]; + firmware_logic_dev_en_point->width = firmware_upgrade_device->en_logic_width[i]; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, gpio_en_info_num:%u logic_dev_en_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num, cpld_info->logic_dev_en_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_cpld_probe(struct platform_device *pdev) +{ + int ret; + firmware_cpld_t *cpld_info; + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_cpld_probe\r\n"); + /* Gets the information in the device tree */ + cpld_info = devm_kzalloc(&pdev->dev, sizeof(firmware_cpld_t), GFP_KERNEL); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc cpld device tree.\n"); + return -EPERM; + } + + if (pdev->dev.of_node) { + ret = of_firmware_upgrade_config_init(&pdev->dev, cpld_info); + } else { + ret = firmware_upgrade_config_init(&pdev->dev, cpld_info); + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("get config init from dts error.\n"); + return -EPERM; + } + + frm_dev = devm_kzalloc(&pdev->dev, sizeof(firmware_device_t), GFP_KERNEL); + if (frm_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc firmware device.\n"); + return -EPERM; + } + + /* Based on the link number, determine the name of the device file */ + frm_dev->chain = cpld_info->chain; + snprintf(frm_dev->name, FIRMWARE_NAME_LEN - 1, "firmware_cpld_ispvme%d", frm_dev->chain); + strncpy(cpld_info->devname, frm_dev->name, strlen(frm_dev->name) + 1); + + INIT_LIST_HEAD(&frm_dev->list); + frm_dev->dev.minor = MISC_DYNAMIC_MINOR; + frm_dev->dev.name = frm_dev->name; + frm_dev->dev.fops = &cpld_dev_fops; + frm_dev->priv = cpld_info; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Register cpld firmware chain:%d, name:%s.\n", frm_dev->chain, frm_dev->name); + + ret = firmware_device_register(frm_dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to register firmware device.\n"); + return -EPERM; + } + + platform_set_drvdata(pdev, frm_dev); + return 0; +} + +static int __exit firmware_cpld_remove(struct platform_device *pdev) +{ + firmware_device_t *frm_dev; + + frm_dev = (firmware_device_t *)platform_get_drvdata(pdev); + firmware_device_unregister(frm_dev); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct of_device_id cpld_match[] = { + { + .compatible = "firmware_cpld_ispvme", + }, + {}, +}; + +static struct platform_driver cpld_driver = { + .driver = { + .name = "firmware_cpld_ispvme", + .owner = THIS_MODULE, + .of_match_table = cpld_match, + }, + .probe = firmware_cpld_probe, + .remove = firmware_cpld_remove, +}; + +static firmware_driver_t fmw_drv_cpld = { + .name = "firmware_cpld_ispvme", + .drv = &cpld_driver, +}; + +int firmware_cpld_init(void) +{ + int ret; + + INIT_LIST_HEAD(&fmw_drv_cpld.list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("ispvme upgrade driver register \n"); + ret = firmware_driver_register(&fmw_drv_cpld); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("ispvme upgrade driver register failed\n"); + return ret; + } + return 0; +} + +void firmware_cpld_exit(void) +{ + firmware_driver_unregister(&fmw_drv_cpld); + INIT_LIST_HEAD(&fmw_drv_cpld.list); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c new file mode 100644 index 000000000000..b8896ed75f38 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c @@ -0,0 +1,691 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* TCK clock MAX 16MHz */ +#define TCK_DELAY (current_fmw_cpld->tck_delay) + +#if 0 +static firmware_cpld_t default_fmw_cpld; +#endif + +static firmware_cpld_t *current_fmw_cpld; + +static int TDI_PULL_UP(void); +static int TDI_PULL_DOWN(void); +static int TMS_PULL_UP(void); +static int TMS_PULL_DOWN(void); +static int TCK_PULL_UP(void); +static int TCK_PULL_DOWN(void); + +/* + * set_currrent_cpld_info + * function: Save the current device information + * @info: param[in] Information about the device to be updated + */ +static void set_currrent_cpld_info(firmware_cpld_t *info) +{ + current_fmw_cpld = info; +} + +static int firmware_file_read(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_read(filp, val, size, &pos); + if (ret != size) { + FIRMWARE_DRIVER_DEBUG_ERROR("read kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int firmware_file_write(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_write(filp, (void*)val, size, &pos); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("write kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +/* + * firmware_file_do_work + * function: Sets logical register values + * @path:param[in] Logic device descriptor + * @addr:param[in] Logic device address + * @value:param[in] the register value needs to be set + * @mask:param[in] register mask + * @width:param[in] register bit width + * return: 0:success, <0:failed + */ +static int firmware_file_do_work(char *path, uint32_t addr, uint32_t value, uint32_t mask, + int32_t width) +{ + int ret; + uint8_t read_value[4], write_value[4]; + uint8_t tmp_read8, tmp_write8, tmp_mask8; + uint32_t tmp_read32, tmp_write32; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("path=%s, addr=0x%x, value=0x%x mask=0x%x\r\n", path, addr, value, mask); + if ((width > 4) || (width < 0)) { + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + ret = 0; + mem_clear(read_value, sizeof(read_value)); + mem_clear(write_value, sizeof(write_value)); + ret = firmware_file_read(path, addr, read_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware sysfs read.\r\n"); + return -1; + } + + switch (width) { + case 1: + tmp_read8 = read_value[0]; + tmp_mask8 = (uint8_t)(mask) & 0xFF; + tmp_write8 = (uint8_t)value & 0xFF; + write_value[0] = (tmp_read8 & tmp_mask8) | tmp_write8; + FIRMWARE_DRIVER_DEBUG_VERBOSE("1 byte write val[0]:0x%x", write_value[0]); + break; + case 2: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + case 4: + memcpy((uint8_t *)&tmp_read32, read_value, 4); + tmp_write32 = (tmp_read32 & mask) | value; + memcpy(write_value, (uint8_t *)&tmp_write32, 4); + FIRMWARE_DRIVER_DEBUG_VERBOSE("4 byte write val[0]:0x%x, val[1]:0x%x, val[2]:0x%x, val[3]:0x%x", + write_value[0], write_value[1], write_value[2], write_value[3]); + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("write logic dev[%s] addr[0x%x].\r\n", path, addr); + ret = firmware_file_write(path, addr, write_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware_file_write %s addr 0x%x failed, ret=%d.\r\n", path, addr, ret); + return -1; + } + + return 0; +} + +/* + * firmware_upgrade_en + * function: Upgrade access enabling switch + * @flag: !0:enable 0:disable + */ +static int firmware_upgrade_en(int flag) +{ + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_info; + int ret, rv; + char *dev_name; + + ret = 0; + FIRMWARE_DRIVER_DEBUG_VERBOSE("%s en switch: gpio en num %d, logic reg en num %d.\n", + flag ? "Open" : "Close", current_fmw_cpld->gpio_en_info_num, current_fmw_cpld->logic_dev_en_num); + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (flag) { + ret = gpio_request(current_fmw_cpld->gpio_en_info[i].en_gpio, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade EN[%d] GPIO[%d] failed!\n", + i, current_fmw_cpld->gpio_en_info[i].en_gpio); + goto free_gpio; + } + gpio_direction_output(current_fmw_cpld->gpio_en_info[i].en_gpio, current_fmw_cpld->gpio_en_info[i].en_level); + current_fmw_cpld->gpio_en_info[i].flag = 1; + } else { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } + } + + for (i = 0; i < current_fmw_cpld->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = ¤t_fmw_cpld->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware sysfs [%d] dev_name[%s] addr[0x%x] mask[0x%x]" + " en_val[0x%x] dis_val[0x%x] width[%d]\n", + i , firmware_logic_dev_en_info->dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->mask, firmware_logic_dev_en_info->en_val, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->width); + if (flag) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->en_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Open logic register [%d] EN failed, ret %d.\n", i, ret); + goto free_logic_dev; + } else { + firmware_logic_dev_en_info->flag = 1; + } + } else { + rv = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (rv < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, rv); + ret = -1; + } + firmware_logic_dev_en_info->flag = 0; + } + } + + return ret; +free_logic_dev: + for (i = 0; i < current_fmw_cpld->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = ¤t_fmw_cpld->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + if (firmware_logic_dev_en_info->flag == 1) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, ret); + } + firmware_logic_dev_en_info->flag = 0; + } else { + break; + } + } +free_gpio: + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (current_fmw_cpld->gpio_en_info[i].flag == 1) { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } else { + break; + } + } + + return -1; +} + +/* + * init_cpld + * function:Initialize CPLD + * return value: 0 success ; -1 fail + */ +static int init_cpld(void) +{ + int ret; + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = 0; + ret = gpio_request(current_fmw_cpld->tdi, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TDI GPIO failed!\n"); + return ret; + } + ret = gpio_request(current_fmw_cpld->tck, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TCK GPIO failed!\n"); + goto free_tdi; + } + ret = gpio_request(current_fmw_cpld->tms, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TMS GPIO failed!\n"); + goto free_tck; + } + ret = gpio_request(current_fmw_cpld->tdo, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TDO GPIO failed!\n"); + goto free_tms; + } + + gpio_direction_output(current_fmw_cpld->tdi, 1); + gpio_direction_output(current_fmw_cpld->tck, 1); + gpio_direction_output(current_fmw_cpld->tms, 1); + + gpio_direction_input(current_fmw_cpld->tdo); + ret = firmware_upgrade_en(1); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: open firmware upgrade en failed, ret %d.\n", ret); + goto free_tdo; + } +#if 0 + /* test GPIO */ + if (TDI_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_UP failed.\n"); + goto free_tdo; + } + if (TDI_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TMS_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_UP failed.\n"); + goto free_tdo; + } + if (TMS_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TCK_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_UP failed.\n"); + goto free_tdo; + } + if (TCK_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_DOWN failed.\n"); + goto free_tdo; + } +#endif + mdelay(10); + return 0; + +free_tdo: + gpio_free(current_fmw_cpld->tdo); +free_tms: + gpio_free(current_fmw_cpld->tms); +free_tck: + gpio_free(current_fmw_cpld->tck); +free_tdi: + gpio_free(current_fmw_cpld->tdi); + return ret; +} + +/* + * finish_cpld + * function: finish CPLD upgrade operation + * return value: 0 success ; -1 fail + */ +static int finish_cpld(void) +{ + int ret; + + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = firmware_upgrade_en(0); + if (ret < 0){ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: close firmware upgrade en failed, ret %d.\r\n", ret); + } + + gpio_free(current_fmw_cpld->tdi); + gpio_free(current_fmw_cpld->tck); + gpio_free(current_fmw_cpld->tms); + gpio_free(current_fmw_cpld->tdo); + mdelay(10); + return 0; +} + +/* Loop waiting for */ +static int pull_wait(int gpio, int value) { + int i, j; + /* Timeout time is two seconds */ + for (i = 0; i < 20; i++) { + for (j = 0; j < 100; j++) { + if (!!gpio_get_value(gpio) == !!value ) { + return 0; + } + /* The first loop does not delay, normally the first loop can immediately return the result */ + if (i) { + mdelay(1); + } + } + /* The CPU is released every 100ms */ + schedule(); + } + /* timeout */ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Wait gpio %d pull to %d failed.\n", gpio, value); + return -1; +} + +/* TDI pull-up */ +static int pull_tdi_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 1); +} + +/* TDI pull-down */ +static int pull_tdi_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 0); +} + +/* TCK pull-up */ +static int pull_tck_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 1); +} + +/* TCK pull-down */ +static int pull_tck_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 0); +} + +/* TMS pull-up */ +static int pull_tms_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 1); +} + +/* TMS pull-down */ +static int pull_tms_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 0); +} + +/* Read TDO */ +static int read_tdo(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + return gpio_get_value(current_fmw_cpld->tdo); +} + +static firmware_cpld_function_t function_fmw_cpld = { + .pull_tdi_up = pull_tdi_up, + .pull_tdi_down = pull_tdi_down, + .pull_tck_up = pull_tck_up, + .pull_tck_down = pull_tck_down, + .pull_tms_up = pull_tms_up, + .pull_tms_down = pull_tms_down, + .read_tdo = read_tdo, + .init_cpld = init_cpld, + .finish_cpld = finish_cpld, +}; + +/* + * TDI_PULL_DOWN + * function: Lower TDI + */ +static int TDI_PULL_DOWN(void) +{ + if ( function_fmw_cpld.pull_tdi_down != NULL) { + return function_fmw_cpld.pull_tdi_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TDI_PULL_UP + * function: High TDI + */ +static int TDI_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tdi_up != NULL) { + return function_fmw_cpld.pull_tdi_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_UP.\n"); + return -1; + } +} + +/* + * TCK_PULL_DOWN + * function: Lower TCK + */ +static int TCK_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tck_down != NULL) { + return function_fmw_cpld.pull_tck_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TCK_PULL_UP + * function: High TCK + */ +static int TCK_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tck_up != NULL) { + return function_fmw_cpld.pull_tck_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_UP.\n"); + return -1; + } +} + +/* + * TMS_PULL_DOWN + * function: Lower TMS + */ +static int TMS_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tms_down != NULL) { + return function_fmw_cpld.pull_tms_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TMS_PULL_UP + * function: High TMS + */ +static int TMS_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tms_up != NULL) { + return function_fmw_cpld.pull_tms_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_UP.\n"); + return -1; + } +} + +/* + * TDO_READ + * function:Read the TDO level + */ +static int TDO_READ(void) +{ + if (function_fmw_cpld.read_tdo != NULL) { + return function_fmw_cpld.read_tdo(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDO_READ.\n"); + return -1; + } +} + +/* + * cpld_upgrade_init + * function:Initialize GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_init(void) +{ + int ret; + + if (function_fmw_cpld.init_cpld != NULL) { + ret = function_fmw_cpld.init_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +/* + * cpld_upgrade_finish + * function:Release GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_finish(void) +{ + int ret; + + if (function_fmw_cpld.finish_cpld != NULL) { + ret = function_fmw_cpld.finish_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_init_vme + * function: Initialize GPIO, + * @cpld_info: param[in] Information about the device to be written to + */ +int firmware_init_vme(firmware_cpld_t *cpld_info){ + int ret; + set_currrent_cpld_info(cpld_info); + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init(); + return ret; +} + +/** + * firmware_finish_vme + * function: Release GPIO + * @cpld_info: param[in] Information about the device to be written to + */ +int firmware_finish_vme(firmware_cpld_t *cpld_info){ + int ret; + set_currrent_cpld_info(cpld_info); + ret = cpld_upgrade_finish(); + return ret; +} + +/** + * fwm_cpld_tdi_op + * function: Operate TDI + * @value: param[in] TDI level */ +int fwm_cpld_tdi_op(int value) +{ + if (value) { + return TDI_PULL_UP(); + } else { + return TDI_PULL_DOWN(); + } +} + +/** + * fwm_cpld_tck_op + * function: Operate TCK + * @value: param[in] TCK level */ +int fwm_cpld_tck_op(int value) +{ + if (value) { + return TCK_PULL_UP(); + } else { + return TCK_PULL_DOWN(); + } +} + +/** + * fwm_cpld_tms_op + * function: Operate TMS + * value: param[in] TMS level */ +int fwm_cpld_tms_op(int value) +{ + if (value) { + return TMS_PULL_UP(); + } else { + return TMS_PULL_DOWN(); + } +} + +/** + * fwm_cpld_tdo_op + * function: Read TDO + */ +int fwm_cpld_tdo_op() +{ + return TDO_READ(); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c new file mode 100644 index 000000000000..e8f75844ae34 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c @@ -0,0 +1,140 @@ +#include +#include +#include + +int g_firmware_driver_debug = 0; +module_param(g_firmware_driver_debug, int, S_IRUGO | S_IWUSR); + +static LIST_HEAD(drv_list); +static LIST_HEAD(dev_list); + +/** + * firmware_driver_register + * function:Registered Device Driver + * @fw_drv:param[in] Driver information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_driver_register(firmware_driver_t *fw_drv) +{ + int ret; + + if (fw_drv == NULL) { + return FIRMWARE_FAILED; + } + + ret = platform_driver_register(fw_drv->drv); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: failed to register firmware upgrade driver \n"); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_drv->list, &drv_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware upgrade driver register sucess \n"); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_driver_unregister + * function:unregister Device Driver + * @fw_drv:param[in] Driver information + */ +void firmware_driver_unregister(firmware_driver_t *fw_drv) +{ + list_del_init(&fw_drv->list); + platform_driver_unregister(fw_drv->drv); +} + +/* + * firmware_get_device_by_minor + * function: Get device information based on minor + */ +firmware_device_t *firmware_get_device_by_minor(int minor) +{ + firmware_device_t *tmp; + + list_for_each_entry(tmp, &dev_list, list) { + if (tmp->dev.minor == minor) { + return tmp; + } + } + + return NULL; +} + +/** + * firmware_device_register + * function:Registered Driver Device + * @fw_dev: param[in] Driver information + * return value:success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_device_register(firmware_device_t *fw_dev) +{ + int ret; + firmware_device_t *tmp; + + if (fw_dev == NULL) { + return FIRMWARE_FAILED; + } + /* Check whether the device file name already exists in the device linked list */ + list_for_each_entry(tmp, &dev_list, list) { + if (strcmp(tmp->name, fw_dev->name) == 0) { + return FIRMWARE_FAILED; + } + } + + /* Registere device */ + ret = misc_register(&fw_dev->dev); + if (ret < 0) { + return FIRMWARE_FAILED; + } + + /* Adds a device to the device list */ + list_add(&fw_dev->list, &dev_list); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_device_unregister + * function: unregister Driver Device + */ +void firmware_device_unregister(firmware_device_t *fw_dev) +{ + list_del(&fw_dev->list); + misc_deregister(&fw_dev->dev); +} + +static int __init firmware_driver_init(void) +{ + int ret; + + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver ispvme init.\n"); + ret = firmware_cpld_init(); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware driver ispvme init failed.\n"); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +static void __exit firmware_driver_exit(void) +{ + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver ispvme exit.\n"); + firmware_cpld_exit(); + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + return; +} + +module_init(firmware_driver_init); +module_exit(firmware_driver_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Firmware upgrade ispvme driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("1.0"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h new file mode 100644 index 000000000000..eb737d3a56ed --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h @@ -0,0 +1,70 @@ +#ifndef __FIRMWARE_CPLD_H__ +#define __FIRMWARE_CPLD_H__ + +#define FIRMWARE_DEV_NAME_LEN 32 +#define FIRMWARE_MAX_CPLD_NUM 16 +#define FIRMWARE_TYPE_LEN 10 +#define FIRMWARE_EN_INFO_MAX 16 +#define FIRMWARE_EN_INFO_BUF 128 + +typedef struct firmware_gpio_jtag_en_s { + uint32_t en_gpio; /* GPIO enable pin */ + uint32_t en_level; /* GPIO enable level */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_gpio_jtag_en_t; + +typedef struct firmware_logic_dev_en_s { + char dev_name[FIRMWARE_DEV_NAME_LEN]; /* Logical device name */ + uint32_t addr; /* Enable register address */ + uint32_t mask; /* mask */ + uint32_t en_val; /* Enable value */ + uint32_t dis_val; /* Disable value*/ + uint32_t width; /* width */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_logic_dev_en_t; + +typedef struct firmware_cpld_s { + char devname[FIRMWARE_DEV_NAME_LEN]; /* Device name */ + char type[FIRMWARE_TYPE_LEN]; /* interface type */ + uint32_t tdi; /* TDI signal corresponding to GPIO pin information */ + uint32_t tck; /* TCK signal corresponding to GPIO pin information */ + uint32_t tms; /* TMS signal corresponding to GPIO pin information */ + uint32_t tdo; /* TDO signal corresponding to GPIO pin information */ + uint32_t chain; /* chain num */ + uint32_t chip_index; /* chip index */ + uint32_t tck_delay; /* Delay time */ + uint32_t gpio_en_info_num; /* GPIO Enable Number */ + firmware_gpio_jtag_en_t gpio_en_info[FIRMWARE_EN_INFO_MAX]; /* GPIO Enable Information */ + uint32_t logic_dev_en_num; /* Register Enable Number */ + firmware_logic_dev_en_t logic_dev_en_info[FIRMWARE_EN_INFO_MAX]; /* Register Enable Information */ +} firmware_cpld_t; + +typedef struct firmware_cpld_function_s{ + int (*pull_tdi_up)(void); /* TDI pull-up */ + int (*pull_tdi_down)(void); /* TDI pull-down */ + int (*pull_tck_up)(void); /* TCK pull-up */ + int (*pull_tck_down)(void); /* TCK pull-down */ + int (*pull_tms_up)(void); /* TMS pull-up */ + int (*pull_tms_down)(void); /* TCK pull-down */ + int (*read_tdo)(void); /* Read TDO */ + int (*init_cpld)(void); /* CPLD upgrade initializes the operation */ + int (*init_chip)(int chain); /* chip initializes the operation */ + int (*finish_chip)(int chain); /* chip completes the operation*/ + int (*finish_cpld)(void); /* CPLD upgrade completes the operation */ + int (*get_version)(int chain, char *ver, int len); /* get version */ +}firmware_cpld_function_t; + +/* operate TDI */ +extern int fwm_cpld_tdi_op(int value); +/* operate TCK */ +extern int fwm_cpld_tck_op(int value); +/* operate TMS */ +extern int fwm_cpld_tms_op(int value); +/* operate TDO */ +extern int fwm_cpld_tdo_op(void); +/* VME upgrade mode completes the operation*/ +extern int firmware_finish_vme(firmware_cpld_t *cpld_info); +/* VME upgrade mode initializes the operation*/ +extern int firmware_init_vme(firmware_cpld_t *cpld_info); + +#endif /* __FIRMWARE_CPLD_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h new file mode 100644 index 000000000000..39baf3f30717 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h @@ -0,0 +1,86 @@ +#ifndef __FIRMWARE_H__ +#define __FIRMWARE_H__ + +#include +#include + +#include + +/* Debug switch level */ +typedef enum { + FIRWMARE_VERBOSE, + FIRWMARE_WARN, + FIRWMARE_ERROR, + FIRWMARE_END, +} firmware_debug_level_t; + +#define FIRMWARE_DRIVER_DEBUG_VERBOSE(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_VERBOSE)) { \ + printk(KERN_INFO "[FIRMWARW_DRIVER_ISPVME][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_DRIVER_DEBUG_ERROR(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_ERROR)) { \ + printk(KERN_ERR "[FIRMWARW_DRIVER_ISPVME][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_NAME_LEN 48 + +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS 0 + +/* ioctl publi command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ + +/* firmware cpld ispvme driver ioctl command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_VME_TYPE 'V' +#define FIRMWARE_JTAG_TDI _IOR(FIRMWARE_VME_TYPE, 0, char) +#define FIRMWARE_JTAG_TDO _IOR(FIRMWARE_VME_TYPE, 1, char) +#define FIRMWARE_JTAG_TCK _IOR(FIRMWARE_VME_TYPE, 2, char) +#define FIRMWARE_JTAG_TMS _IOR(FIRMWARE_VME_TYPE, 3, char) +#define FIRMWARE_JTAG_EN _IOR(FIRMWARE_VME_TYPE, 4, char) +#define FIRMWARE_JTAG_INIT _IOR(FIRMWARE_VME_TYPE, 7, char) /* enable upgrade access */ +#define FIRMWARE_JTAG_FINISH _IOR(FIRMWARE_VME_TYPE, 8, char) /* disable upgrade access */ + +typedef struct cmd_info_s { + uint32_t size; + void __user *data; +} cmd_info_t; + +typedef struct firmware_device_s { + struct list_head list; /* device list */ + uint32_t chain; /* chain number */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct miscdevice dev; /* device */ + void *priv; /* private data */ +} firmware_device_t; + +typedef struct firmware_driver_s { + struct list_head list; /* list */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct platform_driver *drv; /* driver */ + void *priv; /* private data */ +} firmware_driver_t; + +extern int g_firmware_driver_debug; + +/* Get device information based on minor */ +extern firmware_device_t *firmware_get_device_by_minor(int minor); +/* Registere device */ +extern int firmware_device_register(firmware_device_t *fw_dev); +/* Unregister device */ +extern void firmware_device_unregister(firmware_device_t *fw_dev); +/* Registere driver */ +extern int firmware_driver_register(firmware_driver_t *fw_drv); +/* Unregister driver */ +extern void firmware_driver_unregister(firmware_driver_t *fw_drv); +/* CPLD upgrade initialized */ +extern int firmware_cpld_init(void); +/* CPLD unload function */ +extern void firmware_cpld_exit(void); + +#endif /* end of __FIRMWARE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile new file mode 100644 index 000000000000..a1d6d2e2ef68 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile @@ -0,0 +1,22 @@ +#include $(top_srcdir)/debian/rules +#KERNELDIR := ${KBUILD_OUTPUT} + +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../include) +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) +EXTRA_CFLAGS+= -Wall + +firmware_driver_sysfs-objs := firmware.o +firmware_driver_sysfs-objs += firmware_sysfs.o firmware_sysfs_upgrade.o + +#ifndef CONFIG_FRM_PRODUCT_FILE + +$(warning $(firmware_driver_sysfs-objs)) +obj-m := firmware_driver_sysfs.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(common_module_dir) ]; then mkdir -p $(common_module_dir) ;fi + cp -p $(PWD)/*.ko $(common_module_dir) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c new file mode 100644 index 000000000000..fec51d6238a6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c @@ -0,0 +1,143 @@ +#include +#include +#include + +int g_firmware_driver_debug = 0; +module_param(g_firmware_driver_debug, int, S_IRUGO | S_IWUSR); + +static LIST_HEAD(drv_list); +static LIST_HEAD(dev_list); + +/** + * firmware_driver_register + * function:Registered Device Driver + * @fw_drv:param[in] Driver information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_driver_register(firmware_driver_t *fw_drv) +{ + int ret; + + if (fw_drv == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + + ret = platform_driver_register(fw_drv->drv); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: failed to register firmware upgrade driver \n"); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_drv->list, &drv_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware upgrade driver register sucess \n"); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_driver_unregister + * function:unregister Device Driver + * @fw_drv:param[in] Driver information + */ +void firmware_driver_unregister(firmware_driver_t *fw_drv) +{ + list_del_init(&fw_drv->list); + platform_driver_unregister(fw_drv->drv); +} + +/* + * firmware_get_device_by_minor + * function: Get device information based on minor + */ +firmware_device_t *firmware_get_device_by_minor(int minor) +{ + firmware_device_t *tmp; + + list_for_each_entry(tmp, &dev_list, list) { + if (tmp->dev.minor == minor) { + return tmp; + } + } + + return NULL; +} + +/** + * firmware_device_register + * function:Registered Driver Device + * @fw_dev: param[in] Driver information + * return value:success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_device_register(firmware_device_t *fw_dev) +{ + int ret; + firmware_device_t *tmp; + + if (fw_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + /* Check whether the device file name already exists in the device linked list */ + list_for_each_entry(tmp, &dev_list, list) { + if (strcmp(tmp->name, fw_dev->name) == 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("devie %s already exists.\n", fw_dev->name); + return FIRMWARE_FAILED; + } + } + + ret = misc_register(&fw_dev->dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("register misc error, ret=%d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_dev->list, &dev_list); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_device_unregister + * function: unregister Driver Device + */ +void firmware_device_unregister(firmware_device_t *fw_dev) +{ + list_del(&fw_dev->list); + misc_deregister(&fw_dev->dev); +} + +static int __init firmware_driver_init(void) +{ + int ret; + + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver sysfs init.\n"); + ret = firmware_sysfs_init(); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware driver sysfs init failed.\n"); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +static void __exit firmware_driver_exit(void) +{ + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver sysfs exit.\n"); + firmware_sysfs_exit(); + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + return; +} + +module_init(firmware_driver_init); +module_exit(firmware_driver_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Firmware upgrade driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("1.0"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c new file mode 100644 index 000000000000..a823cdc4f294 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c @@ -0,0 +1,495 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_sysfs_open(struct inode *inode, struct file *file) +{ + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Open device.\n"); + frm_dev = firmware_get_device_by_minor(MINOR(inode->i_rdev)); + if (frm_dev == NULL) { + return -ENXIO; + } + file->private_data = frm_dev; + + return FIRMWARE_SUCCESS; +} + +static ssize_t firmware_sysfs_read (struct file *file, char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static ssize_t firmware_sysfs_write (struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static loff_t firmware_sysfs_llseek(struct file *file, loff_t offset, int origin) +{ + return 0; +} + +/* firmware_sysfs_ioctl +* function:ioctl command parsing function +* @file: param[in] device file name +* @cmd: param[in] command +* @arg: param[in] the parameters in the command +* return value: success-FIRMWARE_SUCCESS; fail:other value +*/ +static long firmware_sysfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + void __user *argp; + firmware_device_t *frm_dev; + firmware_sysfs_t *sysfs_info; + int ret; + + /* Get device private data */ + frm_dev = (firmware_device_t *)file->private_data; + sysfs_info = NULL; + if (frm_dev != NULL) { + if (frm_dev->priv != NULL) { + sysfs_info = (firmware_sysfs_t *)frm_dev->priv; + } + } + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to frm_dev->priv sysfs info.\n"); + return FIRMWARE_FAILED; + } + argp = (void __user *)arg; + + switch (cmd) { + case FIRMWARE_SYSFS_INIT: + /* enable upgrade access */ + ret = firmware_init_dev_loc(sysfs_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to init upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + case FIRMWARE_SYSFS_FINISH: + /* disable upgrade access */ + ret = firmware_finish_dev_loc(sysfs_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to release upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + case FIRMWARE_SYSFS_SPI_INFO: + /* Get SPI logic device information */ + if (copy_to_user(argp, &sysfs_info->info.spi_logic_info, sizeof(firmware_spi_logic_info_t))) { + return -EFAULT; + } + break; + case FIRMWARE_SYSFS_DEV_FILE_INFO: + /*Get logic device information */ + if (copy_to_user(argp, &sysfs_info->info.dev_file_info, sizeof(firmware_dev_file_info_t))) { + return -EFAULT; + } + break; + case FIRMWARE_SYSFS_MTD_INFO: + /*Get logic device information */ + if (copy_to_user(argp, &sysfs_info->info.mtd_info, sizeof(firmware_mtd_info_t))) { + return -EFAULT; + } + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("not find cmd: %d\r\n", cmd); + return -ENOTTY; + } /* End of switch */ + + return FIRMWARE_SUCCESS; +} + +static int firmware_sysfs_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static const struct file_operations sysfs_dev_fops = { + .owner = THIS_MODULE, + .llseek = firmware_sysfs_llseek, + .read = firmware_sysfs_read, + .write = firmware_sysfs_write, + .unlocked_ioctl = firmware_sysfs_ioctl, + .open = firmware_sysfs_open, + .release = firmware_sysfs_release, +}; + +/* Gets the information in the device tree */ +static int of_firmware_upgrade_config_init(struct device *dev, firmware_sysfs_t *sysfs_info) +{ + int ret; + char *name; + int8_t buf[64]; + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + uint32_t test_base, test_size; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_dev_loc_config_init\r\n"); + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + mem_clear(sysfs_info, sizeof(firmware_sysfs_t)); + ret = 0; + ret += of_property_read_string(dev->of_node, "type", (const char **)&name); + + ret += of_property_read_u32(dev->of_node, "chain", &sysfs_info->chain); + ret += of_property_read_u32(dev->of_node, "chip_index", &sysfs_info->chip_index); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->type, name, sizeof(sysfs_info->type) - 1); + + ret = of_property_read_u32(dev->of_node, "test_base", &test_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config test_base, ret:%d.\n", ret); + test_base = 0; + } + + ret = of_property_read_u32(dev->of_node, "test_size", &test_size); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config test_size, ret:%d.\n", ret); + test_size = 0; + } + + if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SPI_LOGIC) == 0) { + ret = of_property_read_string(dev->of_node, "dev_name", (const char **)&name); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config dev_name error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->info.spi_logic_info.dev_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + ret = of_property_read_u32(dev->of_node, "flash_base", &sysfs_info->info.spi_logic_info.flash_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config flash_base error, ret:%d.\n", ret); + return -ENXIO; + } + + ret = of_property_read_u32(dev->of_node, "ctrl_base", &sysfs_info->info.spi_logic_info.ctrl_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config ctrl_base error, ret:%d.\n", ret); + return -ENXIO; + } + sysfs_info->info.spi_logic_info.test_base = test_base; + sysfs_info->info.spi_logic_info.test_size = test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SYSFS) == 0) { + ret = of_property_read_string(dev->of_node, "sysfs_name", (const char **)&name); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config sysfs_name error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->info.dev_file_info.sysfs_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + ret = of_property_read_u32(dev->of_node, "dev_base", &sysfs_info->info.dev_file_info.dev_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("dts don't config dev_base, dev_base is 0.\n"); + sysfs_info->info.dev_file_info.dev_base = 0; + } + + ret = of_property_read_u32(dev->of_node, "per_len", &sysfs_info->info.dev_file_info.per_len); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("dts don't config per_len, per_len is 0.\n"); + sysfs_info->info.dev_file_info.per_len = 0; + } + sysfs_info->info.dev_file_info.test_base = test_base; + sysfs_info->info.dev_file_info.test_size = test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_MTD) == 0) { + ret = of_property_read_string(dev->of_node, "mtd_name", (const char **)&name); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config mtd_name error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->info.mtd_info.mtd_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + ret = of_property_read_u32(dev->of_node, "flash_base", &sysfs_info->info.mtd_info.flash_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config flash_base error, ret:%d.\n", ret); + return -ENXIO; + } + sysfs_info->info.mtd_info.test_base = test_base; + sysfs_info->info.mtd_info.test_size = test_size; + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config sysfs type[%s] is not support, ret:%d.\n", sysfs_info->type, ret); + return -ENXIO; + } + + sysfs_info->gpio_en_info_num = 0; + /* Enable through GPIO */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_gpio_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &sysfs_info->gpio_en_info[i].en_gpio); + if(ret != 0) { + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_level_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &sysfs_info->gpio_en_info[i].en_level); + if(ret != 0) { + break; + } + sysfs_info->gpio_en_info_num++; + } + + sysfs_info->logic_dev_en_num = 0; + /* Enable through register */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + firmware_logic_dev_en_point = &sysfs_info->logic_dev_en_info[i]; + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dev_%d", i); + ret = 0; + ret += of_property_read_string(dev->of_node, buf, (const char **)&name); + if(ret != 0) { + /* Failure to resolve to EN_LOGIC_DEV means no logical device is enabled. No failure is returned */ + ret = 0; + break; + } + strncpy(firmware_logic_dev_en_point->dev_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_addr_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->addr); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_addr_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_mask_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->mask); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_mask_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_en_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->en_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_en_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dis_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->dis_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_dis_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_width_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->width); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_width_%d ret =%d.\n", i, ret); + break; + } + + sysfs_info->logic_dev_en_num++; + } + + return ret; +} + +static int firmware_upgrade_config_init(struct device *dev, firmware_sysfs_t *sysfs_info) +{ + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + firmware_upgrade_device_t *firmware_upgrade_device; + firmware_sysfs_device_t sysfs_upg_device; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_dev_loc_config_init\r\n"); + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + if (dev->platform_data == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("platform data config error.\n"); + return -1; + } + firmware_upgrade_device = dev->platform_data; + sysfs_upg_device = firmware_upgrade_device->upg_type.sysfs; + + mem_clear(sysfs_info, sizeof(firmware_sysfs_t)); + strncpy(sysfs_info->type, firmware_upgrade_device->type, sizeof(sysfs_info->type) - 1); + sysfs_info->chain = firmware_upgrade_device->chain; + sysfs_info->chip_index = firmware_upgrade_device->chip_index; + + if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SPI_LOGIC) == 0) { + strncpy(sysfs_info->info.spi_logic_info.dev_name, sysfs_upg_device.dev_name, FIRMWARE_DEV_NAME_LEN - 1); + sysfs_info->info.spi_logic_info.flash_base = sysfs_upg_device.flash_base; + sysfs_info->info.spi_logic_info.ctrl_base = sysfs_upg_device.ctrl_base; + sysfs_info->info.spi_logic_info.test_base = sysfs_upg_device.test_base; + sysfs_info->info.spi_logic_info.test_size = sysfs_upg_device.test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SYSFS) == 0) { + strncpy(sysfs_info->info.dev_file_info.sysfs_name, sysfs_upg_device.sysfs_name, FIRMWARE_DEV_NAME_LEN - 1); + sysfs_info->info.dev_file_info.dev_base = sysfs_upg_device.dev_base; + sysfs_info->info.dev_file_info.per_len = sysfs_upg_device.per_len; + sysfs_info->info.dev_file_info.test_base = sysfs_upg_device.test_base; + sysfs_info->info.dev_file_info.test_size = sysfs_upg_device.test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_MTD) == 0) { + strncpy(sysfs_info->info.mtd_info.mtd_name, sysfs_upg_device.mtd_name, FIRMWARE_DEV_NAME_LEN - 1); + sysfs_info->info.mtd_info.flash_base = sysfs_upg_device.flash_base; + sysfs_info->info.mtd_info.test_base = sysfs_upg_device.test_base; + sysfs_info->info.mtd_info.test_size = sysfs_upg_device.test_size; + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("config sysfs type[%s] is not support.\n", sysfs_info->type); + return -ENXIO; + } + + if (firmware_upgrade_device->en_gpio_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_gpio_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_gpio_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + sysfs_info->gpio_en_info_num = firmware_upgrade_device->en_gpio_num; + /* Enable through GPIO */ + for (i = 0; i < sysfs_info->gpio_en_info_num; i++) { + sysfs_info->gpio_en_info[i].en_gpio = firmware_upgrade_device->en_gpio[i]; + sysfs_info->gpio_en_info[i].en_level = firmware_upgrade_device->en_level[i]; + } + + if (firmware_upgrade_device->en_logic_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_logic_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_logic_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + sysfs_info->logic_dev_en_num = firmware_upgrade_device->en_logic_num; + /* Enable through register */ + for (i = 0; i < sysfs_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_point = &sysfs_info->logic_dev_en_info[i]; + strncpy(firmware_logic_dev_en_point->dev_name, firmware_upgrade_device->en_logic_dev[i], FIRMWARE_DEV_NAME_LEN - 1); + firmware_logic_dev_en_point->addr = firmware_upgrade_device->en_logic_addr[i]; + firmware_logic_dev_en_point->mask = firmware_upgrade_device->en_logic_mask[i]; + firmware_logic_dev_en_point->en_val = firmware_upgrade_device->en_logic_en_val[i]; + firmware_logic_dev_en_point->dis_val = firmware_upgrade_device->en_logic_dis_val[i]; + firmware_logic_dev_en_point->width = firmware_upgrade_device->en_logic_width[i]; + } + + return 0; +} + +static int firmware_sysfs_probe(struct platform_device *pdev) +{ + int ret; + firmware_sysfs_t *sysfs_info; + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_sysfs_probe\r\n"); + sysfs_info = devm_kzalloc(&pdev->dev, sizeof(firmware_sysfs_t), GFP_KERNEL); + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc device tree.\n"); + return -EPERM; + } + + if (pdev->dev.of_node) { + ret = of_firmware_upgrade_config_init(&pdev->dev, sysfs_info); + } else { + ret = firmware_upgrade_config_init(&pdev->dev, sysfs_info); + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("get config init from dts error.\n"); + return -EPERM; + } + + frm_dev = devm_kzalloc(&pdev->dev, sizeof(firmware_device_t), GFP_KERNEL); + if (frm_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc firmware device.\n"); + return -EPERM; + } + + /* Based on the link number, determine the name of the device file */ + frm_dev->chain = sysfs_info->chain; + snprintf(frm_dev->name, FIRMWARE_NAME_LEN - 1, "firmware_sysfs%d", frm_dev->chain); + strncpy(sysfs_info->devname, frm_dev->name, strlen(frm_dev->name) + 1); + + INIT_LIST_HEAD(&frm_dev->list); + frm_dev->dev.minor = MISC_DYNAMIC_MINOR; + frm_dev->dev.name = frm_dev->name; + frm_dev->dev.fops = &sysfs_dev_fops; + frm_dev->priv = sysfs_info; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Register sysfs firmware chain:%d, name:%s.\n", frm_dev->chain, frm_dev->name); + + ret = firmware_device_register(frm_dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to register firmware device.\n"); + return -EPERM; + } + + platform_set_drvdata(pdev, frm_dev); + return 0; +} + +static int __exit firmware_sysfs_remove(struct platform_device *pdev) +{ + firmware_device_t *frm_dev; + + frm_dev = (firmware_device_t *)platform_get_drvdata(pdev); + firmware_device_unregister(frm_dev); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct of_device_id sysfs_match[] = { + { + .compatible = "firmware_sysfs", + }, + {}, +}; + +static struct platform_driver sysfs_driver = { + .driver = { + .name = "firmware_sysfs", + .owner = THIS_MODULE, + .of_match_table = sysfs_match, + }, + .probe = firmware_sysfs_probe, + .remove = firmware_sysfs_remove, +}; + +static firmware_driver_t fmw_drv_sysfs = { + .name = "firmware_sysfs", + .drv = &sysfs_driver, +}; + +int firmware_sysfs_init(void) +{ + int ret; + + INIT_LIST_HEAD(&fmw_drv_sysfs.list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("sysfs upgrade driver register \n"); + ret = firmware_driver_register(&fmw_drv_sysfs); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("sysfs upgrade driver register failed\n"); + return ret; + } + return 0; +} + +void firmware_sysfs_exit(void) +{ + firmware_driver_unregister(&fmw_drv_sysfs); + INIT_LIST_HEAD(&fmw_drv_sysfs.list); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c new file mode 100644 index 000000000000..8b883006de53 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c @@ -0,0 +1,258 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_file_read(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_read(filp, val, size, &pos); + if (ret != size) { + FIRMWARE_DRIVER_DEBUG_ERROR("read kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int firmware_file_write(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_write(filp, (void*)val, size, &pos); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("write kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +/* + * firmware_file_do_work + * function: Sets logical register values + * @path:param[in] Logic device descriptor + * @addr:param[in] Logic device address + * @value:param[in] the register value needs to be set + * @mask:param[in] register mask + * @width:param[in] register bit width + * return: 0:success, <0:failed + */ +static int firmware_file_do_work(char *path, uint32_t addr, uint32_t value, uint32_t mask, + int32_t width) +{ + int ret; + uint8_t read_value[4], write_value[4]; + uint8_t tmp_read8, tmp_write8, tmp_mask8; + uint32_t tmp_read32, tmp_write32; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("path=%s, addr=0x%x, value=0x%x mask=0x%x\r\n", path, addr, value, mask); + if ((width > 4) || (width < 0)) { + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + ret = 0; + mem_clear(read_value, sizeof(read_value)); + mem_clear(write_value, sizeof(write_value)); + ret = firmware_file_read(path, addr, read_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware sysfs read.\r\n"); + return -1; + } + + switch (width) { + case 1: + tmp_read8 = read_value[0]; + tmp_mask8 = (uint8_t)(mask) & 0xFF; + tmp_write8 = (uint8_t)value & 0xFF; + write_value[0] = (tmp_read8 & tmp_mask8) | tmp_write8; + FIRMWARE_DRIVER_DEBUG_VERBOSE("1 byte write val[0]:0x%x", write_value[0]); + break; + case 2: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + case 4: + memcpy((uint8_t *)&tmp_read32, read_value, 4); + tmp_write32 = (tmp_read32 & mask) | value; + memcpy(write_value, (uint8_t *)&tmp_write32, 4); + FIRMWARE_DRIVER_DEBUG_VERBOSE("4 byte write val[0]:0x%x, val[1]:0x%x, val[2]:0x%x, val[3]:0x%x", + write_value[0], write_value[1], write_value[2], write_value[3]); + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("write logic dev[%s] addr[0x%x].\r\n", path, addr); + ret = firmware_file_write(path, addr, write_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware_file_write %s addr 0x%x failed, ret=%d.\r\n", path, addr, ret); + return -1; + } + + return 0; +} + +/* + * firmware_upgrade_en + * function:param[in] Upgrade access enabling switch + * @flag:param[in] !0:enable 0:disable + * return: 0:success, <0:failed + */ +static int firmware_upgrade_en(firmware_sysfs_t *sysfs_info, int flag) +{ + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_info; + int ret, rv; + char *dev_name; + + ret = 0; + FIRMWARE_DRIVER_DEBUG_VERBOSE("%s en switch: gpio en num %d, logic reg en num %d.\n", + flag ? "Open" : "Close", sysfs_info->gpio_en_info_num, sysfs_info->logic_dev_en_num); + for (i = 0; i < sysfs_info->gpio_en_info_num; i++) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware sysfs [%d] gpio[%d] en_level[%d]\n", + i, sysfs_info->gpio_en_info[i].en_gpio, sysfs_info->gpio_en_info[i].en_level); + if (flag) { + ret = gpio_request(sysfs_info->gpio_en_info[i].en_gpio, "sysfs_upgrade_gpio_en"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade EN[%d] GPIO[%d] failed!\n", + i, sysfs_info->gpio_en_info[i].en_gpio); + goto free_gpio; + } + gpio_direction_output(sysfs_info->gpio_en_info[i].en_gpio, sysfs_info->gpio_en_info[i].en_level); + sysfs_info->gpio_en_info[i].flag = 1; + } else { + gpio_set_value(sysfs_info->gpio_en_info[i].en_gpio, !sysfs_info->gpio_en_info[i].en_level); + gpio_free(sysfs_info->gpio_en_info[i].en_gpio); + sysfs_info->gpio_en_info[i].flag = 0; + } + } + + for (i = 0; i < sysfs_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = &sysfs_info->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware sysfs [%d] dev_name[%s] addr[0x%x] mask[0x%x]" + " en_val[0x%x] dis_val[0x%x] width[%d]\n", + i , firmware_logic_dev_en_info->dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->mask, firmware_logic_dev_en_info->en_val, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->width); + if (flag) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->en_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Open logic register [%d] EN failed, ret %d.\n", i, ret); + goto free_logic_dev; + } else { + firmware_logic_dev_en_info->flag = 1; + } + } else { + rv = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (rv < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, rv); + ret = -1; + } + firmware_logic_dev_en_info->flag = 0; + } + } + + return ret; +free_logic_dev: + for (i = 0; i < sysfs_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = &sysfs_info->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + if (firmware_logic_dev_en_info->flag == 1) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, ret); + } + firmware_logic_dev_en_info->flag = 0; + } else { + break; + } + } +free_gpio: + for (i = 0; i < sysfs_info->gpio_en_info_num; i++) { + if (sysfs_info->gpio_en_info[i].flag == 1) { + gpio_set_value(sysfs_info->gpio_en_info[i].en_gpio, !sysfs_info->gpio_en_info[i].en_level); + gpio_free(sysfs_info->gpio_en_info[i].en_gpio); + sysfs_info->gpio_en_info[i].flag = 0; + } else { + break; + } + } + + return -1; +} + +/* + * firmware_init_dev_loc + * function: init logic device, enable upgrade access + * return: 0:success, <0:failed + */ +int firmware_init_dev_loc(firmware_sysfs_t *sysfs_info) +{ + int ret; + + ret = firmware_upgrade_en(sysfs_info, 1); + return ret; +} + +/* + * firmware_finish_dev_loc + * function: finish logic device, disable upgrade access + * return: 0:success, <0:failed + */ +int firmware_finish_dev_loc(firmware_sysfs_t *sysfs_info){ + int ret; + ret = firmware_upgrade_en(sysfs_info, 0); + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h new file mode 100644 index 000000000000..9da2303c7c00 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h @@ -0,0 +1,88 @@ +#ifndef __FIRMWARE_SYSFS_H__ +#define __FIRMWARE_SYSFS_H__ + +#include +#include + +#include + +/* Debug switch level */ +typedef enum { + FIRWMARE_VERBOSE, + FIRWMARE_WARN, + FIRWMARE_ERROR, + FIRWMARE_END, +} firmware_debug_level_t; + +#define FIRMWARE_DRIVER_DEBUG_VERBOSE(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_VERBOSE)) { \ + printk(KERN_INFO "[FIRMWARW_DRIVER_SYSFS][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_DRIVER_DEBUG_ERROR(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_ERROR)) { \ + printk(KERN_ERR "[FIRMWARW_DRIVER_SYSFS][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_NAME_LEN 48 + +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS 0 + +/* ioctl publi command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ + +/* firmware sysfs driver ioctl command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_SYSFS_TYPE 'S' +#define FIRMWARE_SYSFS_INIT _IOR(FIRMWARE_SYSFS_TYPE, 0, char) /* enable upgrade access */ +#define FIRMWARE_SYSFS_FINISH _IOR(FIRMWARE_SYSFS_TYPE, 1, char) /* disable upgrade access */ +#define FIRMWARE_SYSFS_SPI_INFO _IOR(FIRMWARE_SYSFS_TYPE, 2, char) /* spi flash upgrade */ +#define FIRMWARE_SYSFS_DEV_FILE_INFO _IOR(FIRMWARE_SYSFS_TYPE, 3, char) /* sysfs upgrade */ +#define FIRMWARE_SYSFS_MTD_INFO _IOR(FIRMWARE_SYSFS_TYPE, 4, char) /* sysfs mtd upgrade */ + +#define FIRMWARE_SYSFS_TYPE_SPI_LOGIC "SPI_LOGIC" +#define FIRMWARE_SYSFS_TYPE_SYSFS "SYSFS" +#define FIRMWARE_SYSFS_TYPE_MTD "MTD_DEV" + +typedef struct cmd_info_s { + uint32_t size; + void __user *data; +} cmd_info_t; + +typedef struct firmware_device_s { + struct list_head list; /* device list */ + uint32_t chain; /* chain number */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct miscdevice dev; /* device */ + void *priv; /* private data */ +} firmware_device_t; + +typedef struct firmware_driver_s { + struct list_head list; /* list */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct platform_driver *drv; /* driver */ + void *priv; /* private data */ +} firmware_driver_t; + +extern int g_firmware_driver_debug; + +/* Get device information based on minor */ +extern firmware_device_t *firmware_get_device_by_minor(int minor); +/* Registere device */ +extern int firmware_device_register(firmware_device_t *fw_dev); +/* Unregister device */ +extern void firmware_device_unregister(firmware_device_t *fw_dev); +/* Registere driver */ +extern int firmware_driver_register(firmware_driver_t *fw_drv); +/* Unregister driver */ +extern void firmware_driver_unregister(firmware_driver_t *fw_drv); +/* SYSFS upgrade initialized */ +extern int firmware_sysfs_init(void); +/* SYSFS unload function */ +extern void firmware_sysfs_exit(void); + +#endif /* end of __FIRMWARE_SYSFS_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h new file mode 100644 index 000000000000..9c6b970274b1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h @@ -0,0 +1,72 @@ +#ifndef __FIRMWARE_SYSFS_UPGRADE_H__ +#define __FIRMWARE_SYSFS_UPGRADE_H__ + +#define FIRMWARE_DEV_NAME_LEN 64 /* the macro definition needs to same as app space define */ +#define FIRMWARE_TYPE_LEN 10 +#define FIRMWARE_EN_INFO_MAX 16 + +typedef struct firmware_spi_logic_info_s { + char dev_name[FIRMWARE_DEV_NAME_LEN]; /* Logical device name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t ctrl_base; /* SPI upgrade control register base address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_spi_logic_info_t; + +typedef struct firmware_dev_file_info_s { + char sysfs_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t dev_base; /* device upgrade base address */ + uint32_t per_len; /* The length of bytes per operation */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_dev_file_info_t; + +typedef struct firmware_mtd_info_s { + char mtd_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_mtd_info_t; + +typedef struct firmware_gpio_jtag_en_s { + uint32_t en_gpio; /* GPIO enable pin */ + uint32_t en_level; /* GPIO enable level */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_gpio_jtag_en_t; + +typedef struct firmware_logic_dev_en_s { + char dev_name[FIRMWARE_DEV_NAME_LEN]; /* Logical device name */ + uint32_t addr; /* Enable register address */ + uint32_t mask; /* mask */ + uint32_t en_val; /* Enable value */ + uint32_t dis_val; /* Disable value*/ + uint32_t width; /* width */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_logic_dev_en_t; + +typedef struct firmware_sysfs_s { + char devname[FIRMWARE_DEV_NAME_LEN]; /* Device name */ + char type[FIRMWARE_TYPE_LEN]; /* interface type */ + uint32_t chain; /* chain num */ + uint32_t chip_index; /* chip index */ + union { + firmware_spi_logic_info_t spi_logic_info; /* SPI logic Information */ + firmware_dev_file_info_t dev_file_info; /* device file Information */ + firmware_mtd_info_t mtd_info; /* mtd device Information */ + } info; + uint32_t gpio_en_info_num; /* GPIO Enable Number */ + firmware_gpio_jtag_en_t gpio_en_info[FIRMWARE_EN_INFO_MAX]; /* GPIO Enable Information */ + uint32_t logic_dev_en_num; /* Register Enable Number */ + firmware_logic_dev_en_t logic_dev_en_info[FIRMWARE_EN_INFO_MAX]; /* Register Enable Information */ +} firmware_sysfs_t; + +typedef struct firmware_sysfs_function_s{ + int (*init_dev)(void); /* upgrade initializes the operation */ + int (*finish_dev)(void); /* upgrade completes the operation */ +}firmware_sysfs_function_t; + +extern void firmware_set_sysfs_info(firmware_sysfs_t *sysfs_info); +extern int firmware_init_dev_loc(firmware_sysfs_t *sysfs_info); +extern int firmware_finish_dev_loc(firmware_sysfs_t *sysfs_info); + +#endif /* __FIRMWARE_SYSFS_UPGRADE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h new file mode 100644 index 000000000000..600c69646b1b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h @@ -0,0 +1,57 @@ +#ifndef __FIRMWARE_UPGRADE_H__ +#define __FIRMWARE_UPGRADE_H__ + +#include + +#define TYPE_LEN (10) +#define DEV_NAME_LEN (64) +#define ENABLE_NUM (16) + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef struct firmware_jtag_device_s { + uint32_t tdi; + uint32_t tck; + uint32_t tms; + uint32_t tdo; + uint32_t tck_delay; +} firmware_jtag_device_t; + +typedef struct firmware_sysfs_device_s { + uint32_t test_base; + uint32_t test_size; + char dev_name[DEV_NAME_LEN]; + uint32_t flash_base; + uint32_t ctrl_base; + char sysfs_name[DEV_NAME_LEN]; + uint32_t dev_base; + uint32_t per_len; + char mtd_name[DEV_NAME_LEN]; +} firmware_sysfs_device_t; + +typedef struct firmware_upgrade_device_s { + char type[TYPE_LEN]; + uint32_t chain; + uint32_t chip_index; + + uint32_t en_gpio_num; /* the number of en_gpio */ + uint32_t en_gpio[ENABLE_NUM]; + uint32_t en_level[ENABLE_NUM]; + + uint32_t en_logic_num; /* the number of en_logic */ + char en_logic_dev[ENABLE_NUM][DEV_NAME_LEN]; + uint32_t en_logic_addr[ENABLE_NUM]; + uint32_t en_logic_mask[ENABLE_NUM]; + uint32_t en_logic_en_val[ENABLE_NUM]; + uint32_t en_logic_dis_val[ENABLE_NUM]; + uint32_t en_logic_width[ENABLE_NUM]; + + int device_flag; + union { + firmware_jtag_device_t jtag; + firmware_sysfs_device_t sysfs; + } upg_type; + +} firmware_upgrade_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile new file mode 100644 index 000000000000..176d44d2abd9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile @@ -0,0 +1,33 @@ +include $(top_srcdir)/Rules.mk + +#OBJ = firmware_app.o debug.o hardware.o ispvm_ui.o ivm_core.o crc32.o +PWD = $(shell pwd) +SRC := +SRC += $(shell find $(PWD) -name '*.c') + +OBJ := $(SRC:%.c=%.o) +LIB += $(BUILD_CFALGS) $(BUILD_LDFLAGS) -lpthread -lreadline -lncurses +INCLUDE = -Iinclude +INCLUDE+= -Wall +APP = firmware_upgrade +ELF_FILE = $(APP) +MAP_FILE = $(APP).map.sym + +.PHONY: build +build:$(OBJ) + $(CC) $^ -o $(ELF_FILE) $(LINKFLAGS) $(LIB) + $(NM) $(ELF_FILE) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' \ + | sort > $(MAP_FILE) + cp -p $(ELF_FILE) $(common_out_put_dir) + +%.o:%.c + $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@ + +.PHONY: install +install: + echo "firmware_upgrade install success." + cp -p $(ELF_FILE) $(common_out_put_dir) + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c new file mode 100644 index 000000000000..5b60b40ad1ba --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c @@ -0,0 +1,216 @@ +/* + * This file is derived from crc32.c from the zlib-1.1.3 distribution + * by Jean-loup Gailly and Mark Adler. + */ + +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-1998 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ +/* xxxx: by chihl for compile error */ +#if 1 + +#ifndef FAR +#define FAR +#endif + +typedef unsigned char Byte; /* 8 bits */ +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +typedef Byte FAR Bytef; +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifndef OF /* function prototypes */ +#ifdef STDC +#define OF(args) args +#else +#define OF(args) () +#endif +#endif + +#endif + +#define local static +#define ZEXPORT /* empty */ +unsigned long crc32 (unsigned long, const unsigned char *, unsigned int); + +#define DYNAMIC_CRC_TABLE + +#ifdef DYNAMIC_CRC_TABLE + +local int crc_table_empty = 1; +local uLongf crc_table[256]; +local void make_crc_table OF((void)); + +/* + Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all + the information needed to generate CRC's on data a byte at a time for all + combinations of CRC register values and incoming bytes. +*/ +local void make_crc_table() +{ + uLong c; + int n, k; + uLong poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* make exclusive-or pattern from polynomial (0xedb88320L) */ + poly = 0L; + for (n = 0; n < sizeof(p)/sizeof(Byte); n++) + poly |= 1L << (31 - p[n]); + + for (n = 0; n < 256; n++) + { + c = (uLong)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[n] = c; + } + crc_table_empty = 0; +} +#else +/* ======================================================================== + * Table of CRC-32's of all single-byte values (made by make_crc_table) + */ +local const uLongf crc_table[256] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, + 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, + 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, + 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, + 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, + 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, + 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, + 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, + 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, + 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, + 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, + 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, + 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, + 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, + 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, + 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, + 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, + 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, + 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, + 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, + 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, + 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, + 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, + 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, + 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, + 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, + 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, + 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, + 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, + 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, + 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, + 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, + 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, + 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, + 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, + 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, + 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, + 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, + 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, + 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, + 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, + 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, + 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, + 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, + 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, + 0x2d02ef8dL +}; +#endif + +#if 0 +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const uLongf * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) make_crc_table(); +#endif + return (const uLongf *)crc_table; +} +#endif + +/* ========================================================================= */ +#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); +#define DO2(buf) DO1(buf); DO1(buf); +#define DO4(buf) DO2(buf); DO2(buf); +#define DO8(buf) DO4(buf); DO4(buf); + +/* ========================================================================= */ +uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len) +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif + crc = crc ^ 0xffffffffL; + while (len >= 8) + { + DO8(buf); + len -= 8; + } + if (len) do { + DO1(buf); + } while (--len); + return crc ^ 0xffffffffL; +} + +#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) + +/* No ones complement version. JFFS2 (and other things ?) + * don't use ones compliment in their CRC calculations. + */ +uLong ZEXPORT crc32_no_comp(uLong crc, const Bytef *buf, uInt len) +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif + while (len >= 8) + { + DO8(buf); + len -= 8; + } + if (len) do { + DO1(buf); + } while (--len); + + return crc; +} + +#endif /* CFG_CMD_JFFS2 */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c new file mode 100644 index 000000000000..dc1b1ccfc70a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c @@ -0,0 +1,60 @@ +/* + * debug.c + * firmware upgrade debug switch control + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int is_debug_on = DEBUG_IGNORE; + +/* + * firmware_upgrade_debug + * function: Debug switch + * Parses the file "/var/tmp/.firmware_upgrade_debug" and returns the corresponding debug level + * return:off--DEBUG_OFF, app debug on---DEBUG_APP_ON, kernel debug on--DEBUG_KERN_ON, + * all debug on--DEBUG_ALL_ON, other--DEBUG_IGNORE + */ +int firmware_upgrade_debug(void) +{ + int size; + FILE *fp; + char debug_info[DEBUG_INFO_LEN]; + + fp = fopen(DEBUG_FILE, "r"); + if (fp == NULL) { + return DEBUG_IGNORE; + } + + mem_clear(debug_info, DEBUG_INFO_LEN); + size = fread(debug_info, DEBUG_INFO_LEN - 1, 1, fp); + if (size < 0) { + fclose(fp); + return DEBUG_IGNORE; + } + + if (strncmp(debug_info, DEBUG_ON_INFO, 1) == 0) { + fclose(fp); + return DEBUG_APP_ON; + } + + if (strncmp(debug_info, DEBUG_ON_ALL, 1) == 0) { + fclose(fp); + return DEBUG_ALL_ON; + } + + if (strncmp(debug_info, DEBUG_OFF_INFO, 1) == 0) { + fclose(fp); + return DEBUG_OFF; + } + + fclose(fp); + return DEBUG_IGNORE; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c new file mode 100644 index 000000000000..ecdc37ef350f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c @@ -0,0 +1,985 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int header_offset; + +static firmware_file_name_t firmware_file_str[] = { + {"VME", FIRMWARE_VME}, + {"ISC", FIRMWARE_ISC}, + {"JBI", FIRMWARE_JBI}, + {"SPI-LOGIC-DEV", FIRMWARE_SPI_LOGIC_DEV}, + {"SYSFS", FIRMWARE_SYSFS_DEV}, + {"MTD", FIRMWARE_MTD}, +}; + +/** + * firmware_error_type + * function:set error code + * @action: param[in] The stage where the error occurs + * @info: param[in] Upgrade file information + * return value: error code + */ +int firmware_error_type(int action, name_info_t *info) +{ + if (info == NULL) { + return ERR_FW_UPGRADE; + } + + if((info->type <= FIRMWARE_UNDEF_TYPE) || (info->type > FIRMWARE_OTHER)) { + return ERR_FW_UPGRADE; + } + + if (info->type == FIRMWARE_CPLD) { + switch (action) { + case FIRMWARE_ACTION_CHECK: + return ERR_FW_CHECK_CPLD_UPGRADE; + case FIRMWARE_ACTION_MATCH: + return ERR_FW_MATCH_CPLD_UPGRADE; + case FIRMWARE_ACTION_VERCHECK: + return ERR_FW_SAMEVER_CPLD_UPGRADE; + case FIRMWARE_ACTION_UPGRADE: + return ERR_FW_DO_CPLD_UPGRADE; + case FIRMWARE_ACTION_SUPPORT: + return ERR_FW_DO_UPGRADE_NOT_SUPPORT; + default: + return ERR_FW_UPGRADE; + } + } else if (info->type == FIRMWARE_FPGA) { + switch (action) { + case FIRMWARE_ACTION_CHECK: + return ERR_FW_CHECK_FPGA_UPGRADE; + case FIRMWARE_ACTION_MATCH: + return ERR_FW_MATCH_FPGA_UPGRADE; + case FIRMWARE_ACTION_VERCHECK: + return ERR_FW_SAMEVER_FPGA_UPGRADE; + case FIRMWARE_ACTION_UPGRADE: + return ERR_FW_DO_FPGA_UPGRADE; + case FIRMWARE_ACTION_SUPPORT: + return ERR_FW_DO_UPGRADE_NOT_SUPPORT; + default: + return ERR_FW_UPGRADE; + } + } else { + switch (action) { + case FIRMWARE_ACTION_CHECK: + return ERR_FW_CHECK_UPGRADE; + case FIRMWARE_ACTION_MATCH: + return ERR_FW_MATCH_UPGRADE; + case FIRMWARE_ACTION_VERCHECK: + return ERR_FW_SAMEVER_UPGRADE; + case FIRMWARE_ACTION_UPGRADE: + return ERR_FW_DO_UPGRADE; + case FIRMWARE_ACTION_SUPPORT: + return ERR_FW_DO_UPGRADE_NOT_SUPPORT; + default: + return ERR_FW_UPGRADE; + } + } + +} + +/* + * firmware_check_file_info + * function:Check the file information to determine that the file is available for use on the device + * @info: param[in] Upgrade file information + * @main_type : param[in] main type + * @sub_type : param[in] sub type + * @slot : param[in] 0--main, sub slot starts at 1 + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_check_file_info(name_info_t *info, int main_type, int sub_type, int slot) +{ + int i; + + dbg_print(is_debug_on, "Check file info.\n"); + /* Check the mainboard type */ + for (i = 0; i < MAX_DEV_NUM; i++) { + if (main_type == info->card_type[i]) { + dbg_print(is_debug_on, "main type is 0x%x \n", main_type); + break; + } + } + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: The main type[0x%x] is not matched \n", main_type); + return firmware_error_type(FIRMWARE_ACTION_MATCH, info); + } + + /* Check the sub board type, if firwmare upgrade sub board, then sub_type must be 0 */ + for (i = 0; i < MAX_DEV_NUM; i++) { + if (sub_type == info->sub_type[i]) { + dbg_print(is_debug_on, "sub type is 0x%x \n", sub_type); + break; + } + } + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: The sub type[0x%x] is not matched \n", sub_type); + return firmware_error_type(FIRMWARE_ACTION_MATCH, info); + } + + /* if firwmare upgrade main board, then sub_type must be 0 and slot must be 0 + * if firwmare upgrade sub board, then sub_type must not be 0 and slot must not be 0 */ + if (((sub_type != 0) && (slot < 1)) || ((sub_type == 0) && (slot != 0))) { + dbg_print(is_debug_on, "Error: The sub type[0x%x] is not match slot %d error.\n", sub_type, slot); + return firmware_error_type(FIRMWARE_ACTION_MATCH, info); + } + + dbg_print(is_debug_on, "Success check file info.\n"); + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_get_dev_file_name + * function:Gets the name of the device file + * @info: param[in] Upgrade file information + * @len: param[in] Device file name length + * @file_name: param[out] Device file name + */ +static int firmware_get_dev_file_name(name_info_t *info, char *file_name, int len) +{ + int ret; + + ret = FIRMWARE_SUCCESS; + switch(info->file_type) { + case FIRMWARE_VME: + snprintf(file_name, len, "/dev/firmware_cpld_ispvme%d", info->chain); + break; + case FIRMWARE_ISC: + case FIRMWARE_JBI: + snprintf(file_name, len, "/dev/firmware_cpld%d", info->chain); + break; + case FIRMWARE_SPI_LOGIC_DEV: + case FIRMWARE_SYSFS_DEV: + case FIRMWARE_MTD: + snprintf(file_name, len, "/dev/firmware_sysfs%d", info->chain); + break; + default: + ret = FIRMWARE_FAILED; + break; + } + + return ret; + } + +/** + * firmware_check_chip_verison + * function: Check chip version + * @fd: param[in] Device file descriptor + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +int firmware_check_chip_verison(int fd, name_info_t *info) +{ + int ret; + cmd_info_t cmd_info; + char version[FIRMWARE_NAME_LEN + 1]; + + dbg_print(is_debug_on, "Check chip version.\n"); + mem_clear(version, FIRMWARE_NAME_LEN); + cmd_info.size = FIRMWARE_NAME_LEN; + cmd_info.data = (void *) version; + + /* Ignore version checking */ + if (strncmp("v", info->version, 1) == 0) { + dbg_print(is_debug_on, "Skip check chip version.\n"); + return FIRMWARE_SUCCESS; + } + + /* Get the program version from the device file */ + ret = ioctl(fd, FIRMWARE_GET_VERSION, &cmd_info); + if (ret < 0) { + dbg_print(is_debug_on, "Error: Failed to get version(chain %d, version %s).\n", + info->chain, info->version); + return firmware_error_type(FIRMWARE_ACTION_CHECK, NULL); + } + dbg_print(is_debug_on, "Chip verion: %s, file chip verion: %s.\n", version, info->version); + + /* The device version is the same and does not upgrade */ + if (strcmp(version, info->version) == 0) { + dbg_print(is_debug_on, "the file program version is same as the firmware version %s \n", + info->version); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + dbg_print(is_debug_on, "Check version pass.\n"); + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_get_file_size + * function: Gets the upgrade file size + * @file_name: param[in] Upgrade file name + * @size: param[out] Upgrade file size + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_get_file_size(char *file_name, uint32_t *size) +{ + int ret; + struct stat buf; + + ret = stat(file_name, &buf); + if (ret < 0) { + return FIRMWARE_FAILED; + } + + if (buf.st_size < 0 || buf.st_size - header_offset < 0) { + return FIRMWARE_FAILED; + } + /* Remove the upgrade file header information to actually upgrade the content size */ + *size = buf.st_size - header_offset; + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_get_file_info + * function: Gets the contents of the upgrade file + * @file_name: param[in] Upgrade file name + * @size: param[in] Upgrade file size + * @buf: param[out] Upgrade the file content + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_get_file_info(char *file_name, uint8_t *buf, uint32_t size) +{ + FILE *fp; + int len; + int ret; + + fp = fopen(file_name, "r"); + if (fp == NULL) { + return FIRMWARE_FAILED; + } + /* Removes the contents of the upgrade file header information */ + ret = fseek(fp, header_offset, SEEK_SET); + if (ret < 0) { + fclose(fp); + return FIRMWARE_FAILED; + } + + len = fread(buf, size, 1, fp); + if (len < 0) { + fclose(fp); + return FIRMWARE_FAILED; + } + fclose(fp); + + return FIRMWARE_SUCCESS; +} + +/* +* firmware_upgrade +* function: firmware upgrade +* @file_name: param[in] Upgrade file name +* @info: param[in] Upgrade file information +* return value : success--FIRMWARE_SUCCESS, other fail return error code +*/ +static int firmware_upgrade(char *file_name, name_info_t *info) +{ + int ret; + int fd; + uint32_t upg_size; + uint8_t *upg_buf; + char dev_file_name[FIRMWARE_NAME_LEN]; + unsigned long crc; + + dbg_print(is_debug_on, "Upgrade firmware: %s.\n", file_name); + mem_clear(dev_file_name, FIRMWARE_NAME_LEN); + ret = firmware_get_dev_file_name(info, dev_file_name, FIRMWARE_NAME_LEN - 1); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get dev file name.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + fd = open(dev_file_name, O_RDWR); + if (fd < 0) { + dbg_print(is_debug_on, "Error: Failed to open %s.\n", dev_file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + +#if 0 + /* check chip name */ + ret = firmware_check_chip_name(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip name: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } +#endif + + /* Check chip version */ + ret = firmware_check_chip_verison(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip version: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the upgrade file size */ + ret = firmware_get_file_size(file_name, &upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get file size: %s.\n", file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + if (upg_size == 0) { + dbg_print(is_debug_on, "Error: The upgrade file is empty \n"); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + upg_buf = (uint8_t *) malloc(upg_size + 1); + if (upg_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for upgrade file info: %s.\n", + dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the contents of the upgrade file */ + mem_clear(upg_buf, upg_size + 1); + ret = firmware_get_file_info(file_name, upg_buf, upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to read file info: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* file crc32 check */ + crc = crc32(0, (const unsigned char *)upg_buf, (unsigned int)upg_size); + if (crc != info->crc32) { + dbg_print(is_debug_on, "Error: Failed to check file crc: %s.\n", file_name); + dbg_print(is_debug_on, "the crc value is : %#08x.\n", (unsigned int)crc); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + dbg_print(is_debug_on, "Start upgrading firmware, wait...\n"); + + /* Start firmware upgrade */ + switch (info->file_type) { + case FIRMWARE_VME: + dbg_print(is_debug_on, "start to ispvme upgrade: %s.\n", file_name); + ret = firmware_upgrade_ispvme(fd, file_name, info); + break; + case FIRMWARE_ISC: + case FIRMWARE_JBI: + dbg_print(is_debug_on, "start to upgrade: %s.\n", file_name); + ret = firmware_upgrade_jtag(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_SPI_LOGIC_DEV: + dbg_print(is_debug_on, "start to spi logic dev upgrade: %s.\n", file_name); + ret = firmware_upgrade_spi_logic_dev(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_SYSFS_DEV: + dbg_print(is_debug_on, "start to sysfs upgrade: %s.\n", file_name); + ret = firmware_upgrade_sysfs(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_MTD: + dbg_print(is_debug_on, "start to mtd device upgrade: %s.\n", file_name); + ret = firmware_upgrade_mtd(fd, upg_buf, upg_size, info); + break; + default: + dbg_print(is_debug_on, "Error: file type is not support: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + + dbg_print(is_debug_on, "Completed.\n"); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to upgrade: %s.\n", dev_file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + + free(upg_buf); + close(fd); + + return FIRMWARE_SUCCESS; +} + +/* +* firmware_upgrade_test +* function: firmware upgrade test +* @file_name: param[in] Upgrade file name +* @info: param[in] Upgrade file information +* return value : success--FIRMWARE_SUCCESS, other fail return error code +*/ +static int firmware_upgrade_test(char *file_name, name_info_t *info) +{ + int ret; + int fd; + uint32_t upg_size; + uint8_t *upg_buf; + char dev_file_name[FIRMWARE_NAME_LEN]; + unsigned long crc; + + dbg_print(is_debug_on, "Upgrade firmware test: %s.\n", file_name); + mem_clear(dev_file_name, FIRMWARE_NAME_LEN); + ret = firmware_get_dev_file_name(info, dev_file_name, FIRMWARE_NAME_LEN - 1); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get dev file name.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + fd = open(dev_file_name, O_RDWR); + if (fd < 0) { + dbg_print(is_debug_on, "Error: Failed to open %s.\n", dev_file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + +#if 0 + /* check chip name */ + ret = firmware_check_chip_name(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip name: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } +#endif + + /* Check chip version */ + ret = firmware_check_chip_verison(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip version: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the upgrade file size */ + ret = firmware_get_file_size(file_name, &upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get file size: %s.\n", file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + upg_buf = (uint8_t *) malloc(upg_size + 1); + if (upg_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for upgrade file info: %s.\n", + dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the contents of the upgrade file */ + mem_clear(upg_buf, upg_size + 1); + ret = firmware_get_file_info(file_name, upg_buf, upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to read file info: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* file crc32 check */ + crc = crc32(0, (const unsigned char *)upg_buf, (unsigned int)upg_size); + if (crc != info->crc32) { + dbg_print(is_debug_on, "Error: Failed to check file crc: %s.\n", file_name); + dbg_print(is_debug_on, "the crc value is : %#08x.\n", (unsigned int)crc); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + dbg_print(is_debug_on, "Start upgrading firmware test, wait...\n"); + + /* Start firmware upgrade */ + switch (info->file_type) { + case FIRMWARE_VME: + dbg_print(is_debug_on, "start to ispvme upgrade test: %s.\n", file_name); + /* WME upgrade link testing is the same as upgrading, using vme test file. */ + ret = firmware_upgrade_ispvme(fd, file_name, info); + break; + case FIRMWARE_ISC: + case FIRMWARE_JBI: + dbg_print(is_debug_on, "start to upgrade test: %s.\n", file_name); + ret = firmware_upgrade_jtag_test(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_SPI_LOGIC_DEV: + dbg_print(is_debug_on, "start to spi logic dev upgrade test: %s.\n", file_name); + ret = firmware_upgrade_spi_logic_dev_test(fd,info); + break; + case FIRMWARE_SYSFS_DEV: + dbg_print(is_debug_on, "start to sysfs upgrade test: %s.\n", file_name); + ret = firmware_upgrade_sysfs_test(fd, info); + break; + case FIRMWARE_MTD: + dbg_print(is_debug_on, "start to mtd device upgrade test: %s.\n", file_name); + ret = firmware_upgrade_mtd_test(fd, info); + break; + default: + dbg_print(is_debug_on, "Error: test file type is not support: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to upgrade test: %s ret=%d.\n", dev_file_name, ret); + free(upg_buf); + close(fd); + if (ret == FIRMWARE_NOT_SUPPORT) { + return firmware_error_type(FIRMWARE_ACTION_SUPPORT, info); + } else { + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + } + + free(upg_buf); + close(fd); + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_file_type_map + * function:Gets the corresponding upgrade file type from the upgrade file type list + * @value : param[in] file type name + * return value : file type, firmware_file_type_t + */ +static firmware_file_type_t firmware_upgrade_file_type_map(char *type_str) +{ + int type_num; + int i; + + type_num = (sizeof(firmware_file_str) /sizeof(firmware_file_str[0])); + for (i = 0; i < type_num; i++) { + if (!strncmp(firmware_file_str[i].firmware_file_name_str, type_str, + strlen(firmware_file_str[i].firmware_file_name_str))) { + return firmware_file_str[i].firmware_file_type; + } + } + + dbg_print(is_debug_on, "firmware file type unknown\n"); + return FIRMWARE_NONE; +} + +/* + * firmware_upgrade_parse_kv + * function:Parses the header information of the upgrade file based on the key and value + * @key: param[in] key + * @value : param[in] value + * @info : param[out] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_parse_kv(const char *key, const char *value, name_info_t *info) +{ + int i; + if (key == NULL || value == NULL) { + dbg_print(is_debug_on, "Error: failed to get ther key or value.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } else if (strcmp(key, FILEHEADER_DEVTYPE) == 0) { + /* main board type */ + for (i = 0; i < MAX_DEV_NUM && info->card_type[i]; i++); + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: card type is full for %s. \n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + info->card_type[i] = strtoul(value, NULL, 0); + } else if (strcmp(key, FILEHEADER_SUBTYPE) == 0) { + /* sub board type */ + for (i = 0; i < MAX_DEV_NUM && info->sub_type[i]; i++); + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: sub type is full for %s. \n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + info->sub_type[i] = strtoul(value, NULL, 0); + } else if (strcmp(key, FILEHEADER_TYPE) == 0) { + /* Device type */ + if (strcmp(value, FIRMWARE_CPLD_NAME) == 0) { + info->type = FIRMWARE_CPLD; + } else if (strcmp(value, FIRMWARE_FPGA_NAME) == 0) { + info->type = FIRMWARE_FPGA; + } else { + info->type = FIRMWARE_OTHER; + } + } else if (strcmp(key, FILEHEADER_CHAIN) == 0) { + /* link num */ + info->chain = strtoul(value, NULL, 10); + } else if (strcmp(key, FILEHEADER_CHIPNAME) == 0) { + /* chip name */ + if (strlen(value) >= FIRMWARE_NAME_LEN) { + dbg_print(is_debug_on, "Error: '%s' is too long for a chipname.\n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + mem_clear(info->chip_name, sizeof(info->chip_name)); + snprintf(info->chip_name, sizeof(info->chip_name) - 1, "%s", value); + } else if (strcmp(key, FILEHEADER_VERSION) == 0) { + /* version */ + if (strlen(value) >= FIRMWARE_NAME_LEN) { + dbg_print(is_debug_on, "Error: '%s' is too long for a version.\n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + mem_clear(info->version, sizeof(info->version)); + snprintf(info->version, sizeof(info->version) - 1, "%s", value); + } else if (strcmp(key, FILEHEADER_FILETYPE) == 0) { + /* file type */ + info->file_type = firmware_upgrade_file_type_map((char *)value); + } else if (strcmp(key, FILEHEADER_CRC) == 0) { + /* file crc32 */ + info->crc32 = strtoul(value, NULL, 0); + } else { + dbg_print(is_debug_on, "Warning: key '%s' is unknown. Continue anyway.\n", key); + return FIRMWARE_SUCCESS; + } + dbg_print(is_debug_on, "key %s is matched.\n", key); + return FIRMWARE_SUCCESS; + } + +/* + * firmware_upgrade_parse_check + * function:Check the results of header parsing + * @file_name: Upgrade file name + * @info : Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_parse_check(char *file_name, name_info_t *info) +{ + int i; + if (info->card_type[0] == 0) { + dbg_print(is_debug_on, "Error: %s card type is missing.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if ((info->type <= FIRMWARE_UNDEF_TYPE) || (info->type > FIRMWARE_OTHER)) { + dbg_print(is_debug_on, "Error: %s type is unknown.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if (strlen(info->chip_name) == 0) { + dbg_print(is_debug_on, "Error: %s chip_name is empty.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if (strlen(info->version) == 0) { + dbg_print(is_debug_on, "Error: %s version is empty.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if ((info->file_type <= FIRMWARE_UNDEF_FILE_TYPE) || (info->file_type > FIRMWARE_NONE)) { + dbg_print(is_debug_on, "Error: %s file type is unknown.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + dbg_print(is_debug_on, "The file header parse:(%s) \n" , file_name); + dbg_print(is_debug_on, " card type: "); + for (i = 0; i < MAX_DEV_NUM && info->card_type[i]; i++){ + dbg_print(is_debug_on, "0x%x, ", info->card_type[i]); + } + dbg_print(is_debug_on, "\n" + " sub type : "); + for (i = 0; i < MAX_DEV_NUM && info->sub_type[i]; i++){ + dbg_print(is_debug_on, "0x%x, ", info->sub_type[i]); + } + dbg_print(is_debug_on, "\n" + " type : %d, \n" + " chain : %d, \n" + " chip name: %s \n" + " version : %s \n" + " file type: %d \n" + " the crc32 value: %#x \n", + info->type, info->chain, info->chip_name, info->version, info->file_type, info->crc32); + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_read_header + * function:Read the header information of the upgrade file + * @file_name: param[in] Upgrade file name + * @info : param[out] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_read_header( char *file_name, name_info_t *info) +{ + FILE *fp; + char *charp; + char *charn; + char header_buffer[MAX_HEADER_SIZE]; + char header_key[MAX_HEADER_KV_SIZE]; + char header_var[MAX_HEADER_KV_SIZE]; + int ret; + int len; + + fp = fopen(file_name, "r"); + if (fp == NULL) { + dbg_print(is_debug_on, "Error: Failed to open file: %s. \n", file_name); + perror("fopen"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + mem_clear(header_buffer, sizeof(header_buffer)); + len = fread(header_buffer, MAX_HEADER_SIZE - 1, 1, fp); + fclose(fp); + if (len < 0) { + dbg_print(is_debug_on, "Error: Failed to read header : %s. \n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + header_buffer[MAX_HEADER_SIZE - 1] = 0; + + charp = strstr(header_buffer, "FILEHEADER(\n"); + if (charp == NULL) { + dbg_print(is_debug_on, "Error: The file format %s is wrong. \n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + charp += strlen("FILEHEADER(\n"); + + dbg_print(is_debug_on, "File parse start.\n"); + mem_clear(info, sizeof(name_info_t)); + ret = 0; + charn = charp; + mem_clear(header_key, sizeof(header_key)); + while (*charn != ')') { + charn = strpbrk(charp, "=,)\n"); + if (charn == NULL) { + dbg_print(is_debug_on, "Error: The parser can't find mark.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if (charn - charp >= MAX_HEADER_KV_SIZE) { + dbg_print(is_debug_on, "Error: The parser find a overflow mark.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + switch (*charn) { + case '=': + mem_clear(header_key, sizeof(header_key)); + memcpy(header_key, charp, charn - charp); + break; + case '\n': + case ',': + mem_clear(header_var, sizeof(header_var)); + memcpy(header_var, charp, charn - charp); + dbg_print(is_debug_on, "Parser: %s = %s .\n", header_key, header_var); + firmware_upgrade_parse_kv(header_key, header_var, info); + break; + case ')': + break; + default: + dbg_print(is_debug_on, "Error: The parser get unexpected mark '%c(0x%02X)'.\n", *charn, *charn); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + charp = (charn + 1); + } + + ret = firmware_upgrade_parse_check(file_name, info); + if (ret != FIRMWARE_SUCCESS) { + return FIRMWARE_FAILED; + } + + header_offset = charp + 1 - header_buffer; /* charp at '\n' */ + dbg_print(is_debug_on,"the header offset is %d \n", header_offset); + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_one_file + * function: upgrade file + * @file_name: Upgrade file name + * @main_type: main board type + * @sub_type: sub board type + * @slot: 0--main, sub slot starts at 1 + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_one_file(char *file_name, int main_type, int sub_type, int slot) +{ + int ret; + name_info_t info; + + if ((slot < 0) || (file_name == NULL)) { + dbg_print(is_debug_on, "Failed firmware_upgrade_one_file parameter err.\n"); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "firmware upgrade %s 0x%x 0x%x %d\n", file_name, main_type, sub_type, slot); + /* Read the header information of the upgrade file */ + ret = firmware_upgrade_read_header(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to get file header: %s\n", file_name); + return ret; + } + + /* Check the file information to determine that the file is available for use on the device */ + ret = firmware_check_file_info(&info, main_type, sub_type, slot); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "File is not match with the device: %s.\n", file_name); + return ret; + } + + /* The link number corresponding to the upgrade file is calculated based on the slot number. + 16 links are reserved for each slot. main boade slot is 0. */ + info.chain += slot * FIRMWARE_SLOT_MAX_NUM; + ret = firmware_upgrade(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to upgrade: %s.\n", file_name); + return ret; + } + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_file_test + * function: upgrade file + * @file_name: Upgrade file name + * @main_type: main board type + * @sub_type: sub board type + * @slot: 0--main, sub slot starts at 1 + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_file_test(char *file_name, int main_type, int sub_type, int slot) +{ + int ret; + name_info_t info; + + if ((slot < 0) || (file_name == NULL)) { + dbg_print(is_debug_on, "Failed firmware_upgrade_one_file parameter err.\n"); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "firmware upgrade %s 0x%x 0x%x %d\n", file_name, main_type, sub_type, slot); + /* Read the header information of the upgrade file */ + ret = firmware_upgrade_read_header(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to get file header: %s, ret=%d\n", file_name, ret); + return ret; + } + + /* Check the file information to determine that the file is available for use on the device */ + ret = firmware_check_file_info(&info, main_type, sub_type, slot); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "File is not match with the device: %s, ret=%d.\n", file_name, ret); + return ret; + } + + /* The link number corresponding to the upgrade file is calculated based on the slot number. + 16 links are reserved for each slot. main boade slot is 0. */ + info.chain += slot * FIRMWARE_SLOT_MAX_NUM; + ret = firmware_upgrade_test(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to upgrade: %s, ret=%d\n", file_name, ret); + return ret; + } + + return FIRMWARE_SUCCESS; +} + +static int firmware_upgrade_data_dump(char *argv[]) +{ + int ret; + uint32_t offset, len; + + /* dump by type */ + if (strcmp(argv[2], "spi_logic_dev") == 0) { + /* usag: firmware_upgrade dump spi_logic_dev dev_path offset size print/record_file_path */ + offset = strtoul(argv[4], NULL, 0); + len = strtoul(argv[5], NULL, 0); + /* offset needs align by 256 bytes */ + if ((offset & 0xff) || (len == 0)) { + dbg_print(is_debug_on,"only support offset align by 256 bytes.\n"); + return FIRMWARE_FAILED; + } + dbg_print(is_debug_on, "start to dump %s data. offset:0x%x, len:0x%x\n", argv[2], offset, len); + ret = firmware_upgrade_spi_logic_dev_dump(argv[3], offset, len, argv[6]); + } else { + dbg_print(is_debug_on, "Error: %s not support dump data.\n", argv[2]); + return FIRMWARE_FAILED; + } + + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to dump %s data. ret:%d\n", argv[3], ret); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +int main(int argc, char *argv[]) +{ + int ret; + int main_type, sub_type, slot; + + is_debug_on = firmware_upgrade_debug(); + + signal(SIGTERM, SIG_IGN); /* ignore kill signal */ + signal(SIGINT, SIG_IGN); /* ignore ctrl+c signal */ + signal(SIGTSTP, SIG_IGN); /* ignore ctrl+z signal */ + + if ((argc != 5) && (argc != 6) && (argc != 7)) { + printf("Use:\n"); + printf(" upgrade file : firmware_upgrade file main_type sub_type slot\n"); + printf(" upgrade test : firmware_upgrade test file main_type sub_type slot\n"); + printf(" spi_logic_dev dump : firmware_upgrade dump spi_logic_dev dev_path offset size print/record_file_path\n"); + dbg_print(is_debug_on, "Failed to upgrade the number of argv: %d.\n", argc); + return ERR_FW_UPGRADE; + } + + if (argc == 5) { + main_type = strtoul(argv[2], NULL, 16); + sub_type = strtoul(argv[3], NULL, 16); + slot = strtoul(argv[4], NULL, 10); + printf("+================================+\n"); + printf("|Begin to upgrade, please wait...|\n"); + ret = firmware_upgrade_one_file(argv[1], main_type, sub_type, slot); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to upgrade a firmware file: %s. (%d)\n", argv[1], ret); + printf("| Upgrade failed! |\n"); + printf("+================================+\n"); + return ret; + } + + printf("| Upgrade succeeded! |\n"); + printf("+================================+\n"); + dbg_print(is_debug_on, "Sucess to upgrade a firmware file: %s.\n", argv[1]); + return FIRMWARE_SUCCESS; + } else if ((argc == 6) && (strcmp(argv[1], "test") == 0)) { + main_type = strtoul(argv[3], NULL, 16); + sub_type = strtoul(argv[4], NULL, 16); + slot = strtoul(argv[5], NULL, 10); + printf("+=====================================+\n"); + printf("|Begin to upgrade test, please wait...|\n"); + ret = firmware_upgrade_file_test(argv[2], main_type, sub_type, slot); + if (ret == FIRMWARE_SUCCESS) { + printf("| Upgrade test succeeded! |\n"); + printf("+=====================================+\n"); + dbg_print(is_debug_on, "Sucess to upgrade test a firmware file: %s.\n", argv[2]); + return FIRMWARE_SUCCESS; + } else if (ret == ERR_FW_DO_UPGRADE_NOT_SUPPORT) { + dbg_print(is_debug_on, "do not support to upgrade test a firmware file: %s. (%d)\n", argv[2], ret); + printf("| Not support to upgrade test! |\n"); + printf("+=====================================+\n"); + return ret; + } else { + dbg_print(is_debug_on, "Failed to upgrade test a firmware file: %s. (%d)\n", argv[2], ret); + printf("| Upgrade test failed! |\n"); + printf("+=====================================+\n"); + return ret; + } + } else if (strcmp(argv[1], "dump") == 0) { + /* print device data */ + ret = firmware_upgrade_data_dump(argv); + if (ret == FIRMWARE_SUCCESS) { + printf("dump data succeeded.\n"); + return FIRMWARE_SUCCESS; + } else { + printf("dump data failed. ret:%d\n", ret); + return ret; + } + } + + printf("+=================+\n"); + printf("| UPGRADE FAIL! |\n"); + printf("+=================+\n"); + + return ERR_FW_UPGRADE; + } diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c new file mode 100644 index 000000000000..c43c9095fda6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c @@ -0,0 +1,263 @@ +/********************************************************************************* +* Lattice Semiconductor Corp. Copyright 2000-2008 +* +* This is the hardware.c of ispVME V12.1 for JTAG programmable devices. +* All the functions requiring customization are organized into this file for +* the convinience of porting. +*********************************************************************************/ +/********************************************************************************* +* Revision History: +* +* 09/11/07 NN Type cast mismatch variables +* 09/24/07 NN Added calibration function. +* Calibration will help to determine the system clock frequency +* and the count value for one micro-second delay of the target +* specific hardware. +* Modified the ispVMDelay function +* Removed Delay Percent support +* Moved the sclock() function from ivm_core.c to hardware.c +*********************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/******************************************************************************** +* Declaration of global variables +* +*********************************************************************************/ + +unsigned char g_siIspPins = 0x00; /*Keeper of JTAG pin state*/ +unsigned short g_usInPort = 0x379; /*Address of the TDO pin*/ +unsigned short g_usOutPort = 0x378; /*Address of TDI, TMS, TCK pin*/ +unsigned short g_usCpu_Frequency = 1000; /*Enter your CPU frequency here, unit in MHz.*/ + +/********************************************************************************* +* This is the definition of the bit locations of each respective +* signal in the global variable g_siIspPins. +* +* NOTE: Users must add their own implementation here to define +* the bit location of the signal to target their hardware. +* The example below is for the Lattice download cable on +* on the parallel port. +* +*********************************************************************************/ + +#if 0 +const unsigned char g_ucPinTDI = JTAG_TDI; /* Bit address of TDI */ +const unsigned char g_ucPinTCK = JTAG_TCK; /* Bit address of TCK */ +const unsigned char g_ucPinTMS = JTAG_TMS; /* Bit address of TMS */ +const unsigned char g_ucPinENABLE = JTAG_ENABLE; /* Bit address of ENABLE */ +const unsigned char g_ucPinTRST = JTAG_TRST; /* Bit address of TRST */ +const unsigned char g_ucPinTDO = JTAG_TDO; /* Bit address of TDO*/ +#endif +int g_file_fd = -1; +/*************************************************************** +* +* Functions declared in hardware.c module. +* +***************************************************************/ +void writePort(unsigned char a_ucPins, unsigned char a_ucValue); +unsigned char readPort(); +void sclock(); +void ispVMDelay(unsigned short a_usTimeDelay); +void calibration(void); + +/******************************************************************************** +* writePort +* To apply the specified value to the pins indicated. This routine will +* be modified for specific systems. +* As an example, this code uses the IBM-PC standard Parallel port, along with the +* schematic shown in Lattice documentation, to apply the signals to the +* JTAG pins. +* +* PC Parallel port pin Signal name Port bit address +* 2 g_ucPinTDI 1 +* 3 g_ucPinTCK 2 +* 4 g_ucPinTMS 4 +* 5 g_ucPinENABLE 8 +* 6 g_ucPinTRST 16 +* 10 g_ucPinTDO 64 +* +* Parameters: +* - a_ucPins, which is actually a set of bit flags (defined above) +* that correspond to the bits of the data port. Each of the I/O port +* bits that drives an isp programming pin is assigned a flag +* (through a #define) corresponding to the signal it drives. To +* change the value of more than one pin at once, the flags are added +* together, much like file access flags are. +* +* The bit flags are only set if the pin is to be changed. Bits that +* do not have their flags set do not have their levels changed. The +* state of the port is always manintained in the static global +* variable g_siIspPins, so that each pin can be addressed individually +* without disturbing the others. +* +* - a_ucValue, which is either HIGH (0x01 ) or LOW (0x00 ). Only these two +* values are valid. Any non-zero number sets the pin(s) high. +* +*********************************************************************************/ + +void writePort(unsigned char a_ucPins, unsigned char a_ucValue) +{ + switch (a_ucPins) { + case JTAG_TCK: + ioctl(g_file_fd, FIRMWARE_JTAG_TCK, &a_ucValue); + break; + case JTAG_TDI: + ioctl(g_file_fd, FIRMWARE_JTAG_TDI, &a_ucValue); + break; + case JTAG_TMS: + ioctl(g_file_fd, FIRMWARE_JTAG_TMS, &a_ucValue); + break; + case JTAG_ENABLE: + ioctl(g_file_fd, FIRMWARE_JTAG_EN, &a_ucValue); + break; + case JTAG_TRST: + //ioctl(g_file_fd, FIRMWARE_JTAG_TRST, &a_ucValue); + break; + default: + break; + } +} + +/********************************************************************************* +* +* readPort +* +* Returns the value of the TDO from the device. +* +**********************************************************************************/ +unsigned char readPort() +{ + unsigned char ucRet = 0; + + ioctl(g_file_fd, FIRMWARE_JTAG_TDO, &ucRet); + return (ucRet); +} + +/********************************************************************************* +* sclock +* +* Apply a pulse to TCK. +* +* This function is located here so that users can modify to slow down TCK if +* it is too fast (> 25MHZ). Users can change the IdleTime assignment from 0 to +* 1, 2... to effectively slowing down TCK by half, quarter... +* +*********************************************************************************/ +void sclock() +{ + unsigned short IdleTime = 0; //change to > 0 if need to slow down TCK + unsigned short usIdleIndex = 0; + IdleTime++; + for (usIdleIndex = 0; usIdleIndex < IdleTime; usIdleIndex++) { + writePort(JTAG_TCK, 0x01); + } + for (usIdleIndex = 0; usIdleIndex < IdleTime; usIdleIndex++) { + writePort(JTAG_TCK, 0x00); + } +} +/******************************************************************************** +* +* ispVMDelay +* +* +* Users must implement a delay to observe a_usTimeDelay, where +* bit 15 of the a_usTimeDelay defines the unit. +* 1 = milliseconds +* 0 = microseconds +* Example: +* a_usTimeDelay = 0x0001 = 1 microsecond delay. +* a_usTimeDelay = 0x8001 = 1 millisecond delay. +* +* This subroutine is called upon to provide a delay from 1 millisecond to a few +* hundreds milliseconds each time. +* It is understood that due to a_usTimeDelay is defined as unsigned short, a 16 bits +* integer, this function is restricted to produce a delay to 64000 micro-seconds +* or 32000 milli-second maximum. The VME file will never pass on to this function +* a delay time > those maximum number. If it needs more than those maximum, the VME +* file will launch the delay function several times to realize a larger delay time +* cummulatively. +* It is perfectly alright to provide a longer delay than required. It is not +* acceptable if the delay is shorter. +* +* Delay function example--using the machine clock signal of the native CPU------ +* When porting ispVME to a native CPU environment, the speed of CPU or +* the system clock that drives the CPU is usually known. +* The speed or the time it takes for the native CPU to execute one for loop +* then can be calculated as follows: +* The for loop usually is compiled into the ASSEMBLY code as shown below: +* LOOP: DEC RA; +* JNZ LOOP; +* If each line of assembly code needs 4 machine cycles to execute, +* the total number of machine cycles to execute the loop is 2 x 4 = 8. +* Usually system clock = machine clock (the internal CPU clock). +* Note: Some CPU has a clock multiplier to double the system clock for + the machine clock. +* +* Let the machine clock frequency of the CPU be F, or 1 machine cycle = 1/F. +* The time it takes to execute one for loop = (1/F ) x 8. +* Or one micro-second = F(MHz)/8; +* +* Example: The CPU internal clock is set to 100Mhz, then one micro-second = 100/8 = 12 +* +* The C code shown below can be used to create the milli-second accuracy. +* Users only need to enter the speed of the cpu. +* +**********************************************************************************/ +void ispVMDelay(unsigned short a_usTimeDelay) +{ + struct timespec ts; + + if (a_usTimeDelay & 0x8000) { + /* milliseconds */ + a_usTimeDelay &= 0x7FFF; + ts.tv_sec = (long int) (a_usTimeDelay / 1000); + ts.tv_nsec = (long int) (a_usTimeDelay % 1000) * 1000000ul; + } else { + /* microseconds */ + ts.tv_sec = 0; + ts.tv_nsec = (long int) a_usTimeDelay * 1000ul; + } + + nanosleep(&ts, NULL); +} + +/********************************************************************************* +* +* calibration +* +* It is important to confirm if the delay function is indeed providing +* the accuracy required. Also one other important parameter needed +* checking is the clock frequency. +* Calibration will help to determine the system clock frequency +* and the loop_per_micro value for one micro-second delay of the target +* specific hardware. +* +**********************************************************************************/ +void calibration(void) +{ + /*Apply 2 pulses to TCK.*/ + writePort(JTAG_TCK, 0x00); + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); + + /*Delay for 1 millisecond. Pass on 1000 or 0x8001 both = 1ms delay.*/ + ispVMDelay(0x8001); + + /*Apply 2 pulses to TCK*/ + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c new file mode 100644 index 000000000000..69a8e53852b5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c @@ -0,0 +1,837 @@ +/************************************************************** +* +* Lattice Semiconductor Corp. Copyright 2008 +* +* ispVME Embedded allows programming of Lattice's suite of FPGA +* devices on embedded systems through the JTAG port. The software +* is distributed in source code form and is open to re - distribution +* and modification where applicable. +* +* ispVME Embedded C Source comprised with 3 modules: +* ispvm_ui.c is the module provides input and output support. +* ivm_core.c is the module interpret the VME file(s). +* hardware.c is the module access the JTAG port of the device(s). +* +* The optional module cable.c is for supporting Lattice's parallel +* port ispDOWNLOAD cable on DOS and Windows 95/98 O/S. It can be +* requested from Lattice's ispVMSupport. +* +***************************************************************/ + +/************************************************************** +* +* Revision History of ispvm_ui.c +* +* 3/6/07 ht Added functions vme_out_char(),vme_out_hex(), +* vme_out_string() to provide output resources. +* Consolidate all printf() calls into the added output +* functions. +* +* 09/11/07 NN Added Global variables initialization +* 09/24/07 NN Added a switch allowing users to do calibration. +* Calibration will help to determine the system clock frequency +* and the count value for one micro-second delay of the target +* specific hardware. +* Removed Delay Percent support +* 11/15/07 NN moved the checking of the File CRC to the end of processing +* 08/28/08 NN Added Calculate checksum support. +***************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +/*************************************************************** +* +* File pointer to the VME file. +* +***************************************************************/ + +FILE *g_pVMEFile = NULL; + +/*************************************************************** +* +* Functions declared in this ispvm_ui.c module +* +***************************************************************/ +unsigned char GetByte(void); +void vme_out_char(unsigned char charOut); +void vme_out_hex(unsigned char hexOut); +void vme_out_string(char *stringOut); +void ispVMMemManager(signed char cTarget, unsigned short usSize); +void ispVMFreeMem(void); +void error_handler(short a_siRetCode, char *pszMessage); +signed char ispVM(const char *a_pszFilename); + +/*************************************************************** +* +* Global variables. +* +***************************************************************/ +unsigned short g_usPreviousSize = 0; +unsigned short g_usExpectedCRC = 0; + +/*************************************************************** +* +* External variables and functions declared in ivm_core.c module. +* +***************************************************************/ +extern signed char ispVMCode(); +extern void ispVMCalculateCRC32(unsigned char a_ucData); +extern void ispVMStart(); +extern void ispVMEnd(); +extern unsigned short g_usCalculatedCRC; +extern unsigned short g_usDataType; +extern unsigned char *g_pucOutMaskData, +*g_pucInData, +*g_pucOutData, +*g_pucHIRData, +*g_pucTIRData, +*g_pucHDRData, +*g_pucTDRData, +*g_pucOutDMaskData, +*g_pucIntelBuffer; +extern unsigned char *g_pucHeapMemory; +extern unsigned short g_iHeapCounter; +extern unsigned short g_iHEAPSize; +extern unsigned short g_usIntelDataIndex; +extern unsigned short g_usIntelBufferSize; +extern LVDSPair *g_pLVDSList; +//08/28/08 NN Added Calculate checksum support. +extern unsigned long g_usChecksum; +extern unsigned int g_uiChecksumIndex; + +/* Added reinit for call ispvme more than once */ +extern void ivm_core_reinit(); +/*************************************************************** +* +* External variables and functions declared in hardware.c module. +* +***************************************************************/ +extern void calibration(void); +extern unsigned short g_usCpu_Frequency; +extern int g_file_fd; + +/*************************************************************** +* +* Supported VME versions. +* +***************************************************************/ + +const char *const g_szSupportedVersions[] = { "__VME2.0", "__VME3.0", "____12.0", "____12.1", 0 }; + +/*************************************************************** +* +* GetByte +* +* Returns a byte to the caller. The returned byte depends on the +* g_usDataType register. If the HEAP_IN bit is set, then the byte +* is returned from the HEAP. If the LHEAP_IN bit is set, then +* the byte is returned from the intelligent buffer. Otherwise, +* the byte is returned directly from the VME file. +* +***************************************************************/ + +char* strlwr(char *str) +{ + char *orig = str; +// process the string + for (; *str != '\0'; str++) + *str = tolower(*str); + return orig; +} + +unsigned char GetByte() +{ + unsigned char ucData = 0; + + if (g_usDataType & HEAP_IN) { + + /*************************************************************** + * + * Get data from repeat buffer. + * + ***************************************************************/ + + if (g_iHeapCounter > g_iHEAPSize) { + + /*************************************************************** + * + * Data over-run. + * + ***************************************************************/ + + return 0xFF; + } + + ucData = g_pucHeapMemory[g_iHeapCounter++]; + } + else if ( g_usDataType & LHEAP_IN ) { + + /*************************************************************** + * + * Get data from intel buffer. + * + ***************************************************************/ + + if (g_usIntelDataIndex >= g_usIntelBufferSize) { + + /*************************************************************** + * + * Data over-run. + * + ***************************************************************/ + + return 0xFF; + } + + ucData = g_pucIntelBuffer[g_usIntelDataIndex++]; + } + else { + + /*************************************************************** + * + * Get data from file. + * + ***************************************************************/ + + ucData = (unsigned char)fgetc(g_pVMEFile); + + if (feof(g_pVMEFile)) { + + /*************************************************************** + * + * Reached EOF. + * + ***************************************************************/ + + return 0xFF; + } + /*************************************************************** + * + * Calculate the 32-bit CRC if the expected CRC exist. + * + ***************************************************************/ + if( g_usExpectedCRC != 0) + { + ispVMCalculateCRC32(ucData); + } + } + + return (ucData); +} + +/*************************************************************** +* +* vme_out_char +* +* Send a character out to the output resource if available. +* The monitor is the default output resource. +* +* +***************************************************************/ +void vme_out_char(unsigned char charOut) +{ + dbg_print(is_debug_on, "%c", charOut); +} +/*************************************************************** +* +* vme_out_hex +* +* Send a character out as in hex format to the output resource +* if available. The monitor is the default output resource. +* +* +***************************************************************/ +void vme_out_hex(unsigned char hexOut) +{ + dbg_print(is_debug_on, "%.2X", hexOut); +} +/*************************************************************** +* +* vme_out_string +* +* Send a text string out to the output resource if available. +* The monitor is the default output resource. +* +* +***************************************************************/ +void vme_out_string(char *stringOut) +{ + dbg_print(is_debug_on,"%s",stringOut); +} +/*************************************************************** +* +* ispVMMemManager +* +* Allocate memory based on cTarget. The memory size is specified +* by usSize. +* +***************************************************************/ + +void ispVMMemManager(signed char cTarget, unsigned short usSize) +{ + switch (cTarget) { + case XTDI: + case TDI: + if (g_pucInData != NULL) { + if (g_usPreviousSize == usSize) { /*memory exist*/ + break; + } + else { + free(g_pucInData); + g_pucInData = NULL; + } + } + g_pucInData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + case XTDO: + case TDO: + if (g_pucOutData != NULL) { + if (g_usPreviousSize == usSize) { /*already exist*/ + break; + } + else { + free(g_pucOutData); + g_pucOutData = NULL; + } + } + g_pucOutData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + break; + case MASK: + if (g_pucOutMaskData != NULL) { + if (g_usPreviousSize == usSize) { /*already allocated*/ + break; + } + else { + free(g_pucOutMaskData); + g_pucOutMaskData = NULL; + } + } + g_pucOutMaskData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + break; + case HIR: + if (g_pucHIRData != NULL) { + free(g_pucHIRData); + g_pucHIRData = NULL; + } + g_pucHIRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case TIR: + if (g_pucTIRData != NULL) { + free(g_pucTIRData); + g_pucTIRData = NULL; + } + g_pucTIRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case HDR: + if (g_pucHDRData != NULL) { + free(g_pucHDRData); + g_pucHDRData = NULL; + } + g_pucHDRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case TDR: + if (g_pucTDRData != NULL) { + free(g_pucTDRData); + g_pucTDRData = NULL; + } + g_pucTDRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case HEAP: + if (g_pucHeapMemory != NULL) { + free(g_pucHeapMemory); + g_pucHeapMemory = NULL; + } + g_pucHeapMemory = (unsigned char *)malloc(usSize + 2); + break; + case DMASK: + if (g_pucOutDMaskData != NULL) { + if (g_usPreviousSize == usSize) { /*already allocated*/ + break; + } + else { + free(g_pucOutDMaskData); + g_pucOutDMaskData = NULL; + } + } + g_pucOutDMaskData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + break; + case LHEAP: + if (g_pucIntelBuffer != NULL) { + free(g_pucIntelBuffer); + g_pucIntelBuffer = NULL; + } + g_pucIntelBuffer = (unsigned char *)malloc(usSize + 2); + break; + case LVDS: + if (g_pLVDSList != NULL) { + free(g_pLVDSList); + g_pLVDSList = NULL; + } + g_pLVDSList = (LVDSPair * )calloc(usSize, sizeof(LVDSPair)); + break; + default: + return; + } +} + +/*************************************************************** +* +* ispVMFreeMem +* +* Free memory that were dynamically allocated. +* +***************************************************************/ + +void ispVMFreeMem() +{ + if (g_pucHeapMemory != NULL) { + free(g_pucHeapMemory); + g_pucHeapMemory = NULL; + } + + if (g_pucOutMaskData != NULL) { + free(g_pucOutMaskData); + g_pucOutMaskData = NULL; + } + + if (g_pucInData != NULL) { + free(g_pucInData); + g_pucInData = NULL; + } + + if (g_pucOutData != NULL) { + free(g_pucOutData); + g_pucOutData = NULL; + } + + if (g_pucHIRData != NULL) { + free(g_pucHIRData); + g_pucHIRData = NULL; + } + + if (g_pucTIRData != NULL) { + free(g_pucTIRData); + g_pucTIRData = NULL; + } + + if (g_pucHDRData != NULL) { + free(g_pucHDRData); + g_pucHDRData = NULL; + } + + if (g_pucTDRData != NULL) { + free(g_pucTDRData); + g_pucTDRData = NULL; + } + + if (g_pucOutDMaskData != NULL) { + free(g_pucOutDMaskData); + g_pucOutDMaskData = NULL; + } + + if (g_pucIntelBuffer != NULL) { + free(g_pucIntelBuffer); + g_pucIntelBuffer = NULL; + } + + if (g_pLVDSList != NULL) { + free(g_pLVDSList); + g_pLVDSList = NULL; + } +} + +/*************************************************************** +* +* error_handler +* +* Reports the error message. +* +***************************************************************/ + +void error_handler(short a_siRetCode, char *pszMessage) +{ + const char *pszErrorMessage[] = { "pass", + "verification fail", + "can't find the file", + "wrong file type", + "file error", + "option error", + "crc verification error" }; + + strcpy(pszMessage, pszErrorMessage[-a_siRetCode]); +} +/*************************************************************** +* +* ispVM +* +* The entry point of the ispVM embedded. If the version and CRC +* are verified, then the VME will be processed. +* +***************************************************************/ +signed char ispVM(const char *a_pszFilename) +{ + char szFileVersion[9] = { 0 }; + signed char cRetCode = 0; + signed char cIndex = 0; + signed char cVersionIndex = 0; + unsigned char ucReadByte = 0; + int ret; + /*************************************************************** + * + * Global variables initialization. + * + * 09/11/07 NN Added + ***************************************************************/ + g_pucHeapMemory = NULL; + g_iHeapCounter = 0; + g_iHEAPSize = 0; + g_usIntelDataIndex = 0; + g_usIntelBufferSize = 0; + g_usPreviousSize = 0; + + /*************************************************************** + * + * Open a file pointer to the VME file. + * + ***************************************************************/ + + if ((g_pVMEFile = fopen(a_pszFilename, "rb")) == NULL) { + return VME_FILE_READ_FAILURE; + } + /* Skip the contents of the file header */ + ret=fseek(g_pVMEFile, header_offset, SEEK_SET); + if (ret < 0) { + vme_out_string("Failed to skip header.\n"); + fclose(g_pVMEFile); + g_pVMEFile = NULL; + return VME_ARGUMENT_FAILURE; + } + + g_usCalculatedCRC = 0; + g_usExpectedCRC = 0; + ucReadByte = GetByte(); + switch (ucReadByte) { + case FILE_CRC: + + /*************************************************************** + * + * Read and store the expected CRC to do the comparison at the end. + * Only versions 3.0 and higher support CRC protection. + * + ***************************************************************/ + + g_usExpectedCRC = (unsigned char)fgetc(g_pVMEFile); + g_usExpectedCRC <<= 8; + g_usExpectedCRC |= fgetc(g_pVMEFile); + + /*************************************************************** + * + * Read and store the version of the VME file. + * + ***************************************************************/ + + for (cIndex = 0; cIndex < 8; cIndex++) { + szFileVersion[cIndex] = GetByte(); + } + break; + default: + + /*************************************************************** + * + * Read and store the version of the VME file. Must be version 2.0. + * + ***************************************************************/ + + szFileVersion[0] = (signed char)ucReadByte; + for (cIndex = 1; cIndex < 8; cIndex++) { + szFileVersion[cIndex] = GetByte(); + } + + break; + } + + /*************************************************************** + * + * Compare the VME file version against the supported version. + * + ***************************************************************/ + for (cVersionIndex = 0; g_szSupportedVersions[cVersionIndex] != 0; cVersionIndex++) { + for (cIndex = 0; cIndex < 8; cIndex++) { + if (szFileVersion[cIndex] != g_szSupportedVersions[cVersionIndex][cIndex]) { + cRetCode = VME_VERSION_FAILURE; + break; + } + cRetCode = 0; + } + + if (cRetCode == 0) { + + /*************************************************************** + * + * Found matching version, break. + * + ***************************************************************/ + + break; + } + } + + if (cRetCode < 0) { + + /*************************************************************** + * + * VME file version failed to match the supported versions. + * + ***************************************************************/ + + fclose(g_pVMEFile); + g_pVMEFile = NULL; + return VME_VERSION_FAILURE; + } + + /*************************************************************** + * + * Enable the JTAG port to communicate with the device. + * Set the JTAG state machine to the Test-Logic/Reset State. + * + ***************************************************************/ + ispVMStart(); + + /*************************************************************** + * + * Process the VME file. + * + ***************************************************************/ + + cRetCode = ispVMCode(); + + /*************************************************************** + * + * Set the JTAG State Machine to Test-Logic/Reset state then disable + * the communication with the JTAG port. + * + ***************************************************************/ + + ispVMEnd(); + + fclose(g_pVMEFile); + g_pVMEFile = NULL; + + ispVMFreeMem(); + + /*************************************************************** + * + * Compare the expected CRC versus the calculated CRC. + * + ***************************************************************/ + + if (cRetCode == 0 && g_usExpectedCRC != 0 && (g_usExpectedCRC != g_usCalculatedCRC)) { + printf("Expected CRC: 0x%.4X\n", g_usExpectedCRC); + printf("Calculated CRC: 0x%.4X\n", g_usCalculatedCRC); + return VME_CRC_FAILURE; + } + + return (cRetCode); +} + +/*************************************************************** +* +* ispvme_reinit +* +* Reinit ispvm_ui variables. +* +***************************************************************/ +static void ispvm_ui_reinit() +{ + g_pVMEFile = NULL; + g_usPreviousSize = 0; + g_usExpectedCRC = 0; +} + +/*************************************************************** +* +* main +* +***************************************************************/ + +int ispvme_main(int argc, char *argv[], int file_fd, name_info_t *info) +{ + unsigned short iCommandLineIndex = 0; + short siRetCode = 0; + char szExtension[5] = { 0 }; + char szCommandLineArg[300] = { 0 }; + short sicalibrate = 0; + + ispvm_ui_reinit(); + ivm_core_reinit(); + + //08/28/08 NN Added Calculate checksum support. + g_usChecksum = 0; + g_uiChecksumIndex = 0; + + if (file_fd < 0) { + dbg_print(is_debug_on, "Error:firmware upgrade ispvme dev parameters failed.\r\n"); + return -1; + } else { + g_file_fd = file_fd; + } + +#if 0 + ret = firmware_check_chip_name(g_file_fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip name: %s.\n", file_name); + close(g_file_fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + ret = firmware_check_chip_verison(g_file_fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip version: %s.\n", file_name); + close(g_file_fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } +#endif + + vme_out_string(" Lattice Semiconductor Corp.\n"); + vme_out_string("\n ispVME(tm) V"); + vme_out_string(VME_VERSION_NUMBER); + vme_out_string(" Copyright 1998-2011.\n"); + vme_out_string("\nFor daisy chain programming of all in-system programmable devices\n\n"); + + if (argc < 2) { + vme_out_string("\nUsage: vme [option] vme_file [vme_file]\n"); + vme_out_string("Example: vme vme_file1.vme vme_file2.vme\n"); + vme_out_string("option -c: do the calibration.\n"); + vme_out_string("Example: vme -c\n"); + vme_out_string("Example: vme -c vme_file1.vme vme_file2.vme\n"); + vme_out_string("\n\n"); + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return -1; + } + for (iCommandLineIndex = 1; iCommandLineIndex < argc; iCommandLineIndex++) { + strncpy(szCommandLineArg, argv[iCommandLineIndex], sizeof(szCommandLineArg) - 1); + if (!strcmp(strlwr(szCommandLineArg), "-c") && (iCommandLineIndex == 1)) { + sicalibrate = 1; + } else if (!strcmp(strlwr(szCommandLineArg), "-c") && (iCommandLineIndex != 1)) { + vme_out_string("Error: calibrate option -c must be the first argument\n\n"); + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return -1; + //exit(1); + } else { + strcpy(szExtension, &szCommandLineArg[strlen(szCommandLineArg) - 4]); + strlwr(szExtension); + if (strcmp(szExtension, ".vme")) { + vme_out_string("Error: VME files must end with the extension *.vme\n\n"); + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return -1; + //exit(1); + } + } + } + siRetCode = 0; + + if (sicalibrate) { + calibration(); + } + for (iCommandLineIndex = 1; iCommandLineIndex < argc; iCommandLineIndex++) { /* Process all VME files sequentially */ + strcpy(szCommandLineArg, argv[iCommandLineIndex]); + if (!strcmp(strlwr(szCommandLineArg), "-c") && (iCommandLineIndex == 1)) { + + } else if (!strcmp(strlwr(szCommandLineArg), "-checksum")) { + + } else { + vme_out_string("Processing virtual machine file ("); + vme_out_string(szCommandLineArg); + vme_out_string(")......\n\n"); + siRetCode = ispVM(argv[iCommandLineIndex]); + if (siRetCode < 0) { + break; + } + } + } + + if (siRetCode < 0) { + error_handler(siRetCode, szCommandLineArg); + vme_out_string("Failed due to "); + vme_out_string(szCommandLineArg); + vme_out_string("\n\n"); + vme_out_string("+=======+\n"); + vme_out_string("| FAIL! |\n"); + vme_out_string("+=======+\n\n"); + } else { + vme_out_string("+=======+\n"); + vme_out_string("| PASS! |\n"); + vme_out_string("+=======+\n\n"); + //08/28/08 NN Added Calculate checksum support. + if (g_usChecksum != 0) { + g_usChecksum &= 0xFFFF; + printf("Data Checksum: %.4X\n\n", (unsigned int)g_usChecksum); + g_usChecksum = 0; + } + } + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return siRetCode; + //exit(siRetCode); +} + +/* + * firmware_upgrade_ispvme + * function: ispvme firmware upgrade + * @file_fd: param[in] Upgrade devices fd + * @upgrade_file_name: param[in] Upgrade file name + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +int firmware_upgrade_ispvme(int file_fd, char *upgrade_file_name, name_info_t *info) +{ + char *argv[2]; + int ret, rv, i, retry; + + argv[1] = upgrade_file_name; + + /* Initialize and enable */ + rv = ioctl(file_fd, FIRMWARE_JTAG_INIT,NULL); + if (rv < 0) { + vme_out_string("Failed to init GPIO.\n"); + return VME_ARGUMENT_FAILURE; + } + + i = 0; + retry = FIRMWARE_UPGRADE_RETRY_CNT; + + ret = 0; + while(i < retry) { + ret = ispvme_main(2, argv, file_fd, info); + if (ret < 0) { + i++; + dbg_print(is_debug_on, "%d times ispvme upgrade failed. ret %d.\n", i, ret); + continue; + } else { + dbg_print(is_debug_on, "ispvme upgrade success.\n"); + break; + } + } + + /* Upgrade completed, release */ + rv = ioctl(file_fd, FIRMWARE_JTAG_FINISH, NULL); + if (rv < 0) { + vme_out_string("Failed to release GPIO.\n"); + return VME_ARGUMENT_FAILURE; + } + + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c new file mode 100644 index 000000000000..540be481d35e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c @@ -0,0 +1,3097 @@ +/*************************************************************** +* +* Lattice Semiconductor Corp. Copyright 2009 +* +* ispVME Embedded allows programming of Lattice's suite of FPGA +* devices on embedded systems through the JTAG port. The software +* is distributed in source code form and is open to re - distribution +* and modification where applicable. +* +* Revision History of ivm_core.c module: +* 4/25/06 ht Change some variables from unsigned short or int +* to long int to make the code compiler independent. +* 5/24/06 ht Support using RESET (TRST) pin as a special purpose +* control pin such as triggering the loading of known +* state exit. +* 3/6/07 ht added functions to support output to terminals +* +* 09/24/07 NN Type cast mismatch variables +* Moved the sclock() function to hardware.c +* 08/28/08 NN Added Calculate checksum support. +* 4/1/09 Nguyen replaced the recursive function call codes on +* the ispVMLCOUNT function +* +***************************************************************/ + +#include +#include +#include +#include + +/*************************************************************** +* +* Global variables used to specify the flow control and data type. +* +* g_usFlowControl: flow control register. Each bit in the +* register can potentially change the +* personality of the embedded engine. +* g_usDataType: holds the data type of the current row. +* +***************************************************************/ + +unsigned short g_usFlowControl = 0x0000; +unsigned short g_usDataType = 0x0000; + +/*************************************************************** +* +* Global variables used to specify the ENDDR and ENDIR. +* +* g_ucEndDR: the state that the device goes to after SDR. +* g_ucEndIR: the state that the device goes to after SIR. +* +***************************************************************/ + +unsigned char g_ucEndDR = DRPAUSE; +unsigned char g_ucEndIR = IRPAUSE; + +/*************************************************************** +* +* Global variables used to support header/trailer. +* +* g_usHeadDR: the number of lead devices in bypass. +* g_usHeadIR: the sum of IR length of lead devices. +* g_usTailDR: the number of tail devices in bypass. +* g_usTailIR: the sum of IR length of tail devices. +* +***************************************************************/ + +unsigned short g_usHeadDR = 0; +unsigned short g_usHeadIR = 0; +unsigned short g_usTailDR = 0; +unsigned short g_usTailIR = 0; + +/*************************************************************** +* +* Global variable to store the number of bits of data or instruction +* to be shifted into or out from the device. +* +***************************************************************/ + +unsigned short g_usiDataSize = 0; + +/*************************************************************** +* +* Stores the frequency. Default to 1 MHz. +* +***************************************************************/ + +int g_iFrequency = 1000; + +/*************************************************************** +* +* Stores the maximum amount of ram needed to hold a row of data. +* +***************************************************************/ + +unsigned short g_usMaxSize = 0; + +/*************************************************************** +* +* Stores the LSH or RSH value. +* +***************************************************************/ + +unsigned short g_usShiftValue = 0; + +/*************************************************************** +* +* Stores the current repeat loop value. +* +***************************************************************/ + +unsigned short g_usRepeatLoops = 0; + +/*************************************************************** +* +* Stores the current vendor. +* +***************************************************************/ + +signed char g_cVendor = LATTICE; + +/*************************************************************** +* +* Stores the VME file CRC. +* +***************************************************************/ + +unsigned short g_usCalculatedCRC = 0; + +/*************************************************************** +* +* Stores the Device Checksum. +* +***************************************************************/ +//08/28/08 NN Added Calculate checksum support. +unsigned long g_usChecksum = 0; +unsigned int g_uiChecksumIndex = 0; + +/*************************************************************** +* +* Stores the current state of the JTAG state machine. +* +***************************************************************/ + +signed char g_cCurrentJTAGState = 0; + +/*************************************************************** +* +* Global variables used to support looping. +* +* g_pucHeapMemory: holds the entire repeat loop. +* g_iHeapCounter: points to the current byte in the repeat loop. +* g_iHEAPSize: the current size of the repeat in bytes. +* +***************************************************************/ + +unsigned char *g_pucHeapMemory = NULL; +unsigned short g_iHeapCounter = 0; +unsigned short g_iHEAPSize = 0; + +/*************************************************************** +* +* Global variables used to support intelligent programming. +* +* g_usIntelDataIndex: points to the current byte of the +* intelligent buffer. +* g_usIntelBufferSize: holds the size of the intelligent +* buffer. +* +***************************************************************/ + +unsigned short g_usIntelDataIndex = 0; +unsigned short g_usIntelBufferSize = 0; + +/**************************************************************************** +* +* Holds the maximum size of each respective buffer. These variables are used +* to write the HEX files when converting VME to HEX. +* +*****************************************************************************/ + +unsigned short g_usTDOSize = 0; +unsigned short g_usMASKSize = 0; +unsigned short g_usTDISize = 0; +unsigned short g_usDMASKSize = 0; +unsigned short g_usLCOUNTSize = 0; +unsigned short g_usHDRSize = 0; +unsigned short g_usTDRSize = 0; +unsigned short g_usHIRSize = 0; +unsigned short g_usTIRSize = 0; +unsigned short g_usHeapSize = 0; + +/*************************************************************** +* +* Global variables used to store data. +* +* g_pucOutMaskData: local RAM to hold one row of MASK data. +* g_pucInData: local RAM to hold one row of TDI data. +* g_pucOutData: local RAM to hold one row of TDO data. +* g_pucHIRData: local RAM to hold the current SIR header. +* g_pucTIRData: local RAM to hold the current SIR trailer. +* g_pucHDRData: local RAM to hold the current SDR header. +* g_pucTDRData: local RAM to hold the current SDR trailer. +* g_pucIntelBuffer: local RAM to hold the current intelligent buffer. +* g_pucOutDMaskData: local RAM to hold one row of DMASK data. +* +***************************************************************/ + +unsigned char *g_pucOutMaskData = NULL, +*g_pucInData = NULL, +*g_pucOutData = NULL, +*g_pucHIRData = NULL, +*g_pucTIRData = NULL, +*g_pucHDRData = NULL, +*g_pucTDRData = NULL, +*g_pucIntelBuffer = NULL, +*g_pucOutDMaskData = NULL; + +/*************************************************************** +* +* JTAG state machine transition table. +* +***************************************************************/ + +struct { + unsigned char CurState; /* From this state */ + unsigned char NextState; /* Step to this state */ + unsigned char Pattern; /* The tragetory of TMS */ + unsigned char Pulses; /* The number of steps */ +} g_JTAGTransistions[25] = { + { RESET, RESET, 0xFC, 6 }, /* Transitions from RESET */ + { RESET, IDLE, 0x00, 1 }, + { RESET, DRPAUSE, 0x50, 5 }, + { RESET, IRPAUSE, 0x68, 6 }, + { IDLE, RESET, 0xE0, 3 }, /* Transitions from IDLE */ + { IDLE, DRPAUSE, 0xA0, 4 }, + { IDLE, IRPAUSE, 0xD0, 5 }, + { DRPAUSE, RESET, 0xF8, 5 }, /* Transitions from DRPAUSE */ + { DRPAUSE, IDLE, 0xC0, 3 }, + { DRPAUSE, IRPAUSE, 0xF4, 7 }, + { DRPAUSE, DRPAUSE, 0xE8, 6 }, /* 06/14/06 Support POLING STATUS LOOP*/ + { IRPAUSE, RESET, 0xF8, 5 }, /* Transitions from IRPAUSE */ + { IRPAUSE, IDLE, 0xC0, 3 }, + { IRPAUSE, DRPAUSE, 0xE8, 6 }, + { DRPAUSE, SHIFTDR, 0x80, 2 }, /* Extra transitions using SHIFTDR */ + { IRPAUSE, SHIFTDR, 0xE0, 5 }, + { SHIFTDR, DRPAUSE, 0x80, 2 }, + { SHIFTDR, IDLE, 0xC0, 3 }, + { IRPAUSE, SHIFTIR, 0x80, 2 }, /* Extra transitions using SHIFTIR */ + { SHIFTIR, IRPAUSE, 0x80, 2 }, + { SHIFTIR, IDLE, 0xC0, 3 }, + { DRPAUSE, DRCAPTURE, 0xE0, 4 }, /* 11/15/05 Support DRCAPTURE*/ + { DRCAPTURE, DRPAUSE, 0x80, 2 }, + { IDLE, DRCAPTURE, 0x80, 2 }, + { IRPAUSE, DRCAPTURE, 0xE0, 4 } +}; + +/*************************************************************** +* +* List to hold all LVDS pairs. +* +***************************************************************/ + +LVDSPair *g_pLVDSList = NULL; +unsigned short g_usLVDSPairCount = 0; + +/*************************************************************** +* +* Function prototypes. +* +***************************************************************/ + +signed char ispVMCode(); +signed char ispVMDataCode(); +long int ispVMDataSize(); +void ispVMData(unsigned char *Data); +signed char ispVMShift(signed char Code); +signed char ispVMAmble(signed char Code); +signed char ispVMLoop(unsigned short a_usLoopCount); +signed char ispVMBitShift(signed char mode, unsigned short bits); +void ispVMComment(unsigned short a_usCommentSize); +void ispVMHeader(unsigned short a_usHeaderSize); +signed char ispVMLCOUNT(unsigned short a_usCountSize); +void ispVMClocks(unsigned short Clocks); +void ispVMBypass(signed char ScanType, unsigned short Bits); +void ispVMStateMachine(signed char NextState); +void ispVMStart(); +void ispVMEnd(); +signed char ispVMSend(unsigned short int); +signed char ispVMRead(unsigned short int); +signed char ispVMReadandSave(unsigned short int); +signed char ispVMProcessLVDS(unsigned short a_usLVDSCount); + +/*************************************************************** +* +* External variables and functions in ispvm_ui.c module +* +***************************************************************/ +extern void vme_out_char(unsigned char charOut); +extern void vme_out_hex(unsigned char hexOut); +extern void vme_out_string(char *stringOut); +extern unsigned char GetByte(); +extern void ispVMMemManager(signed char types, unsigned short size); + +/*************************************************************** +* +* External variables and functions in hardware.c module +* +***************************************************************/ +extern void ispVMDelay(unsigned short int a_usMicroSecondDelay); +extern unsigned char readPort(); +extern void writePort(unsigned char pins, unsigned char value); +extern void sclock(); +extern signed char g_cCurrentJTAGState; +#ifdef VME_DEBUG + +/*************************************************************** +* +* GetState +* +* Returns the state as a string based on the opcode. Only used +* for debugging purposes. +* +***************************************************************/ + +const char* GetState(unsigned char a_ucState) +{ + switch (a_ucState) { + case RESET: + return ("RESET"); + case IDLE: + return ("IDLE"); + case IRPAUSE: + return ("IRPAUSE"); + case DRPAUSE: + return ("DRPAUSE"); + case SHIFTIR: + return ("SHIFTIR"); + case SHIFTDR: + return ("SHIFTDR"); + case DRCAPTURE: /* 11/15/05 support DRCAPTURE*/ + return ("DRCAPTURE"); + default: + break; + } + + return 0; +} + +/*************************************************************** +* +* PrintData +* +* Prints the data. Only used for debugging purposes. +* +***************************************************************/ + +void PrintData(unsigned short a_iDataSize, unsigned char *a_pucData) +{ + //09/11/07 NN added local variables initialization + unsigned short usByteSize = 0; + unsigned short usBitIndex = 0; + signed short usByteIndex = 0; + unsigned char ucByte = 0; + unsigned char ucFlipByte = 0; + + if (a_iDataSize % 8) { + //09/11/07 NN Type cast mismatch variables + usByteSize = (unsigned short)(a_iDataSize / 8 + 1); + } else { + //09/11/07 NN Type cast mismatch variables + usByteSize = (unsigned short)(a_iDataSize / 8);// 4 + } + printf("("); + //09/11/07 NN Type cast mismatch variables + for (usByteIndex = (signed short)(usByteSize - 1); usByteIndex >= 0; usByteIndex--) { + ucByte = a_pucData[usByteIndex]; + ucFlipByte = 0x00; + + /*************************************************************** + * + * Flip each byte. + * + ***************************************************************/ + + for (usBitIndex = 0; usBitIndex < 8; usBitIndex++) { + ucFlipByte <<= 1; + if (ucByte & 0x1) { + ucFlipByte |= 0x1; + } + + ucByte >>= 1; + } + + /*************************************************************** + * + * Print the flipped byte. + * + ***************************************************************/ + + printf("%.02X", ucFlipByte); + if ((usByteSize - usByteIndex) % 40 == 39) { + printf("\n\t\t"); + } + if (usByteIndex < 0) + break; + } + printf(")"); +} +#endif //VME_DEBUG + +/*************************************************************** +* +* ispVMDataSize +* +* Returns a VME-encoded number, usually used to indicate the +* bit length of an SIR/SDR command. +* +***************************************************************/ + +long int ispVMDataSize() +{ + //09/11/07 NN added local variables initialization + long int iSize = 0; + signed char cCurrentByte = 0; + signed char cIndex = 0; + cIndex = 0; + + while ((cCurrentByte = GetByte()) & 0x80) { + iSize |= ((long int)(cCurrentByte & 0x7F)) << cIndex; + cIndex += 7; + } + iSize |= ((long int)(cCurrentByte & 0x7F)) << cIndex; + + return iSize; +} + +/*************************************************************** +* +* ispVMCode +* +* This is the heart of the embedded engine. All the high-level opcodes +* are extracted here. Once they have been identified, then it +* will call other functions to handle the processing. +* +***************************************************************/ + +signed char ispVMCode() +{ + //09/11/07 NN added local variables initialization + unsigned short iRepeatSize = 0; + signed char cOpcode = 0; + signed char cRetCode = 0; + unsigned char ucState = 0; + unsigned short usDelay = 0; + unsigned short usToggle = 0; + unsigned char usByte = 0; + + /*************************************************************** + * + * Check the compression flag only if this is the first time + * this function is entered. Do not check the compression flag if + * it is being called recursively from other functions within + * the embedded engine. + * + ***************************************************************/ + + if (!(g_usDataType & LHEAP_IN) && !(g_usDataType & HEAP_IN)) { + usByte = GetByte(); + if (usByte == 0xf1) { + g_usDataType |= COMPRESS; + } else if (usByte == 0xf2) { + g_usDataType &= ~COMPRESS; + } else { + return VME_INVALID_FILE; + } + } + + /*************************************************************** + * + * Begin looping through all the VME opcodes. + * + ***************************************************************/ + while ((cOpcode = GetByte()) >= 0) { + switch (cOpcode) { + case STATE: + + /*************************************************************** + * + * Step the JTAG state machine. + * + ***************************************************************/ + + ucState = GetByte(); + /*************************************************************** + * + * Step the JTAG state machine to DRCAPTURE to support Looping. + * + ***************************************************************/ + + if ((g_usDataType & LHEAP_IN) && + (ucState == DRPAUSE) && + (g_cCurrentJTAGState == ucState)) { + ispVMStateMachine(DRCAPTURE); + } + + ispVMStateMachine(ucState); + +#ifdef VME_DEBUG + if (g_usDataType & LHEAP_IN) { + printf("LDELAY %s ", GetState(ucState)); + } else { + printf("STATE %s;\n", GetState(ucState)); + } +#endif //VME_DEBUG + break; + case SIR: + case SDR: + case XSDR: + +#ifdef VME_DEBUG + switch (cOpcode) { + case SIR: + printf("SIR "); + break; + case SDR: + case XSDR: + if (g_usDataType & LHEAP_IN) { + printf("LSDR "); + } else { + printf("SDR "); + } + break; + } +#endif //VME_DEBUG + /*************************************************************** + * + * Shift in data into the device. + * + ***************************************************************/ + cRetCode = ispVMShift(cOpcode); + if (cRetCode != 0) { + return (cRetCode); + } + break; + case WAIT: + + /*************************************************************** + * + * Observe delay. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + usDelay = (unsigned short)ispVMDataSize(); + ispVMDelay(usDelay); + +#ifdef VME_DEBUG + if (usDelay & 0x8000) { + + /*************************************************************** + * + * Since MSB is set, the delay time must be decoded to + * millisecond. The SVF2VME encodes the MSB to represent + * millisecond. + * + ***************************************************************/ + + usDelay &= ~0x8000; + if (g_usDataType & LHEAP_IN) { + printf("%.2E SEC;\n", (float)usDelay / 1000); + } else { + printf("RUNTEST %.2E SEC;\n", (float)usDelay / 1000); + } + } else { + + /*************************************************************** + * + * Since MSB is not set, the delay time is given as microseconds. + * + ***************************************************************/ + + if (g_usDataType & LHEAP_IN) { + printf("%.2E SEC;\n", (float)usDelay / 1000000); + } else { + printf("RUNTEST %.2E SEC;\n", (float)usDelay / 1000000); + } + } +#endif //VME_DEBUG + break; + case TCK: + + /*************************************************************** + * + * Issue clock toggles. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + usToggle = (unsigned short)ispVMDataSize(); + ispVMClocks(usToggle); + +#ifdef VME_DEBUG + printf("RUNTEST %d TCK;\n", usToggle); +#endif //VME_DEBUG + break; + case ENDDR: + + /*************************************************************** + * + * Set the ENDDR. + * + ***************************************************************/ + + g_ucEndDR = GetByte(); + +#ifdef VME_DEBUG + printf("ENDDR %s;\n", GetState(g_ucEndDR)); +#endif //VME_DEBUG + break; + case ENDIR: + + /*************************************************************** + * + * Set the ENDIR. + * + ***************************************************************/ + + g_ucEndIR = GetByte(); + +#ifdef VME_DEBUG + printf("ENDIR %s;\n", GetState(g_ucEndIR)); +#endif //VME_DEBUG + break; + case HIR: + case TIR: + case HDR: + case TDR: + +#ifdef VME_DEBUG + switch (cOpcode) { + case HIR: + printf("HIR "); + break; + case TIR: + printf("TIR "); + break; + case HDR: + printf("HDR "); + break; + case TDR: + printf("TDR "); + break; + } +#endif //VME_DEBUG + + /*************************************************************** + * + * Set the header/trailer of the device in order to bypass + * successfully. + * + ***************************************************************/ + + cRetCode = ispVMAmble(cOpcode); + if (cRetCode != 0) { + return (cRetCode); + } + +#ifdef VME_DEBUG + printf(";\n"); +#endif //VME_DEBUG + break; + case MEM: + + /*************************************************************** + * + * The maximum RAM required to support processing one row of the + * VME file. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_usMaxSize = (unsigned short)ispVMDataSize(); + +#ifdef VME_DEBUG + printf("// MEMSIZE %d\n", g_usMaxSize); +#endif //VME_DEBUG + break; + case VENDOR: + + /*************************************************************** + * + * Set the VENDOR type. + * + ***************************************************************/ + + cOpcode = GetByte(); + switch (cOpcode) { + case LATTICE: +#ifdef VME_DEBUG + printf("// VENDOR LATTICE\n"); +#endif //VME_DEBUG + g_cVendor = LATTICE; + break; + case ALTERA: +#ifdef VME_DEBUG + printf("// VENDOR ALTERA\n"); +#endif //VME_DEBUG + g_cVendor = ALTERA; + break; + case XILINX: +#ifdef VME_DEBUG + printf("// VENDOR XILINX\n"); +#endif //VME_DEBUG + g_cVendor = XILINX; + break; + default: + break; + } + break; + case SETFLOW: + + /*************************************************************** + * + * Set the flow control. Flow control determines the personality + * of the embedded engine. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_usFlowControl |= (unsigned short)ispVMDataSize(); + break; + case RESETFLOW: + + /*************************************************************** + * + * Unset the flow control. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_usFlowControl &= (unsigned short)~(ispVMDataSize()); + break; + case HEAP: + + /*************************************************************** + * + * Allocate heap size to store loops. + * + ***************************************************************/ + + cRetCode = GetByte(); + if (cRetCode != SECUREHEAP) { + return VME_INVALID_FILE; + } + //09/11/07 NN Type cast mismatch variables + g_iHEAPSize = (unsigned short)ispVMDataSize(); + + /**************************************************************************** + * + * Store the maximum size of the HEAP buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_iHEAPSize > g_usHeapSize) { + g_usHeapSize = g_iHEAPSize; + } + + ispVMMemManager(HEAP, (unsigned short)g_iHEAPSize); + break; + case REPEAT: + + /*************************************************************** + * + * Execute loops. + * + ***************************************************************/ + + g_usRepeatLoops = 0; + + //09/11/07 NN Type cast mismatch variables + iRepeatSize = (unsigned short)ispVMDataSize(); + + cRetCode = ispVMLoop((unsigned short)iRepeatSize); + if (cRetCode != 0) { + return (cRetCode); + } + break; + case ENDLOOP: + + /*************************************************************** + * + * Exit point from processing loops. + * + ***************************************************************/ + + return (cRetCode); + case ENDVME: + + /*************************************************************** + * + * The only valid exit point that indicates end of programming. + * + ***************************************************************/ + + return (cRetCode); + case SHR: + + /*************************************************************** + * + * Right-shift address. + * + ***************************************************************/ + + g_usFlowControl |= SHIFTRIGHT; + + //09/11/07 NN Type cast mismatch variables + g_usShiftValue = (unsigned short)(g_usRepeatLoops * (unsigned short)GetByte()); + break; + case SHL: + + /*************************************************************** + * + * Left-shift address. + * + ***************************************************************/ + + g_usFlowControl |= SHIFTLEFT; + + //09/11/07 NN Type cast mismatch variables + g_usShiftValue = (unsigned short)(g_usRepeatLoops * (unsigned short)GetByte()); + break; + case FREQUENCY: + + /*************************************************************** + * + * Set the frequency. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_iFrequency = (int)(ispVMDataSize()); + //10/23/08 NN changed to check if the frequency smaller than 1000 + if (g_iFrequency >= 1000) { + g_iFrequency = g_iFrequency / 1000; + if (g_iFrequency == 1) + g_iFrequency = 1000; +#ifdef VME_DEBUG + printf("FREQUENCY %.2E HZ;\n", (float)g_iFrequency * 1000); +#endif //VME_DEBUG + } else { + if (g_iFrequency == 0) + g_iFrequency = 1000; +#ifdef VME_DEBUG + printf("FREQUENCY %.2E HZ;\n", (float)g_iFrequency); +#endif //VME_DEBUG + } + break; + case LCOUNT: + + /*************************************************************** + * + * Process LCOUNT command. + * + ***************************************************************/ + + cRetCode = ispVMLCOUNT((unsigned short)ispVMDataSize()); + if (cRetCode != 0) { + return (cRetCode); + } + break; + case VUES: + + /*************************************************************** + * + * Set the flow control to verify USERCODE. + * + ***************************************************************/ + + g_usFlowControl |= VERIFYUES; + break; + case COMMENT: + + /*************************************************************** + * + * Display comment. + * + ***************************************************************/ + + ispVMComment((unsigned short)ispVMDataSize()); + break; + case LVDS: + + /*************************************************************** + * + * Process LVDS command. + * + ***************************************************************/ + + ispVMProcessLVDS((unsigned short)ispVMDataSize()); + break; + case HEADER: + + /*************************************************************** + * + * Discard header. + * + ***************************************************************/ + + ispVMHeader((unsigned short)ispVMDataSize()); + break; + /* 03/14/06 Support Toggle ispENABLE signal*/ + case ispEN: + ucState = GetByte(); + if ((ucState == ON) || (ucState == 0x01)) + writePort(JTAG_ENABLE, 0x01); + else + writePort(JTAG_ENABLE, 0x00); + ispVMDelay(1); + break; + /* 05/24/06 support Toggle TRST pin*/ + case TRST: + ucState = GetByte(); + if (ucState == 0x01) + writePort(JTAG_TRST, 0x01); + else + writePort(JTAG_TRST, 0x00); + ispVMDelay(1); + break; + default: + + /*************************************************************** + * + * Invalid opcode encountered. + * + ***************************************************************/ + +#ifdef VME_DEBUG + printf("\nINVALID OPCODE: 0x%.2X\n", cOpcode); +#endif //VME_DEBUG + + return VME_INVALID_FILE; + } + } + + /*************************************************************** + * + * Invalid exit point. Processing the token 'ENDVME' is the only + * valid way to exit the embedded engine. + * + ***************************************************************/ + + return (VME_INVALID_FILE); +} + +/*************************************************************** +* +* ispVMDataCode +* +* Processes the TDI/TDO/MASK/DMASK etc of an SIR/SDR command. +* +***************************************************************/ + +signed char ispVMDataCode() +{ + //09/11/07 NN added local variables initialization + signed char cDataByte = 0; + signed char siDataSource = 0; /*source of data from file by default*/ + + if (g_usDataType & HEAP_IN) { + siDataSource = 1; /*the source of data from memory*/ + } + + /**************************************************************************** + * + * Clear the data type register. + * + *****************************************************************************/ + + g_usDataType &= ~(MASK_DATA + TDI_DATA + TDO_DATA + DMASK_DATA + CMASK_DATA); + + /**************************************************************************** + * + * Iterate through SIR/SDR command and look for TDI, TDO, MASK, etc. + * + *****************************************************************************/ + + while ((cDataByte = GetByte()) >= 0) { + + ispVMMemManager(cDataByte, g_usMaxSize); + switch (cDataByte) { + case TDI: + + /**************************************************************************** + * + * Store the maximum size of the TDI buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDISize) { + g_usTDISize = g_usiDataSize; + } + /**************************************************************************** + * + * Updated data type register to indicate that TDI data is currently being + * used. Process the data in the VME file into the TDI buffer. + * + *****************************************************************************/ + + g_usDataType |= TDI_DATA; + ispVMData(g_pucInData); + break; + case XTDO: + + /**************************************************************************** + * + * Store the maximum size of the TDO buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDOSize) { + g_usTDOSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that TDO data is currently being + * used. + * + *****************************************************************************/ + + g_usDataType |= TDO_DATA; + break; + case TDO: + + /**************************************************************************** + * + * Store the maximum size of the TDO buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDOSize) { + g_usTDOSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that TDO data is currently being + * used. Process the data in the VME file into the TDO buffer. + * + *****************************************************************************/ + + g_usDataType |= TDO_DATA; + ispVMData(g_pucOutData); + break; + case MASK: + + /**************************************************************************** + * + * Store the maximum size of the MASK buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usMASKSize) { + g_usMASKSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that MASK data is currently being + * used. Process the data in the VME file into the MASK buffer. + * + *****************************************************************************/ + + g_usDataType |= MASK_DATA; + ispVMData(g_pucOutMaskData); + break; + case DMASK: + + /**************************************************************************** + * + * Store the maximum size of the DMASK buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usDMASKSize) { + g_usDMASKSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that DMASK data is currently being + * used. Process the data in the VME file into the DMASK buffer. + * + *****************************************************************************/ + + g_usDataType |= DMASK_DATA; + ispVMData(g_pucOutDMaskData); + break; + case CMASK: + + /**************************************************************************** + * + * Updated data type register to indicate that CMASK data is currently being + * used. Process the data in the VME file into the CMASK buffer. + * + *****************************************************************************/ + + g_usDataType |= CMASK_DATA; + ispVMData(g_pucOutMaskData); + break; + case CONTINUE: + return (0); + default: + + /**************************************************************************** + * + * Encountered invalid opcode. + * + *****************************************************************************/ + + return (VME_INVALID_FILE); + } + + switch (cDataByte) { + case TDI: + + /**************************************************************************** + * + * Left bit shift. Used when performing algorithm looping. + * + *****************************************************************************/ + + if (g_usFlowControl & SHIFTLEFT) { + ispVMBitShift(SHL, g_usShiftValue); + g_usFlowControl &= ~SHIFTLEFT; + } + + /**************************************************************************** + * + * Right bit shift. Used when performing algorithm looping. + * + *****************************************************************************/ + + if (g_usFlowControl & SHIFTRIGHT) { + ispVMBitShift(SHR, g_usShiftValue); + g_usFlowControl &= ~SHIFTRIGHT; + } + default: + break; + } + + if (siDataSource) { + g_usDataType |= HEAP_IN; /*restore data from memory*/ + } + } + + if (siDataSource) { /*fetch data from heap memory upon return*/ + g_usDataType |= HEAP_IN; + } + + if (cDataByte < 0) { + + /**************************************************************************** + * + * Encountered invalid opcode. + * + *****************************************************************************/ + + return (VME_INVALID_FILE); + } else { + return (0); + } +} + +/*************************************************************** +* +* ispVMData +* Extract one row of data operand from the current data type opcode. Perform +* the decompression if necessary. Extra RAM is not required for the +* decompression process. The decompression scheme employed in this module +* is on row by row basis. The format of the data stream: +* [compression code][compressed data stream] +* 0x00 --No compression +* 0x01 --Compress by 0x00. +* Example: +* Original stream: 0x000000000000000000000001 +* Compressed stream: 0x01000901 +* Detail: 0x01 is the code, 0x00 is the key, +* 0x09 is the count of 0x00 bytes, +* 0x01 is the uncompressed byte. +* 0x02 --Compress by 0xFF. +* Example: +* Original stream: 0xFFFFFFFFFFFFFFFFFFFFFF01 +* Compressed stream: 0x02FF0901 +* Detail: 0x02 is the code, 0xFF is the key, +* 0x09 is the count of 0xFF bytes, +* 0x01 is the uncompressed byte. +* 0x03 +* : : +* 0xFE -- Compress by nibble blocks. +* Example: +* Original stream: 0x84210842108421084210 +* Compressed stream: 0x0584210 +* Detail: 0x05 is the code, means 5 nibbles block. +* 0x84210 is the 5 nibble blocks. +* The whole row is 80 bits given by g_usiDataSize. +* The number of times the block repeat itself +* is found by g_usiDataSize/(4*0x05) which is 4. +* 0xFF -- Compress by the most frequently happen byte. +* Example: +* Original stream: 0x04020401030904040404 +* Compressed stream: 0xFF04(0,1,0x02,0,1,0x01,1,0x03,1,0x09,0,0,0) +* or: 0xFF044090181C240 +* Detail: 0xFF is the code, 0x04 is the key. +* a bit of 0 represent the key shall be put into +* the current bit position and a bit of 1 +* represent copying the next of 8 bits of data +* in. +* +***************************************************************/ + +void ispVMData(unsigned char *ByteData) +{ + //09/11/07 NN added local variables initialization + unsigned short size = 0; + unsigned short i, j, m, getData = 0; + unsigned char cDataByte = 0; + unsigned char compress = 0; + unsigned short FFcount = 0; + unsigned char compr_char = 0xFF; + unsigned short index = 0; + signed char compression = 0; + + /*convert number in bits to bytes*/ + if (g_usiDataSize % 8 > 0) { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8 + 1); + } else { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8); + } + + /* If there is compression, then check if compress by key of 0x00 or 0xFF + or by other keys or by nibble blocks*/ + + if (g_usDataType & COMPRESS) { + compression = 1; + if (((compress = GetByte()) == VAR) && (g_usDataType & HEAP_IN)) { + getData = 1; + g_usDataType &= ~(HEAP_IN); + compress = GetByte(); + } + + switch (compress) { + case 0x00: + /* No compression */ + compression = 0; + break; + case 0x01: + /* Compress by byte 0x00 */ + compr_char = 0x00; + break; + case 0x02: + /* Compress by byte 0xFF */ + compr_char = 0xFF; + break; + case 0xFF: + /* Huffman encoding */ + compr_char = GetByte(); + i = 8; + for (index = 0; index < size; index++) { + ByteData[index] = 0x00; + if (i > 7) { + cDataByte = GetByte(); + i = 0; + } + if ((cDataByte << i++) & 0x80) + m = 8; + else { + ByteData[index] = compr_char; + m = 0; + } + + for (j = 0; j < m; j++) { + if (i > 7) { + cDataByte = GetByte(); + i = 0; + } + ByteData[index] |= ((cDataByte << i++) & 0x80) >> j; + } + } + size = 0; + break; + default: + for (index = 0; index < size; index++) + ByteData[index] = 0x00; + for (index = 0; index < compress; index++) { + if (index % 2 == 0) + cDataByte = GetByte(); + for (i = 0; i < size * 2 / compress; i++) { + //09/11/07 NN Type cast mismatch variables + j = (unsigned short)(index + (i * (unsigned short)compress)); + /*clear the nibble to zero first*/ + if (j % 2) { + if (index % 2) + ByteData[j / 2] |= cDataByte & 0x0F; + else + ByteData[j / 2] |= cDataByte >> 4; + } else { + if (index % 2) + ByteData[j / 2] |= cDataByte << 4; + else + ByteData[j / 2] |= cDataByte & 0xF0; + } + } + } + size = 0; + break; + } + } + + FFcount = 0; + + /* Decompress by byte 0x00 or 0xFF */ + for (index = 0; index < size; index++) { + if (FFcount <= 0) { + cDataByte = GetByte(); + if ((cDataByte == VAR) && (g_usDataType & HEAP_IN) && !getData && !(g_usDataType & COMPRESS)) { + getData = 1; + g_usDataType &= ~(HEAP_IN); + cDataByte = GetByte(); + } + ByteData[index] = cDataByte; + if ((compression) && (cDataByte == compr_char)) /*decompression is on*/ + //09/11/07 NN Type cast mismatch variables + FFcount = (unsigned short)ispVMDataSize(); /*The number of 0xFF or 0x00 bytes*/ + } else { + FFcount--; /*Use up the 0xFF chain first*/ + ByteData[index] = compr_char; + } + } + + if (getData) { + g_usDataType |= HEAP_IN; + getData = 0; + } +} + +/*************************************************************** +* +* ispVMShift +* +* Processes the SDR/XSDR/SIR commands. +* +***************************************************************/ + +signed char ispVMShift(signed char a_cCode) +{ + //09/11/07 NN added local variables initialization + unsigned short iDataIndex = 0; + unsigned short iReadLoop = 0; + signed char cRetCode = 0; + + cRetCode = 0; + //09/11/07 NN Type cast mismatch variables + g_usiDataSize = (unsigned short)ispVMDataSize(); + + g_usDataType &= ~(SIR_DATA + EXPRESS + SDR_DATA); /*clear the flags first*/ + + switch (a_cCode) { + case SIR: + g_usDataType |= SIR_DATA; + /* 1/15/04 If performing cascading, then go directly to SHIFTIR. Else, + go to IRPAUSE before going to SHIFTIR */ + if (g_usFlowControl & CASCADE) { + ispVMStateMachine(SHIFTIR); + } else { + ispVMStateMachine(IRPAUSE); + ispVMStateMachine(SHIFTIR); + if (g_usHeadIR > 0) { + ispVMBypass(HIR, g_usHeadIR); + sclock(); + } + } + break; + case XSDR: + g_usDataType |= EXPRESS; /*mark simultaneous in and out*/ + case SDR: + g_usDataType |= SDR_DATA; + /* 1/15/04 If already in SHIFTDR, then do not move state or shift in header. + This would imply that the previously shifted frame was a cascaded frame. */ + if (g_cCurrentJTAGState != SHIFTDR) { + /* 1/15/04 If performing cascading, then go directly to SHIFTDR. Else, + go to DRPAUSE before going to SHIFTDR */ + if (g_usFlowControl & CASCADE) { + if (g_cCurrentJTAGState == DRPAUSE) { + ispVMStateMachine(SHIFTDR); + /* 1/15/04 If cascade flag has been set and the current state is + DRPAUSE, this implies that the first cascaded frame is about to + be shifted in. The header must be shifted prior to shifting + the first cascaded frame. */ + if (g_usHeadDR > 0) { + ispVMBypass(HDR, g_usHeadDR); + sclock(); + } + } else { + ispVMStateMachine(SHIFTDR); + } + } else { + ispVMStateMachine(DRPAUSE); + ispVMStateMachine(SHIFTDR); + if (g_usHeadDR > 0) { + ispVMBypass(HDR, g_usHeadDR); + sclock(); + } + } + } + break; + default: + return (VME_INVALID_FILE); + } + + cRetCode = ispVMDataCode(); + if (cRetCode != 0) { + return (VME_INVALID_FILE); + } + +#ifdef VME_DEBUG + if (g_usDataType & TDI_DATA) { + printf("\n\t\tTDI "); + PrintData(g_usiDataSize, g_pucInData); + } + + if (g_usDataType & TDO_DATA) { + printf("\n\t\tTDO "); + PrintData(g_usiDataSize, g_pucOutData); + } + + if (g_usDataType & MASK_DATA) { + printf("\n\t\tMASK "); + PrintData(g_usiDataSize, g_pucOutMaskData); + } + + if (g_usDataType & DMASK_DATA) { + printf("\n\t\tDMASK "); + PrintData(g_usiDataSize, g_pucOutDMaskData); + } + + printf(";\n"); +#endif //VME_DEBUG + if (g_usDataType & TDO_DATA || g_usDataType & DMASK_DATA) { + if (g_usDataType & DMASK_DATA) { + + cRetCode = ispVMReadandSave(g_usiDataSize); + + if (!cRetCode) { + if (g_usTailDR > 0) { + sclock(); + ispVMBypass(TDR, g_usTailDR); + } + ispVMStateMachine(DRPAUSE); + ispVMStateMachine(SHIFTDR); + if (g_usHeadDR > 0) { + ispVMBypass(HDR, g_usHeadDR); + sclock(); + } + for (iDataIndex = 0; iDataIndex < g_usiDataSize / 8 + 1; iDataIndex++) + g_pucInData[iDataIndex] = g_pucOutData[iDataIndex]; + g_usDataType &= ~(TDO_DATA + DMASK_DATA); + cRetCode = ispVMSend(g_usiDataSize); + } + } else { + + cRetCode = ispVMRead(g_usiDataSize); + if (cRetCode == -1 && g_cVendor == XILINX) { + for (iReadLoop = 0; iReadLoop < 30; iReadLoop++) { + cRetCode = ispVMRead(g_usiDataSize); + if (!cRetCode) { + break; + } else { + ispVMStateMachine(DRPAUSE); /*Always DRPAUSE*/ + /*Bypass other devices when appropriate*/ + ispVMBypass(TDR, g_usTailDR); + ispVMStateMachine(g_ucEndDR); + ispVMStateMachine(IDLE); + ispVMDelay(1000); + } + } + } + } + } else { /*TDI only*/ + cRetCode = ispVMSend(g_usiDataSize); + + } + + /*transfer the input data to the output buffer for the next verify*/ + if ((g_usDataType & EXPRESS) || (a_cCode == SDR)) { + if (g_pucOutData) { + for (iDataIndex = 0; iDataIndex < g_usiDataSize / 8 + 1; iDataIndex++) + g_pucOutData[iDataIndex] = g_pucInData[iDataIndex]; + } + } + + switch (a_cCode) { + case SIR: + /* 1/15/04 If not performing cascading, then shift ENDIR */ + if (!(g_usFlowControl & CASCADE)) { + if (g_usTailIR > 0) { + sclock(); + ispVMBypass(TIR, g_usTailIR); + } + ispVMStateMachine(g_ucEndIR); + } + break; + case XSDR: + case SDR: + /* 1/15/04 If not performing cascading, then shift ENDDR */ + if (!(g_usFlowControl & CASCADE)) { + if (g_usTailDR > 0) { + sclock(); + ispVMBypass(TDR, g_usTailDR); + } + ispVMStateMachine(g_ucEndDR); + } + break; + default: + break; + } + + return (cRetCode); +} + +/*************************************************************** +* +* ispVMAmble +* +* This routine is to extract Header and Trailer parameter for SIR and +* SDR operations. +* +* The Header and Trailer parameter are the pre-amble and post-amble bit +* stream need to be shifted into TDI or out of TDO of the devices. Mostly +* is for the purpose of bypassing the leading or trailing devices. ispVM +* supports only shifting data into TDI to bypass the devices. +* +* For a single device, the header and trailer parameters are all set to 0 +* as default by ispVM. If it is for multiple devices, the header and trailer +* value will change as specified by the VME file. +* +***************************************************************/ + +signed char ispVMAmble(signed char Code) +{ + signed char compress = 0; + //09/11/07 NN Type cast mismatch variables + g_usiDataSize = (unsigned short)ispVMDataSize(); + +#ifdef VME_DEBUG + printf("%d", g_usiDataSize); +#endif //VME_DEBUG + + if (g_usiDataSize) { + + /**************************************************************************** + * + * Discard the TDI byte and set the compression bit in the data type register + * to false if compression is set because TDI data after HIR/HDR/TIR/TDR is not + * compressed. + * + *****************************************************************************/ + + GetByte(); + if (g_usDataType & COMPRESS) { + g_usDataType &= ~(COMPRESS); + compress = 1; + } + } + + switch (Code) { + case HIR: + + /**************************************************************************** + * + * Store the maximum size of the HIR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usHIRSize) { + g_usHIRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the HIR value and allocate memory. + * + *****************************************************************************/ + + g_usHeadIR = g_usiDataSize; + if (g_usHeadIR) { + ispVMMemManager(HIR, g_usHeadIR); + ispVMData(g_pucHIRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usHeadIR, g_pucHIRData); +#endif //VME_DEBUG + } + break; + case TIR: + + /**************************************************************************** + * + * Store the maximum size of the TIR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTIRSize) { + g_usTIRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the TIR value and allocate memory. + * + *****************************************************************************/ + + g_usTailIR = g_usiDataSize; + if (g_usTailIR) { + ispVMMemManager(TIR, g_usTailIR); + ispVMData(g_pucTIRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usTailIR, g_pucTIRData); +#endif //VME_DEBUG + } + break; + case HDR: + + /**************************************************************************** + * + * Store the maximum size of the HDR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usHDRSize) { + g_usHDRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the HDR value and allocate memory. + * + *****************************************************************************/ + + g_usHeadDR = g_usiDataSize; + if (g_usHeadDR) { + ispVMMemManager(HDR, g_usHeadDR); + ispVMData(g_pucHDRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usHeadDR, g_pucHDRData); +#endif //VME_DEBUG + } + break; + case TDR: + + /**************************************************************************** + * + * Store the maximum size of the TDR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDRSize) { + g_usTDRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the TDR value and allocate memory. + * + *****************************************************************************/ + + g_usTailDR = g_usiDataSize; + if (g_usTailDR) { + ispVMMemManager(TDR, g_usTailDR); + ispVMData(g_pucTDRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usTailDR, g_pucTDRData); +#endif //VME_DEBUG + } + break; + default: + break; + } + + /**************************************************************************** + * + * Re-enable compression if it was previously set. + * + *****************************************************************************/ + + if (compress) { + g_usDataType |= COMPRESS; + } + + if (g_usiDataSize) { + Code = GetByte(); + if (Code == CONTINUE) { + return 0; + } else { + + /**************************************************************************** + * + * Encountered invalid opcode. + * + *****************************************************************************/ + + return VME_INVALID_FILE; + } + } + + return 0; +} + +/*************************************************************** +* +* ispVMLoop +* +* Perform the function call upon by the REPEAT opcode. +* Memory is to be allocated to store the entire loop from REPEAT to ENDLOOP. +* After the loop is stored then execution begin. The REPEATLOOP flag is set +* on the g_usFlowControl register to indicate the repeat loop is in session +* and therefore fetch opcode from the memory instead of from the file. +* +***************************************************************/ + +signed char ispVMLoop(unsigned short a_usLoopCount) +{ + //09/11/07 NN added local variables initialization + signed char cRetCode = 0; + unsigned short iHeapIndex = 0; + unsigned short iLoopIndex = 0; + + g_usShiftValue = 0; + for (iHeapIndex = 0; iHeapIndex < g_iHEAPSize; iHeapIndex++) { + g_pucHeapMemory[iHeapIndex] = GetByte(); + } + + if (g_pucHeapMemory[iHeapIndex - 1] != ENDLOOP) { + return (VME_INVALID_FILE); + } + + g_usFlowControl |= REPEATLOOP; + g_usDataType |= HEAP_IN; + + for (iLoopIndex = 0; iLoopIndex < a_usLoopCount; iLoopIndex++) { + g_iHeapCounter = 0; + cRetCode = ispVMCode(); + g_usRepeatLoops++; + if (cRetCode < 0) { + break; + } + } + + g_usDataType &= ~(HEAP_IN); + g_usFlowControl &= ~(REPEATLOOP); + return (cRetCode); +} + +/*************************************************************** +* +* ispVMBitShift +* +* Shift the TDI stream left or right by the number of bits. The data in +* *g_pucInData is of the VME format, so the actual shifting is the reverse of +* IEEE 1532 or SVF format. +* +***************************************************************/ + +signed char ispVMBitShift(signed char mode, unsigned short bits) +{ + //09/11/07 NN added local variables initialization + unsigned short i = 0; + unsigned short size = 0; + unsigned short tmpbits = 0; + + if (g_usiDataSize % 8 > 0) { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8 + 1); + } else { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8); + } + + switch (mode) { + case SHR: + for (i = 0; i < size; i++) { + if (g_pucInData[i] != 0) { + tmpbits = bits; + while (tmpbits > 0) { + g_pucInData[i] <<= 1; + if (g_pucInData[i] == 0) { + i--; + g_pucInData[i] = 1; + } + tmpbits--; + } + } + } + break; + case SHL: + for (i = 0; i < size; i++) { + if (g_pucInData[i] != 0) { + tmpbits = bits; + while (tmpbits > 0) { + g_pucInData[i] >>= 1; + if (g_pucInData[i] == 0) { + i--; + g_pucInData[i] = 8; + } + tmpbits--; + } + } + } + break; + default: + return (VME_INVALID_FILE); + } + + return (0); +} + +/*************************************************************** +* +* ispVMComment +* +* Displays the SVF comments. +* +***************************************************************/ + +void ispVMComment(unsigned short a_usCommentSize) +{ + char cCurByte = 0; + for (; a_usCommentSize > 0; a_usCommentSize--) { + /**************************************************************************** + * + * Print character to the terminal. + * + *****************************************************************************/ + cCurByte = GetByte(); + vme_out_char(cCurByte); + } + cCurByte = '\n'; + vme_out_char(cCurByte); +} + +/*************************************************************** +* +* ispVMHeader +* +* Iterate the length of the header and discard it. +* +***************************************************************/ + +void ispVMHeader(unsigned short a_usHeaderSize) +{ + for (; a_usHeaderSize > 0; a_usHeaderSize--) { + GetByte(); + } +} + +/*************************************************************** +* +* ispVMCalculateCRC32 +* +* Calculate the 32-bit CRC. +* +***************************************************************/ + +void ispVMCalculateCRC32(unsigned char a_ucData) +{ + //09/11/07 NN added local variables initialization + unsigned char ucIndex = 0; + unsigned char ucFlipData = 0; + unsigned short usCRCTableEntry = 0; + unsigned int crc_table[16] = { + 0x0000, 0xCC01, 0xD801, + 0x1400, 0xF001, 0x3C00, + 0x2800, 0xE401, 0xA001, + 0x6C00, 0x7800, 0xB401, + 0x5000, 0x9C01, 0x8801, + 0x4400 + }; + + for (ucIndex = 0; ucIndex < 8; ucIndex++) { + ucFlipData <<= 1; + if (a_ucData & 0x01) { + ucFlipData |= 0x01; + } + a_ucData >>= 1; + } + + //09/11/07 NN Type cast mismatch variables + usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]); + g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF); + g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^ usCRCTableEntry ^ crc_table[ucFlipData & 0xF]); + usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]); + g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF); + g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^ usCRCTableEntry ^ crc_table[(ucFlipData >> 4) & 0xF]); +} + +/*************************************************************** +* +* ispVMLCOUNT +* +* Process the intelligent programming loops. +* +***************************************************************/ + +signed char ispVMLCOUNT(unsigned short a_usCountSize) +{ + unsigned short usContinue = 1; + unsigned short usIntelBufferIndex = 0; + unsigned short usCountIndex = 0; + signed char cRetCode = 0; + signed char cRepeatHeap = 0; + signed char cOpcode = 0; + unsigned char ucState = 0; + unsigned short usDelay = 0; + unsigned short usToggle = 0; + + g_usIntelBufferSize = (unsigned short)ispVMDataSize(); + + /**************************************************************************** + * + * Allocate memory for intel buffer. + * + *****************************************************************************/ + + ispVMMemManager(LHEAP, g_usIntelBufferSize); + + /**************************************************************************** + * + * Store the maximum size of the intelligent buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usIntelBufferSize > g_usLCOUNTSize) { + g_usLCOUNTSize = g_usIntelBufferSize; + } + + /**************************************************************************** + * + * Copy intel data to the buffer. + * + *****************************************************************************/ + + for (usIntelBufferIndex = 0; usIntelBufferIndex < g_usIntelBufferSize; usIntelBufferIndex++) { + g_pucIntelBuffer[usIntelBufferIndex] = GetByte(); + } + + /**************************************************************************** + * + * Set the data type register to get data from the intelligent data buffer. + * + *****************************************************************************/ + + g_usDataType |= LHEAP_IN; + + /**************************************************************************** + * + * If the HEAP_IN flag is set, temporarily unset the flag so data will be + * retrieved from the status buffer. + * + *****************************************************************************/ + + if (g_usDataType & HEAP_IN) { + g_usDataType &= ~HEAP_IN; + cRepeatHeap = 1; + } + +#ifdef VME_DEBUG + printf("LCOUNT %d;\n", a_usCountSize); +#endif //VME_DEBUG + + /**************************************************************************** + * + * Iterate through the intelligent programming command. + * + *****************************************************************************/ + + for (usCountIndex = 0; usCountIndex < a_usCountSize; usCountIndex++) { + + /**************************************************************************** + * + * Initialize the intel data index to 0 before each iteration. + * + *****************************************************************************/ + + g_usIntelDataIndex = 0; + cOpcode = 0; + ucState = 0; + usDelay = 0; + usToggle = 0; + usContinue = 1; + + /*************************************************************** + * + * Begin looping through all the VME opcodes. + * + ***************************************************************/ + /*************************************************************** + * 4/1/09 Nguyen replaced the recursive function call codes on + * the ispVMLCOUNT function + * + ***************************************************************/ + while (usContinue) { + cOpcode = GetByte(); + switch (cOpcode) { + case HIR: + case TIR: + case HDR: + case TDR: + /*************************************************************** + * + * Set the header/trailer of the device in order to bypass + * successfully. + * + ***************************************************************/ + + ispVMAmble(cOpcode); + break; + case STATE: + + /*************************************************************** + * + * Step the JTAG state machine. + * + ***************************************************************/ + + ucState = GetByte(); + /*************************************************************** + * + * Step the JTAG state machine to DRCAPTURE to support Looping. + * + ***************************************************************/ + + if ((g_usDataType & LHEAP_IN) && + (ucState == DRPAUSE) && + (g_cCurrentJTAGState == ucState)) { + ispVMStateMachine(DRCAPTURE); + } + ispVMStateMachine(ucState); +#ifdef VME_DEBUG + printf("LDELAY %s ", GetState(ucState)); +#endif //VME_DEBUG + break; + case SIR: +#ifdef VME_DEBUG + printf("SIR "); +#endif //VME_DEBUG + /*************************************************************** + * + * Shift in data into the device. + * + ***************************************************************/ + + cRetCode = ispVMShift(cOpcode); + break; + case SDR: + +#ifdef VME_DEBUG + printf("LSDR "); +#endif //VME_DEBUG + /*************************************************************** + * + * Shift in data into the device. + * + ***************************************************************/ + + cRetCode = ispVMShift(cOpcode); + break; + case WAIT: + + /*************************************************************** + * + * Observe delay. + * + ***************************************************************/ + + usDelay = (unsigned short)ispVMDataSize(); + ispVMDelay(usDelay); + +#ifdef VME_DEBUG + if (usDelay & 0x8000) { + + /*************************************************************** + * + * Since MSB is set, the delay time must be decoded to + * millisecond. The SVF2VME encodes the MSB to represent + * millisecond. + * + ***************************************************************/ + + usDelay &= ~0x8000; + printf("%.2E SEC;\n", (float)usDelay / 1000); + } else { + + /*************************************************************** + * + * Since MSB is not set, the delay time is given as microseconds. + * + ***************************************************************/ + + printf("%.2E SEC;\n", (float)usDelay / 1000000); + } +#endif //VME_DEBUG + break; + case TCK: + + /*************************************************************** + * + * Issue clock toggles. + * + ***************************************************************/ + + usToggle = (unsigned short)ispVMDataSize(); + ispVMClocks(usToggle); + +#ifdef VME_DEBUG + printf("RUNTEST %d TCK;\n", usToggle); +#endif //VME_DEBUG + break; + case ENDLOOP: + + /*************************************************************** + * + * Exit point from processing loops. + * + ***************************************************************/ + usContinue = 0; + break; + + case COMMENT: + + /*************************************************************** + * + * Display comment. + * + ***************************************************************/ + + ispVMComment((unsigned short)ispVMDataSize()); + break; + case ispEN: + ucState = GetByte(); + if ((ucState == ON) || (ucState == 0x01)) + writePort(JTAG_ENABLE, 0x01); + else + writePort(JTAG_ENABLE, 0x00); + ispVMDelay(1); + break; + case TRST: + if (GetByte() == 0x01) + writePort(JTAG_TRST, 0x01); + else + writePort(JTAG_TRST, 0x00); + ispVMDelay(1); + break; + default: + + /*************************************************************** + * + * Invalid opcode encountered. + * + ***************************************************************/ + +#ifdef VME_DEBUG + printf("\nINVALID OPCODE: 0x%.2X\n", cOpcode); +#endif //VME_DEBUG + + return VME_INVALID_FILE; + } + } + if (cRetCode >= 0) { + /**************************************************************************** + * + * Break if intelligent programming is successful. + * + *****************************************************************************/ + + break; + } + + } + /**************************************************************************** + * + * If HEAP_IN flag was temporarily disabled, re-enable it before exiting. + * + *****************************************************************************/ + + if (cRepeatHeap) { + g_usDataType |= HEAP_IN; + } + + /**************************************************************************** + * + * Set the data type register to not get data from the intelligent data buffer. + * + *****************************************************************************/ + + g_usDataType &= ~LHEAP_IN; + return cRetCode; +} + +/*************************************************************** +* +* ispVMClocks +* +* Applies the specified number of pulses to TCK. +* +***************************************************************/ + +void ispVMClocks(unsigned short Clocks) +{ + unsigned short iClockIndex = 0; + for (iClockIndex = 0; iClockIndex < Clocks; iClockIndex++) { + sclock(); + } +} + +/*************************************************************** +* +* ispVMBypass +* +* This procedure takes care of the HIR, HDR, TIR, TDR for the +* purpose of putting the other devices into Bypass mode. The +* current state is checked to find out if it is at DRPAUSE or +* IRPAUSE. If it is at DRPAUSE, perform bypass register scan. +* If it is at IRPAUSE, scan into instruction registers the bypass +* instruction. +* +***************************************************************/ + +void ispVMBypass(signed char ScanType, unsigned short Bits) +{ + //09/11/07 NN added local variables initialization + unsigned short iIndex = 0; + unsigned short iSourceIndex = 0; + unsigned char cBitState = 0; + unsigned char cCurByte = 0; + unsigned char *pcSource = NULL; + + if (Bits <= 0) { + return; + } + + switch (ScanType) { + case HIR: + pcSource = g_pucHIRData; + break; + case TIR: + pcSource = g_pucTIRData; + break; + case HDR: + pcSource = g_pucHDRData; + break; + case TDR: + pcSource = g_pucTDRData; + break; + default: + break; + } + if (pcSource) { + iSourceIndex = 0; + cBitState = 0; + for (iIndex = 0; iIndex < Bits - 1; iIndex++) { + /* Scan instruction or bypass register */ + if (iIndex % 8 == 0) { + cCurByte = pcSource[iSourceIndex++]; + } + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + writePort(JTAG_TDI, cBitState); + sclock(); + } + + if (iIndex % 8 == 0) { + cCurByte = pcSource[iSourceIndex++]; + } + + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + writePort(JTAG_TDI, cBitState); + } +} + +/*************************************************************** +* +* ispVMStateMachine +* +* This procedure steps all devices in the daisy chain from a given +* JTAG state to the next desirable state. If the next state is TLR, +* the JTAG state machine is brute forced into TLR by driving TMS +* high and pulse TCK 6 times. +* +***************************************************************/ + +void ispVMStateMachine(signed char cNextJTAGState) +{ + //09/11/07 NN added local variables initialization + signed char cPathIndex = 0; + signed char cStateIndex = 0; + short int found = 0; + + if ((g_cCurrentJTAGState == cNextJTAGState) && (cNextJTAGState != RESET)) { + return; + } + + for (cStateIndex = 0; cStateIndex < 25; cStateIndex++) { + if ((g_cCurrentJTAGState == g_JTAGTransistions[cStateIndex].CurState) && (cNextJTAGState == g_JTAGTransistions[cStateIndex].NextState)) { + found = 1; + break; + } + } + if (found) { + g_cCurrentJTAGState = cNextJTAGState; + for (cPathIndex = 0; cPathIndex < g_JTAGTransistions[cStateIndex].Pulses; cPathIndex++) { + if ((g_JTAGTransistions[cStateIndex].Pattern << cPathIndex) & 0x80) { + writePort(JTAG_TMS, (unsigned char)0x01); + } else { + writePort(JTAG_TMS, (unsigned char)0x00); + } + sclock(); + } + + writePort(JTAG_TDI, 0x00); + writePort(JTAG_TMS, 0x00); + } +} + +/*************************************************************** +* +* ispVMStart +* +* Enable the port to the device and set the state to RESET (TLR). +* +***************************************************************/ + +void ispVMStart() +{ +#ifdef VME_DEBUG + printf("// ISPVM EMBEDDED ADDED\n"); + printf("STATE RESET;\n"); +#endif + + ispVMStateMachine(RESET); /*step devices to RESET state*/ + +} + +/*************************************************************** +* +* ispVMEnd +* +* Set the state of devices to RESET to enable the devices and disable +* the port. +* +***************************************************************/ + +void ispVMEnd() +{ +#ifdef VME_DEBUG + printf("// ISPVM EMBEDDED ADDED\n"); + printf("STATE RESET;\n"); + printf("RUNTEST 1.00E-001 SEC;\n"); +#endif + + ispVMStateMachine(RESET); /*step devices to RESET state */ + ispVMDelay(1000); /*wake up devices*/ +} + +/*************************************************************** +* +* ispVMSend +* +* Send the TDI data stream to devices. The data stream can be +* instructions or data. +* +***************************************************************/ + +signed char ispVMSend(unsigned short a_usiDataSize) +{ + //09/11/07 NN added local variables initialization + unsigned short iIndex = 0; + unsigned short iInDataIndex = 0; + unsigned char cCurByte = 0; + unsigned char cBitState = 0; + + for (iIndex = 0; iIndex < a_usiDataSize - 1; iIndex++) { + if (iIndex % 8 == 0) { + cCurByte = g_pucInData[iInDataIndex++]; + } + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + writePort(JTAG_TDI, cBitState); + sclock(); + } + + if (iIndex % 8 == 0) { + /* Take care of the last bit */ + cCurByte = g_pucInData[iInDataIndex]; + } + + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + + writePort(JTAG_TDI, cBitState); + if (g_usFlowControl & CASCADE) { + /* 1/15/04 Clock in last bit for the first n-1 cascaded frames */ + sclock(); + } + + return 0; +} + +/*************************************************************** +* +* ispVMRead +* +* Read the data stream from devices and verify. +* +***************************************************************/ + +signed char ispVMRead(unsigned short a_usiDataSize) //32 +{ + //09/11/07 NN added local variables initialization + unsigned short usDataSizeIndex = 0; + unsigned short usErrorCount = 0; + unsigned short usLastBitIndex = 0; + unsigned char cDataByte = 0; + unsigned char cMaskByte = 0; + unsigned char cInDataByte = 0; + unsigned char cCurBit = 0; + unsigned char cByteIndex = 0; + unsigned short usBufferIndex = 0; + unsigned char ucDisplayByte = 0x00; + unsigned char ucDisplayFlag = 0x01; + char StrChecksum[256] = { 0 }; + unsigned char g_usCalculateChecksum = 0x00; + + //09/11/07 NN Type cast mismatch variables + usLastBitIndex = (unsigned short)(a_usiDataSize - 1); + + /**************************************************************************** + * + * If mask is not all zeros, then set the display flag to 0x00, otherwise + * it shall be set to 0x01 to indicate that data read from the device shall + * be displayed. If VME_DEBUG is defined, always display data. + * + *****************************************************************************/ + + for (usDataSizeIndex = 0; usDataSizeIndex < (a_usiDataSize + 7) / 8; usDataSizeIndex++) { + + if (g_usDataType & MASK_DATA) { + if (g_pucOutMaskData[usDataSizeIndex] != 0x00) { + ucDisplayFlag = 0x00; + break; + } + } else if (g_usDataType & CMASK_DATA) { + g_usCalculateChecksum = 0x01; + ucDisplayFlag = 0x00; + break; + } else { + ucDisplayFlag = 0x00; + break; + } + } + + /**************************************************************************** + * + * Begin shifting data in and out of the device. + * + *****************************************************************************/ + for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize; usDataSizeIndex++) { + if (cByteIndex == 0) { + + /*************************************************************** + * + * Grab byte from TDO buffer. + * + ***************************************************************/ + + if (g_usDataType & TDO_DATA) { + cDataByte = g_pucOutData[usBufferIndex]; + } + + /*************************************************************** + * + * Grab byte from MASK buffer. + * + ***************************************************************/ + + if (g_usDataType & MASK_DATA) { + cMaskByte = g_pucOutMaskData[usBufferIndex]; + } else { + cMaskByte = 0xFF; + } + + /*************************************************************** + * + * Grab byte from CMASK buffer. + * + ***************************************************************/ + + if (g_usDataType & CMASK_DATA) { + cMaskByte = 0x00; + g_usCalculateChecksum = 0x01; + } + + /*************************************************************** + * + * Grab byte from TDI buffer. + * + ***************************************************************/ + + if (g_usDataType & TDI_DATA) { + cInDataByte = g_pucInData[usBufferIndex]; + } + + usBufferIndex++; + } + + cCurBit = readPort(); + + if (ucDisplayFlag) { + ucDisplayByte <<= 1; + ucDisplayByte |= cCurBit; + } + + /**************************************************************************** + * + * Check if data read from port matches with expected TDO. + * + *****************************************************************************/ + + if (g_usDataType & TDO_DATA) { + //08/28/08 NN Added Calculate checksum support. + if (g_usCalculateChecksum) { + if (cCurBit == 0x01) + g_usChecksum += (1 << (g_uiChecksumIndex % 8)); + g_uiChecksumIndex++; + } else { + if ((((cMaskByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) { + if (cCurBit != (unsigned char)(((cDataByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) { + usErrorCount++; + } + } + } + } + + /**************************************************************************** + * + * Write TDI data to the port. + * + *****************************************************************************/ + + writePort(JTAG_TDI, (unsigned char)(((cInDataByte << cByteIndex) & 0x80) ? 0x01 : 0x00)); + + if (usDataSizeIndex < usLastBitIndex) { + + /**************************************************************************** + * + * Clock data out from the data shift register. + * + *****************************************************************************/ + + sclock(); + } else if (g_usFlowControl & CASCADE) { + + /**************************************************************************** + * + * Clock in last bit for the first N - 1 cascaded frames. + * + *****************************************************************************/ + + sclock(); + } + + /*************************************************************** + * + * Increment the byte index. If it exceeds 7, then reset it back + * to zero. + * + ***************************************************************/ + + cByteIndex++; + if (cByteIndex >= 8) { + if (ucDisplayFlag) { + + /*************************************************************** + * + * Store displayed data in the TDO buffer. By reusing the TDO + * buffer to store displayed data, there is no need to allocate + * a buffer simply to hold display data. This will not cause any + * false verification errors because the true TDO byte has already + * been consumed. + * + ***************************************************************/ + + g_pucOutData[usBufferIndex - 1] = ucDisplayByte; + ucDisplayByte = 0; + } + + cByteIndex = 0; + } + //09/12/07 Nguyen changed to display the 1 bit expected data + else if (a_usiDataSize == 1) { + if (ucDisplayFlag) { + + /*************************************************************** + * + * Store displayed data in the TDO buffer. By reusing the TDO + * buffer to store displayed data, there is no need to allocate + * a buffer simply to hold display data. This will not cause any + * false verification errors because the true TDO byte has already + * been consumed. + * + ***************************************************************/ + + /**************************************************************************** + * + * Flip ucDisplayByte and store it in cDataByte. + * + *****************************************************************************/ + cDataByte = 0x00; + for (usBufferIndex = 0; usBufferIndex < 8; usBufferIndex++) { + cDataByte <<= 1; + if (ucDisplayByte & 0x01) { + cDataByte |= 0x01; + } + ucDisplayByte >>= 1; + } + g_pucOutData[0] = cDataByte; + ucDisplayByte = 0; + } + + cByteIndex = 0; + } + } + if (ucDisplayFlag) { + + /**************************************************************************** + * + * Display data read from the device. + * + *****************************************************************************/ + +#ifdef VME_DEBUG + printf("RECIEVED TDO ("); +#else + vme_out_string("Display Data: 0x"); +#endif //VME_DEBUG + + //09/11/07 NN Type cast mismatch variables + for (usDataSizeIndex = (unsigned short)((a_usiDataSize + 7) / 8); usDataSizeIndex > 0; usDataSizeIndex--) { + cMaskByte = g_pucOutData[usDataSizeIndex - 1]; + cDataByte = 0x00; + + /**************************************************************************** + * + * Flip cMaskByte and store it in cDataByte. + * + *****************************************************************************/ + + for (usBufferIndex = 0; usBufferIndex < 8; usBufferIndex++) { + cDataByte <<= 1; + if (cMaskByte & 0x01) { + cDataByte |= 0x01; + } + cMaskByte >>= 1; + } +#ifdef VME_DEBUG + printf("%.2X", cDataByte); + if ((((a_usiDataSize + 7) / 8) - usDataSizeIndex) % 40 == 39) { + printf("\n\t\t"); + } +#else + vme_out_hex(cDataByte); +#endif //VME_DEBUG + } + +#ifdef VME_DEBUG + printf(")\n\n"); +#else + vme_out_string("\n\n"); +#endif //VME_DEBUG + //09/02/08 Nguyen changed to display the data Checksum + vme_out_string("g_usChecksum:"); + sprintf(StrChecksum, "%.4X\n\n", (unsigned int)g_usChecksum); + vme_out_string(StrChecksum); + vme_out_string("\n\n"); + if (g_usChecksum != 0) { + g_usChecksum &= 0xFFFF; + sprintf(StrChecksum, "Data Checksum: %.4X\n\n", (unsigned int)g_usChecksum); + vme_out_string(StrChecksum); + g_usChecksum = 0; + } + } + + if (usErrorCount > 0) { + + if (g_usFlowControl & VERIFYUES) { + vme_out_string("USERCODE verification failed. Continue programming......\n\n"); + g_usFlowControl &= ~(VERIFYUES); + return 0; + } else { + +#ifdef VME_DEBUG + printf("TOTAL ERRORS: %d\n", usErrorCount); +#endif //VME_DEBUG + + return VME_VERIFICATION_FAILURE; + } + } else { + if (g_usFlowControl & VERIFYUES) { + vme_out_string("USERCODE verification passed. Programming aborted. \n\n"); + g_usFlowControl &= ~(VERIFYUES); + return 1; + } else { + return 0; + } + } +} + +/*************************************************************** +* +* ispVMReadandSave +* +* Support dynamic I/O. +* +***************************************************************/ + +signed char ispVMReadandSave(unsigned short int a_usiDataSize) +{ + //09/11/07 NN added local variables initialization + unsigned short int usDataSizeIndex = 0; + unsigned short int usLastBitIndex = 0; + unsigned short int usBufferIndex = 0; + unsigned short int usOutBitIndex = 0; + unsigned short int usLVDSIndex = 0; + unsigned char cDataByte = 0; + unsigned char cDMASKByte = 0; + unsigned char cInDataByte = 0; + unsigned char cCurBit = 0; + unsigned char cByteIndex = 0; + signed char cLVDSByteIndex = 0; + + //09/11/07 NN Type cast mismatch variables + usLastBitIndex = (unsigned short)(a_usiDataSize - 1); + + /*************************************************************** + * + * Iterate through the data bits. + * + ***************************************************************/ + + for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize; usDataSizeIndex++) { + if (cByteIndex == 0) { + + /*************************************************************** + * + * Grab byte from DMASK buffer. + * + ***************************************************************/ + + if (g_usDataType & DMASK_DATA) { + cDMASKByte = g_pucOutDMaskData[usBufferIndex]; + } else { + cDMASKByte = 0x00; + } + + /*************************************************************** + * + * Grab byte from TDI buffer. + * + ***************************************************************/ + + if (g_usDataType & TDI_DATA) { + cInDataByte = g_pucInData[usBufferIndex]; + } + + usBufferIndex++; + } + + cCurBit = readPort(); + cDataByte = (unsigned char)(((cInDataByte << cByteIndex) & 0x80) ? 0x01 : 0x00); + + /*************************************************************** + * + * Initialize the byte to be zero. + * + ***************************************************************/ + + if (usOutBitIndex % 8 == 0) { + g_pucOutData[usOutBitIndex / 8] = 0x00; + } + + /*************************************************************** + * + * Use TDI, DMASK, and device TDO to create new TDI (actually + * stored in g_pucOutData). + * + ***************************************************************/ + + if ((((cDMASKByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) { + + if (g_pLVDSList) { + for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) { + if (g_pLVDSList[usLVDSIndex].usNegativeIndex == usDataSizeIndex) { + g_pLVDSList[usLVDSIndex].ucUpdate = 0x01; + break; + } + } + } + + /*************************************************************** + * + * DMASK bit is 1, use TDI. + * + ***************************************************************/ + + g_pucOutData[usOutBitIndex / 8] |= (unsigned char)(((cDataByte & 0x1) ? 0x01 : 0x00) << (7 - usOutBitIndex % 8)); + } else { + + /*************************************************************** + * + * DMASK bit is 0, use device TDO. + * + ***************************************************************/ + + g_pucOutData[usOutBitIndex / 8] |= (unsigned char)(((cCurBit & 0x1) ? 0x01 : 0x00) << (7 - usOutBitIndex % 8)); + } + + /*************************************************************** + * + * Shift in TDI in order to get TDO out. + * + ***************************************************************/ + + usOutBitIndex++; + writePort(JTAG_TDI, cDataByte); + if (usDataSizeIndex < usLastBitIndex) { + sclock(); + } + + /*************************************************************** + * + * Increment the byte index. If it exceeds 7, then reset it back + * to zero. + * + ***************************************************************/ + + cByteIndex++; + if (cByteIndex >= 8) { + cByteIndex = 0; + } + } + + /*************************************************************** + * + * If g_pLVDSList exists and pairs need updating, then update + * the negative-pair to receive the flipped positive-pair value. + * + ***************************************************************/ + + if (g_pLVDSList) { + for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) { + if (g_pLVDSList[usLVDSIndex].ucUpdate) { + + /*************************************************************** + * + * Read the positive value and flip it. + * + ***************************************************************/ + + cDataByte = (unsigned char)(((g_pucOutData[g_pLVDSList[usLVDSIndex].usPositiveIndex / 8] << (g_pLVDSList[usLVDSIndex].usPositiveIndex % 8)) & 0x80) ? 0x01 : 0x00); + //09/11/07 NN Type cast mismatch variables + cDataByte = (unsigned char)(!cDataByte); + + /*************************************************************** + * + * Get the byte that needs modification. + * + ***************************************************************/ + + cInDataByte = g_pucOutData[g_pLVDSList[usLVDSIndex].usNegativeIndex / 8]; + + if (cDataByte) { + + /*************************************************************** + * + * Copy over the current byte and set the negative bit to 1. + * + ***************************************************************/ + + cDataByte = 0x00; + for (cLVDSByteIndex = 7; cLVDSByteIndex >= 0; cLVDSByteIndex--) { + cDataByte <<= 1; + if (7 - (g_pLVDSList[usLVDSIndex].usNegativeIndex % 8) == cLVDSByteIndex) { + + /*************************************************************** + * + * Set negative bit to 1. + * + ***************************************************************/ + + cDataByte |= 0x01; + } else if (cInDataByte & 0x80) { + cDataByte |= 0x01; + } + + cInDataByte <<= 1; + } + + /*************************************************************** + * + * Store the modified byte. + * + ***************************************************************/ + + g_pucOutData[g_pLVDSList[usLVDSIndex].usNegativeIndex / 8] = cDataByte; + } else { + + /*************************************************************** + * + * Copy over the current byte and set the negative bit to 0. + * + ***************************************************************/ + + cDataByte = 0x00; + for (cLVDSByteIndex = 7; cLVDSByteIndex >= 0; cLVDSByteIndex--) { + cDataByte <<= 1; + if (7 - (g_pLVDSList[usLVDSIndex].usNegativeIndex % 8) == cLVDSByteIndex) { + + /*************************************************************** + * + * Set negative bit to 0. + * + ***************************************************************/ + + cDataByte |= 0x00; + } else if (cInDataByte & 0x80) { + cDataByte |= 0x01; + } + + cInDataByte <<= 1; + } + + /*************************************************************** + * + * Store the modified byte. + * + ***************************************************************/ + + g_pucOutData[g_pLVDSList[usLVDSIndex].usNegativeIndex / 8] = cDataByte; + } + + break; + } + } + } + + return (0); +} + +signed char ispVMProcessLVDS(unsigned short a_usLVDSCount) +{ + unsigned short usLVDSIndex = 0; + + /*************************************************************** + * + * Allocate memory to hold LVDS pairs. + * + ***************************************************************/ + + ispVMMemManager(LVDS, a_usLVDSCount); + g_usLVDSPairCount = a_usLVDSCount; + +#ifdef VME_DEBUG + printf("LVDS %d (", a_usLVDSCount); +#endif //VME_DEBUG + + /*************************************************************** + * + * Iterate through each given LVDS pair. + * + ***************************************************************/ + + for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) { + + /*************************************************************** + * + * Assign the positive and negative indices of the LVDS pair. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_pLVDSList[usLVDSIndex].usPositiveIndex = (unsigned short)ispVMDataSize(); + //09/11/07 NN Type cast mismatch variables + g_pLVDSList[usLVDSIndex].usNegativeIndex = (unsigned short)ispVMDataSize(); + +#ifdef VME_DEBUG + if (usLVDSIndex < g_usLVDSPairCount - 1) { + printf("%d:%d, ", g_pLVDSList[usLVDSIndex].usPositiveIndex, g_pLVDSList[usLVDSIndex].usNegativeIndex); + } else { + printf("%d:%d", g_pLVDSList[usLVDSIndex].usPositiveIndex, g_pLVDSList[usLVDSIndex].usNegativeIndex); + } +#endif //VME_DEBUG + + } + +#ifdef VME_DEBUG + printf(") -- %d;\n", a_usLVDSCount); +#endif //VME_DEBUG + + return (0); +} + +/*************************************************************** +* +* ivm_core_reinit +* +* Reinit ivm_core variables. +* +***************************************************************/ +void ivm_core_reinit() +{ + g_usFlowControl = 0x0000; + g_usDataType = 0x0000; + + g_ucEndDR = DRPAUSE; + g_ucEndIR = IRPAUSE; + + g_usHeadDR = 0; + g_usHeadIR = 0; + g_usTailDR = 0; + g_usTailIR = 0; + + g_usiDataSize = 0; + + g_iFrequency = 1000; + + g_usMaxSize = 0; + + g_usShiftValue = 0; + + g_usRepeatLoops = 0; + + g_cVendor = LATTICE; + + g_usCalculatedCRC = 0; + + g_usChecksum = 0; + g_uiChecksumIndex = 0; + + g_cCurrentJTAGState = 0; + + g_pucHeapMemory = NULL; + g_iHeapCounter = 0; + g_iHEAPSize = 0; + + g_usIntelDataIndex = 0; + g_usIntelBufferSize = 0; + + g_usTDOSize = 0; + g_usMASKSize = 0; + g_usTDISize = 0; + g_usDMASKSize = 0; + g_usLCOUNTSize = 0; + g_usHDRSize = 0; + g_usTDRSize = 0; + g_usHIRSize = 0; + g_usTIRSize = 0; + g_usHeapSize = 0; + + g_pucOutMaskData = NULL; + g_pucInData = NULL; + g_pucOutData = NULL; + g_pucHIRData = NULL; + g_pucTIRData = NULL; + g_pucHDRData = NULL; + g_pucTDRData = NULL; + g_pucIntelBuffer = NULL; + g_pucOutDMaskData = NULL; + + g_pLVDSList = NULL; + g_usLVDSPairCount = 0; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c new file mode 100644 index 000000000000..c252dfde7c57 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * firmware_upgrade_jtag + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_jtag(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret; + cmd_info_t cmd_info; + + cmd_info.size = size; + cmd_info.data = buf; + ret = 0; + + if (info->type == FIRMWARE_CPLD) { + /* 0x4A,0x41,0x4D,0x01 is JBI file */ + if (buf[0] == 0x4A && buf[1] == 0x41 && buf[2] == 0x4D && buf[3] == 0x01) { + dbg_print(is_debug_on, "Use jbi file.\n"); + ret = ioctl(fd, FIRMWARE_PROGRAM_JBI, &cmd_info); + } else { + dbg_print(is_debug_on, "Use isc file.\n"); + ret = ioctl(fd, FIRMWARE_PROGRAM, &cmd_info); + } + } + + if (info->type == FIRMWARE_FPGA) { + ret = ioctl(fd, FIRMWARE_PROGRAM, &cmd_info); + } + + if (ret < 0) { + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_jtag_test + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_jtag_test(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + return FIRMWARE_SUCCESS; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c new file mode 100644 index 000000000000..0a7659f0e428 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c @@ -0,0 +1,446 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "firmware_upgrade_mtd.h" +#include "mtd-abi.h" + +static int get_mtdnum_from_name(char *name, int *mtdnum) +{ + FILE *fp; + int ret; + char buf[PATH_LEN]; + char *start; + char *end; + char *key_w = "mtd"; + + if (name == NULL || mtdnum == NULL) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return -EINVAL; + } + ret = 0; + *mtdnum = -1; + fp = fopen("/proc/mtd", "r"); + if (fp == NULL) { + dbg_print(is_debug_on, "Not find mtd device.\n"); + return -FIRWMARE_MTD_PART_INFO_ERR; + } + + mem_clear(buf, sizeof(buf)); + while(fgets(buf, sizeof(buf), fp)) { + if (strstr(buf, name) != NULL) { + start = strstr(buf, key_w); + if (start == NULL) { + dbg_print(is_debug_on, "/proc/mtd don't find %s.\n", key_w); + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } + start += strlen(key_w); + end = strchr(start, ':'); + if (end == NULL) { + dbg_print(is_debug_on, "/proc/mtd don't find %c.\n", ':'); + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } + + *end = '\0'; + *mtdnum = atoi(start); + if (*mtdnum < 0) { + dbg_print(is_debug_on, "Not get mtd num.\n"); + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } + } + } + + if (*mtdnum == -1) { + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } +exit: + if (fp != NULL) { + fclose(fp); + } + + return ret; +} + +static int firmware_sysfs_get_dev_info(int fd, firmware_mtd_info_t *dev_info) +{ + int ret; + + ret = ioctl(fd, FIRMWARE_SYSFS_MTD_INFO, dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to get upg device file info.\n"); + return ret; + } + + dbg_print(is_debug_on, "mtd_name=%s flash_base=0x%x test_base=0x%x test_size=%d.\n", + dev_info->mtd_name, dev_info->flash_base, dev_info->test_base, dev_info->test_size); + return 0; +} + +/* + * MEMGETINFO + */ +static int getmeminfo(int fd, struct mtd_info_user *mtd) +{ + return ioctl(fd, MEMGETINFO, mtd); +} + +/* + * MEMERASE + */ +static int memerase(int fd, struct erase_info_user *erase) +{ + return ioctl(fd, MEMERASE, erase); +} + +static int erase_flash(int fd, uint32_t offset, uint32_t bytes) +{ + int err; + struct erase_info_user erase; + erase.start = offset; + erase.length = bytes; + err = memerase(fd, &erase); + if (err < 0) { + dbg_print(is_debug_on, "Error: memerase failed, err=%d\n", err); + return -FIRWMARE_MTD_MEMERASE; + } + dbg_print(is_debug_on, "Erased %d bytes from address 0x%.8x in flash\n", bytes, offset); + return 0; +} + +/* + * firmware_upgrade_mtd_block + * function: upgrade mtd device block + * @dev_info: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_upgrade_mtd_block(int mtd_fd, uint32_t offset, + uint8_t *buf, uint32_t size, uint32_t erasesize) +{ + int ret; + int i; + uint8_t *reread_buf; + uint32_t cmp_retry, reread_len, write_len; + + /* Read back data */ + reread_buf = (uint8_t *) malloc(size); + if (reread_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for read back data buf, size=%d.\n", size); + return FIRMWARE_FAILED; + } + + for (cmp_retry = 0; cmp_retry < FW_SYSFS_RETRY_TIME; cmp_retry++) { + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + if (offset != lseek(mtd_fd, offset, SEEK_SET)) { + dbg_print(is_debug_on, "Error:lseek mtd offset=%x retrytimes=%d failed.\n", offset, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + + dbg_print(is_debug_on, "erase mtd offset=0x%x erasesize=%d retrytimes=%d.\n", + offset, erasesize, i); + ret = erase_flash(mtd_fd, offset, erasesize); + if (ret < 0) { + dbg_print(is_debug_on, "Error:erase mtd offset=%x size=%d retrytimes=%d failed, ret=%d\n", + offset, size, i, ret); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + + dbg_print(is_debug_on, "write mtd offset=0x%x size=%d retrytimes=%d.\n", + offset, size, i); + write_len = write(mtd_fd, buf, size); + if (write_len != size) { + dbg_print(is_debug_on, "Error:write mtd offset=0x%x size=%d write_len=%d retrytimes=%d.\n", + offset, size, write_len, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "Error: upgrade mtd fail, offset = 0x%x, size = %d\n", offset, size); + free(reread_buf); + return FIRMWARE_FAILED; + } + + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + dbg_print(is_debug_on, "Reread mtd offset=0x%x size=%d\n", offset, size); + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + if (offset != lseek(mtd_fd, offset, SEEK_SET)) { + dbg_print(is_debug_on, "Error:lseek mtd offset=%x retrytimes=%d failed.\n", offset, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + + reread_len = read(mtd_fd, reread_buf, size); + if (reread_len != size) { + dbg_print(is_debug_on, "Error:reread mtd offset=0x%x size=%d reread_len=%d retrytimes=%d.\n", + offset, size, reread_len, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "Error: reread mtd fail, offset = 0x%x size = %d\n", offset, size); + free(reread_buf); + return FIRMWARE_FAILED; + } + + /* Check data */ + if (memcmp(reread_buf, buf, size) != 0) { + dbg_print(is_debug_on, "memcmp mtd fail,offset = 0x%x retrytimes = %d\n", offset, cmp_retry); + } else { + break; + } + } + if (cmp_retry >= FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "upgrade mtd fail, offset = 0x%x.\n", offset); + dbg_print(is_debug_on, "want to write buf :\n"); + for (i = 0; i < size; i++) { + dbg_print(is_debug_on, "0x%x ", buf[i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + dbg_print(is_debug_on, "actually reread buf :\n"); + for (i = 0; i < size; i++) { + dbg_print(is_debug_on, "0x%x ", reread_buf[i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + free(reread_buf); + return FIRMWARE_FAILED; + } + + free(reread_buf); + dbg_print(is_debug_on, "firmware upgrade mtd block offset[0x%.8x] success.\n", offset); + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_mtd_program + * function: upgrade mtd device + * @dev_info: param[in] Device file descriptor + * @flash_base: param[in] Upgrade the flash start address + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_upgrade_mtd_program(firmware_mtd_info_t *dev_info, + int flash_base, uint8_t *buf, uint32_t size) +{ + int ret; + int mtdnum; + char dev_mtd[PATH_LEN]; + int mtd_fd; + uint32_t offset, len, block_size; + struct mtd_info_user mtd_info; + uint8_t *data_point; + + ret = get_mtdnum_from_name(dev_info->mtd_name, &mtdnum); + if (ret < 0) { + dbg_print(is_debug_on, "Error:not find %s mtd num.\n", dev_info->mtd_name); + return FIRMWARE_FAILED; + } + + mem_clear(dev_mtd, sizeof(dev_mtd)); + snprintf(dev_mtd, sizeof(dev_mtd) - 1, "/dev/mtd%d", mtdnum); + + mtd_fd = open(dev_mtd, O_SYNC | O_RDWR); + if (mtd_fd < 0) { + dbg_print(is_debug_on, "Error:open %s failed.\n", dev_mtd); + goto err; + } + + ret = getmeminfo(mtd_fd, &mtd_info); + if (ret < 0) { + dbg_print(is_debug_on, "Error:get mtd info failed, ret=%d.\n", ret); + goto failed; + } + + offset = flash_base; + if (offset >= mtd_info.size) { + dbg_print(is_debug_on, "Error: offset[0x%.8x] over size[0x%.8x]\n", offset, size); + goto failed; + } + + len = size; + data_point = buf; + while ((offset < mtd_info.size) && (len > 0)) { + if (len > mtd_info.erasesize) { + block_size = mtd_info.erasesize; + } else { + block_size = len; + } + dbg_print(is_debug_on, "upgrade mtd[%s] block offset[0x%.8x] size[%d] relen[%d].\n", dev_mtd, offset, size, len); + ret = firmware_upgrade_mtd_block(mtd_fd, offset, data_point, block_size, mtd_info.erasesize); + if (ret < 0) { + dbg_print(is_debug_on, "Error: mt block offset[0x%.8x] size[0x%.8x] failed.\n", offset, block_size); + goto failed; + } + len -= block_size; + data_point += block_size; + offset += block_size; + usleep(FW_MTD_BLOCK_SLEEP_TIME); + } + + if (close(mtd_fd) < 0) { + dbg_print(is_debug_on, "Error:close %s failed.\n", dev_mtd); + } + dbg_print(is_debug_on, "firmware upgrade mtd device success.\n"); + return FIRMWARE_SUCCESS; + +failed: + if (close(mtd_fd) < 0) { + dbg_print(is_debug_on, "Error:close %s failed.\n", dev_mtd); + } + +err: + dbg_print(is_debug_on, "firmware upgrade mtd device fail.\n"); + return FIRMWARE_FAILED; +} + +/* + * firmware_upgrade_mtd + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_mtd(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret; + firmware_mtd_info_t dev_info; + + if ((buf == NULL) || (info == NULL)) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return FIRMWARE_FAILED; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + return FIRMWARE_FAILED; + } + + ret = firmware_upgrade_mtd_program(&dev_info, dev_info.flash_base, buf, size); + if (ret < 0) { + dbg_print(is_debug_on, "Error:mtd device program failed, ret=%d.\n", ret); + goto failed; + } + + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + + return FIRMWARE_SUCCESS; + +failed: + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH,NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + + return FIRMWARE_FAILED; +} + +/* + * firmware_upgrade_mtd_test + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_mtd_test(int fd, name_info_t *info) +{ + int ret, rv; + firmware_mtd_info_t dev_info; + uint8_t *data_buf; + uint8_t num; + int j; + + if (info == NULL) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return FIRMWARE_FAILED; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + if (dev_info.test_size == 0) { + dbg_print(is_debug_on, "Error: get flash size:%d, not support.\n", dev_info.test_size); + return FIRMWARE_NOT_SUPPORT; + } + + data_buf = (uint8_t *) malloc(dev_info.test_size); + if (data_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for test data buf, size=%d.\n", dev_info.test_size); + return FIRMWARE_FAILED; + } + + /* Get random data */ + for (j = 0; j < dev_info.test_size; j++) { + num = (uint8_t) rand() % 256; + data_buf[j] = num & 0xff; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + free(data_buf); + return FIRMWARE_FAILED; + } + + ret = firmware_upgrade_mtd_program(&dev_info, dev_info.test_base, data_buf, dev_info.test_size); + /* disable upgrade access */ + rv = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (rv < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + free(data_buf); + if (ret < 0) { + dbg_print(is_debug_on, "Error:mtd device program failed, ret=%d.\n", ret); + return FIRMWARE_FAILED; + } + return FIRMWARE_SUCCESS; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h new file mode 100644 index 000000000000..06e36b3149d5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h @@ -0,0 +1,32 @@ +#ifndef __FIRMWARE_UPGRADE_MTD_H__ +#define __FIRMWARE_UPGRADE_MTD_H__ + +#include + +#define FIRMWARE_DEV_NAME_LEN 64 /* the macro definition needs to same as FIRMWARE_DEV_NAME_LEN in firmware_sysfs_upgrade.h */ +#define PATH_LEN (256) +#define FW_MTD_BLOCK_SLEEP_TIME (10000) /* 10ms */ +#define FW_SYSFS_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define FW_SYSFS_RETRY_TIME (5) /* retry 5 times, 50ms = FW_SYSFS_RETRY_TIME *FW_SYSFS_RETRY_SLEEP_TIME; */ + +/* Debug switch level */ +typedef enum { + FIRWMARE_MTD_SUCCESS = 0, + FIRWMARE_MTD_PART_INFO_ERR, + FIRWMARE_MTD_MEMERASE, + FIRWMARE_MTD_MEMGETINFO, + FIRWMARE_END, +} firmware_debug_level_t; + +#define debug(fmt, argv...) do { \ + dbg_print(is_debug_on, ""fmt , ##argv);\ + } while(0) + +typedef struct firmware_mtd_info_s { + char mtd_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_mtd_info_t; + +#endif /* End of __FIRMWARE_UPGRADE_MTD_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h new file mode 100644 index 000000000000..f326d23e732e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h @@ -0,0 +1,259 @@ + +#ifndef __MTD_ABI_H__ +#define __MTD_ABI_H__ + +#include + +struct erase_info_user { + __u32 start; + __u32 length; +}; + +struct erase_info_user64 { + __u64 start; + __u64 length; +}; + +struct mtd_oob_buf { + __u32 start; + __u32 length; + unsigned char *ptr; +}; + +struct mtd_oob_buf64 { + __u64 start; + __u32 pad; + __u32 length; + __u64 usr_ptr; +}; + +/** + * MTD operation modes + * + * @MTD_OPS_PLACE_OOB: OOB data are placed at the given offset (default) + * @MTD_OPS_AUTO_OOB: OOB data are automatically placed at the free areas + * which are defined by the internal ecclayout + * @MTD_OPS_RAW: data are transferred as-is, with no error correction; + * this mode implies %MTD_OPS_PLACE_OOB + * + * These modes can be passed to ioctl(MEMWRITE) and are also used internally. + * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs. + * %MTD_FILE_MODE_RAW. + */ +enum { + MTD_OPS_PLACE_OOB = 0, + MTD_OPS_AUTO_OOB = 1, + MTD_OPS_RAW = 2, +}; + +/** + * struct mtd_write_req - data structure for requesting a write operation + * + * @start: start address + * @len: length of data buffer + * @ooblen: length of OOB buffer + * @usr_data: user-provided data buffer + * @usr_oob: user-provided OOB buffer + * @mode: MTD mode (see "MTD operation modes") + * @padding: reserved, must be set to 0 + * + * This structure supports ioctl(MEMWRITE) operations, allowing data and/or OOB + * writes in various modes. To write to OOB-only, set @usr_data == NULL, and to + * write data-only, set @usr_oob == NULL. However, setting both @usr_data and + * @usr_oob to NULL is not allowed. + */ +struct mtd_write_req { + __u64 start; + __u64 len; + __u64 ooblen; + __u64 usr_data; + __u64 usr_oob; + __u8 mode; + __u8 padding[7]; +}; + +#define MTD_ABSENT 0 +#define MTD_RAM 1 +#define MTD_ROM 2 +#define MTD_NORFLASH 3 +#define MTD_NANDFLASH 4 +#define MTD_DATAFLASH 6 +#define MTD_UBIVOLUME 7 +#define MTD_MLCNANDFLASH 8 + +#define MTD_WRITEABLE 0x400 /* Device is writeable */ +#define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ +#define MTD_NO_ERASE 0x1000 /* No erase necessary */ +#define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */ + +/* Some common devices / combinations of capabilities */ +#define MTD_CAP_ROM 0 +#define MTD_CAP_RAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE) +#define MTD_CAP_NORFLASH (MTD_WRITEABLE | MTD_BIT_WRITEABLE) +#define MTD_CAP_NANDFLASH (MTD_WRITEABLE) + +/* Obsolete ECC byte placement modes (used with obsolete MEMGETOOBSEL) */ +#define MTD_NANDECC_OFF 0 // Switch off ECC (Not recommended) +#define MTD_NANDECC_PLACE 1 // Use the given placement in the structure (YAFFS1 legacy mode) +#define MTD_NANDECC_AUTOPLACE 2 // Use the default placement scheme +#define MTD_NANDECC_PLACEONLY 3 // Use the given placement in the structure (Do not store ecc result on read) +#define MTD_NANDECC_AUTOPL_USR 4 // Use the given autoplacement scheme rather than using the default + +/* OTP mode selection */ +#define MTD_OTP_OFF 0 +#define MTD_OTP_FACTORY 1 +#define MTD_OTP_USER 2 + +typedef struct mtd_info_user { + __u8 type; + __u32 flags; + __u32 size; /* Total size of the MTD */ + __u32 erasesize; + __u32 writesize; + __u32 oobsize; /* Amount of OOB data per block (e.g. 16) */ + __u64 padding; /* Old obsolete field; do not use */ +} mtd_info_user_t; + +struct region_info_user { + __u32 offset; /* At which this region starts, + * from the beginning of the MTD */ + __u32 erasesize; /* For this region */ + __u32 numblocks; /* Number of blocks in this region */ + __u32 regionindex; +}; + +struct otp_info { + __u32 start; + __u32 length; + __u32 locked; +}; + +/* + * Note, the following ioctl existed in the past and was removed: + * #define MEMSETOOBSEL _IOW('M', 9, struct nand_oobinfo) + * Try to avoid adding a new ioctl with the same ioctl number. + */ + +/* Get basic MTD characteristics info (better to use sysfs) */ +#define MEMGETINFO _IOR('M', 1, struct mtd_info_user) +/* Erase segment of MTD */ +#define MEMERASE _IOW('M', 2, struct erase_info_user) +/* Write out-of-band data from MTD */ +#define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf) +/* Read out-of-band data from MTD */ +#define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf) +/* Lock a chip (for MTD that supports it) */ +#define MEMLOCK _IOW('M', 5, struct erase_info_user) +/* Unlock a chip (for MTD that supports it) */ +#define MEMUNLOCK _IOW('M', 6, struct erase_info_user) +/* Get the number of different erase regions */ +#define MEMGETREGIONCOUNT _IOR('M', 7, int) +/* Get information about the erase region for a specific index */ +#define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user) +/* Get info about OOB modes (e.g., RAW, PLACE, AUTO) - legacy interface */ +#define MEMGETOOBSEL _IOR('M', 10, struct nand_oobinfo) +/* Check if an eraseblock is bad */ +#define MEMGETBADBLOCK _IOW('M', 11, __kernel_loff_t) +/* Mark an eraseblock as bad */ +#define MEMSETBADBLOCK _IOW('M', 12, __kernel_loff_t) +/* Set OTP (One-Time Programmable) mode (factory vs. user) */ +#define OTPSELECT _IOR('M', 13, int) +/* Get number of OTP (One-Time Programmable) regions */ +#define OTPGETREGIONCOUNT _IOW('M', 14, int) +/* Get all OTP (One-Time Programmable) info about MTD */ +#define OTPGETREGIONINFO _IOW('M', 15, struct otp_info) +/* Lock a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */ +#define OTPLOCK _IOR('M', 16, struct otp_info) +/* Get ECC layout (deprecated) */ +#define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout_user) +/* Get statistics about corrected/uncorrected errors */ +#define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats) +/* Set MTD mode on a per-file-descriptor basis (see "MTD file modes") */ +#define MTDFILEMODE _IO('M', 19) +/* Erase segment of MTD (supports 64-bit address) */ +#define MEMERASE64 _IOW('M', 20, struct erase_info_user64) +/* Write data to OOB (64-bit version) */ +#define MEMWRITEOOB64 _IOWR('M', 21, struct mtd_oob_buf64) +/* Read data from OOB (64-bit version) */ +#define MEMREADOOB64 _IOWR('M', 22, struct mtd_oob_buf64) +/* Check if chip is locked (for MTD that supports it) */ +#define MEMISLOCKED _IOR('M', 23, struct erase_info_user) +/* + * Most generic write interface; can write in-band and/or out-of-band in various + * modes (see "struct mtd_write_req") + */ +#define MEMWRITE _IOWR('M', 24, struct mtd_write_req) + +/* + * Obsolete legacy interface. Keep it in order not to break userspace + * interfaces + */ +struct nand_oobinfo { + __u32 useecc; + __u32 eccbytes; + __u32 oobfree[8][2]; + __u32 eccpos[32]; +}; + +struct nand_oobfree { + __u32 offset; + __u32 length; +}; + +#define MTD_MAX_OOBFREE_ENTRIES 8 +#define MTD_MAX_ECCPOS_ENTRIES 64 +/* + * OBSOLETE: ECC layout control structure. Exported to user-space via ioctl + * ECCGETLAYOUT for backwards compatbility and should not be mistaken as a + * complete set of ECC information. The ioctl truncates the larger internal + * structure to retain binary compatibility with the static declaration of the + * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of + * the user struct, not the MAX size of the internal struct nand_ecclayout. + */ +struct nand_ecclayout_user { + __u32 eccbytes; + __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES]; + __u32 oobavail; + struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES]; +}; + +/** + * struct mtd_ecc_stats - error correction stats + * + * @corrected: number of corrected bits + * @failed: number of uncorrectable errors + * @badblocks: number of bad blocks in this partition + * @bbtblocks: number of blocks reserved for bad block tables + */ +struct mtd_ecc_stats { + __u32 corrected; + __u32 failed; + __u32 badblocks; + __u32 bbtblocks; +}; + +/* + * MTD file modes - for read/write access to MTD + * + * @MTD_FILE_MODE_NORMAL: OTP disabled, ECC enabled + * @MTD_FILE_MODE_OTP_FACTORY: OTP enabled in factory mode + * @MTD_FILE_MODE_OTP_USER: OTP enabled in user mode + * @MTD_FILE_MODE_RAW: OTP disabled, ECC disabled + * + * These modes can be set via ioctl(MTDFILEMODE). The mode mode will be retained + * separately for each open file descriptor. + * + * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW - + * raw access to the flash, without error correction or autoplacement schemes. + * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode + * (e.g., when using ioctl(MEMWRITE)), but in some cases, the MTD_FILE_MODE is + * used out of necessity (e.g., `write()', ioctl(MEMWRITEOOB64)). + */ +enum mtd_file_modes { + MTD_FILE_MODE_NORMAL = MTD_OTP_OFF, + MTD_FILE_MODE_OTP_FACTORY = MTD_OTP_FACTORY, + MTD_FILE_MODE_OTP_USER = MTD_OTP_USER, + MTD_FILE_MODE_RAW, +}; + +#endif /* __MTD_ABI_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c new file mode 100644 index 000000000000..10a429d93bde --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c @@ -0,0 +1,285 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "firmware_upgrade_sysfs.h" + +static int firmware_sysfs_get_dev_info(int fd, firmware_dev_file_info_t *dev_info) +{ + int ret; + + ret = ioctl(fd, FIRMWARE_SYSFS_DEV_FILE_INFO, dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to get upg flash dev info.\n"); + return ret; + } + + dbg_print(is_debug_on, "sysfs_name=%s per_len=%u.\n", dev_info->sysfs_name, dev_info->per_len); + return 0; +} + +/* sysfs upgrade program function */ +int firmware_upgrade_sysfs_program(firmware_dev_file_info_t *dev_info, uint32_t dev_base, + uint8_t *buf, uint32_t size) +{ + int ret = 0; + uint32_t offset_addr, buf_offset, len; + uint32_t write_len, cmp_retry, reread_len; + int sysfs_fd; + uint8_t *reread_buf; + int i; + + if (dev_info->per_len > 0) { + if (size % dev_info->per_len) { + dbg_print(is_debug_on, "firmware sysfs upgrade size[%u] is width[%u] mismatch, ret %d.\n", + size, dev_info->per_len, ret); + return FIRMWARE_FAILED; + } + len = dev_info->per_len; + } else { + /* Write to the maximum buffer if the length of each write is not configured */ + len = size; + } + + /* Read back data */ + reread_buf = (uint8_t *) malloc(len); + if (reread_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for read back data buf, len=%u.\n", len); + return FIRMWARE_FAILED; + } + + sysfs_fd = open(dev_info->sysfs_name, O_RDWR | O_SYNC); + if (sysfs_fd < 0) { + dbg_print(is_debug_on, "open file[%s] fail.\n", dev_info->sysfs_name); + free(reread_buf); + return FIRMWARE_FAILED; + } + + offset_addr = dev_base; + buf_offset = 0; + cmp_retry = 0; + while (buf_offset < size) { + /* Calibrate upgrade data length */ + if (buf_offset + len > size) { + len = size - buf_offset; + } + + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + ret = lseek(sysfs_fd, offset_addr, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "lseek file[%s offset=%u] fail.\n", dev_info->sysfs_name, offset_addr); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + write_len = write(sysfs_fd, buf + buf_offset, len); + if (write_len != len) { + dbg_print(is_debug_on, "write file[%s] fail,offset = 0x%x retrytimes = %u len = %u, write_len =%u\n", + dev_info->sysfs_name, offset_addr, i ,len, write_len); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "write file[%s] fail, offset = 0x%x, len = %u, write_len =%u\n", + dev_info->sysfs_name, offset_addr, len, write_len); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + + mem_clear(reread_buf, len); + ret = lseek(sysfs_fd, offset_addr, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "reread lseek file[%s offset=%u] fail.\n", dev_info->sysfs_name, offset_addr); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + reread_len = read(sysfs_fd, reread_buf, len); + if (reread_len != len) { + dbg_print(is_debug_on, "reread file[%s] fail,offset = 0x%x retrytimes = %u reread_len = %u, len =%u\n", + dev_info->sysfs_name, offset_addr, i ,reread_len, len); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "reread file[%s] fail, offset = 0x%x, reread_len = %u, len = %u\n", + dev_info->sysfs_name, offset_addr, reread_len, len); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + + /* Check data */ + if (memcmp(reread_buf, buf + buf_offset, len) != 0) { + if (cmp_retry < FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "memcmp file[%s] fail,offset = 0x%x retrytimes = %u\n", + dev_info->sysfs_name, offset_addr, cmp_retry); + cmp_retry++; + continue; + } + + dbg_print(is_debug_on, "upgrade file[%s] fail, offset = 0x%x.\n", dev_info->sysfs_name, offset_addr); + dbg_print(is_debug_on, "want to write buf :\n"); + for (i = 0; i < len; i++) { + dbg_print(is_debug_on, "0x%x ", buf[buf_offset + i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + dbg_print(is_debug_on, "actually reread buf :\n"); + for (i = 0; i < len; i++) { + dbg_print(is_debug_on, "0x%x ", reread_buf[i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + offset_addr += len; + buf_offset += len; + usleep(5000); + } + free(reread_buf); + + dbg_print(is_debug_on, "firmware upgrade sysfs success.\n"); + close(sysfs_fd); + return FIRMWARE_SUCCESS; +} + +/* sysfs upgrade function */ +int firmware_upgrade_sysfs(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret = 0; + firmware_dev_file_info_t dev_info; + + if ((buf == NULL) || (info == NULL)) { + dbg_print(is_debug_on, "Input invalid error.\n"); + goto exit; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + goto exit; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + goto exit; + } + + ret = firmware_upgrade_sysfs_program(&dev_info, dev_info.dev_base, buf, size); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + goto fail; + } + + dbg_print(is_debug_on, "firmware upgrade sysfs success.\n"); + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH,NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + return FIRMWARE_SUCCESS; + +fail: + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } +exit: + dbg_print(is_debug_on, "firmware upgrade sysfs fail.\n"); + return FIRMWARE_FAILED; +} + +/* sysfs upgrade test function */ +int firmware_upgrade_sysfs_test(int fd, name_info_t *info) +{ + int ret, rv; + firmware_dev_file_info_t dev_info; + uint8_t *data_buf; + uint8_t num; + int j; + + if (info == NULL) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return FIRMWARE_FAILED; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + if (dev_info.test_size == 0) { + dbg_print(is_debug_on, "Error: get sysfs test size:%d, not support.\n", dev_info.test_size); + return FIRMWARE_NOT_SUPPORT; + } + + data_buf = (uint8_t *) malloc(dev_info.test_size); + if (data_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for test data buf, size=%d.\n", dev_info.test_size); + return FIRMWARE_FAILED; + } + + /* Get random data */ + for (j = 0; j < dev_info.test_size; j++) { + num = (uint8_t) rand() % 256; + data_buf[j] = num & 0xff; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + free(data_buf); + return FIRMWARE_FAILED; + } + + ret = firmware_upgrade_sysfs_program(&dev_info, dev_info.test_base, data_buf, dev_info.test_size); + /* disable upgrade access */ + rv = ioctl(fd, FIRMWARE_SYSFS_FINISH,NULL); + if (rv < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + free(data_buf); + + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "firmware upgrade sysfs success.\n"); + return FIRMWARE_SUCCESS; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h new file mode 100644 index 000000000000..b69080ea642e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h @@ -0,0 +1,16 @@ +#ifndef __FIRMWARE_UPGRADE_SYSFS_H__ +#define __FIRMWARE_UPGRADE_SYSFS_H__ + +#define FIRMWARE_DEV_NAME_LEN (64) /* the macro definition needs to same as FIRMWARE_DEV_NAME_LEN in firmware_sysfs_upgrade.h */ +#define FW_SYSFS_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define FW_SYSFS_RETRY_TIME (5) /* retry 5 times, 50ms = FW_SYSFS_RETRY_TIME *FW_SYSFS_RETRY_SLEEP_TIME; */ + +typedef struct firmware_dev_file_info_s { + char sysfs_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t dev_base; /* device upgrade base address */ + uint32_t per_len; /* The length of bytes per operation */ + uint32_t test_base; /* Test device address */ + uint32_t test_size; /* Test flash size */ +} firmware_dev_file_info_t; + +#endif /* End of __FIRMWARE_UPGRADE_SYSFS_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c new file mode 100644 index 000000000000..7db3c1b7b6ec --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c @@ -0,0 +1,1181 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fw_upg_spi_logic_dev.h" + +#define be32_to_cpus(p) __be32_to_cpus(p) +#define le32_to_cpus(p) __le32_to_cpus(p) +#define cpu_to_be32s(p) __cpu_to_be32s(p) +#define cpu_to_le32s(p) __cpu_to_le32s(p) + +static void firmware_upgrade_printf_reg(uint8_t *buf, int buf_len, uint32_t offset_addr) +{ + int i, j, tmp; + + j = offset_addr % 16; + tmp = j; + offset_addr -= j; + printf("\n "); + + for (i = 0; i < 16; i++) { + printf("%2x ", i); + } + + for (i = 0; i < buf_len + j; i++) { + if ((i % 16) == 0) { + printf("\n0x%08x ", offset_addr); + offset_addr = offset_addr + 16; + } + if (tmp) { + printf(" "); + tmp--; + } else { + printf("%02x ", buf[i-j]); + } + } + + printf("\n"); + return; +} + +static int firmware_upgrade_get_spi_logic_info(int fd, firmware_spi_logic_upg_t *current_upg_priv) +{ + int ret; + firmware_spi_logic_info_t syfs_info; + + if (fd < 0) { + dbg_print(is_debug_on, "Error: get spi logic info fd %d.\n", fd); + return fd; + } + + ret = 0; + ret = ioctl(fd, FIRMWARE_SYSFS_SPI_INFO, &syfs_info); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to get upg flash dev info, ret=%d\n", ret); + return -FW_SPI_FLASH_GET_INFO_ERR; + } + + current_upg_priv->flash_base = syfs_info.flash_base; + current_upg_priv->ctrl_base = syfs_info.ctrl_base; + memcpy(current_upg_priv->dev_path, syfs_info.logic_dev_name, FIRMWARE_LOGIC_DEV_NAME_LEN - 1); + current_upg_priv->status_reg = syfs_info.ctrl_base + FPGA_UPG_STATUS_REG; + current_upg_priv->spi_ctrl_reg = syfs_info.ctrl_base + FPGA_UPG_SPI_CTRL_REG; + current_upg_priv->wr_flash_status_reg = syfs_info.ctrl_base + FPGA_UPG_WR_FLASH_STATUS_REG; + current_upg_priv->rd_flash_status_reg = syfs_info.ctrl_base + FPGA_UPG_RD_FLASH_STATUS_REG; + current_upg_priv->instruction_reg = syfs_info.ctrl_base + FPGA_UPG_INSTRUCTION_REG; + current_upg_priv->addr_reg = syfs_info.ctrl_base + FPGA_UPG_ADDR_REG; + current_upg_priv->length_reg = syfs_info.ctrl_base + FPGA_UPG_LENGTH_REG; + current_upg_priv->device_id_reg = syfs_info.ctrl_base + FPGA_UPG_DEVICE_ID_REG; + current_upg_priv->drop_reg_num_reg = syfs_info.ctrl_base + FPGA_UPG_DROP_REQ_NUM_REG; + current_upg_priv->test_base = syfs_info.test_base; + current_upg_priv->test_size = syfs_info.test_size; + + return 0; +} + +static int firmware_upgrade_spi_logic_init(int fd) +{ + int ret; + + ret = 0; + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to init spi logic, ret=%d\n", ret); + return -1; + } + + return 0; +} + +static int firmware_upgrade_spi_logic_finish(int fd) +{ + int ret; + + if (fd < 0) { + dbg_print(is_debug_on, "Error: get spi logic info fd %d.\n", fd); + return -1; + } + + ret = 0; + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to release spi logic, ret=%d\n", ret); + return -1; + } + + return 0; +} + +/** + * firmware_fpga_file_read - + * function:Provide FPGA read-register interface (address must be 4-byte aligned) + * @dev_name: Device file descriptor + * @offset: device offset + * @buf: Read Data Buffer + * @rd_len: Read Data Length + * return: 0--success; other--fail + */ +int firmware_fpga_file_read(char *dev_name, uint32_t offset, uint8_t *buf, uint32_t rd_len) +{ + int ret, fd; + + if ((dev_name == NULL) || (buf == NULL)) { + dbg_print(is_debug_on, "upg_priv or read buf is null.\n"); + return -1; + } + + if ((fd = open(dev_name, O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO)) < 0) { + dbg_print(is_debug_on, "Error: Could not open file %s. Errno=%d\n", dev_name, errno); + return -1; + } + + ret = lseek(fd, offset, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "read llseek failed, errno: %s\n", strerror(errno)); + close(fd); + return -1; + } + + ret = read(fd, buf, rd_len); + if (ret < 0) { + dbg_print(is_debug_on, "read failed, err: %s\n", strerror(errno)); + close(fd); + return -1; + } + + close(fd); + return 0; +} + +static int firmware_fpga_read_word(char *dev_name, uint32_t addr, uint32_t *val) +{ + int ret; + uint32_t retry; + + if (sizeof(int) < FIRMWARE_FPGA_WORD_LEN) { + dbg_print(is_debug_on, "Error:dfd_fpga_read_word buf len %ld support len %d.\n", + sizeof(int), FIRMWARE_FPGA_WORD_LEN); + return -1; + } + + retry = 0; + *val = 0; + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_read(dev_name, addr, (uint8_t *)val, FIRMWARE_FPGA_WORD_LEN); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_read addr 0x%x retry %u failed ret %d.\n", + addr, retry, ret); + continue; + } else { + le32_to_cpus(val); + return 0; + } + } + + dbg_print(is_debug_on, "dfd_fpga_read_word addr 0x%x retry %u failed ret %d.\n", addr, retry, ret); + return -1; +} + +static int firmware_fpga_read_buf(char *dev_name, uint32_t addr, uint8_t *buf, uint32_t rd_len) +{ + int ret; + uint32_t retry; + + retry = 0; + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_read(dev_name, addr, buf, rd_len); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_read addr 0x%x rd_len %u i %d failed ret %d.\n", + addr, rd_len, retry, ret); + continue; + } else { + return 0; + } + } + + dbg_print(is_debug_on, "firmware_fpga_file_read addr 0x%x rd_len %u retry %u failed ret %d.\n", + addr, rd_len, retry, ret); + return -1; +} + +/** + * firmware_fpga_file_write - + * function:Provide FPGA write-register interface (address must be 4-byte aligned) + * @dev_name: Device file descriptor + * @offset: device offset + * @buf: Write Data Buffer + * @wr_len: Write Data Length + * return: 0--success; other--fail + */ +int firmware_fpga_file_write(char *dev_name, uint32_t offset, uint8_t *buf, uint32_t wr_len) +{ + int ret, fd; + + if ((dev_name == NULL) || (buf == NULL)) { + dbg_print(is_debug_on, "dev_name or write buf is null.\n"); + return -1; + } + + if ((fd = open(dev_name, O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO)) < 0) { + dbg_print(is_debug_on, "Error: Could not open file %s. Errno=%d\n", dev_name, errno); + return -1; + } + + ret = lseek(fd, offset, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "write llseek failed, err: %s\n", strerror(errno)); + close(fd); + return -1; + } + + ret = write(fd, buf, wr_len); + if (ret < 0 ) { + dbg_print(is_debug_on, "write failed, err: %s\n", strerror(errno)); + close(fd); + return -1; + } + + close(fd); + return 0; +} + +static int firmware_fpga_write_word(char *dev_name, uint32_t addr, uint32_t val) +{ + int ret; + uint32_t retry, tmp; + + retry = 0; + tmp = val; + cpu_to_le32s(&tmp); + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_write(dev_name, addr, (uint8_t *)&tmp, FIRMWARE_FPGA_WORD_LEN); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_write addr 0x%x val 0x%x retry %u failed ret %d.\n", + addr, val, retry, ret); + continue; + } else { + return 0; + } + } + + dbg_print(is_debug_on, "firmware_fpga_file_write addr 0x%x val 0x%x retry %u failed ret %d.\n", + addr, val, retry, ret); + return -1; +} + +static int firmware_fpga_write_buf(char *dev_name, uint32_t addr, uint8_t *buf, uint32_t wr_len) +{ + int ret; + uint32_t retry; + + retry = 0; + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_write(dev_name, addr, buf, wr_len); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_write addr 0x%x wr_len 0x%x retry %u failed ret %d.\n", + addr, wr_len, retry, ret); + continue; + } else { + return 0; + } + } + + dbg_print(is_debug_on, "dfd_fpga_buf_write addr 0x%x wr_len 0x%x retry %u failed ret %d.\n", + addr, wr_len, retry, ret); + + return -1; +} + +/* Whether the SPI port is idle, 0--idle, 1--busy */ +static int firmware_fpga_get_status(firmware_spi_logic_upg_t *upg_priv, char *status) +{ + int ret; + uint32_t addr, val; + + addr = upg_priv->status_reg; + ret = firmware_fpga_read_word(upg_priv->dev_path, addr, &val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_get_status addr 0x%x failed ret %d.\n", addr, ret); + return -1; + } + + *status = val & FPGA_UPG_STATUS_MASK; + + return 0; +} + +/* Wait for the SPI port to become free again */ +static int firmware_fpga_wait_ready(firmware_spi_logic_upg_t *upg_priv) +{ + int timeout; + char status; + int ret; + + timeout = FIRMWARE_UPG_RETRY_TIME_CNT; + while (timeout--) { + usleep(FIRMWARE_UPG_RETRY_SLEEP_TIME); + ret = firmware_fpga_get_status(upg_priv, &status); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_get_status failed ret %d.\n", ret); + continue; + } + + /* Determine if it's idle */ + if (!status) { + return 0; + } + } + + return -1; +} + +/* Configure access */ +static int firmware_fpga_set_access(firmware_spi_logic_upg_t *upg_priv, uint32_t cmd) +{ + int ret; + uint32_t addr, val; + + addr = upg_priv->instruction_reg; + val = cmd; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", addr, val, ret); + return -1; + } + + addr = upg_priv->spi_ctrl_reg; + val = FPGA_UPG_ACCESS_ENABLE; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", addr, val, ret); + return -1; + } + + /* Wait for the SPI port on the FPGA to become free again*/ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + return 0; +} + +/* Get SPI STATUS register */ +static int firmware_fpga_get_spi_status(firmware_spi_logic_upg_t *upg_priv, char *status) +{ + int ret; + uint32_t val, addr, cmd; + + cmd = FPGA_UPG_INSTRUTION_RDSR; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd 0x%x failed ret %d.\n", cmd, ret); + return -1; + } + + addr = upg_priv->rd_flash_status_reg; + ret = firmware_fpga_read_word(upg_priv->dev_path, addr, &val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_read_word addr 0x%x failed ret %d.\n", addr, ret); + return -1; + } + + *status = val & FPGA_UPG_SPI_STATUS_MASK; + + return 0; +} + +/* Wait for the SPI chip operation to complete */ +static int firmware_fpga_wait_spi_ready(firmware_spi_logic_upg_t *upg_priv, + uint32_t timeout, uint32_t usleep_time) +{ + char status; + int ret; + + while (timeout--) { + usleep(usleep_time); + ret = firmware_fpga_get_spi_status(upg_priv, &status); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_get_spi_status failed ret %d.\n", ret); + continue; + } + /* Determine if it's idle */ + if (!status) { + return 0; + } + } + + return -FW_SPI_FLASH_SPI_BUSY; +} + +/* Configure FPGA upgrade write enable */ +static int firmware_fpga_set_wr_enable(firmware_spi_logic_upg_t *upg_priv) +{ + int ret; + uint32_t cmd; + + cmd = FPGA_UPG_INSTRUTION_WREN; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -1; + } + + return 0; +} + +#if 0 +/* erase all flash */ +static int firmware_fpga_upg_set_erase_all(firmware_spi_logic_upg_t *upg_priv) +{ + int ret; + int cmd; + + /* Wait for the SPI port on the FPGA to become free */ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_wait_ready failed ret %d.\n", ret); + return -1; + } + + /* Configure FPGA upgrade write enable */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -1; + } + + cmd = FPGA_UPG_INSTRUTION_BE; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -1; + } + + /* Hardware requirements, delay of 1s */ + sleep(1); + + /* Wait for the SPI chip operation to complete, 1s check status once, max delay 300s */ + ret = firmware_fpga_wait_spi_ready(upg_priv, 300, (1 * 1000 * 1000)); + if (ret) { + dbg_print(is_debug_on, "dfd_fpga_wait_spi_ready failed ret %d.\n", ret); + return -1; + } + + dbg_print(is_debug_on, "Success.\n"); + return 0; +} +#endif + +/* Erase sectors (256 pages, 64K total) */ +static int firmware_fpga_erase_sector(firmware_spi_logic_upg_t *upg_priv, uint32_t spi_addr) +{ + int ret; + uint32_t val, addr, cmd; + + /* Wait for the SPI port on the FPGA to become free again */ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + /* Enable write */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -FW_SPI_FLASH_WR_ENABLE_ERR; + } + + /* Write erase address */ + val = spi_addr; + addr = upg_priv->addr_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", addr, val, ret); + return -FW_SPI_FLASH_ERASE_ADDR_ERR; + } + + /* Enable sector erasure */ + cmd = FPGA_UPG_INSTRUTION_SE; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -FW_SPI_FLASH_ERASE_SECTOR_ERR; + } + + /* Hardware requirements, delay of 0.25s */ + usleep(250 * 1000); + + /* Wait for the SPI chip operation to complete, 1s check status once, max delay 10s */ + ret = firmware_fpga_wait_spi_ready(upg_priv, FPGA_UPG_WAIT_SPI_RETRY_CNT, (100 * 1000)); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_wait_spi_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_SPI_BUSY; + } + + return 0; +} + +#if 0 +int firmware_fpga_erase64_sector(firmware_spi_logic_upg_t *upg_priv, int offset) +{ + int ret; + ret = -1; + + if ((offset % FIRMWARE_SPI_LOGIC_SECTOR_SIZE) == 0) { + dbg_print(is_debug_on, "erase 64k area, offset 0x%x.\n", offset); + ret = firmware_fpga_erase_sector(upg_priv, offset); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_erase_sector offset 0x%x failed ret %d.\n", offset, ret); + return ret; + } + } else { + dbg_print(is_debug_on, "Input para invalid, offset 0x%x.\n", offset); + } + + return ret; +} +#endif + +static int firmware_fpga_upg_program(firmware_spi_logic_upg_t *upg_priv, + uint32_t spi_addr, uint8_t *buf, uint32_t len) +{ + int ret; + uint32_t addr, val, cmd, wr_len; + + /* Write data to the Upgrade Content Register */ + addr = upg_priv->ctrl_base; + wr_len = len; + ret = firmware_fpga_write_buf(upg_priv->dev_path, addr, (uint8_t*)buf, wr_len); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_write_buf addr 0x%x wr_len %d failed ret %d.\n", + addr, len, ret); + return -FW_SPI_FLASH_WR_ERR; + } + + /* Write length register, FPGA is fixed 256 lengths */ + val = FFPGA_UPG_DATA_SIZE; + addr = upg_priv->length_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_LENGTH_ERR; + } + + /* Write address register */ + val = spi_addr; + addr = upg_priv->addr_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_ADDR_ERR; + } + + /* Start writing upgrade data to SPI */ + cmd = FPGA_UPG_INSTRUTION_PP; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -FW_SPI_FLASH_SET_ACCESS_ERR; + } + + /* min write wait 0.33ms */ + usleep(330); + + /* Wait for the SPI chip operation to complete, 100us check status once, max delay 10ms */ + ret = firmware_fpga_wait_spi_ready(upg_priv, FPGA_UPG_WAIT_SPI_RETRY_CNT, (100)); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_wait_spi_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + return 0; +} + +/** + * firmware_fpga_upg_write + * function: write interface provided to the upgrade module + * @upg_priv: Device information + * @addr: upgrade addr + * @buf: Write Data Buffer + * @len: Write Data Length + * return: 0--success; other--fail + */ +static int firmware_fpga_upg_write(firmware_spi_logic_upg_t *upg_priv, + uint32_t addr, uint8_t *buf, uint32_t len) +{ + int ret; + + /* address must be 256 bytes aligned */ + if ((upg_priv == NULL) || (buf == NULL) || (addr & 0xff) || (len > 256)) { + dbg_print(is_debug_on,"Input para invalid upg_priv %p buf %p addr 0x%x len %u.\n", + upg_priv, buf, addr, len); + return -FW_SPI_FLASH_PARAM_ERR; + } + + /* Wait for the SPI port on the FPGA to become free again*/ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + /* Configure write enable */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -FW_SPI_FLASH_WR_ENABLE_ERR; + } + + /* Write upgrade data */ + ret = firmware_fpga_upg_program(upg_priv, addr, buf, len); + if (ret) { + dbg_print(is_debug_on,"dfd_fpga_upg_program addr 0x%x len %u failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_UPG_ERR; + } + + return 0; +} + +static int firmware_fpga_fast_read(firmware_spi_logic_upg_t *upg_priv, + uint32_t spi_addr, uint8_t *buf, uint32_t len) +{ + int ret; + uint32_t val, addr, cmd; + + /* Clear register value */ + addr = upg_priv->ctrl_base; + ret = firmware_fpga_write_buf(upg_priv->dev_path, addr, buf, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_buf addr 0x%x len %d failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_WR_ERR; + } + /* Write length register */ + val = FFPGA_UPG_DATA_SIZE; + addr = upg_priv->length_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_LENGTH_ERR; + } + + /* Write address register */ + val = spi_addr; + addr = upg_priv->addr_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_ADDR_ERR; + } + + /* Start reading SPI data */ + cmd = FPGA_UPG_INSTRUTION_FR; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -FW_SPI_FLASH_SET_ACCESS_ERR; + } + + /* Read the upgraded content register to the buffer, + * FPGA only supports 4 bytes of read and write */ + addr = upg_priv->ctrl_base; + ret = firmware_fpga_read_buf(upg_priv->dev_path, addr, (uint8_t*)buf, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_read_buf addr 0x%x len %d failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_RD_ERR; + } + + return 0; +} + +/** + * firmware_fpga_upg_read + * function: read interface provided to the upgrade module + * @upg_priv: Device information + * @addr: upgrade addr + * @buf: Read Data Buffer + * @len: Read Data Length + * return: 0--success; other--fail + */ +static int firmware_fpga_upg_read(firmware_spi_logic_upg_t *upg_priv, + uint32_t addr, uint8_t *buf, uint32_t len) +{ + int ret; + + /* address must be 256 bytes aligned */ + if ((upg_priv == NULL) || (buf == NULL) || (addr & 0xff) || (len > 256)) { + dbg_print(is_debug_on, "Input para invalid upg_priv %p buf %p addr 0x%x len %u.\n", + upg_priv, buf, addr, len); + return -FW_SPI_FLASH_PARAM_ERR; + } + + /* Wait for the SPI port on the FPGA to become free again */ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + /* Configure write enable */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -FW_SPI_FLASH_WR_ENABLE_ERR; + } + + /* Read upgrade data */ + ret = firmware_fpga_fast_read(upg_priv, addr, buf, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_fast_read addr 0x%x len %u failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_RD_ERR; + } + + return 0; + +} + +static int firmware_upgreade_fpga_onetime(firmware_spi_logic_upg_t *upg_priv, + uint32_t flash_base, uint8_t *buf, uint32_t size) +{ + uint32_t offset, len, flash_addr, retry; + int ret, res; + uint8_t rbuf[FFPGA_UPG_DATA_SIZE]; + + offset = 0; + while(offset < size) { + flash_addr = flash_base + offset; + /* Erases a sector */ + if ((flash_addr % FIRMWARE_SPI_LOGIC_SECTOR_SIZE) == 0) { + ret = firmware_fpga_erase_sector(upg_priv, flash_addr); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_fpga_erase_sector flash_addr 0x%x failed ret %d.\n", + flash_addr, ret); + goto exit; + } + } + + if (size > FFPGA_UPG_DATA_SIZE) { + len = FFPGA_UPG_DATA_SIZE; + } else { + len = size; + } + + /* first, Write data */ + ret = firmware_fpga_upg_write(upg_priv, flash_addr, buf + offset, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_upg_write addr 0x%x len 0x%x failed ret %d.\n", + flash_addr, len, ret); + ret = -FW_SPI_FLASH_UPG_ERR; + goto exit; + } + + /* Read back the data and compare the correctness of the data */ + for (retry = 0; retry < FPGA_UPG_RETRY_TIMES; retry++) { /*retry 3 times*/ + mem_clear(rbuf, len); + ret = firmware_fpga_upg_read(upg_priv, flash_addr, rbuf, len); + res = memcmp(rbuf, buf + offset, len); + if (ret || res) { + usleep(1000); + continue; + } + break; + } + + if (ret) { + dbg_print(is_debug_on, "firmware fpga read offset 0x%x len 0x%x failed ret %d.\n", flash_addr, len, ret); + ret = -FW_SPI_FLASH_RD_ERR; + goto exit; + } + + if (res) { + dbg_print(is_debug_on, "firmware fpga rbuf wbuf not equal, len 0x%x, check failed.\n", len); + ret = -FW_SPI_FLASH_DATA_CMP_ERR; + goto exit; + } + offset += len; + } + + dbg_print(is_debug_on, "Update success.\n"); + return FIRMWARE_SUCCESS; +exit: + dbg_print(is_debug_on, "Update failed.\n"); + return FIRMWARE_FAILED; +} + +static int firmware_upgrade_do_spi_logic(firmware_spi_logic_upg_t *current_upg_priv, + unsigned char *buf, uint32_t size) +{ + int i, ret; + uint32_t retry; + + i = 0; + retry = FIRMWARE_SPI_LOGIC_UPG_RETRY_CNT; + + ret = 0; + while(i < retry) { + ret = firmware_upgreade_fpga_onetime(current_upg_priv, current_upg_priv->flash_base, buf, size); + if (ret) { + i++; + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime size 0x%x failed ret %d.\n", size, ret); + continue; + } else { + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime success.\n"); + return 0; + } + } + + return ret; +} + +/* + * firmware_upgrade_spi_logic_dev + * function: FPGA SPI FLASH Firmware upgrade handler function + * @fd: param[in] sysfs device descriptor + * @buf: param[in] Update data + * @size: param[in] Update data size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_spi_logic_dev(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret; + firmware_spi_logic_upg_t current_upg_priv; + + if ((fd < 0) || (buf == NULL) || (info == NULL)) { + dbg_print(is_debug_on, "Error:firmware upgrade spi logic dev parameters failed.\n"); + return FIRMWARE_FAILED; + } + + /* Gets the current logical device information */ + mem_clear(¤t_upg_priv, sizeof(firmware_spi_logic_upg_t)); + ret = firmware_upgrade_get_spi_logic_info(fd, ¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_get_spi_logic_info failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "current_upg_priv dev_path[%s] flash_base[0x%0x] ctrl_base[0x%0x]\n", + current_upg_priv.dev_path, current_upg_priv.flash_base, + current_upg_priv.ctrl_base); + + /* Enable upgrade access */ + ret = firmware_upgrade_spi_logic_init(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_init failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Upgrade logic device */ + ret = firmware_upgrade_do_spi_logic(¤t_upg_priv, buf, size); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_do_spi_logic failed ret %d.\n", ret); + goto fail; + } + + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_SUCCESS; +fail: + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_FAILED; +} + +int firmware_fpga_upgrade_test(firmware_spi_logic_upg_t *current_upg_priv) +{ + int ret, i, j, num; + uint8_t *wbuf; + uint32_t retry; + + ret = FW_SPI_FLASH_RV_OK; + wbuf = (uint8_t *) malloc(current_upg_priv->test_size); + if (wbuf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for test data buf, size=0x%x.\n", current_upg_priv->test_size); + ret = -FW_SPI_FLASH_NOT_SUPPORT_TEST; + goto exit; + } + mem_clear(wbuf, current_upg_priv->test_size); + /* Get random data */ + for (j = 0; j < current_upg_priv->test_size; j++) { + num = rand() % 256; + wbuf[j] = num & 0xff; + } + + i = 0; + retry = FIRMWARE_SPI_LOGIC_UPG_RETRY_CNT; + + ret = 0; + while(i < retry) { + ret = firmware_upgreade_fpga_onetime(current_upg_priv, current_upg_priv->test_base, wbuf, current_upg_priv->test_size); + if (ret) { + i++; + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime test size 0x%x failed ret %d.\n", + current_upg_priv->test_size, ret); + continue; + } else { + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime test success.\n"); + break; + } + } + free(wbuf); +exit: + return ret; +} + +/* + * firmware_upgrade_spi_logic_dev_test + * function: FPGA SPI FLASH Firmware upgrade test handler function + * @fd: param[in] sysfs device descriptor + * @buf: param[in] Update data + * @size: param[in] Update data size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_spi_logic_dev_test(int fd, name_info_t *info) +{ + int ret; + firmware_spi_logic_upg_t current_upg_priv; + + if ((fd < 0) || (info == NULL)) { + dbg_print(is_debug_on, "Error:firmware upgrade spi logic dev parameters failed.\n"); + return FIRMWARE_FAILED; + } + + /* Gets the current logical device information */ + mem_clear(¤t_upg_priv, sizeof(firmware_spi_logic_upg_t)); + ret = firmware_upgrade_get_spi_logic_info(fd, ¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_get_spi_logic_info failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "current_upg_priv dev_path[%s] test_base[0x%0x] test_size[0x%x]\n", + current_upg_priv.dev_path, current_upg_priv.test_base, current_upg_priv.test_size); + if (current_upg_priv.test_size <= 0) { + dbg_print(is_debug_on, "Error: don't support flast test.\n"); + return FIRMWARE_NOT_SUPPORT; + } + + /* Enable upgrade access */ + ret = firmware_upgrade_spi_logic_init(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_init failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Upgrade logic device */ + ret = firmware_fpga_upgrade_test(¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_do_spi_logic failed ret %d.\n", ret); + goto fail; + } + + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_SUCCESS; +fail: + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_FAILED; +} + +static int firmware_upgreade_spi_logic_dump(firmware_spi_logic_upg_t *upg_priv, + uint32_t offset, uint8_t *buf, uint32_t size) +{ + int ret, i; + uint32_t addr, buf_page, retry, cnt, rd_len; + + buf_page = FFPGA_UPG_DATA_SIZE; /* read data by BUF SIZE each time */ + + cnt = size / FFPGA_UPG_DATA_SIZE; + if (size % FFPGA_UPG_DATA_SIZE) { + cnt++; + } + dbg_print(is_debug_on, "need read number of times:%d.\n", cnt); + + for (i = 0; i < cnt; i++) { + addr = offset + i * FFPGA_UPG_DATA_SIZE; + if (i == (cnt - 1)) { + /* last time read remain size */ + rd_len = size - buf_page * i; + } else { + /* each time read buf page size */ + rd_len = buf_page; + } + + for (retry = 0; retry < FPGA_UPG_RETRY_TIMES; retry++) { + ret = firmware_fpga_upg_read(upg_priv, addr, buf, rd_len); + if (ret < 0) { + dbg_print(is_debug_on, "addr:0x%x read %d time failed. ret %d\n", addr, retry, ret); + continue; + } + break; + } + + if (ret < 0) { + dbg_print(is_debug_on, "finally addr:0x%x read failed ret %d\n", addr, ret); + return FIRMWARE_FAILED; + } + + buf += rd_len; /* buf pointer offset rd_len */ + } + + return FIRMWARE_SUCCESS; +} + +static int firmware_fpga_dump_read(int fd, uint32_t offset, uint8_t *buf, uint32_t len) +{ + int ret; + firmware_spi_logic_upg_t current_upg_priv; + + if ((fd < 0) || (buf == NULL)) { + dbg_print(is_debug_on, "Error:firmware upgrade spi logic dev parameters failed.\n"); + return FIRMWARE_FAILED; + } + + /* Gets the current logical device information */ + mem_clear(¤t_upg_priv, sizeof(firmware_spi_logic_upg_t)); + ret = firmware_upgrade_get_spi_logic_info(fd, ¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_get_spi_logic_info failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "current_upg_priv dev_path[%s] flash_base[0x%0x] ctrl_base[0x%0x]\n", + current_upg_priv.dev_path, current_upg_priv.flash_base, + current_upg_priv.ctrl_base); + + /* Enable upgrade access */ + ret = firmware_upgrade_spi_logic_init(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_init failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* read logic device */ + ret = firmware_upgreade_spi_logic_dump(¤t_upg_priv, offset, buf, len); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_do_spi_logic failed ret %d.\n", ret); + goto fail; + } + + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_SUCCESS; + +fail: + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_FAILED; +} + +int firmware_upgrade_spi_logic_dev_dump(char *dev_name, uint32_t offset, + uint32_t len, char *record_file) +{ + int ret, dev_fd, file_fd; + char save_file[FIRMWARE_LOGIC_DEV_NAME_LEN]; + uint8_t *buf; + + dev_fd = open(dev_name, O_RDWR); + if (dev_fd < 0) { + dbg_print(is_debug_on, "Error: Failed to open %s, errno:%d.\n", dev_name, errno); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "open dev file %s succeeded.\n", dev_name); + + buf = (uint8_t *) malloc(len); + if (buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory read %s data.\n", dev_name); + ret = FIRMWARE_FAILED; + goto free_dev_fd; + } + + mem_clear(buf, len); + ret = firmware_fpga_dump_read(dev_fd, offset, buf, len); + if (ret < 0) { + dbg_print(is_debug_on, "addr 0x%x read 0x%x failed ret:%d\n", offset, len, ret); + goto free_data; + } + + dbg_print(is_debug_on, "dump data succeeded. offset:0x%x, len:0x%x\n", offset, len); + + if (strcmp(record_file, "print") != 0) { /* record dump data on 'record_file' */ + mem_clear(save_file, FIRMWARE_LOGIC_DEV_NAME_LEN); + strncpy(save_file, record_file, FIRMWARE_LOGIC_DEV_NAME_LEN - 1); + file_fd = open(save_file, O_RDWR|O_CREAT|O_TRUNC, S_IRWXG|S_IRWXU|S_IRWXO); + if (file_fd < 0) { + dbg_print(is_debug_on, "open file %s fail, errno:%d.\n", save_file, errno); + ret = -ENOENT; + goto free_data; + } + + dbg_print(is_debug_on, "open save file %s succeeded.\n", save_file); + + ret = write(file_fd, buf, len); + if (ret < 0) { + dbg_print(is_debug_on, "write failed (errno: %d).\n", errno); + goto free_file_fd; + } + dbg_print(is_debug_on, "write save file %s succeeded.\n", save_file); + ret = FIRMWARE_SUCCESS; + } else { /* print reg on terminal by format */ + firmware_upgrade_printf_reg((uint8_t*)buf, len, offset); + ret = FIRMWARE_SUCCESS; + goto free_data; + } + +free_file_fd: + close(file_fd); +free_data: + free(buf); +free_dev_fd: + close(dev_fd); + + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h new file mode 100644 index 000000000000..32f820161e86 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h @@ -0,0 +1,90 @@ +#ifndef __FW_UPG_SPI_LOGIC_DEV_H__ +#define __FW_UPG_SPI_LOGIC_DEV_H__ + +#define FIRMWARE_FPGA_WORD_LEN (4) + +#define FIRMWARE_LOGIC_DEV_NAME_LEN (64) /* the macro definition needs to same as FIRMWARE_DEV_NAME_LEN in firmware_sysfs_upgrade.h */ +#define FIRMWARE_SPI_LOGIC_UPG_RETRY_CNT (10) +#define FIRMWARE_SPI_LOGIC_UPG_BUFF_SIZE (256) +#define FIRMWARE_SPI_LOGIC_SECTOR_SIZE (0x10000) /* One sector is 64Kk */ + +#define FIRMWARE_UPG_RETRY_SLEEP_TIME (10) /* 10us */ +#define FIRMWARE_UPG_RETRY_TIME_CNT (1000) +#define FPGA_UPG_WAIT_SPI_RETRY_CNT (100) +#define FPGA_UPG_WAIT_SPI_RETRY_SLEEP_TIME (1000 * 10) /* 10ms */ + +#define FIRMWARE_FPGA_UPG_RETRY_CNT (100) + +/* FPGA upgrades related instruction definitions */ +#define FPGA_UPG_INSTRUTION_SE (0xD8) +#define FPGA_UPG_INSTRUTION_RDSR (0x05) +#define FPGA_UPG_INSTRUTION_WREN (0x06) +#define FPGA_UPG_INSTRUTION_PP (0x02) +#define FPGA_UPG_INSTRUTION_FR (0x0B) +#define FPGA_UPG_INSTRUTION_BE (0xC7) +#define FPGA_UPG_STATUS_MASK (0x1) +#define FPGA_UPG_ACCESS_ENABLE (0x3) +#define FPGA_UPG_SPI_STATUS_MASK (0x1) +#define FFPGA_UPG_DATA_SIZE (256) + +#define FPGA_UPG_RETRY_TIMES (3) + +/* FPGA upgrades the offset of the associated register */ +#define FPGA_UPG_STATUS_REG (0x180) +#define FPGA_UPG_SPI_CTRL_REG (0x184) +#define FPGA_UPG_WR_FLASH_STATUS_REG (0x188) +#define FPGA_UPG_RD_FLASH_STATUS_REG (0x18C) +#define FPGA_UPG_INSTRUCTION_REG (0x190) +#define FPGA_UPG_ADDR_REG (0x194) +#define FPGA_UPG_LENGTH_REG (0x198) +#define FPGA_UPG_DEVICE_ID_REG (0x19C) +#define FPGA_UPG_DROP_REQ_NUM_REG (0x1A8) + +typedef struct firmware_spi_logic_info_s { + char logic_dev_name[FIRMWARE_LOGIC_DEV_NAME_LEN]; /* Logical device name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t ctrl_base; /* SPI upgrade control register base address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_spi_logic_info_t; + +typedef struct firmware_spi_logic_upg_s { + char dev_path[FIRMWARE_LOGIC_DEV_NAME_LEN]; + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t ctrl_base; /* SPI upgrade control register base address */ + uint32_t status_reg; + uint32_t spi_ctrl_reg; + uint32_t wr_flash_status_reg; + uint32_t rd_flash_status_reg; + uint32_t instruction_reg; + uint32_t addr_reg; + uint32_t length_reg; + uint32_t device_id_reg; + uint32_t drop_reg_num_reg; + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +}firmware_spi_logic_upg_t; + +typedef enum firmware_spi_flash_rv_s { + FW_SPI_FLASH_RV_OK = 0, + FW_SPI_FLASH_STATUS_ERR, + FW_SPI_FLASH_BUSY, + FW_SPI_FLASH_SPI_BUSY, + FW_SPI_FLASH_WR_ENABLE_ERR, + FW_SPI_FLASH_ERASE_ADDR_ERR, + FW_SPI_FLASH_ERASE_SECTOR_ERR, + FW_SPI_FLASH_WR_ERR, + FW_SPI_FLASH_RD_ERR, + FW_SPI_FLASH_PARAM_ERR, + FW_SPI_FLASH_UPG_ERR, + FW_SPI_FLASH_WR_LENGTH_ERR, + FW_SPI_FLASH_WR_ADDR_ERR, + FW_SPI_FLASH_SET_ACCESS_ERR, + FW_SPI_FLASH_DATA_CMP_ERR, + FW_SPI_FLASH_GET_INFO_ERR, + FW_SPI_FLASH_NOT_SUPPORT_TEST, +} firmware_spi_flash_rv_t; + +int fpga_test_spi_logic_flash(int argc, char *argv[]); + +#endif /* End of __FW_UPG_SPI_LOGIC_DEV_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h new file mode 100644 index 000000000000..17dd42c3ef77 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h @@ -0,0 +1,34 @@ +/* + * + * debug.h + * firmware upgrade debug switch control + */ + +#ifndef __FIRMWARE_UPGRADE_DEBUG_H__ +#define __FIRMWARE_UPGRADE_DEBUG_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define DEBUG_INFO_LEN 20 +#define DEBUG_FILE "/tmp/.firmware_upgrade_debug" +#define DEBUG_ON_ALL "3" +#define DEBUG_ON_INFO "1" +#define DEBUG_OFF_INFO "0" + +enum debug_s { + DEBUG_OFF = 0, /* off debug */ + DEBUG_APP_ON, /* open app debug */ + DEBUG_ALL_ON, /* open all debug */ + DEBUG_IGNORE, /* ignore debug */ +}; + +#define dbg_print(debug, fmt, arg...) \ + if (debug == DEBUG_APP_ON || debug == DEBUG_ALL_ON) \ + { do{printf(fmt,##arg);} while(0); } + +/* firmware upgrade debug switch */ +extern int firmware_upgrade_debug(void); +extern int is_debug_on; + +#endif /* End of __FIRMWARE_UPGRADE_DEBUG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h new file mode 100644 index 000000000000..581b2e969ec9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h @@ -0,0 +1,172 @@ +#ifndef __FIRMWARE_APP_H__ +#define __FIRMWARE_APP_H__ + +#include +#include +#include +#include +#include +#include + +#define ERR_FW_CHECK_CPLD_UPGRADE (-601) /* File validation error */ +#define ERR_FW_CHECK_FPGA_UPGRADE (-602) +#define ERR_FW_MATCH_CPLD_UPGRADE (-603) /* No matching upgrade file found */ +#define ERR_FW_MATCH_FPGA_UPGRADE (-604) +#define ERR_FW_SAMEVER_CPLD_UPGRADE (-605) /* the same version */ +#define ERR_FW_SAMEVER_FPGA_UPGRADE (-606) +#define ERR_FW_DO_CPLD_UPGRADE (-607) /* upgrade fail */ +#define ERR_FW_DO_FPGA_UPGRADE (-608) +#define ERR_FW_UPGRADE (-609) /* other fail */ +#define ERR_FW_CHECK_UPGRADE (-610) /* File validation error */ +#define ERR_FW_MATCH_UPGRADE (-611) /* No matching upgrade file found */ +#define ERR_FW_SAMEVER_UPGRADE (-612) /* the same version */ +#define ERR_FW_DO_UPGRADE (-613) /* upgrade fail */ +#define ERR_FW_DO_UPGRADE_NOT_SUPPORT (-614) /* upgrade fail */ + +#define FIRMWARE_NOT_SUPPORT (-2) +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS (0) + +#define FIRMWARE_ACTION_CHECK 0 +#define FIRMWARE_ACTION_MATCH 1 +#define FIRMWARE_ACTION_VERCHECK 2 +#define FIRMWARE_ACTION_UPGRADE 3 +#define FIRMWARE_ACTION_SUPPORT 4 + +#define FIRMWARE_UPGRADE_RETRY_CNT (10) +#define FIRMWARE_NAME_LEN (48) +#define FIRMWARE_SLOT_MAX_NUM (16) /* Maximum number of links supported by board cards */ + +/* Upgrade file headers */ +#define MAX_DEV_NUM 10 /* Maximum number of devices to which the upgrade file is applicable */ +#define INSMOD_DRIVER 1 /* insmod driver */ +#define RMMOD_DRIVER 0 /* rmmod driver */ +#define MAX_HEADER_SIZE 1000 /* Upgrade the maximum length of file header information */ +#define MAX_HEADER_KV_SIZE 64 /* Upgrade the maximum length of the file header key value */ + +/* Upgrade file header key values */ +#define FILEHEADER_DEVTYPE "DEVTYPE" +#define FILEHEADER_SUBTYPE "SUBTYPE" +#define FILEHEADER_TYPE "TYPE" +#define FILEHEADER_CHAIN "CHAIN" +#define FILEHEADER_CHIPNAME "CHIPNAME" +#define FILEHEADER_VERSION "VERSION" +#define FILEHEADER_FILETYPE "FILETYPE" +#define FILEHEADER_CRC "CRC" + +#define FIRMWARE_CPLD_NAME "cpld" +#define FIRMWARE_FPGA_NAME "fpga" + +/* ioctl publi command, the same as driver */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ +#define FIRMWARE_SET_DEBUG_ON _IOW(FIRMWARE_COMMON_TYPE, 3, int) /* debug on */ +#define FIRMWARE_SET_DEBUG_OFF _IOW(FIRMWARE_COMMON_TYPE, 4, int) /* debug off */ + +/* firmware cpld driver ioctl command, the same as "firmware_driver\firmware_driver\include\firmware.h" */ +#define FIRMWARE_TYPE 'J' +#define FIRMWARE_PROGRAM _IOW(FIRMWARE_TYPE, 1, char) /* firmware upgrade ISC */ +#define FIRMWARE_READ_CHIP _IOR(FIRMWARE_TYPE, 5, int) /* read the contents of the chip */ +#define FIRMWARE_PROGRAM_JBI _IOW(FIRMWARE_TYPE, 6, char) /* firmware upgrade JBI */ + +/* firmware cpld ispvme driver ioctl command, the same as "firmware_driver\firmware_driver_ispvme\include\firmware_ispvme.h" */ +#define FIRMWARE_VME_TYPE 'V' +#define FIRMWARE_JTAG_TDI _IOR(FIRMWARE_VME_TYPE, 0, char) +#define FIRMWARE_JTAG_TDO _IOR(FIRMWARE_VME_TYPE, 1, char) +#define FIRMWARE_JTAG_TCK _IOR(FIRMWARE_VME_TYPE, 2, char) +#define FIRMWARE_JTAG_TMS _IOR(FIRMWARE_VME_TYPE, 3, char) +#define FIRMWARE_JTAG_EN _IOR(FIRMWARE_VME_TYPE, 4, char) +#define FIRMWARE_JTAG_INIT _IOR(FIRMWARE_VME_TYPE, 7, char) /* enable upgrade access */ +#define FIRMWARE_JTAG_FINISH _IOR(FIRMWARE_VME_TYPE, 8, char) /* disable upgrade access */ + +/* firmware sysfs driver ioctl command, the same as "firmware_driver\firmware_driver_sysfs\include\firmware_sysfs.h" */ +#define FIRMWARE_SYSFS_TYPE 'S' +#define FIRMWARE_SYSFS_INIT _IOR(FIRMWARE_SYSFS_TYPE, 0, char) /* enable upgrade access */ +#define FIRMWARE_SYSFS_FINISH _IOR(FIRMWARE_SYSFS_TYPE, 1, char) /* disable upgrade access */ +#define FIRMWARE_SYSFS_SPI_INFO _IOR(FIRMWARE_SYSFS_TYPE, 2, char) /* spi flash upgrade */ +#define FIRMWARE_SYSFS_DEV_FILE_INFO _IOR(FIRMWARE_SYSFS_TYPE, 3, char) /* sysfs upgrade */ +#define FIRMWARE_SYSFS_MTD_INFO _IOR(FIRMWARE_SYSFS_TYPE, 4, char) /* sysfs mtd upgrade */ + +/* VME file, used to distinguish the JTAG signal that needs to operate */ +#define JTAG_TDO 1 +#define JTAG_TCK 2 +#define JTAG_TDI 3 +#define JTAG_TMS 4 +#define JTAG_ENABLE 5 +#define JTAG_TRST 6 + +typedef struct name_info_s { + int card_type[MAX_DEV_NUM]; /* main board type */ + int sub_type[MAX_DEV_NUM]; /* sub board type */ + int type; /* device type */ + int chain; /* chain num */ + char chip_name[FIRMWARE_NAME_LEN]; /* chip name */ + char version[FIRMWARE_NAME_LEN]; /* version */ + int file_type; /* file type */ + unsigned int crc32; /* 4 byte CRC values */ +} name_info_t; + +typedef struct cmd_info_s { + uint32_t size; + void *data; +} cmd_info_t; + +enum firmware_type_s { + FIRMWARE_UNDEF_TYPE = 0, + FIRMWARE_CPLD, + FIRMWARE_FPGA, + FIRMWARE_SYSFS, + FIRMWARE_OTHER, +}; + +typedef enum firmware_file_type_s { + FIRMWARE_UNDEF_FILE_TYPE = 0, + FIRMWARE_VME, /* ispvme cpld, GPIO simulates JTAG */ + FIRMWARE_ISC, /* cpld, GPIO simulates JTAG */ + FIRMWARE_JBI, + FIRMWARE_SPI_LOGIC_DEV, /* FPGA SPI upgrde register upgrade flash */ + FIRMWARE_SYSFS_DEV, /* write file upgrade eeprom */ + FIRMWARE_MTD, /* upgrade mtd device */ + FIRMWARE_NONE, +} firmware_file_type_t; + +typedef struct firmware_file_name_s { + char firmware_file_name_str[MAX_HEADER_KV_SIZE]; + int firmware_file_type; +} firmware_file_name_t; + +extern int header_offset; + +/* CRC32 calculation */ +extern unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len); +/* VME file upgrade */ +extern int firmware_upgrade_ispvme(int file_fd, char *upgrade_file_name, name_info_t *info); +extern void writePort(unsigned char a_ucPins, unsigned char a_ucValue); +extern unsigned char readPort(); +extern void sclock(); +extern void ispVMStateMachine(signed char NextState); + +/* spi flash upgrade */ +extern int firmware_upgrade_spi_logic_dev(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* spi flash upgrade test*/ +extern int firmware_upgrade_spi_logic_dev_test(int fd, name_info_t *info); +/* spi flash data print*/ +extern int firmware_upgrade_spi_logic_dev_dump(char *dev_name, uint32_t offset, uint32_t size, char *record_file); + +/* sysfs upgrade */ +extern int firmware_upgrade_sysfs(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* sysfs upgrade test*/ +extern int firmware_upgrade_sysfs_test(int fd, name_info_t *info); + +/* isc upgrade */ +extern int firmware_upgrade_jtag(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* isc upgrade test */ +extern int firmware_upgrade_jtag_test(int fd, uint8_t *buf, uint32_t size, name_info_t *info); + +/* mtd upgrade */ +extern int firmware_upgrade_mtd(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* mtd upgrade test */ +extern int firmware_upgrade_mtd_test(int fd, name_info_t *info); + +#endif /* End of __FIRMWARE_APP_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h new file mode 100644 index 000000000000..ae9d713ff86c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h @@ -0,0 +1,192 @@ +/*************************************************************** +* +* This is the include file for Lattice Semiconductor's ispVM +* Embedded software application. +* +***************************************************************/ + +/*************************************************************** +* +* VME version. +* +* History: +* +***************************************************************/ + +#define VME_VERSION_NUMBER "12.2" + +/*************************************************************** +* +* Maximum declarations. +* +***************************************************************/ + +#define VMEHEXMAX 60000L /* The hex file is split 60K per file. */ +#define SCANMAX 64000L /* The maximum SDR/SIR burst. */ + +/*************************************************************** +* +* Supported JTAG state transitions. +* +***************************************************************/ + +#define RESET 0x00 +#define IDLE 0x01 +#define IRPAUSE 0x02 +#define DRPAUSE 0x03 +#define SHIFTIR 0x04 +#define SHIFTDR 0x05 +#define DRCAPTURE 0x06 + +/*************************************************************** +* +* Flow control register bit definitions. A set bit indicates +* that the register currently exhibits the corresponding mode. +* +***************************************************************/ + +#define INTEL_PRGM 0x0001 /* Intelligent programming is in effect. */ +#define CASCADE 0x0002 /* Currently splitting large SDR. */ +#define REPEATLOOP 0x0008 /* Currently executing a repeat loop. */ +#define SHIFTRIGHT 0x0080 /* The next data stream needs a right shift. */ +#define SHIFTLEFT 0x0100 /* The next data stream needs a left shift. */ +#define VERIFYUES 0x0200 /* Continue if fail is in effect. */ + +/*************************************************************** +* +* DataType register bit definitions. A set bit indicates +* that the register currently holds the corresponding type of data. +* +***************************************************************/ + +#define EXPRESS 0x0001 /* Simultaneous program and verify. */ +#define SIR_DATA 0x0002 /* SIR is the active SVF command. */ +#define SDR_DATA 0x0004 /* SDR is the active SVF command. */ +#define COMPRESS 0x0008 /* Data is compressed. */ +#define TDI_DATA 0x0010 /* TDI data is present. */ +#define TDO_DATA 0x0020 /* TDO data is present. */ +#define MASK_DATA 0x0040 /* MASK data is present. */ +#define HEAP_IN 0x0080 /* Data is from the heap. */ +#define LHEAP_IN 0x0200 /* Data is from intel data buffer. */ +#define VARIABLE 0x0400 /* Data is from a declared variable. */ +#define CRC_DATA 0x0800 /* CRC data is pressent. */ +#define CMASK_DATA 0x1000 /* CMASK data is pressent. */ +#define RMASK_DATA 0x2000 /* RMASK data is pressent. */ +#define READ_DATA 0x4000 /* READ data is pressent. */ +#define DMASK_DATA 0x8000 /* DMASK data is pressent. */ + +/*************************************************************** +* +* Pin opcodes. +* +***************************************************************/ + +#define signalENABLE 0x1C /* ispENABLE pin. */ +#define signalTMS 0x1D /* TMS pin. */ +#define signalTCK 0x1E /* TCK pin. */ +#define signalTDI 0x1F /* TDI pin. */ +#define signalTRST 0x20 /* TRST pin. */ + +/*************************************************************** +* +* Supported vendors. +* +***************************************************************/ + +#define VENDOR 0x56 +#define LATTICE 0x01 +#define ALTERA 0x02 +#define XILINX 0x03 + +/*************************************************************** +* +* Opcode definitions. +* +* Note: opcodes must be unique. +* +***************************************************************/ + +#define ENDDATA 0x00 /* The end of the current SDR data stream. */ +#define RUNTEST 0x01 /* The duration to stay at the stable state. */ +#define ENDDR 0x02 /* The stable state after SDR. */ +#define ENDIR 0x03 /* The stable state after SIR. */ +#define ENDSTATE 0x04 /* The stable state after RUNTEST. */ +#define TRST 0x05 /* Assert the TRST pin. */ +#define HIR 0x06 /* The sum of the IR bits of the leading devices. */ +#define TIR 0x07 /* The sum of the IR bits of the trailing devices. */ +#define HDR 0x08 /* The number of leading devices. */ +#define TDR 0x09 /* The number of trailing devices. */ +#define ispEN 0x0A /* Assert the ispEN pin. */ +#define FREQUENCY 0x0B /* The maximum clock rate to run the JTAG state machine. */ +#define STATE 0x10 /* Move to the next stable state. */ +#define SIR 0x11 /* The instruction stream follows. */ +#define SDR 0x12 /* The data stream follows. */ +#define TDI 0x13 /* The following data stream feeds into the device. */ +#define TDO 0x14 /* The following data stream is compared against the device. */ +#define MASK 0x15 /* The following data stream is used as mask. */ +#define XSDR 0x16 /* The following data stream is for simultaneous program and verify. */ +#define XTDI 0x17 /* The following data stream is for shift in only. It must be stored for the next XSDR. */ +#define XTDO 0x18 /* There is not data stream. The data stream was stored from the previous XTDI. */ +#define MEM 0x19 /* The maximum memory needed to allocate in order hold one row of data. */ +#define WAIT 0x1A /* The duration of delay to observe. */ +#define TCK 0x1B /* The number of TCK pulses. */ +#define SHR 0x23 /* Set the flow control register for right shift. */ +#define SHL 0x24 /* Set the flow control register for left shift. */ +#define HEAP 0x32 /* The memory size needed to hold one loop. */ +#define REPEAT 0x33 /* The beginning of the loop. */ +#define LEFTPAREN 0x35 /* The beginning of data following the loop. */ +#define VAR 0x55 /* Plac holder for loop data. */ +#define SEC 0x1C /* The delay time in seconds that must be observed. */ +#define SMASK 0x1D /* The mask for TDI data. */ +#define MAX 0x1E /* The absolute maximum wait time. */ +#define ON 0x1F /* Assert the targeted pin. */ +#define OFF 0x20 /* Dis-assert the targeted pin. */ +#define SETFLOW 0x30 /* Change the flow control register. */ +#define RESETFLOW 0x31 /* Clear the flow control register. */ +#define CRC 0x47 /* The following data stream is used for CRC calculation. */ +#define CMASK 0x48 /* The following data stream is used as mask for CRC calculation. */ +#define RMASK 0x49 /* The following data stream is used as mask for read and save. */ +#define READ 0x50 /* The following data stream is used for read and save. */ +#define ENDLOOP 0x59 /* The end of the repeat loop. */ +#define SECUREHEAP 0x60 /* Used to secure the HEAP opcode. */ +#define VUES 0x61 /* Support continue if fail. */ +#define DMASK 0x62 /* The following data stream is used for dynamic I/O. */ +#define COMMENT 0x63 /* Support SVF comments in the VME file. */ +#define HEADER 0x64 /* Support header in VME file. */ +#define FILE_CRC 0x65 /* Support crc-protected VME file. */ +#define LCOUNT 0x66 /* Support intelligent programming. */ +#define LDELAY 0x67 /* Support intelligent programming. */ +#define LSDR 0x68 /* Support intelligent programming. */ +#define LHEAP 0x69 /* Memory needed to hold intelligent data buffer */ +#define CONTINUE 0x70 /* Allow continuation. */ +#define LVDS 0x71 /* Support LVDS. */ +#define ENDVME 0x7F /* End of the VME file. */ +#define HIGH 0x80 /* Assert the targeted pin. */ +#define LOW 0x81 /* Dis-assert the targeted pin. */ +#define ENDFILE 0xFF /* End of file. */ + +/*************************************************************** +* +* ispVM Embedded Return Codes. +* +***************************************************************/ + +#define VME_VERIFICATION_FAILURE -1 +#define VME_FILE_READ_FAILURE -2 +#define VME_VERSION_FAILURE -3 +#define VME_INVALID_FILE -4 +#define VME_ARGUMENT_FAILURE -5 +#define VME_CRC_FAILURE -6 + +/*************************************************************** +* +* Type definitions. +* +***************************************************************/ + +/* Support LVDS */ +typedef struct { + unsigned short usPositiveIndex; + unsigned short usNegativeIndex; + unsigned char ucUpdate; +} LVDSPair; diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile new file mode 100644 index 000000000000..1701b5f62114 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile @@ -0,0 +1,18 @@ +top_srcdir:=$(shell pwd) +include $(top_srcdir)/Rules.mk + +firmware-y:= +firmware-y += fw_upgrade + +.PHONY: all +all: build + +.PHONY: build +build: $(firmware-y) +$(foreach dir,$(firmware-y),$(eval $(call compile_dirs,$(dir)))) + +.PHONY: rpmpkg +rpmpkg: +ifeq ("$(CONFIG_CPLD_UPGRADE_ISPVME)", "y") + #$(RPMPKG) $(install_cpld_dir) firmware-cpld-ispvme.spec git +endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk new file mode 100644 index 000000000000..5fb5a09d34fd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk @@ -0,0 +1,42 @@ +CC ?= $(CROSS)gcc +AR ?= $(CROSS)ar +AS ?= $(CROSS)as +LD ?= $(CROSS)ld +STRIP ?= $(CROSS)strip + +install_root:=${top_srcdir}/images + +install_header_dir:=${install_root}/header +install_adir:=$(install_root)/lib +install_symbol_dir:=$(install_root)/symbol +symbol_files:=$(shell find $(EXPORT_SYMBOL) -name 'Module.symvers') +# +# symbol_files += $(shell find $(install_symbol_dir) -name 'Module.symvers') +# KBUILD_EXTRA_SYMBOLS += $(symbol_files) +# export KBUILD_EXTRA_SYMBOLS + +# top root: install_rootfs_dir +install_rootfs_dir:=$(install_root)/rootfs + +install_sodir:=$(install_rootfs_dir)/$(INSTALL_SODIR) + +install_usr_bin_dir:=$(install_rootfs_dir)/usr/bin +install_sbin_dir:=$(install_rootfs_dir)/sbin +install_etc_dir:=$(install_rootfs_dir)/etc + +export INSTALL_MOD_PATH:=$(ROOT) + +BUILD_CFLAGS:=$(CFLAGS) -I$(install_header_dir) +BUILD_LDFLAGS:=$(LDFLAGS) -L/$(install_sodir) -L/$(install_adir) + +define compile_dirs +.PHONY: $(1) +$(1): + @echo;echo "building $(1)..." + @$(MAKE) -C ${1} +endef + +compile.c = $(CC) $(BUILD_CFLAGS) -d -c -o $@ $< +%.o: %.c + $(compile.c) + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile new file mode 100644 index 000000000000..8b4bca739087 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile @@ -0,0 +1,39 @@ +include ../Rules.mk + +OBJ = fw_upgrade.o fw_upgrade_debug.o + +LIB += $(BUILD_CFALGS) $(BUILD_LDFLAGS) -lpthread +ifdef ENABLE_GCOV +ifeq ($(ENABLE_GCOV), y) +LIB += -fprofile-arcs +endif +endif # ENABLE_GCOV + +APP = fw_upgrade +BUILD_DIR = tmp +ELF_FILE = $(BUILD_DIR)/$(APP) +MAP_FILE = $(BUILD_DIR)/$(APP).map.sym +INCLUDE = -Iinclude +CFLAGS+=-Wall -W -g + +.PHONY: build +build:make-dir $(addprefix $(BUILD_DIR)/,$(OBJ)) + $(CC) -o $(ELF_FILE) $(addprefix $(BUILD_DIR)/,$(OBJ)) $(LINKFLAGS) $(LIB) + + cp -p $(ELF_FILE) $(common_out_put_dir) + +.PHONY: make-dir +make-dir: + @mkdir -p $(BUILD_DIR) + +$(BUILD_DIR)/%.o:%.c + $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@ + +.PHONY: install +install: + echo "fw_upgrade install success." + cp -p $(ELF_FILE) $(common_out_put_dir) + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c new file mode 100644 index 000000000000..2045608d5c3b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c @@ -0,0 +1,1632 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fw_upgrade.h" + +static flash_info_t flash_info[] = { + { + .flash_name = "M25L6433F", + .flash_size = M32, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25L6433F, + .block_size = STEP_64, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "S25FL512S", + .flash_size = M64, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = S25FL512S, + .block_size = STEP_256, + .full_erase = 0, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX25l512", + .flash_size = M64, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25l512, + .block_size = STEP_64, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "STM25P64", + .flash_size = M12, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = STM25P64, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "STM25P128", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = STM25P128, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "N25Q256", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = N25Q256, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "N25Q512", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = N25Q512, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25X16", + .flash_size = M3, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25X16, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25X64", + .flash_size = M12, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25X64, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25Q64BV", + .flash_size = M12, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25Q64BV, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25Q128BV", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25Q128BV, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25Q256FV", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25Q256FV, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX25L1605D", + .flash_size = M32, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25L1605D, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX25L12805D", + .flash_size = M32, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25L12805D, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX66L1G45G", + .flash_size = M128, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX66L1G45G, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "GD25Q256", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = GD25Q256, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, +}; + +static int debug_on; + +static void help(void) +{ + printf("------------------------------BMC Upgrade Tool--------------------------------\n"); + printf("Program Flash:\n"); + printf("\tfw_upgrade upgrade [file name] [chip select: 0 | 1 | 2] "); + printf("[erase type: full | block]\n"); + printf("\t[file name] if file is not located at /home/admin, path should be added\n"); + printf("\t[chip select] 0:master, 1:slave, 2:both\n"); + printf("\t[erase type] choose a way to erase chip, full erase would be faster\n"); + printf("Read BMC Reg:\n"); + printf("\tfw_upgrade rd [address] [length]\n"); + printf("\t[address(Hexadecimal)] register address of BMC\n"); + printf("\t[length(decimal)] length of read data, should be times of 4\n"); + + return; +} + +static int set_ioport_rw_access(void) +{ + + if ( iopl(3) < 0) { + printf("Can't get access to /dev/port \n"); + return -1; + } + + return 0; +} + +static int get_file_size(char *file_name) +{ + FILE * pFile; + int size; + + pFile = fopen(file_name,"rb"); + if (pFile == NULL) { + printf("Error opening file\n"); + return -1; + } + fseek (pFile, 0, SEEK_END); + size = ftell(pFile); + fclose (pFile); + return size; +} + +static uint8_t _read(uint16_t addr) +{ + return inb(addr); +} + +static void _write(uint16_t addr, uint8_t val) +{ + outb(val, addr); + + return; +} + +static void write_addr_port(uint8_t addr_val, uint16_t addr_port) +{ + _write(addr_port, addr_val); + + return; +} + +static void write_data_port(uint8_t val, uint16_t data_port) +{ + _write(data_port, val); + + return; +} + +static uint8_t read_data_port(uint16_t data_port) +{ + return _read(data_port); +} + +static void write_ilpc2ahb_addr(uint32_t addr) +{ + int i; + + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG0 + i, LPC_ADDR_PORT); + write_data_port((addr >> (8 * (3 - i))) & MASK, LPC_DATA_PORT); + } + + return; +} + +static void write_ilpc2ahb_data(uint32_t data) +{ + int i; + + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG4 + i, LPC_ADDR_PORT); + write_data_port((data >> (8 * (3 - i))) & MASK, LPC_DATA_PORT); + } + + return; +} + +static uint32_t read_ilpc2ahb_data(void) +{ + int i, tmp; + uint32_t res; + + res = 0; + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG4 + i, LPC_ADDR_PORT); + tmp = read_data_port(LPC_DATA_PORT); + res |= (tmp << (8 * (3 - i))); + } + + return res; +} + +static void trigger_ilpc2ahb_read(void) +{ + write_addr_port(SUPERIO_FE, LPC_ADDR_PORT); + read_data_port(LPC_DATA_PORT); + + return; +} + +static void trigger_ilpc2ahb_write(void) +{ + write_addr_port(SUPERIO_FE, LPC_ADDR_PORT); + write_data_port(TOGGLE_WRITE, LPC_DATA_PORT); + + return; +} + +static uint32_t read_bmc_reg(uint32_t addr) +{ + uint32_t res; + + write_ilpc2ahb_addr(addr); + trigger_ilpc2ahb_read(); + res = read_ilpc2ahb_data(); + + return res; +} + +static void write_bmc_reg(uint32_t addr, uint32_t val) +{ + write_ilpc2ahb_addr(addr); + write_ilpc2ahb_data(val); + trigger_ilpc2ahb_write(); + + return; +} + +static uint32_t read_bmc_flash_data(void) +{ + uint32_t res; + + trigger_ilpc2ahb_read(); + res = read_ilpc2ahb_data(); + + return res; +} + +static void write_bmc_flash_data(uint32_t data) +{ + write_ilpc2ahb_data(data); + trigger_ilpc2ahb_write(); + + return; +} + +static void write_bmc_flash_addr(uint32_t addr) +{ + int i; + + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG4 + i, LPC_ADDR_PORT); + write_data_port((addr >> (8 * i)) & MASK, LPC_DATA_PORT); + } + + trigger_ilpc2ahb_write(); + + return; +} + +static void enable_bytes(int byte) +{ + write_addr_port(SUPERIO_REG8, LPC_ADDR_PORT); + switch (byte) { + case BYTE1: + write_data_port(SUPERIO_A0 + BYTE1_VAL, LPC_DATA_PORT); + break; + case BYTE2: + write_data_port(SUPERIO_A0 + BYTE2_VAL, LPC_DATA_PORT); + break; + case BYTE4: + write_data_port(SUPERIO_A0 + BYTE4_VAL, LPC_DATA_PORT); + break; + default: + write_data_port(SUPERIO_A0 + BYTE_RESERVED, LPC_DATA_PORT); + break; + } + + return; +} + +static void pull_ce_down(flash_info_t* info) +{ + write_bmc_reg(info->ce_control_reg, USER_MODE_PULL_CE_DOWN); + + return; +} + +static void pull_ce_up(flash_info_t* info) +{ + write_bmc_reg(info->ce_control_reg, USER_MODE_PULL_CE_UP); + + return; +} + +static void send_cmd(uint32_t flash_base_addr, int cmd) +{ + write_ilpc2ahb_addr(flash_base_addr); + enable_bytes(1); + write_addr_port(SUPERIO_REG7, LPC_ADDR_PORT); + write_data_port(cmd & MASK, LPC_DATA_PORT); + trigger_ilpc2ahb_write(); + enable_bytes(4); + + return; +} + +static void send_cmd_to_flash(flash_info_t* info, int cmd) +{ + pull_ce_down(info); + send_cmd(info->flash_base_addr, cmd); + pull_ce_up(info); + + return; +} + +static void check_data_length(void) +{ + uint8_t tmp; + /* Data length check, 4 bytes */ + write_addr_port(SUPERIO_REG8, LPC_ADDR_PORT); + tmp = read_data_port(LPC_DATA_PORT); + if (tmp != SUPERIO_A2) { + write_data_port(SUPERIO_A2, LPC_DATA_PORT); + } + + return; +} + +static void enable_ilpc2ahb(void) +{ + /* Write 0xAA then write 0xA5 twice to enable super IO*/ + write_addr_port(DISABLE_LPC, LPC_ADDR_PORT); + write_addr_port(ENABLE_LPC, LPC_ADDR_PORT); + write_addr_port(ENABLE_LPC, LPC_ADDR_PORT); + + /* Enable iLPC2AHB */ + write_addr_port(SUPERIO_07, LPC_ADDR_PORT); + write_data_port(LPC_TO_AHB, LPC_DATA_PORT); + write_addr_port(SUPERIO_30, LPC_ADDR_PORT); + write_data_port(ENABLE_LPC_TO_AHB, LPC_DATA_PORT); + + /* Data length */ + check_data_length(); + + return; +} + +static void disable_ilpc2ahb(void) +{ + /* disable ilpc2ahb */ + write_addr_port(SUPERIO_30, LPC_ADDR_PORT); + write_data_port(DISABLE_LPC_TO_AHB, LPC_DATA_PORT); + /* disable super IO */ + write_addr_port(DISABLE_LPC, LPC_ADDR_PORT); + + return; +} + +/* Enable CPU */ +static void enable_cpu(void) +{ + /* unlock SCU register */ + write_bmc_reg(SCU_ADDR, UNLOCK_SCU_KEY); + /* enable ARM */ + write_bmc_reg(REBOOT_CPU_REGISTER, SET_BMC_CPU_BOOT); + /* lock SCU register */ + write_bmc_reg(SCU_ADDR, LOCK_SCU_KEY); + + return; +} + +/* diasble CPU */ +static void disable_cpu(void) +{ + uint32_t scu_hw_strap_val; + + /* unlock SCU register */ + write_bmc_reg(SCU_ADDR, UNLOCK_SCU_KEY); + /* disable ARM */ + scu_hw_strap_val = read_bmc_reg(HARDWARE_STRAP_REGISTER); + write_bmc_reg(HARDWARE_STRAP_REGISTER, scu_hw_strap_val |0x01); + /* lock SCU register */ + write_bmc_reg(SCU_ADDR, LOCK_SCU_KEY); + + return; +} + +static void enable_upgrade(void) +{ + + enable_ilpc2ahb(); + /* diasble CPU */ + disable_cpu(); + /* init CE control register */ + write_bmc_reg(CE0_CONTROL_REGISTER, 0); + write_bmc_reg(CE1_CONTROL_REGISTER, 0); + /* disable WDT2 */ + write_bmc_reg(WATCHDOG2_CONTROL, DISABLE_WATCHDOG); + + return; +} + +static void disable_upgrade(void) +{ + enable_cpu(); + dbg_print(debug_on, "DEBUG 0x%x\n", read_bmc_reg(HARDWARE_STRAP_REGISTER)); + disable_ilpc2ahb(); + + return; +} + +static void watchdog_status_debug(void) +{ + uint32_t watchdog_reg; + + /* Watchdog Control Register */ + watchdog_reg = read_bmc_reg(WATCHDOG2_CONTROL); + dbg_print(debug_on,"Watchdog Control Register: 0x%x\n", watchdog_reg); + dbg_print(debug_on,"Watchdog Enable Signal: 0x%x\n", watchdog_reg & BIT1); + dbg_print(debug_on,"Watchdog Reset SyS En: 0x%x\n", (watchdog_reg & BIT2) >> 1); + dbg_print(debug_on,"Watchdog Reset Mode: 0x%x\n", (watchdog_reg & (BIT6 | BIT7)) >> 5); + switch (watchdog_reg & (BIT6 | BIT7)) { + case SOC_SYS: + dbg_print(debug_on,"\tReset Mode En: SoC System\n"); + break; + case FULL_CHIP: + dbg_print(debug_on,"\tReset Mode En: Full Chip\n"); + break; + case ARM_CPU: + dbg_print(debug_on,"\tReset Mode En: ARM Cpu\n"); + break; + default: + break; + } + + /* Watchdog Timeout Status Register */ + watchdog_reg = read_bmc_reg(WATCHDOG2_TSR); + dbg_print(debug_on,"Watchdog Timeout Occur: 0x%x\n", watchdog_reg & BIT1); + dbg_print(debug_on,"Watchdog Boot from: CD%d\n", watchdog_reg & BIT2); + dbg_print(debug_on,"Watchdog Interrupt Occur: 0x%x\n", watchdog_reg & BIT3); + + return; +} + +/* CE Type Setting Register */ +static void ce_type_setting_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(FMC_CE_TYPE_SETTING_REG); + if ((fmc_reg & CE0_SPI_TYPE) == SPI) { + dbg_print(debug_on,"CE0 Type Seeting: 0x%x, Type: SPI\n", fmc_reg & CE0_SPI_TYPE); + } else { + dbg_print(debug_on,"CE0 Type Seeting: 0x%x, Type: Unknown\n", fmc_reg & CE0_SPI_TYPE); + } + if (((fmc_reg & CE1_SPI_TYPE) >> BIT2) == SPI) { + dbg_print(debug_on,"CE1 Type Seeting: 0x%x, Type: SPI\n", (fmc_reg & CE1_SPI_TYPE) >> BIT2); + } else { + dbg_print(debug_on,"CE1 Type Seeting: 0x%x, Type: Unknown\n", (fmc_reg & CE1_SPI_TYPE) >> BIT2); + } + + return; +} +/* CE Control Register */ +static void ce_control_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(CE_CONTROL_REGISTER); + dbg_print(debug_on,"CE0 Address Mode: 0x%x, Mode: %d Bytes\n", + fmc_reg & BIT1, (fmc_reg & BIT1) + 3); + dbg_print(debug_on,"CE1 Address Mode: 0x%x, Mode: %d Bytes\n", + (fmc_reg & BIT2) >> 1, ((fmc_reg & BIT2) >> 1) + 3); + + return; +} + +/* Interrupt Control & Status Register */ +static void irq_control_status_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(INR_STATUS_CONTROL_REGISTER); + dbg_print(debug_on,"SPI Write Address Protected Interrupt EN: 0x%x\n", fmc_reg & BIT2); + dbg_print(debug_on,"SPI Command Abort Interrupt EN: 0x%x\n", fmc_reg & BIT3); + dbg_print(debug_on,"SPI Write Address Protected Status: 0x%x, Status: %s\n", + RIGHT_SHIFT_8(fmc_reg) & BIT2, (RIGHT_SHIFT_8(fmc_reg) & BIT2) == BIT2 ? "Occur" : "Normal"); + dbg_print(debug_on,"SPI Command Abort Status: 0x%x, Status: %s\n", + RIGHT_SHIFT_8(fmc_reg) & BIT3, (RIGHT_SHIFT_8(fmc_reg) & BIT3) == BIT3 ? "Occur" : "Normal"); + /*Clear Abnormal Status*/ + if ((RIGHT_SHIFT_8(fmc_reg) & BIT3) || (RIGHT_SHIFT_8(fmc_reg) & BIT2)) { + write_bmc_reg(INR_STATUS_CONTROL_REGISTER, CLEAR_INR_STATUS_CONTROL); + } + + return; +} + +/* Command Control Register */ +static void command_control_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(COMMAND_CONTROL_REGISTER); + dbg_print(debug_on,"Data Byte Line 0: %s\n", ((fmc_reg & BIT4) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Data Byte Line 1: %s\n", ((fmc_reg & BIT3) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Data Byte Line 2: %s\n", ((fmc_reg & BIT2) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Data Byte Line 3: %s\n", ((fmc_reg & BIT1) != 0) ? "Disable" : "Enable"); + + dbg_print(debug_on,"Address Byte Line 0: %s\n", ((fmc_reg & BIT8) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Address Byte Line 1: %s\n", ((fmc_reg & BIT7) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Address Byte Line 2: %s\n", ((fmc_reg & BIT6) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Address Byte Line 3: %s\n", ((fmc_reg & BIT5) != 0) ? "Disable" : "Enable"); + + return; +} + +static void ce_control_reg_debug(void) +{ + uint32_t fmc_reg; + + /* CE0 Control Register */ + fmc_reg = read_bmc_reg(CE0_CONTROL_REGISTER); + switch (fmc_reg & (BIT1 | BIT2)){ + case NORMAL_READ: + dbg_print(debug_on,"CE0 Command Mode: Normal Read\n"); + break; + case READ_MODE: + dbg_print(debug_on,"CE0 Command Mode: Read Command\n"); + break; + case WRITE_MODE: + dbg_print(debug_on,"CE0 Command Mode: Write Command\n"); + break; + case USER_MODE: + dbg_print(debug_on,"CE0 Command Mode: User Mode\n"); + break; + default: + break; + } + switch((RIGHT_SHIFT_24(fmc_reg) & (BIT5 | BIT6 | BIT7))){ + case 0: + dbg_print(debug_on,"CE0 IO Mode: Single Mode\n"); + break; + case 2: + case 3: + dbg_print(debug_on,"CE0 IO Mode: Dual Mode\n"); + break; + default: + break; + } + + dbg_print(debug_on,"CE0 Inactive Pulse Width: %d HCLK\n", + DEFAULT_WIDTH - (RIGHT_SHIFT_24(fmc_reg) & (BIT1 | BIT2 | BIT3 | BIT4))); + dbg_print(debug_on,"CE0 Data Input Mode: %s Mode\n", (fmc_reg & BIT4) == 0 ? "Single" : "Dual"); + dbg_print(debug_on,"CE0 MSB | LSB: %s First\n", (fmc_reg & BIT6) == 0 ? "MSB" : "LSB"); + + /* CE1 Control Register */ + fmc_reg = read_bmc_reg(CE1_CONTROL_REGISTER); + switch (fmc_reg & (BIT1 | BIT2)){ + case NORMAL_READ: + dbg_print(debug_on,"CE1 Command Mode: Normal Read\n"); + break; + case READ_MODE: + dbg_print(debug_on,"CE1 Command Mode: Read Command\n"); + break; + case WRITE_MODE: + dbg_print(debug_on,"CE1 Command Mode: Write Command\n"); + break; + case USER_MODE: + dbg_print(debug_on,"CE1 Command Mode: User Mode\n"); + break; + default: + break; + } + switch((RIGHT_SHIFT_24(fmc_reg) & (BIT5 | BIT6 | BIT7))){ + case 0: + dbg_print(debug_on,"CE1 IO Mode: Single Mode\n"); + break; + case 2: + case 3: + dbg_print(debug_on,"CE1 IO Mode: Dual Mode\n"); + break; + default: + break; + } + + dbg_print(debug_on,"CE1 Inactive Pulse Width: %d HCLK\n", + DEFAULT_WIDTH - (RIGHT_SHIFT_24(fmc_reg) & (BIT1 | BIT2 | BIT3 | BIT4))); + dbg_print(debug_on,"CE1 Data Input Mode: %s Mode\n", (fmc_reg & BIT4) == 0 ? "Single" : "Dual"); + dbg_print(debug_on,"CE1 MSB | LSB: %s First\n", (fmc_reg & BIT6) == 0 ? "MSB" : "LSB"); + + return; +} + +static void fmc_debug(void) +{ + ce_type_setting_debug(); + ce_control_debug(); + irq_control_status_debug(); + command_control_debug(); + ce_control_reg_debug(); + + return; +} + +/* Enable WatchDog to reset BMC*/ +static void enable_watchdog(int cs) +{ + uint32_t enable_watch_cmd; + + enable_watch_cmd = (cs == CE0) ? ENABLE_WATCHDOG : ENABLE_WATCHDOG | BOOT_DEFAULT_MASK; + write_bmc_reg(WATCHDOG2_CLEAR_STATUS, CLEAR_WATCHDOG_STATUS); + write_bmc_reg(WATCHDOG2_RESET_FUN_MASK, WATCHDOG_GATEMASK); + write_bmc_reg(WATCHDOG2_RELOAD_VALUE, WATCHDOG_NEW_COUNT); + write_bmc_reg(WATCHDOG2_COUNTER_RST, WATCHDOG_RELOAD_COUNTER); + write_bmc_reg(WATCHDOG2_CONTROL, enable_watch_cmd); + + return; +} + +static void bmc_reboot(int cs) +{ + enable_watchdog(cs); + watchdog_status_debug(); + disable_upgrade(); + printf("Upgrade-Complete, BMC rebooting...\n"); + + return; +} + +static int get_current_bmc(void) +{ + return (read_bmc_reg(WATCHDOG2_TSR) & 0x02) >> 1; +} + +static void get_flash_base_and_ce_ctrl(int current_bmc, int cs, uint32_t *flash_base_addr, uint32_t *ce_ctrl_addr) +{ + uint32_t ce0_addr_range_reg_val, ce0_decode_addr; + uint32_t ce1_addr_range_reg_val, ce1_decode_addr; + + ce0_addr_range_reg_val = read_bmc_reg(CE0_ADDRESS_RANGE_REGISTER); + ce0_decode_addr = SEGMENT_ADDR_START(ce0_addr_range_reg_val); + ce1_addr_range_reg_val = read_bmc_reg(CE1_ADDRESS_RANGE_REGISTER); + ce1_decode_addr = SEGMENT_ADDR_START(ce1_addr_range_reg_val); + dbg_print(debug_on,"CE0 addr decode range reg value:0x%08x, decode addr:0x%08x.\n", + ce0_addr_range_reg_val, ce0_decode_addr); + dbg_print(debug_on,"CE1 addr decode range reg value:0x%08x, decode addr:0x%08x.\n", + ce1_addr_range_reg_val, ce1_decode_addr); + + if (((current_bmc == CURRENT_MASTER) && (cs ==CE0)) || ((current_bmc == CURRENT_SLAVE) && (cs ==CE1))) { + *ce_ctrl_addr = CE0_CONTROL_REGISTER; + *flash_base_addr = ce0_decode_addr; + } else { + *ce_ctrl_addr = CE1_CONTROL_REGISTER; + *flash_base_addr = ce1_decode_addr; + } + + return; +} + +static int get_flash_id(uint32_t flash_base_addr, uint32_t ce_ctrl_addr) +{ + uint32_t origin_flash_id, flash_id; + + write_bmc_reg(ce_ctrl_addr, USER_MODE_PULL_CE_DOWN); + send_cmd(flash_base_addr, READID); + origin_flash_id = read_bmc_flash_data(); + write_bmc_reg(ce_ctrl_addr, USER_MODE_PULL_CE_UP); + flash_id = origin_flash_id & 0xFFFFFF; + dbg_print(debug_on,"origin flash id:0x%x, flash id:0x%x\n", origin_flash_id, flash_id); + + return flash_id; +} + +static uint8_t get_flash_status(flash_info_t* info) +{ + uint8_t flash_status; + + pull_ce_down(info); + + send_cmd(info->flash_base_addr, READ_FLASH_STATUS); + + flash_status = read_bmc_flash_data() & MASK; + pull_ce_up(info); + + dbg_print(debug_on,"get_flash_status:0x%x\n", flash_status); + return flash_status; +} + +static int check_flash_write_enable(flash_info_t* info) +{ + uint8_t flash_status; + int i, count; + + count = FLASH_WEL_TIMEOUT / FLASH_WEL_SLEEP_TIME; + for (i = 0; i <= count; i++) { + flash_status = get_flash_status(info); + if ((flash_status & FLASH_WRITE_ENABLE_MASK) != FLASH_WRITE_ENABLE_MASK) { + usleep(FLASH_WEL_SLEEP_TIME); + } else { + dbg_print(debug_on,"Check flash WEL success, RDSR:0x%x\n", flash_status); + return 0; + } + } + printf("Check flash WEL timeout, RDSR:0x%x\n", flash_status); + return -1; +} + +static int check_flash_write_process(flash_info_t* info, int timeout, int sleep_time) +{ + int i, count; + uint8_t flash_status; + + count = timeout / sleep_time; + for (i = 0; i <= count; i++) { + flash_status = get_flash_status(info); + if ((flash_status & FLASH_WIP_MASK) != 0) { + usleep(sleep_time); + } else { + dbg_print(debug_on,"Check flash WIP success, RDSR:0x%x\n", flash_status); + return 0; + } + } + printf("Check flash WIP timeout, RDSR:0x%x.\n", flash_status); + return -1; +} + +static int flash_write_enable(flash_info_t* info) +{ + int ret; + + send_cmd_to_flash(info, WRITE_ENABLE_FLASH); + ret = check_flash_write_enable(info); + if (ret < 0) { + return -1; + } + return 0; +} + +static void send_block_erase_cmd(flash_info_t* info, uint32_t block_addr) +{ + pull_ce_down(info); + send_cmd(info->flash_base_addr, info->erase_block_command); + write_bmc_flash_addr(block_addr); /* Erase Block addr */ + pull_ce_up(info); + + return; +} + +static void send_chip_erase_cmd(flash_info_t* info) +{ + send_cmd_to_flash(info, CHIP_ERASE_FLASH); + + return; +} + +static int write_bmc_flash_page(flash_info_t* info, uint32_t page_addr, uint8_t *p, int len) +{ + int pos; + + if (len % 4) { + printf("Page size %d invalid.\n", len); + return -1; + } + + pos = 0; + pull_ce_down(info); + send_cmd(info->flash_base_addr, info->page_program); + write_bmc_flash_addr(page_addr); /* page address */ + while (len) { + write_bmc_flash_data((*(uint32_t *)(p + pos))); + pos += 4; + len -= 4; + } + pull_ce_up(info); + + return 0; +} + +static int erase_chip_full(flash_info_t* info) +{ + time_t timep; + int ret; + + if (info->full_erase == 0) { + printf("Flash not support full erase function.\n"); + return -1; + } + + ret = flash_write_enable(info); + if(ret < 0) { + printf("Chip erase, enable flash write error.\n"); + return -1; + } + + time(&timep); + printf("Full chip erasing, please wait...\n"); + dbg_print(debug_on,"Erase Start-%s\n",asctime(gmtime(&timep))); + send_chip_erase_cmd(info); + ret = check_flash_write_process(info, CHIP_ERASE_TIMEOUT, CHIP_ERASE_SLEEP_TIME); + if (ret < 0) { + printf("Chip erase timeout.\n"); + return -1; + } + time(&timep); + dbg_print(debug_on,"Erase Finish-%s\n",asctime(gmtime(&timep))); + printf("Erase Finish\n"); + printf("=========================================\n"); + return 0; +} + +static int erase_chip_block(flash_info_t* info) +{ + uint32_t block_addr, end_addr; + time_t timep; + int ret; + + printf("Block erasing...\n"); + time (&timep); + dbg_print(debug_on,"Erase-Start-%s\n", asctime(gmtime(&timep))); + end_addr = info->flash_base_addr + info->flash_size; + block_addr = info->flash_base_addr; + while (1) { + /* Enable write */ + ret = flash_write_enable(info); + if(ret < 0) { + printf("Block erase, enable flash write error, block addr:0x%x\n", block_addr); + return -1; + } + + send_block_erase_cmd(info, block_addr); + /* Erase Block(64KB) MAX time 650ms*/ + ret = check_flash_write_process(info, BLOCK_ERASE_TIMEOUT, BLOCK_ERASE_SLEEP_TIME); + if (ret < 0) { + printf("Block erase, check write status error, block addr:0x%x\n", block_addr); + return -1; + } + printf("\r0x%x", block_addr); + fflush(stdout); + if (block_addr >= end_addr) { + time(&timep); + printf("\r\nErase Finish\n"); + printf("=========================================\n"); + dbg_print(debug_on,"\nEnd-Earse-%s\n",asctime(gmtime(&timep))); + break; + } + block_addr += info->block_size; + } + return 0; +} + +static int program_chip(uint32_t file_size, uint8_t *p, flash_info_t* info) +{ + time_t timep; + uint32_t page_addr, end_addr; + int ret, page_size; + + page_addr = info->flash_base_addr; + page_size = info->page_size; + end_addr = file_size + info->flash_base_addr; + time (&timep); + printf("Programming...\n"); + dbg_print(debug_on,"Program Start-%s\n",asctime(gmtime(&timep))); + /* Debug info */ + fmc_debug(); + while (1) { + /* Write enable */ + ret = flash_write_enable(info); + if(ret < 0) { + printf("Page program, enable flash write error, page addr:0x%x\n", page_addr); + return -1; + } + ret = write_bmc_flash_page(info, page_addr, p, page_size); + if (ret < 0) { + printf("Page program, write bmc flash page error, page addr:0x%x\n", page_addr); + return -1; + } + /* page program MAX time 1.5ms */ + ret = check_flash_write_process(info, PAGE_PROGRAM_TIMEOUT, PAGE_PROGRAM_SLEEP_TIME); + if (ret < 0) { + printf("Page program, check write status error, page addr:0x%x\n", page_addr); + return -1; + } + page_addr += page_size; + p += page_size; + if ((page_addr % 0x10000) == 0) { + printf("\r0x%x", page_addr); + fflush(stdout); + } + + if (page_addr >= end_addr) { + printf("\nProgram Finish\n"); + printf("=========================================\n"); + time(&timep); + dbg_print(debug_on,"\nProgram-End-%s\n",asctime(gmtime(&timep))); + break; + } + } /* End of while (1) */ + return 0; +} + +static int check_chip(uint32_t file_size, uint8_t *p, flash_info_t* info) +{ + time_t timep; + uint32_t offset_addr, rd_val, end_addr; + int pos; + + offset_addr = info->flash_base_addr; + end_addr = file_size + info->flash_base_addr; + pos=0; + /* Checking */ + time(&timep); + printf("Checking...\n"); + dbg_print(debug_on,"Checking-Start-%s\n",asctime(gmtime(&timep))); + + pull_ce_down(info); + send_cmd(info->flash_base_addr, COMMON_FLASH_READ); + write_bmc_flash_addr(info->flash_base_addr); + while (1) { + if (offset_addr >= end_addr) { + break; + } + rd_val = read_bmc_flash_data(); + if (rd_val != (*(uint32_t *)(p + pos))) { + printf("Check Error at 0x%08x\n", offset_addr); + printf("READ:0x%08x VALUE:0x%08x\n", rd_val, (*(uint32_t *)(p + pos))); + pull_ce_up(info); + return -1; + } + if ((offset_addr % 0x10000) == 0) { + printf("\r0x%x ", offset_addr); + fflush(stdout); + } + offset_addr += 4; + pos += 4; + } + pull_ce_up(info); + printf("\r\nFlash Checked\n"); + printf("=========================================\n"); + time(&timep); + dbg_print(debug_on,"Checking-End-%s\n",asctime(gmtime(&timep))); + return 0; +} + +flash_info_t* get_flash_info(int current_bmc, int cs) +{ + int i, size; + uint32_t flash_base_addr, ce_ctrl_addr, flash_id; + + get_flash_base_and_ce_ctrl(current_bmc, cs, &flash_base_addr, &ce_ctrl_addr); + + size = (sizeof(flash_info) / sizeof((flash_info)[0])); + + flash_id = get_flash_id(flash_base_addr, ce_ctrl_addr); + for (i = 0; i < size; i++) { + if (flash_info[i].flash_id == flash_id) { + flash_info[i].flash_base_addr = flash_base_addr; + flash_info[i].ce_control_reg = ce_ctrl_addr; + flash_info[i].cs = cs; + return &flash_info[i]; + } + } + printf("Cannot get flash info, cs:%d, flash base addr:0x%x, ce control addr:0x%x, flash_id:0x%x.\n", + cs, flash_base_addr, ce_ctrl_addr, flash_id); + return NULL; +} + +static void init_flash(flash_info_t* info) +{ + send_cmd_to_flash(info, RSTEN); + send_cmd_to_flash(info, RST); + send_cmd_to_flash(info, EXIT_OTP); + send_cmd_to_flash(info, ENABLE_BYTE4); + + return; +} + +static int upgrade_bmc_core(char *file_name, int erase_type, flash_info_t* info) +{ + int file_size, fp, ret; + uint8_t *p; + + file_size = get_file_size(file_name); + if (file_size < 0) { + printf("file size %d Error\n", file_size); + return -1; + } + + fp = open(file_name, O_RDWR); + if (fp < 0) { + printf("Cannot open %s.\n", file_name); + return -1; + } + + p = mmap(NULL, file_size, PROT_READ, MAP_SHARED, fp, 0); + if (p == MAP_FAILED) { + printf("Could not mmap %s, error(%s).\n", file_name, strerror(errno)); + close(fp); + return -1; + } + + printf("* CE%d FLASH TYPE: SPI FLASH\n", info->cs); + printf("* FLASH NAME: %s\n", info->flash_name); + printf("* File Size:%d, 0x%x\n", file_size, file_size); + printf("=========================================\n"); + + /* Select erase type */ + switch (erase_type) { + case FULL_ERASE: + ret = erase_chip_full(info); + break; + case BLOCK_ERASE: + ret = erase_chip_block(info); + break; + default: + printf("Unsupport earse type:%d\n", erase_type); + goto exit; + break; + } + + if (ret < 0) { + printf("Erase Chip Error\n"); + goto exit; + } + + /* Program the flash */ + ret = program_chip(file_size, p, info); + if(ret < 0) { + printf("Program Chip Error\n"); + goto exit; + } + /* Check */ + ret = check_chip(file_size, p, info); + if(ret < 0) { + printf("Check Chip Error\n"); + goto exit; + } + + munmap(p, file_size); + close(fp); + return 0; +exit: + munmap(p, file_size); + close(fp); + return -1; +} + +static int upgrade_bmc_flash(char *filename, int current_bmc, int cs, int erase_type) +{ + int ret; + flash_info_t* info; + + info = get_flash_info(current_bmc, cs); + if(info == NULL) { + return -1; + } + + init_flash(info); + + ret = upgrade_bmc_core(filename, erase_type, info); + + return ret; +} + +static int upgrade_both_flash(char *filename, int erase_type) +{ + int ret, current_bmc; + + enable_upgrade(); + + current_bmc = get_current_bmc(); + if (current_bmc == CURRENT_MASTER) { + printf("* Current Bmc Default Boot: CE0\n"); + } else { + printf("* Current Bmc Default Boot: CE1\n"); + } + + ret = upgrade_bmc_flash(filename, current_bmc, CE0, erase_type); + if (ret < 0) { + printf("Upgrade master bmc flash failed, stop upgrade.\n"); + goto err; + } + printf("Upgrade master bmc flash success.\n"); + + ret = upgrade_bmc_flash(filename, current_bmc, CE1, erase_type); + if (ret < 0) { + printf("Upgrade slave bmc flash failed.\n"); + goto err; + } + printf("Upgrade slave bmc flash success.\n"); + + bmc_reboot(CE0); + return 0; +err: + disable_upgrade(); + return -1; +} + +static int upgrade_single_flash(char *filename, int cs, int erase_type) +{ + int ret, current_bmc; + + enable_upgrade(); + + current_bmc = get_current_bmc(); + if (current_bmc == CURRENT_MASTER) { + printf("* Current Bmc Default Boot: CE0\n"); + } else { + printf("* Current Bmc Default Boot: CE1\n"); + } + + ret = upgrade_bmc_flash(filename, current_bmc, cs, erase_type); + if (ret < 0) { + printf("Upgrade %s bmc flash failed.\n", cs == 0 ? "master":"slave"); + goto err; + } + printf("Upgrade %s bmc flash success.\n", cs == 0 ? "master":"slave"); + + bmc_reboot(cs); + return 0; +err: + disable_upgrade(); + return -1; +} + +static int upgrade_bmc(char *filename, int cs, int erase_type) +{ + int ret; + + if (access(filename, F_OK) < 0) { + printf("Can't find file\n"); + help(); + return -1; + } + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + switch(cs) { + /* Single */ + case CE0: + case CE1: + ret = upgrade_single_flash(filename, cs, erase_type); + break; + /* Both */ + case BOTHFLASH: + ret = upgrade_both_flash(filename, erase_type); + break; + default: + ret = -1; + printf("Unsupport cs:%d\n", cs); + break; + } + + return ret; +} + +static int read_single_bmc_flash(flash_info_t* info, uint32_t start_addr, int read_size, int is_print) +{ + uint32_t res, flash_start_addr, flash_end_addr; + char filename[MAX_FILENAME_LENGTH]; + int fd, ret; + + flash_start_addr = info->flash_base_addr + start_addr; + flash_end_addr = flash_start_addr + read_size; + ret = 0; + fd = 0; + if (!is_print) { + mem_clear(filename, MAX_FILENAME_LENGTH); + snprintf(filename, MAX_FILENAME_LENGTH, "/tmp/image-bmc%d", info->cs); + fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRWXG|S_IRWXU|S_IRWXO); + if (fd < 0) { + printf("open file %s fail(err:%d)!\r\n", filename, errno); + return -1; + } + } + + printf("* CE%d FLASH TYPE: SPI FLASH\n", info->cs); + printf("* FLASH NAME: %s\n", info->flash_name); + printf("* Read flash addr:0x%x, size:0x%x\n", flash_start_addr, read_size); + printf("=========================================\n"); + printf("Reading...\n"); + + pull_ce_down(info); + send_cmd(info->flash_base_addr, COMMON_FLASH_READ); + write_bmc_flash_addr(flash_start_addr); + while (1) { + if (flash_start_addr >= flash_end_addr) { + break; + } + res = read_bmc_flash_data(); + if (is_print) { + printf("addr:0x%08x, val:0x%08x\n", flash_start_addr, res); + } else { + ret = write(fd, &res, sizeof(res)); + if (ret < 0) { + printf("write failed (errno: %d).\n", errno); + ret = -1; + goto exit; + } + } + if (((flash_start_addr % 0x10000) == 0) && (!is_print)) { + printf("\r0x%x ", flash_start_addr); + fflush(stdout); + } + flash_start_addr += 4; + } + printf("\r\nRead Finish\n"); + printf("=========================================\n"); +exit: + pull_ce_up(info); + if (fd > 0) { + close(fd); + } + return ret; +} + +static int read_bmc_flash(int cs, uint32_t start_addr, int read_size, int is_print) +{ + int ret, current_bmc; + flash_info_t* info; + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + enable_upgrade(); + + current_bmc = get_current_bmc(); + if (current_bmc == CURRENT_MASTER) { + printf("* Current Bmc Default Boot: CE0\n"); + } else { + printf("* Current Bmc Default Boot: CE1\n"); + } + + info = get_flash_info(current_bmc, cs); + if(info == NULL) { + goto err; + } + + if (start_addr >= info->flash_size) { + printf("start_addr 0x%x out of range.\n", start_addr); + goto err; + } + + if ((start_addr + read_size) > info->flash_size) { + printf("read size %d exceed flash size.\n", read_size); + read_size = info->flash_size - start_addr; + } + + init_flash(info); + + ret = read_single_bmc_flash(info, start_addr, read_size, is_print); + if (ret < 0) { + printf("Read %s bmc flash failed.\n", cs == 0 ? "master" : "slave"); + goto err; + } + disable_upgrade(); + return 0; +err: + disable_upgrade(); + return -1; +} + +static int read_bmc_reg_main(int argc, char* argv[]) +{ + uint32_t start_addr, read_val; + int read_size, ret; + char *stopstring; + + if (argc != 4) { + printf("Input invalid.\n"); + help(); + return -1; + } + + start_addr = strtoul(argv[2], &stopstring, 16); + read_size = strtol(argv[3], &stopstring, 10); + + if (read_size <= 0) { + printf("read length %d invalid\n", read_size); + return -1; + } + + if (((start_addr % 4) != 0) || ((read_size % 4) != 0)) { + printf("Params invalid, start_addr:0x%08x, read_size:%d\n", start_addr, read_size); + printf("Please input address/length times of 4\n"); + return -1; + } + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + enable_ilpc2ahb(); + + printf("read bcm reg, start_addr:0x%08x, read length:%d\n", start_addr, read_size); + printf("===Addr=== | ===Cont===\n"); + while (read_size) { + read_val = read_bmc_reg(start_addr); + printf("0x%08x | 0x%08x\n", start_addr, read_val); + start_addr += 4; + read_size -= 4; + } + + disable_ilpc2ahb(); + return 0; +} + +static int write_bmc_reg_main(int argc, char* argv[]) +{ + uint32_t addr, wr_val; + int ret; + char *stopstring; + + if (argc != 4) { + printf("Input invalid.\n"); + help(); + return -1; + } + + addr = strtoul(argv[2], &stopstring, 16); + wr_val = strtoul(argv[3], &stopstring, 16); + + if (((addr & MASK_BYTE) != REGISTER_HEAD) || ((addr % 4) != 0)) { + printf("Address[0x%08x] invalid, address should be register address and times of 4.\n", addr); + return -1; + } + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + printf("write bcm reg, addr:0x%08x, val:0x%08x\n", addr, wr_val); + + enable_ilpc2ahb(); + write_bmc_reg(addr, wr_val); + disable_ilpc2ahb(); + + return 0; +} + +static int get_fmc_info_main(void) +{ + int ret; + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + enable_ilpc2ahb(); + + debug_on = 3; + fmc_debug(); + debug_on = 0; + + disable_ilpc2ahb(); + return 0; +} + +static int program_flash_main(int argc, char* argv[]) +{ + int cs, erase_way, ret; + char *stopstring; + char tmp[128]; + + if (argc != 5) { + printf("Input invalid.\n"); + help(); + return -1; + } + + cs = strtol(argv[3], &stopstring, 10); + if ((strlen(stopstring) != 0) || cs < 0 || cs > 2) { + snprintf(tmp, sizeof(tmp), "%s", argv[3]); + printf("Incorrect chip select %s\n", tmp); + help(); + return -1; + } + + if (strcmp(argv[4], "full") == 0) { + erase_way = FULL_ERASE; + } else if (strcmp(argv[4], "block") == 0) { + erase_way = BLOCK_ERASE; + } else { + snprintf(tmp, sizeof(tmp), "%s", argv[4]); + printf("Incorrect erase type %s\n", tmp); + help(); + return -1; + } + + printf("============BMC Upgrade Tool=============\n"); + ret = upgrade_bmc(argv[2], cs, erase_way); + return ret; +} + +static int read_bmc_flash_main(int argc, char* argv[]) +{ + int cs, ret, read_size, is_print; + uint32_t start_addr; + char *stopstring; + char tmp[128]; + + if (argc != 6) { + printf("Input invalid.\n"); + help(); + return -1; + } + + cs = strtol(argv[2], &stopstring, 10); + if ((strlen(stopstring) != 0) || cs < 0 || cs > 1) { + snprintf(tmp, sizeof(tmp), "%s", argv[2]); + printf("Incorrect chip select %s\n", tmp); + help(); + return -1; + } + + start_addr = strtoul(argv[3], &stopstring, 16); + read_size = strtol(argv[4], &stopstring, 10); + + if (read_size <= 0) { + printf("read length %d invalid\n", read_size); + return -1; + } + + if (((start_addr % 4) != 0) || ((read_size % 4) != 0)) { + printf("Params invalid, start_addr:0x%08x, read_size:%d\n", start_addr, read_size); + printf("Please input address/length times of 4\n"); + return -1; + } + + if (strcmp(argv[5], "print") == 0) { + is_print = 1; + } else { + is_print = 0; + } + + printf("============READ BMC FLASH=============\n"); + ret = read_bmc_flash(cs, start_addr, read_size, is_print); + return ret; +} + +int main(int argc, char *argv[]) +{ + int ret; + + debug_on = fw_upgrade_debug(); + + if (argc < 2) { + help(); + return -1; + } + + if (argc == 2) { + if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) { + help(); + return 0; + } + } + + if (strcmp(argv[1], "rd") == 0) { + ret = read_bmc_reg_main(argc, argv); + if (ret < 0) { + printf("Read Failed\n"); + } + return ret; + } + + if (strcmp(argv[1], "wr") == 0 && debug_on == 3) { + ret = write_bmc_reg_main(argc, argv); + if (ret < 0) { + printf("Write Failed\n"); + } + return ret; + } + + if (strcmp(argv[1], "info") == 0) { + ret = get_fmc_info_main(); + if (ret < 0) { + printf("Get fmc info Failed\n"); + } + return ret; + } + + if (strcmp(argv[1], "upgrade") == 0) { + ret = program_flash_main(argc, argv); + if (ret < 0) { + printf("Upgrade BMC failed.\n"); + } + return ret; + } + + if (strcmp(argv[1], "read_bmc_flash") == 0) { + ret = read_bmc_flash_main(argc, argv); + if (ret < 0) { + printf("Read BMC flash failed.\n"); + } + return ret; + } + + printf("Input invalid.\n"); + help(); + + return -1; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c new file mode 100644 index 000000000000..a7a78d011011 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "fw_upgrade_debug.h" + +int fw_upgrade_debug(void) +{ + int size; + FILE *fp; + char debug_info[DEBUG_INFO_LEN]; + + fp = fopen(DEBUG_FILE, "r"); + if (fp == NULL) { + return DEBUG_IGNORE; + } + + mem_clear(debug_info, DEBUG_INFO_LEN); + size = fread(debug_info, DEBUG_INFO_LEN - 1, 1, fp); + if (size < 0) { + fclose(fp); + return DEBUG_IGNORE; + } + + if (strncmp(debug_info, DEBUG_ON_INFO, 1) == 0) { + fclose(fp); + return DEBUG_APP_ON; + } + + if (strncmp(debug_info, DEBUG_ON_KERN, 1) == 0) { + fclose(fp); + return DEBUG_KERN_ON; + } + + if (strncmp(debug_info, DEBUG_ON_ALL, 1) == 0) { + fclose(fp); + return DEBUG_ALL_ON; + } + + if (strncmp(debug_info, DEBUG_OFF_INFO, 1) == 0) { + fclose(fp); + return DEBUG_OFF; + } + + fclose(fp); + return DEBUG_IGNORE; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h new file mode 100644 index 000000000000..bd806a94b154 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h @@ -0,0 +1,230 @@ +#ifndef _FW_UPGRADE_H_ +#define _FW_UPGRADE_H_ + +#include "fw_upgrade_debug.h" + +#define dbg_print(debug, fmt, arg...) \ + if (debug == DEBUG_APP_ON || debug == DEBUG_ALL_ON) \ + { do{printf(fmt,##arg);} while(0); } + +/* LPC Interface */ +#define LPC_ADDR_PORT (0x4E) +#define LPC_DATA_PORT (0x4F) + +/* FMC REGISTER ADDR */ +#define FMC_BASE_ADDR (0x1E620000) +#define FMC_CE_TYPE_SETTING_REG (FMC_BASE_ADDR + 0x00) +#define CE_CONTROL_REGISTER (FMC_BASE_ADDR + 0x04) +#define INR_STATUS_CONTROL_REGISTER (FMC_BASE_ADDR + 0x08) +#define COMMAND_CONTROL_REGISTER (FMC_BASE_ADDR + 0x0C) +#define CE0_CONTROL_REGISTER (FMC_BASE_ADDR + 0x10) +#define CE1_CONTROL_REGISTER (FMC_BASE_ADDR + 0x14) +#define CE0_ADDRESS_RANGE_REGISTER (FMC_BASE_ADDR + 0x30) +#define CE1_ADDRESS_RANGE_REGISTER (FMC_BASE_ADDR + 0x34) + +/* SCU REGISTER ADDR */ +#define SCU_ADDR (0x1E6E2000) +#define HARDWARE_STRAP_REGISTER (SCU_ADDR + 0x70) +#define REBOOT_CPU_REGISTER (SCU_ADDR + 0x7C) + +/* SCU KEY */ +#define UNLOCK_SCU_KEY (0x1688A8A8) +#define LOCK_SCU_KEY (0x11111111) + +/* WATCHDOG REGISTER ADDR */ +#define WATCHDOG_ADDR (0x1E785000) +#define WATCHDOG1_RELOAD_VALUE (WATCHDOG_ADDR + 0x04) +#define WATCHDOG1_COUNTER_RST (WATCHDOG_ADDR + 0x08) +#define WATCHDOG1_CONTROL (WATCHDOG_ADDR + 0x0C) +#define WATCHDOG1_TSR (WATCHDOG_ADDR + 0x10) +#define WATCHDOG1_CLEAR_STATUS (WATCHDOG_ADDR + 0x14) +#define WATCHDOG1_RESET_FUN_MASK (WATCHDOG_ADDR + 0x1C) + +#define WATCHDOG2_RELOAD_VALUE (WATCHDOG_ADDR + 0x24) +#define WATCHDOG2_COUNTER_RST (WATCHDOG_ADDR + 0x28) +#define WATCHDOG2_CONTROL (WATCHDOG_ADDR + 0x2C) +#define WATCHDOG2_TSR (WATCHDOG_ADDR + 0x30) +#define WATCHDOG2_CLEAR_STATUS (WATCHDOG_ADDR + 0x34) +#define WATCHDOG2_RESET_FUN_MASK (WATCHDOG_ADDR + 0x3C) + +/* User Mode Command */ +#define WRITE_STATUS (0x01) +#define COMMON_PAGE_PROGRAM (0x02) +#define COMMON_FLASH_READ (0x03) +#define WRITE_DISABLE_FLASH (0x04) +#define READ_FLASH_STATUS (0x05) +#define WRITE_ENABLE_FLASH (0x06) +#define PAGE_PROGRAM_FLASH (0x12) +#define SECTOR_ERASE (0x20) +#define CLEAR_FLAG (0x50) +#define SUBBLOCK_ERASE (0x52) +#define CHIP_ERASE_FLASH (0x60) +#define BLOCK_ERASE_64 (0xD8) +#define READID (0x9F) +#define ENABLE_BYTE4 (0xB7) +#define EXIT_OTP (0xC1) +#define RSTEN (0x66) +#define RST (0x99) + +#define BIT1 (0x01) +#define BIT2 (0x02) +#define BIT3 (0x04) +#define BIT4 (0x08) +#define BIT5 (0x10) +#define BIT6 (0x20) +#define BIT7 (0x40) +#define BIT8 (0x80) +#define RIGHT_SHIFT_8(reg) (reg >> 8) +#define RIGHT_SHIFT_16(reg) (reg >> 16) +#define RIGHT_SHIFT_24(reg) (reg >> 24) +#define MASK (0xFF) +#define FLASH_TYPE_MASK (BIT1 | BIT2) +#define BOOT_DEFAULT_MASK (BIT8) +#define HEAD_MASK (0x00FFFF00) +#define MASK_BYTE (0xFF000000) +#define BYTE1 (1) +#define BYTE2 (2) +#define BYTE4 (4) +#define BYTE1_VAL (0) +#define BYTE2_VAL (1) +#define BYTE4_VAL (2) +#define BYTE_RESERVED (3) + +/* SuperIO */ +#define SUPERIO_07 (0x07) +#define SUPERIO_30 (0x30) +#define SUPERIO_A0 (0xA0) +#define SUPERIO_A2 (0xA2) +#define SUPERIO_REG0 (0xF0) +#define SUPERIO_REG1 (0xF1) +#define SUPERIO_REG2 (0xF2) +#define SUPERIO_REG3 (0xF3) +#define SUPERIO_REG4 (0xF4) +#define SUPERIO_REG5 (0xF5) +#define SUPERIO_REG6 (0xF6) +#define SUPERIO_REG7 (0xF7) +#define SUPERIO_REG8 (0xF8) +#define SUPERIO_FE (0xFE) + +/* SPI Command */ +#define HIGH_CLOCK (0x00000000) +#define NORMAL_READ (0x00000000) +#define READ_MODE (0x00000001) +#define WRITE_MODE (0x00000002) +#define USER_MODE (0x00000003) +#define PULL_DOWN (0x00000000) +#define PULL_UP (0x00000004) + +#define CHIP_ERASE_TIME (60) +#define CHIP_ERASE_TIMEOUT (300 * 1000 * 1000) +#define CHIP_ERASE_SLEEP_TIME (5 * 1000 * 1000) +#define BLOCK_ERASE_TIMEOUT (10 * 1000 * 1000) +#define BLOCK_ERASE_SLEEP_TIME (100 * 1000) +#define PAGE_PROGRAM_TIMEOUT (100 * 1000) +#define PAGE_PROGRAM_SLEEP_TIME (1000) +#define FLASH_WEL_TIMEOUT (100 * 1000) +#define FLASH_WEL_SLEEP_TIME (1000) +#define FLASH_WIP_MASK (0x00000001) +#define FLASH_WRITE_ENABLE_MASK (0x00000002) + +#define DATA_LENGTH_MASK (0xA2) +#define TOGGLE_WRITE (0xCF) +#define DISABLE_LPC (0xAA) +#define ENABLE_LPC (0xA5) +#define LPC_TO_AHB (0x0D) +#define ENABLE_LPC_TO_AHB (0x01) +#define DISABLE_LPC_TO_AHB (0x00) +#define ENABLE_BMC_CPU_BOOT (0xF10BD286) +#define DISABLE_BMC_CPU_BOOT (0xF10BD287) +#define SET_BMC_CPU_BOOT (0x01) +#define CLEAR_WATCHDOG_STATUS (0x01) +#define DISABLE_WATCHDOG (0x00000030) +#define ENABLE_WATCHDOG (0x00000033) +#define WATCHDOG_GATEMASK (0x033FFFF3) +#define WATCHDOG_NEW_COUNT (0x00050000) +#define WATCHDOG_RELOAD_COUNTER (0x4755) + +#define CE0_SPI_TYPE (0x00000002) +#define CE1_SPI_TYPE (0x00000008) +#define ERROR_COMMAND (0x00000400) +#define ADDRESS_PROTECT (0x00000200) +#define CLEAR_INR_STATUS_CONTROL (ERROR_COMMAND | ADDRESS_PROTECT) +#define USER_MODE_PULL_CE_DOWN (HIGH_CLOCK | USER_MODE | PULL_DOWN) +#define USER_MODE_PULL_CE_UP (HIGH_CLOCK | USER_MODE | PULL_UP) + +#define STEP_64 (64 * 1024) +#define STEP_256 (256 * 1024) +#define BYTE_256 (256) + +#define CE0 (0) +#define CE1 (1) +#define BOTHFLASH (2) +#define SOC_SYS (0) +#define FULL_CHIP (1) +#define ARM_CPU (2) +#define FULL_ERASE (0) +#define BLOCK_ERASE (1) +#define READ_ALL (2) +#define CURRENT_SLAVE (1) +#define CURRENT_MASTER (0) +#define REGISTER_HEAD (0x1e000000) +#define DEFAULT_WIDTH (16) +#define MAX_FILENAME_LENGTH (64) +#define SEGMENT_ADDR_START(_r) ((((_r) >> 16) & 0xFF) << 23) + +typedef struct flash_info { + uint32_t flash_size; + int cs; + int flash_type; + uint32_t flash_id; + int page_size; + char flash_name[64]; + int erase_block_command; + int page_program; + int block_size; + int full_erase; + uint32_t ce_control_reg; + uint32_t flash_base_addr; +} flash_info_t; + +typedef enum flash_id { + MX25L6433F = 0x1920c2, + S25FL512S = 0x200201, + MX25l512 = 0x1a20c2, + STM25P64 = 0x172020, + STM25P128 = 0x182020, + N25Q256 = 0x19ba20, + N25Q512 = 0x20ba20, + W25X16 = 0x1530ef, + W25X64 = 0x1730ef, + W25Q64BV = 0x1740ef, + W25Q128BV = 0x1840ef, + W25Q256FV = 0x1940ef, + MX25L1605D = 0x1520C2, + MX25L12805D = 0x1820C2, + MX66L1G45G = 0x1B20C2, + SST25VF016B = 0x4125bf, + SST25VF064C = 0x4b25bf, + SST25VF040B = 0x8d25bf, + AT25DF161 = 0x02461F, + AT25DF321 = 0x01471F, + GD25Q256 = 0X1940c8, +} flash_id_t; + +typedef enum flash_type { + NOR = 0, + SPI = 2, +} flash_type_t; + +typedef enum flash_size { + M1 = 0x00080000, + M3 = 0x00200000, /* 3M */ + M6 = 0x00400000, /* 6M */ + M12 = 0x00800000, /* 12M */ + M16 = 0x01000000, /* 16M */ + M32 = 0x02000000, /* 32M */ + M64 = 0x04000000, /* 64M */ + M128 = 0x08000000, /* 128M */ +} flash_size_t; + +#endif /*_FW_UPGRADE_H_*/ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h new file mode 100644 index 000000000000..05911da62a7e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h @@ -0,0 +1,25 @@ +#ifndef __FW_UPGRADE_DEBUG_H__ +#define __FW_UPGRADE_DEBUG_H__ + +#include + +#define DEBUG_INFO_LEN 20 +#define DEBUG_FILE "/tmp/.fw_upgrade_debug" +#define DEBUG_ON_ALL "3" +#define DEBUG_ON_KERN "2" +#define DEBUG_ON_INFO "1" +#define DEBUG_OFF_INFO "0" + +#define mem_clear(data, size) memset((data), 0, (size)) + +enum debug_s { + DEBUG_OFF = 0, + DEBUG_APP_ON, + DEBUG_KERN_ON, + DEBUG_ALL_ON, + DEBUG_IGNORE, +}; + +extern int fw_upgrade_debug(void); + +#endif /* End of __FW_UPGRADE_DEBUG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf b/platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf deleted file mode 100644 index ad60b2eb6f95..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf +++ /dev/null @@ -1,4 +0,0 @@ -# depmod.conf -# -# override default search ordering for kmod packaging -search updates extra external built-in weak-updates diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/__init__.py rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/__init__.py diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py new file mode 100644 index 000000000000..81fd596e7fee --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +import os +import syslog +import copy + +from plat_hal.baseutil import baseutil + +HYST_DEBUG_FILE = "/etc/.hysteresis_debug_flag" + +HYSTERROR = 1 +HYSTDEBUG = 2 + +debuglevel = 0 + + +def hyst_debug(s): + if HYSTDEBUG & debuglevel: + syslog.openlog("FANCONTROL-HYST", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def hyst_error(s): + if HYSTERROR & debuglevel: + syslog.openlog("FANCONTROL-HYST", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class hysteresis(object): + __config = None + __hyst_config = None + + def __init__(self): + self.__config = baseutil.get_monitor_config() + self.__hyst_config = copy.deepcopy(self.__config.get("hyst", {})) + # init check + errcnt = 0 + errmsg = "" + self.debug_init() + for temp_hyst_conf in self.__hyst_config.values(): + if temp_hyst_conf["flag"] == 0: + continue + for i in range(temp_hyst_conf["temp_min"], temp_hyst_conf["temp_max"] + 1): + if i not in temp_hyst_conf["rising"]: + errcnt -= 1 + msg = "%s hyst config error, temp value %d not in rising curve;" % (temp_hyst_conf["name"], i) + hyst_error(msg) + errmsg += msg + if i not in temp_hyst_conf["descending"]: + errcnt -= 1 + msg = "%s hyst config error, temp value %d not in descending curve;" % (temp_hyst_conf["name"], i) + hyst_error(msg) + errmsg += msg + if errcnt < 0: + raise KeyError(errmsg) + + def debug_init(self): + global debuglevel + if os.path.exists(HYST_DEBUG_FILE): + debuglevel = debuglevel | HYSTDEBUG | HYSTERROR + else: + debuglevel = debuglevel & ~(HYSTDEBUG | HYSTERROR) + + def get_temp_hyst_conf(self, temp_name): + temp_hyst_conf = self.__hyst_config.get(temp_name) + return temp_hyst_conf + + def get_temp_update(self, hyst_para, current_temp): + temp = hyst_para["value"] + if temp is None: + return None + temp.append(current_temp) + del temp[0] + return temp + + def duty_to_pwm(self, duty): + pwm = int(round(float(duty) * 255 / 100)) + return pwm + + def pwm_to_duty(self, pwm): + duty = int(round(float(pwm) * 100 / 255)) + return duty + + def calc_hyst_val(self, temp_name, temp_list): + + temp_hyst_conf = self.get_temp_hyst_conf(temp_name) + hyst_min = temp_hyst_conf["hyst_min"] + hyst_max = temp_hyst_conf["hyst_max"] + temp_min = temp_hyst_conf["temp_min"] + temp_max = temp_hyst_conf["temp_max"] + rising = temp_hyst_conf["rising"] + descending = temp_hyst_conf["descending"] + last_hyst_value = temp_hyst_conf["last_hyst_value"] + current_temp = temp_list[1] + last_temp = temp_list[0] + + hyst_debug("calc_hyst_val, temp_name: %s, current_temp: %s, last_temp: %s, last_hyst_value: %s" % + (temp_name, current_temp, last_temp, last_hyst_value)) + + if current_temp < temp_min: + hyst_debug("%s current_temp %s less than temp_min %s, set min hyst value: %s" % + (temp_name, current_temp, temp_min, hyst_min)) + return hyst_min + + if current_temp > temp_max: + hyst_debug("%s current_temp %s more than temp_max %s, set max hyst value: %s" % + (temp_name, current_temp, temp_max, hyst_max)) + return hyst_max + + if last_temp is None: # first time + hyst_value = rising[current_temp] + hyst_debug("last_temp is None, it's first hysteresis, using rising hyst value: %s" % hyst_value) + return hyst_value + + if current_temp == last_temp: # temp unchanging + hyst_debug("current_temp equal last_temp, keep last hyst value: %s" % last_hyst_value) + return last_hyst_value + + if current_temp > last_temp: + calc_hyst_value = rising[current_temp] + if calc_hyst_value < last_hyst_value: + hyst_value = last_hyst_value + else: + hyst_value = calc_hyst_value + hyst_debug("temp rising, last_hyst_value: %s, calc_hyst_value: %s, set hyst value: %s" % + (last_hyst_value, calc_hyst_value, hyst_value)) + return hyst_value + + calc_hyst_value = descending[current_temp] + if calc_hyst_value > last_hyst_value: + hyst_value = last_hyst_value + else: + hyst_value = calc_hyst_value + hyst_debug("temp descending, last_hyst_value: %s, calc_hyst_value: %s, set hyst value: %s" % + (last_hyst_value, calc_hyst_value, hyst_value)) + return hyst_value + + def cacl(self, temp_name, current_temp): + self.debug_init() + try: + temp_hyst_conf = self.get_temp_hyst_conf(temp_name) + if temp_hyst_conf is None: + hyst_debug("get %s hysteresis config failed" % temp_name) + return None + + flag = temp_hyst_conf["flag"] + if flag != 1: + hyst_debug("%s hysteresis flag == 0, skip" % temp_name) + return None + + temp = self.get_temp_update(temp_hyst_conf, current_temp) + if temp is None: + hyst_debug("get %s update failed" % temp_name) + return None + + value = self.calc_hyst_val(temp_name, temp) + + temp_hyst_conf["last_hyst_value"] = value + + speed_type = temp_hyst_conf["type"] + if speed_type == "duty": + pwm = self.duty_to_pwm(value) + else: + pwm = value + + hyst_debug("temp_name: %s, current_temp: %s, set pwm 0x%x" % (temp_name, current_temp, pwm)) + return pwm + except Exception as e: + hyst_error("temp_name: %s calc hysteresis pwm error, msg: %s" % (temp_name, str(e))) + return None diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py new file mode 100644 index 000000000000..6ff731fa7eb2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +import os +import syslog + +from plat_hal.baseutil import baseutil + +OPENLOOP_DEBUG_FILE = "/etc/.openloop_debug_flag" + +OPENLOOPERROR = 1 +OPENLOOPDEBUG = 2 + +debuglevel = 0 + + +def openloop_debug(s): + if OPENLOOPDEBUG & debuglevel: + syslog.openlog("FANCONTROL-OPENLOOP", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def openloop_error(s): + if OPENLOOPERROR & debuglevel: + syslog.openlog("FANCONTROL-OPENLOOP", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class openloop(object): + __config = None + __openloop_config = None + + def __init__(self): + self.__config = baseutil.get_monitor_config() + self.__openloop_config = self.__config["openloop"] + + def debug_init(self): + global debuglevel + if os.path.exists(OPENLOOP_DEBUG_FILE): + debuglevel = debuglevel | OPENLOOPDEBUG | OPENLOOPERROR + else: + debuglevel = debuglevel & ~(OPENLOOPDEBUG | OPENLOOPERROR) + + def get_para(self, t): + para = self.__openloop_config.get(t) + return para + + def linear_cacl(self, temp): + self.debug_init() + openloop_para = self.get_para("linear") + if openloop_para is None: + openloop_debug("linear openloop: get para failed") + return None + + K = openloop_para["K"] + tin_min = openloop_para["tin_min"] + pwm_min = openloop_para["pwm_min"] + pwm_max = openloop_para["pwm_max"] + flag = openloop_para["flag"] + + if flag != 1: + openloop_debug("linear openloop: flag == 0") + return None + + if temp <= tin_min: + openloop_debug("linear openloop: temp = %d less than tin_min[%d]" % (temp, tin_min)) + return pwm_min + + pwm = int(pwm_min + (temp - tin_min) * K) + openloop_debug("linear openloop: cacl_pwm = 0x%x" % pwm) + + pwm = min(pwm, pwm_max) + pwm = max(pwm, pwm_min) + openloop_debug("linear openloop: temp = %d, pwm = 0x%x" % (temp, pwm)) + return pwm + + def curve_cacl(self, temp): + self.debug_init() + openloop_para = self.get_para("curve") + if openloop_para is None: + openloop_debug("curve openloop: get para failed") + return None + + a = openloop_para["a"] + b = openloop_para["b"] + c = openloop_para["c"] + tin_min = openloop_para["tin_min"] + pwm_min = openloop_para["pwm_min"] + pwm_max = openloop_para["pwm_max"] + flag = openloop_para["flag"] + + if flag != 1: + openloop_debug("curve openloop: flag == 0") + return None + + if temp <= tin_min: + openloop_debug("curve openloop: temp = %d less than tin_min[%d]" % (temp, tin_min)) + return pwm_min + + pwm = int(a * temp * temp + b * temp + c) + openloop_debug("curve openloop: cacl_pwm = 0x%x" % pwm) + + pwm = min(pwm, pwm_max) + pwm = max(pwm, pwm_min) + openloop_debug("curve openloop: temp = %d, pwm = 0x%x" % (temp, pwm)) + return pwm diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py new file mode 100644 index 000000000000..c33c1df33b4e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +import os +import syslog +import copy + +from plat_hal.baseutil import baseutil + +PID_DEBUG_FILE = "/etc/.pid_debug_flag" + +PIDERROR = 1 +PIDDEBUG = 2 + +debuglevel = 0 + + +def pid_debug(s): + if PIDDEBUG & debuglevel: + syslog.openlog("FANCONTROL-PID", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def pid_error(s): + if PIDERROR & debuglevel: + syslog.openlog("FANCONTROL-PID", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class pid(object): + __config = None + __pid_config = None + + def __init__(self): + self.__config = baseutil.get_monitor_config() + self.__pid_config = copy.deepcopy(self.__config["pid"]) + + def debug_init(self): + global debuglevel + if os.path.exists(PID_DEBUG_FILE): + debuglevel = debuglevel | PIDDEBUG | PIDERROR + else: + debuglevel = debuglevel & ~(PIDDEBUG | PIDERROR) + + def get_para(self, name): + para = self.__pid_config.get(name) + return para + + def get_temp_update(self, pid_para, current_temp): + temp = pid_para["value"] + if temp is None: + return None + temp.append(current_temp) + del temp[0] + return temp + + def cacl(self, last_pwm, name, current_temp): + delta_pwm = 0 + self.debug_init() + pid_debug("last_pwm = %d" % last_pwm) + + pid_para = self.get_para(name) + if pid_para is None: + pid_debug("get %s pid para failed" % name) + return None + + temp = self.get_temp_update(pid_para, current_temp) + if temp is None: + pid_debug("get %s update failed" % name) + return None + + speed_type = pid_para["type"] + Kp = pid_para["Kp"] + Ki = pid_para["Ki"] + Kd = pid_para["Kd"] + target = pid_para["target"] + pwm_min = pid_para["pwm_min"] + pwm_max = pid_para["pwm_max"] + flag = pid_para["flag"] + + if flag != 1: + pid_debug("%s pid flag == 0" % name) + return None + + if speed_type == "duty": + current_pwm = round(last_pwm * 100 / 255) + else: + current_pwm = last_pwm + + if temp[2] is None: + tmp_pwm = current_pwm + elif ((temp[0] is None) or (temp[1] is None)): + delta_pwm = Ki * (temp[2] - target) + tmp_pwm = current_pwm + delta_pwm + else: + delta_pwm = Kp * (temp[2] - temp[1]) + Ki * (temp[2] - target) + Kd * (temp[2] - 2 * temp[1] + temp[0]) + tmp_pwm = current_pwm + delta_pwm + + pid_debug("delta_pwm = %d" % delta_pwm) + if speed_type == "duty": + pwm = round(tmp_pwm * 255 / 100) + else: + pwm = int(tmp_pwm) + + pwm = min(pwm, pwm_max) + pwm = max(pwm, pwm_min) + pid_debug("last_pwm = 0x%x, pwm = 0x%x" % (last_pwm, pwm)) + return pwm diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py index 38beb068f44c..4be78e7fdc03 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py @@ -1,19 +1,21 @@ #!/usr/bin/python3 # -*- coding: utf-8 -*- + class FantlvException(Exception): - def __init__(self, message='fantlverror', code=-100): + def __init__(self, message='fantlverror', code=-100): err = 'errcode: {0} message:{1}'.format(code, message) Exception.__init__(self, err) self.code = code self.message = message -class fan_tlv(object): + +class fan_tlv(): HEAD_INFO = "\x01\x7e\x01\xf1" - VERSION = 0x01 # E2PROM file init version is 0x01 - FLAG = 0x7E #new version E2PROM mark as 0x7E - HW_VER = 0X01 # consists of master version and revised version - TYPE = 0xf1 # hardware type define - TLV_LEN = 00 # vaild data length(16bit) + VERSION = 0x01 + FLAG = 0x7E + HW_VER = 0X01 + TYPE = 0xf1 + TLV_LEN = 00 _FAN_TLV_HDR_LEN = 6 _FAN_TLV_CRC_LEN = 2 @@ -22,8 +24,6 @@ class fan_tlv(object): _FAN_TLV_TYPE_HW_INFO = 0x05 _FAN_TLV_TYPE_DEV_TYPE = 0x06 - _fandecodetime = 0 - @property def dstatus(self): return self._dstatus @@ -44,18 +44,6 @@ def typehwinfo(self): def typedevtype(self): return self._typedevtype - @property - def fanbus(self): - return self._fanbus - - @property - def fanloc(self): - return self._fanloc - - @property - def fandecodetime(self): - return self._fandecodetime - def __init__(self): self._typename = "" self._typesn = "" @@ -63,25 +51,20 @@ def __init__(self): self._typedevtype = "" self._dstatus = 0 - def strtoarr(self, str): + def strtoarr(self, val): s = [] - if str is not None: - for index in range(len(str)): - s.append(str[index]) + if not isinstance(val, str): + return s + for index in val: + s.append(index) return s - def str_to_hex(self,rest_v): - value = 0 - for index in range(len(rest_v)): - value |= ord(rest_v[index]) << ((len(rest_v) - index - 1) * 8) - return value - - def hex_to_str(self,s): + def hex_to_str(self, s): len_t = len(s) if len_t % 2 != 0: return 0 ret = "" - for t in range(0, int(len_t / 2)): + for t in range(0, len_t / 2): ret += chr(int(s[2 * t:2 * t + 2], 16)) return ret @@ -92,7 +75,7 @@ def generate_fan_value(self): bin_buffer[2] = chr(self.HW_VER) bin_buffer[3] = chr(self.TYPE) - temp_t = "%08x" % self.typedevtype # handle devtype first + temp_t = "%08x" % self.typedevtype typedevtype_t = self.hex_to_str(temp_t) total_len = len(self.typename) + len(self.typesn) + \ len(self.typehwinfo) + len(typedevtype_t) + 8 @@ -125,10 +108,9 @@ def generate_fan_value(self): len(typedevtype_t)] = self.strtoarr(typedevtype_t) index_start = index_start + 2 + len(typedevtype_t) - crcs = fan_tlv.fancrc(''.join(bin_buffer[0:index_start])) # 2bytes checking + crcs = fan_tlv.fancrc(''.join(bin_buffer[0:index_start])) bin_buffer[index_start] = chr(crcs >> 8) bin_buffer[index_start + 1] = chr(crcs & 0x00ff) - # printvalue(bin_buffer) return bin_buffer def decode(self, e2): @@ -144,7 +126,6 @@ def decode(self, e2): tlv_index = self._FAN_TLV_HDR_LEN tlv_end = self._FAN_TLV_HDR_LEN + self.TLV_LEN - # check sum if len(e2) < self._FAN_TLV_HDR_LEN + self.TLV_LEN + 2: raise FantlvException("Fan tlv eeprom len error!", -2) sumcrc = fan_tlv.fancrc(e2[0:self._FAN_TLV_HDR_LEN + self.TLV_LEN]) @@ -152,8 +133,7 @@ def decode(self, e2): ) << 8 | ord(e2[self._FAN_TLV_HDR_LEN + self.TLV_LEN + 1]) if sumcrc != readcrc: raise FantlvException("Fan tlv eeprom checksum error!", -1) - else: - self._dstatus = 0 + self._dstatus = 0 while (tlv_index + 2) < len(e2) and tlv_index < tlv_end: s = self.decoder( e2[tlv_index:tlv_index + 2 + ord(e2[tlv_index + 1])]) @@ -164,15 +144,16 @@ def decode(self, e2): @staticmethod def fancrc(t): - sum = 0 - for index in range(len(t)): - sum += ord(t[index]) - return sum + crc = 0 + for item in t: + crc += ord(item) + return crc def decoder(self, t): try: name = "" value = "" + _len = 0 if ord(t[0]) == self._FAN_TLV_TYPE_NAME: name = "Product Name" _len = ord(t[1]) @@ -194,10 +175,10 @@ def decoder(self, t): value = "0x" for c in t[2:2 + ord(t[1])]: value += "%02X" % (ord(c),) - self._typedevtype = int(value,16) + self._typedevtype = int(value, 16) except Exception as e: print(e) - return {"name": name, "code": ord(t[0]), "value": value,"lens": _len} + return {"name": name, "code": ord(t[0]), "value": value, "lens": _len} def __str__(self): formatstr = "VERSION : 0x%02x \n" \ @@ -207,6 +188,5 @@ def __str__(self): "typename : %s \n" \ "typesn : %s \n" \ "typehwinfo : %s \n" - return formatstr % (self.VERSION, self.FLAG, self.HW_VER, self.TYPE, self.typename, self.typesn, self.typehwinfo) - - + return formatstr % (self.VERSION, self.FLAG, self.HW_VER, self.TYPE, + self.typename, self.typesn, self.typehwinfo) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py index 90a690a19edd..f95164e03601 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py @@ -1,18 +1,14 @@ #!/usr/bin/python3 -# -*- coding: utf-8 -*- import collections -from bitarray import bitarray from datetime import datetime, timedelta -import sys +from bitarray import bitarray -__all__ = ["FruException", "FruUtil", "BaseArea", "BoardInfoArea", "ProductInfoArea", - "MultiRecordArea", "Field", "ipmifru"] __DEBUG__ = "N" class FruException(Exception): - def __init__(self, message='fruerror', code=-100): + def __init__(self, message='fruerror', code=-100): err = 'errcode: {0} message:{1}'.format(code, message) Exception.__init__(self, err) self.code = code @@ -24,7 +20,7 @@ def e_print(err): def d_print(debug_info): - if(__DEBUG__ == "Y"): + if __DEBUG__ == "Y": print(debug_info) @@ -43,7 +39,7 @@ def minToData(): starttime = datetime(1996, 1, 1, 0, 0, 0) endtime = datetime.now() seconds = (endtime - starttime).total_seconds() - mins = seconds / 60 + mins = seconds // 60 m = int(round(mins)) return m @@ -53,7 +49,7 @@ def getTimeFormat(): @staticmethod def getTypeLength(value): - if value is None: + if value is None or len(value) == 0: return 0 a = bitarray(8) a.setall(False) @@ -65,8 +61,8 @@ def getTypeLength(value): @staticmethod def checksum(b): result = 0 - for i in range(len(b)): - result += ord(b[i]) + for item in b: + result += ord(item) return (0x100 - (result & 0xff)) & 0xff @@ -89,7 +85,6 @@ def __init__(self, name="", size=0, offset=0): self._size = size self._isPresent = False self._data = b'\x00' * size - self.__dataoffset = 0 @property def childList(self): @@ -144,6 +139,9 @@ class BoardInfoArea(BaseArea): _boardTime = None _fields = None _mfg_date = None + areaversion = None + _boardversion = None + _language = None def __str__(self): formatstr = "version : %x\n" \ @@ -229,8 +227,7 @@ def decodedata(self): self.fruFileId = self.data[index + 1: index + templen + 1] index += templen + 1 d_print("decode fruFileId:%s" % self.fruFileId) - - + for i in range(1, 11): valtmp = "boardextra%d" % i if self.data[index] != chr(0xc1): @@ -242,6 +239,11 @@ def decodedata(self): else: break + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + def recalcute(self): d_print("boardInfoArea version:%x" % ord(self.boardversion)) d_print("boardInfoArea length:%d" % self.size) @@ -250,7 +252,7 @@ def recalcute(self): d_print("boardInfoArea mfg_date:%x" % self.mfg_date) self.data = chr(ord(self.boardversion)) + \ - chr(self.size / 8) + chr(self.language) + chr(self.size // 8) + chr(self.language) self.data += chr(self.mfg_date & 0xFF) self.data += chr((self.mfg_date >> 8) & 0xFF) @@ -283,9 +285,7 @@ def recalcute(self): valtmpval = getattr(self, valtmp) d_print("boardInfoArea boardextra%d:%s" % (i, valtmpval)) self.data += chr(FruUtil.getTypeLength(valtmpval)) - if valtmpval is None: - pass - else: + if valtmpval is not None: self.data += valtmpval else: break @@ -293,14 +293,14 @@ def recalcute(self): self.data += chr(0xc1) if len(self.data) > (self.size - 1): - incr = (len(self.data) - self.size) / 8 + 1 + incr = (len(self.data) - self.size) // 8 + 1 self.size += incr * 8 - self.data = self.data[0:1] + chr(self.size / 8) + self.data[2:] + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] d_print("self data:%d" % len(self.data)) d_print("self size:%d" % self.size) d_print("adjust size:%d" % (self.size - len(self.data) - 1)) - self.data = self.data.ljust((self.size - 1), self.INITVALUE) + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) # checksum checksum = FruUtil.checksum(self.data) @@ -391,6 +391,7 @@ class ProductInfoArea(BaseArea): _productManufacturer = None _productAssetTag = None _FRUFileID = None + _language = None def __str__(self): formatstr = "version : %x\n" \ @@ -483,7 +484,7 @@ def decodedata(self): self.fruFileId = self.data[index + 1: index + templen + 1] index += templen + 1 d_print("decode fruFileId:%s" % self.fruFileId) - + for i in range(1, 11): valtmp = "productextra%d" % i if self.data[index] != chr(0xc1) and index < self.size - 1: @@ -567,12 +568,17 @@ def fruFileId(self): def fruFileId(self, name): self._FRUFileID = name + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + def recalcute(self): d_print("product version:%x" % ord(self.areaversion)) d_print("product length:%d" % self.size) d_print("product language:%x" % self.language) self.data = chr(ord(self.areaversion)) + \ - chr(self.size / 8) + chr(self.language) + chr(self.size // 8) + chr(self.language) typelength = FruUtil.getTypeLength(self.productManufacturer) self.data += chr(typelength) @@ -597,29 +603,26 @@ def recalcute(self): self.data += chr(FruUtil.getTypeLength(self.fruFileId)) self.data += self.fruFileId - # whether the extended field exists or not for i in range(1, 11): valtmp = "productextra%d" % i if hasattr(self, valtmp): valtmpval = getattr(self, valtmp) d_print("boardInfoArea productextra%d:%s" % (i, valtmpval)) self.data += chr(FruUtil.getTypeLength(valtmpval)) - if valtmpval is None: - pass - else: + if valtmpval is not None: self.data += valtmpval else: break self.data += chr(0xc1) if len(self.data) > (self.size - 1): - incr = (len(self.data) - self.size) / 8 + 1 + incr = (len(self.data) - self.size) // 8 + 1 self.size += incr * 8 d_print("self.data:%d" % len(self.data)) d_print("self.size:%d" % self.size) - self.data = self.data[0:1] + chr(self.size / 8) + self.data[2:] - self.data = self.data.ljust((self.size - 1), self.INITVALUE) + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) checksum = FruUtil.checksum(self.data) d_print("board info checksum:%x" % checksum) self.data += chr(checksum) @@ -635,17 +638,13 @@ def __init__(self, fieldType="ASCII", fieldData=""): self.fieldData = fieldData self.fieldType = fieldType - @property - def data(self): - return self._data - @property def fieldType(self): - return self._fieldType + return self.fieldType @property def fieldData(self): - return self._fieldData + return self.fieldData class ipmifru(BaseArea): @@ -663,6 +662,7 @@ class ipmifru(BaseArea): _bodybin = None _version = BaseArea.COMMON_HEAD_VERSION _zeroCheckSum = None + _frusize = 256 def __str__(self): tmpstr = "" @@ -677,13 +677,13 @@ def __str__(self): def decodeBin(self, eeprom): commonHead = eeprom[0:8] d_print("decode version %x" % ord(commonHead[0])) - if self.COMMON_HEAD_VERSION != commonHead[0]: + if ord(self.COMMON_HEAD_VERSION) != ord(commonHead[0]): raise FruException("HEAD VERSION error,not Fru format!", -10) if FruUtil.checksum(commonHead[0:7]) != ord(commonHead[7]): strtemp = "check header checksum error [cal:%02x data:%02x]" % ( FruUtil.checksum(commonHead[0:7]), ord(commonHead[7])) raise FruException(strtemp, -3) - if commonHead[1] != self.INITVALUE: + if ord(commonHead[1]) != ord(self.INITVALUE): d_print("Internal Use Area is present") self.internalUseArea = InternalUseArea( name="Internal Use Area", size=self.SUGGESTED_SIZE_INTERNAL_USE_AREA) @@ -691,7 +691,7 @@ def decodeBin(self, eeprom): self.internalUserAreaOffset = ord(commonHead[1]) self.internalUseArea.data = eeprom[self.internalUserAreaOffset * 8: ( self.internalUserAreaOffset * 8 + self.internalUseArea.size)] - if commonHead[2] != self.INITVALUE: + if ord(commonHead[2]) != ord(self.INITVALUE): d_print("Chassis Info Area is present") self.chassisInfoArea = ChassisInfoArea( name="Chassis Info Area", size=self.SUGGESTED_SIZE_CHASSIS_INFO_AREA) @@ -699,7 +699,7 @@ def decodeBin(self, eeprom): self.chassicInfoAreaOffset = ord(commonHead[2]) self.chassisInfoArea.data = eeprom[self.chassicInfoAreaOffset * 8: ( self.chassicInfoAreaOffset * 8 + self.chassisInfoArea.size)] - if commonHead[3] != self.INITVALUE: + if ord(commonHead[3]) != ord(self.INITVALUE): self.boardInfoArea = BoardInfoArea( name="Board Info Area", size=self.SUGGESTED_SIZE_BOARD_INFO_AREA) self.boardInfoArea.isPresent = True @@ -711,12 +711,12 @@ def decodeBin(self, eeprom): self.boardInfoArea.data = eeprom[self.boardInfoAreaOffset * 8: ( self.boardInfoAreaOffset * 8 + self.boardInfoArea.size)] if FruUtil.checksum(self.boardInfoArea.data[:-1]) != ord(self.boardInfoArea.data[-1:]): - print("check boardInfoArea checksum error[cal:%02x data:%02x]" % \ + strtmp = "check boardInfoArea checksum error[cal:%02x data:%02x]" % \ (FruUtil.checksum( - self.boardInfoArea.data[:-1]), ord(self.boardInfoArea.data[-1:]))) - sys.exit(-1) + self.boardInfoArea.data[:-1]), ord(self.boardInfoArea.data[-1:])) + raise FruException(strtmp, -3) self.boardInfoArea.decodedata() - if commonHead[4] != self.INITVALUE: + if ord(commonHead[4]) != ord(self.INITVALUE): d_print("Product Info Area is present") self.productInfoArea = ProductInfoArea( name="Product Info Area ", size=self.SUGGESTED_SIZE_PRODUCT_INFO_AREA) @@ -736,7 +736,7 @@ def decodeBin(self, eeprom): FruUtil.checksum(self.productInfoArea.data[:-1]), ord(self.productInfoArea.data[-1:])) raise FruException(strtmp, -3) self.productInfoArea.decodedata() - if commonHead[5] != self.INITVALUE: + if ord(commonHead[5]) != ord(self.INITVALUE): self.multiRecordArea = MultiRecordArea( name="MultiRecord record Area ") d_print("MultiRecord record present") @@ -752,7 +752,6 @@ def initDefault(self): self.boardInfoAreaOffset = self.INITVALUE self.productinfoAreaOffset = self.INITVALUE self.multiRecordAreaOffset = self.INITVALUE - self.PAD = self.INITVALUE self.zeroCheckSum = self.INITVALUE self.offset = self.SUGGESTED_SIZE_COMMON_HEADER self.productInfoArea = None @@ -878,30 +877,31 @@ def recalcuteCommonHead(self): self.bindata = "" self.offset = self.SUGGESTED_SIZE_COMMON_HEADER d_print("common Header %d" % self.offset) + d_print("fru eeprom size %d" % self._frusize) if self.internalUseArea is not None and self.internalUseArea.isPresent: - self.internalUserAreaOffset = self.offset / 8 + self.internalUserAreaOffset = self.offset // 8 self.offset += self.internalUseArea.size d_print("internalUseArea is present offset:%d" % self.offset) if self.chassisInfoArea is not None and self.chassisInfoArea.isPresent: - self.chassicInfoAreaOffset = self.offset / 8 + self.chassicInfoAreaOffset = self.offset // 8 self.offset += self.chassisInfoArea.size d_print("chassisInfoArea is present offset:%d" % self.offset) if self.boardInfoArea is not None and self.boardInfoArea.isPresent: - self.boardInfoAreaOffset = self.offset / 8 + self.boardInfoAreaOffset = self.offset // 8 self.offset += self.boardInfoArea.size d_print("boardInfoArea is present offset:%d" % self.offset) d_print("boardInfoArea is present size:%d" % self.boardInfoArea.size) if self.productInfoArea is not None and self.productInfoArea.isPresent: - self.productinfoAreaOffset = self.offset / 8 + self.productinfoAreaOffset = self.offset // 8 self.offset += self.productInfoArea.size d_print("productInfoArea is present offset:%d" % self.offset) if self.multiRecordArea is not None and self.multiRecordArea.isPresent: - self.multiRecordAreaOffset = self.offset / 8 + self.multiRecordAreaOffset = self.offset // 8 d_print("multiRecordArea is present offset:%d" % self.offset) if self.internalUserAreaOffset == self.INITVALUE: @@ -918,16 +918,17 @@ def recalcuteCommonHead(self): self.zeroCheckSum = (0x100 - ord(self.version) - self.internalUserAreaOffset - self.chassicInfoAreaOffset - self.productinfoAreaOffset - self.boardInfoAreaOffset - self.multiRecordAreaOffset) & 0xff d_print("zerochecksum:%x" % self.zeroCheckSum) - self.data = self.version + chr(self.internalUserAreaOffset) + chr(self.chassicInfoAreaOffset) + chr( - self.boardInfoAreaOffset) + chr(self.productinfoAreaOffset) + chr(self.multiRecordAreaOffset) + self.INITVALUE + chr(self.zeroCheckSum) + self.data = "" + self.data += chr(self.version[0]) + chr(self.internalUserAreaOffset) + chr(self.chassicInfoAreaOffset) + chr( + self.boardInfoAreaOffset) + chr(self.productinfoAreaOffset) + chr(self.multiRecordAreaOffset) + chr(self.INITVALUE[0]) + chr(self.zeroCheckSum) self.bindata = self.data + self.bodybin totallen = len(self.bindata) d_print("totallen %d" % totallen) - if (totallen < 256): - self.bindata = self.bindata.ljust(256, self.INITVALUE) + if totallen < self._frusize: + self.bindata = self.bindata.ljust(self._frusize, chr(self.INITVALUE[0])) else: - raise FruException('bin data more than 256', -2) + raise FruException('bin data more than %d' % self._frusize, -2) def recalcutebin(self): self.bodybin = "" @@ -949,6 +950,12 @@ def recalcutebin(self): d_print("multiRecordArea present") self.bodybin += self.productInfoArea.data - def recalcute(self): + def recalcute(self, fru_eeprom_size=256): + self._frusize = fru_eeprom_size self.recalcutebin() self.recalcuteCommonHead() + + def setValue(self, area, field, value): + tmp_area = getattr(self, area, None) + if tmp_area is not None: + tmp_area.fruSetValue(field, value) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py new file mode 100644 index 000000000000..a90f8f8453c8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py @@ -0,0 +1,441 @@ +#!/usr/bin/python3 +import binascii + + +class OnietlvException(Exception): + def __init__(self, message='onietlverror', code=-100): + err = 'errcode: {0} message:{1}'.format(code, message) + Exception.__init__(self, err) + self.code = code + self.message = message + + +class onie_tlv(object): + TLV_INFO_ID_STRING = "TlvInfo\x00" + TLV_INFO_INIA_ID = "\x00\x00\x13\x11" + TLV_INFO_VERSION = 0x01 + TLV_INFO_LENGTH = 0x00 + TLV_INFO_LENGTH_VALUE = 0xba + + TLV_CODE_PRODUCT_NAME = 0x21 + TLV_CODE_PART_NUMBER = 0x22 + TLV_CODE_SERIAL_NUMBER = 0x23 + TLV_CODE_MAC_BASE = 0x24 + TLV_CODE_MANUF_DATE = 0x25 + TLV_CODE_DEVICE_VERSION = 0x26 + TLV_CODE_LABEL_REVISION = 0x27 + TLV_CODE_PLATFORM_NAME = 0x28 + TLV_CODE_ONIE_VERSION = 0x29 + TLV_CODE_MAC_SIZE = 0x2A + TLV_CODE_MANUF_NAME = 0x2B + TLV_CODE_MANUF_COUNTRY = 0x2C + TLV_CODE_VENDOR_NAME = 0x2D + TLV_CODE_DIAG_VERSION = 0x2E + TLV_CODE_SERVICE_TAG = 0x2F + TLV_CODE_VENDOR_EXT = 0xFD + TLV_CODE_CRC_32 = 0xFE + _TLV_DISPLAY_VENDOR_EXT = 1 + TLV_CODE_WB_CARID = 0x01 + _TLV_INFO_HDR_LEN = 11 + TLV_CODE_PRODUCT_ID = 0x40 + TLV_CODE_HW_VERSION = 0x41 + TLV_CODE_MAIN_FILENAME = 0x42 + TLV_CODE_DTS_FINENAME = 0x43 + TLV_CODE_SY_SERIAL0 = 0x44 + TLV_CODE_SY_SERIAL1 = 0x45 + TLV_CODE_SY_SERIAL2 = 0x46 + TLV_CODE_SY_SERIAL3 = 0x47 + TLV_CODE_PROJECT_ID = 0x48 + TLV_CODE_SETMAC_VERSION = 0x49 + TLV_CODE_EEPROM_TYPE = 0x4A + + @property + def dstatus(self): + return self._dstatus + + @property + def cardid(self): + return self._cardid + + @property + def productname(self): + return self._productname + + @property + def partnum(self): + return self._partnum + + @property + def serialnum(self): + return self._serialnum + + @property + def macbase(self): + return self._macbase + + @property + def manufdate(self): + return self._manufdate + + @property + def deviceversion(self): + return self._deviceversion + + @property + def labelrevision(self): + return self._labelrevision + + @property + def platformname(self): + return self._platformname + + @property + def onieversion(self): + return self._onieversion + + @property + def macsize(self): + return self._macsize + + @property + def manufname(self): + return self._manufname + + @property + def manufcountry(self): + return self._manufcountry + + @property + def vendorname(self): + return self._vendorname + + @property + def diagname(self): + return self._diagname + + @property + def servicetag(self): + return self._servicetag + + @property + def vendorext(self): + return self._vendorext + + def __init__(self): + self._cardid = "" + self._productname = "" + self._partnum = "" + self._serialnum = "" + self._macbase = "" + self._manufdate = "" + self._deviceversion = "" + self._labelrevision = "" + self._platformname = "" + self._onieversion = "" + self._macsize = "" + self._manufname = "" + self._manufcountry = "" + self._vendorname = "" + self._diagname = "" + self._servicetag = "" + self._vendorext = "" + self._productid = "" + self._hwversion = "" + self._mainfilename = "" + self._dtsfilename = "" + self._syserial0 = "" + self._syserial1 = "" + self._syserial2 = "" + self._syserial3 = "" + self._projectid = "" + self._setmacversion = "" + self._eepromtype = "" + self._crc32 = "" + self._dstatus = 0 + + def oniecrc32(self, v): + data_array = bytearray() + for x in v: + data_array.append(ord(x)) + return '0x%08x' % (binascii.crc32(bytes(data_array)) & 0xffffffff) + + def getTLV_BODY(self, tlv_type, value): + x = [] + temp_t = "" + if tlv_type == self.TLV_CODE_MAC_BASE: + arr = value.split(':') + for tt in arr: + temp_t += chr(int(tt, 16)) + elif tlv_type == self.TLV_CODE_DEVICE_VERSION: + temp_t = chr(value) + elif tlv_type == self.TLV_CODE_MAC_SIZE: + temp_t = chr(value >> 8) + chr(value & 0x00ff) + else: + temp_t = value + x.append(chr(tlv_type)) + x.append(chr(len(temp_t))) + for i in temp_t: + x.append(i) + return x + + def generate_ext(self, cardid): + s = "%08x" % cardid + ret = "" + for t in range(0, 4): + ret += chr(int(s[2 * t:2 * t + 2], 16)) + ret = chr(0x01) + chr(len(ret)) + ret + return ret + + def generate_value(self, _t): + ret = [] + for i in self.TLV_INFO_ID_STRING: + ret.append(i) + ret.append(chr(self.TLV_INFO_VERSION)) + ret.append(chr(self.TLV_INFO_LENGTH)) + ret.append(chr(self.TLV_INFO_LENGTH_VALUE)) + + total_len = 0 + for key in _t: + x = self.getTLV_BODY(key, _t[key]) + ret += x + total_len += len(x) + ret[10] = chr(total_len + 6) + + ret.append(chr(0xFE)) + ret.append(chr(0x04)) + s = self.oniecrc32(''.join(ret)) + for t in range(0, 4): + ret.append(chr(int(s[2 * t + 2:2 * t + 4], 16))) + totallen = len(ret) + if totallen < 256: + for left_t in range(0, 256 - totallen): + ret.append(chr(0x00)) + return (ret, True) + + def decode_tlv(self, e): + tlv_index = 0 + tlv_end = len(e) + ret = [] + while tlv_index < tlv_end and (tlv_index + 2 + ord(e[tlv_index + 1])) <= len(e): + rt = self.decoder(e[tlv_index:tlv_index + 2 + ord(e[tlv_index + 1])]) + ret.append(rt) + if ord(e[tlv_index]) == self.TLV_CODE_CRC_32: + break + tlv_index += ord(e[tlv_index + 1]) + 2 + return ret + + def decode(self, e): + if e[0:8] != self.TLV_INFO_ID_STRING: + raise OnietlvException("ONIE tlv head info error,not onie tlv type", -1) + total_len = (ord(e[9]) << 8) | ord(e[10]) + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_len + if tlv_end > len(e): + raise OnietlvException("ONIE tlv length error", -2) + ret = [] + ret = self.decode_tlv(e[tlv_index:tlv_end]) + for item in ret: + if item['code'] == self.TLV_CODE_VENDOR_EXT: + if item["value"][0:4] == self.TLV_INFO_INIA_ID: + rt = self.decode_tlv(item["value"][4:]) + else: + rt = self.decode_tlv(item["value"][0:]) + ret.extend(rt) + return ret + + def decoder(self, t): + if ord(t[0]) == self.TLV_CODE_PRODUCT_NAME: + name = "Product Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._productname = value + elif ord(t[0]) == self.TLV_CODE_PART_NUMBER: + name = "Part Number" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._partnum = value + elif ord(t[0]) == self.TLV_CODE_SERIAL_NUMBER: + name = "Serial Number" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._serialnum = value + elif ord(t[0]) == self.TLV_CODE_MAC_BASE: + name = "Base MAC Address" + _len = ord(t[1]) + value = ":".join(['%02X' % ord(T) for T in t[2:8]]).upper() + self._macbase = value + elif ord(t[0]) == self.TLV_CODE_MANUF_DATE: + name = "Manufacture Date" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._manufdate = value + elif ord(t[0]) == self.TLV_CODE_DEVICE_VERSION: + name = "Device Version" + _len = ord(t[1]) + value = ord(t[2]) + self._deviceversion = value + elif ord(t[0]) == self.TLV_CODE_LABEL_REVISION: + name = "Label Revision" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._labelrevision = value + elif ord(t[0]) == self.TLV_CODE_PLATFORM_NAME: + name = "Platform Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._platformname = value + elif ord(t[0]) == self.TLV_CODE_ONIE_VERSION: + name = "ONIE Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._onieversion = value + elif ord(t[0]) == self.TLV_CODE_MAC_SIZE: + name = "MAC Addresses" + _len = ord(t[1]) + value = str((ord(t[2]) << 8) | ord(t[3])) + self._macsize = value + elif ord(t[0]) == self.TLV_CODE_MANUF_NAME: + name = "Manufacturer" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._manufname = value + elif ord(t[0]) == self.TLV_CODE_MANUF_COUNTRY: + name = "Manufacture Country" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._manufcountry = value + elif ord(t[0]) == self.TLV_CODE_VENDOR_NAME: + name = "Vendor Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._vendorname = value + elif ord(t[0]) == self.TLV_CODE_DIAG_VERSION: + name = "Diag Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._diagname = value + elif ord(t[0]) == self.TLV_CODE_SERVICE_TAG: + name = "Service Tag" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._servicetag = value + elif ord(t[0]) == self.TLV_CODE_VENDOR_EXT: + name = "Vendor Extension" + _len = ord(t[1]) + value = "" + if self._TLV_DISPLAY_VENDOR_EXT: + value = t[2:2 + ord(t[1])] + self._vendorext = value + elif ord(t[0]) == self.TLV_CODE_CRC_32 and len(t) == 6: + name = "CRC-32" + _len = ord(t[1]) + value = "0x%08X" % (((ord(t[2]) << 24) | ( + ord(t[3]) << 16) | (ord(t[4]) << 8) | ord(t[5])),) + self._crc32 = value + elif ord(t[0]) == self.TLV_CODE_WB_CARID: + name = "Card id" + _len = ord(t[1]) + value = "" + for c in t[2:2 + ord(t[1])]: + value += "%02X" % (ord(c),) + self._cardid = value + elif ord(t[0]) == self.TLV_CODE_PRODUCT_ID: + name = "Product id" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._productid = value + elif ord(t[0]) == self.TLV_CODE_HW_VERSION: + name = "Hardware Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._hwversion = value + elif ord(t[0]) == self.TLV_CODE_MAIN_FILENAME: + name = "Main File Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._mainfilename = value + elif ord(t[0]) == self.TLV_CODE_DTS_FINENAME: + name = "DTS File Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._dtsfilename = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL0: + name = "SY Serial 0" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial0 = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL1: + name = "SY Serial 1" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial1 = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL2: + name = "SY Serial 2" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial2 = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL3: + name = "SY Serial 3" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial3 = value + elif ord(t[0]) == self.TLV_CODE_PROJECT_ID: + name = "Project id" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._projectid = value + elif ord(t[0]) == self.TLV_CODE_SETMAC_VERSION: + name = "Setmac Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._setmacversion = value + elif ord(t[0]) == self.TLV_CODE_EEPROM_TYPE: + name = "EEPROM Type" + _len = ord(t[1]) + value = "" + for c in t[2:2 + ord(t[1])]: + value += "%02X" % (ord(c),) + self._eepromtype = value + else: + name = "Unknown" + _len = ord(t[1]) + value = "" + for c in t[2:2 + ord(t[1])]: + value += "0x%02X " % (ord(c),) + return {"name": name, "code": ord(t[0]), "value": value, "lens": _len} + + def __str__(self): + formatstr = "Card id : %s \n" \ + "Product Name : %s \n" \ + "Part Number : %s \n" \ + "Serial Number : %s \n" \ + "Base MAC Address : %s \n" \ + "Manufacture Date : %s \n" \ + "Device Version : %s \n" \ + "Label Revision : %s \n" \ + "Platform Name : %s \n" \ + "ONIE Version : %s \n" \ + "MAC Addresses : %s \n" \ + "Manufacturer : %s \n" \ + "Manufacture Country : %s \n" \ + "Vendor Name : %s \n" \ + "Diag Version : %s \n" \ + "Service Tag : %s \n" \ + "CRC-32 : %s \n" + return formatstr % (self._cardid, + self._productname, + self._partnum, + self._serialnum, + self._macbase, + self._manufdate, + self._deviceversion, + self._labelrevision, + self._platformname, + self._onieversion, + self._macsize, + self._manufname, + self._manufcountry, + self._vendorname, + self._diagname, + self._servicetag, + self._crc32) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_env.conf b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/__init__.py similarity index 100% rename from device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_env.conf rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/__init__.py diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py new file mode 100644 index 000000000000..ffe271a424c9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 +####################################################### +# +# baseutil.py +# Python implementation of the Class baseutil +# +####################################################### +import importlib.machinery +import os +import syslog +import json +from plat_hal.osutil import osutil + +SYSLOG_IDENTIFIER = "HAL" + +CONFIG_DB_PATH = "/etc/sonic/config_db.json" +BOARD_ID_PATH = "/sys/module/platform_common/parameters/dfd_my_type" +BOARD_AIRFLOW_PATH = "/etc/sonic/.airflow" + + +def getonieplatform(path): + if not os.path.isfile(path): + return "" + machine_vars = {} + with open(path) as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars.get("onie_platform") + + +def getboardid(): + if not os.path.exists(BOARD_ID_PATH): + return "NA" + with open(BOARD_ID_PATH) as fd: + id_str = fd.read().strip() + return "0x%x" % (int(id_str, 10)) + + +def getboardairflow(): + if not os.path.exists(BOARD_AIRFLOW_PATH): + return "NA" + with open(BOARD_AIRFLOW_PATH) as fd: + airflow_str = fd.read().strip() + data = json.loads(airflow_str) + airflow = data.get("board", "NA") + return airflow + + +def getplatform_config_db(): + if not os.path.isfile(CONFIG_DB_PATH): + return "" + val = os.popen("sonic-cfggen -j %s -v DEVICE_METADATA.localhost.platform" % CONFIG_DB_PATH).read().strip() + if len(val) <= 0: + return "" + return val + + +def getplatform_name(): + if os.path.isfile('/host/machine.conf'): + return getonieplatform('/host/machine.conf') + if os.path.isfile('/usr/share/sonic/hwsku/machine.conf'): + return getonieplatform('/usr/share/sonic/hwsku/machine.conf') + return getplatform_config_db() + + +platform = (getplatform_name()).replace("-", "_") +boardid = getboardid() +boardairflow = getboardairflow() + + +CONFIG_FILE_PATH_LIST = [ + "/usr/local/bin/", + "/usr/lib/python3/dist-packages/", + "/usr/local/lib/python3.7/dist-packages/hal-config/", + "/usr/local/lib/python3.9/dist-packages/hal-config/" +] + + +DEVICE_CONFIG_FILE_LIST = [ + platform + "_" + boardid + "_" + boardairflow + "_device.py", + platform + "_" + boardid + "_device.py", + platform + "_" + boardairflow + "_device.py", + platform + "_device.py" +] + + +MONITOR_CONFIG_FILE_LIST = [ + platform + "_" + boardid + "_" + boardairflow + "_monitor.py", + platform + "_" + boardid + "_monitor.py", + platform + "_" + boardairflow + "_monitor.py", + platform + "_monitor.py" +] + + +class baseutil: + + CONFIG_NAME = 'devices' + MONITOR_CONFIG_NAME = 'monitor' + UBOOT_ENV_URL = '/etc/device/uboot_env' + + @staticmethod + def get_config(): + real_path = None + for configfile_path in CONFIG_FILE_PATH_LIST: + for config_file in DEVICE_CONFIG_FILE_LIST: + file = configfile_path + config_file + if os.path.exists(file): + real_path = file + break + if real_path is not None: + break + + if real_path is None: + raise Exception("get hal device config error") + devices = importlib.machinery.SourceFileLoader(baseutil.CONFIG_NAME, real_path).load_module() + return devices.devices + + @staticmethod + def get_monitor_config(): + real_path = None + for configfile_path in CONFIG_FILE_PATH_LIST: + for config_file in MONITOR_CONFIG_FILE_LIST: + file = configfile_path + config_file + if os.path.exists(file): + real_path = file + break + if real_path is not None: + break + + if real_path is None: + raise Exception("get hal monitor config error") + monitor = importlib.machinery.SourceFileLoader(baseutil.MONITOR_CONFIG_NAME, real_path).load_module() + return monitor.monitor + + @staticmethod + def get_productname(): + ret, val = osutil.command("cat %s |grep productname | awk -F\"=\" '{print $2;}'" % baseutil.UBOOT_ENV_URL) + tmp = val.lower().replace('-', '_') + if ret != 0 or len(val) <= 0: + raise Exception("get productname error") + return tmp + + @staticmethod + def get_platform(): + ret, val = osutil.command("cat %s |grep conffitname | awk -F\"=\" '{print $2;}'" % baseutil.UBOOT_ENV_URL) + if ret != 0 or len(val) <= 0: + raise Exception("get platform error") + return val + + @staticmethod + def get_product_fullname(): + ret, val = osutil.command("cat %s |grep productname | awk -F\"=\" '{print $2;}'" % baseutil.UBOOT_ENV_URL) + if ret != 0 or len(val) <= 0: + raise Exception("get productname error") + return val + + @staticmethod + def logger_debug(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_DEBUG, msg) + syslog.closelog() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py new file mode 100644 index 000000000000..767d6da34ba9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python3 +####################################################### +# +# chassisbase.py +# Python implementation of the Class chassisbase +# +####################################################### +from plat_hal.dcdc import dcdc +from plat_hal.onie_e2 import onie_e2 +from plat_hal.psu import psu +from plat_hal.led import led +from plat_hal.temp import temp +from plat_hal.fan import fan +from plat_hal.cpld import cpld +from plat_hal.component import component +from plat_hal.cpu import cpu +from plat_hal.baseutil import baseutil + + +class chassisbase(object): + __onie_e2_list = [] + __psu_list = [] + __led_list = [] + __temp_list = [] + __fan_list = [] + __card_list = [] + __sensor_list = [] + __dcdc_list = [] + __cpld_list = [] + __comp_list = [] + __bios_list = [] + __bmc_list = [] + __cpu = None + + def __init__(self, conftype=0, conf=None): + # type: (object, object, object) -> object + """ + init chassisbase as order + + type = 0 use default conf, maybe auto find by platform + type = 1 use given conf, conf is not None + + BITMAP + bit 16 + bit 0 PSU + bit 1 LED + bit 2 TEMP + bit 3 fan + bit 4 card + bit 5 sensor + """ + __confTemp = None + + if conftype == 0: + # user + __confTemp = baseutil.get_config() + elif conftype == 1: + __confTemp = conf + + # onie_e2 + onie_e2temp = [] + onie_e2config = __confTemp.get('onie_e2', []) + for item in onie_e2config: + onie_e2_1 = onie_e2(item) + onie_e2temp.append(onie_e2_1) + self.onie_e2_list = onie_e2temp + + # psu + psutemp = [] + psuconfig = __confTemp.get('psus', []) + for item in psuconfig: + psu1 = psu(item) + psutemp.append(psu1) + self.psu_list = psutemp + + # led + ledtemp = [] + ledconfig = __confTemp.get('leds', []) + for item in ledconfig: + led1 = led(item) + ledtemp.append(led1) + self.led_list = ledtemp + + # temp + temptemp = [] + tempconfig = __confTemp.get('temps', []) + for item in tempconfig: + temp1 = temp(item) + temptemp.append(temp1) + self.temp_list = temptemp + + # fan + fantemp = [] + fanconfig = __confTemp.get('fans', []) + for item in fanconfig: + fan1 = fan(item) + fantemp.append(fan1) + self.fan_list = fantemp + + # dcdc + dcdctemp = [] + dcdcconfig = __confTemp.get('dcdc', []) + for item in dcdcconfig: + dcdc1 = dcdc(item) + dcdctemp.append(dcdc1) + self.dcdc_list = dcdctemp + + # cpld + cpldtemp = [] + cpldconfig = __confTemp.get('cplds', []) + for item in cpldconfig: + cpld1 = cpld(item) + cpldtemp.append(cpld1) + self.cpld_list = cpldtemp + + # compoment: cpld/fpga/bios + comptemp = [] + compconfig = __confTemp.get('comp_cpld', []) + for item in compconfig: + comp1 = component(item) + comptemp.append(comp1) + self.comp_list = comptemp + + compconfig = __confTemp.get('comp_fpga', []) + for item in compconfig: + comp1 = component(item) + self.comp_list.append(comp1) + + compconfig = __confTemp.get('comp_bios', []) + for item in compconfig: + comp1 = component(item) + self.comp_list.append(comp1) + + # cpu + cpuconfig = __confTemp.get('cpu', []) + if len(cpuconfig): + self.cpu = cpu(cpuconfig[0]) + + # dcdc + @property + def dcdc_list(self): + return self.__dcdc_list + + @dcdc_list.setter + def dcdc_list(self, val): + self.__dcdc_list = val + + # sensor + @property + def sensor_list(self): + return self.__sensor_list + + @sensor_list.setter + def sensor_list(self, val): + self.__sensor_list = val + + def get_sensor_byname(self, name): + tmp = self.sensor_list + for item in tmp: + if name == item.name: + return item + return None + + # onie_e2 + @property + def onie_e2_list(self): + return self.__onie_e2_list + + @onie_e2_list.setter + def onie_e2_list(self, val): + self.__onie_e2_list = val + + def get_onie_e2_byname(self, name): + tmp = self.onie_e2_list + for item in tmp: + if name == item.name: + return item + return None + + # psu + @property + def psu_list(self): + return self.__psu_list + + @psu_list.setter + def psu_list(self, val): + self.__psu_list = val + + def get_psu_byname(self, name): + tmp = self.psu_list + for item in tmp: + if name == item.name: + return item + return None + + # fan + @property + def fan_list(self): + return self.__fan_list + + @fan_list.setter + def fan_list(self, val): + self.__fan_list = val + + def get_fan_byname(self, name): + tmp = self.fan_list + for item in tmp: + if name == item.name: + return item + return None + + # led + + @property + def led_list(self): + return self.__led_list + + @led_list.setter + def led_list(self, val): + self.__led_list = val + + def get_led_byname(self, name): + tmp = self.led_list + for item in tmp: + if name == item.name: + return item + return None + + # temp + @property + def temp_list(self): + return self.__temp_list + + @temp_list.setter + def temp_list(self, val): + self.__temp_list = val + + def get_temp_byname(self, name): + tmp = self.temp_list + for item in tmp: + if name == item.name: + return item + return None + + # cpld + @property + def cpld_list(self): + return self.__cpld_list + + @cpld_list.setter + def cpld_list(self, val): + self.__cpld_list = val + + def get_cpld_byname(self, name): + tmp = self.cpld_list + for item in tmp: + if name == item.name: + return item + return None + + @property + def comp_list(self): + return self.__comp_list + + @comp_list.setter + def comp_list(self, val): + self.__comp_list = val + + def get_comp_byname(self, name): + tmp = self.comp_list + for item in tmp: + if name == item.name: + return item + return None + + # bios + @property + def bios_list(self): + return self.__bios_list + + @bios_list.setter + def bios_list(self, val): + self.__bios_list = val + + def get_bios_byname(self, name): + tmp = self.bios_list + for item in tmp: + if name == item.name: + return item + return None + + # bmc + @property + def bmc_list(self): + return self.__bmc_list + + @bmc_list.setter + def bmc_list(self, val): + self.__bmc_list = val + + def get_bmc_byname(self, name): + tmp = self.bmc_list + for item in tmp: + if name == item.name: + return item + return None + + # cpu + @property + def cpu(self): + return self.__cpu + + @cpu.setter + def cpu(self, val): + self.__cpu = val + + def get_cpu_byname(self, name): + return self.cpu diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py new file mode 100644 index 000000000000..0f2ad2167485 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +####################################################### +# +# component.py +# Python implementation of the Class fan +# +####################################################### +from plat_hal.devicebase import devicebase +from plat_hal.osutil import osutil + + +class component(devicebase): + __user_reg = None + + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.version_file = conf.get('VersionFile', None) + self.comp_id = conf.get("comp_id", None) + self.desc = conf.get("desc", None) + self.slot = conf.get("slot", None) + + def get_version(self): + version = "NA" + try: + ret, version = self.get_value(self.version_file) + if ret is False: + return version + pattern = self.version_file.get('pattern', None) + version = osutil.std_match(version, pattern) + except Exception: + return version + return version diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py new file mode 100644 index 000000000000..09eed5f975ee --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +####################################################### +# +# fan.py +# Python implementation of the Class fan +# +####################################################### +from plat_hal.devicebase import devicebase + + +class cpld(devicebase): + __user_reg = None + + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.user_reg = conf.get('UserReg', None) + self.console_reg = conf.get('ConsoleReg', None) + self.console_reg_attrs = conf.get('ConsoleRegAttrs', None) + self.version_file = conf.get('VersionFile', None) + self.cpld_id = conf.get("cpld_id", None) + self.desc = conf.get("desc", None) + self.slot = conf.get("slot", None) + self.format = conf.get("format", "big_endian") + self.warm = conf.get("warm", None) + self.type = conf.get("type", None) + + def get_user_reg(self): + if self.user_reg is None: + return False + ret, val = self.get_value(self.user_reg) + return val + + def set_user_reg(self, value): + if self.user_reg is None: + return False + byte = value & 0xFF + ret, val = self.set_value(self.user_reg, byte) + return ret + + def set_console_owner(self, owner): + ret = False + + if self.console_reg is None: + return False + tmpattr = self.console_reg_attrs.get(owner, None) + if tmpattr is not None: + ret, val = self.set_value(self.console_reg, tmpattr) + return ret + + def get_version(self): + ret, val = self.get_value(self.version_file) + if ret is False: + val = "N/A" + return val + if self.type == "str": + return val.strip('\n') + val = val.strip('\n').split(" ") + if len(val) < 4: + val = "N/A" + return val + if self.format == "little_endian": + cpld_version = "%s%s%s%s" % (val[3], val[2], val[1], val[0]) + else: + cpld_version = "%s%s%s%s" % (val[0], val[1], val[2], val[3]) + return cpld_version diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py new file mode 100644 index 000000000000..c6bec1abd1c2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +############################################################################### +# +# Hardware Abstraction Layer APIs -- CPU APIs. +# +############################################################################### +from plat_hal.devicebase import devicebase + + +class cpu(devicebase): + + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.cpu_reset_cnt_reg = conf.get('CpuResetCntReg', None) + self.reboot_cause_path = conf.get('reboot_cause_path', "/etc/sonic/.reboot/.previous-reboot-cause.txt") + + def get_cpu_reset_num(self): + """ + get cpu reset num. + @return cpu reset number, -1 for failure + """ + ret = -1 + if self.cpu_reset_cnt_reg is None: + self.logger_debug("ERR: no support get cpu reset num") + return ret + ret, reset_num = self.get_value(self.cpu_reset_cnt_reg) + if ret is False or reset_num is None: + self.logger_debug("ERR: i2c read cpu_reset_cnt_reg,result:%s" % reset_num) + else: + if isinstance(reset_num, str): + ret = int(reset_num, 16) + else: + ret = reset_num + return ret + + def get_cpu_reboot_cause(self): + """ + get_cpu_reboot_cause + @return cpu reset number, -1 for failure + """ + try: + with open(self.reboot_cause_path) as fd: + reboot_cause = fd.read().strip() + return reboot_cause + except Exception: + return "Unknown reboot cause" + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py new file mode 100644 index 000000000000..ba604995043d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +from plat_hal.devicebase import devicebase +from plat_hal.sensor import sensor + + +class dcdc(devicebase): + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.dcdc_id = conf.get("dcdc_id", None) + self.sensor = sensor(conf) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py new file mode 100644 index 000000000000..e66ae0143f02 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py @@ -0,0 +1,355 @@ +#!/usr/bin/env python3 +####################################################### +# +# devicebase.py +# Python implementation of the Class devicebase +# +####################################################### +import subprocess +import shlex +import ast +from plat_hal.osutil import osutil +from plat_hal.baseutil import baseutil + +class CodeVisitor(ast.NodeVisitor): + + def __init__(self): + self.value = None + + def get_value(self): + return self.value + + def get_op_value(self, node): + if isinstance(node, ast.Call): # node is func call + value = self.visit_Call(node) + elif isinstance(node, ast.BinOp): # node is BinOp + value = self.visit_BinOp(node) + elif isinstance(node, ast.UnaryOp): # node is UnaryOp + value = self.visit_UnaryOp(node) + elif isinstance(node, ast.Num): # node is Num Constant + value = node.n + elif isinstance(node, ast.Str): # node is Str Constant + value = node.s + else: + raise NotImplementedError("Unsupport operand type: %s" % type(node)) + return value + + def visit_UnaryOp(self, node): + ''' + node.op: operand type, only support ast.UAdd/ast.USub + node.operand: only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.UnaryOp + ''' + + operand_value = self.get_op_value(node.operand) + if isinstance(node.op, ast.UAdd): + self.value = operand_value + elif isinstance(node.op, ast.USub): + self.value = 0 - operand_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_BinOp(self, node): + ''' + node.left: left operand, only support ast.Call/ast.Constant(ast.Num)/ast.BinOp + node.op: operand type, only support ast.Add/ast.Sub/ast.Mult/ast.Div + node.right: right operan, only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + left_value = self.get_op_value(node.left) + right_value = self.get_op_value(node.right) + + if isinstance(node.op, ast.Add): + self.value = left_value + right_value + elif isinstance(node.op, ast.Sub): + self.value = left_value - right_value + elif isinstance(node.op, ast.Mult): + self.value = left_value * right_value + elif isinstance(node.op, ast.Div): + self.value = left_value / right_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_Call(self, node): + ''' + node.func.id: func name, only support 'float', 'int', 'str' + node.args: func args list,only support ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.Call + str/float only support one parameter, eg: float(XXX), str(xxx) + int support one or two parameters, eg: int(xxx) or int(xxx, 16) + xxx can be ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + calc_tuple = ("float", "int", "str") + + if node.func.id not in calc_tuple: + raise NotImplementedError("Unsupport function call type: %s" % node.func.id) + + args_val_list = [] + for item in node.args: + ret = self.get_op_value(item) + args_val_list.append(ret) + + if node.func.id == "str": + if len(args_val_list) != 1: + raise TypeError("str() takes 1 positional argument but %s were given" % len(args_val_list)) + value = str(args_val_list[0]) + self.value = value + return value + + if node.func.id == "float": + if len(args_val_list) != 1: + raise TypeError("float() takes 1 positional argument but %s were given" % len(args_val_list)) + value = float(args_val_list[0]) + self.value = value + return value + # int + if len(args_val_list) == 1: + value = int(args_val_list[0]) + self.value = value + return value + if len(args_val_list) == 2: + value = int(args_val_list[0], args_val_list[1]) + self.value = value + return value + raise TypeError("int() takes 1 or 2 arguments (%s given)" % len(args_val_list)) + + +class devicebase(object): + _name = None + __error_ret = -99999 + + @property + def name(self): + return self._name + + @name.setter + def name(self, val): + self._name = val + + def dumpValueByI2c(self, bus, loc): + value = "" + for i in range(256): + ret, val = self.get_i2c(bus, loc, i) + value += chr(val) + return value + + def byteTostr(self, val): + strtmp = '' + for value in val: + strtmp += chr(value) + return strtmp + + def get_eeprom_info(self, conf): + eeprom = "" + if conf.get('way') == 'sysfs': + ret, eeprom = self.get_value(conf) + if ret is False: + return None + elif conf.get('way') == 'devfile': + ret, eeprom_list = self.get_value(conf) + if ret is False: + return None + for item in eeprom_list: + eeprom += chr(item) + else: + eeprom = self.dumpValueByI2c(conf.get('bus'), conf.get('addr')) + return eeprom + + def exec_os_cmd(self, cmd): + cmds = cmd.split('|') + procs = [] + for i, c in enumerate(cmds): + stdin = None if i == 0 else procs[i-1].stdout + p = subprocess.Popen(shlex.split(c), stdin=stdin, stdout=subprocess.PIPE, shell=False, stderr=subprocess.STDOUT) + procs.append(p) + for proc in procs: + proc.wait() + return procs[-1].returncode, self.byteTostr(procs[-1].communicate()[0]) + + def get_value(self, config): + ''' + get value by config way + way i2c/sysfs/lpc + ''' + way = config.get("way") + if way == 'sysfs': + return self.get_sysfs(config.get("loc"), config.get("flock_path")) + if way == "i2c": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.get_i2c(bus, addr, offset) + if way == "io": + io_addr = config.get('io_addr') + read_len = config.get('read_len', 1) + return self.get_io(io_addr, read_len) + if way == "i2cword": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.get_i2cword(bus, addr, offset) + if way == "devmem": + addr = config.get("addr") + digit = config.get("digit") + mask = config.get("mask", None) + return self.get_devmem(addr, digit, mask) + if way == "sdk": + get_type = config.get("type") + if get_type == "bcm_temp": + return self.getbcmtemp() + if get_type == "bcm_reg": + reg = config.get("reg") + return self.getbcmreg(reg) + raise Exception("cannot found sdk type deal") + if way == "devfile": + loc = config.get("loc") + offset = config.get("offset") + length = config.get("len") + ret, val_list = self.devfile_read(loc, offset, length) + if ret is True: + if length == 1: + val = val_list[0] + return True, val + return True, val_list + return False, ("devfile read failed. path:%s, offset:0x%x, read_len:%d" % (loc, offset, length)) + if way == "devfile_ascii": + loc = config.get("loc") + offset = config.get("offset") + length = config.get("len") + return self.devfile_read_ascii(loc, offset, length) + if way == 'cmd': + cmd = config.get("cmd") + ret, log = self.exec_os_cmd(cmd) + if ret: + return False, ("cmd write exec %s failed, log: %s" % (cmd, log)) + return True, log + raise Exception("cannot found way deal") + + def devfile_read(self, loc, offset, length): + return osutil.readdevfile(loc, offset, length) + + def devfile_read_ascii(self, loc, offset, length): + return osutil.readdevfile_ascii(loc, offset, length) + + def get_sysfs(self, loc, flock_path=None): + return self.getsysfs(loc, flock_path) + + def getsysfs(self, loc, flock_path=None): + ret, val = osutil.readsysfs(loc, flock_path) + return ret, val + + def get_devmem(self, addr, digit, mask): + return osutil.getdevmem(addr, digit, mask) + + def get_i2cword(self, bus, addr, offset): + return self.geti2cword(bus, addr, offset) + + def geti2cword(self, bus, addr, offset): + ret, val = osutil.geti2cword(bus, addr, offset) + return ret, val + + def get_io(self, reg_addr, read_len): + return self.getio(reg_addr, read_len) + + def getio(self, reg_addr, read_len): + ret, val = osutil.io_rd(reg_addr, read_len) + return ret, val + + def get_i2c(self, bus, addr, offset): + return self.geti2c(bus, addr, offset) + + def geti2c(self, bus, addr, offset): + ret, val = osutil.wbi2cget(bus, addr, offset) + return ret, val + + def set_value(self, config, val): + ''' + get value by config way + way i2c/sysfs/lpc + ''' + way = config.get("way") + if way == 'sysfs': + return self.set_sysfs(config.get("loc"), "0x%02x" % val) + if way == "i2c": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.set_i2c(bus, addr, offset, val) + if way == "i2cpec": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.seti2c_byte_pec(bus, addr, offset, val) + if way == 'i2cword': + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.set_i2cword(bus, addr, offset, val) + if way == "i2cwordpec": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.set_i2cwordpec(bus, addr, offset, val) + if way == "devfile": + loc = config.get("loc") + offset = config.get("offset") + return self.devfile_write(loc, offset, val) + return False, "unsupport way: %s" % way + + def set_sysfs(self, loc, value): + return self.setsysfs(loc, value) + + def setsysfs(self, loc, value): + return osutil.writesysfs(loc, value) + + def set_i2cword(self, bus, addr, offset, byte): + return self.seti2cword(bus, addr, offset, byte) + + def seti2cword(self, bus, addr, offset, byte): + return osutil.seti2cword(bus, addr, offset, byte) + + def set_i2cwordpec(self, bus, addr, offset, val): + return osutil.seti2cwordpec(bus, addr, offset, val) + + def seti2c_byte_pec(self, bus, addr, offset, val): + return osutil.seti2c_byte_pec(bus, addr, offset, val) + + def set_i2c(self, bus, addr, offset, byte): + return self.seti2c(bus, addr, offset, byte) + + def seti2c(self, bus, addr, offset, byte): + ret, val = osutil.wbi2cset(bus, addr, offset, byte) + return ret, val + + def devfile_write(self, loc, offset, val): + ret, val = osutil.writedevfile(loc, offset, val) + return ret, val + + def getbcmtemp(self): + try: + sta, ret = osutil.getmactemp() + if sta is True: + mac_aver = float(ret.get("average", self.__error_ret)) + mac_aver = mac_aver * 1000 + else: + return False, ret + except AttributeError as e: + return False, str(e) + return True, mac_aver + + def getbcmreg(self, reg): + ret, val = osutil.getsdkreg(reg) + return ret, val + + def logger_debug(self, msg): + baseutil.logger_debug(msg) + + def command(self, cmd): + ret, output = osutil.command(cmd) + return ret, output + + def get_format_value(self, format_str): + ast_obj = ast.parse(format_str, mode='eval') + visitor = CodeVisitor() + visitor.visit(ast_obj) + ret = visitor.get_value() + return ret diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py new file mode 100644 index 000000000000..8b503bf6418f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py @@ -0,0 +1,413 @@ +#!/usr/bin/env python3 +####################################################### +# +# fan.py +# Python implementation of the Class fan +# +####################################################### +from eepromutil.fru import ipmifru +from eepromutil.fantlv import fan_tlv +from plat_hal.devicebase import devicebase +from plat_hal.rotor import rotor + + +class fan(devicebase): + __rotor_list = [] + __pn = None + __raweeprom = None + __sn = None + __hw_version = None + __e2loc = None + __rotors = None + __AirFlow = None + __SpeedMin = None + __SpeedMax = None + __PowerMax = None + __productName = None + __productSerialNumber = None + __WatchdogStatus = None + __led_attrs_config = None + __led_config = None + __WatchdogStatus_config = None + __AirFlowconifg = None + __EnableWatchdogConf = None + __Rotor_config = None + __fan_display_name = None # 'N/A' + __fan_display_name_conifg = None + + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.sn = conf.get('sn', None) + self.present = conf.get('present', None) + self.e2loc = conf.get('e2loc', None) + self.SpeedMin = conf.get('SpeedMin', None) + self.SpeedMax = conf.get('SpeedMax', None) + self.PowerMax = conf.get('PowerMax', None) + self.AirFlowconifg = conf.get("airflow", None) + self.WatchdogStatus_config = conf.get('WatchdogStatus', None) + self.EnableWatchdogConf = conf.get('EnableWatchdogConf', None) + self.led_attrs_config = conf.get('led_attrs', None) + self.led_config = conf.get('led', None) + self.Rotor_config = conf.get('Rotor', None) + self.fan_display_name_conifg = conf.get("fan_display_name", None) + rotor_tmp = [] + for value in self.Rotor_config.values(): + rotor_tmp.append(rotor(value)) + rotor_tmp.sort(key=lambda x: x.name, reverse=False) + self.rotor_list = rotor_tmp + self.rotors = len(self.rotor_list) + + @property + def EnableWatchdogConf(self): + return self.__EnableWatchdogConf + + @EnableWatchdogConf.setter + def EnableWatchdogConf(self, val): + self.__EnableWatchdogConf = val + + @property + def rotor_list(self): + return self.__rotor_list + + @rotor_list.setter + def rotor_list(self, val): + self.__rotor_list = val + + @property + def Rotor_config(self): + return self.__Rotor_config + + @Rotor_config.setter + def Rotor_config(self, val): + self.__Rotor_config = val + + @property + def productName(self): + return self.__productName + + @productName.setter + def productName(self, val): + self.__productName = val + + @property + def productSerialNumber(self): + return self.__productSerialNumber + + @productSerialNumber.setter + def productSerialNumber(self, val): + self.__productSerialNumber = val + + @property + def hw_version(self): + return self.__hw_version + + @hw_version.setter + def hw_version(self, val): + self.__hw_version = val + + @property + def sn(self): + return self.__sn + + @sn.setter + def sn(self, val): + self.__sn = val + + @property + def pn(self): + return self.__pn + + @pn.setter + def pn(self, val): + self.__pn = val + + @property + def raweeprom(self): + return self.__raweeprom + + @raweeprom.setter + def raweeprom(self, val): + self.__raweeprom = val + + @property + def SpeedMax(self): + return self.__SpeedMax + + @SpeedMax.setter + def SpeedMax(self, val): + self.__SpeedMax = val + + @property + def SpeedMin(self): + return self.__SpeedMin + + @SpeedMin.setter + def SpeedMin(self, val): + self.__SpeedMin = val + + @property + def PowerMax(self): + return self.__PowerMax + + @PowerMax.setter + def PowerMax(self, val): + self.__PowerMax = val + + @property + def rotors(self): + return self.__rotors + + @property + def AirFlow(self): + return self.__AirFlow + + @AirFlow.setter + def AirFlow(self, val): + self.__AirFlow = val + + @rotors.setter + def rotors(self, val): + self.__rotors = val + + @property + def fan_display_name_conifg(self): + return self.__fan_display_name_conifg + + @fan_display_name_conifg.setter + def fan_display_name_conifg(self, val): + self.__fan_display_name_conifg = val + + @property + def fan_display_name(self): + return self.__fan_display_name + + @fan_display_name.setter + def fan_display_name(self, val): + self.__fan_display_name = val + + def getspeed(self, conf): + tmp = None + if conf is None: + return -1 + ret, val = self.get_value(conf) + if ret is True: + tmp = int(str(val), 10) + else: + val = None + if val is not None: + return int(15000000 / tmp) + return -1 + + def get_speed(self, rotor_index): + rotor_item = self.get_rotor_index(rotor_index) + if rotor_item is None: + return None + speed = rotor_item.rotor_Speed.Value + if speed is None: + return None + return int(speed) + + def set_led(self, color): + status = self.led_attrs_config.get(color, None) + if status is None: + return False + + mask = self.led_attrs_config.get('mask', 0xff) + ret, value = self.get_value(self.led_config) + if ret is False or value is None: + return False + setval = (int(value) & ~mask) | (status) + ret, val = self.set_value(self.led_config, setval) + return ret + + def get_led(self): + mask = self.led_attrs_config.get('mask', 0xff) + ret, value = self.get_value(self.led_config) + if ret is False or value is None: + return False, 'N/A' + ledval = int(value) & mask + for key, val in self.led_attrs_config.items(): + if (ledval == val) and (key != "mask"): + return True, key + return False, 'N/A' + + def set_speed(self, rotor_index, level): + if level > 255 or level < 0: + return False + rotor_item = self.get_rotor_index(rotor_index) + if rotor_item is None: + return False + ret, val = self.set_value(rotor_item.Speedconfig, int(level)) + return ret + + def get_rotor_index(self, rotor_index): + if rotor_index > len(self.rotor_list): + return None + rotor_item = self.rotor_list[rotor_index - 1] + return rotor_item + + def get_rotor_byname(self, rotor_index): + for rotor_item in self.rotor_list: + if rotor_item.name == rotor_index: + return rotor_item + return None + + def get_presence(self): + ret, val = self.get_value(self.present) + if ret is False or val is None: + return -1 + if isinstance(val, str): + value = int(val, 16) + else: + value = val + mask = self.present.get("mask") + flag = value & mask + okval = self.present.get("okval", 0) + if flag == okval: + return True + return False + + def get_speed_pwm(self, rotor_index): + rotor_item = self.get_rotor_index(rotor_index) + if rotor_item is None: + return False + if rotor_item.i2c_speed is None: + return False + val = round(rotor_item.i2c_speed * 100 / 255) + return val + + def feed_watchdog(self): + ret = False + for rotor_item in self.rotor_list: + ret, val = rotor_item.feed_watchdog() + if ret is False: + return ret + return ret + + def get_fru_info(self): + try: + if self.get_presence() is False: + raise Exception("%s: not present" % self.name) + eeprom = self.get_eeprom_info(self.e2loc) + if eeprom is None: + raise Exception("%s: value is none" % self.name) + fru = ipmifru() + if isinstance(eeprom, bytes): + eeprom = self.byteTostr(eeprom) + fru.decodeBin(eeprom) + self.productName = fru.productInfoArea.productName.strip() # PN + self.productSerialNumber = fru.productInfoArea.productSerialNumber.strip() # SN + self.hw_version = fru.productInfoArea.productVersion.strip() # HW + except Exception: + self.productName = None + self.productSerialNumber = None + self.hw_version = None + return False + return True + + def get_tlv_info(self): + try: + if self.get_presence() is False: + raise Exception("%s: not present" % self.name) + eeprom = self.get_eeprom_info(self.e2loc) + if eeprom is None: + raise Exception("%s: value is none" % self.name) + tlv = fan_tlv() + rets = tlv.decode(eeprom) + for item in rets: + if item["name"] == "Product Name": + self.productName = item["value"].replace("\x00", "").strip() + elif item["name"] == "serial Number": + self.productSerialNumber = item["value"].replace("\x00", "").strip() + elif item["name"] == "hardware info": + self.hw_version = item["value"].replace("\x00", "").strip() + except Exception: + self.productName = None + self.productSerialNumber = None + self.hw_version = None + return False + return True + + def decode_eeprom_info(self): + '''get fan name, hw version, sn''' + ret = self.get_tlv_info() + if ret is True: + return ret + return self.get_fru_info() + + def get_AirFlow(self): + if self.productName is None: + ret = self.decode_eeprom_info() + if ret is False: + self.AirFlow = None + return False + if self.AirFlowconifg is None: + self.AirFlow = None + return False + for i in self.AirFlowconifg: + if self.productName in self.AirFlowconifg[i]: + self.AirFlow = i + return True + self.AirFlow = None + return False + + def enable_watchdog(self, enable): + ret = False + if enable is True: + byte = self.EnableWatchdogConf.get("enable_byte", None) + ret, val = self.set_value(self.EnableWatchdogConf, byte) + elif enable is False: + byte = self.EnableWatchdogConf.get("disable_byte", None) + ret, val = self.set_value(self.EnableWatchdogConf, byte) + return ret + + def get_watchdog_status(self): + dic = {"support": None, "open": None, "work_full": None, "work_allow_set": None} + if self.WatchdogStatus_config is None: + return None + ret, val = self.get_value(self.WatchdogStatus_config) + if ret is False or val is None: + return None + support_watchdog_off = self.WatchdogStatus_config.get("support_watchdog_off", None) + is_open_off = self.WatchdogStatus_config.get("is_open_off", None) + full_running_off = self.WatchdogStatus_config.get("full_running_off", None) + running_setting_off = self.WatchdogStatus_config.get("running_setting_off", None) + if support_watchdog_off is not None: + if support_watchdog_off & val == self.WatchdogStatus_config.get("support_watchdog_mask", None): + dic["support"] = True + else: + dic["support"] = False + return dic + if is_open_off is not None: + if is_open_off & val == self.WatchdogStatus_config.get("is_open_mask", None): + dic["open"] = True + else: + dic["open"] = False + if full_running_off is not None: + if full_running_off & val == self.WatchdogStatus_config.get("full_running_mask", None): + dic["work_full"] = True + else: + dic["work_full"] = False + if running_setting_off is not None: + if running_setting_off & val == self.WatchdogStatus_config.get("running_setting_mask", None): + dic["work_allow_set"] = True + else: + dic["work_allow_set"] = False + return dic + + def get_fan_display_name(self): + if self.productName is None: + ret = self.get_fru_info() + if ret is False: + self.fan_display_name = None + return False + if self.fan_display_name_conifg is None: + self.fan_display_name = self.productName + return False + for i in self.fan_display_name_conifg: + if self.productName in self.fan_display_name_conifg[i]: + self.fan_display_name = i + return True + self.fan_display_name = self.productName + return False diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py new file mode 100644 index 000000000000..19c78d640073 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py @@ -0,0 +1,1324 @@ +#!/usr/bin/env python3 +####################################################### +# +# interface.py +# Python implementation of the Class interface +# +####################################################### +import collections +from plat_hal.chassisbase import chassisbase +from plat_hal.baseutil import baseutil +from plat_hal.osutil import osutil + + +def Singleton(cls): + _instance = {} + + def _singleton(*args, **kargs): + if cls not in _instance: + _instance[cls] = cls(*args, **kargs) + return _instance[cls] + + return _singleton + + +@Singleton +class interface(object): + __chas = None + __error_ret = None + + def __init__(self): + self.chas = chassisbase() + self.__error_ret = -99999 + self.__na_ret = 'N/A' + + @property + def na_ret(self): + return self.__na_ret + + @na_ret.setter + def na_ret(self, val): + self.__na_ret = val + + @property + def error_ret(self): + return self.__error_ret + + @error_ret.setter + def error_ret(self, val): + self.__error_ret = val + + @property + def chas(self): + return self.__chas + + @chas.setter + def chas(self, val): + self.__chas = val + + # onie_e2 + def get_onie_e2(self): + onie_e2_list = self.chas.onie_e2_list + return onie_e2_list + + def get_onie_e2_path(self, name): + onie_e2 = self.chas.get_onie_e2_byname(name) + if onie_e2 is None: + return None + return onie_e2.e2_path + + def get_device_airflow(self, name): + onie_e2 = self.chas.get_onie_e2_byname(name) + if onie_e2 is None: + return None + return onie_e2.airflow + + def get_onie_e2_obj(self, name): + onie_e2 = self.chas.get_onie_e2_byname(name) + if onie_e2 is None: + return None + onie_e2.get_onie_e2_info() + return onie_e2 + + # temp + def get_temps(self): + templist = self.chas.temp_list + return templist + + def get_temp_total_number(self): + templist = self.chas.temp_list + return len(templist) + + def check_temp_id_exist(self, temp_id): + templist = self.chas.temp_list + for temp in templist: + if temp.temp_id == temp_id: + return True + return False + + def get_temp_id_number(self): + templist = self.chas.temp_list + temp_num = 0 + for i in range(len(templist)): + temp_id = "TEMP" + str(i + 1) + ret = self.check_temp_id_exist(temp_id) + if ret is True: + temp_num = temp_num + 1 + else: + return temp_num + return temp_num + + def get_temp_location(self, temp_name): + temp = self.chas.get_temp_byname(temp_name) + return temp.get_location() + + def set_temp_location(self, temp_name, location): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_location(location) + + def set_temp_name(self, temp_name, name): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_name(name) + + def get_appoint_temp(self, temp_name): + temp = self.chas.get_led_byname(temp_name) + return temp.get_temp() + + def set_appoint_temp(self, temp_name, val): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_temp(val) + + def get_temp_mintemp(self, temp_name): + temp = self.chas.get_temp_byname(temp_name) + return temp.get_mintemp() + + def set_temp_mintemp(self, temp_name, val): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_mintemp(val) + + # led + def get_leds(self): + ledlist = self.chas.led_list + return ledlist + + def get_led_total_number(self): + ledlist = self.chas.led_list + return len(ledlist) + + def get_led_color(self, led_name): + led = self.chas.get_led_byname(led_name) + if led is None: + return -1 + return led.get_color() + + def get_led_color_by_type(self, led_type): + ledlist = self.chas.led_list + ledtmp = None + for temp in ledlist: + if temp.led_type == led_type: + ledtmp = temp + break + if ledtmp is None: + return -1 + return ledtmp.get_color() + + def set_led_color(self, led_name, color): + led = self.chas.get_led_byname(led_name) + if led is None: + return -1 + return led.set_color(color) + + # psu + def get_psu_total_number(self): + psulist = self.chas.psu_list + if psulist is None: + return -1 + return len(psulist) + + def get_psus(self): + psulist = self.chas.psu_list + return psulist + + def get_psu_presence(self, psu_name): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + return psu.present + + def get_psu_fru_info(self, psu_name): + ''' + { + "Name": "PSU1", + "SN": "serial_number_example", # 'N/A' + "PN": "part_number_example", # 'N/A' + "AirFlow": "B2F" # 'N/A' + } + ''' + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + psu.get_fru_info() + psu.get_AirFlow() + psu.get_psu_display_name() + + dic = collections.OrderedDict() + dic["Name"] = psu.name + dic["SN"] = psu.productSerialNumber if (psu.productSerialNumber is not None) else self.na_ret + dic["PN"] = psu.productPartModelName if (psu.productPartModelName is not None) else self.na_ret + dic["DisplayName"] = psu.psu_display_name if (psu.psu_display_name is not None) else self.na_ret + dic["VENDOR"] = psu.productManufacturer if (psu.productManufacturer is not None) else self.na_ret + dic["HW"] = psu.productVersion if (psu.productVersion is not None) else self.na_ret + dic["AirFlow"] = psu.AirFlow if (psu.AirFlow is not None) else self.na_ret + return dic + + def get_psu_input_output_status(self, psu_name): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + psu.InputsCurrent.Value # just for clear faults + if (psu.InputStatus is True) and (psu.OutputStatus is True): + return True + return False + + def get_psu_status(self, psu_name): + """ + Get status of a specific PSU + @return dict of the specific PSU's status, None for failure + Example return value(all keys are mandatory) + { + "Name": "PSU1", + "InputType": "DC", # "AC" or 'N/A' + "InputStatus": True, # H/W status bit + "OutputStatus": True # H/W status bit + "FanSpeed": { + "Value": 4000, # -99999 + "Min": 2000, # -99999 + "Max": 10000 # -99999 + }, + "Temperature": { + "Value": 40.0, # -99999.0 + "Min": -30.0, # -99999.0 + "Max": 50.0 # -99999.0 + } + } + """ + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + + dic = collections.OrderedDict() + # psu.get_Temperature() + temp_dict = collections.OrderedDict() + temp_dict['Min'] = psu.Temperature.Min + temp_dict['Max'] = psu.Temperature.Max + temp_dict['Value'] = psu.Temperature.Value + temp_dict['Unit'] = psu.Temperature.Unit + dic["Temperature"] = temp_dict + + # psu.get_FanSpeed() + fan_speed_dict = collections.OrderedDict() + fan_speed_dict['Min'] = psu.FanSpeed.Min + fan_speed_dict['Max'] = psu.FanSpeed.Max + fan_speed_dict['Tolerance'] = psu.FanSpeedTolerance + fan_speed_dict['Value'] = psu.FanSpeed.Value + fan_speed_dict['Unit'] = psu.FanSpeed.Unit + dic["FanSpeed"] = fan_speed_dict + + dic["Name"] = psu.name + dic["InputType"] = psu.InputsType + dic["InputStatus"] = psu.InputStatus + dic["OutputStatus"] = psu.OutputStatus + dic["TempStatus"] = psu.TempStatus + dic["FanStatus"] = psu.FanStatus + return dic + + def get_psu_power_status(self, psu_name): + """ + Get power status of a specific PSU + @return dict of the specific PSU's power status, None for failure + Example return value + { + "Name": "PSU1", + "Inputs": { + "Status": True, # H/W status bit + "Type": "DC", # or "AC" or "N/A" + "Voltage": { + "Value": 220, # -1 + "LowAlarm": 200, # -1 + "HighAlarm": 240, # -1 + "Unit": "V" + }, + "Current": { + "Value": 6.0, # -99999.0 + "LowAlarm": 0.2, # -99999.0 + "HighAlarm": 7.0, # -99999.0 + "Unit": "A" + }, + "Power": { + "Value": 1000, # -99999 + "LowAlarm": -1, # -99999 + "HighAlarm": 1400, # -99999 + "Unit": "W" + } + }, + "Outputs": { + "Status": True, + "Voltage": { + "Value": 220, + "LowAlarm": 200, + "HighAlarm": 240, + "Unit": "V" + }, + "Current": { + "Value": 6.0, + "LowAlarm": 0.2, + "HighAlarm": 7.0, + "Unit": "A" + }, + "Power": { + "Value": 1000, + "LowAlarm": -1, # Don't care + "HighAlarm": 1400, + "Unit": "W" + } + } + } + """ + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + + dic = collections.OrderedDict() + inputdic = collections.OrderedDict() + Outputsdic = collections.OrderedDict() + dic["Name"] = psu.name + inputdic["Status"] = psu.InputStatus + inputdic["Type"] = psu.InputsType + + # psu.get_InputsVoltage() + inputdic_voltage = collections.OrderedDict() + + inputdic_voltage["Value"] = psu.InputsVoltage.Value + inputdic_voltage["LowAlarm"] = psu.InputsVoltage.Min + inputdic_voltage["HighAlarm"] = psu.InputsVoltage.Max + inputdic_voltage["Unit"] = psu.InputsVoltage.Unit + + inputdic["Voltage"] = inputdic_voltage + inputdic_current = collections.OrderedDict() + inputdic_current["Value"] = psu.InputsCurrent.Value + inputdic_current["LowAlarm"] = psu.InputsCurrent.Min + inputdic_current["HighAlarm"] = psu.InputsCurrent.Max + inputdic_current["Unit"] = psu.InputsCurrent.Unit + inputdic["Current"] = inputdic_current + + inputdic_power = collections.OrderedDict() + inputdic_power["Value"] = psu.InputsPower.Value + inputdic_power["LowAlarm"] = psu.InputsPower.Min + inputdic_power["HighAlarm"] = psu.InputsPower.Max + inputdic_power["Unit"] = psu.InputsPower.Unit + inputdic["Power"] = inputdic_power + Outputsdic["Status"] = psu.InputStatus + + outputdic_voltage = collections.OrderedDict() + outputdic_current = collections.OrderedDict() + outputdic_power = collections.OrderedDict() + + outputdic_voltage["Value"] = psu.OutputsVoltage.Value + outputdic_voltage["LowAlarm"] = psu.OutputsVoltage.Min + outputdic_voltage["HighAlarm"] = psu.OutputsVoltage.Max + outputdic_voltage["Unit"] = psu.OutputsVoltage.Unit + + outputdic_current["Value"] = psu.OutputsCurrent.Value + outputdic_current["LowAlarm"] = psu.OutputsCurrent.Min + outputdic_current["HighAlarm"] = psu.OutputsCurrent.Max + outputdic_current["Unit"] = psu.OutputsCurrent.Unit + + outputdic_power["Value"] = psu.OutputsPower.Value + outputdic_power["LowAlarm"] = psu.OutputsPower.Min + outputdic_power["HighAlarm"] = psu.OutputsPower.Max + outputdic_power["Unit"] = psu.OutputsPower.Unit + + Outputsdic["Voltage"] = outputdic_voltage + Outputsdic["Current"] = outputdic_current + Outputsdic["Power"] = outputdic_power + + dic["Inputs"] = inputdic + dic["Outputs"] = Outputsdic + + return dic + + def set_psu_fan_speed_pwm(self, psu_name, pwm): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + return psu.set_fan_speed_pwm(pwm) + + def get_psu_fan_speed_pwm(self, psu_name): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + return psu.get_fan_speed_pwm() + + def get_psu_info_all(self): + """ + { + "Number": 2, + "PSU1": { + "SN": "serial_number_example", # 'N/A' + "PN": "part_number_example", # 'N/A' + "AirFlow": "intake", # 'N/A' + + "FanSpeed": { + "Value": 4000, + "Min": 2000, + "Max": 30000 + }, + "Temperature": { + "Value": 35.0, + "Min": -20.0, + "Max": 45.0 + }, + "Inputs": { + "Status": True, # H/W status bit + "Type": "DC", # or "AC" + "Voltage": { + "Value": 220, + "LowAlarm": 200, + "HighAlarm": 240, + "Unit": "V" + }, + "Current": { + "Value": 6.0, + "LowAlarm": 0.2, + "HighAlarm": 7.0, + "Unit": "A" + }, + "Power": { + "Value": 1000, + "LowAlarm": -1, + "HighAlarm": 1400, + "Unit": "W" + } + }, + "Outputs": { + "Status": True, + "Voltage": { + "Value": 220, + "LowAlarm": 200, + "HighAlarm": 240, + "Unit": "V" + }, + "Current": { + "Value": 6.0, + "LowAlarm": 0.2, + "HighAlarm": 7.0, + "Unit": "A" + }, + "Power": { + "Value": 1000, + "LowAlarm": -1, # Don't care + "HighAlarm": 1400, + "Unit": "W" + } + } + } + } + """ + + psus = self.get_psus() + psu_dict = collections.OrderedDict() + psu_dict['Number'] = len(psus) + for psu in psus: + dicttmp = self.get_psu_fru_info(psu.name) + dicttmp.update(self.get_psu_status(psu.name)) + dicttmp.update(self.get_psu_power_status(psu.name)) + if self.get_psu_presence(psu.name) is True: + dicttmp['Present'] = 'yes' + else: + dicttmp['Present'] = 'no' + psu_dict[psu.name] = dicttmp + return psu_dict + + def get_fans(self): + fanlist = self.chas.fan_list + return fanlist + + # fan + def get_fan_total_number(self): + fanlist = self.chas.fan_list + if fanlist is None: + return -1 + return len(fanlist) + + def get_fan_rotor_number(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.rotors + if ret is None: + return -1 + return ret + + def get_fan_speed(self, fan_name, rotor_index): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.get_speed(rotor_index) + if ret is None: + return -1 + return ret + + def fan_speed_set_level(self, fan_name, rotor_index, level): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.set_speed(rotor_index, level) + if ret is True: + return 0 + return -1 + + def get_fan_speed_pwm(self, fan_name, rotor_index): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + val = fan.get_speed_pwm(rotor_index) + if val is False: + return -1 + return val + + def set_fan_speed_pwm(self, fan_name, rotor_index, pwm): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + if isinstance(pwm, str): + rate = float(pwm.strip('%s')) + speed = round(rate * 255 / 100) + elif isinstance(pwm, int): + speed = round(pwm * 255 / 100) + elif isinstance(pwm, float): + speed = round(pwm * 255 / 100) + else: + return -1 + ret = self.fan_speed_set_level(fan.name, rotor_index, speed) + if ret == 0: + return 0 + return -1 + + def get_fan_watchdog_status(self): + fan = self.chas.fan_list[0] + dic = fan.get_watchdog_status() + if dic is None or dic["support"] is False: + return self.na_ret + if dic["open"] is False or dic["work_allow_set"] is True: + return "Normal" + if dic["work_full"] is True: + return "Abnormal" + return "Abnormal" + + def enable_fan_watchdog(self, enable=True): + fan = self.chas.fan_list[0] + ret = fan.enable_watchdog(enable) + if ret is True: + return 0 + return -1 + + def feed_fan_watchdog(self): + fan_list = self.chas.fan_list + if fan_list is None: + return -1 + for fan in fan_list: + ret = fan.feed_watchdog() + if ret is False: + return -1 + return 0 + + def set_fan_led(self, fan_name, color): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.set_led(color) + if ret is True: + return 0 + return -1 + + def get_fan_led(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return False, 'N/A' + return fan.get_led() + + def get_fan_presence(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + return fan.get_presence() + + def get_fan_fru_info(self, fan_name): + """ + Get specific fan's information + # Properties + "Name": "FAN1", + "SN": "serial_number_example", # 'N/A' + "PN": "part_number_exampple", # 'N/A' + "Rotors": 2, # -1 + "AirFlow": "intake", # 'N/A' + "SpeedMin": 2000, # -1 + "SpeedMax": 30000 # -1 + """ + fan = self.chas.get_fan_byname(fan_name) + fan.get_fru_info() + fan.get_AirFlow() + fan.get_fan_display_name() + + dic = collections.OrderedDict() + dic["Name"] = fan.name + dic["SN"] = fan.productSerialNumber + if dic["SN"] is None: + dic["SN"] = self.na_ret + dic["PN"] = fan.productName + if dic["PN"] is None: + dic["PN"] = self.na_ret + dic["DisplayName"] = fan.fan_display_name + if dic["DisplayName"] is None: + dic["DisplayName"] = self.na_ret + + dic["Rotors"] = fan.rotors + dic["AirFlow"] = fan.AirFlow + if dic["AirFlow"] is None: + dic["AirFlow"] = self.na_ret + dic["SpeedMin"] = fan.SpeedMin + dic["SpeedMax"] = fan.SpeedMax + return dic + + def get_fan_eeprom_info(self, fan_name): + """ + Get specific fan's information + # Properties + "Name": "M6510-FAN-F", # 'N/A' + "SN": "serial_number_example", # 'N/A' + "HW": "hw_version_exampple", # 'N/A' + """ + fan = self.chas.get_fan_byname(fan_name) + fan.decode_eeprom_info() + dic = collections.OrderedDict() + dic["NAME"] = fan.productName + if dic["NAME"] is None: + dic["NAME"] = self.na_ret + dic["SN"] = fan.productSerialNumber + if dic["SN"] is None: + dic["SN"] = self.na_ret + dic["HW"] = fan.hw_version + if dic["HW"] is None: + dic["HW"] = self.na_ret + + return dic + + def get_product_fullname(self): + return baseutil.get_product_fullname() + + def get_fan_status(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotorlist = fan.rotor_list + dic = collections.OrderedDict() + for rotor in rotorlist: + dic_val = collections.OrderedDict() + if rotor.rotor_Running is True: + dic_val['Running'] = 'yes' + else: + dic_val['Running'] = 'no' + if rotor.rotor_HwAlarm is True: + dic_val['HwAlarm'] = 'yes' + else: + dic_val['HwAlarm'] = 'no' + dic_val['Speed'] = int(rotor.rotor_Speed.Value) + dic[rotor.name] = dic_val + return dic + + def get_fan_rotor_status(self, fan_name, rotor_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotorlist = fan.rotor_list + for rotor in rotorlist: + if rotor_name == rotor.name: + if rotor.rotor_Running is True: + return True + return False + return -1 + + def get_fan_roll_status(self, fan_name, rotor_index): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotor = fan.get_rotor_index(rotor_index) + if rotor is None: + return -1 + if rotor.rotor_Running is True: + return True + return False + + def get_fan_info_fru(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + fan.get_fru_info() + fan.get_AirFlow() + dic = collections.OrderedDict() + dic["Name"] = fan.name + dic["SN"] = fan.productSerialNumber + if dic["SN"] is None: + dic["SN"] = self.na_ret + dic["PN"] = fan.productPartModelName + if dic["PN"] is None: + dic["PN"] = self.na_ret + flag = self.get_fan_presence(fan_name) + if flag is True: + dic["Present"] = "yes" + elif flag is False: + dic["Present"] = "no" + else: + dic["Present"] = self.na_ret + dic["Rotors"] = fan.rotors + dic["AirFlow"] = fan.AirFlow + if dic["AirFlow"] is None: + dic["AirFlow"] = self.na_ret + return dic + + # support TLV and FRU FAN E2 + def get_fan_info(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return None + fan.get_AirFlow() + dic = self.get_fan_eeprom_info(fan_name) + flag = self.get_fan_presence(fan_name) + if flag is True: + dic["Present"] = "yes" + elif flag is False: + dic["Present"] = "no" + else: + dic["Present"] = self.na_ret + dic["Rotors"] = fan.rotors + dic["AirFlow"] = fan.AirFlow + if dic["AirFlow"] is None: + dic["AirFlow"] = self.na_ret + dic["PowerMax"] = fan.PowerMax + if dic["PowerMax"] is None: + dic["PowerMax"] = self.na_ret + return dic + + def get_fan_info_rotor(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotorlist = fan.rotor_list + dic = collections.OrderedDict() + for rotor in rotorlist: + dic_val = collections.OrderedDict() + if rotor.rotor_Running is True: + dic_val['Running'] = 'yes' + else: + dic_val['Running'] = 'no' + if rotor.rotor_HwAlarm is True: + dic_val['HwAlarm'] = 'yes' + else: + dic_val['HwAlarm'] = 'no' + speed_value = rotor.rotor_Speed.Value + if speed_value is None: + dic_val['Speed'] = self.error_ret + else: + dic_val['Speed'] = int(speed_value) + if rotor.SpeedMin is None: + dic_val['SpeedMin'] = self.error_ret + else: + dic_val['SpeedMin'] = rotor.SpeedMin + if rotor.SpeedMax is None: + dic_val['SpeedMax'] = self.error_ret + else: + dic_val['SpeedMax'] = rotor.SpeedMax + if rotor.Tolerance is None: + dic_val['Tolerance'] = self.error_ret + else: + dic_val['Tolerance'] = rotor.Tolerance + + dic[rotor.name] = dic_val + return dic + + def get_fan_info_all(self): + fanlist = self.chas.fan_list + dic = collections.OrderedDict() + dic['Number'] = len(fanlist) + dic['WatchdogStatus'] = self.get_fan_watchdog_status() + for fan in fanlist: + dic[fan.name] = self.get_fan_info(fan.name) + dic[fan.name].update(self.get_fan_info_rotor(fan.name)) + return dic + + def temp_test(self): + templist = self.chas.temp_list + dicret = collections.OrderedDict() + + for temp in templist: + dic = collections.OrderedDict() + temp_value = temp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["LowAlarm"] = temp.Min + dic["HighAlarm"] = temp.Max + dicret[temp.name] = dic + return dicret + + # dcdc + def get_dcdc_total_number(self): + dcdclist = self.chas.dcdc_list + if dcdclist is None: + return -1 + return len(dcdclist) + + def get_dcdc_by_id(self, dcdc_id): + dcdclist = self.chas.dcdc_list + dcdctmp = None + for dcdc in dcdclist: + if dcdc.dcdc_id == dcdc_id: + dcdctmp = dcdc + dic = collections.OrderedDict() + if dcdctmp is None: + dic["Name"] = self.error_ret + dic["Min"] = self.error_ret + dic["Max"] = self.error_ret + dic["Low"] = self.error_ret + dic["High"] = self.error_ret + dic["Value"] = self.error_ret + dic["Unit"] = self.error_ret + else: + dic["Name"] = dcdctmp.name + dic["Min"] = dcdctmp.sensor.Min + dic["Max"] = dcdctmp.sensor.Max + dic["Low"] = dcdctmp.sensor.Low + dic["High"] = dcdctmp.sensor.High + tmp = dcdctmp.sensor.Value + if tmp is not None: + dic['Value'] = tmp + else: + dic['Value'] = self.error_ret + dic["Unit"] = dcdctmp.sensor.Unit + return dic + + def get_dcdc_all_info(self): + val_list = collections.OrderedDict() + dcdclist = self.chas.dcdc_list + for dcdc in dcdclist: + dicttmp = {} + sensorname = "%s" % (dcdc.name) + dicttmp['Min'] = dcdc.sensor.Min + dicttmp['Max'] = dcdc.sensor.Max + tmp = dcdc.sensor.Value + if tmp is not None: + dicttmp['Value'] = tmp + else: + dicttmp['Value'] = self.error_ret + dicttmp['Unit'] = dcdc.sensor.Unit + val_list[sensorname] = dicttmp + return val_list + + # sensors + def get_monitor_temp(self, name): + templist = self.chas.temp_list + temptmp = None + for temp in templist: + if temp.name == name: + temptmp = temp + + dic = collections.OrderedDict() + if temptmp is None: + dic["Min"] = self.error_ret + dic["Max"] = self.error_ret + dic["Value"] = self.error_ret + dic["Unit"] = self.error_ret + else: + dic["Min"] = temptmp.Min + dic["Max"] = temptmp.Max + temp_value = temptmp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temptmp.Unit + return dic + + def get_monitor_temp_by_id(self, temp_id): + templist = self.chas.temp_list + temptmp = None + for temp in templist: + if temp.temp_id == temp_id: + temptmp = temp + + dic = collections.OrderedDict() + if temptmp is None: + dic["Name"] = self.error_ret + dic["Api_name"] = self.error_ret + dic["Min"] = self.error_ret + dic["Max"] = self.error_ret + dic["Low"] = self.error_ret + dic["High"] = self.error_ret + dic["Value"] = self.error_ret + dic["Unit"] = self.error_ret + else: + dic["Name"] = temptmp.name + dic["Api_name"] = temptmp.api_name + dic["Min"] = temptmp.Min + dic["Max"] = temptmp.Max + dic["Low"] = temptmp.Low + dic["High"] = temptmp.High + temp_value = temptmp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temptmp.Unit + return dic + + def get_temp_info(self): + val_list = collections.OrderedDict() + # temp + templist = self.chas.temp_list + for temp in templist: + dic = collections.OrderedDict() + dic["Min"] = temp.Min + dic["Max"] = temp.Max + dic["Low"] = temp.Low + dic["High"] = temp.High + temp_value = temp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temp.Unit + val_list[temp.name] = dic + return val_list + + def get_sensor_info(self): + val_list = collections.OrderedDict() + # temp + templist = self.chas.temp_list + for temp in templist: + dic = collections.OrderedDict() + dic["Min"] = temp.Min + dic["Max"] = temp.Max + dic["Low"] = temp.Low + dic["High"] = temp.High + temp_value = temp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temp.Unit + val_list[temp.name] = dic + # fan + fanlist = self.chas.fan_list + for fan in fanlist: + for rotor in fan.rotor_list: + sensorname = "%s%s" % (fan.name, rotor.name) + speed = collections.OrderedDict() + speed['Min'] = rotor.rotor_Speed.Min + speed['Max'] = rotor.rotor_Speed.Max + rotor_speed_Value = rotor.rotor_Speed.Value + speed['Value'] = rotor_speed_Value if (rotor_speed_Value is not None) else self.error_ret + speed['Unit'] = rotor.rotor_Speed.Unit + val_list[sensorname] = speed + + val_list.update(self.get_dcdc_all_info()) + + # psu + psulist = self.chas.psu_list + for psu in psulist: + inputdic_voltage = collections.OrderedDict() + inputdic_current = collections.OrderedDict() + inputdic_power = collections.OrderedDict() + outputdic_voltage = collections.OrderedDict() + outputdic_current = collections.OrderedDict() + outputdic_power = collections.OrderedDict() + temperature = collections.OrderedDict() + fanspeed = collections.OrderedDict() + + psu_temp_value = psu.Temperature.Value + temperature["Value"] = psu_temp_value if (psu_temp_value is not None) else self.error_ret + temperature["Min"] = psu.Temperature.Min + temperature["Max"] = psu.Temperature.Max + temperature["Unit"] = psu.Temperature.Unit + + fanspeed["Value"] = psu.FanSpeed.Value + fanspeed["Min"] = psu.FanSpeed.Min + fanspeed["Max"] = psu.FanSpeed.Max + fanspeed["Unit"] = psu.FanSpeed.Unit + + psu_inputvoltage_value = psu.InputsVoltage.Value + inputdic_voltage["Value"] = psu_inputvoltage_value if ( + psu_inputvoltage_value is not None) else self.error_ret + inputdic_voltage["Min"] = psu.InputsVoltage.Min + inputdic_voltage["Max"] = psu.InputsVoltage.Max + inputdic_voltage["Unit"] = psu.InputsVoltage.Unit + + psu_inputcurrent_value = psu.InputsCurrent.Value + inputdic_current["Value"] = psu_inputcurrent_value if ( + psu_inputcurrent_value is not None) else self.error_ret + inputdic_current["Min"] = psu.InputsCurrent.Min + inputdic_current["Max"] = psu.InputsCurrent.Max + inputdic_current["Unit"] = psu.InputsCurrent.Unit + + psu_inputpower_value = psu.InputsPower.Value + inputdic_power["Value"] = psu_inputpower_value if (psu_inputpower_value is not None) else self.error_ret + inputdic_power["Min"] = psu.InputsPower.Min + inputdic_power["Max"] = psu.InputsPower.Max + inputdic_power["Unit"] = psu.InputsPower.Unit + + psu_outputvoltage_value = psu.OutputsVoltage.Value + outputdic_voltage["Value"] = psu_outputvoltage_value if ( + psu_outputvoltage_value is not None) else self.error_ret + outputdic_voltage["Min"] = psu.OutputsVoltage.Min + outputdic_voltage["Max"] = psu.OutputsVoltage.Max + outputdic_voltage["Unit"] = psu.OutputsVoltage.Unit + + psu_outputcurrent_value = psu.OutputsCurrent.Value + outputdic_current["Value"] = psu_outputcurrent_value if ( + psu_outputcurrent_value is not None) else self.error_ret + outputdic_current["Min"] = psu.OutputsCurrent.Min + outputdic_current["Max"] = psu.OutputsCurrent.Max + outputdic_current["Unit"] = psu.OutputsCurrent.Unit + + psu_outputpower_value = psu.OutputsPower.Value + outputdic_power["Value"] = psu_outputpower_value if ( + psu_outputpower_value is not None) else self.error_ret + outputdic_power["Min"] = psu.OutputsPower.Min + outputdic_power["Max"] = psu.OutputsPower.Max + outputdic_power["Unit"] = psu.OutputsPower.Unit + + val_list["%s%s" % (psu.name, "Vol_I")] = inputdic_voltage + val_list["%s%s" % (psu.name, "Curr_I")] = inputdic_current + val_list["%s%s" % (psu.name, "Power_I")] = inputdic_power + val_list["%s%s" % (psu.name, "Vol_O")] = outputdic_voltage + val_list["%s%s" % (psu.name, "Curr_O")] = outputdic_current + val_list["%s%s" % (psu.name, "Power_O")] = outputdic_power + val_list["%s%s" % (psu.name, "Fan")] = fanspeed + val_list["%s%s" % (psu.name, "Temp")] = temperature + + return val_list + + # cpld + def get_cpld_total_number(self): + cpldlist = self.chas.cpld_list + return len(cpldlist) + + def get_cpld_user_reg(self): + cpld = self.chas.get_cpld_byname("BASE_CPLD") + if cpld is None: + return None + return cpld.get_user_reg() + + def set_cpld_user_reg(self, value): + if isinstance(value, int) is False: + baseutil.logger_debug("value must int %s" % type(value)) + return -1 + if (int(value) < 0 or int(value) > 255): + baseutil.logger_debug("value must [0 - 255]") + return -1 + cpld = self.chas.get_cpld_byname("BASE_CPLD") + if cpld is None: + baseutil.logger_debug("name BASE_CPLD not find") + return -1 + if cpld.set_user_reg(value) is True: + return 0 + return -1 + + def set_cpld_console_owner(self, owner): + """ + Set console I/O owner + + @param owner I/O owner of the console, either "cpu" or "bmc" + + @return 0 for success, -1 for failure + """ + if owner is None: + baseutil.logger_debug("owner is None") + return -1 + owner_tuple = ("cpu", "bmc") + if owner not in owner_tuple: + baseutil.logger_debug("owner is %s, must cpu or bmc" % owner) + return -1 + cpld = self.chas.get_cpld_byname("BASE_CPLD") + if cpld is None: + baseutil.logger_debug("name BASE_CPLD not find") + return -1 + if cpld.set_console_owner(owner) is True: + return 0 + return -1 + + def get_cpld_version_by_id(self, cpld_id): + cpldlist = self.chas.cpld_list + cpldtmp = None + for cpld in cpldlist: + if cpld.cpld_id == cpld_id: + cpldtmp = cpld + + dic = collections.OrderedDict() + if cpldtmp is None: + dic["Name"] = self.na_ret + dic["Version"] = self.na_ret + dic["Desc"] = self.na_ret + dic["Slot"] = None + dic["Warm"] = None + else: + dic["Name"] = cpldtmp.name + dic["Version"] = cpldtmp.get_version() + dic["Desc"] = cpldtmp.desc + dic["Slot"] = cpldtmp.slot + dic["Warm"] = cpldtmp.warm + return dic + + def get_cpld_all_version(self): + """ + Get version of all CPLDs' that can be read from BMC + + @return dict of CPLDs' version or None for failure. + example outputs: + { + "BASE_CPLD": "0.1", # or "N/A" for read failure + "FAN_CPLD": "0.2" + } + """ + cpld_version = { + "BASE_CPLD": "N/A", + "FAN_CPLD": "N/A" + } + for cpld_name in cpld_version: + cpld = self.chas.get_cpld_byname(cpld_name) + if cpld is None: + baseutil.logger_debug("name %s not find" % cpld_name) + continue + cpld_version[cpld_name] = cpld.get_version() + return cpld_version + + # comp + def get_comp_total_number(self): + complist = self.chas.comp_list + return len(complist) + + def get_comp_list(self): + return self.chas.comp_list + + def get_comp_id(self, comp): + return comp.comp_id + + def get_comp_version_by_id(self, comp_id): + comp_list = self.chas.comp_list + comptmp = None + for comp in comp_list: + if comp.comp_id == comp_id: + comptmp = comp + break + + dic = collections.OrderedDict() + if comptmp is None: + dic["Name"] = self.na_ret + dic["Version"] = self.na_ret + dic["Desc"] = self.na_ret + dic["Slot"] = None + else: + dic["Name"] = comptmp.name + dic["Version"] = comptmp.get_version() + dic["Desc"] = comptmp.desc + dic["Slot"] = comptmp.slot + return dic + + def get_bmc_productname(self): + """ + Get product name + + @return product name string, e.g. $(device name)-F-$(VENDOR_NAME), if error return "N/A" + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name bmc(master) not find") + return self.na_ret + return bmc.get_productname() + + def call_bmc_diagcmd(self, cmdstr): + """ + Call BMC diag comman func + + @return ret: 0 sucess , -1 fail + outmsg: if success is out msg, or fail is err msg + """ + if (cmdstr is None or cmdstr == ""): + outmsg = "cmdstr is empty" + baseutil.logger_debug(outmsg) + return -1, outmsg + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + outmsg = "name bmc(master) not find" + baseutil.logger_debug(outmsg) + return -1, outmsg + baseutil.logger_debug("call cmdstr %s" % cmdstr) + return bmc.call_diagcmd(cmdstr) + + def write_bios_version(self, flash, version): + bios = self.chas.get_bios_byname("master") + if bios is None: + baseutil.logger_debug("name bios(master) not find") + return -1 + return bios.set_bios_version(flash, version) + + def get_bios_version(self): + bios = self.chas.get_bios_byname("master") + if bios is None: + baseutil.logger_debug("name bios(master) not find") + return -1 + return bios.get_bios_version() + + def get_bios_status(self): + bios = self.chas.get_bios_byname("master") + if bios is None: + baseutil.logger_debug("name bios(master) not find") + return -1 + return bios.get_bios_boot_status() + + def get_bmc_mac_rov(self): + """ + Get BMC mac rov + + @return ret: 0 sucess , -1 fail + outmsg: if success is out msg, or fail is err msg + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + msg = "name master not find" + baseutil.logger_debug(msg) + return -1, msg + return bmc.get_mac_rov() + + def get_bmc_next_boot(self): + """ + Get next booting flash of BMC + + @return 'master'/'slave' on success, "N/A" for failure + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return self.na_ret + return bmc.get_next_boot() + + def set_bmc_next_boot(self, flash): + """ + Set flash from which next BMC boot + + @param flash Booting flash of BMC, "master" or "slave" + + @return 0 on success, -1 for failure + """ + flash_status = ("master", "slave") + if flash is None or flash not in flash_status: + baseutil.logger_debug("parameter flash illegal, should be [master|slave]") + return -1 + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return -1 + return bmc.set_next_boot(flash) + + def reboot_bmc(self): + """ + Reboot running BMC + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return -1 + return bmc.reboot() + + def get_bmc_info(self): + """ + Get BMC info + + @return dict of BMC info or None for failure + "Version": "1.1.1", # "N/A" + "Flash": "master", # "N/A" + "Next": "master" # "N/A" + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return self.na_ret + return bmc.get_info() + + def get_bmc_version_all(self): + """ + @return dict of BMCs + { + "MasterVersion": "1.1.1", # "N/A" + "SlaveVersion": "1.1.1" # "N/A" + } + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return self.na_ret + return bmc.get_version_all() + + def bmc_execute_command(self, cmd_str): + ret, output = osutil.command(cmd_str) + if ret: + baseutil.logger_debug("execute %s command failed" % (cmd_str)) + return ret, output + + def get_cpu_reset_num(self): + """ + Get CPU reset num + @return CPU reset num on success, -1 for failure + """ + cpu = self.chas.get_cpu_byname("cpu") + if cpu is None: + msg = "name cpu not find" + baseutil.logger_debug(msg) + return -1 + return cpu.get_cpu_reset_num() + + def get_cpu_reboot_cause(self): + """ + Get CPU reboot cause + @return string of cpu reboot reason + """ + cpu = self.chas.get_cpu_byname("cpu") + if cpu is None: + msg = "name cpu not find" + baseutil.logger_debug(msg) + return "Unknown reboot cause" + return cpu.get_cpu_reboot_cause() + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py new file mode 100644 index 000000000000..7fb869c74d7f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +####################################################### +# +# led.py +# Python implementation of the Class led +# +####################################################### +from plat_hal.devicebase import devicebase + + +class led(devicebase): + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.led_type = conf.get('led_type', None) + self.led_attrs_config = conf.get('led_attrs', None) + self.led_config = conf.get('led', None) + + def set_color(self, color): + status = self.led_attrs_config.get(color, None) + if status is None: + return False + + mask = self.led_attrs_config.get('mask', 0xff) + + if isinstance(self.led_config, list): + for led_config_index in self.led_config: + ret, value = self.get_value(led_config_index) + if (ret is False) or (value is None): + return False + setval = (int(value) & ~mask) | (status) + ret, val = self.set_value(led_config_index, setval) + if ret is False: + return ret + else: + ret, value = self.get_value(self.led_config) + if (ret is False) or (value is None): + return False + setval = (int(value) & ~mask) | (status) + ret, val = self.set_value(self.led_config, setval) + return ret + + def get_color(self): + mask = self.led_attrs_config.get('mask', 0xff) + ret, value = self.get_value(self.led_config) + if ret is False or value is None: + return False, 'N/A' + ledval = int(value) & mask + for key, val in self.led_attrs_config.items(): + if (ledval == val) and (key != "mask"): + return True, key + return False, 'N/A' diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py new file mode 100644 index 000000000000..9ac32cace263 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +####################################################### +# +# onie_e2.py +# Python implementation of the Class onie_e2 +# +####################################################### +from plat_hal.devicebase import devicebase +from eepromutil.onietlv import onie_tlv + + +class onie_e2(devicebase): + + def __init__(self, conf=None): + self._cardid = "" + self._productname = "" + self._partnum = "" + self._serialnum = "" + self._macbase = "" + self._manufdate = "" + self._deviceversion = "" + self._labelrevision = "" + self._platformname = "" + self._onieversion = "" + self._macsize = "" + self._manufname = "" + self._manufcountry = "" + self._vendorname = "" + self._diagname = "" + self._servicetag = "" + + if conf is not None: + self.name = conf.get('name', None) + self.e2loc = conf.get('e2loc', None) + self.e2_path = self.e2loc.get('loc', None) + self.airflow = conf.get('airflow', "intake") + + @property + def cardid(self): + return self._cardid + + @property + def productname(self): + return self._productname + + @property + def partnum(self): + return self._partnum + + @property + def serialnum(self): + return self._serialnum + + @property + def macbase(self): + return self._macbase + + @property + def manufdate(self): + return self._manufdate + + @property + def deviceversion(self): + return self._deviceversion + + @property + def labelrevision(self): + return self._labelrevision + + @property + def platformname(self): + return self._platformname + + @property + def onieversion(self): + return self._onieversion + + @property + def macsize(self): + return self._macsize + + @property + def manufname(self): + return self._manufname + + @property + def manufcountry(self): + return self._manufcountry + + @property + def vendorname(self): + return self._vendorname + + @property + def diagname(self): + return self._diagname + + @property + def servicetag(self): + return self._servicetag + + def get_onie_e2_info(self): + try: + eeprom = self.get_eeprom_info(self.e2loc) + if eeprom is None: + raise Exception("%s: value is none" % self.name) + onietlv = onie_tlv() + onietlv.decode(eeprom) + self._cardid = onietlv.cardid + self._productname = onietlv.productname + self._partnum = onietlv.partnum + self._serialnum = onietlv.serialnum + self._macbase = onietlv.macbase + self._manufdate = onietlv.manufdate + self._deviceversion = onietlv.deviceversion + self._labelrevision = onietlv.labelrevision + self._platformname = onietlv.platformname + self._onieversion = onietlv.onieversion + self._macsize = onietlv.macsize + self._manufname = onietlv.manufname + self._manufcountry = onietlv.manufcountry + self._vendorname = onietlv.vendorname + self._diagname = onietlv.diagname + self._servicetag = onietlv.servicetag + except Exception: + return False + return True diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py new file mode 100644 index 000000000000..684e26bb9ecd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py @@ -0,0 +1,440 @@ +#!/usr/bin/env python3 +####################################################### +# +# osutil.py +# Python implementation of the Class osutil +# +####################################################### + +import os +import glob +import re +import time +import subprocess +import fcntl +import syslog +from functools import wraps +from wbutil.smbus import SMBus + + +PLATFORM_HAL_DEBUG_FILE = "/etc/.platform_hal_debug_flag" + + +def platform_hal_debug(s): + if os.path.exists(PLATFORM_HAL_DEBUG_FILE): + syslog.openlog("PLATFORM_HAL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def retry(maxretry=6, delay=0.01): + ''' + maxretry: max retry times + delay : interval after last retry + ''' + def decorator(f): + @wraps(f) + def wrapper(*args, **kwargs): + time_retry = maxretry + time_delay = delay + result_msg = "" + while time_retry: + try: + val, result_msg = f(*args, **kwargs) + if val is True: + return val, result_msg + time_retry -= 1 + time.sleep(time_delay) + except Exception as e: + time_retry -= 1 + result_msg = str(e) + time.sleep(time_delay) + return False, "max time retry last errmsg is {}".format(result_msg) + return wrapper + return decorator + + +pidfile = None + + +def file_rw_lock(file_path): + global pidfile + pidfile = open(file_path, "r") + try: + fcntl.flock(pidfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + platform_hal_debug("file_rw_lock success") + return True + except Exception: + if pidfile is not None: + pidfile.close() + pidfile = None + return False + + +def file_rw_unlock(): + try: + global pidfile + + if pidfile is not None: + fcntl.flock(pidfile, fcntl.LOCK_UN) + pidfile.close() + pidfile = None + platform_hal_debug("file_rw_unlock success") + else: + platform_hal_debug("pidfile is invalid, do nothing") + return True + except Exception as e: + platform_hal_debug("file_rw_unlock err, msg: %s" % (str(e))) + return False + + +def take_file_rw_lock(file_path): + loop = 1000 + ret = False + for i in range(0, loop): + ret = file_rw_lock(file_path) + if ret is True: + break + time.sleep(0.001) + return ret + + +class osutil(object): + """ + osutil + """ + + @staticmethod + @retry(maxretry=6) + def wbi2cget_python(bus, addr, reg): + with SMBus(bus) as y: + val, ind = y.read_byte_data(addr, reg, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2cset_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_byte_data(addr, reg, value, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2cgetword_python(bus, addr, reg): + with SMBus(bus) as y: + val, ind = y.read_word_data(addr, reg, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2csetword_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_word_data(addr, reg, value, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2csetwordpec_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_word_data_pec(addr, reg, value, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2cset_byte_pec_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_byte_data_pec(addr, reg, value, True) + return val, ind + + @staticmethod + def command(cmdstr): + retcode, output = subprocess.getstatusoutput(cmdstr) + return retcode, output + + @staticmethod + def geti2cword_i2ctool(bus, addr, offset): + command_line = "i2cget -f -y %d 0x%02x 0x%02x wp" % (bus, addr, offset) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, int(ret_t, 16) + time.sleep(0.1) + return False, ret_t + + @staticmethod + def seti2cword_i2ctool(bus, addr, offset, val): + command_line = "i2cset -f -y %d 0x%02x 0x%0x 0x%04x wp" % (bus, addr, offset, val) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, ret_t + time.sleep(0.1) + return False, ret_t + + @staticmethod + def wbi2cget_i2ctool(bus, devno, address): + command_line = "i2cget -f -y %d 0x%02x 0x%02x " % (bus, devno, address) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, int(ret_t, 16) + time.sleep(0.1) + return False, ret_t + + @staticmethod + def wbi2cset_i2ctool(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + @staticmethod + def geti2cword(bus, addr, offset): + return osutil.wbi2cgetword_python(bus, addr, offset) + + @staticmethod + def seti2cword(bus, addr, offset, val): + return osutil.wbi2csetword_python(bus, addr, offset, val) + + @staticmethod + def seti2cwordpec(bus, addr, offset, val): + return osutil.wbi2csetwordpec_python(bus, addr, offset, val) + + @staticmethod + def seti2c_byte_pec(bus, addr, offset, val): + return osutil.wbi2cset_byte_pec_python(bus, addr, offset, val) + + @staticmethod + def wbi2cget(bus, devno, address): + return osutil.wbi2cget_python(bus, devno, address) + + @staticmethod + def wbi2cset(bus, devno, address, byte): + return osutil.wbi2cset_python(bus, devno, address, byte) + + @staticmethod + def byteTostr(val): + strtmp = '' + for value in val: + strtmp += chr(value) + return strtmp + + @staticmethod + def io_rd(reg_addr, read_len=1): + try: + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + val = os.read(fd, read_len) + return True, "".join(["%02x" % item for item in val]) + except ValueError as e: + return False, str(e) + except Exception as e: + return False, str(e) + finally: + os.close(fd) + + @staticmethod + def readsysfs(location, flock_path=None): + flock_path_tmp = None + platform_hal_debug("readsysfs, location:%s, flock_path:%s" % (location, flock_path)) + try: + if flock_path is not None: + flock_paths = glob.glob(flock_path) + if len(flock_paths) != 0: + flock_path_tmp = flock_paths[0] + platform_hal_debug("try to get file lock, path:%s" % flock_path_tmp) + ret = take_file_rw_lock(flock_path_tmp) + if ret is False: + platform_hal_debug("take file lock timeout, path:%s" % flock_path_tmp) + return False, ("take file rw lock timeout, path:%s" % flock_path_tmp) + else: + platform_hal_debug("config error, can't find flock_path:%s" % flock_path) + + locations = glob.glob(location) + with open(locations[0], 'rb') as fd1: + retval = fd1.read() + retval = osutil.byteTostr(retval) + if flock_path_tmp is not None: + file_rw_unlock() + + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + except Exception as e: + if flock_path_tmp is not None: + file_rw_unlock() + platform_hal_debug("readsysfs error, msg:%s" % str(e)) + return False, (str(e) + " location[%s]" % location) + return True, retval + + @staticmethod + def writesysfs(location, value): + try: + if not os.path.isfile(location): + print(location, 'not found !') + return False, ("location[%s] not found !" % location) + with open(location, 'w') as fd1: + fd1.write(value) + except Exception as e: + return False, (str(e) + " location[%s]" % location) + return True, ("set location[%s] %s success !" % (location, value)) + + @staticmethod + def getdevmem(addr, digit, mask): + command_line = "devmem 0x%02x %d" % (addr, digit) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + if mask is not None: + ret_t = str(int(ret_t, 16) & mask) + return True, ret_t + return False, ret_t + + @staticmethod + def readdevfile_ascii(path, offset, length): + msg = "" + ret = "" + joinstr = '' + fd = -1 + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, length) + for item in ret: + joinstr += '%02x ' % item # like sysfs, display in hex + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + return True, joinstr + + @staticmethod + def readdevfile(path, offset, length): + msg = "" + ret = "" + fd = -1 + val_list = [] + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, length) + for item in ret: + val_list.append(item) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + return True, val_list + + @staticmethod + def writedevfile(path, offset, buf): + msg = "" + fd = -1 + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + if isinstance(buf, list): + if len(buf) == 0: + msg = "buf:%s is NONE !" % buf + return False, msg + elif isinstance(buf, int): + buf = [buf] + else: + msg = "buf:%s is not list type or not int type !" % buf + return False, msg + + try: + fd = os.open(path, os.O_WRONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.write(fd, bytes(buf)) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + + return True, ret + + @staticmethod + def wb_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + return status, output + + @staticmethod + def getsdkreg(reg): + try: + cmd = "bcmcmd -t 1 'getr %s ' < /dev/null" % reg + ret, result = osutil.wb_os_system(cmd) + result_t = result.strip().replace("\r", "").replace("\n", "") + if ret != 0 or "Error:" in result_t: + return False, result + patt = r"%s.(.*):(.*)>drivshell" % reg + rt = re.findall(patt, result_t, re.S) + test = re.findall("=(.*)", rt[0][0])[0] + except Exception as e: + return False, 'get sdk register error, msg: %s' % str(e) + return True, test + + @staticmethod + def getmactemp(): + try: + result = {} + # need to exec twice + osutil.wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + ret, log = osutil.wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + if ret: + return False, result + logs = log.splitlines() + for line in logs: + if "average" in line: + b = re.findall(r'\d+.\d+', line) + result["average"] = b[0] + elif "maximum" in line: + b = re.findall(r'\d+.\d+', line) + result["maximum"] = b[0] + except Exception as e: + return False, str(e) + return True, result + + @staticmethod + def std_match(stdout, pattern): + if pattern is None: + return stdout.strip() + for line in stdout.splitlines(): + if re.match(pattern, line): + return line.strip() + return None diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py new file mode 100644 index 000000000000..e7db0cdcca8b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py @@ -0,0 +1,607 @@ +#!/usr/bin/env python3 +####################################################### +# +# psu.py +# Python implementation of the Class psu +# +####################################################### +from eepromutil.fru import ipmifru +from plat_hal.devicebase import devicebase +from plat_hal.sensor import sensor + + +class psu(devicebase): + __pmbus = None + __e2loc = None + __productManufacturer = None # : ARTESYN + __productName = None # : CRPS550W + __productPartModelName = None # : CSU550AP-3-300 + __productVersion = None # : AB + __productSerialNumber = None # : M623UZ00JYABL + __AirFlow = None # 'N/A' + __AirFlowconifg = None + __psu_display_name = None # 'N/A' + __psu_display_name_conifg = None + __psu_not_present_pwm = None + __InputStatus_config = None + __OutputStatus_config = None + __FanSpeed_config = None + __Temperature_config = None + __InputStatus = None + __OutputStatus = None + __FanSpeed = None + __Temperature = None + __FanSpeedMin = None + __FanSpeedMax = None + __FanSpeedTolerance = None + __InputsVoltage_config = None + __InputsCurrent_config = None + __InputsPower_config = None + __OutputsVoltage_config = None + __OutputsCurrent_config = None + __OutputsPower_config = None + __InputsVoltage = {} + __InputsCurrent = None + __InputsPower = None + __OutputsVoltage = None + __OutputsCurrent = None + __OutputsPower = None + __InputsType_config = None + __InputsType = None + __psu_sn_config = None + __psu_hw_config = None + __psu_pn_config = None + __psu_vendor_config = None + __TempStatus_config = None + __FanStatus_config = None + __TempStatus = None + __FanStatus = None + + def __init__(self, conf=None): + self.pmbus = conf.get("pmbusloc", None) + self.e2loc = conf.get("e2loc", None) + self.__presentconfig = conf.get("present", None) + self.name = conf.get("name", None) + self.AirFlowconifg = conf.get("airflow", None) + self.psu_display_name_conifg = conf.get("psu_display_name", None) + self.psu_not_present_pwm = conf.get("psu_not_present_pwm", 100) + self.Temperature_config = conf.get("Temperature", None) + self.Temperature = sensor(self.Temperature_config) + + self.FanSpeedTolerance = conf.get('psu_fan_tolerance', 30) + self.FanSpeed_config = conf.get("FanSpeed", None) + self.FanSpeed = sensor(self.FanSpeed_config) + + self.__InputsVoltage_config = conf.get("InputsVoltage", None) + self.generate_psu_input_vol(self.__InputsVoltage_config) + self.__InputsCurrent_config = conf.get("InputsCurrent", None) + self.InputsCurrent = sensor(self.__InputsCurrent_config) + self.__InputsPower_config = conf.get("InputsPower", None) + self.InputsPower = sensor(self.__InputsPower_config) + self.__OutputsVoltage_config = conf.get("OutputsVoltage", None) + self.OutputsVoltage = sensor(self.__OutputsVoltage_config) + self.__OutputsCurrent_config = conf.get("OutputsCurrent", None) + self.OutputsCurrent = sensor(self.__OutputsCurrent_config) + self.__OutputsPower_config = conf.get("OutputsPower", None) + self.OutputsPower = sensor(self.__OutputsPower_config) + + self.__InputStatus_config = conf.get("InputsStatus", None) + self.__OutputStatus_config = conf.get("OutputsStatus", None) + self.__InputsType_config = conf.get('InputsType', None) + self.__psu_sn_config = conf.get('psu_sn', None) + self.__psu_hw_config = conf.get('psu_hw', None) + self.__psu_pn_config = conf.get('psu_pn', None) + self.__psu_vendor_config = conf.get('psu_vendor', None) + self.__TempStatus_config = conf.get("TempStatus", None) + self.__FanStatus_config = conf.get("FanStatus", None) + + def generate_psu_input_vol(self, config): + tmp = {} + for (key, item) in config.items(): + tmp.setdefault(key, sensor(item)) + self.__InputsVoltage = tmp + + def get_psu_sensor_by_name(self, psutype): + return self.__InputsVoltage.get(psutype) or self.__InputsVoltage.get('other') + + @property + def InputsVoltage(self): + psutype = self.InputsType + input_sensor = self.get_psu_sensor_by_name(psutype) + if input_sensor is None: + return None + return input_sensor + + @InputsVoltage.setter + def InputsVoltage(self, val): + self.__InputsVoltage = val + + @property + def InputsCurrent(self): + return self.__InputsCurrent + + @InputsCurrent.setter + def InputsCurrent(self, val): + self.__InputsCurrent = val + + @property + def InputsPower(self): + return self.__InputsPower + + @InputsPower.setter + def InputsPower(self, val): + self.__InputsPower = val + + @property + def OutputsVoltage(self): + return self.__OutputsVoltage + + @OutputsVoltage.setter + def OutputsVoltage(self, val): + self.__OutputsVoltage = val + + @property + def OutputsCurrent(self): + return self.__OutputsCurrent + + @OutputsCurrent.setter + def OutputsCurrent(self, val): + self.__OutputsCurrent = val + + @property + def OutputsPower(self): + return self.__OutputsPower + + @OutputsPower.setter + def OutputsPower(self, val): + self.__OutputsPower = val + + @property + def InputStatus(self): + if self.present is False: + self.__InputStatus = False + else: + ret, val = self.get_value(self.__InputStatus_config) + mask = self.__InputStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__InputStatus = True + else: + self.__InputStatus = False + else: + self.__InputStatus = False + return self.__InputStatus + + @InputStatus.setter + def InputStatus(self, val): + self.__InputStatus = val + + @property + def TempStatus(self): + if self.__TempStatus_config is None: + return None + if self.present is False: + self.__TempStatus = False + else: + ret, val = self.get_value(self.__TempStatus_config) + mask = self.__TempStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__TempStatus = True + else: + self.__TempStatus = False + else: + self.__TempStatus = False + return self.__TempStatus + + @TempStatus.setter + def TempStatus(self, val): + self.__TempStatus = val + + @property + def FanStatus(self): + if self.__FanStatus_config is None: + return None + if self.present is False: + self.__FanStatus = False + else: + ret, val = self.get_value(self.__FanStatus_config) + mask = self.__FanStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__FanStatus = True + else: + self.__FanStatus = False + else: + self.__FanStatus = False + return self.__FanStatus + + @FanStatus.setter + def FanStatus(self, val): + self.__FanStatus = val + + @property + def InputsType(self): + psutypedecode = self.__InputsType_config.get('psutypedecode', None) + if self.present is False: + self.__InputsType = psutypedecode.get(0x00) + else: + ret, val = self.get_value(self.__InputsType_config) + self.__InputsType = self.__InputsType_config.get(val, None) + if self.__InputsType is not None: + return self.__InputsType + if ret is True and val in psutypedecode: + self.__InputsType = psutypedecode.get(val) + else: + self.__InputsType = psutypedecode.get(0x00) + return self.__InputsType + + @InputsType.setter + def InputsType(self, val): + self.__InputsType = val + + @property + def FanSpeedMin(self): + return self.__FanSpeedMin + + @FanSpeedMin.setter + def FanSpeedMin(self, val): + self.__FanSpeedMin = val + + @property + def FanSpeedMax(self): + return self.__FanSpeedMax + + @FanSpeedMax.setter + def FanSpeedMax(self, val): + self.__FanSpeedMax = val + + @property + def FanSpeedTolerance(self): + return self.__FanSpeedTolerance + + @FanSpeedTolerance.setter + def FanSpeedTolerance(self, val): + self.__FanSpeedTolerance = val + + @property + def OutputStatus(self): + if self.present is False: + self.__OutputStatus = False + else: + ret, val = self.get_value(self.__OutputStatus_config) + mask = self.__OutputStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__OutputStatus = True + else: + self.__OutputStatus = False + else: + self.__OutputStatus = False + return self.__OutputStatus + + @OutputStatus.setter + def OutputStatus(self, val): + self.__OutputStatus = val + + @property + def FanSpeed(self): + return self.__FanSpeed + + @FanSpeed.setter + def FanSpeed(self, val): + self.__FanSpeed = val + + @property + def Temperature(self): + return self.__Temperature + + @Temperature.setter + def Temperature(self, val): + self.__Temperature = val + + @property + def Temperature_config(self): + return self.__Temperature_config + + @Temperature_config.setter + def Temperature_config(self, val): + self.__Temperature_config = val + + @property + def AirFlowconifg(self): + return self.__AirFlowconifg + + @AirFlowconifg.setter + def AirFlowconifg(self, val): + self.__AirFlowconifg = val + + @property + def psu_display_name_conifg(self): + return self.__psu_display_name_conifg + + @psu_display_name_conifg.setter + def psu_display_name_conifg(self, val): + self.__psu_display_name_conifg = val + + @property + def pmbus(self): + return self.__pmbus + + @pmbus.setter + def pmbus(self, val): + self.__pmbus = val + + @property + def e2loc(self): + return self.__e2loc + + @e2loc.setter + def e2loc(self, val): + self.__e2loc = val + + @property + def AirFlow(self): + return self.__AirFlow + + @AirFlow.setter + def AirFlow(self, val): + self.__AirFlow = val + + @property + def psu_display_name(self): + return self.__psu_display_name + + @psu_display_name.setter + def psu_display_name(self, val): + self.__psu_display_name = val + + @property + def psu_not_present_pwm(self): + return self.__psu_not_present_pwm + + @psu_not_present_pwm.setter + def psu_not_present_pwm(self, val): + self.__psu_not_present_pwm = val + + @property + def present(self): + ret, val = self.get_value(self.__presentconfig) + if ret is False or val is None: + return False + mask = self.__presentconfig.get("mask") + if isinstance(val, str): + value = int(val, 16) + else: + value = val + ttt = value & mask + okval = self.__presentconfig.get("okval", 0) + if ttt == okval: + return True + return False + + @property + def productManufacturer(self): + return self.__productManufacturer + + @productManufacturer.setter + def productManufacturer(self, val): + self.__productManufacturer = val + + @property + def productName(self): + return self.__productName + + @productName.setter + def productName(self, val): + self.__productName = val + + @property + def productPartModelName(self): + return self.__productPartModelName + + @productPartModelName.setter + def productPartModelName(self, val): + self.__productPartModelName = val + + @property + def productVersion(self): + return self.__productVersion + + @productVersion.setter + def productVersion(self, val): + self.__productVersion = val + + @property + def productSerialNumber(self): + return self.__productSerialNumber + + @productSerialNumber.setter + def productSerialNumber(self, val): + self.__productSerialNumber = val + + @property + def psu_sn_sysfs(self): + if self.__psu_sn_config is None: + return None + ret, val = self.get_value(self.__psu_sn_config) + if ret is False or val is None: + return None + return val + + @property + def psu_hw_sysfs(self): + if self.__psu_hw_config is None: + return None + ret, val = self.get_value(self.__psu_hw_config) + if ret is False or val is None: + return None + return val + + @property + def psu_pn_sysfs(self): + if self.__psu_pn_config is None: + return None + ret, val = self.get_value(self.__psu_pn_config) + if ret is False or val is None: + return None + return val + + @property + def psu_vendor_sysfs(self): + if self.__psu_vendor_config is None: + return None + ret, val = self.get_value(self.__psu_vendor_config) + if ret is False or val is None: + return None + return val + + def __str__(self): + formatstr = \ + "name : %s \n" \ + "productManufacturer : %s \n" \ + "productName : %s \n" \ + "productPartModelName: %s \n" \ + "productVersion : %s \n" \ + "productSerialNumber : %s \n" \ + "AirFlow : %s \n" \ + + tmpstr = formatstr % (self.name, self.productManufacturer, + self.productName, self.productPartModelName, + self.productVersion, self.productSerialNumber, self.AirFlow) + return tmpstr + + def get_fan_speed_pwm(self): + if self.present is False: + return self.psu_not_present_pwm + selfconfig = {} + selfconfig['bus'] = self.pmbus['bus'] + selfconfig['addr'] = self.pmbus['addr'] + selfconfig['way'] = 'i2cword' + selfconfig['offset'] = 0x3b + ret, val = self.get_value(selfconfig) + if ret is True: + return val + return None + + def set_fan_speed_pwm(self, pwm): + ''' + pmbus + if duty: + i2cset -f -y 0x3b 0x0064 wp + ''' + if self.present is False: + return None + if 0 <= pwm <= 100: + # enable duty first + selfconfig = {} + + selfconfig['bus'] = self.pmbus['bus'] + selfconfig['addr'] = self.pmbus['addr'] + selfconfig['way'] = 'i2cpec' + selfconfig['offset'] = 0x3a + self.set_value(selfconfig, 0x80) + + selfconfig['way'] = 'i2cwordpec' + selfconfig['offset'] = 0x3b + bytetmp = pwm + ret, val = self.set_value(selfconfig, int(bytetmp)) + if ret is True: + return True + return None + raise Exception("pwm not in range [0,100]") + + def get_fru_info_by_sysfs(self): + try: + psu_sn = self.psu_sn_sysfs + psu_hw = self.psu_hw_sysfs + psu_pn = self.psu_pn_sysfs + psu_vendor = self.psu_vendor_sysfs + if psu_sn is None or psu_hw is None or psu_pn is None or psu_vendor is None: + return False + self.productSerialNumber = psu_sn.strip().replace(chr(0), "") + self.productVersion = psu_hw.strip() + self.productPartModelName = psu_pn.strip() + self.productManufacturer = psu_vendor.strip().replace(chr(0), "") + except Exception: + self.productSerialNumber = None + self.productVersion = None + self.productPartModelName = None + self.productManufacturer = None + return False + return True + + def get_fru_info_by_decode(self): + try: + eeprom = self.get_eeprom_info(self.e2loc) + if eeprom is None: + raise Exception("%s:value is none" % self.name) + fru = ipmifru() + if isinstance(eeprom, bytes): + eeprom = self.byteTostr(eeprom) + fru.decodeBin(eeprom) + if fru.productInfoArea is not None: + self.productManufacturer = fru.productInfoArea.productManufacturer.strip() + self.productName = fru.productInfoArea.productName.strip() + self.productPartModelName = fru.productInfoArea.productPartModelName.strip() + self.productVersion = fru.productInfoArea.productVersion.strip() + self.productSerialNumber = fru.productInfoArea.productSerialNumber.strip().replace(chr(0), "") + except Exception: + self.productManufacturer = None + self.productName = None + self.productPartModelName = None + self.productVersion = None + self.productSerialNumber = None + return False + return True + + def get_fru_info(self): + try: + if self.present is not True: + raise Exception("%s: not present" % self.name) + if self.get_fru_info_by_sysfs() is True: + return True + return self.get_fru_info_by_decode() + except Exception: + self.productManufacturer = None + self.productName = None + self.productPartModelName = None + self.productVersion = None + self.productSerialNumber = None + return False + + def get_AirFlow(self): + if self.productPartModelName is None: + ret = self.get_fru_info() + if ret is False: + self.AirFlow = None + return False + if self.AirFlowconifg is None: + self.AirFlow = None + return False + for i in self.AirFlowconifg: + if self.productPartModelName in self.AirFlowconifg[i]: + self.AirFlow = i + return True + self.AirFlow = None + return False + + def get_psu_display_name(self): + if self.productPartModelName is None: + ret = self.get_fru_info() + if ret is False: + self.psu_display_name = None + return False + if self.psu_display_name_conifg is None: + self.psu_display_name = self.productPartModelName + return False + for i in self.psu_display_name_conifg: + if self.productPartModelName in self.psu_display_name_conifg[i]: + self.psu_display_name = i + return True + self.psu_display_name = self.productPartModelName + return False diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py new file mode 100644 index 000000000000..2b4e4ffd5f0e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +####################################################### +# +# rotor.py +# Python implementation of the Class rotor +# +####################################################### +from plat_hal.devicebase import devicebase +from plat_hal.sensor import sensor + + +class rotor(devicebase): + __rotor_Running = None + __rotor_HwAlarm_conf = None + __rotor_Speed = None + __rotor_run_conf = None + __Speedconfig = None + __i2c_speed = None + __SpeedMin = None + __SpeedMax = None + __SpeedTolerance = None + + def __init__(self, conf=None): + self.name = conf.get('name', None) + self.rotor_HwAlarm_conf = conf.get('HwAlarm', None) + self.rotor_run_conf = conf.get('Running', None) + self.SpeedMin = conf.get('SpeedMin', None) + self.SpeedMax = conf.get('SpeedMax', None) + self.Tolerance = conf.get('tolerance', 30) + self.rotor_Speed = sensor(conf.get('Speed', None)) + self.Speedconfig = conf.get('Set_speed', None) + + def getRunning(self): + ret, val = self.get_value(self.rotor_run_conf) + if ret is False or val is None: + return False + if isinstance(val, str): + value = int(val, 16) + else: + value = val + mask = self.rotor_run_conf.get("mask") + is_runing_value = self.rotor_run_conf.get("is_runing") + flag = value & mask + if flag == is_runing_value: + return True + return False + + @property + def SpeedMin(self): + return self.__SpeedMin + + @SpeedMin.setter + def SpeedMin(self, val): + self.__SpeedMin = val + + @property + def SpeedMax(self): + return self.__SpeedMax + + @SpeedMax.setter + def SpeedMax(self, val): + self.__SpeedMax = val + + @property + def Tolerance(self): + return self.__SpeedTolerance + + @Tolerance.setter + def Tolerance(self, val): + self.__SpeedTolerance = val + + @property + def i2c_speed(self): + ret, val = self.get_value(self.Speedconfig) + if ret is False: + return None + if val is not None: + self.__i2c_speed = val + return self.__i2c_speed + + def feed_watchdog(self): + ret, val = self.get_value(self.Speedconfig) + if ret is False: + return False, None + if val is not None: + ret, val = self.set_value(self.Speedconfig, val) + return ret, val + return False, None + + @i2c_speed.setter + def i2c_speed(self, val): + self.__i2c_speed = val + + @property + def Speedconfig(self): + return self.__Speedconfig + + @Speedconfig.setter + def Speedconfig(self, val): + self.__Speedconfig = val + + @property + def rotor_run_conf(self): + return self.__rotor_run_conf + + @rotor_run_conf.setter + def rotor_run_conf(self, val): + self.__rotor_run_conf = val + + @property + def rotor_Speed(self): + return self.__rotor_Speed + + @rotor_Speed.setter + def rotor_Speed(self, val): + self.__rotor_Speed = val + + @property + def rotor_HwAlarm(self): + ret, val = self.get_value(self.rotor_HwAlarm_conf) + mask = self.rotor_HwAlarm_conf.get("mask") + no_alarm_value = self.rotor_HwAlarm_conf.get("no_alarm") + if ret is False or val is None: + return False + if isinstance(val, str): + value = int(val, 16) + else: + value = val + flag = value & mask + if flag == no_alarm_value: + return False + return True + + @property + def rotor_HwAlarm_conf(self): + return self.__rotor_HwAlarm_conf + + @rotor_HwAlarm_conf.setter + def rotor_HwAlarm_conf(self, val): + self.__rotor_HwAlarm_conf = val + + @property + def rotor_Running(self): + self.__rotor_Running = self.getRunning() + return self.__rotor_Running + + @rotor_Running.setter + def rotor_Running(self, val): + self.__rotor_Running = val diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py new file mode 100644 index 000000000000..2b4e05e00e43 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python3 +####################################################### +# +# sensor.py +# Python implementation of the Class sensor +# +####################################################### +import time +from plat_hal.devicebase import devicebase + + +class sensor(devicebase): + + __Value = None + __Min = None + __Max = None + __Low = None + __High = None + __ValueConfig = None + __Flag = None + __Unit = None + __format = None + __read_times = None + + __Min_config = None + __Max_config = None + __Low_config = None + __High_config = None + + @property + def Min_config(self): + return self.__Min_config + + @Min_config.setter + def Min_config(self, val): + self.__Min_config = val + + @property + def Max_config(self): + return self.__Max_config + + @Max_config.setter + def Max_config(self, val): + self.__Max_config = val + + @property + def Low_config(self): + return self.__Low_config + + @Low_config.setter + def Low_config(self, val): + self.__Low_config = val + + @property + def High_config(self): + return self.__High_config + + @High_config.setter + def High_config(self, val): + self.__High_config = val + + @property + def Unit(self): + return self.__Unit + + @Unit.setter + def Unit(self, val): + self.__Unit = val + + @property + def format(self): + return self.__format + + @format.setter + def format(self, val): + self.__format = val + + @property + def read_times(self): + return self.__read_times + + @read_times.setter + def read_times(self, val): + self.__read_times = val + + @property + def ValueConfig(self): + return self.__ValueConfig + + @ValueConfig.setter + def ValueConfig(self, val): + self.__ValueConfig = val + + @property + def Flag(self): + return self.__Flag + + @Flag.setter + def Flag(self, val): + self.__Flag = val + + def get_median(self, value_config, read_times): + val_list = [] + for i in range(0, read_times): + ret, real_value = self.get_value(value_config) + if i != (read_times - 1): + time.sleep(0.01) + if ret is False or real_value is None: + continue + val_list.append(real_value) + val_list.sort() + if val_list: + return True, val_list[int((len(val_list) - 1) / 2)] + return False, None + + @property + def Value(self): + try: + ret, val = self.get_median(self.ValueConfig, self.read_times) + if ret is False or val is None: + return None + if self.format is None: + self.__Value = int(val) + else: + self.__Value = self.get_format_value(self.format % val) + self.__Value = round(float(self.__Value), 3) + except Exception: + return None + return self.__Value + + @Value.setter + def Value(self, val): + self.__Value = val + + @property + def Min(self): + try: + if self.format is None: + self.__Min = self.Min_config + else: + self.__Min = self.get_format_value(self.format % self.Min_config) + self.__Min = round(float(self.__Min), 3) + except Exception: + return None + return self.__Min + + @Min.setter + def Min(self, val): + self.__Min = val + + @property + def Max(self): + try: + if self.format is None: + self.__Max = self.Max_config + else: + self.__Max = self.get_format_value(self.format % self.Max_config) + self.__Max = round(float(self.__Max), 3) + except Exception: + return None + return self.__Max + + @Max.setter + def Max(self, val): + self.__Max = val + + @property + def Low(self): + try: + if self.format is None: + self.__Low = self.Low_config + else: + self.__Low = self.get_format_value(self.format % self.Low_config) + except Exception: + return None + return self.__Low + + @Low.setter + def Low(self, val): + self.__Low = val + + @property + def High(self): + try: + if self.format is None: + self.__High = self.High_config + else: + self.__High = self.get_format_value(self.format % self.High_config) + except Exception: + return None + return self.__High + + @High.setter + def High(self, val): + self.__High = val + + def __init__(self, conf=None): + self.ValueConfig = conf.get("value", None) + self.Flag = conf.get("flag", None) + self.Min_config = conf.get("Min", None) + self.Max_config = conf.get("Max", None) + self.Low_config = conf.get("Low", None) + self.High_config = conf.get("High", None) + self.Unit = conf.get('Unit', None) + self.format = conf.get('format', None) + self.read_times = conf.get('read_times', 1) + + def __str__(self): + formatstr = \ + "ValueConfig: : %s \n" \ + "Min : %s \n" \ + "Max : %s \n" \ + "Unit : %s \n" \ + "format: : %s \n" + + tmpstr = formatstr % (self.ValueConfig, self.Min, + self.Max, self.Unit, + self.format) + return tmpstr diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py new file mode 100644 index 000000000000..a202c20339c9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +####################################################### +# +# temp.py +# Python implementation of the Class temp +# +####################################################### +import os +import syslog +from plat_hal.sensor import sensor + + +PLATFORM_HAL_TEMP_DEBUG_FILE = "/etc/.platform_hal_temp_debug_flag" + + +def platform_hal_temp_debug(s): + if os.path.exists(PLATFORM_HAL_TEMP_DEBUG_FILE): + syslog.openlog("PLATFORM_HAL_TEPM", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class temp(sensor): + def __init__(self, conf=None): + super(temp, self).__init__(conf.get('Temperature', None)) + self.name = conf.get("name", None) + self.temp_id = conf.get("temp_id", None) + self.api_name = conf.get("api_name", self.name) + self.fix_value = conf.get("fix_value", None) + self.temp_invalid = conf.get("invalid", None) + self.temp_error = conf.get("error", None) + + def temp_cali_by_fan_pwm(self, param, origin_value): + fan_pwm_conf = param.get("fan_pwm") + temp_fix_list = param.get("temp_fix_list") + + ret, val = self.get_value(fan_pwm_conf) + if ret is False or val is None: + platform_hal_temp_debug("temp calibration get fan pwm failed, msg: %s, return None" % (val)) + return None + + fan_pwm = int(val) + for item in temp_fix_list: + if item["min"] <= fan_pwm <= item["max"]: + fix_value = origin_value + item["fix"] + platform_hal_temp_debug("temp calibration by fan pwm, origin_value: %s, pwm: %s, fix_value: %s" % + (origin_value, fan_pwm, fix_value)) + return fix_value + platform_hal_temp_debug("temp calibration by fan pwm, origin_value: %s, pwm: %s, not match return None" % + (origin_value, fan_pwm)) + return None + + def fix_temp_value(self, origin_value): + try: + fix_type = self.fix_value.get("fix_type") + + if fix_type == "func": + func_name = self.fix_value.get("func_name") + func_param = self.fix_value.get("func_param") + func = getattr(self, func_name) + if func is None: + platform_hal_temp_debug("function %s, not defined" % func_name) + return None + value = func(func_param, origin_value) + return value + + if fix_type == "config": + coefficient = self.fix_value.get("coefficient", 1) + addend = self.fix_value.get("addend", 0) + value = (origin_value + addend) * coefficient + platform_hal_temp_debug("temp calibration by config, coefficient: %s, addend: %s, origin_value: %s, fix_value: %s" % + (coefficient, addend, origin_value, value)) + return value + + platform_hal_temp_debug("unsupport fix type: %s, return origin value: %s" % (fix_type, origin_value)) + return origin_value + except Exception as e: + platform_hal_temp_debug("fix_temp_value raise exception, msg: %s" % (str(e))) + return None + + def get_max_value(self, conf): + try: + ret, val = self.get_value(conf) + if ret is False or val is None: + return None + return val + except Exception: + return None + + def check_flag(self): + try: + okbit = self.Flag.get('okbit') + okval = self.Flag.get('okval') + ret, val = self.get_value(self.Flag) + if (ret is False) or (val is None): + return False + val_t = (int(val) & (1 << okbit)) >> okbit + if val_t != okval: + return False + except Exception: + return False + return True + + @property + def Value(self): + try: + if self.Flag is not None: + if self.check_flag() is False: + return None + if isinstance(self.ValueConfig, list): + max_val = None + for i in self.ValueConfig: + tmp = self.get_max_value(i) + if tmp is None: + continue + if max_val is None or max_val < tmp: + max_val = tmp + if max_val is None: + return None + if self.format is None: + self.__Value = int(max_val) + else: + self.__Value = self.get_format_value(self.format % max_val) + else: + ret, val = self.get_value(self.ValueConfig) + if ret is False or val is None: + return None + if self.format is None: + self.__Value = int(val) + else: + self.__Value = self.get_format_value(self.format % val) + except Exception: + return None + if self.fix_value is not None and self.__Value != self.temp_invalid and self.__Value != self.temp_error: + self.__Value = self.fix_temp_value(self.__Value) + return self.__Value + + @Value.setter + def Value(self, val): + self.__Value = val diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py deleted file mode 100644 index 2b001f21d72c..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: UTF-8 -*- - -import logging -from syslog import ( - syslog, - openlog, - LOG_WARNING, - LOG_CRIT, - LOG_DEBUG, - LOG_ERR, - LOG_PID, - LOG_INFO, -) - -class Logger(): - def __init__(self, prefix, filepath=None, syslog=False, dbg_mask=0x0): - self.logger = None - if syslog is False: - if filepath is None: - raise AttributeError("filepath needed") - - # init logging - formatter = logging.Formatter( "%(asctime)s %(levelname)s %(filename)s[%(funcName)s][%(lineno)s]: %(message)s") - handler = logging.FileHandler(self.filepath) - handler.setFormatter(formatter) - self.logger = logging.getLogger(__name__) - self.logger.setLevel(logging.DEBUG) - self.logger.addHandler(handler) - - self.prefix = prefix - self.use_syslog = syslog - self.dbg_mask = dbg_mask - - def info(self, s): - if self.use_syslog: - self._syslog(s, LOG_INFO) - else: - self.logger.info(s) - - def debug(self, dbg_lvl, s): - if dbg_lvl & self.dbg_mask: - if self.use_syslog: - self._syslog(s, LOG_DEBUG) - else: - self.logger.debug(s) - - def warn(self, s): - if self.use_syslog: - self._syslog(s, LOG_WARNING) - else: - self.logger.warning(s) - - def error(self, s): - if self.use_syslog: - self._syslog(s, LOG_ERR) - else: - self.logger.error(s) - - def crit(self, s): - if self.use_syslog: - self._syslog(s, LOG_CRIT) - else: - self.logger.critical(s) - - def _syslog(self, s, t): - openlog(self.prefix, LOG_PID) - syslog(t, s) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/baseutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/baseutil.py similarity index 51% rename from platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/baseutil.py rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/baseutil.py index 1cf74d32d22f..340a1f7a733f 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/baseutil.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/baseutil.py @@ -1,6 +1,7 @@ -# -*- coding: UTF-8 -*- +#!/usr/bin/env python3 import os + def get_machine_info(): if not os.path.isfile('/host/machine.conf'): return None @@ -13,11 +14,25 @@ def get_machine_info(): machine_vars[tokens[0]] = tokens[1].strip() return machine_vars + def get_platform_info(machine_info): - if machine_info != None: + if machine_info is not None: if 'onie_platform' in machine_info: - return machine_info['onie_platform'] - elif 'aboot_platform' in machine_info: + return machine_info['onie_platform'] + if 'aboot_platform' in machine_info: return machine_info['aboot_platform'] return None + +def get_board_id(machine_info): + if machine_info is not None: + if 'onie_board_id' in machine_info: + return machine_info['onie_board_id'].lower() + return "NA" + + +def get_onie_machine(machine_info): + if machine_info is not None: + if 'onie_machine' in machine_info: + return machine_info['onie_machine'] + return None diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/smbus.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/smbus.py similarity index 89% rename from platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/smbus.py rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/smbus.py index f3651fe59a4a..5f1659b3bbf0 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/smbus.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/smbus.py @@ -1,4 +1,5 @@ -"""smbus2 - A drop-in replacement for smbus-cffi/smbus-python""" +#!/usr/bin/env python3 +# smbus2 - A drop-in replacement for smbus-cffi/smbus-python # The MIT License (MIT) # Copyright (c) 2017 Karl-Petter Lindegaard # @@ -32,6 +33,7 @@ I2C_FUNCS = 0x0705 # Get the adapter functionality mask I2C_RDWR = 0x0707 # Combined R/W transfer (one STOP only) I2C_SMBUS = 0x0720 # SMBus transfer. Takes pointer to i2c_smbus_ioctl_data +I2C_PEC = 0x0708 # SMBus transfer read or write markers from uapi/linux/i2c.h I2C_SMBUS_WRITE = 0 @@ -43,7 +45,8 @@ I2C_SMBUS_BYTE_DATA = 2 I2C_SMBUS_WORD_DATA = 3 I2C_SMBUS_PROC_CALL = 4 -I2C_SMBUS_BLOCK_DATA = 5 # This isn't supported by Pure-I2C drivers with SMBUS emulation, like those in RaspberryPi, OrangePi, etc :( +# This isn't supported by Pure-I2C drivers with SMBUS emulation, like those in RaspberryPi, OrangePi, etc :( +I2C_SMBUS_BLOCK_DATA = 5 I2C_SMBUS_BLOCK_PROC_CALL = 7 # Like I2C_SMBUS_BLOCK_DATA, it isn't supported by Pure-I2C drivers either. I2C_SMBUS_I2C_BLOCK_DATA = 8 I2C_SMBUS_BLOCK_MAX = 32 @@ -216,12 +219,12 @@ def write(address, buf): :rtype: :py:class:`i2c_msg` """ if sys.version_info.major >= 3: - if type(buf) is str: + if isinstance(buf, str): buf = bytes(map(ord, buf)) else: buf = bytes(buf) else: - if type(buf) is not str: + if not isinstance(buf, str): buf = ''.join([chr(x) for x in buf]) arr = create_string_buffer(buf, len(buf)) return i2c_msg( @@ -406,7 +409,7 @@ def read_byte_data(self, i2c_addr, register, force=None): :rtype: int """ val_t = -1 - returnmsg="" + returnmsg = "" try: self._set_address(i2c_addr, force=force) msg = i2c_smbus_ioctl_data.create( @@ -418,8 +421,7 @@ def read_byte_data(self, i2c_addr, register, force=None): returnmsg = str(e) if val_t < 0: return False, returnmsg - else: - return True, msg.data.contents.byte + return True, msg.data.contents.byte def write_byte_data(self, i2c_addr, register, value, force=None): """ @@ -449,8 +451,40 @@ def write_byte_data(self, i2c_addr, register, value, force=None): self.close() if val_t < 0: return False, returnmsg or "" - else: - return True, "" + return True, "" + + def write_byte_data_pec(self, i2c_addr, register, value, force=None): + """ + Write a byte to a given register. + + :param i2c_addr: i2c address + :type i2c_addr: int + :param register: Register to write to + :type register: int + :param value: Byte value to transmit + :type value: int + :param force: + :type force: Boolean + :rtype: None + """ + val_t = -1 + returnmsg = "" + try: + val_t = ioctl(self.fd, I2C_PEC, 1) + if val_t < 0: + raise Exception("set pec mod error") + self._set_address(i2c_addr, force=force) + msg = i2c_smbus_ioctl_data.create( + read_write=I2C_SMBUS_WRITE, command=register, size=I2C_SMBUS_BYTE_DATA + ) + msg.data.contents.byte = value + val_t = ioctl(self.fd, I2C_SMBUS, msg) + except Exception as e: + returnmsg = str(e) + self.close() + if val_t < 0: + return False, returnmsg or "" + return True, "" def read_word_data(self, i2c_addr, register, force=None): """ @@ -478,8 +512,40 @@ def read_word_data(self, i2c_addr, register, force=None): self.close() if val_t < 0: return False, returnmsg or "" - else: - return True, msg.data.contents.word + return True, msg.data.contents.word + + def write_word_data_pec(self, i2c_addr, register, value, force=None): + """ + Write a byte to a given register. + + :param i2c_addr: i2c address + :type i2c_addr: int + :param register: Register to write to + :type register: int + :param value: Word value to transmit + :type value: int + :param force: + :type force: Boolean + :rtype: None + """ + val_t = -1 + returnmsg = "" + try: + val_t = ioctl(self.fd, I2C_PEC, 1) + if val_t < 0: + raise Exception("set pec mod error") + self._set_address(i2c_addr, force=force) + msg = i2c_smbus_ioctl_data.create( + read_write=I2C_SMBUS_WRITE, command=register, size=I2C_SMBUS_WORD_DATA + ) + msg.data.contents.word = value + val_t = ioctl(self.fd, I2C_SMBUS, msg) + except Exception as e: + returnmsg = str(e) + self.close() + if val_t < 0: + return False, returnmsg or "" + return True, "" def write_word_data(self, i2c_addr, register, value, force=None): """ @@ -509,8 +575,7 @@ def write_word_data(self, i2c_addr, register, value, force=None): self.close() if val_t < 0: return False, returnmsg or "" - else: - return True, "" + return True, "" def process_call(self, i2c_addr, register, value, force=None): """ @@ -685,6 +750,7 @@ class SMBusWrapper: :py:class:`SMBus` handle will be automatically closed upon exit of the ``with`` block. """ + def __init__(self, bus_number=0, auto_cleanup=True, force=False): """ :param auto_cleanup: Close bus when leaving scope. @@ -695,6 +761,7 @@ def __init__(self, bus_number=0, auto_cleanup=True, force=False): self.bus_number = bus_number self.auto_cleanup = auto_cleanup self.force = force + self.bus = None def __enter__(self): self.bus = SMBus(bus=self.bus_number, force=self.force) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf b/platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf new file mode 100644 index 000000000000..5e861802d915 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf @@ -0,0 +1,5 @@ +blacklist wb_fpga_pcie +blacklist wb_i2c_i801 +blacklist wb_spi_gpio +blacklist intel_spi +blacklist intel_spi_platform diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile old mode 100755 new mode 100644 index f7204c8684d9..8727f1f508f1 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile @@ -1,15 +1,55 @@ -obj-m := rg-gpio-xeon.o -obj-m += rg_fan.o -obj-m += rg_psu.o -obj-m += ragile_platform.o -obj-m += i2c-mux-pca9641.o -obj-m += i2c-mux-pca954x.o -obj-m += csu550.o -ragile_common-objs := ragile_common_module.o -obj-m += ragile_common.o -obj-m += fpga_pcie_i2c.o -obj-m += fpga_i2c_ocores.o -obj-m += lpc_dbg.o -obj-m += lpc_cpld_i2c_ocores.o -obj-m += rg-i2c-algo-bit.o -obj-m += rg-i2c-gpio.o +PWD = $(shell pwd) +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +KVERSION ?= $(shell uname -r) +KERNEL_SRC ?= /lib/modules/$(KVERSION) + +module_out_put_dir := $(PWD)/build +export module_out_put_dir + +KERNEL_MODULES_SRC = $(PWD)/linux-5.10 + +PLAT_SYSFS_DIR = $(PWD)/plat_sysfs +INTEL_SPI = $(PWD)/intel_spi + +export PLAT_SYSFS_DIR + +platform_common-objs := platform_common_module.o dfd_tlveeprom.o +obj-m += platform_common.o +obj-m += wb_mac_bsc.o +obj-m += wb_fpga_pcie.o +obj-m += wb_pcie_dev.o +obj-m += wb_fpga_i2c_bus_drv.o +obj-m += wb_fpga_pca954x_drv.o +obj-m += wb_lpc_drv.o +obj-m += wb_i2c_dev.o +obj-m += wb_platform_i2c_dev.o +obj-m += wb_io_dev.o +obj-m += wb_eeprom_93xx46.o +obj-m += wb_spi_93xx46.o +obj-m += wb_gpio_d1500.o +obj-m += wb_gpio_device.o +obj-m += wb_i2c_ocores.o +obj-m += wb_spi_ocores.o +obj-m += wb_spi_dev.o +obj-m += wb_wdt.o +obj-m += wb_optoe.o +obj-m += wb_spi_gpio.o +obj-m += wb_spi_gpio_device.o +obj-m += wb_spi_nor_device.o +obj-m += wb_xdpe132g5c.o +obj-m += wb_uio_irq.o + +all : + $(MAKE) -C $(KERNEL_MODULES_SRC) + $(MAKE) -C $(PLAT_SYSFS_DIR) + $(MAKE) -C $(INTEL_SPI) + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) + +clean : + rm -rf $(module_out_put_dir) + rm -f ${PWD}/*.o ${PWD}/*.ko ${PWD}/*.mod.c ${PWD}/.*.cmd ${PWD}/.*.o.d ${PWD}/*.mod + rm -f ${PWD}/Module.markers ${PWD}/Module.symvers ${PWD}/modules.order + rm -rf ${PWD}/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c deleted file mode 100755 index b1d1a9847218..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * csu550.c - A driver for pmbus - * - * Copyright (c) 2010, 2011 Ericsson AB. - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "pmbus.h" - -struct pmbus_device_info { - int pages; - u32 flags; -}; - -static const struct i2c_device_id pmbus_id[]; - -/* - * Find sensor groups and status registers on each page. - */ -static void pmbus_find_sensor_groups(struct i2c_client *client, - struct pmbus_driver_info *info) -{ - int page; - - /* Sensors detected on page 0 only */ - if (pmbus_check_word_register(client, 0, PMBUS_READ_VIN)) - info->func[0] |= PMBUS_HAVE_VIN; - if (pmbus_check_word_register(client, 0, PMBUS_READ_IIN)) - info->func[0] |= PMBUS_HAVE_IIN; - if (pmbus_check_word_register(client, 0, PMBUS_READ_PIN)) - info->func[0] |= PMBUS_HAVE_PIN; - if (info->func[0] && pmbus_check_byte_register(client, 0, PMBUS_STATUS_INPUT)) - info->func[0] |= PMBUS_HAVE_STATUS_INPUT; - if (pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_12) && - pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_1)) { - info->func[0] |= PMBUS_HAVE_FAN12; - if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_12)) - info->func[0] |= PMBUS_HAVE_STATUS_FAN12; - } - if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1)) - info->func[0] |= PMBUS_HAVE_TEMP; - if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2)) - info->func[0] |= PMBUS_HAVE_TEMP2; - if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3)) - info->func[0] |= PMBUS_HAVE_TEMP3; - if (info->func[0] & (PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3) - && pmbus_check_byte_register(client, 0, PMBUS_STATUS_TEMPERATURE)) - info->func[0] |= PMBUS_HAVE_STATUS_TEMP; - - /* Sensors detected on all pages */ - for (page = 0; page < info->pages; page++) { - if (pmbus_check_word_register(client, page, PMBUS_READ_VOUT)) { - info->func[page] |= PMBUS_HAVE_VOUT; - if (pmbus_check_byte_register(client, page, - PMBUS_STATUS_VOUT)) - info->func[page] |= PMBUS_HAVE_STATUS_VOUT; - } - if (pmbus_check_word_register(client, page, PMBUS_READ_IOUT)) { - info->func[page] |= PMBUS_HAVE_IOUT; - if (pmbus_check_byte_register(client, 0, - PMBUS_STATUS_IOUT)) - info->func[page] |= PMBUS_HAVE_STATUS_IOUT; - } - if (pmbus_check_word_register(client, page, PMBUS_READ_POUT)) - info->func[page] |= PMBUS_HAVE_POUT; - } -} - -/* - * Identify chip parameters. - */ -static int pmbus_identify(struct i2c_client *client, - struct pmbus_driver_info *info) -{ - int ret = 0; - - if (!info->pages) { - /* - * Check if the PAGE command is supported. If it is, - * keep setting the page number until it fails or until the - * maximum number of pages has been reached. Assume that - * this is the number of pages supported by the chip. - */ - if (pmbus_check_byte_register(client, 0, PMBUS_PAGE)) { - int page; - - for (page = 1; page < PMBUS_PAGES; page++) { - if (pmbus_set_page(client, page) < 0) - break; - } - pmbus_set_page(client, 0); - info->pages = page; - } else { - info->pages = 1; - } - } - - if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { - int vout_mode, i; - - vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); - if (vout_mode >= 0 && vout_mode != 0xff) { - switch (vout_mode >> 5) { - case 0: - break; - case 1: - info->format[PSC_VOLTAGE_OUT] = vid; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - for (i = 0; i < info->pages; i++) { - info->vrm_version[i] = vr11; - } -#endif - break; - case 2: - info->format[PSC_VOLTAGE_OUT] = direct; - break; - default: - ret = -ENODEV; - goto abort; - } - } - } - - /* - * We should check if the COEFFICIENTS register is supported. - * If it is, and the chip is configured for direct mode, we can read - * the coefficients from the chip, one set per group of sensor - * registers. - * - * To do this, we will need access to a chip which actually supports the - * COEFFICIENTS command, since the command is too complex to implement - * without testing it. Until then, abort if a chip configured for direct - * mode was detected. - */ - if (info->format[PSC_VOLTAGE_OUT] == direct) { - ret = -ENODEV; - goto abort; - } - - /* Try to find sensor groups */ - pmbus_find_sensor_groups(client, info); -abort: - return ret; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) -static int pmbus_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct pmbus_driver_info *info; - struct pmbus_platform_data *pdata = NULL; - struct device *dev = &client->dev; - - info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - if (!strncmp(id->name, "dps460", sizeof("dps460")) || - !strncmp(id->name, "fsp1200", sizeof("fsp1200")) || !strncmp(id->name, "dps550", sizeof("dps550"))) { - pdata = kzalloc(sizeof(struct pmbus_platform_data), GFP_KERNEL); - if (!pdata) { - kfree(info); - return -ENOMEM; - } - pdata->flags = PMBUS_SKIP_STATUS_CHECK; - } - - info->pages = id->driver_data; - info->identify = pmbus_identify; - dev->platform_data = pdata; - - return pmbus_do_probe(client, id, info); -} -#else -static int pmbus_probe(struct i2c_client *client) -{ - struct pmbus_driver_info *info; - struct pmbus_platform_data *pdata = NULL; - struct device *dev = &client->dev; - struct pmbus_device_info *device_info; - - info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - device_info = (struct pmbus_device_info *)i2c_match_id(pmbus_id, client)->driver_data; - if (device_info->flags & PMBUS_SKIP_STATUS_CHECK) { - pdata = devm_kzalloc(dev, sizeof(struct pmbus_platform_data), GFP_KERNEL); - if (!pdata) { - return -ENOMEM; - } - pdata->flags = PMBUS_SKIP_STATUS_CHECK; - } - - info->pages = device_info->pages; - info->identify = pmbus_identify; - dev->platform_data = pdata; - - return pmbus_do_probe(client, info); -} -#endif -static const struct i2c_device_id pmbus_id[] = { - {"csu550", 0}, - {"csu800", 1}, - {"fsp1200", 1}, - {"dps550", 1}, - {} -}; -MODULE_DEVICE_TABLE(i2c, pmbus_id); - -/* This is the driver that will be inserted */ -static struct i2c_driver pmbus_driver = { -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - .probe = pmbus_probe, -#else - .probe_new = pmbus_probe, -#endif - .id_table = pmbus_id, - .driver = { - .name = "pmbus", - }, -}; - -module_i2c_driver(pmbus_driver); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile psupmbus driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c new file mode 100644 index 000000000000..0d6f38ecc551 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c @@ -0,0 +1,516 @@ +/* + * Copyright (C) 2003-2014 FreeIPMI Core Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/*****************************************************************************\ + * Copyright (C) 2007-2014 Lawrence Livermore National Security, LLC. + * Copyright (C) 2007 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Albert Chu + * UCRL-CODE-232183 + * + * This file is part of Ipmi-fru, a tool used for retrieving + * motherboard field replaceable unit (FRU) information. For details, + * see http://www.llnl.gov/linux/. + * + * Ipmi-fru is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * Ipmi-fru is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with Ipmi-fru. If not, see . +\*****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "platform_common.h" +#include "dfd_tlveeprom.h" + +/* using in is_valid_tlvinfo_header */ +static u_int32_t eeprom_size; + +/* + * List of TLV codes and names. + */ +static const struct tlv_code_desc tlv_code_list[] = { + { TLV_CODE_PRODUCT_NAME , "Product Name"}, + { TLV_CODE_PART_NUMBER , "Part Number"}, + { TLV_CODE_SERIAL_NUMBER , "Serial Number"}, + { TLV_CODE_MAC_BASE , "Base MAC Address"}, + { TLV_CODE_MANUF_DATE , "Manufacture Date"}, + { TLV_CODE_DEVICE_VERSION , "Device Version"}, + { TLV_CODE_LABEL_REVISION , "Label Revision"}, + { TLV_CODE_PLATFORM_NAME , "Platform Name"}, + { TLV_CODE_ONIE_VERSION , "ONIE Version"}, + { TLV_CODE_MAC_SIZE , "MAC Addresses"}, + { TLV_CODE_MANUF_NAME , "Manufacturer"}, + { TLV_CODE_MANUF_COUNTRY , "Country Code"}, + { TLV_CODE_VENDOR_NAME , "Vendor Name"}, + { TLV_CODE_DIAG_VERSION , "Diag Version"}, + { TLV_CODE_SERVICE_TAG , "Service Tag"}, + { TLV_CODE_VENDOR_EXT , "Vendor Extension"}, + { TLV_CODE_CRC_32 , "CRC-32"}, +}; + +#if 0 +#define OPENBMC_VPD_KEY_INVAIL_VAL 0 + +static const tlv_code_map_t tlv_code_map[] = { + { TLV_CODE_PRODUCT_NAME , OPENBMC_VPD_KEY_PRODUCT_NAME}, + { TLV_CODE_PART_NUMBER , OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM}, + { TLV_CODE_SERIAL_NUMBER , OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM}, + { TLV_CODE_MAC_BASE , OPENBMC_VPD_KEY_INVAIL_VAL}, + { TLV_CODE_MANUF_DATE , OPENBMC_VPD_KEY_BOARD_MFG_DATE}, + { TLV_CODE_DEVICE_VERSION , OPENBMC_VPD_KEY_PRODUCT_VER}, + { TLV_CODE_LABEL_REVISION , OPENBMC_VPD_KEY_PRODUCT_CUSTOM7}, + { TLV_CODE_PLATFORM_NAME , OPENBMC_VPD_KEY_PRODUCT_CUSTOM1}, + { TLV_CODE_ONIE_VERSION , OPENBMC_VPD_KEY_PRODUCT_CUSTOM2}, + { TLV_CODE_MAC_SIZE , OPENBMC_VPD_KEY_INVAIL_VAL}, + { TLV_CODE_MANUF_NAME , OPENBMC_VPD_KEY_PRODUCT_MFR}, + { TLV_CODE_MANUF_COUNTRY , OPENBMC_VPD_KEY_PRODUCT_CUSTOM3}, + { TLV_CODE_VENDOR_NAME , OPENBMC_VPD_KEY_PRODUCT_CUSTOM4}, + { TLV_CODE_DIAG_VERSION , OPENBMC_VPD_KEY_PRODUCT_CUSTOM8}, + { TLV_CODE_SERVICE_TAG , OPENBMC_VPD_KEY_PRODUCT_CUSTOM5}, + { TLV_CODE_VENDOR_EXT , OPENBMC_VPD_KEY_PRODUCT_CUSTOM6}, + { TLV_CODE_CRC_32 , OPENBMC_VPD_KEY_INVAIL_VAL}, +}; +#endif + +#define TLV_CODE_NUM (sizeof(tlv_code_list) / sizeof(tlv_code_list[0])) + +#if 0 +#define TLV_CODE_MAP_NUM (sizeof(tlv_code_map) / sizeof(tlv_code_map[0])) +#endif + +const unsigned long crc_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, +}; + +static unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned len) +{ + unsigned i; + if (len < 1) + return 0xffffffff; + + for (i = 0; i != len; ++i) + { + crc = crc_table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8); + } + + crc = crc ^ 0xffffffff; + + return crc; +} + +/* + * is_valid_tlv + * + * Perform basic sanity checks on a TLV field. The TLV is pointed to + * by the parameter provided. + * 1. The type code is not reserved (0x00 or 0xFF) + */ +static inline bool is_valid_tlv(tlvinfo_tlv_t *tlv) +{ + return ((tlv->type != 0x00) && (tlv->type != 0xFF)); +} + +/* + * is_valid_tlvinfo_header + * + * Perform sanity checks on the first 11 bytes of the TlvInfo EEPROM + * data pointed to by the parameter: + * 1. First 8 bytes contain null-terminated ASCII string "TlvInfo" + * 2. Version byte is 1 + * 3. Total length bytes contain value which is less than or equal + * to the allowed maximum (2048-11) + * + */ +static inline bool is_valid_tlvinfo_header(tlvinfo_header_t *hdr) +{ + int max_size = eeprom_size; + return((strcmp(hdr->signature, TLV_INFO_ID_STRING) == 0) && + (hdr->version == TLV_INFO_VERSION) && + (be16_to_cpu(hdr->totallen) <= max_size) ); +} + +/* + * decode_tlv_value + * + * Decode a single TLV value into a string. + + * The validity of EEPROM contents and the TLV field have been verified + * prior to calling this function. + */ +static void decode_tlv_value(tlvinfo_tlv_t *tlv, tlv_decode_value_t *decode_value) +{ + int i; + char *value; + u_int32_t length; + + value = (char *)decode_value->value; + + switch (tlv->type) { + case TLV_CODE_PRODUCT_NAME: + case TLV_CODE_PART_NUMBER: + case TLV_CODE_SERIAL_NUMBER: + case TLV_CODE_MANUF_DATE: + case TLV_CODE_LABEL_REVISION: + case TLV_CODE_PLATFORM_NAME: + case TLV_CODE_ONIE_VERSION: + case TLV_CODE_MANUF_NAME: + case TLV_CODE_MANUF_COUNTRY: + case TLV_CODE_VENDOR_NAME: + case TLV_CODE_DIAG_VERSION: + case TLV_CODE_SERVICE_TAG: + case TLV_CODE_VENDOR_EXT: + memcpy(value, tlv->value, tlv->length); + value[tlv->length] = 0; + length = tlv->length; + break; + case TLV_CODE_MAC_BASE: + length = sprintf(value, "%02X:%02X:%02X:%02X:%02X:%02X", + tlv->value[0], tlv->value[1], tlv->value[2], + tlv->value[3], tlv->value[4], tlv->value[5]); + break; + case TLV_CODE_DEVICE_VERSION: + length = sprintf(value, "%u", tlv->value[0]); + break; + case TLV_CODE_MAC_SIZE: + length = sprintf(value, "%u", (tlv->value[0] << 8) | tlv->value[1]); + break; + #if 0 + case TLV_CODE_VENDOR_EXT: + value[0] = 0; + length = 0; + for (i = 0; (i < (TLV_DECODE_VALUE_MAX_LEN/5)) && (i < tlv->length); i++) { + length += sprintf(value, "%s 0x%02X", value, tlv->value[i]); + } + break; + #endif + case TLV_CODE_CRC_32: + length = sprintf(value, "0x%02X%02X%02X%02X", tlv->value[0], + tlv->value[1], tlv->value[2], tlv->value[3]); + break; + default: + value[0] = 0; + length = 0; + for (i = 0; (i < (TLV_DECODE_VALUE_MAX_LEN/5)) && (i < tlv->length); i++) { + length += sprintf(value, "%s 0x%02X", value, tlv->value[i]); + } + break; + } + + decode_value->length = length; +} + +/* + * is_checksum_valid + * + * Validate the checksum in the provided TlvInfo EEPROM data. First, + * verify that the TlvInfo header is valid, then make sure the last + * TLV is a CRC-32 TLV. Then calculate the CRC over the EEPROM data + * and compare it to the value stored in the EEPROM CRC-32 TLV. + */ +static bool is_checksum_valid(u_int8_t *eeprom) +{ + tlvinfo_header_t *eeprom_hdr; + tlvinfo_tlv_t *eeprom_crc; + unsigned int calc_crc; + unsigned int stored_crc; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + + // Is the eeprom header valid? + if (!is_valid_tlvinfo_header(eeprom_hdr)) { + return false; + } + + // Is the last TLV a CRC? + eeprom_crc = (tlvinfo_tlv_t *) &eeprom[sizeof(tlvinfo_header_t) + + be16_to_cpu(eeprom_hdr->totallen) - (sizeof(tlvinfo_tlv_t) + 4)]; + if ((eeprom_crc->type != TLV_CODE_CRC_32) || (eeprom_crc->length != 4)) { + return false; + } + + // Calculate the checksum + calc_crc = crc32(0xffffffffL, (const unsigned char *)eeprom, sizeof(tlvinfo_header_t) + + be16_to_cpu(eeprom_hdr->totallen) - 4); + stored_crc = ((eeprom_crc->value[0] << 24) | (eeprom_crc->value[1] << 16) | + (eeprom_crc->value[2] << 8) | eeprom_crc->value[3]); + + return (calc_crc == stored_crc); +} + +/* + * tlvinfo_find_tlv + * + * This function finds the TLV with the supplied code in the EERPOM. + * An offset from the beginning of the EEPROM is returned in the + * eeprom_index parameter if the TLV is found. + */ +static bool tlvinfo_find_tlv(u_int8_t *eeprom, u_int8_t tcode, int *eeprom_index) +{ + tlvinfo_header_t *eeprom_hdr; + tlvinfo_tlv_t *eeprom_tlv; + int eeprom_end; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + + // Search through the TLVs, looking for the first one which matches the + // supplied type code. + *eeprom_index = sizeof(tlvinfo_header_t); + eeprom_end = sizeof(tlvinfo_header_t) + be16_to_cpu(eeprom_hdr->totallen); + while (*eeprom_index < eeprom_end) { + eeprom_tlv = (tlvinfo_tlv_t *) &eeprom[*eeprom_index]; + if (!is_valid_tlv(eeprom_tlv)) { + return false; + } + + if (eeprom_tlv->type == tcode) { + return true; + } + + *eeprom_index += sizeof(tlvinfo_tlv_t) + eeprom_tlv->length; + } + + return false; +} + +/* + * tlvinfo_decode_tlv + * + * This function finds the TLV with the supplied code in the EERPOM + * and decodes the value into the buffer provided. + */ +static bool tlvinfo_decode_tlv(u_int8_t *eeprom, u_int8_t tcode, tlv_decode_value_t *decode_value) +{ + int eeprom_index; + tlvinfo_tlv_t *eeprom_tlv; + + // Find the TLV and then decode it + if (tlvinfo_find_tlv(eeprom, tcode, &eeprom_index)) { + eeprom_tlv = (tlvinfo_tlv_t *) &eeprom[eeprom_index]; + decode_tlv_value(eeprom_tlv, decode_value); + return true; + } + + return false; +} + +/* + * parse_tlv_eeprom + * + * parse the EEPROM into memory, if it hasn't already been read. + */ +int parse_tlv_eeprom(u_int8_t *eeprom, u_int32_t size) +{ + unsigned int i; + bool ret; + tlvinfo_header_t *eeprom_hdr; + //tlv_info_vec_t tlv_info; + tlv_decode_value_t decode_value; + int j; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + eeprom_size = size; /* eeprom real size */ + + if (!is_valid_tlvinfo_header(eeprom_hdr)) { + DBG_ERROR("Failed to check tlv header.\n"); + return -1; + } + + if (!is_checksum_valid(eeprom)) { + DBG_ERROR("Failed to check tlv crc.\n"); + return -1; + } + + for (i = 0; i < TLV_CODE_NUM; i++) { + mem_clear((void *)&decode_value, sizeof(tlv_decode_value_t)); + ret = tlvinfo_decode_tlv(eeprom, tlv_code_list[i].m_code, &decode_value); + if (!ret) { + DBG_ERROR("No found type: %s\n", tlv_code_list[i].m_name); + continue; + } + + DBG_DEBUG("i: %d,Found type: %s tlv[%d]:%s\n", i, tlv_code_list[i].m_name, tlv_code_list[i].m_code, + decode_value.value); + for (j = 0; j < decode_value.length; j++) { + if ((j % 16) == 0) { + DBG_DEBUG("\n"); + } + DBG_DEBUG("%02x ", decode_value.value[j]); + } + DBG_DEBUG("\n\n"); + } + return 0; +} +static int dfd_parse_tlv_eeprom(u_int8_t *eeprom, u_int32_t size, u_int8_t main_type, tlv_decode_value_t *decode_value) +{ + bool ret; + tlvinfo_header_t *eeprom_hdr; + //tlv_info_vec_t tlv_info; + int j; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + eeprom_size = size; /* eeprom real size */ + + if (!is_valid_tlvinfo_header(eeprom_hdr)) { + DBG_ERROR("Failed to check tlv header.\n"); + return -1; + } + + if (!is_checksum_valid(eeprom)) { + DBG_ERROR("Failed to check tlv crc.\n"); + return -1; + } + + ret = tlvinfo_decode_tlv(eeprom, main_type, decode_value); + if (!ret) { + DBG_ERROR("No found type: %d\n", main_type); + return -1; + } + + DBG_DEBUG("Found type: %d, value: %s\n", main_type,decode_value->value); + for (j = 0; j < decode_value->length; j++) { + if ((j % 16) == 0) { + DBG_DEBUG("\n"); + } + DBG_DEBUG("%02x ", decode_value->value[j]); + } + DBG_DEBUG("\n\n"); + + return 0; +} + +static int tlvinfo_find_wb_ext_tlv(tlv_decode_value_t *ext_tlv_value, u_int8_t ext_type, + u_int8_t *buf, u_int8_t *buf_len) +{ + tlvinfo_tlv_t *eeprom_tlv; + int eeprom_end, eeprom_index; + + // Search through the TLVs, looking for the first one which matches the + // supplied type code. + DBG_DEBUG("ext_tlv_value->length: %d.\n", ext_tlv_value->length); + for (eeprom_index = 0; eeprom_index < ext_tlv_value->length; eeprom_index++) { + if ((eeprom_index % 16) == 0) { + DBG_DEBUG("\n"); + } + DBG_DEBUG("%02x ", ext_tlv_value->value[eeprom_index]); + } + + DBG_DEBUG("\n"); + + eeprom_index = 0; + eeprom_end = ext_tlv_value->length; + while (eeprom_index < eeprom_end) { + eeprom_tlv = (tlvinfo_tlv_t *) &(ext_tlv_value->value[eeprom_index]); + if (!is_valid_tlv(eeprom_tlv)) { + DBG_ERROR("tlv is not valid, eeprom_tlv->type 0x%x.\n", eeprom_tlv->type); + return -1; + } + + DBG_DEBUG("eeprom_tlv->length %d.\n", eeprom_tlv->length); + if (eeprom_tlv->type == ext_type) { + if (*buf_len >= eeprom_tlv->length) { + memcpy(buf, eeprom_tlv->value, eeprom_tlv->length); + DBG_DEBUG("eeprom_tlv->length %d.\n", eeprom_tlv->length); + *buf_len = eeprom_tlv->length; + return 0; + } + DBG_ERROR("buf_len %d small than info_len %d.\n", *buf_len, eeprom_tlv->length); + return -1; + } + + eeprom_index += sizeof(tlvinfo_tlv_t) + eeprom_tlv->length; + } + + DBG_ERROR("ext_type %d: tlv is not found.\n", ext_type); + return -1; +} + +int dfd_tlvinfo_get_e2prom_info(u_int8_t *eeprom, u_int32_t size, dfd_tlv_type_t *tlv_type, u_int8_t* buf, u_int8_t *buf_len) +{ + tlv_decode_value_t decode_value; + int ret; + + if (eeprom == NULL || tlv_type == NULL || buf == NULL) { + DBG_ERROR("Input para invalid.\n"); + return -1; + } + + mem_clear((void *)&decode_value, sizeof(tlv_decode_value_t)); + ret = dfd_parse_tlv_eeprom(eeprom, size, tlv_type->main_type, &decode_value); + if (ret) { + DBG_ERROR("dfd_parse_tlv_eeprom failed ret %d.\n", ret); + return ret; + } + + if (tlv_type->main_type != TLV_CODE_VENDOR_EXT) { + if (*buf_len >= decode_value.length) { + memcpy(buf, decode_value.value, decode_value.length); + *buf_len = decode_value.length; + return 0; + } + DBG_ERROR("buf_len %d small than info_len %d.\n", *buf_len, decode_value.length); + return -1; + } + DBG_DEBUG("info_len %d.\n", decode_value.length); + + return tlvinfo_find_wb_ext_tlv(&decode_value, tlv_type->ext_type, buf, buf_len); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h new file mode 100644 index 000000000000..6eaac5848223 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h @@ -0,0 +1,121 @@ +#ifndef DFD_OPENBMC_TLVEEPROM_H +#define DFD_OPENBMC_TLVEEPROM_H + +#ifndef u_int8_t +#define u_int8_t unsigned char +#endif + +#ifndef u_int16_t +#define u_int16_t unsigned short +#endif + +#ifndef u_int32_t +#define u_int32_t unsigned int +#endif + +#ifndef be16_to_cpu +#define be16_to_cpu(x) ntohs(x) +#endif + +#ifndef cpu_to_be16 +#define cpu_to_be16(x) htons(x) +#endif + +/** + * The TLV Types. + * + * Keep these in sync with tlv_code_list in cmd_sys_eeprom.c + */ +#define TLV_CODE_PRODUCT_NAME 0x21 +#define TLV_CODE_PART_NUMBER 0x22 +#define TLV_CODE_SERIAL_NUMBER 0x23 +#define TLV_CODE_MAC_BASE 0x24 +#define TLV_CODE_MANUF_DATE 0x25 +#define TLV_CODE_DEVICE_VERSION 0x26 +#define TLV_CODE_LABEL_REVISION 0x27 +#define TLV_CODE_PLATFORM_NAME 0x28 +#define TLV_CODE_ONIE_VERSION 0x29 +#define TLV_CODE_MAC_SIZE 0x2A +#define TLV_CODE_MANUF_NAME 0x2B +#define TLV_CODE_MANUF_COUNTRY 0x2C +#define TLV_CODE_VENDOR_NAME 0x2D +#define TLV_CODE_DIAG_VERSION 0x2E +#define TLV_CODE_SERVICE_TAG 0x2F +#define TLV_CODE_VENDOR_EXT 0xFD +#define TLV_CODE_CRC_32 0xFE + +#define TLV_CODE_NAME_LEN 64 +/* + * Struct for displaying the TLV codes and names. + */ +struct tlv_code_desc { + u_int8_t m_code; + char m_name[TLV_CODE_NAME_LEN]; +}; + +typedef struct dfd_tlv_type_s { + u_int8_t main_type; + u_int8_t ext_type; +} dfd_tlv_type_t; + +// Header Field Constants +#define TLV_INFO_ID_STRING "TlvInfo" +#define TLV_INFO_VERSION 0x01 +/*#define TLV_TOTAL_LEN_MAX (XXXXXXXX - sizeof(tlvinfo_header_t))*/ + +struct __attribute__ ((__packed__)) tlvinfo_header_s { + char signature[8]; /* 0x00 - 0x07 EEPROM Tag "TlvInfo" */ + u_int8_t version; /* 0x08 Structure version */ + u_int16_t totallen; /* 0x09 - 0x0A Length of all data which follows */ +}; +typedef struct tlvinfo_header_s tlvinfo_header_t; + +/* + * TlvInfo TLV: Layout of a TLV field + */ +struct __attribute__ ((__packed__)) tlvinfo_tlv_s { + u_int8_t type; + u_int8_t length; + u_int8_t value[0]; +}; +typedef struct tlvinfo_tlv_s tlvinfo_tlv_t; + +#define TLV_VALUE_MAX_LEN 255 +/* + * The max decode value is currently for the 'raw' type or the 'vendor + * extension' type, both of which have the same decode format. The + * max decode string size is computed as follows: + * + * strlen(" 0xFF") * TLV_VALUE_MAX_LEN + 1 + * + */ +#define TLV_DECODE_VALUE_MAX_LEN ((5 * TLV_VALUE_MAX_LEN) + 1) + +typedef struct tlv_decode_value_s { + u_int8_t value[TLV_DECODE_VALUE_MAX_LEN]; + u_int32_t length; +} tlv_decode_value_t; + +typedef enum dfd_tlvinfo_ext_tlv_type_e { + DFD_TLVINFO_EXT_TLV_TYPE_DEV_TYPE = 1, +} dfd_tlvinfo_ext_tlv_type_t; + +#if 0 +#define TLV_TIME_LEN 64 + +int ipmi_tlv_validate_fru_area(const uint8_t fruid, const char *fru_file_name, + sd_bus *bus_type, const bool bmc_fru); + +extern const char *get_vpd_key_names(int key_id); +extern std::string getService(sdbusplus::bus::bus& bus, + const std::string& intf, + const std::string& path); +extern std::string getFRUValue(const std::string& section, + const std::string& key, + const std::string& delimiter, + IPMIFruInfo& fruData); +#endif + +int dfd_tlvinfo_get_e2prom_info(u_int8_t *eeprom, u_int32_t size, dfd_tlv_type_t *tlv_type, u_int8_t* buf, u_int8_t *buf_len); + +#endif /* endif DFD_OPENBMC_TLVEEPROM_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h new file mode 100644 index 000000000000..649a8452debe --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h @@ -0,0 +1,133 @@ +#ifndef _FPGA_I2C_H +#define _FPGA_I2C_H + +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#if 0 + +#define FPGA_I2C_EXT_9548_ADDR (0x00) +#define FPGA_I2C_EXT_9548_CHAN (0x04) +#define FPGA_I2C_DEV_SLAVE_ADDR (0x08) +#define FPGA_I2C_DEV_REG_ADDR (0x0C) +#define FPGA_I2C_DEV_RDWR_LEN (0x10) +#define FPGA_I2C_CTRL_REG (0x14) +#define FPGA_I2C_STATUS_REG (0x18) +#define FPGA_I2C_SCALE_REG (0x1C) +#define FPGA_I2C_FILTER_REG (0x20) +#define FPGA_I2C_STRETCH_REG (0x24) +#define FPGA_I2C_EXT_9548_EXITS_FLAG (0x28) +#define FPGA_I2C_INTERNAL_9548_CHAN (0x2C) +#define FPGA_I2C_RDWR_DATA_BUF (0x80) +#endif +#define FPGA_I2C_RDWR_MAX_LEN_DEFAULT (128) +#define I2C_REG_MAX_WIDTH (16) + +#define DEV_NAME_MAX_LEN (64) + +#define FPGA_I2C_MAX_TIMES (10) +#define FPGA_I2C_XFER_TIME_OUT (100000) +#define FPGA_I2C_SLEEP_TIME (40) + +typedef struct fpga_i2c_reg_s { + uint32_t i2c_scale; + uint32_t i2c_filter; + uint32_t i2c_stretch; + uint32_t i2c_ext_9548_exits_flag; + uint32_t i2c_ext_9548_addr; + uint32_t i2c_ext_9548_chan; + uint32_t i2c_in_9548_chan; + uint32_t i2c_slave; + uint32_t i2c_reg; + uint32_t i2c_reg_len; + uint32_t i2c_data_len; + uint32_t i2c_ctrl; + uint32_t i2c_status; + uint32_t i2c_err_vec; + uint32_t i2c_data_buf; + uint32_t i2c_data_buf_len; +} fpga_i2c_reg_t; + +typedef struct fpga_i2c_reset_cfg_s { + uint32_t i2c_adap_reset_flag; + uint32_t reset_addr; + uint32_t reset_on; + uint32_t reset_off; + uint32_t reset_delay_b; + uint32_t reset_delay; + uint32_t reset_delay_a; +} fpga_i2c_reset_cfg_t; + +typedef struct fpga_i2c_reg_addr_s { + uint8_t reg_addr_len; + uint8_t read_reg_addr[I2C_REG_MAX_WIDTH]; +} fpga_i2c_reg_addr_t; + +typedef struct fpga_i2c_dev_s { + fpga_i2c_reg_t reg; + fpga_i2c_reset_cfg_t reset_cfg; + fpga_i2c_reg_addr_t i2c_addr_desc; + const char *dev_name; + uint32_t i2c_scale_value; + uint32_t i2c_filter_value; + uint32_t i2c_stretch_value; + uint32_t i2c_timeout; + uint32_t i2c_func_mode; + wait_queue_head_t queue; + struct i2c_adapter adap; + int adap_nr; + struct device *dev; + bool i2c_params_check; +} fpga_i2c_dev_t; + +typedef struct fpga_i2c_bus_device_s { + int i2c_timeout; + int i2c_scale; + int i2c_filter; + int i2c_stretch; + int i2c_ext_9548_exits_flag; + int i2c_ext_9548_addr; + int i2c_ext_9548_chan; + int i2c_in_9548_chan; + int i2c_slave; + int i2c_reg; + int i2c_reg_len; + int i2c_data_len; + int i2c_ctrl; + int i2c_status; + int i2c_err_vec; + int i2c_data_buf; + int i2c_data_buf_len; + char dev_name[DEV_NAME_MAX_LEN]; + int adap_nr; + int i2c_scale_value; + int i2c_filter_value; + int i2c_stretch_value; + int i2c_func_mode; + int i2c_adap_reset_flag; + int i2c_reset_addr; + int i2c_reset_on; + int i2c_reset_off; + int i2c_rst_delay_b; /* delay time before reset(us) */ + int i2c_rst_delay; /* reset time(us) */ + int i2c_rst_delay_a; /* delay time after reset(us) */ + int device_flag; + bool i2c_params_check; + int i2c_data_buf_len_reg; + int i2c_offset_reg; +} fpga_i2c_bus_device_t; + +typedef struct fpga_pca954x_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t fpga_9548_flag; + uint32_t fpga_9548_reset_flag; + uint32_t pca9548_base_nr; +} fpga_pca954x_device_t; + +#endif /* _FPGA_I2C_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c deleted file mode 100755 index 7857f854d60e..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c +++ /dev/null @@ -1,911 +0,0 @@ -/* - * i2c-ocores.c: I2C bus driver for OpenCores I2C controller - * (http://www.opencores.org/projects.cgi/web/i2c/overview). - * - * Peter Korsgaard - * - * Support for the GRLIB port of the controller by - * Andreas Larsson - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "fpga_i2c_ocores.h" -#include -#include -#include - -struct ocores_i2c { - void __iomem *base; - u32 reg_shift; - u32 reg_io_width; - wait_queue_head_t wait; - struct i2c_adapter adap; - struct i2c_msg *msg; - int pos; - int nmsgs; - int state; /* see STATE_ */ - spinlock_t process_lock; - struct mutex xfer_lock; - int clock_khz; - void (*setreg)(struct ocores_i2c *i2c, int reg, u8 value); - u8 (*getreg)(struct ocores_i2c *i2c, int reg); -}; - -/* registers */ -#define OCI2C_PRELOW 0x0 -#define OCI2C_PREHIGH 0x4 -#define OCI2C_CONTROL 0x8 -#define OCI2C_DATA 0xc -#define OCI2C_CMD 0x10 /* write only */ -#define OCI2C_STATUS 0x10 /* read only, same address as OCI2C_CMD */ - -#define OCI2C_TRAN_REV 0x14 -#define OCI2C_CMD_REV 0x18 - - -#define OCI2C_CTRL_IEN 0x40 -#define OCI2C_CTRL_EN 0x80 - -#define OCI2C_CMD_START 0x91 -#define OCI2C_CMD_STOP 0x41 -#define OCI2C_CMD_READ 0x21 -#define OCI2C_CMD_WRITE 0x11 -#define OCI2C_CMD_READ_ACK 0x21 -#define OCI2C_CMD_READ_NACK 0x29 -#define OCI2C_CMD_IACK 0x01 - -#define OCI2C_STAT_IF 0x01 -#define OCI2C_STAT_TIP 0x02 -#define OCI2C_STAT_ARBLOST 0x20 -#define OCI2C_STAT_BUSY 0x40 -#define OCI2C_STAT_NACK 0x80 - -#define STATE_DONE 0 -#define STATE_START 1 -#define STATE_WRITE 2 -#define STATE_READ 3 -#define STATE_ERROR 4 - -#define TYPE_OCORES 0 -#define TYPE_GRLIB 1 - -#define BUF_SIZE 256 -#define DEFAULT_I2C_SCL 100 -#define DEFAULT_I2C_PRE 0xF9 - -int g_fpga_i2c_debug = 0; -int g_fpga_i2c_irq = 0; -int g_fpga_i2c_error = 0; -int g_irq_dump_debug = 0; -int g_irq_invalid_cnt = 0; -int g_fpga_debug = 0; - -module_param(g_fpga_i2c_debug, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_i2c_error, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_i2c_irq, int, S_IRUGO | S_IWUSR); -module_param(g_irq_dump_debug, int, S_IRUGO | S_IWUSR); -module_param(g_irq_invalid_cnt, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_debug, int, S_IRUGO | S_IWUSR); - -#define FPGA_I2C_DEBUG(fmt, args...) do { \ - if (g_fpga_debug) { \ - printk(KERN_DEBUG ""fmt, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_DUMP(fmt, args...) do { \ - if (g_irq_dump_debug) { \ - printk(KERN_ERR ""fmt, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_XFER(fmt, args...) do { \ - if (g_fpga_i2c_irq) { \ - printk(KERN_ERR "[FPGA_I2C][XFER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_fpga_i2c_debug) { \ - printk(KERN_ERR "[FPGA_I2C][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_ERROR(fmt, args...) do { \ - if (g_fpga_i2c_error) { \ - printk(KERN_ERR "[FPGA_I2C][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -static int check_ocores_i2c(struct i2c_msg *msgs, int num); -static void oc_debug_dump_reg(struct ocores_i2c *i2c); -static void oc_debug_dump_reg_dump(struct ocores_i2c *i2c); -static int oc_set_scl_clk(struct ocores_i2c *i2c, int val); - -static void oc_setreg_8(struct ocores_i2c *i2c, int reg, u8 value) -{ - iowrite8(value, i2c->base + (reg << i2c->reg_shift)); -} - -static void oc_setreg_16(struct ocores_i2c *i2c, int reg, u8 value) -{ - iowrite16(value, i2c->base + (reg << i2c->reg_shift)); -} - -static void oc_setreg_32(struct ocores_i2c *i2c, int reg, u8 value) -{ - iowrite32(value, i2c->base + (reg << i2c->reg_shift)); -} - -static inline u8 oc_getreg_8(struct ocores_i2c *i2c, int reg) -{ - return ioread8(i2c->base + (reg << i2c->reg_shift)); -} - -static inline u8 oc_getreg_16(struct ocores_i2c *i2c, int reg) -{ - return ioread16(i2c->base + (reg << i2c->reg_shift)); -} - -static inline u8 oc_getreg_32(struct ocores_i2c *i2c, int reg) -{ - return ioread32(i2c->base + (reg << i2c->reg_shift)); -} - -static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value) -{ - i2c->setreg(i2c, reg, value); -} - -static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg) -{ - return i2c->getreg(i2c, reg); -} - -#define FPGA_I2C_SPIN_LOCK(lock, flags) spin_lock_irqsave(&(lock), (flags)) -#define FPGA_I2C_SPIN_UNLOCK(lock, flags) spin_unlock_irqrestore(&(lock), (flags)) -#define FPGA_I2C_MUTEX_LOCK(lock) mutex_lock(&(lock)) -#define FPGA_I2C_MUTEX_UNLOCK(lock) mutex_unlock(&(lock)) - -static void ocores_process(struct ocores_i2c *i2c, u8 stat) -{ - struct i2c_msg *msg = i2c->msg; - - FPGA_I2C_DEBUG_XFER("Enter nr %d.\n", i2c->adap.nr); - if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) { - /* stop has been sent */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - wake_up(&i2c->wait); - FPGA_I2C_DEBUG_XFER("stop has been sent, exit.\n"); - goto out; - } - - FPGA_I2C_DEBUG_XFER("Enter 111.\n"); - - /* error */ - if (stat & OCI2C_STAT_ARBLOST) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - FPGA_I2C_DEBUG_XFER("error, exit.\n"); - goto out; - } - - FPGA_I2C_DEBUG_XFER("Enter 222.\n"); - - if (check_ocores_i2c(i2c->msg, i2c->nmsgs) != 0) { - FPGA_I2C_DEBUG("i2c->msg->buf is null, i2c->state:%d exit.\n", i2c->state); - oc_debug_dump_reg_dump(i2c); - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - goto out; - } - - if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { - i2c->state = - (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; - - if (stat & OCI2C_STAT_NACK) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - FPGA_I2C_DEBUG_XFER("OCI2C_STAT_NACK, exit.\n"); - goto out; - } - } else { - msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA); - } - FPGA_I2C_DEBUG_XFER("Enter 333.\n"); - - /* end of msg? */ - if (i2c->pos == msg->len) { - FPGA_I2C_DEBUG_XFER("Enter end of msg.\n"); - i2c->nmsgs--; - i2c->msg++; - i2c->pos = 0; - msg = i2c->msg; - - if (i2c->nmsgs) { /* end? */ - /* send start? */ - if (!(msg->flags & I2C_M_NOSTART)) { - u8 addr = (msg->addr << 1); - - if (msg->flags & I2C_M_RD) - addr |= 1; - - i2c->state = STATE_START; - - oc_setreg(i2c, OCI2C_DATA, addr); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - FPGA_I2C_DEBUG_XFER("send start, exit.\n"); - goto out; - } - - i2c->state = (msg->flags & I2C_M_RD) - ? STATE_READ : STATE_WRITE; - } else { - i2c->state = STATE_DONE; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - FPGA_I2C_DEBUG_XFER("send OCI2C_CMD_STOP, exit.\n"); - goto out; - } - } - - if (i2c->state == STATE_READ) { - oc_setreg(i2c, OCI2C_CMD, i2c->pos == (msg->len-1) ? - OCI2C_CMD_READ_NACK : OCI2C_CMD_READ_ACK); - } else { - oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE); - } - -out: - FPGA_I2C_DEBUG_XFER("normal, exit nr %d.\n", i2c->adap.nr); -} - -static irqreturn_t ocores_isr(int irq, void *dev_id) -{ - struct ocores_i2c *i2c = dev_id; - unsigned long flags; - u8 stat; - - if (!i2c) { - return IRQ_NONE; - } - /* - * If we spin here is because we are in timeout, so we are going - * to be in STATE_ERROR. See ocores_process_timeout() - */ - FPGA_I2C_SPIN_LOCK(i2c->process_lock, flags); - stat = oc_getreg(i2c, OCI2C_STATUS); - if (!(stat & OCI2C_STAT_IF)) { - g_irq_invalid_cnt++; - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - return IRQ_NONE; - } - - FPGA_I2C_DEBUG_XFER("Enter, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)?0:i2c->msg->addr); - ocores_process(i2c, stat); - FPGA_I2C_DEBUG_XFER("Leave, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)?0:i2c->msg->addr); - - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - return IRQ_HANDLED; -} - -/** - * Process timeout event - * @i2c: ocores I2C device instance - */ -static void ocores_process_timeout(struct ocores_i2c *i2c) -{ - unsigned long flags; - - FPGA_I2C_SPIN_LOCK(i2c->process_lock, flags); - FPGA_I2C_DEBUG_ERROR("wait_event_timeout i2c->state %d.\n", i2c->state); - oc_debug_dump_reg(i2c); - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - mdelay(1); - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); -} - -static int check_ocores_i2c(struct i2c_msg *msgs, int num) -{ - int i; - if (!msgs) { - return -1; - } - for (i = 0; i < num; ++i) { - if (!msgs[i].buf) { - return -1; - } - } - return 0; -} - -static int ocores_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) -{ - struct ocores_i2c *i2c; - int ret; - unsigned long flags; - int xfer_ret; - - if (!adap || check_ocores_i2c(msgs, num) != 0) { - FPGA_I2C_DEBUG("msgs: %p , num:%d exit.\n", msgs, num); - return -EINVAL; - } - i2c = i2c_get_adapdata(adap); - - FPGA_I2C_MUTEX_LOCK(i2c->xfer_lock); - FPGA_I2C_SPIN_LOCK(i2c->process_lock, flags); - i2c->msg = msgs; - i2c->pos = 0; - i2c->nmsgs = num; - i2c->state = STATE_START; - FPGA_I2C_DEBUG_XFER("Enter, nr %d addr 0x%x num %d.\n", adap->nr, i2c->msg->addr, num); - - oc_setreg(i2c, OCI2C_DATA, - (i2c->msg->addr << 1) | - ((i2c->msg->flags & I2C_M_RD) ? 1:0)); - - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - FPGA_I2C_DEBUG_XFER("After, oc_setreg OCI2C_CMD.\n"); - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - - ret = wait_event_timeout(i2c->wait, (i2c->state == STATE_ERROR) || - (i2c->state == STATE_DONE), HZ); - - if (ret == 0) { - ocores_process_timeout(i2c); - FPGA_I2C_MUTEX_UNLOCK(i2c->xfer_lock); - return -ETIMEDOUT; - } - xfer_ret = i2c->state; - FPGA_I2C_MUTEX_UNLOCK(i2c->xfer_lock); - return (xfer_ret == STATE_DONE) ? num : -EIO; -} - -static void ocores_init(struct ocores_i2c *i2c) -{ - int prescale; - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - mutex_init(&i2c->xfer_lock); - spin_lock_init(&i2c->process_lock); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - prescale = oc_set_scl_clk(i2c, DEFAULT_I2C_SCL); - FPGA_I2C_DEBUG_VERBOSE("i2c->base 0x%p, i2c->clock_khz %d, prescale 0x%x.\n", i2c->base, i2c->clock_khz, prescale); - - /* Init the device */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN | OCI2C_CTRL_EN); -} - - -static u32 ocores_func(struct i2c_adapter *adap) -{ - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; -} - -static const struct i2c_algorithm ocores_algorithm = { - .master_xfer = ocores_xfer, - .functionality = ocores_func, -}; - -static struct i2c_adapter ocores_adapter = { - .owner = THIS_MODULE, - .name = "rg-i2c-ocores", - .class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED, - .algo = &ocores_algorithm, -}; - -static const struct of_device_id ocores_i2c_match[] = { - { - .compatible = "opencores,rg-i2c-ocores", - .data = (void *)TYPE_OCORES, - }, - { - .compatible = "aeroflexgaisler,i2cmst", - .data = (void *)TYPE_GRLIB, - }, - {}, -}; -MODULE_DEVICE_TABLE(of, ocores_i2c_match); - -#ifdef CONFIG_OF -/* Read and write functions for the GRLIB port of the controller. Registers are - * 32-bit big endian and the PRELOW and PREHIGH registers are merged into one - * register. The subsequent registers has their offset decreased accordingly. */ -static u8 oc_getreg_grlib(struct ocores_i2c *i2c, int reg) -{ - u32 rd; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - rd = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PREHIGH) - return (u8)(rd >> 8); - else - return (u8)rd; -} - -static void oc_setreg_grlib(struct ocores_i2c *i2c, int reg, u8 value) -{ - u32 curr, wr; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - if (reg == OCI2C_PRELOW || reg == OCI2C_PREHIGH) { - curr = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PRELOW) - wr = (curr & 0xff00) | value; - else - wr = (((u32)value) << 8) | (curr & 0xff); - } else { - wr = value; - } - iowrite32be(wr, i2c->base + (rreg << i2c->reg_shift)); -} - -static int ocores_i2c_of_probe(struct platform_device *pdev, - struct ocores_i2c *i2c) -{ - struct device_node *np = pdev->dev.of_node; - const struct of_device_id *match; - u32 val; - - if (of_property_read_u32(np, "reg-shift", &i2c->reg_shift)) { - /* no 'reg-shift', check for deprecated 'regstep' */ - if (!of_property_read_u32(np, "regstep", &val)) { - if (!is_power_of_2(val)) { - dev_err(&pdev->dev, "invalid regstep %d\n", - val); - return -EINVAL; - } - i2c->reg_shift = ilog2(val); - dev_warn(&pdev->dev, - "regstep property deprecated, use reg-shift\n"); - } - } - - if (of_property_read_u32(np, "clock-frequency", &val)) { - dev_err(&pdev->dev, - "Missing required parameter 'clock-frequency'\n"); - return -ENODEV; - } - i2c->clock_khz = val / 1000; - - of_property_read_u32(pdev->dev.of_node, "reg-io-width", - &i2c->reg_io_width); - - match = of_match_node(ocores_i2c_match, pdev->dev.of_node); - if (match && (long)match->data == TYPE_GRLIB) { - dev_dbg(&pdev->dev, "GRLIB variant of i2c-ocores\n"); - i2c->setreg = oc_setreg_grlib; - i2c->getreg = oc_getreg_grlib; - } - - return 0; -} -#else -#define ocores_i2c_of_probe(pdev,i2c) -ENODEV -#endif - - -static void oc_debug_dump_reg_dump(struct ocores_i2c *i2c) -{ - if (i2c) { - FPGA_I2C_DEBUG("base: %p.\n", i2c->base); - FPGA_I2C_DEBUG("reg_shift: %d.\n", i2c->reg_shift); - FPGA_I2C_DEBUG("reg_io_width: %d.\n", i2c->reg_io_width); - FPGA_I2C_DEBUG("adap.nr: %d.\n", i2c->adap.nr); - FPGA_I2C_DEBUG("msg: %p.\n", i2c->msg); - if (i2c->msg) { - FPGA_I2C_DEBUG("msg->buf: %p.\n", i2c->msg->buf); - FPGA_I2C_DEBUG("msg->addr: 0x%x.\n", i2c->msg->addr); - FPGA_I2C_DEBUG("msg->flags: 0x%x.\n", i2c->msg->flags); - FPGA_I2C_DEBUG("msg->len: %d.\n", i2c->msg->len); - } else { - FPGA_I2C_DEBUG("msg: %p is null.\n", i2c->msg); - } - - FPGA_I2C_DEBUG("pos: %d.\n", i2c->pos); - FPGA_I2C_DEBUG("nmsgs: %d.\n", i2c->nmsgs); - FPGA_I2C_DEBUG("state: %d.\n", i2c->state); - FPGA_I2C_DEBUG("clock_khz: %d.\n", i2c->clock_khz); - FPGA_I2C_DEBUG("setreg: %p.\n", i2c->setreg); - FPGA_I2C_DEBUG("getreg: %p.\n", i2c->getreg); - if (i2c->getreg) { - FPGA_I2C_DEBUG("OCI2C_PRELOW: 0x%02x.\n", oc_getreg(i2c, OCI2C_PRELOW)); - FPGA_I2C_DEBUG("OCI2C_PREHIGH: 0x%02x.\n", oc_getreg(i2c, OCI2C_PREHIGH)); - FPGA_I2C_DEBUG("OCI2C_CONTROL: 0x%02x.\n", oc_getreg(i2c, OCI2C_CONTROL)); - FPGA_I2C_DEBUG("OCI2C_DATA: 0x%02x.\n", oc_getreg(i2c, OCI2C_DATA)); - FPGA_I2C_DEBUG("OCI2C_CMD: 0x%02x.\n", oc_getreg(i2c, OCI2C_CMD)); - FPGA_I2C_DEBUG("OCI2C_STATUS: 0x%02x.\n", oc_getreg(i2c, OCI2C_STATUS)); - } else { - FPGA_I2C_DEBUG("getreg: %p is null.\n", i2c->getreg); - } - } else { - FPGA_I2C_DEBUG("i2c %p is null.\n", i2c); - } -} - - -static void oc_debug_dump_reg(struct ocores_i2c *i2c) -{ - if (i2c) { - FPGA_I2C_DEBUG_DUMP("base: %p.\n", i2c->base); - FPGA_I2C_DEBUG_DUMP("reg_shift: %d.\n", i2c->reg_shift); - FPGA_I2C_DEBUG_DUMP("reg_io_width: %d.\n", i2c->reg_io_width); - FPGA_I2C_DEBUG_DUMP("adap.nr: %d.\n", i2c->adap.nr); - FPGA_I2C_DEBUG_DUMP("msg: %p.\n", i2c->msg); - if (i2c->msg) { - FPGA_I2C_DEBUG_DUMP("msg->buf: %p.\n", i2c->msg->buf); - FPGA_I2C_DEBUG_DUMP("msg->addr: 0x%x.\n", i2c->msg->addr); - FPGA_I2C_DEBUG_DUMP("msg->flags: 0x%x.\n", i2c->msg->flags); - FPGA_I2C_DEBUG_DUMP("msg->len: %d.\n", i2c->msg->len); - } else { - FPGA_I2C_DEBUG_DUMP("msg: %p is null.\n", i2c->msg); - } - - FPGA_I2C_DEBUG_DUMP("pos: %d.\n", i2c->pos); - FPGA_I2C_DEBUG_DUMP("nmsgs: %d.\n", i2c->nmsgs); - FPGA_I2C_DEBUG_DUMP("state: %d.\n", i2c->state); - FPGA_I2C_DEBUG_DUMP("clock_khz: %d.\n", i2c->clock_khz); - FPGA_I2C_DEBUG_DUMP("setreg: %p.\n", i2c->setreg); - FPGA_I2C_DEBUG_DUMP("getreg: %p.\n", i2c->getreg); - if (i2c->getreg) { - FPGA_I2C_DEBUG_DUMP("OCI2C_PRELOW: 0x%02x.\n", oc_getreg(i2c, OCI2C_PRELOW)); - FPGA_I2C_DEBUG_DUMP("OCI2C_PREHIGH: 0x%02x.\n", oc_getreg(i2c, OCI2C_PREHIGH)); - FPGA_I2C_DEBUG_DUMP("OCI2C_CONTROL: 0x%02x.\n", oc_getreg(i2c, OCI2C_CONTROL)); - FPGA_I2C_DEBUG_DUMP("OCI2C_DATA: 0x%02x.\n", oc_getreg(i2c, OCI2C_DATA)); - FPGA_I2C_DEBUG_DUMP("OCI2C_CMD: 0x%02x.\n", oc_getreg(i2c, OCI2C_CMD)); - FPGA_I2C_DEBUG_DUMP("OCI2C_STATUS: 0x%02x.\n", oc_getreg(i2c, OCI2C_STATUS)); - } else { - FPGA_I2C_DEBUG_DUMP("getreg: %p is null.\n", i2c->getreg); - } - } else { - FPGA_I2C_DEBUG_DUMP("i2c %p is null.\n", i2c); - } -} - -void oc_debug_dump_reg_exception(void) -{ - int bus_beg, bus_end, bus; - struct i2c_adapter *adap; - struct ocores_i2c *adap_data; - - bus_beg = 1; - bus_end = 14; - for (bus = bus_beg; bus <= bus_end; bus++) { - adap = i2c_get_adapter(bus); - if (adap) { - adap_data = (struct ocores_i2c *)i2c_get_adapdata(adap); - if (adap_data) { - FPGA_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg begin.\n", bus); - oc_debug_dump_reg(adap_data); - FPGA_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg end.\n", bus); - } else { - FPGA_I2C_DEBUG_DUMP("bus %d i2c_get_adapdata null.\n", bus); - } - i2c_put_adapter(adap); - } else { - FPGA_I2C_DEBUG_DUMP("bus %d i2c_get_adapter null.\n", bus); - } - } -} - -static int oc_calculate_prescale(struct ocores_i2c *i2c, int val) { - if (val <= 0) { - FPGA_I2C_DEBUG_ERROR("input scl clock error, set to default clock: %d.\n", val); - val = DEFAULT_I2C_SCL; - } - return (i2c->clock_khz / (5 * val)) - 1; -} - -static int oc_calculate_scl_clk(struct ocores_i2c *i2c, int prescale) { - if (prescale <= -1) { - FPGA_I2C_DEBUG_ERROR("input prescale error, set to default prescale: %d.\n", prescale); - prescale = DEFAULT_I2C_PRE; - } - return (i2c->clock_khz / (prescale + 1)) / 5; -} - -static int oc_set_scl_clk(struct ocores_i2c *i2c, int val) { - int prescale; - - prescale = oc_calculate_prescale(i2c, val); - oc_setreg(i2c, OCI2C_PRELOW, prescale & 0xff); - oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8); - return prescale; -} - -static int oc_get_scl_clk(struct ocores_i2c *i2c) { - int prescale, prescale_high, prescale_low; - - prescale_low = oc_getreg(i2c, OCI2C_PRELOW); - prescale_high = oc_getreg(i2c, OCI2C_PREHIGH); - prescale = (prescale_high << 8) + (prescale_low & 0xff); - - return oc_calculate_scl_clk(i2c, prescale); -} - -static ssize_t oc_sysfs_show_scl_clk(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct i2c_adapter *adapter; - struct ocores_i2c *i2c; - int scl_clk; - - adapter = to_i2c_adapter(dev); - i2c = (struct ocores_i2c *)i2c_get_adapdata(adapter); - scl_clk = oc_get_scl_clk(i2c); - return snprintf(buf, BUF_SIZE, "%d\n", scl_clk); -} - -static ssize_t oc_sysfs_set_scl_clk(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) -{ - struct i2c_adapter *adapter; - struct ocores_i2c *i2c; - int val; - int ret; - int prescale; - - adapter = to_i2c_adapter(dev); - i2c = (struct ocores_i2c *)i2c_get_adapdata(adapter); - ret = kstrtoint(buf, 0, &val); - if (ret) { - return ret; - } - FPGA_I2C_MUTEX_LOCK(i2c->xfer_lock); - prescale = oc_set_scl_clk(i2c, val); - FPGA_I2C_DEBUG_VERBOSE("i2c->base 0x%p, i2c->clock_khz %d, scl clk 0x%x.\n", i2c->base, i2c->clock_khz, prescale); - FPGA_I2C_MUTEX_UNLOCK(i2c->xfer_lock); - return count; -} -static ssize_t show_oc_debug_value(struct device *dev, struct device_attribute *da, char *buf) -{ - oc_debug_dump_reg_exception(); - return 0; -} - -static SENSOR_DEVICE_ATTR(oc_debug, S_IRUGO | S_IWUSR, show_oc_debug_value, NULL, 0x15); -static SENSOR_DEVICE_ATTR(oc_scl_clk, S_IRUGO | S_IWUSR, oc_sysfs_show_scl_clk, oc_sysfs_set_scl_clk, 0); - -static struct attribute *oc_debug_sysfs_attrs[] = { - &sensor_dev_attr_oc_debug.dev_attr.attr, - NULL -}; - -static struct attribute *oc_scl_clk_sysfs_attrs[] = { - &sensor_dev_attr_oc_scl_clk.dev_attr.attr, - NULL -}; - -static const struct attribute_group oc_debug_sysfs_group = { - .attrs = oc_debug_sysfs_attrs, -}; - -static const struct attribute_group oc_scl_clk_sysfs_group = { - .attrs = oc_scl_clk_sysfs_attrs, -}; - -static void oc_scl_clk_sysfs_init(struct i2c_adapter *adap) -{ - int ret; - - ret = sysfs_create_group(&adap->dev.kobj, &oc_scl_clk_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_create_group ret %d.\n", ret); - return; -} - -static void oc_scl_clk_sysfs_exit(struct i2c_adapter *adap) -{ - sysfs_remove_group(&adap->dev.kobj, (const struct attribute_group *)&oc_scl_clk_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_remove_group.\n"); - return; -} - -static void oc_debug_sysfs_init(struct platform_device *pdev) -{ - int ret; - - ret = sysfs_create_group(&pdev->dev.kobj, &oc_debug_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_create_group ret %d.\n", ret); - return; -} - -static void oc_debug_sysfs_exit(struct platform_device *pdev) -{ - sysfs_remove_group(&pdev->dev.kobj, (const struct attribute_group *)&oc_debug_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_remove_group.\n"); - return; -} - -static int rg_ocores_i2c_probe(struct platform_device *pdev) -{ - struct ocores_i2c *i2c; - struct rg_ocores_i2c_platform_data *pdata; - struct resource *res; - int irq; - int ret; - int i; - - FPGA_I2C_DEBUG_VERBOSE("Enter.\n"); - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - FPGA_I2C_DEBUG_ERROR("platform_get_irq failed irq %d.\n", irq); - return irq; - } - - i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); - if (!i2c) { - FPGA_I2C_DEBUG_ERROR("devm_kzalloc failed.\n"); - return -ENOMEM; - } - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - i2c->base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(i2c->base)) { - FPGA_I2C_DEBUG_ERROR("devm_ioremap_resource failed.\n"); - return PTR_ERR(i2c->base); - } - - pdata = dev_get_platdata(&pdev->dev); - if (pdata) { - i2c->reg_shift = pdata->reg_shift; - i2c->reg_io_width = pdata->reg_io_width; - i2c->clock_khz = pdata->clock_khz; - } else { - ret = ocores_i2c_of_probe(pdev, i2c); - if (ret) - return ret; - } - - if (i2c->reg_io_width == 0) - i2c->reg_io_width = 1; /* Set to default value */ - - - if (!i2c->setreg || !i2c->getreg) { - switch (i2c->reg_io_width) { - case 1: - i2c->setreg = oc_setreg_8; - i2c->getreg = oc_getreg_8; - break; - - case 2: - i2c->setreg = oc_setreg_16; - i2c->getreg = oc_getreg_16; - break; - - case 4: - i2c->setreg = oc_setreg_32; - i2c->getreg = oc_getreg_32; - break; - - default: - dev_err(&pdev->dev, "Unsupported I/O width (%d)\n", - i2c->reg_io_width); - return -EINVAL; - } - } - - ocores_init(i2c); - - init_waitqueue_head(&i2c->wait); - ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0, - pdev->name, i2c); - if (ret) { - dev_err(&pdev->dev, "Cannot claim IRQ\n"); - return ret; - } - - /* hook up driver to tree */ - platform_set_drvdata(pdev, i2c); - i2c->adap = ocores_adapter; - if (pdata->nr) { - i2c->adap.nr = pdata->nr; - dev_info(&pdev->dev, "fpga ocores nr is (%d), irq %d \n", i2c->adap.nr, irq); - } - i2c_set_adapdata(&i2c->adap, i2c); - i2c->adap.dev.parent = &pdev->dev; - i2c->adap.dev.of_node = pdev->dev.of_node; - - /* add i2c adapter to i2c tree */ - ret = i2c_add_numbered_adapter(&i2c->adap); - if (ret) { - dev_err(&pdev->dev, "Failed to add adapter\n"); - return ret; - } - - /* add in known devices to the bus */ - if (pdata) { - for (i = 0; i < pdata->num_devices; i++) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - i2c_new_client_device(&i2c->adap, pdata->devices + i); -#else - i2c_new_device(&i2c->adap, pdata->devices + i); -#endif - } - } - - oc_debug_sysfs_init(pdev); - oc_scl_clk_sysfs_init(&i2c->adap); - return 0; -} - -static int rg_ocores_i2c_remove(struct platform_device *pdev) -{ - struct ocores_i2c *i2c = platform_get_drvdata(pdev); - - /* disable i2c logic */ - oc_setreg(i2c, OCI2C_CONTROL, oc_getreg(i2c, OCI2C_CONTROL) - & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - /* remove adapter & data */ - oc_scl_clk_sysfs_exit(&i2c->adap); - i2c_del_adapter(&i2c->adap); - oc_debug_sysfs_exit(pdev); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int ocores_i2c_suspend(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - return 0; -} - -static int ocores_i2c_resume(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - - ocores_init(i2c); - - return 0; -} - -static SIMPLE_DEV_PM_OPS(ocores_i2c_pm, ocores_i2c_suspend, ocores_i2c_resume); -#define OCORES_I2C_PM (&ocores_i2c_pm) -#else -#define OCORES_I2C_PM NULL -#endif - -static struct platform_driver ocores_i2c_driver = { - .probe = rg_ocores_i2c_probe, - .remove = rg_ocores_i2c_remove, - .driver = { - .owner = THIS_MODULE, - .name = "rg-i2c-ocores", - .of_match_table = ocores_i2c_match, - .pm = OCORES_I2C_PM, - }, -}; - -module_platform_driver(ocores_i2c_driver); - -MODULE_AUTHOR("Peter Korsgaard "); -MODULE_DESCRIPTION("OpenCores I2C bus driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:ocores-i2c"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h deleted file mode 100755 index 1aedd7793c77..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _FPGA_I2C_OCORES_H -#define _FPGA_I2C_OCORES_H - -struct rg_ocores_i2c_platform_data { - u32 reg_shift; /* register offset shift value */ - u32 reg_io_width; /* register io read/write width */ - u32 clock_khz; /* input clock in kHz */ - u8 num_devices; /* number of devices in the devices list */ - struct i2c_board_info const *devices; /* devices connected to the bus */ - int nr; /* i2c bus num */ -}; - -#endif /* _FPGA_I2C_OCORES_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c deleted file mode 100755 index 669198ca59fd..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c +++ /dev/null @@ -1,1144 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "fpga_i2c_ocores.h" -#include "fpga_pcie_i2c.h" -#include "fpga_reg_defs.h" - -#include -#include -#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 15, 0) -#include -#else -#include -#endif -#include -#include -#include - - -#ifdef FPGA_PCIE_I2C_DEBUG -#include -#include -#include -#include -#include - -char *enum_log="/home/pciuio-log"; - -void filewrite(char* filename, char* data) -{ - struct file *filp; - mm_segment_t fs; - filp = filp_open(filename, O_RDWR|O_APPEND|O_CREAT, 0644); - if(IS_ERR(filp)) - { - printk("<0>""open file error...\n"); - return; - } - - fs=get_fs(); - set_fs(KERNEL_DS); - filp->f_op->write(filp, data, strlen(data),&filp->f_pos); - set_fs(fs); - filp_close(filp,NULL); -} - -void enum_time_log(char *log) -{ - struct timex txc; - struct rtc_time tm; - char time_str[64]; - int ret = 0; - - do_gettimeofday(&(txc.time)); - rtc_time_to_tm(txc.time.tv_sec,&tm); - memset(time_str, 0x0, 64); - ret = sprintf(time_str, "UTC time:%d-%d-%d %d:%d:%d ", - tm.tm_year+1900, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); - - filewrite(enum_log, time_str); - filewrite(enum_log, log); -} - -void enum_notime_log(char *log) -{ - filewrite(enum_log, log); -} -#else -void enum_time_log(char *log) -{ - return; -} -void enum_notime_log(char *log) -{ - return; -} -#endif - - -static void __iomem *g_fpga_pcie_mem_base = NULL; - -int g_fpga_pcie_debug = 0; -int g_fpga_pcie_error = 0; -int g_fpga_pcie_reset_en = 0; -int ocore_ctl_startbus = 1; -int ocore_ctl_numbers = 14; -module_param(g_fpga_pcie_reset_en, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_pcie_debug, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_pcie_error, int, S_IRUGO | S_IWUSR); -module_param(ocore_ctl_startbus, int, S_IRUGO | S_IWUSR); -module_param(ocore_ctl_numbers, int, S_IRUGO | S_IWUSR); - - -#define FPGA_PCIE_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_fpga_pcie_debug) { \ - printk(KERN_ERR "[FPGA_PCIE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_PCIE_DEBUG_ERROR(fmt, args...) do { \ - if (g_fpga_pcie_error) { \ - printk(KERN_ERR "[FPGA_PCIE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_MSI_IRQ_NUM (ocore_ctl_numbers) -#define FPGA_MSI_IRQ_BEGIN (0) -#define FPGA_MSI_IRQ_END ((FPGA_MSI_IRQ_BEGIN) + (FPGA_MSI_IRQ_NUM)) -#define FPGA_I2C_OCORE_START_BASE (0x800) -#define FPGA_I2C_OCORE_END_BASE (0x81f) -#define FPGA_I2C_OCORE_CTRL_SIZE (0x20) -#define FPGA_I2C_OCORE_CTRL_START(id) ((FPGA_I2C_OCORE_START_BASE) + (id) * (FPGA_I2C_OCORE_CTRL_SIZE)) -#define FPGA_I2C_OCORE_CTRL_END(id) ((FPGA_I2C_OCORE_END_BASE) + (id) * (FPGA_I2C_OCORE_CTRL_SIZE)) -#define FPGA_I2C_OCORE_CTRL_IRQ(id) (id) - - -#define DEFINE_FPGA_PCIE_OCORE_DATA(_id) \ - static struct rg_ocores_i2c_platform_data rg_i2c_ocore_pdata_##_id = { \ - .reg_shift = 0, \ - .reg_io_width = 4, \ - .clock_khz = 125000, \ - .num_devices = 0, \ - }; - -DEFINE_FPGA_PCIE_OCORE_DATA(0); -DEFINE_FPGA_PCIE_OCORE_DATA(1); -DEFINE_FPGA_PCIE_OCORE_DATA(2); -DEFINE_FPGA_PCIE_OCORE_DATA(3); -DEFINE_FPGA_PCIE_OCORE_DATA(4); -DEFINE_FPGA_PCIE_OCORE_DATA(5); -DEFINE_FPGA_PCIE_OCORE_DATA(6); -DEFINE_FPGA_PCIE_OCORE_DATA(7); -DEFINE_FPGA_PCIE_OCORE_DATA(8); -DEFINE_FPGA_PCIE_OCORE_DATA(9); -DEFINE_FPGA_PCIE_OCORE_DATA(10); -DEFINE_FPGA_PCIE_OCORE_DATA(11); -DEFINE_FPGA_PCIE_OCORE_DATA(12); -DEFINE_FPGA_PCIE_OCORE_DATA(13); -DEFINE_FPGA_PCIE_OCORE_DATA(14); -DEFINE_FPGA_PCIE_OCORE_DATA(15); -DEFINE_FPGA_PCIE_OCORE_DATA(16); -DEFINE_FPGA_PCIE_OCORE_DATA(17); -DEFINE_FPGA_PCIE_OCORE_DATA(18); -DEFINE_FPGA_PCIE_OCORE_DATA(19); -DEFINE_FPGA_PCIE_OCORE_DATA(20); -DEFINE_FPGA_PCIE_OCORE_DATA(21); -DEFINE_FPGA_PCIE_OCORE_DATA(22); -DEFINE_FPGA_PCIE_OCORE_DATA(23); -DEFINE_FPGA_PCIE_OCORE_DATA(24); -DEFINE_FPGA_PCIE_OCORE_DATA(25); -DEFINE_FPGA_PCIE_OCORE_DATA(26); -DEFINE_FPGA_PCIE_OCORE_DATA(27); - -#define DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(_id) \ - static const struct resource fpga_pcie_i2c_ocores_resources_##_id[] = { \ - { \ - .start = FPGA_I2C_OCORE_CTRL_START(_id), \ - .end = FPGA_I2C_OCORE_CTRL_END(_id), \ - .flags = IORESOURCE_MEM, \ - }, \ - { \ - .start = FPGA_I2C_OCORE_CTRL_IRQ(_id), \ - .end = FPGA_I2C_OCORE_CTRL_IRQ(_id), \ - .flags = IORESOURCE_IRQ, \ - }, \ - } - -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(0); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(1); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(2); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(3); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(4); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(5); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(6); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(7); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(8); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(9); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(10); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(11); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(12); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(13); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(14); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(15); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(16); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(17); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(18); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(19); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(20); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(21); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(22); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(23); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(24); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(25); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(26); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(27); - -#define DEFINE_FPGA_PCIE_MFD_CELL_CFG(_id) \ -{ \ - .name = "rg-i2c-ocores", \ - .id = (_id), \ - .num_resources = ARRAY_SIZE(fpga_pcie_i2c_ocores_resources_##_id), \ - .resources = fpga_pcie_i2c_ocores_resources_##_id, \ - .platform_data = &rg_i2c_ocore_pdata_##_id, \ - .pdata_size = sizeof(rg_i2c_ocore_pdata_##_id), \ -} - - -static const struct mfd_cell fpga_pcie_cells_bar0_cfg0[] = { - DEFINE_FPGA_PCIE_MFD_CELL_CFG(0), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(1), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(2), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(3), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(4), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(5), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(6), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(7), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(8), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(9), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(10), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(11), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(12), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(13), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(14), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(15), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(16), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(17), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(18), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(19), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(20), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(21), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(22), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(23), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(24), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(25), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(26), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(27), -}; - -struct rgde_dev { - struct uio_info info; - struct pci_dev *pdev; - struct list_head list; - enum xdk_intr_mode mode; -}; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) -/* XXX taken from uio.c, just for dumping */ -struct uio_device { - struct module *owner; - struct device *dev; - int minor; - atomic_t event; - struct fasync_struct *async_queue; - wait_queue_head_t wait; - struct uio_info *info; - struct kobject *map_dir; - struct kobject *portio_dir; -}; -#else -/* do noting add tjm */ -#endif - - -static char *intr_mode; -static enum xdk_intr_mode intr_mode_preferred = XDK_INTR_MODE_MSIX; - - -static struct list_head rgde_dev_que; - -static int rgde_dev_list_dump(void) -{ - char str[256]; - struct rgde_dev *node, *tmp; - struct uio_device *udev; - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - udev = node->info.uio_dev; - memset(str, 0x0, 256); - sprintf(str, "pciuio device minor:%d\n", udev->minor); - enum_notime_log(str); - } - return 0; -} - -void rgde_dev_que_add(struct rgde_dev *uiodev) -{ - struct rgde_dev *node, *tmp; - - if (uiodev == NULL) { - return; - } - - if (list_empty(&rgde_dev_que)) { - list_add(&uiodev->list, &rgde_dev_que); - return; - } - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor > ((uiodev->info).uio_dev)->minor) { - break; - } - } - list_add_tail(&uiodev->list, &node->list); - - return; -} - - -void rgde_dev_que_del(struct rgde_dev *uiodev) -{ - struct rgde_dev *node, *tmp; - - if (uiodev == NULL) { - return; - } - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == ((uiodev->info).uio_dev)->minor) { - list_del(&node->list); - break; - } - } - - return; -} - - -struct pci_dev *rgde_to_pci_device(int minor) -{ - - struct rgde_dev *node, *tmp; - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (node->info.uio_dev->minor == minor) { - return node->pdev; - } - - if (node->info.uio_dev->minor < minor) { - return NULL; - } - } - - return NULL; -} -EXPORT_SYMBOL(rgde_to_pci_device); - -int pkt_get_mod(int logic_dev, int *mod) -{ - *mod = 0; - return 0; -} -EXPORT_SYMBOL(pkt_get_mod); - -int pkt_get_port(int logic_dev, int *port) -{ - *port = 1; - return 0; -} -EXPORT_SYMBOL(pkt_get_port); - -static int rgde_intr_mode_config(char *intr_str) -{ -#if 0 - /* default intr mode : msix */ - if (!intr_str) { - return 0; - } - - if (!strcmp(intr_str, INTR_MODE_MSIX_NAME)) { - intr_mode_preferred = XDK_INTR_MODE_MSIX; - return 0; - } - - if (!strcmp(intr_str, INTR_MODE_LEGACY_NAME)) { - intr_mode_preferred = XDK_INTR_MODE_LEGACY; - return 0; - } - - /* For now, msix & legacy mode supported only. */ - printk("<0>""Error: bad parameter - %s\n", intr_str); - return -EINVAL; -#else - intr_mode_preferred = XDK_INTR_MODE_LEGACY; - return 0; -#endif -} - -/* Remap pci resources described by bar #pci_bar in uio resource n. */ -static int rgde_setup_iomem(struct pci_dev *dev, struct uio_info *info, - int n, int pci_bar, const char *name) -{ - unsigned long addr, len; - void *internal_addr; - - if (n >= ARRAY_SIZE(info->mem)) { - return -EINVAL; - } - - addr = pci_resource_start(dev, pci_bar); - FPGA_PCIE_DEBUG_VERBOSE("iomem phys addr:%lx\n", addr); - len = pci_resource_len(dev, pci_bar); - if (addr == 0 || len == 0) { - return -1; - } - - - internal_addr = ioremap(addr, len); - FPGA_PCIE_DEBUG_VERBOSE("iomem phys addr:0x%lx, len 0x%lx, internal_addr %p.\n", addr, len, internal_addr); - - if (internal_addr == NULL) { - return -1; - } - - FPGA_PCIE_DEBUG_VERBOSE("iomem internal_addr:%p\n", internal_addr); - if (pci_bar == 0) { - - g_fpga_pcie_mem_base = internal_addr; - FPGA_PCIE_DEBUG_VERBOSE("pci_bar %d, set g_fpga_pcie_mem_base %p\n", pci_bar, g_fpga_pcie_mem_base); - } - info->mem[n].name = name; - info->mem[n].addr = addr; - info->mem[n].internal_addr = internal_addr; - info->mem[n].size = len; - info->mem[n].memtype = UIO_MEM_PHYS; - - return 0; -} - -/* Unmap previously ioremap'd resources */ -static void rgde_release_iomem(struct uio_info *info) -{ - int i; - - for (i = 0; i < MAX_UIO_MAPS; i++) { - if (info->mem[i].internal_addr) { - iounmap(info->mem[i].internal_addr); - } - } -} - -/* Get pci port io resources described by bar #pci_bar in uio resource n. */ -static int rgde_setup_ioport(struct pci_dev *dev, struct uio_info *info, - int n, int pci_bar, const char *name) -{ - unsigned long addr, len; - - if (n >= ARRAY_SIZE(info->port)) { - return -EINVAL; - } - - addr = pci_resource_start(dev, pci_bar); - len = pci_resource_len(dev, pci_bar); - if (addr == 0 || len == 0) { - return -EINVAL; - } - - info->port[n].name = name; - info->port[n].start = addr; - info->port[n].size = len; - /* skl : FIX me */ - info->port[n].porttype = UIO_PORT_X86; - - return 0; -} - -static int rgde_setup_bars(struct pci_dev *dev, struct uio_info *info) -{ - int i, iom, iop, ret; - unsigned long flags; - static const char *bar_names[PCI_STD_RESOURCE_END + 1] = { - "BAR0", "BAR1", "BAR2", "BAR3", "BAR4", "BAR5", - }; - iom = 0; - iop = 0; - - for (i = 0; i < ARRAY_SIZE(bar_names); i++) { - if (pci_resource_len(dev, i) != 0 && pci_resource_start(dev, i) != 0) { - - flags = pci_resource_flags(dev, i); - FPGA_PCIE_DEBUG_VERBOSE("flags:%lx\n", flags); - if (flags & IORESOURCE_MEM) { - ret = rgde_setup_iomem(dev, info, iom, i, bar_names[i]); - if (ret != 0) { - return ret; - } - iom++; - } else if (flags & IORESOURCE_IO) { - ret = rgde_setup_ioport(dev, info, iop, i, bar_names[i]); - if (ret != 0) { - return ret; - } - iop++; - } - } - } - - return (iom != 0 || iop != 0) ? ret : -ENOENT; -} - -/** - * This is interrupt handler which will check if the interrupt is for the right device. - * If yes, disable it here and will be enable later. - */ -static irqreturn_t rgde_irqhandler(int irq, struct uio_info *info) -{ - struct rgde_dev *udev = info->priv; - - if (udev->mode == XDK_INTR_MODE_LEGACY /*&& !pci_check_and_mask_intx(udev->pdev)*/) { - return IRQ_NONE; - } - - return IRQ_HANDLED; -} - -/* - * It masks the msix on/off of generating MSI-X messages. - */ -static void rgde_msix_mask_irq(struct msi_desc *desc, int32_t state) -{ - u32 mask_bits = desc->masked; - unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + - PCI_MSIX_ENTRY_VECTOR_CTRL; - - if (state != 0) { - mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; - } else { - mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; - } - - if (mask_bits != desc->masked) { - writel(mask_bits, desc->mask_base + offset); - readl(desc->mask_base); - desc->masked = mask_bits; - } -} - -/** - * This is the irqcontrol callback to be registered to uio_info. - * It can be used to disable/enable interrupt from user space processes. - * - * @param info - * pointer to uio_info. - * @param irq_state - * state value. 1 to enable interrupt, 0 to disable interrupt. - * - * @return - * - On success, 0. - * - On failure, a negative value. - */ -static int rgde_irqcontrol(struct uio_info *info, s32 irq_state) -{ - struct rgde_dev *udev = info->priv; - struct pci_dev *pdev = udev->pdev; - - /* pci_cfg_access_lock(pdev); */ - - if (udev->mode == XDK_INTR_MODE_LEGACY) { - pci_intx(pdev, !!irq_state); - } else if (udev->mode == XDK_INTR_MODE_MSIX) { - struct msi_desc *desc; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)) - list_for_each_entry(desc, &pdev->msi_list, list) { - rgde_msix_mask_irq(desc, irq_state); - } -#else - list_for_each_entry(desc, &pdev->dev.msi_list, list) { - rgde_msix_mask_irq(desc, irq_state); - } -#endif - } - - //pci_cfg_access_unlock(pdev); - - return 0; -} - -int rgde_reg32_read(int minor, uint64_t offset, uint32_t *data) -{ - struct rgde_dev *node, *tmp; - struct rgde_dev *uiodev; - - FPGA_PCIE_DEBUG_VERBOSE("enter rgde_reg32_read\n"); - uiodev = NULL; - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == minor) { - uiodev = node; - break; - } - } - - if (uiodev == NULL) { - return -1; - } - - if (uiodev->info.mem[0].internal_addr == NULL) { - return -1; - } - -#if 0 - FPGA_PCIE_DEBUG_VERBOSE("internal_addr:%x\n", uiodev->info.mem[0].internal_addr); - - memcpy(ioval, (uint8_t *)uiodev->info.mem[0].internal_addr + offset, sizeof(ioval)); - for (i = 0; i < sizeof(ioval); i++) { - FPGA_PCIE_DEBUG_VERBOSE("mem[%x]:%02x\n", (uint32_t)(offset + i), ioval[i]); - } -#endif - - *data = (*((uint32_t *)((uint8_t *)(uiodev->info.mem[0].internal_addr) + offset))); - return 0; -} -EXPORT_SYMBOL(rgde_reg32_read); - -int rgde_reg32_write(int minor, uint64_t offset, uint32_t data) -{ - struct rgde_dev *node, *tmp; - struct rgde_dev *uiodev; - - uiodev = NULL; - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == minor) { - uiodev = node; - break; - } - } - - if (uiodev == NULL) { - return -1; - } - - if (uiodev->info.mem[0].internal_addr == NULL) { - return -1; - } - - FPGA_PCIE_DEBUG_VERBOSE("enter rgde_reg32_write\n"); - FPGA_PCIE_DEBUG_VERBOSE("internal_addr:%p,offset:%llx,data:%x\n", uiodev->info.mem[0].internal_addr, offset, data); - - *((uint32_t *)((uint8_t *)(uiodev->info.mem[0].internal_addr) + offset)) = (data); - FPGA_PCIE_DEBUG_VERBOSE("rgde_reg32_write ok!\n"); - return 0; -} -EXPORT_SYMBOL(rgde_reg32_write); - -#if 0 -static void rgde_dump_global_regs(int minor) -{ - struct rgde_dev *node, *tmp; - struct rgde_dev *uiodev; - uint8_t ioval[4]; - int i, j; - - - uiodev = NULL; - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == minor) { - uiodev = node; - break; - } - } - - if (uiodev == NULL) { - return ; - } - - if (uiodev->info.mem[0].internal_addr == NULL) { - return ; - } - - FPGA_PCIE_DEBUG_VERBOSE("internal_addr:%p\n", uiodev->info.mem[0].internal_addr); - for (j = 0; j < sizeof(uint32_t) * 6; j += sizeof(uint32_t)) { - memcpy(ioval, (uint8_t *)uiodev->info.mem[0].internal_addr + j, sizeof(ioval)); - for (i = 0; i < sizeof(ioval); i++) { - FPGA_PCIE_DEBUG_VERBOSE("mem[%d]:%02x\n", (uint32_t)(j + i), ioval[i]); - } - } - - return; -} -#endif - -#if 1 - -#define FPGA_PCIE_TEST_REG (0x08) -#define FPGA_PCIE_TEST_VAL (0x5A) - -#define FPGA_PCIE_RESET_PCA9548_BASE (0x20) -#define FPGA_PCIE_RESET_PCA9548_NUM (0x4) -#define FPGA_PCIE_RESET_OCORE_BASE (0x100) -#define FPGA_PCIE_RESET_OCORE_NUM (ocore_ctl_numbers) - -#define FPGA_PCIE_RESET_CPLD_I2C_BASE (0x40) -#define FPGA_PCIE_RESET_CPLD_I2C_NUM (0x4) - - -#define FPGA_PCIE_REG_STEP (0x4) - -#define DFD_CPLD_I2C_RETRY_TIMES 3 -#define DFD_CPLD_I2C_RETRY_DELAY 100 /* ms */ - -#define PCA9548_MAX_CPLD_NUM (32) - -typedef struct fpga_pcie_pca9548_cfg_info_s { - int pca9548_bus; - int pca9548_addr; - int cfg_offset; -} fpga_pcie_pca9548_cfg_info_t; - -typedef struct fpga_pcie_card_info_s { - int dev_type; - fpga_pcie_pca9548_cfg_info_t pca9548_cfg_info[PCA9548_MAX_CPLD_NUM]; -} fpga_pcie_card_info_t; - -static fpga_pcie_card_info_t g_fpga_pcie_card_info[] = { - { - /* RA-B6510-32C */ - .dev_type = 0x404b, - .pca9548_cfg_info = { - { - .pca9548_bus = 12, - .pca9548_addr = 0x70, - .cfg_offset = 0x20, - }, - { - .pca9548_bus = 12, - .pca9548_addr = 0x71, - .cfg_offset = 0x20, - }, - { - .pca9548_bus = 12, - .pca9548_addr = 0x72, - .cfg_offset = 0x20, - }, - { - .pca9548_bus = 12, - .pca9548_addr = 0x73, - .cfg_offset = 0x20, - }, - }, - }, -}; - -extern void pca954x_hw_do_reset_func_register(void* func); -extern int dfd_get_my_card_type(void); - -static void fpga_pcie_setreg_32(int offset, u32 data) -{ - if (g_fpga_pcie_mem_base) { - *((uint32_t *)((uint8_t *)(g_fpga_pcie_mem_base) + offset)) = (data); - } else { - FPGA_PCIE_DEBUG_ERROR("g_fpga_pcie_mem_base is null.\n"); - } - return; -} - - -static inline u32 fpga_pcie_getreg_32(int offset) -{ - u32 data = 0; - - if (g_fpga_pcie_mem_base) { - data = (*((uint32_t *)((uint8_t *)(g_fpga_pcie_mem_base) + offset))); - } else { - FPGA_PCIE_DEBUG_ERROR("g_fpga_pcie_mem_base is null.\n"); - } - return data; -} - -static void fpga_do_cpld_i2c_ctrl(int en) -{ -#if 0 - int i; - int offset; - - for (i = 0; i < FPGA_PCIE_RESET_CPLD_I2C_NUM; i++) { - offset = FPGA_PCIE_RESET_CPLD_I2C_BASE + i * FPGA_PCIE_REG_STEP; - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); - } -#endif - return; -} - - -static void fpga_do_ocore_ctrl(int en) -{ - int i; - int offset; - - for (i = 0; i < FPGA_PCIE_RESET_OCORE_NUM; i++) { - offset = FPGA_PCIE_RESET_OCORE_BASE + i * FPGA_PCIE_REG_STEP; - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); - } -} - -static void fpga_do_9548_ctrl(int en) -{ - int i; - int offset; - - for (i = 0; i < FPGA_PCIE_RESET_PCA9548_NUM; i++) { - offset = FPGA_PCIE_RESET_PCA9548_BASE + i * FPGA_PCIE_REG_STEP; - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); - } - -} - -static void fpga_reset_ocore_i2c(void) -{ - u32 data; - - - if (g_fpga_pcie_reset_en == 0) { - FPGA_PCIE_DEBUG_VERBOSE("g_fpga_pcie_reset_en is 0, do nothing.\n"); - return; - } - - data = fpga_pcie_getreg_32(FPGA_PCIE_TEST_REG); - FPGA_PCIE_DEBUG_VERBOSE("BEGIN FPGA_PCIE_TEST_REG=[0x%x], write 0x%x.\n", data, FPGA_PCIE_TEST_VAL); - fpga_pcie_setreg_32(FPGA_PCIE_TEST_REG, FPGA_PCIE_TEST_VAL); - data = fpga_pcie_getreg_32(FPGA_PCIE_TEST_REG); - FPGA_PCIE_DEBUG_VERBOSE("END FPGA_PCIE_TEST_REG=[0x%x].\n", data); - - - - fpga_do_9548_ctrl(0); - fpga_do_ocore_ctrl(0); - fpga_do_cpld_i2c_ctrl(0); - - mdelay(500); - - - fpga_do_9548_ctrl(1); - fpga_do_ocore_ctrl(1); - fpga_do_cpld_i2c_ctrl(1); - - return; -} - -static void fpga_do_pca9548_reset_ctrl(int offset, int en) -{ - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); -} - -fpga_pcie_card_info_t* fpga_pcie_get_card_info(int dev_type) -{ - int i; - int size; - - size = ARRAY_SIZE(g_fpga_pcie_card_info); - - FPGA_PCIE_DEBUG_VERBOSE("Enter dev_type 0x%x size %d.\n", dev_type, size); - for (i = 0; i < size; i++) { - if (g_fpga_pcie_card_info[i].dev_type == dev_type) { - FPGA_PCIE_DEBUG_VERBOSE("match dev_type 0x%x.\n", dev_type); - return &g_fpga_pcie_card_info[i]; - } - } - - FPGA_PCIE_DEBUG_VERBOSE("dismatch dev_type 0x%x.\n", dev_type); - return NULL; -} - -fpga_pcie_pca9548_cfg_info_t* fpga_pcie_get_pca9548_cfg_info(int bus, int addr) -{ - int dev_type; - fpga_pcie_card_info_t *info; - fpga_pcie_pca9548_cfg_info_t *pca9548_cfg_info; - int i; - int size; - - dev_type = dfd_get_my_card_type(); - if (dev_type < 0) { - FPGA_PCIE_DEBUG_ERROR("drv_get_my_dev_type failed ret %d.\n", dev_type); - return NULL; - } - - info = fpga_pcie_get_card_info(dev_type); - if (info == NULL) { - FPGA_PCIE_DEBUG_ERROR("fpga_pcie_get_card_info dev_type %d failed.\n", dev_type); - return NULL; - } - - size = PCA9548_MAX_CPLD_NUM; - for (i = 0; i < size; i++) { - pca9548_cfg_info = &(info->pca9548_cfg_info[i]); - if ((pca9548_cfg_info->pca9548_bus == bus) && (pca9548_cfg_info->pca9548_addr == addr)) { - FPGA_PCIE_DEBUG_VERBOSE("match dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return pca9548_cfg_info; - } - } - - FPGA_PCIE_DEBUG_VERBOSE("dismatch dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return NULL; -} - - -void fpga_do_pca954x_reset_func(int bus, int addr) -{ - fpga_pcie_pca9548_cfg_info_t *cfg_info; - - cfg_info = fpga_pcie_get_pca9548_cfg_info(bus, addr); - if (cfg_info == NULL) { - FPGA_PCIE_DEBUG_VERBOSE("fpga_do_pca954x_reset_func do nothing.\n"); - return; - } - - FPGA_PCIE_DEBUG_VERBOSE("bus %d addr 0x%x, cfg_info.offset:0x%x.\n", bus, addr, cfg_info->cfg_offset); - - fpga_do_pca9548_reset_ctrl(cfg_info->cfg_offset, 0); - mdelay(250); - fpga_do_pca9548_reset_ctrl(cfg_info->cfg_offset, 1); -} - -static void fpga_do_pca954x_reset_func_reg(void) -{ - pca954x_hw_do_reset_func_register(fpga_do_pca954x_reset_func); -} - -#endif - - -static int fpga_i2c_ocore_device_init(struct pci_dev *pdev, const struct pci_device_id *id) -{ - int ret, index; - struct rg_ocores_i2c_platform_data *init_nr_ocores; - - for (index = 0 ; index < ARRAY_SIZE(fpga_pcie_cells_bar0_cfg0); index++) { - init_nr_ocores = fpga_pcie_cells_bar0_cfg0[index].platform_data; - init_nr_ocores->nr = ocore_ctl_startbus + index; - } - FPGA_PCIE_DEBUG_VERBOSE("Enter.\n"); - FPGA_PCIE_DEBUG_VERBOSE("Begin mfd_add_devices.\n"); - ret = mfd_add_devices(&pdev->dev, 0, - fpga_pcie_cells_bar0_cfg0, - ocore_ctl_numbers > ARRAY_SIZE(fpga_pcie_cells_bar0_cfg0) ? ARRAY_SIZE(fpga_pcie_cells_bar0_cfg0) : ocore_ctl_numbers , - &pdev->resource[0], pdev->irq, NULL); - FPGA_PCIE_DEBUG_VERBOSE("End mfd_add_devices ret %d.\n", ret); - if (ret) { - dev_err(&pdev->dev, "mfd_add_devices failed: %d\n", ret); - return -1; - } - - fpga_do_pca954x_reset_func_reg(); - FPGA_PCIE_DEBUG_VERBOSE("Call fpga_do_pca954x_reset_func_reg.\n"); - return 0; -} - -static void fpga_pcie_recover(struct pci_dev *pdev, const struct pci_device_id *id) -{ - struct resource *mem_base; - u32 bar0_val; - int ret; - - mem_base = &pdev->resource[0]; - ret = pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &bar0_val); - if (ret) { - FPGA_PCIE_DEBUG_ERROR("pci_read_config_dword failed ret %d.\n", ret); - return; - } - FPGA_PCIE_DEBUG_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], ret %d.\n", - mem_base->start, bar0_val, ret); - - if (bar0_val != mem_base->start) { - ret = pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, mem_base->start); - if (ret) { - FPGA_PCIE_DEBUG_ERROR("pci_write_config_dword mem_base->start[0x%llx], failed ret %d.\n", mem_base->start, ret); - return; - } - FPGA_PCIE_DEBUG_VERBOSE("pci_write_config_dword mem_base->start[0x%llx] success.\n", mem_base->start); - } else { - FPGA_PCIE_DEBUG_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], do nothing.\n", - mem_base->start, bar0_val); - } -} - -static int fpga_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) -{ - int err; - struct rgde_dev *rdev = NULL; - - FPGA_PCIE_DEBUG_VERBOSE("Enter vendor 0x%x, subsystem_vendor 0x%x.\n", pdev->vendor, pdev->subsystem_vendor); - - /* skl : FIX me */ - /* - if ((pdev->vendor != ) || (pdev->subsystem_vendor != )) { - err = -ENODEV; - goto dev_suppport_err:; - }*/ - - - fpga_pcie_recover(pdev, id); - - /* enable device: ask low-level code to enable I/O and memory */ - FPGA_PCIE_DEBUG_VERBOSE("start pci_enable_device!\n"); - err = pci_enable_device(pdev); - if (err) { - FPGA_PCIE_DEBUG_ERROR("pci_enable_device failed: %d\n", err); - goto dev_ebable_err; - } - - FPGA_PCIE_DEBUG_VERBOSE("start pci_set_master!\n"); - pci_set_master(pdev); - - rdev = kzalloc(sizeof(struct rgde_dev), GFP_KERNEL); - if (!rdev) { - err = -ENOMEM; - goto kzalloc_err; - } - - - FPGA_PCIE_DEBUG_VERBOSE("start rgde_setup_bars!\n"); - err = rgde_setup_bars(pdev, &rdev->info); - if (err != 0) { - goto setup_bars_err; - } - - rdev->info.name = "fpga_pcie"; - rdev->info.version = "0.1"; - rdev->info.handler = rgde_irqhandler; - rdev->info.irqcontrol = rgde_irqcontrol; - rdev->info.priv = rdev; - rdev->pdev = pdev; - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) - err = pci_alloc_irq_vectors(pdev,FPGA_MSI_IRQ_BEGIN + 1, ocore_ctl_numbers, PCI_IRQ_MSI); -#else - err = pci_enable_msi_range(pdev, FPGA_MSI_IRQ_BEGIN + 1, ocore_ctl_numbers); -#endif - if (err != ocore_ctl_numbers) { - FPGA_PCIE_DEBUG_ERROR("pci_enable_msi_block err %d FPGA_MSI_IRQ_NUM %d.\n", err, - ocore_ctl_numbers); - goto uio_register_err; - } - - FPGA_PCIE_DEBUG_VERBOSE("before pci_set_drvdata.\n"); - - pci_set_drvdata(pdev, rdev); - FPGA_PCIE_DEBUG_VERBOSE("after pci_set_drvdata.\n"); - enum_time_log("rgde_dev_que_add\n"); - - mdelay(100); - - fpga_reset_ocore_i2c(); - - fpga_i2c_ocore_device_init(pdev, id); - return 0; - -uio_register_err: - /* udev_irq_err: */ -setup_bars_err: - rgde_release_iomem(&rdev->info); - pci_disable_msi(rdev->pdev); - pci_release_regions(pdev); - kfree(rdev); -kzalloc_err: - /* request_region_err: */ - pci_disable_device(pdev); -dev_ebable_err: - /* dev_suppport_err: */ - return err; -} - -static void fpga_pcie_remove(struct pci_dev *pdev) -{ - struct rgde_dev *rdev = pci_get_drvdata(pdev); - - FPGA_PCIE_DEBUG_VERBOSE("fpga_pcie_remove.\n"); -#if 0 - enum_time_log("rgde_dev_que_del\n"); - printk("<0>""uio device %d del.\n", rdev->info.uio_dev->minor); -#endif - rgde_dev_que_del(rdev); - rgde_dev_list_dump(); -#if 0 - uio_unregister_device(&rdev->info); -#endif - mfd_remove_devices(&pdev->dev); - rgde_release_iomem(&rdev->info); - pci_disable_msi(rdev->pdev); - //pci_release_regions(pdev); - pci_disable_device(pdev); - kfree(rdev); -} - -/* static DEFINE_PCI_DEVICE_TABLE(fpga_pci_ids) = { */ - -static const struct pci_device_id fpga_pci_ids[] = { - { PCI_DEVICE(0x10ee, 0x7022)}, - {0} -}; -MODULE_DEVICE_TABLE(pci, fpga_pci_ids); - - -static struct pci_driver fpga_pcie_driver = { - .name = "fpga_pcie", - .id_table = fpga_pci_ids,/* only dynamic id's */ - .probe = fpga_pcie_probe, - .remove = fpga_pcie_remove, -}; - -static int __init fpga_pcie_init(void) -{ - int ret; - - FPGA_PCIE_DEBUG_VERBOSE("fpga_pcie_init enter!\n"); - ret = rgde_intr_mode_config(intr_mode); - if (ret < 0) { - return ret; - } - - INIT_LIST_HEAD(&rgde_dev_que); - - return pci_register_driver(&fpga_pcie_driver); -} - -static void __exit fpga_pcie_exit(void) -{ - FPGA_PCIE_DEBUG_VERBOSE("fpga_pcie_exit enter!\n"); - pci_unregister_driver(&fpga_pcie_driver); -} - -module_init(fpga_pcie_init); -module_exit(fpga_pcie_exit); -module_param(intr_mode, charp, S_IRUGO); -MODULE_PARM_DESC(intr_mode, - "pci_uio interrupt mode (default=msix):\n" - " " INTR_MODE_MSIX_NAME " Use MSIX interrupt\n" - " " INTR_MODE_LEGACY_NAME " Use Legacy interrupt\n" - "\n"); -MODULE_DESCRIPTION("UIO Driver for PCI Devices"); -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("support "); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h deleted file mode 100755 index 1ea970cc2206..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef _FPGA_PCIE_I2C_H_ -#define _FPGA_PCIE_I2C_H_ - -#ifdef __KERNEL__ -#include -#else -#include -#endif - -#define ENUM_MAX_DEVS (255) - -typedef enum { - CHIP_NONE, - CHIP_PC, -} chiptype_t; - -/* bitmap for ports, 256 ports for now. */ -typedef struct portbitmap_s { - uint8_t bit[32]; -} portbitmap_t; - -typedef struct pc_info_s { - uint8_t ntables; /* number of flow tables */ - uint8_t ncores; /* number of cores */ - uint8_t npipelines; /* number of pipelines */ - uint8_t nports; /* number of ports */ - portbitmap_t pbm_caui; /* bitmap for CAUI ports */ - portbitmap_t pbm_ge; /* bitmap for GE ports */ -} pc_info_t; - -/** - * A structure describing a PCI resource. - */ -struct pci_resource { - uint64_t phys_addr; /**< Physical address, 0 if no resource. */ - uint64_t len; /**< Length of the resource. */ - void *addr; /**< Virtual address, NULL when not mapped. */ -}; - -/** Maximum number of PCI resources. */ -#define PCI_MAX_RESOURCE 6 - -/** Nb. of values in PCI resource format. */ -#define PCI_RESOURCE_FMT_NVAL 3 - -#if 0 -/** IO resource type: memory address space */ -#define IORESOURCE_MEM 0x00000200 -#endif - -typedef struct chipinfo_s { - /* PCI ID */ - uint16_t vendor; - uint16_t dev; - uint8_t rev; - - /* chip properties */ - chiptype_t type; - pc_info_t pc_info; /* if type == CHIP_PC */ -} chipinfo_t; - -typedef struct devinfo_s { - /* static info */ - chipinfo_t chipinfo; - - /* running states */ - uint32_t uiono; /* the "X" in /dev/uioX */ - char *pci_conf_file; /* /sys/devices/ */ - char *dev_file; /* /dev/uioX */ - - struct pci_resource mem_resource[PCI_MAX_RESOURCE]; /**< PCI Memory Resource */ - - uint32_t n_mems; /* no of mem-mapped regions, MUST BE 1 for now */ - uint32_t n_ports;/* no of port-maped regions, MUST BE 0 for now */ -} devinfo_t; - - -#ifdef __KERNEL__ -#include - -struct pci_dev *rgde_to_pci_device(int index); - -int rgde_reg32_read(int minor, uint64_t offset, uint32_t *data); - -int rgde_reg32_write(int minor, uint64_t offset, uint32_t data); - -int pkt_get_mod(int logic_dev, int *mod); - -int pkt_get_port(int logic_dev, int *port); - -/* interrupt mode */ -enum xdk_intr_mode { - XDK_INTR_MODE_NONE = 0, - XDK_INTR_MODE_LEGACY, - XDK_INTR_MODE_MSI, - XDK_INTR_MODE_MSIX -}; - -#define INTR_MODE_NONE_NAME "none" -#define INTR_MODE_LEGACY_NAME "legacy" -#define INTR_MODE_MSI_NAME "msi" -#define INTR_MODE_MSIX_NAME "msix" - -#endif /*__KERNEL__ */ - - -#endif /* _FPGA_PCIE_I2C_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h deleted file mode 100755 index f80c6318564c..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef _FPGA_REG_DEFS_H_ -#define _FPGA_REG_DEFS_H_ - -/** Define Registers */ -/* Global Registers */ -#define RGDE_REG_GLOBAL_BASE 0x00000000 -#define RGDE_REG_VERSION (RGDE_REG_GLOBAL_BASE + 0x00) -#define RGDE_REG_DATE (RGDE_REG_GLOBAL_BASE + 0x04) -#define RGDE_REG_TEST (RGDE_REG_GLOBAL_BASE + 0x08) -#define RGDE_REG_INT_ENABLE (RGDE_REG_GLOBAL_BASE + 0x10) -#define RGDE_REG_INT_STATUS (RGDE_REG_GLOBAL_BASE + 0x14) - -/* MDIO Registers */ -#define RGDE_REG_MDIO_BASE 0x00000100 -#define RGDE_REG_MDIO_CFG_DT (RGDE_REG_MDIO_BASE + 0x00) -#define RGDE_REG_MDIO_CFG_SPEED (RGDE_REG_MDIO_BASE + 0x04) -#define RGDE_REG_MDIO_CFG_START (RGDE_REG_MDIO_BASE + 0x08) -#define RGDE_REG_MDIO_RDAT (RGDE_REG_MDIO_BASE + 0x10) -#define RGDE_REG_MDIO_STATUS (RGDE_REG_MDIO_BASE + 0x14) - -/* GE0 PORT Registers */ -#define RGDE_REG_GE0_PORT_BASE 0x00001000 -#define RGDE_REG_GE0_PORT_CTL (RGDE_REG_GE0_PORT_BASE + 0x00) -#define RGDE_REG_GE0_PORT_STA (RGDE_REG_GE0_PORT_BASE + 0x04) -#define RGDE_REG_GE0_PORT_MTU (RGDE_REG_GE0_PORT_BASE + 0x08) -#define RGDE_REG_GE0_PORT_RXPKTS (RGDE_REG_GE0_PORT_BASE + 0x10) -#define RGDE_REG_GE0_PORT_RXBYTE (RGDE_REG_GE0_PORT_BASE + 0x18) -#define RGDE_REG_GE0_PORT_RXERR (RGDE_REG_GE0_PORT_BASE + 0x20) -#define RGDE_REG_GE0_PORT_RXDROP (RGDE_REG_GE0_PORT_BASE + 0x28) -#define RGDE_REG_GE0_PORT_RXMULTI (RGDE_REG_GE0_PORT_BASE + 0x30) -#define RGDE_REG_GE0_PORT_RXBRO (RGDE_REG_GE0_PORT_BASE + 0x38) -#define RGDE_REG_GE0_PORT_TXPKTS (RGDE_REG_GE0_PORT_BASE + 0x40) -#define RGDE_REG_GE0_PORT_TXBYTE (RGDE_REG_GE0_PORT_BASE + 0x48) -#define RGDE_REG_GE0_PORT_TXERR (RGDE_REG_GE0_PORT_BASE + 0x50) -#define RGDE_REG_GE0_PORT_TXDROP (RGDE_REG_GE0_PORT_BASE + 0x58) -#define RGDE_REG_GE0_PORT_TXMULT (RGDE_REG_GE0_PORT_BASE + 0x60) -#define RGDE_REG_GE0_PORT_TXBRO (RGDE_REG_GE0_PORT_BASE + 0x68) - -/* GE1 PORT Registers */ -#define RGDE_REG_GE1_PORT_BASE 0x00001100 -#define RGDE_REG_GE1_PORT_CTL (RGDE_REG_GE1_PORT_BASE + 0x00) -#define RGDE_REG_GE1_PORT_STA (RGDE_REG_GE1_PORT_BASE + 0x04) -#define RGDE_REG_GE1_PORT_MTU (RGDE_REG_GE1_PORT_BASE + 0x08) -#define RGDE_REG_GE1_PORT_RXPKTS (RGDE_REG_GE1_PORT_BASE + 0x10) -#define RGDE_REG_GE1_PORT_RXBYTE (RGDE_REG_GE1_PORT_BASE + 0x18) -#define RGDE_REG_GE1_PORT_RXERR (RGDE_REG_GE1_PORT_BASE + 0x20) -#define RGDE_REG_GE1_PORT_RXDROP (RGDE_REG_GE1_PORT_BASE + 0x28) -#define RGDE_REG_GE1_PORT_RXMULTI (RGDE_REG_GE1_PORT_BASE + 0x30) -#define RGDE_REG_GE1_PORT_RXBRO (RGDE_REG_GE1_PORT_BASE + 0x38) -#define RGDE_REG_GE1_PORT_TXPKTS (RGDE_REG_GE1_PORT_BASE + 0x40) -#define RGDE_REG_GE1_PORT_TXBYTE (RGDE_REG_GE1_PORT_BASE + 0x48) -#define RGDE_REG_GE1_PORT_TXERR (RGDE_REG_GE1_PORT_BASE + 0x50) -#define RGDE_REG_GE1_PORT_TXDROP (RGDE_REG_GE1_PORT_BASE + 0x58) -#define RGDE_REG_GE1_PORT_TXMULT (RGDE_REG_GE1_PORT_BASE + 0x60) -#define RGDE_REG_GE1_PORT_TXBRO (RGDE_REG_GE1_PORT_BASE + 0x68) - -/* GE2 PORT Registers */ -#define RGDE_REG_GE2_PORT_BASE 0x00001200 -#define RGDE_REG_GE2_PORT_CTL (RGDE_REG_GE2_PORT_BASE + 0x00) -#define RGDE_REG_GE2_PORT_STA (RGDE_REG_GE2_PORT_BASE + 0x04) -#define RGDE_REG_GE2_PORT_MTU (RGDE_REG_GE2_PORT_BASE + 0x08) -#define RGDE_REG_GE2_PORT_RXPKTS (RGDE_REG_GE2_PORT_BASE + 0x10) -#define RGDE_REG_GE2_PORT_RXBYTE (RGDE_REG_GE2_PORT_BASE + 0x18) -#define RGDE_REG_GE2_PORT_RXERR (RGDE_REG_GE2_PORT_BASE + 0x20) -#define RGDE_REG_GE2_PORT_RXDROP (RGDE_REG_GE2_PORT_BASE + 0x28) -#define RGDE_REG_GE2_PORT_RXMULTI (RGDE_REG_GE2_PORT_BASE + 0x30) -#define RGDE_REG_GE2_PORT_RXBRO (RGDE_REG_GE2_PORT_BASE + 0x38) -#define RGDE_REG_GE2_PORT_TXPKTS (RGDE_REG_GE2_PORT_BASE + 0x40) -#define RGDE_REG_GE2_PORT_TXBYTE (RGDE_REG_GE2_PORT_BASE + 0x48) -#define RGDE_REG_GE2_PORT_TXERR (RGDE_REG_GE2_PORT_BASE + 0x50) -#define RGDE_REG_GE2_PORT_TXDROP (RGDE_REG_GE2_PORT_BASE + 0x58) -#define RGDE_REG_GE2_PORT_TXMULT (RGDE_REG_GE2_PORT_BASE + 0x60) -#define RGDE_REG_GE2_PORT_TXBRO (RGDE_REG_GE2_PORT_BASE + 0x68) - -/* GE3 PORT Registers */ -#define RGDE_REG_GE3_PORT_BASE 0x00001300 -#define RGDE_REG_GE3_PORT_CTL (RGDE_REG_GE3_PORT_BASE + 0x00) -#define RGDE_REG_GE3_PORT_STA (RGDE_REG_GE3_PORT_BASE + 0x04) -#define RGDE_REG_GE3_PORT_MTU (RGDE_REG_GE3_PORT_BASE + 0x08) -#define RGDE_REG_GE3_PORT_RXPKTS (RGDE_REG_GE3_PORT_BASE + 0x10) -#define RGDE_REG_GE3_PORT_RXBYTE (RGDE_REG_GE3_PORT_BASE + 0x18) -#define RGDE_REG_GE3_PORT_RXERR (RGDE_REG_GE3_PORT_BASE + 0x20) -#define RGDE_REG_GE3_PORT_RXDROP (RGDE_REG_GE3_PORT_BASE + 0x28) -#define RGDE_REG_GE3_PORT_RXMULTI (RGDE_REG_GE3_PORT_BASE + 0x30) -#define RGDE_REG_GE3_PORT_RXBRO (RGDE_REG_GE3_PORT_BASE + 0x38) -#define RGDE_REG_GE3_PORT_TXPKTS (RGDE_REG_GE3_PORT_BASE + 0x40) -#define RGDE_REG_GE3_PORT_TXBYTE (RGDE_REG_GE3_PORT_BASE + 0x48) -#define RGDE_REG_GE3_PORT_TXERR (RGDE_REG_GE3_PORT_BASE + 0x50) -#define RGDE_REG_GE3_PORT_TXDROP (RGDE_REG_GE3_PORT_BASE + 0x58) -#define RGDE_REG_GE3_PORT_TXMULT (RGDE_REG_GE3_PORT_BASE + 0x60) -#define RGDE_REG_GE3_PORT_TXBRO (RGDE_REG_GE3_PORT_BASE + 0x68) - -/* GE4 PORT Registers */ -#define RGDE_REG_XGE0_PORT_BASE 0x00001400 -#define RGDE_REG_XGE0_PORT_CTL (RGDE_REG_XGE0_PORT_BASE + 0x00) -#define RGDE_REG_XGE0_PORT_STA (RGDE_REG_XGE0_PORT_BASE + 0x04) -#define RGDE_REG_XGE0_PORT_MTU (RGDE_REG_XGE0_PORT_BASE + 0x08) -#define RGDE_REG_XGE0_PORT_RXPKTS (RGDE_REG_XGE0_PORT_BASE + 0x10) -#define RGDE_REG_XGE0_PORT_RXBYTE (RGDE_REG_XGE0_PORT_BASE + 0x18) -#define RGDE_REG_XGE0_PORT_RXERR (RGDE_REG_XGE0_PORT_BASE + 0x20) -#define RGDE_REG_XGE0_PORT_RXDROP (RGDE_REG_XGE0_PORT_BASE + 0x28) -#define RGDE_REG_XGE0_PORT_RXMULTI (RGDE_REG_XGE0_PORT_BASE + 0x30) -#define RGDE_REG_XGE0_PORT_RXBRO (RGDE_REG_XGE0_PORT_BASE + 0x38) -#define RGDE_REG_XGE0_PORT_TXPKTS (RGDE_REG_XGE0_PORT_BASE + 0x40) -#define RGDE_REG_XGE0_PORT_TXBYTE (RGDE_REG_XGE0_PORT_BASE + 0x48) -#define RGDE_REG_XGE0_PORT_TXERR (RGDE_REG_XGE0_PORT_BASE + 0x50) -#define RGDE_REG_XGE0_PORT_TXDROP (RGDE_REG_XGE0_PORT_BASE + 0x58) -#define RGDE_REG_XGE0_PORT_TXMULT (RGDE_REG_XGE0_PORT_BASE + 0x60) -#define RGDE_REG_XGE0_PORT_TXBRO (RGDE_REG_XGE0_PORT_BASE + 0x68) - -/* GE5 PORT Registers */ -#define RGDE_REG_XGE1_PORT_BASE 0x00001500 -#define RGDE_REG_XGE1_PORT_CTL (RGDE_REG_XGE1_PORT_BASE + 0x00) -#define RGDE_REG_XGE1_PORT_STA (RGDE_REG_XGE1_PORT_BASE + 0x04) -#define RGDE_REG_XGE1_PORT_MTU (RGDE_REG_XGE1_PORT_BASE + 0x08) -#define RGDE_REG_XGE1_PORT_RXPKTS (RGDE_REG_XGE1_PORT_BASE + 0x10) -#define RGDE_REG_XGE1_PORT_RXBYTE (RGDE_REG_XGE1_PORT_BASE + 0x18) -#define RGDE_REG_XGE1_PORT_RXERR (RGDE_REG_XGE1_PORT_BASE + 0x20) -#define RGDE_REG_XGE1_PORT_RXDROP (RGDE_REG_XGE1_PORT_BASE + 0x28) -#define RGDE_REG_XGE1_PORT_RXMULTI (RGDE_REG_XGE1_PORT_BASE + 0x30) -#define RGDE_REG_XGE1_PORT_RXBRO (RGDE_REG_XGE1_PORT_BASE + 0x38) -#define RGDE_REG_XGE1_PORT_TXPKTS (RGDE_REG_XGE1_PORT_BASE + 0x40) -#define RGDE_REG_XGE1_PORT_TXBYTE (RGDE_REG_XGE1_PORT_BASE + 0x48) -#define RGDE_REG_XGE1_PORT_TXERR (RGDE_REG_XGE1_PORT_BASE + 0x50) -#define RGDE_REG_XGE1_PORT_TXDROP (RGDE_REG_XGE1_PORT_BASE + 0x58) -#define RGDE_REG_XGE1_PORT_TXMULT (RGDE_REG_XGE1_PORT_BASE + 0x60) -#define RGDE_REG_XGE1_PORT_TXBRO (RGDE_REG_XGE1_PORT_BASE + 0x68) - -#define RGDE_REG_CPU_BASE 0x00002100 -#define RGDE_REG_PCIE_ENDIAN_CNTR (RGDE_REG_CPU_BASE + 0x08) - -/* DMA Registers */ -#define RGDE_REG_DMA_BASE 0x00004000 -#define RGDE_REG_BD_WR_OVERTIME (RGDE_REG_DMA_BASE + 0x00) -#define RGDE_REG_BD_DEEP (RGDE_REG_DMA_BASE + 0x04) - -/* TX0 Registers */ -#define RGDE_REG_TX0_BASE 0x00005000 -#define RGDE_REG_TX0_CHN_EN (RGDE_REG_TX0_BASE + 0x00) -#define RGDE_REG_TX0_BD_BASE (RGDE_REG_TX0_BASE + 0x04) -#define RGDE_REG_TX0_BD_TAIL (RGDE_REG_TX0_BASE + 0x08) -#define RGDE_REG_TX0_BD_READY_NUM (RGDE_REG_TX0_BASE + 0x0c) -#define RGDE_REG_TX0_CPU2FPGA_BD_NUM (RGDE_REG_TX0_BASE + 0x30) -#define RGDE_REG_TX0_FPGA2CPU_BD_NUM (RGDE_REG_TX0_BASE + 0x34) - -/* TX1 Registers */ -#define RGDE_REG_TX1_BASE 0x00005100 -#define RGDE_REG_TX1_CHN_EN (RGDE_REG_TX1_BASE + 0x00) -#define RGDE_REG_TX1_BD_BASE (RGDE_REG_TX1_BASE + 0x04) -#define RGDE_REG_TX1_BD_TAIL (RGDE_REG_TX1_BASE + 0x08) -#define RGDE_REG_TX1_BD_READY_NUM (RGDE_REG_TX1_BASE + 0x0c) -#define RGDE_REG_TX1_CPU2FPGA_BD_NUM (RGDE_REG_TX1_BASE + 0x30) -#define RGDE_REG_TX1_FPGA2CPU_BD_NUM (RGDE_REG_TX1_BASE + 0x34) - -/* RX0 Registers */ -#define RGDE_REG_RX0_BASE 0x00006400 -#define RGDE_REG_RX0_CHN_EN (RGDE_REG_RX0_BASE + 0x00) -#define RGDE_REG_RX0_BD_BASE (RGDE_REG_RX0_BASE + 0x04) -#define RGDE_REG_RX0_BD_TAIL (RGDE_REG_RX0_BASE + 0x08) -#define RGDE_REG_RX0_BD_READY_NUM (RGDE_REG_RX0_BASE + 0x0c) -#define RGDE_REG_RX0_CPU2FPGA_BD_NUM (RGDE_REG_RX0_BASE + 0x30) -#define RGDE_REG_RX0_FPGA2CPU_BD_NUM (RGDE_REG_RX0_BASE + 0x34) - -/* RX1 Registers */ -#define RGDE_REG_RX1_BASE 0x00006500 -#define RGDE_REG_RX1_CHN_EN (RGDE_REG_RX1_BASE + 0x00) -#define RGDE_REG_RX1_BD_BASE (RGDE_REG_RX1_BASE + 0x04) -#define RGDE_REG_RX1_BD_TAIL (RGDE_REG_RX1_BASE + 0x08) -#define RGDE_REG_RX1_BD_READY_NUM (RGDE_REG_RX1_BASE + 0x0c) -#define RGDE_REG_RX1_CPU2FPGA_BD_NUM (RGDE_REG_RX1_BASE + 0x30) -#define RGDE_REG_RX1_FPGA2CPU_BD_NUM (RGDE_REG_RX1_BASE + 0x34) - - -#endif /* _FPGA_REG_DEFS_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c deleted file mode 100755 index 76270a94ec8b..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c +++ /dev/null @@ -1,1676 +0,0 @@ -/* - * Copyright (c) 2008-2009 Rodolfo Giometti - * Copyright (c) 2008-2009 Eurotech S.p.A. - * Copyright (c) 2019 - * - * I2C multiplexer - * - * This module supports the PCA954x series of I2C multiplexer/switch chips - * made by Philips Semiconductors. - * This includes the: - * PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547 - * and PCA9548. - * - * These chips are all controlled via the I2C bus itself, and all have a - * single 8-bit register. The upstream "parent" bus fans out to two, - * four, or eight downstream busses or channels; which of these - * are selected is determined by the chip type and register contents. A - * mux can select only one sub-bus at a time; a switch can select any - * combination simultaneously. - * - * Based on: - * pca954x.c from Kumar Gala - * Copyright (C) 2006 - * - * Based on: - * pca954x.c from Ken Harrenstien - * Copyright (C) 2004 Google, Inc. (Ken Harrenstien) - * - * Based on: - * i2c-virtual_cb.c from Brian Kuschak - * and - * pca9540.c from Jean Delvare . - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -#include -#include -#else -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define PCA954X_MAX_NCHANS 8 - -#define PCA954X_IRQ_OFFSET 4 - -extern int pca9641_setmuxflag(int nr, int flag); - -int force_create_bus = 0; -static int close_chan_force_reset = 0; -static int select_chan_check = 0; - -module_param(force_create_bus, int, S_IRUGO | S_IWUSR); -module_param(close_chan_force_reset, int, S_IRUGO | S_IWUSR); -module_param(select_chan_check, int, S_IRUGO | S_IWUSR); - -enum pca_type { - pca_9540, - pca_9542, - pca_9543, - pca_9544, - pca_9545, - pca_9546, - pca_9547, - pca_9548, -}; - -struct chip_desc { - u8 nchans; - u8 enable; /* used for muxes only */ - u8 has_irq; - enum muxtype { - pca954x_ismux = 0, - pca954x_isswi - } muxtype; -}; - -struct pca954x { - const struct chip_desc *chip; - - u8 last_chan; /* last register value */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - s32 idle_state; -#else - u8 deselect; -#endif - struct i2c_client *client; - - struct irq_domain *irq; - unsigned int irq_mask; - raw_spinlock_t lock; -}; - -/* Provide specs for the PCA954x types we know about */ -static const struct chip_desc chips[] = { - [pca_9540] = { - .nchans = 2, - .enable = 0x4, - .muxtype = pca954x_ismux, - }, - [pca_9542] = { - .nchans = 2, - .enable = 0x4, - .has_irq = 1, - .muxtype = pca954x_ismux, - }, - [pca_9543] = { - .nchans = 2, - .has_irq = 1, - .muxtype = pca954x_isswi, - }, - [pca_9544] = { - .nchans = 4, - .enable = 0x4, - .has_irq = 1, - .muxtype = pca954x_ismux, - }, - [pca_9545] = { - .nchans = 4, - .has_irq = 1, - .muxtype = pca954x_isswi, - }, - [pca_9546] = { - .nchans = 4, - .muxtype = pca954x_isswi, - }, - [pca_9547] = { - .nchans = 8, - .enable = 0x8, - .muxtype = pca954x_ismux, - }, - [pca_9548] = { - .nchans = 8, - .muxtype = pca954x_isswi, - }, -}; - -static const struct i2c_device_id pca954x_id[] = { - { "pca9540", pca_9540 }, - { "pca9542", pca_9542 }, - { "pca9543", pca_9543 }, - { "pca9544", pca_9544 }, - { "pca9545", pca_9545 }, - { "pca9546", pca_9546 }, - { "pca9547", pca_9547 }, - { "pca9548", pca_9548 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, pca954x_id); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -static const struct of_device_id pca954x_of_match[] = { - { .compatible = "nxp,pca9540", .data = &chips[pca_9540] }, - { .compatible = "nxp,pca9542", .data = &chips[pca_9542] }, - { .compatible = "nxp,pca9543", .data = &chips[pca_9543] }, - { .compatible = "nxp,pca9544", .data = &chips[pca_9544] }, - { .compatible = "nxp,pca9545", .data = &chips[pca_9545] }, - { .compatible = "nxp,pca9546", .data = &chips[pca_9546] }, - { .compatible = "nxp,pca9547", .data = &chips[pca_9547] }, - { .compatible = "nxp,pca9548", .data = &chips[pca_9548] }, - {} -}; -MODULE_DEVICE_TABLE(of, pca954x_of_match); -#else -#ifdef CONFIG_OF -static const struct of_device_id pca954x_of_match[] = { - { .compatible = "nxp,pca9540", .data = &chips[pca_9540] }, - { .compatible = "nxp,pca9542", .data = &chips[pca_9542] }, - { .compatible = "nxp,pca9543", .data = &chips[pca_9543] }, - { .compatible = "nxp,pca9544", .data = &chips[pca_9544] }, - { .compatible = "nxp,pca9545", .data = &chips[pca_9545] }, - { .compatible = "nxp,pca9546", .data = &chips[pca_9546] }, - { .compatible = "nxp,pca9547", .data = &chips[pca_9547] }, - { .compatible = "nxp,pca9548", .data = &chips[pca_9548] }, - {} -}; -MODULE_DEVICE_TABLE(of, pca954x_of_match); -#endif -#endif - -/* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer() - for this as they will try to lock adapter a second time */ -static int pca954x_reg_write(struct i2c_adapter *adap, - struct i2c_client *client, u8 val) -{ - int ret = -ENODEV; - - if (adap->algo->master_xfer) { - struct i2c_msg msg; - char buf[1]; - - msg.addr = client->addr; - msg.flags = 0; - msg.len = 1; - buf[0] = val; - msg.buf = buf; - ret = __i2c_transfer(adap, &msg, 1); - - if (ret >= 0 && ret != 1) - ret = -EREMOTEIO; - } else { - union i2c_smbus_data data; - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_WRITE, - val, I2C_SMBUS_BYTE, &data); - } - - return ret; -} - -static int pca954x_reg_read(struct i2c_adapter *adap, - struct i2c_client *client, u8 *val) -{ - int ret = -ENODEV; - u8 tmp_val; - - if (adap->algo->master_xfer) { - struct i2c_msg msg; - - msg.addr = client->addr; - msg.flags = I2C_M_RD; - msg.len = 1; - msg.buf = &tmp_val; - ret = __i2c_transfer(adap, &msg, 1); - - if (ret >= 0 && ret != 1) { - ret = -EREMOTEIO; - } else { - *val = tmp_val; - } - } else { - union i2c_smbus_data data; - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_READ, - 0, I2C_SMBUS_BYTE, &data); - - if (!ret) { - tmp_val = data.byte; - *val = tmp_val; - } - } - - return ret; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -static u8 pca954x_regval(struct pca954x *data, u8 chan) -{ - /* We make switches look like muxes, not sure how to be smarter. */ - if (data->chip->muxtype == pca954x_ismux) - return chan | data->chip->enable; - else - return 1 << chan; -} -#endif - -static int pca954x_setmuxflag(struct i2c_client *client, int flag) -{ - struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); - pca9641_setmuxflag(adap->nr, flag); - return 0; -} - -typedef void (*pca954x_hw_do_reset_func_t)(int busid, int addr); -pca954x_hw_do_reset_func_t g_notify_to_do_reset = NULL; - -void pca954x_hw_do_reset_func_register(void* func) -{ - if (func == NULL) { - return ; - } - g_notify_to_do_reset = func; - return; -} -EXPORT_SYMBOL(pca954x_hw_do_reset_func_register); - -static int pca954x_hw_do_reset(int busid, int addr) -{ - if (g_notify_to_do_reset != NULL) { - (*g_notify_to_do_reset)(busid, addr); - return 0; - } - - return 0; -} -/***************************************9548 reset*****************************************/ -#define DEV_TYPE 0x404a -#define PCA9548_MAX_CPLD_NUM (32) /* PCA9548 max number */ -#define PCA9548_MAX_CPLD_LAYER (8) /* PCA9548 max layer */ -#define DFD_PID_BUF_LEN (32) -#define DFD_PRODUCT_ID_LENGTH (8) -#define CPLD_PCA9548_RESET 0x023500b0 /* bus:2, addr:0x35, offset:0xb0 */ -#define B6510_32CQ_CPLD_PCA9548_RESET 0x060d0060 /* bus:6, addr:0x0d, offset:0x60 */ - -#define DFD_PUB_CARDTYPE_FILE "/sys/module/ragile_common/parameters/dfd_my_type" -#define DFD_MAX_PRODUCT_NUM (32) - - -#define I2C_RETRY_TIMES 5 -#define I2C_RETRY_WAIT_TIMES 10 /*delay 10ms*/ - -#define PCA9548_I2C_GET_BUS(addr) (((addr) >> 24) & 0x00ff) -#define PCA9548_I2C_GET_CLIENT(addr) (((addr) >> 16) & 0x00ff) -#define PCA9548_I2C_GET_OFFSET(addr) (addr & 0xffff) - -typedef enum pca9548_reset_type { - PCA9548_RESET_FUNC = 0, - PCA9548_RESET_GPIO = 1, -} pca9548_reset_type_t; - -typedef void (*pca954x_hw_do_reset_func_t_new)(int io_port, u8 value); -typedef u8 (*pca954x_get_umask_func_t)(int io_port); - -void pca954x_hw_do_reset_by_i2c(int addr, u8 value); -u8 pca954x_get_umask_by_i2c(int addr); -void pca954x_hw_do_reset_by_lpc(int io_port, u8 value); -u8 pca954x_get_umask_by_lpc(int io_port); - - -typedef struct func_attr_s { - int cfg_offset[PCA9548_MAX_CPLD_LAYER]; - int umask[PCA9548_MAX_CPLD_LAYER]; - pca954x_hw_do_reset_func_t_new reset_func; /* 9548 reset function */ - pca954x_get_umask_func_t get_umask_func; /* get reset mask */ -} func_attr_t; - -typedef struct gpio_attr_s { - int gpio; - int gpio_init; - u8 reset_on; - u8 reset_off; -} gpio_attr_t; - -typedef struct pca9548_cfg_info_s { - int pca9548_reset_type; - int pca9548_bus; - int pca9548_addr; - int rst_delay_b; /* delay time before reset(us) */ - int rst_delay; /* reset time(us) */ - int rst_delay_a; /* delay time after reset(us) */ - union { - func_attr_t func_attr; - gpio_attr_t gpio_attr; - } attr; -} pca9548_cfg_info_t; - -typedef struct fpga_pcie_card_info_s { - int dev_type[DFD_MAX_PRODUCT_NUM]; /* dev type */ - pca9548_cfg_info_t pca9548_cfg_info[PCA9548_MAX_CPLD_NUM]; -} pca9548_card_info_t; - -static pca9548_card_info_t g_pca9548_card_info[] = { - { - .dev_type = {0x404a}, /* RA-B6510-48V8C */ - .pca9548_cfg_info = { - /* psu fan */ - { - .pca9548_reset_type = PCA9548_RESET_GPIO, - .pca9548_bus = 2, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .gpio_attr.gpio = 7, - .gpio_attr.gpio_init = 0, - .gpio_attr.reset_on = 1, - .gpio_attr.reset_off = 0, - }, - }, - /* sff1 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(0), -1}, - }, - }, - /* sff2 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x71, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(1), -1}, - }, - }, - /* sff3 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x72, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(2), -1}, - }, - }, - /* sff4 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x73, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(3), -1}, - }, - }, - /* sff5 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x74, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(4), -1}, - }, - }, - /* sff6 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x75, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(5), -1}, - }, - }, - /* sff7 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x76, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(6), -1}, - }, - }, - }, - }, - { - /*RA-B6910-64C*/ - .dev_type = {0x404c}, - .pca9548_cfg_info = { - /* psu fan */ - { - .pca9548_reset_type = PCA9548_RESET_GPIO, - .pca9548_bus = 2, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .gpio_attr.gpio = 7, - .gpio_attr.gpio_init = 0, - .gpio_attr.reset_on = 1, - .gpio_attr.reset_off = 0, - }, - }, - /* sff1 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(0), -1}, - }, - }, - /* sff2 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x71, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(1), -1}, - }, - }, - /* sff3 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x72, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(2), -1}, - }, - }, - /* sff4 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x73, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(3), -1}, - }, - }, - /* sff5 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x74, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(4), -1}, - }, - }, - /* sff6 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x75, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(5), -1}, - }, - }, - /* sff7 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x76, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(6), -1}, - }, - }, - /* sff8 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x77, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(7), -1}, - }, - }, - }, - }, - { - /* RA-B6510-32C */ - .dev_type = {0x404b}, - .pca9548_cfg_info = { - /* psu */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 4, - .pca9548_addr = 0x77, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_lpc, - .func_attr.get_umask_func = pca954x_get_umask_by_lpc, - .func_attr.cfg_offset = {0x960, -1}, - .func_attr.umask = {BIT(0), -1}, - }, - }, - /* fan */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 2, - .pca9548_addr = 0x77, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_lpc, - .func_attr.get_umask_func = pca954x_get_umask_by_lpc, - .func_attr.cfg_offset = {0x960, -1}, - .func_attr.umask = {BIT(1), -1}, - }, - }, - }, - }, -}; -int g_pca954x_debug = 0; -module_param(g_pca954x_debug, int, S_IRUGO | S_IWUSR); - -#define PCA954X_DEBUG(fmt, args...) do { \ - if (g_pca954x_debug) { \ - printk(KERN_ERR "[PCA95x][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - - -static int dfd_get_my_dev_type_by_file(void) -{ - struct file *fp; - /* mm_segment_t fs;*/ - loff_t pos; - static int card_type; - char buf[DFD_PID_BUF_LEN]; - - if (card_type != 0) { - return card_type; - } - - fp= filp_open(DFD_PUB_CARDTYPE_FILE, O_RDONLY, 0); - if (IS_ERR(fp)) { - PCA954X_DEBUG("open file fail!\r\n"); - return -1; - } - /* fs = get_fs(); */ - /* set_fs(KERNEL_DS); */ - memset(buf, 0, DFD_PID_BUF_LEN); - pos = 0; - kernel_read(fp, buf, DFD_PRODUCT_ID_LENGTH + 1, &pos); - // kernel_read(fp, pos, buf, DFD_PRODUCT_ID_LENGTH + 1 ); - if (pos < 0) { - PCA954X_DEBUG("read file fail!\r\n"); - goto exit; - } - - card_type = simple_strtoul(buf, NULL, 10); - PCA954X_DEBUG("card_type 0x%x.\n", card_type); - -exit: - /* set_fs(fs); */ - filp_close(fp, NULL); - return card_type; -} - -static int drv_get_my_dev_type(void) -{ - static int type = -1; - - if (type > 0) { - return type; - } - type = dfd_get_my_dev_type_by_file(); - PCA954X_DEBUG("ko board type %d\r\n", type); - - return type; -} - -pca9548_card_info_t* pca9548_get_card_info(int dev_type) -{ - int i, j; - int size; - - size = ARRAY_SIZE(g_pca9548_card_info); - - PCA954X_DEBUG("Enter dev_type 0x%x size %d.\n", dev_type, size); - for (i = 0; i < size; i++) { - for(j = 0; j < DFD_MAX_PRODUCT_NUM; j++) { - if (g_pca9548_card_info[i].dev_type[j] == dev_type) { - PCA954X_DEBUG("match dev_type 0x%x.\n", dev_type); - return &g_pca9548_card_info[i]; - } - } - } - - PCA954X_DEBUG("dismatch dev_type 0x%x.\n", dev_type); - return NULL; -} - -pca9548_cfg_info_t* get_pca9548_cfg_info(int bus, int addr) -{ - int dev_type; - pca9548_card_info_t *info; - pca9548_cfg_info_t *pca9548_cfg_info; - int i; - int size; - - dev_type = drv_get_my_dev_type(); - if (dev_type < 0) { - PCA954X_DEBUG("drv_get_my_dev_type failed ret %d.\n", dev_type); - return NULL; - } - - info = pca9548_get_card_info(dev_type); - if (info == NULL) { - PCA954X_DEBUG("fpga_pcie_get_card_info dev_type %d failed.\n", dev_type); - return NULL; - } - - size = PCA9548_MAX_CPLD_NUM; - for (i = 0; i < size; i++) { - pca9548_cfg_info = &(info->pca9548_cfg_info[i]); - if ((pca9548_cfg_info->pca9548_bus == bus) && (pca9548_cfg_info->pca9548_addr == addr)) { - PCA954X_DEBUG("match dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return pca9548_cfg_info; - } - } - - PCA954X_DEBUG("dismatch dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return NULL; -} - -static void pca9548_gpio_init(gpio_attr_t *gpio_attr) -{ - if (gpio_attr->gpio_init == 0) { - PCA954X_DEBUG("gpio%d init.\n", gpio_attr->gpio); - gpio_request(gpio_attr->gpio, "pca9548_reset"); - gpio_direction_output(gpio_attr->gpio, gpio_attr->reset_off); - gpio_attr->gpio_init = 1; - } -} - -static void pca9548_gpio_free(gpio_attr_t *gpio_attr) -{ - if (gpio_attr == NULL) { - PCA954X_DEBUG("pca9548_gpio_free,params error\n"); - return ; - } - if (gpio_attr->gpio_init == 1) { - PCA954X_DEBUG("gpio%d release.\n", gpio_attr->gpio); - gpio_free(gpio_attr->gpio); - gpio_attr->gpio_init = 0; - } -} - -static int pca954x_do_gpio_reset(pca9548_cfg_info_t *cfg_info, struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int ret = -1; - gpio_attr_t *tmp_gpio_attr; - int timeout; - int val; - struct i2c_adapter *adapter; - int adapter_timeout; - - if (cfg_info == NULL) { - PCA954X_DEBUG("pca9548 cfg info is null.\n"); - return ret; - } - - if (cfg_info->pca9548_reset_type == PCA9548_RESET_GPIO) { - tmp_gpio_attr = &(cfg_info->attr.gpio_attr); - timeout = cfg_info->rst_delay_a; - - pca9548_gpio_init(tmp_gpio_attr); - udelay(cfg_info->rst_delay_b); - /* reset on */ - PCA954X_DEBUG("set gpio%d %d.\n", tmp_gpio_attr->gpio, tmp_gpio_attr->reset_on); - __gpio_set_value(tmp_gpio_attr->gpio, tmp_gpio_attr->reset_on); - udelay(cfg_info->rst_delay); - /* reset off */ - PCA954X_DEBUG("set gpio%d %d.\n", tmp_gpio_attr->gpio, tmp_gpio_attr->reset_off); - __gpio_set_value(tmp_gpio_attr->gpio, tmp_gpio_attr->reset_off); - - while (timeout > 0) { - udelay(1); - val = __gpio_get_value(tmp_gpio_attr->gpio); - if (val == tmp_gpio_attr->reset_off) { - adapter = adap; - /* get bus info */ - while(i2c_parent_is_i2c_adapter(adapter)){ - adapter = to_i2c_adapter(adapter->dev.parent); - } - - adapter_timeout = adapter->timeout; - adapter->timeout = msecs_to_jiffies(50); - pca954x_reg_write(adap, client, data->last_chan); - adapter->timeout = adapter_timeout; - ret = 0; - PCA954X_DEBUG("pca954x_do_gpio_reset success.\n"); - break; - } - - if (timeout >= 1000 && (timeout % 1000 == 0)) { - /* 1MS schedule*/ - schedule(); - } - timeout--; - } - - if (ret) { - PCA954X_DEBUG("pca954x_do_gpio_reset failed.\n"); - } - pca9548_gpio_free(&(cfg_info->attr.gpio_attr)); - } else { - PCA954X_DEBUG("pca9548_reset_type invalid, pca954x_do_gpio_reset failed.\n"); - } - - return ret; -} - -static int pca954x_do_func_reset(pca9548_cfg_info_t *cfg_info, struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int ret = -1; - func_attr_t *tmp_func_attr; - int timeout; - int val; - struct i2c_adapter *adapter; - int adapter_timeout; - int i; - u8 old_value; - - if (cfg_info == NULL) { - PCA954X_DEBUG("pca9548 cfg info is null.\n"); - return ret; - } - - if (cfg_info->pca9548_reset_type == PCA9548_RESET_FUNC) { - tmp_func_attr = &(cfg_info->attr.func_attr); - timeout = cfg_info->rst_delay_a; - - if ((tmp_func_attr->reset_func == NULL) || (tmp_func_attr->get_umask_func == NULL)) { - PCA954X_DEBUG("pca954x hw do reset func or get umask func is null.\n"); - return ret; - } - - for(i = 0; (i < PCA9548_MAX_CPLD_LAYER) && (tmp_func_attr->cfg_offset[i] != -1) - && (tmp_func_attr->umask[i] != -1); i++) { - old_value = (*tmp_func_attr->get_umask_func)(tmp_func_attr->cfg_offset[i]); - PCA954X_DEBUG("cfg info: offset:0x%x umask:0x%x, old_value:0x%x\n", - tmp_func_attr->cfg_offset[i], tmp_func_attr->umask[i],old_value); - (*tmp_func_attr->reset_func)(tmp_func_attr->cfg_offset[i], old_value & ~tmp_func_attr->umask[i]); - udelay(cfg_info->rst_delay); - (*tmp_func_attr->reset_func)(tmp_func_attr->cfg_offset[i], old_value | tmp_func_attr->umask[i]); - } - - while (timeout > 0) { - udelay(1); - val = (*tmp_func_attr->get_umask_func)(tmp_func_attr->cfg_offset[i - 1]); - val &= (tmp_func_attr->umask[i - 1]); - if (val == tmp_func_attr->umask[i - 1]) { - adapter = adap; - /* get bus info */ - while(i2c_parent_is_i2c_adapter(adapter)){ - adapter = to_i2c_adapter(adapter->dev.parent); - } - - adapter_timeout = adapter->timeout; - adapter->timeout = msecs_to_jiffies(50); - pca954x_reg_write(adap, client, data->last_chan); - adapter->timeout = adapter_timeout; - ret = 0; - PCA954X_DEBUG("pca954x_do_func_reset success.\n"); - break; - } - - if (timeout >= 1000 && (timeout % 1000 == 0)) { - /* 1MS schedule*/ - schedule(); - } - timeout--; - } - - if (ret) { - PCA954X_DEBUG("pca954x_do_func_reset failed.\n"); - } - } else { - PCA954X_DEBUG("pca9548_reset_type invalid, pca954x_do_func_reset failed.\n"); - } - - return ret; -} - -static int pca9548_reset_ctrl(pca9548_cfg_info_t *cfg_info, struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - int ret = -1; - - if (cfg_info == NULL) { - PCA954X_DEBUG("pca9548 cfg info is null.\n"); - return ret; - } - - if (cfg_info->pca9548_reset_type == PCA9548_RESET_FUNC) { - ret = pca954x_do_func_reset(cfg_info, adap, client, chan); - } else if (cfg_info->pca9548_reset_type == PCA9548_RESET_GPIO) { - ret = pca954x_do_gpio_reset(cfg_info, adap, client, chan); - } - - if (ret < 0) { - PCA954X_DEBUG("pca9548_reset_ctrl failed.\n"); - } - return ret; -} - -static int pca954x_reset_i2c_read(uint32_t bus, uint32_t addr, uint32_t offset_addr, - unsigned char *buf, uint32_t size) -{ - struct file *fp; - /* mm_segment_t fs; */ - struct i2c_client client; - char i2c_path[32]; - int i ,j ; - int rv; - - rv = 0; - memset(i2c_path, 0, 32); - snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); - fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); - if (IS_ERR(fp)) { - PCA954X_DEBUG("i2c open fail.\n"); - return -1; - } - memcpy(&client, fp->private_data, sizeof(struct i2c_client)); - client.addr = addr; - /* fs = get_fs(); */ - /* set_fs(KERNEL_DS); */ - for (j = 0 ;j < size ;j++){ - for (i = 0; i < I2C_RETRY_TIMES; i++) { - rv = i2c_smbus_read_byte_data(&client, (offset_addr + j)); - if (rv < 0) { - PCA954X_DEBUG("i2c read failed, try again.\n"); - msleep(I2C_RETRY_WAIT_TIMES); - if (i >= (I2C_RETRY_TIMES - 1)) { - goto out; - } - continue; - } - *(buf + j) = (unsigned char)rv; - break; - } - } -out: - filp_close(fp, NULL); - /* set_fs(fs); */ - return rv; -} - -static int pca954x_reset_i2c_write(uint32_t bus, uint32_t dev_addr, uint32_t offset_addr, - uint8_t write_buf) -{ - struct file *fp; - /* mm_segment_t fs; */ - struct i2c_client client; - char i2c_path[32]; - int i; - int rv; - - rv = 0; - memset(i2c_path, 0, 32); - snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); - fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); - if (IS_ERR(fp)) { - PCA954X_DEBUG("i2c open fail.\n"); - return -1; - } - memcpy(&client, fp->private_data, sizeof(struct i2c_client)); - client.addr = dev_addr; - /* fs = get_fs(); */ - /* set_fs(KERNEL_DS); */ - for (i = 0; i < I2C_RETRY_TIMES; i++) { - rv = i2c_smbus_write_byte_data(&client, offset_addr, write_buf); - if (rv < 0) { - PCA954X_DEBUG("i2c write failed, try again.\n"); - msleep(I2C_RETRY_WAIT_TIMES); - if (i >= (I2C_RETRY_TIMES - 1)) { - goto out; - } - continue; - } - break; - } -out: - filp_close(fp, NULL); - /* set_fs(fs); */ - return rv; -} - -int pca954x_reset_reg_i2c_read_byte(int addr, u8 *value) -{ - int bus; - int client_addr; - int offset; - int ret; - - bus = PCA9548_I2C_GET_BUS(addr); - client_addr = PCA9548_I2C_GET_CLIENT(addr); - offset = PCA9548_I2C_GET_OFFSET(addr); - - ret = pca954x_reset_i2c_read(bus, client_addr, offset, value, 1); - if (ret < 0) { - PCA954X_DEBUG(" 0x%x read fail\r\n", addr); - goto end; - } -end: - return ret; -} - -int pca954x_reset_reg_i2c_write_byte(int addr, u8 value) -{ - int bus; - int client_addr; - int offset; - int ret; - - bus = PCA9548_I2C_GET_BUS(addr); - client_addr = PCA9548_I2C_GET_CLIENT(addr); - offset = PCA9548_I2C_GET_OFFSET(addr); - - ret = pca954x_reset_i2c_write(bus, client_addr, offset, value); - if (ret < 0) { - PCA954X_DEBUG(" 0x%x write fail\r\n", addr); - goto end; - } -end: - return ret; -} - -void pca954x_hw_do_reset_by_i2c(int addr, u8 value) -{ - int ret; - - PCA954X_DEBUG("write i2c cpld[0x%x], value[%d]\n", addr, value); - ret = pca954x_reset_reg_i2c_write_byte(addr, value); - if (ret < 0) { - PCA954X_DEBUG("write cpld pca9548 reset reg failed, ret = %d \n", ret); - } -} - -u8 pca954x_get_umask_by_i2c(int addr) -{ - u8 value = 0xFF; - int ret; - - ret = pca954x_reset_reg_i2c_read_byte(addr, &value); - PCA954X_DEBUG("read i2c cpld[0x%x], value[%d], ret = %d\n", addr, value, ret); - - return value; -} - -void pca954x_hw_do_reset_by_lpc(int io_port, u8 value) -{ - PCA954X_DEBUG("write lpc offset[0x%x], value[%d]\n", (u16)io_port, value); - outb(value, (u16)io_port); -} - -u8 pca954x_get_umask_by_lpc(int io_port) -{ - u8 value; - - value = inb(io_port); - PCA954X_DEBUG("read lpc offset[0x%x], value[%d]\n", (u16)io_port, value); - - return value; -} - -int pca954x_hw_do_reset_new(struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - pca9548_cfg_info_t *cfg_info; - int ret = -1; - - cfg_info = get_pca9548_cfg_info(adap->nr, client->addr); - if (cfg_info == NULL && g_notify_to_do_reset == NULL) { - PCA954X_DEBUG("fpga_do_pca954x_reset_func do nothing.\n"); - return ret; - } - if(cfg_info != NULL) { - ret = pca9548_reset_ctrl(cfg_info, adap, client, chan); - } else { - ret = pca954x_hw_do_reset(adap->nr, client->addr); - } - if (ret < 0) { - PCA954X_DEBUG("pca954x_hw_do_reset failed.\n"); - } - return ret; -} -/******************************end 9548 reset***********************************/ - -static int pca954x_do_reset(struct i2c_adapter *adap, - void *client, u32 chan) -{ - struct i2c_client *new_client; - int ret = -1; - - PCA954X_DEBUG("do pca954x reset x86\n"); - new_client =(struct i2c_client *) client; - ret = pca954x_hw_do_reset_new(adap, new_client, chan); - if (ret < 0) { - PCA954X_DEBUG("pca954x_do_reset failed.\n"); - return ret; - } - - PCA954X_DEBUG("pca954x_do_reset success.\n"); - ret = 0; - return ret; -} - -static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - const struct chip_desc *chip = data->chip; - u8 regval; - int ret = 0; - u8 read_val; - int rv; - - read_val = 0; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - regval = pca954x_regval(data, chan); -#else - /* we make switches look like muxes, not sure how to be smarter */ - if (chip->muxtype == pca954x_ismux) - regval = chan | chip->enable; - else - regval = 1 << chan; -#endif - - /* Only select the channel if its different from the last channel */ - if (data->last_chan != regval) { - pca954x_setmuxflag(client, 0); - ret = pca954x_reg_write(muxc->parent, client, regval); - data->last_chan = ret < 0 ? 0 : regval; - } - - if (select_chan_check) { /* check chan */ - ret = pca954x_reg_read(muxc->parent, client, &read_val); - /* read failed or chan not open, reset pca9548 */ - if ((ret < 0) || (read_val != data->last_chan)) { - dev_warn(&client->dev, "pca954x open channle %u failed, do reset.\n", chan); - PCA954X_DEBUG("ret = %d, read_val = %d, last_chan = %d.\n", ret, read_val, data->last_chan); - rv = pca954x_do_reset(client->adapter, client, chan); - if (rv >= 0) { - PCA954X_DEBUG("pca954x_do_reset success, rv = %d.\n", rv); - } else { - PCA954X_DEBUG("pca954x_do_reset failed, rv = %d.\n", rv); - } - if (ret >= 0) { - ret = -EIO; /* chan not match, return IO error */ - } - } - } - - return ret; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - s32 idle_state; - int ret, rv; - struct i2c_client * new_client; - - if (close_chan_force_reset) { - data->last_chan = 0; - ret = pca954x_do_reset(client->adapter, client, chan); - if (ret < 0) { - dev_warn(&client->dev, "pca954x do reset failed %d.\n", ret); - } - return ret; - } else { - idle_state = READ_ONCE(data->idle_state); - if (idle_state >= 0) - /* Set the mux back to a predetermined channel */ - return pca954x_select_chan(muxc, idle_state); - if (idle_state == MUX_IDLE_DISCONNECT) { - /* Deselect active channel */ - data->last_chan = 0; - ret = pca954x_reg_write(muxc->parent, client, - data->last_chan); - if (ret < 0) { - new_client =(struct i2c_client *) client; - dev_warn(&new_client->dev, "pca954x close chn failed, do reset.\n"); - rv = pca954x_do_reset(client->adapter, client, chan); - if (rv == 0) { - ret = 0; - } - } - return ret; - } - } - - /* otherwise leave as-is */ - - return 0; -} - -static ssize_t idle_state_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - - return sprintf(buf, "%d\n", READ_ONCE(data->idle_state)); -} - -static ssize_t idle_state_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct i2c_client *client = to_i2c_client(dev); - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int val; - int ret; - - ret = kstrtoint(buf, 0, &val); - if (ret < 0) - return ret; - - if (val != MUX_IDLE_AS_IS && val != MUX_IDLE_DISCONNECT && - (val < 0 || val >= data->chip->nchans)) - return -EINVAL; - - i2c_lock_bus(muxc->parent, I2C_LOCK_SEGMENT); - - WRITE_ONCE(data->idle_state, val); - /* - * Set the mux into a state consistent with the new - * idle_state. - */ - if (data->last_chan || val != MUX_IDLE_DISCONNECT) - ret = pca954x_deselect_mux(muxc, 0); - - i2c_unlock_bus(muxc->parent, I2C_LOCK_SEGMENT); - - return ret < 0 ? ret : count; -} - -static DEVICE_ATTR_RW(idle_state); - -static irqreturn_t pca954x_irq_handler(int irq, void *dev_id) -{ - struct pca954x *data = dev_id; - unsigned long pending; - int ret, i; - - ret = i2c_smbus_read_byte(data->client); - if (ret < 0) - return IRQ_NONE; - - pending = (ret >> PCA954X_IRQ_OFFSET) & (BIT(data->chip->nchans) - 1); - for_each_set_bit(i, &pending, data->chip->nchans) - handle_nested_irq(irq_linear_revmap(data->irq, i)); - - return IRQ_RETVAL(pending); -} - -static int pca954x_init(struct i2c_client *client, struct pca954x *data) -{ - int ret; - - if (data->idle_state >= 0) - data->last_chan = pca954x_regval(data, data->idle_state); - else - data->last_chan = 0; /* Disconnect multiplexer */ - - ret = i2c_smbus_write_byte(client, data->last_chan); - if (ret < 0) - data->last_chan = 0; - - return ret; -} - -#else -static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int ret, rv; - struct i2c_client * new_client; - - /* Deselect active channel */ - data->last_chan = 0; - - ret = pca954x_reg_write(muxc->parent, client, data->last_chan); - if (ret < 0) { - new_client =(struct i2c_client *) client; - dev_warn(&new_client->dev, "pca954x close chn failed, do reset.\n"); - rv = pca954x_do_reset(client->adapter, client, chan); - if (rv == 0) { - ret = 0; - } - - } - pca954x_setmuxflag(client, 1); - (void)pca954x_reg_write(muxc->parent, client, data->last_chan); - - return ret; - -} - -static irqreturn_t pca954x_irq_handler(int irq, void *dev_id) -{ - struct pca954x *data = dev_id; - unsigned int child_irq; - int ret, i, handled = 0; - - ret = i2c_smbus_read_byte(data->client); - if (ret < 0) - return IRQ_NONE; - - for (i = 0; i < data->chip->nchans; i++) { - if (ret & BIT(PCA954X_IRQ_OFFSET + i)) { - child_irq = irq_linear_revmap(data->irq, i); - handle_nested_irq(child_irq); - handled++; - } - } - return handled ? IRQ_HANDLED : IRQ_NONE; -} -#endif - -static void pca954x_irq_mask(struct irq_data *idata) -{ - struct pca954x *data = irq_data_get_irq_chip_data(idata); - unsigned int pos = idata->hwirq; - unsigned long flags; - - raw_spin_lock_irqsave(&data->lock, flags); - - data->irq_mask &= ~BIT(pos); - if (!data->irq_mask) - disable_irq(data->client->irq); - - raw_spin_unlock_irqrestore(&data->lock, flags); -} - -static void pca954x_irq_unmask(struct irq_data *idata) -{ - struct pca954x *data = irq_data_get_irq_chip_data(idata); - unsigned int pos = idata->hwirq; - unsigned long flags; - - raw_spin_lock_irqsave(&data->lock, flags); - - if (!data->irq_mask) - enable_irq(data->client->irq); - data->irq_mask |= BIT(pos); - - raw_spin_unlock_irqrestore(&data->lock, flags); -} - -static int pca954x_irq_set_type(struct irq_data *idata, unsigned int type) -{ - if ((type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_LEVEL_LOW) - return -EINVAL; - return 0; -} - -static struct irq_chip pca954x_irq_chip = { - .name = "i2c-mux-pca954x", - .irq_mask = pca954x_irq_mask, - .irq_unmask = pca954x_irq_unmask, - .irq_set_type = pca954x_irq_set_type, -}; - -static int pca954x_irq_setup(struct i2c_mux_core *muxc) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int c, err, irq; - - if (!data->chip->has_irq || client->irq <= 0) - return 0; - - raw_spin_lock_init(&data->lock); - - data->irq = irq_domain_add_linear(client->dev.of_node, - data->chip->nchans, - &irq_domain_simple_ops, data); - if (!data->irq) - return -ENODEV; - - for (c = 0; c < data->chip->nchans; c++) { - irq = irq_create_mapping(data->irq, c); - irq_set_chip_data(irq, data); - irq_set_chip_and_handler(irq, &pca954x_irq_chip, - handle_simple_irq); - } - - err = devm_request_threaded_irq(&client->dev, data->client->irq, NULL, - pca954x_irq_handler, - IRQF_ONESHOT | IRQF_SHARED, - "pca954x", data); - if (err) - goto err_req_irq; - - disable_irq(data->client->irq); - - return 0; -err_req_irq: - for (c = 0; c < data->chip->nchans; c++) { - irq = irq_find_mapping(data->irq, c); - irq_dispose_mapping(irq); - } - irq_domain_remove(data->irq); - - return err; -} - -/* - * I2C init/probing/exit functions - */ -static int pca954x_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev); -#endif - struct device_node *of_node = client->dev.of_node; - bool idle_disconnect_dt; - struct gpio_desc *gpio; - int num, force, class; - struct i2c_mux_core *muxc; - struct pca954x *data; - const struct of_device_id *match; - int ret; - - - if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE)) - return -ENODEV; - - muxc = i2c_mux_alloc(adap, &client->dev, - PCA954X_MAX_NCHANS, sizeof(*data), 0, - pca954x_select_chan, pca954x_deselect_mux); - if (!muxc) - return -ENOMEM; - data = i2c_mux_priv(muxc); - - i2c_set_clientdata(client, muxc); - data->client = client; - - /* Get the mux out of reset if a reset GPIO is specified. */ - gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_LOW); - if (IS_ERR(gpio)) - return PTR_ERR(gpio); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - data->idle_state = MUX_IDLE_AS_IS; - if (device_property_read_u32(&client->dev, "idle-state", &data->idle_state)) { - if (device_property_read_bool(&client->dev, "i2c-mux-idle-disconnect")) - data->idle_state = MUX_IDLE_DISCONNECT; - } - - /* - * Write the mux register at addr to verify - * that the mux is in fact present. This also - * initializes the mux to a channel - * or disconnected state. - */ - ret = pca954x_init(client, data); - if (ret < 0) { - dev_warn(&client->dev, "probe failed\n"); - return -ENODEV; - } -#else - /* Write the mux register at addr to verify - * that the mux is in fact present. This also - * initializes the mux to disconnected state. - */ - if ((i2c_smbus_write_byte(client, 0) < 0) && (force_create_bus == 0)) { - dev_warn(&client->dev, "probe failed\n"); - return -ENODEV; - } -#endif - match = of_match_device(of_match_ptr(pca954x_of_match), &client->dev); - if (match) - data->chip = of_device_get_match_data(&client->dev); - else - data->chip = &chips[id->driver_data]; - - data->last_chan = 0; /* force the first selection */ - - idle_disconnect_dt = of_node && - of_property_read_bool(of_node, "i2c-mux-idle-disconnect"); - - ret = pca954x_irq_setup(muxc); - if (ret) - goto fail_del_adapters; - - /* Now create an adapter for each channel */ - for (num = 0; num < data->chip->nchans; num++) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - ret = i2c_mux_add_adapter(muxc, 0, num, 0); -#else - bool idle_disconnect_pd = false; - - force = 0; /* dynamic adap number */ - class = 0; /* no class by default */ - if (pdata) { - if (num < pdata->num_modes) { - /* force static number */ - force = pdata->modes[num].adap_id; - class = pdata->modes[num].class; - } else - /* discard unconfigured channels */ - break; - idle_disconnect_pd = pdata->modes[num].deselect_on_exit; - } - data->deselect |= (idle_disconnect_pd || - idle_disconnect_dt) << num; - - ret = i2c_mux_add_adapter(muxc, force, num, class); -#endif - if (ret) - goto fail_del_adapters; - } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - /* - * The attr probably isn't going to be needed in most cases, - * so don't fail completely on error. - */ - device_create_file(&client->dev, &dev_attr_idle_state); -#endif - dev_info(&client->dev, - "registered %d multiplexed busses for I2C %s %s\n", - num, data->chip->muxtype == pca954x_ismux - ? "mux" : "switch", client->name); - - return 0; - -fail_del_adapters: - i2c_mux_del_adapters(muxc); - return ret; -} - -static int pca954x_remove(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int c, irq; - - if (data->irq) { - for (c = 0; c < data->chip->nchans; c++) { - irq = irq_find_mapping(data->irq, c); - irq_dispose_mapping(irq); - } - irq_domain_remove(data->irq); - } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - device_remove_file(&client->dev, &dev_attr_idle_state); -#endif - i2c_mux_del_adapters(muxc); - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int pca954x_resume(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - int ret; - - ret = pca954x_init(client, data); - if (ret < 0) - dev_err(&client->dev, "failed to verify mux presence\n"); - - return ret; -#else - data->last_chan = 0; - return i2c_smbus_write_byte(client, 0); -#endif -} -#endif - -static SIMPLE_DEV_PM_OPS(pca954x_pm, NULL, pca954x_resume); - -static struct i2c_driver pca954x_driver = { - .driver = { - .name = "pca954x", - .pm = &pca954x_pm, - .of_match_table = of_match_ptr(pca954x_of_match), - }, - .probe = pca954x_probe, - .remove = pca954x_remove, - .id_table = pca954x_id, -}; - -module_i2c_driver(pca954x_driver); - -MODULE_AUTHOR("support support@ragile.com"); -MODULE_DESCRIPTION("PCA954x I2C mux/switch driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c deleted file mode 100755 index 4988fcc7f2c3..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c +++ /dev/null @@ -1,653 +0,0 @@ -/* - * I2C multiplexer driver for PCA9541 bus master selector - * - * Copyright (c) 2010 Ericsson AB. - * Copyright (c) 2019 - * Author: Guenter Roeck - * - * Derived from: - * pca954x.c - * - * Copyright (c) 2008-2009 Rodolfo Giometti - * Copyright (c) 2008-2009 Eurotech S.p.A. - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -#include -#else -#include -#endif - -/* - * The PCA9541 is a bus master selector. It supports two I2C masters connected - * to a single slave bus. - * - * Before each bus transaction, a master has to acquire bus ownership. After the - * transaction is complete, bus ownership has to be released. This fits well - * into the I2C multiplexer framework, which provides select and release - * functions for this purpose. For this reason, this driver is modeled as - * single-channel I2C bus multiplexer. - * - * This driver assumes that the two bus masters are controlled by two different - * hosts. If a single host controls both masters, platform code has to ensure - * that only one of the masters is instantiated at any given time. - */ - -#define PCA9541_CONTROL 0x01 -#define PCA9541_ISTAT 0x02 - -#define PCA9541_CTL_MYBUS (1 << 0) -#define PCA9541_CTL_NMYBUS (1 << 1) -#define PCA9541_CTL_BUSON (1 << 2) -#define PCA9541_CTL_NBUSON (1 << 3) -#define PCA9541_CTL_BUSINIT (1 << 4) -#define PCA9541_CTL_TESTON (1 << 6) -#define PCA9541_CTL_NTESTON (1 << 7) -#define PCA9541_ISTAT_INTIN (1 << 0) -#define PCA9541_ISTAT_BUSINIT (1 << 1) -#define PCA9541_ISTAT_BUSOK (1 << 2) -#define PCA9541_ISTAT_BUSLOST (1 << 3) -#define PCA9541_ISTAT_MYTEST (1 << 6) -#define PCA9541_ISTAT_NMYTEST (1 << 7) -#define PCA9641_ID 0x00 -#define PCA9641_ID_MAGIC 0x38 -#define PCA9641_CONTROL 0x01 -#define PCA9641_STATUS 0x02 -#define PCA9641_TIME 0x03 -#define PCA9641_CTL_LOCK_REQ BIT(0) -#define PCA9641_CTL_LOCK_GRANT BIT(1) -#define PCA9641_CTL_BUS_CONNECT BIT(2) -#define PCA9641_CTL_BUS_INIT BIT(3) -#define PCA9641_CTL_SMBUS_SWRST BIT(4) -#define PCA9641_CTL_IDLE_TIMER_DIS BIT(5) -#define PCA9641_CTL_SMBUS_DIS BIT(6) -#define PCA9641_CTL_PRIORITY BIT(7) -#define PCA9641_STS_OTHER_LOCK BIT(0) -#define PCA9641_STS_BUS_INIT_FAIL BIT(1) -#define PCA9641_STS_BUS_HUNG BIT(2) -#define PCA9641_STS_MBOX_EMPTY BIT(3) -#define PCA9641_STS_MBOX_FULL BIT(4) -#define PCA9641_STS_TEST_INT BIT(5) -#define PCA9641_STS_SCL_IO BIT(6) -#define PCA9641_STS_SDA_IO BIT(7) -#define PCA9641_RES_TIME 0x03 -#define BUSON (PCA9541_CTL_BUSON | PCA9541_CTL_NBUSON) -#define MYBUS (PCA9541_CTL_MYBUS | PCA9541_CTL_NMYBUS) -#define mybus(x) (!((x) & MYBUS) || ((x) & MYBUS) == MYBUS) -#define busoff(x) (!((x) & BUSON) || ((x) & BUSON) == BUSON) -#define BUSOFF(x, y) (!((x) & PCA9641_CTL_LOCK_GRANT) && \ - !((y) & PCA9641_STS_OTHER_LOCK)) -#define other_lock(x) ((x) & PCA9641_STS_OTHER_LOCK) -#define lock_grant(x) ((x) & PCA9641_CTL_LOCK_GRANT) - -#define PCA9641_RETRY_TIME 8 - -typedef struct i2c_muxs_struct_flag -{ - int nr; - char name[48]; - struct mutex update_lock; - int flag; -}i2c_mux_flag; - -i2c_mux_flag pca_flag = { - .flag = -1, -}; - -int pca9641_setmuxflag(int nr, int flag) -{ - if (pca_flag.nr == nr) { - pca_flag.flag = flag; - } - return 0; -} -EXPORT_SYMBOL(pca9641_setmuxflag); - -int g_debug = 0; -module_param(g_debug, int, S_IRUGO | S_IWUSR); - -#define PCA_DEBUG(fmt, args...) do { \ - if (g_debug) { \ - printk(KERN_ERR "[pca9641][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - - -/* arbitration timeouts, in jiffies */ -#define ARB_TIMEOUT (HZ / 8) /* 125 ms until forcing bus ownership */ -#define ARB2_TIMEOUT (HZ / 4) /* 250 ms until acquisition failure */ - -/* arbitration retry delays, in us */ -#define SELECT_DELAY_SHORT 50 -#define SELECT_DELAY_LONG 1000 - -struct pca9541 { - struct i2c_client *client; - unsigned long select_timeout; - unsigned long arb_timeout; -}; - -static const struct i2c_device_id pca9541_id[] = { - {"pca9541", 0}, - {"pca9641", 1}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, pca9541_id); - -#ifdef CONFIG_OF -static const struct of_device_id pca9541_of_match[] = { - { .compatible = "nxp,pca9541" }, - { .compatible = "nxp,pca9641" }, - {} -}; -MODULE_DEVICE_TABLE(of, pca9541_of_match); -#endif - - -/* - * Write to chip register. Don't use i2c_transfer()/i2c_smbus_xfer() - * as they will try to lock the adapter a second time. - */ -static int pca9541_reg_write(struct i2c_client *client, u8 command, u8 val) -{ - struct i2c_adapter *adap = client->adapter; - int ret; - - if (adap->algo->master_xfer) { - struct i2c_msg msg; - char buf[2]; - - msg.addr = client->addr; - msg.flags = 0; - msg.len = 2; - buf[0] = command; - buf[1] = val; - msg.buf = buf; - ret = __i2c_transfer(adap, &msg, 1); - } else { - union i2c_smbus_data data; - - data.byte = val; - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_WRITE, - command, - I2C_SMBUS_BYTE_DATA, &data); - } - - return ret; -} - -/* - * Read from chip register. Don't use i2c_transfer()/i2c_smbus_xfer() - * as they will try to lock adapter a second time. - */ -static int pca9541_reg_read(struct i2c_client *client, u8 command) -{ - struct i2c_adapter *adap = client->adapter; - int ret; - u8 val; - - if (adap->algo->master_xfer) { - struct i2c_msg msg[2] = { - { - .addr = client->addr, - .flags = 0, - .len = 1, - .buf = &command - }, - { - .addr = client->addr, - .flags = I2C_M_RD, - .len = 1, - .buf = &val - } - }; - ret = __i2c_transfer(adap, msg, 2); - if (ret == 2) - ret = val; - else if (ret >= 0) - ret = -EIO; - } else { - union i2c_smbus_data data; - - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_READ, - command, - I2C_SMBUS_BYTE_DATA, &data); - if (!ret) - ret = data.byte; - } - return ret; -} - -/* - * Arbitration management functions - */ - -/* Release bus. Also reset NTESTON and BUSINIT if it was set. */ -static void pca9541_release_bus(struct i2c_client *client) -{ - int reg; - - reg = pca9541_reg_read(client, PCA9541_CONTROL); - if (reg >= 0 && !busoff(reg) && mybus(reg)) - pca9541_reg_write(client, PCA9541_CONTROL, - (reg & PCA9541_CTL_NBUSON) >> 1); -} - -/* - * Arbitration is defined as a two-step process. A bus master can only activate - * the slave bus if it owns it; otherwise it has to request ownership first. - * This multi-step process ensures that access contention is resolved - * gracefully. - * - * Bus Ownership Other master Action - * state requested access - * ---------------------------------------------------- - * off - yes wait for arbitration timeout or - * for other master to drop request - * off no no take ownership - * off yes no turn on bus - * on yes - done - * on no - wait for arbitration timeout or - * for other master to release bus - * - * The main contention point occurs if the slave bus is off and both masters - * request ownership at the same time. In this case, one master will turn on - * the slave bus, believing that it owns it. The other master will request - * bus ownership. Result is that the bus is turned on, and master which did - * _not_ own the slave bus before ends up owning it. - */ - -/* Control commands per PCA9541 datasheet */ -static const u8 pca9541_control[16] = { - 4, 0, 1, 5, 4, 4, 5, 5, 0, 0, 1, 1, 0, 4, 5, 1 -}; - -/* - * Channel arbitration - * - * Return values: - * <0: error - * 0 : bus not acquired - * 1 : bus acquired - */ -static int pca9541_arbitrate(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca9541 *data = i2c_mux_priv(muxc); - int reg; - - reg = pca9541_reg_read(client, PCA9541_CONTROL); - if (reg < 0) - return reg; - - if (busoff(reg)) { - int istat; - /* - * Bus is off. Request ownership or turn it on unless - * other master requested ownership. - */ - istat = pca9541_reg_read(client, PCA9541_ISTAT); - if (!(istat & PCA9541_ISTAT_NMYTEST) - || time_is_before_eq_jiffies(data->arb_timeout)) { - /* - * Other master did not request ownership, - * or arbitration timeout expired. Take the bus. - */ - pca9541_reg_write(client, - PCA9541_CONTROL, - pca9541_control[reg & 0x0f] - | PCA9541_CTL_NTESTON); - data->select_timeout = SELECT_DELAY_SHORT; - } else { - /* - * Other master requested ownership. - * Set extra long timeout to give it time to acquire it. - */ - data->select_timeout = SELECT_DELAY_LONG * 2; - } - } else if (mybus(reg)) { - /* - * Bus is on, and we own it. We are done with acquisition. - * Reset NTESTON and BUSINIT, then return success. - */ - if (reg & (PCA9541_CTL_NTESTON | PCA9541_CTL_BUSINIT)) - pca9541_reg_write(client, - PCA9541_CONTROL, - reg & ~(PCA9541_CTL_NTESTON - | PCA9541_CTL_BUSINIT)); - return 1; - } else { - /* - * Other master owns the bus. - * If arbitration timeout has expired, force ownership. - * Otherwise request it. - */ - data->select_timeout = SELECT_DELAY_LONG; - if (time_is_before_eq_jiffies(data->arb_timeout)) { - /* Time is up, take the bus and reset it. */ - pca9541_reg_write(client, - PCA9541_CONTROL, - pca9541_control[reg & 0x0f] - | PCA9541_CTL_BUSINIT - | PCA9541_CTL_NTESTON); - } else { - /* Request bus ownership if needed */ - if (!(reg & PCA9541_CTL_NTESTON)) - pca9541_reg_write(client, - PCA9541_CONTROL, - reg | PCA9541_CTL_NTESTON); - } - } - return 0; -} - -static int pca9541_select_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int ret; - unsigned long timeout = jiffies + ARB2_TIMEOUT; - /* give up after this time */ - - data->arb_timeout = jiffies + ARB_TIMEOUT; - /* force bus ownership after this time */ - - do { - ret = pca9541_arbitrate(client); - if (ret) - return ret < 0 ? ret : 0; - - if (data->select_timeout == SELECT_DELAY_SHORT) - udelay(data->select_timeout); - else - msleep(data->select_timeout / 1000); - } while (time_is_after_eq_jiffies(timeout)); - - return -ETIMEDOUT; -} - -static int pca9541_release_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - pca9541_release_bus(client); - return 0; -} - -/* - * Arbitration management functions - */ -static void pca9641_release_bus(struct i2c_client *client) -{ - pca9541_reg_write(client, PCA9641_CONTROL, 0x80); //master 0x80 -} - -/* - * Channel arbitration - * - * Return values: - * <0: error - * 0 : bus not acquired - * 1 : bus acquired - */ -static int pca9641_arbitrate(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca9541 *data = i2c_mux_priv(muxc); - int reg_ctl, reg_sts; - - reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); - if (reg_ctl < 0) - return reg_ctl; - reg_sts = pca9541_reg_read(client, PCA9641_STATUS); - - if (BUSOFF(reg_ctl, reg_sts)) { - /* - * Bus is off. Request ownership or turn it on unless - * other master requested ownership. - */ - reg_ctl |= PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); - - if (lock_grant(reg_ctl)) { - /* - * Other master did not request ownership, - * or arbitration timeout expired. Take the bus. - */ - reg_ctl |= PCA9641_CTL_BUS_CONNECT - | PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - data->select_timeout = SELECT_DELAY_SHORT; - - return 1; - } else { - /* - * Other master requested ownership. - * Set extra long timeout to give it time to acquire it. - */ - data->select_timeout = SELECT_DELAY_LONG * 2; - } - } else if (lock_grant(reg_ctl)) { - /* - * Bus is on, and we own it. We are done with acquisition. - */ - reg_ctl |= PCA9641_CTL_BUS_CONNECT | PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - - return 1; - } else if (other_lock(reg_sts)) { - /* - * Other master owns the bus. - * If arbitration timeout has expired, force ownership. - * Otherwise request it. - */ - data->select_timeout = SELECT_DELAY_LONG; - reg_ctl |= PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - } - return 0; -} - - -int pca9641_select_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int ret; - int result; - unsigned long timeout = jiffies + ARB2_TIMEOUT; - /* give up after this time */ - data->arb_timeout = jiffies + ARB_TIMEOUT; - /* force bus ownership after this time */ - for (result = 0 ; result < PCA9641_RETRY_TIME ; result ++) { - do { - ret = pca9641_arbitrate(client); - if (ret == 1) { - return 0; - } - if (data->select_timeout == SELECT_DELAY_SHORT) - udelay(data->select_timeout); - else - msleep(data->select_timeout / 1000); - } while (time_is_after_eq_jiffies(timeout)); - timeout = jiffies + ARB2_TIMEOUT; - } - return -ETIMEDOUT; -} -EXPORT_SYMBOL(pca9641_select_chan); - -static int pca9641_release_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - if (pca_flag.flag) { - pca9641_release_bus(client); - } - return 0; -} - -static int pca9641_detect_id(struct i2c_client *client) -{ - int reg; - - reg = pca9541_reg_read(client, PCA9641_ID); - if (reg == PCA9641_ID_MAGIC) - return 1; - else - return 0; -} - - -static int pca9641_recordflag(struct i2c_adapter *adap) { - if (pca_flag.flag != -1) { - pr_err(" %s %d has init already!!!", __func__, __LINE__); - return -1 ; - } - pca_flag.nr = adap->nr; - PCA_DEBUG(" adap->nr:%d\n", adap->nr); - snprintf(pca_flag.name, sizeof(pca_flag.name),adap->name); - return 0; -} - -static void i2c_lock_adapter(struct i2c_adapter *adapter){ - struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); - if (parent) - i2c_lock_adapter(parent); - else - rt_mutex_lock(&adapter->bus_lock); -} - -void i2c_unlock_adapter(struct i2c_adapter *adapter) -{ - struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); - - if (parent) - i2c_unlock_adapter(parent); - else - rt_mutex_unlock(&adapter->bus_lock); -} -/* - * I2C init/probing/exit functions - */ -static int pca9541_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct i2c_adapter *adap = client->adapter; -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev); -#endif - struct i2c_mux_core *muxc; - struct pca9541 *data; - int force; - int ret = -ENODEV; - int detect_id; - - if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE_DATA)) - return -ENODEV; - - detect_id = pca9641_detect_id(client); - - /* - * I2C accesses are unprotected here. - * We have to lock the adapter before releasing the bus. - */ - if (detect_id == 0) { - i2c_lock_adapter(adap); - pca9541_release_bus(client); - i2c_unlock_adapter(adap); - } else { - i2c_lock_adapter(adap); - pca9641_release_bus(client); - i2c_unlock_adapter(adap); - } - - /* Create mux adapter */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - force = 0; - if (pdata) - force = pdata->modes[0].adap_id; -#endif - if (detect_id == 0) { - muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), - I2C_MUX_ARBITRATOR, - pca9541_select_chan, pca9541_release_chan); - if (!muxc) - return -ENOMEM; - - data = i2c_mux_priv(muxc); - data->client = client; - - i2c_set_clientdata(client, muxc); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - ret = i2c_mux_add_adapter(muxc, 0, 0, 0); -#else - ret = i2c_mux_add_adapter(muxc, force, 0, 0); -#endif - if (ret) - return ret; - } else { - muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), - I2C_MUX_ARBITRATOR, - pca9641_select_chan, pca9641_release_chan); - if (!muxc) - return -ENOMEM; - - data = i2c_mux_priv(muxc); - data->client = client; - - i2c_set_clientdata(client, muxc); - - ret = i2c_mux_add_adapter(muxc, force, 0, 0); - if (ret) - return ret; - } - pca9641_recordflag(muxc->adapter[0]); - - dev_info(&client->dev, "registered master selector for I2C %s\n", - client->name); - - return 0; - -} - -static int pca9541_remove(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - - i2c_mux_del_adapters(muxc); - return 0; -} - -static struct i2c_driver pca9641_driver = { - .driver = { - .name = "pca9641", - .of_match_table = of_match_ptr(pca9541_of_match), - }, - .probe = pca9541_probe, - .remove = pca9541_remove, - .id_table = pca9541_id, -}; - -module_i2c_driver(pca9641_driver); - -MODULE_AUTHOR("support support@ragile.com"); -MODULE_DESCRIPTION("PCA9541 I2C master selector driver"); -MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile new file mode 100644 index 000000000000..269e95019cba --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile @@ -0,0 +1,21 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +#ifdef ENABLE_GCOV +#ifeq ($(ENABLE_GCOV), y) +#EXTRA_CFLAGS+= -fprofile-arcs -ftest-coverage -lgcov +#endif +#endif # ENABLE_GCOV + +obj-m := intel_spi.o +obj-m += intel_spi_platform.o + +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h new file mode 100644 index 000000000000..d0a570b1f3b0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Intel PCH/PCU SPI flash driver. + * + * Copyright (C) 2016, Intel Corporation + * Author: Mika Westerberg + */ + +#ifndef INTEL_SPI_H +#define INTEL_SPI_H + +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +struct intel_spi; +struct resource; + +struct intel_spi *intel_spi_probe(struct device *dev, + struct resource *mem, const struct intel_spi_boardinfo *info); +int intel_spi_remove(struct intel_spi *ispi); + +#endif /* INTEL_SPI_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c new file mode 100644 index 000000000000..98de90f0c0b2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c @@ -0,0 +1,969 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Intel PCH/PCU SPI flash driver. + * + * Copyright (C) 2016, Intel Corporation + * Author: Mika Westerberg + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "intel_spi.h" + +/* Offsets are from @ispi->base */ +#define BFPREG 0x00 + +#define HSFSTS_CTL 0x04 +#define HSFSTS_CTL_FSMIE BIT(31) +#define HSFSTS_CTL_FDBC_SHIFT 24 +#define HSFSTS_CTL_FDBC_MASK (0x3f << HSFSTS_CTL_FDBC_SHIFT) + +#define HSFSTS_CTL_FCYCLE_SHIFT 17 +#define HSFSTS_CTL_FCYCLE_MASK (0x0f << HSFSTS_CTL_FCYCLE_SHIFT) +/* HW sequencer opcodes */ +#define HSFSTS_CTL_FCYCLE_READ (0x00 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_WRITE (0x02 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_ERASE (0x03 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_ERASE_64K (0x04 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_RDID (0x06 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_WRSR (0x07 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_RDSR (0x08 << HSFSTS_CTL_FCYCLE_SHIFT) + +#define HSFSTS_CTL_FGO BIT(16) +#define HSFSTS_CTL_FLOCKDN BIT(15) +#define HSFSTS_CTL_FDV BIT(14) +#define HSFSTS_CTL_SCIP BIT(5) +#define HSFSTS_CTL_AEL BIT(2) +#define HSFSTS_CTL_FCERR BIT(1) +#define HSFSTS_CTL_FDONE BIT(0) + +#define FADDR 0x08 +#define DLOCK 0x0c +#define FDATA(n) (0x10 + ((n) * 4)) + +#define FRACC 0x50 + +#define FREG(n) (0x54 + ((n) * 4)) +#define FREG_BASE_MASK 0x3fff +#define FREG_LIMIT_SHIFT 16 +#define FREG_LIMIT_MASK (0x03fff << FREG_LIMIT_SHIFT) + +/* Offset is from @ispi->pregs */ +#define PR(n) ((n) * 4) +#define PR_WPE BIT(31) +#define PR_LIMIT_SHIFT 16 +#define PR_LIMIT_MASK (0x3fff << PR_LIMIT_SHIFT) +#define PR_RPE BIT(15) +#define PR_BASE_MASK 0x3fff + +/* Offsets are from @ispi->sregs */ +#define SSFSTS_CTL 0x00 +#define SSFSTS_CTL_FSMIE BIT(23) +#define SSFSTS_CTL_DS BIT(22) +#define SSFSTS_CTL_DBC_SHIFT 16 +#define SSFSTS_CTL_SPOP BIT(11) +#define SSFSTS_CTL_ACS BIT(10) +#define SSFSTS_CTL_SCGO BIT(9) +#define SSFSTS_CTL_COP_SHIFT 12 +#define SSFSTS_CTL_FRS BIT(7) +#define SSFSTS_CTL_DOFRS BIT(6) +#define SSFSTS_CTL_AEL BIT(4) +#define SSFSTS_CTL_FCERR BIT(3) +#define SSFSTS_CTL_FDONE BIT(2) +#define SSFSTS_CTL_SCIP BIT(0) + +#define PREOP_OPTYPE 0x04 +#define OPMENU0 0x08 +#define OPMENU1 0x0c + +#define OPTYPE_READ_NO_ADDR 0 +#define OPTYPE_WRITE_NO_ADDR 1 +#define OPTYPE_READ_WITH_ADDR 2 +#define OPTYPE_WRITE_WITH_ADDR 3 + +/* CPU specifics */ +#define BYT_PR 0x74 +#define BYT_SSFSTS_CTL 0x90 +#define BYT_BCR 0xfc +#define BYT_BCR_WPD BIT(0) +#define BYT_FREG_NUM 5 +#define BYT_PR_NUM 5 + +#define LPT_PR 0x74 +#define LPT_SSFSTS_CTL 0x90 +#define LPT_FREG_NUM 5 +#define LPT_PR_NUM 5 + +#define BXT_PR 0x84 +#define BXT_SSFSTS_CTL 0xa0 +#define BXT_FREG_NUM 12 +#define BXT_PR_NUM 6 + +#define CNL_PR 0x84 +#define CNL_FREG_NUM 6 +#define CNL_PR_NUM 5 + +#define LVSCC 0xc4 +#define UVSCC 0xc8 +#define ERASE_OPCODE_SHIFT 8 +#define ERASE_OPCODE_MASK (0xff << ERASE_OPCODE_SHIFT) +#define ERASE_64K_OPCODE_SHIFT 16 +#define ERASE_64K_OPCODE_MASK (0xff << ERASE_OPCODE_SHIFT) + +#define INTEL_SPI_TIMEOUT 5000 /* ms */ +#define INTEL_SPI_FIFO_SZ 64 + +/** + * struct intel_spi - Driver private data + * @dev: Device pointer + * @info: Pointer to board specific info + * @nor: SPI NOR layer structure + * @base: Beginning of MMIO space + * @pregs: Start of protection registers + * @sregs: Start of software sequencer registers + * @nregions: Maximum number of regions + * @pr_num: Maximum number of protected range registers + * @writeable: Is the chip writeable + * @locked: Is SPI setting locked + * @swseq_reg: Use SW sequencer in register reads/writes + * @swseq_erase: Use SW sequencer in erase operation + * @erase_64k: 64k erase supported + * @atomic_preopcode: Holds preopcode when atomic sequence is requested + * @opcodes: Opcodes which are supported. This are programmed by BIOS + * before it locks down the controller. + */ +struct intel_spi { + struct device *dev; + const struct intel_spi_boardinfo *info; + struct spi_nor nor; + void __iomem *base; + void __iomem *pregs; + void __iomem *sregs; + size_t nregions; + size_t pr_num; + bool writeable; + bool locked; + bool swseq_reg; + bool swseq_erase; + bool erase_64k; + u8 atomic_preopcode; + u8 opcodes[8]; +}; + +static bool writeable; +module_param(writeable, bool, 0); +MODULE_PARM_DESC(writeable, "Enable write access to SPI flash chip (default=0)"); + +static void intel_spi_dump_regs(struct intel_spi *ispi) +{ + u32 value; + int i; + + dev_dbg(ispi->dev, "BFPREG=0x%08x\n", readl(ispi->base + BFPREG)); + + value = readl(ispi->base + HSFSTS_CTL); + dev_dbg(ispi->dev, "HSFSTS_CTL=0x%08x\n", value); + if (value & HSFSTS_CTL_FLOCKDN) + dev_dbg(ispi->dev, "-> Locked\n"); + + dev_dbg(ispi->dev, "FADDR=0x%08x\n", readl(ispi->base + FADDR)); + dev_dbg(ispi->dev, "DLOCK=0x%08x\n", readl(ispi->base + DLOCK)); + + for (i = 0; i < 16; i++) + dev_dbg(ispi->dev, "FDATA(%d)=0x%08x\n", + i, readl(ispi->base + FDATA(i))); + + dev_dbg(ispi->dev, "FRACC=0x%08x\n", readl(ispi->base + FRACC)); + + for (i = 0; i < ispi->nregions; i++) + dev_dbg(ispi->dev, "FREG(%d)=0x%08x\n", i, + readl(ispi->base + FREG(i))); + for (i = 0; i < ispi->pr_num; i++) + dev_dbg(ispi->dev, "PR(%d)=0x%08x\n", i, + readl(ispi->pregs + PR(i))); + + if (ispi->sregs) { + value = readl(ispi->sregs + SSFSTS_CTL); + dev_dbg(ispi->dev, "SSFSTS_CTL=0x%08x\n", value); + dev_dbg(ispi->dev, "PREOP_OPTYPE=0x%08x\n", + readl(ispi->sregs + PREOP_OPTYPE)); + dev_dbg(ispi->dev, "OPMENU0=0x%08x\n", + readl(ispi->sregs + OPMENU0)); + dev_dbg(ispi->dev, "OPMENU1=0x%08x\n", + readl(ispi->sregs + OPMENU1)); + } + + if (ispi->info->type == INTEL_SPI_BYT) + dev_dbg(ispi->dev, "BCR=0x%08x\n", readl(ispi->base + BYT_BCR)); + + dev_dbg(ispi->dev, "LVSCC=0x%08x\n", readl(ispi->base + LVSCC)); + dev_dbg(ispi->dev, "UVSCC=0x%08x\n", readl(ispi->base + UVSCC)); + + dev_dbg(ispi->dev, "Protected regions:\n"); + for (i = 0; i < ispi->pr_num; i++) { + u32 base, limit; + + value = readl(ispi->pregs + PR(i)); + if (!(value & (PR_WPE | PR_RPE))) + continue; + + limit = (value & PR_LIMIT_MASK) >> PR_LIMIT_SHIFT; + base = value & PR_BASE_MASK; + + dev_dbg(ispi->dev, " %02d base: 0x%08x limit: 0x%08x [%c%c]\n", + i, base << 12, (limit << 12) | 0xfff, + value & PR_WPE ? 'W' : '.', + value & PR_RPE ? 'R' : '.'); + } + + dev_dbg(ispi->dev, "Flash regions:\n"); + for (i = 0; i < ispi->nregions; i++) { + u32 region, base, limit; + + region = readl(ispi->base + FREG(i)); + base = region & FREG_BASE_MASK; + limit = (region & FREG_LIMIT_MASK) >> FREG_LIMIT_SHIFT; + + if (base >= limit || (i > 0 && limit == 0)) + dev_dbg(ispi->dev, " %02d disabled\n", i); + else + dev_dbg(ispi->dev, " %02d base: 0x%08x limit: 0x%08x\n", + i, base << 12, (limit << 12) | 0xfff); + } + + dev_dbg(ispi->dev, "Using %cW sequencer for register access\n", + ispi->swseq_reg ? 'S' : 'H'); + dev_dbg(ispi->dev, "Using %cW sequencer for erase operation\n", + ispi->swseq_erase ? 'S' : 'H'); +} + +/* Reads max INTEL_SPI_FIFO_SZ bytes from the device fifo */ +static int intel_spi_read_block(struct intel_spi *ispi, void *buf, size_t size) +{ + size_t bytes; + int i = 0; + + if (size > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + while (size > 0) { + bytes = min_t(size_t, size, 4); + memcpy_fromio(buf, ispi->base + FDATA(i), bytes); + size -= bytes; + buf += bytes; + i++; + } + + return 0; +} + +/* Writes max INTEL_SPI_FIFO_SZ bytes to the device fifo */ +static int intel_spi_write_block(struct intel_spi *ispi, const void *buf, + size_t size) +{ + size_t bytes; + int i = 0; + + if (size > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + while (size > 0) { + bytes = min_t(size_t, size, 4); + memcpy_toio(ispi->base + FDATA(i), buf, bytes); + size -= bytes; + buf += bytes; + i++; + } + + return 0; +} + +static int intel_spi_wait_hw_busy(struct intel_spi *ispi) +{ + u32 val; + + return readl_poll_timeout(ispi->base + HSFSTS_CTL, val, + !(val & HSFSTS_CTL_SCIP), 0, + INTEL_SPI_TIMEOUT * 1000); +} + +static int intel_spi_wait_sw_busy(struct intel_spi *ispi) +{ + u32 val; + + return readl_poll_timeout(ispi->sregs + SSFSTS_CTL, val, + !(val & SSFSTS_CTL_SCIP), 0, + INTEL_SPI_TIMEOUT * 1000); +} + +static int intel_spi_init(struct intel_spi *ispi) +{ + u32 opmenu0, opmenu1, lvscc, uvscc, val; + int i; + + switch (ispi->info->type) { + case INTEL_SPI_BYT: + ispi->sregs = ispi->base + BYT_SSFSTS_CTL; + ispi->pregs = ispi->base + BYT_PR; + ispi->nregions = BYT_FREG_NUM; + ispi->pr_num = BYT_PR_NUM; + ispi->swseq_reg = true; + + if (writeable) { + /* Disable write protection */ + val = readl(ispi->base + BYT_BCR); + if (!(val & BYT_BCR_WPD)) { + val |= BYT_BCR_WPD; + writel(val, ispi->base + BYT_BCR); + val = readl(ispi->base + BYT_BCR); + } + + ispi->writeable = !!(val & BYT_BCR_WPD); + } + + break; + + case INTEL_SPI_LPT: + ispi->sregs = ispi->base + LPT_SSFSTS_CTL; + ispi->pregs = ispi->base + LPT_PR; + ispi->nregions = LPT_FREG_NUM; + ispi->pr_num = LPT_PR_NUM; + ispi->swseq_reg = true; + break; + + case INTEL_SPI_BXT: + ispi->sregs = ispi->base + BXT_SSFSTS_CTL; + ispi->pregs = ispi->base + BXT_PR; + ispi->nregions = BXT_FREG_NUM; + ispi->pr_num = BXT_PR_NUM; + ispi->erase_64k = true; + break; + + case INTEL_SPI_CNL: + ispi->sregs = NULL; + ispi->pregs = ispi->base + CNL_PR; + ispi->nregions = CNL_FREG_NUM; + ispi->pr_num = CNL_PR_NUM; + break; + + default: + return -EINVAL; + } + + /* Disable #SMI generation from HW sequencer */ + val = readl(ispi->base + HSFSTS_CTL); + val &= ~HSFSTS_CTL_FSMIE; + writel(val, ispi->base + HSFSTS_CTL); + + /* + * Determine whether erase operation should use HW or SW sequencer. + * + * The HW sequencer has a predefined list of opcodes, with only the + * erase opcode being programmable in LVSCC and UVSCC registers. + * If these registers don't contain a valid erase opcode, erase + * cannot be done using HW sequencer. + */ + lvscc = readl(ispi->base + LVSCC); + uvscc = readl(ispi->base + UVSCC); + if (!(lvscc & ERASE_OPCODE_MASK) || !(uvscc & ERASE_OPCODE_MASK)) + ispi->swseq_erase = true; + /* SPI controller on Intel BXT supports 64K erase opcode */ + if (ispi->info->type == INTEL_SPI_BXT && !ispi->swseq_erase) + if (!(lvscc & ERASE_64K_OPCODE_MASK) || + !(uvscc & ERASE_64K_OPCODE_MASK)) + ispi->erase_64k = false; + + if (ispi->sregs == NULL && (ispi->swseq_reg || ispi->swseq_erase)) { + dev_err(ispi->dev, "software sequencer not supported, but required\n"); + return -EINVAL; + } + + /* + * Some controllers can only do basic operations using hardware + * sequencer. All other operations are supposed to be carried out + * using software sequencer. + */ + if (ispi->swseq_reg) { + /* Disable #SMI generation from SW sequencer */ + val = readl(ispi->sregs + SSFSTS_CTL); + val &= ~SSFSTS_CTL_FSMIE; + writel(val, ispi->sregs + SSFSTS_CTL); + } + + /* Check controller's lock status */ + val = readl(ispi->base + HSFSTS_CTL); + ispi->locked = !!(val & HSFSTS_CTL_FLOCKDN); + + if (ispi->locked && ispi->sregs) { + /* + * BIOS programs allowed opcodes and then locks down the + * register. So read back what opcodes it decided to support. + * That's the set we are going to support as well. + */ + opmenu0 = readl(ispi->sregs + OPMENU0); + opmenu1 = readl(ispi->sregs + OPMENU1); + + if (opmenu0 && opmenu1) { + for (i = 0; i < ARRAY_SIZE(ispi->opcodes) / 2; i++) { + ispi->opcodes[i] = opmenu0 >> i * 8; + ispi->opcodes[i + 4] = opmenu1 >> i * 8; + } + } + } + + intel_spi_dump_regs(ispi); + + return 0; +} + +static int intel_spi_opcode_index(struct intel_spi *ispi, u8 opcode, int optype) +{ + int i; + int preop; + + if (ispi->locked) { + for (i = 0; i < ARRAY_SIZE(ispi->opcodes); i++) + if (ispi->opcodes[i] == opcode) + return i; + + return -EINVAL; + } + + /* The lock is off, so just use index 0 */ + writel(opcode, ispi->sregs + OPMENU0); + preop = readw(ispi->sregs + PREOP_OPTYPE); + writel(optype << 16 | preop, ispi->sregs + PREOP_OPTYPE); + + return 0; +} + +static int intel_spi_hw_cycle(struct intel_spi *ispi, u8 opcode, size_t len) +{ + u32 val, status; + int ret; + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FCYCLE_MASK | HSFSTS_CTL_FDBC_MASK); + + switch (opcode) { + case SPINOR_OP_RDID: + val |= HSFSTS_CTL_FCYCLE_RDID; + break; + case SPINOR_OP_WRSR: + val |= HSFSTS_CTL_FCYCLE_WRSR; + break; + case SPINOR_OP_RDSR: + val |= HSFSTS_CTL_FCYCLE_RDSR; + break; + default: + return -EINVAL; + } + + if (len > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + val |= (len - 1) << HSFSTS_CTL_FDBC_SHIFT; + val |= HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + return -EIO; + else if (status & HSFSTS_CTL_AEL) + return -EACCES; + + return 0; +} + +static int intel_spi_sw_cycle(struct intel_spi *ispi, u8 opcode, size_t len, + int optype) +{ + u32 val = 0, status; + u8 atomic_preopcode; + int ret; + + ret = intel_spi_opcode_index(ispi, opcode, optype); + if (ret < 0) + return ret; + + if (len > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + /* + * Always clear it after each SW sequencer operation regardless + * of whether it is successful or not. + */ + atomic_preopcode = ispi->atomic_preopcode; + ispi->atomic_preopcode = 0; + + /* Only mark 'Data Cycle' bit when there is data to be transferred */ + if (len > 0) + val = ((len - 1) << SSFSTS_CTL_DBC_SHIFT) | SSFSTS_CTL_DS; + val |= ret << SSFSTS_CTL_COP_SHIFT; + val |= SSFSTS_CTL_FCERR | SSFSTS_CTL_FDONE; + val |= SSFSTS_CTL_SCGO; + if (atomic_preopcode) { + u16 preop; + + switch (optype) { + case OPTYPE_WRITE_NO_ADDR: + case OPTYPE_WRITE_WITH_ADDR: + /* Pick matching preopcode for the atomic sequence */ + preop = readw(ispi->sregs + PREOP_OPTYPE); + if ((preop & 0xff) == atomic_preopcode) + ; /* Do nothing */ + else if ((preop >> 8) == atomic_preopcode) + val |= SSFSTS_CTL_SPOP; + else + return -EINVAL; + + /* Enable atomic sequence */ + val |= SSFSTS_CTL_ACS; + break; + + default: + return -EINVAL; + } + + } + writel(val, ispi->sregs + SSFSTS_CTL); + + ret = intel_spi_wait_sw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->sregs + SSFSTS_CTL); + if (status & SSFSTS_CTL_FCERR) + return -EIO; + else if (status & SSFSTS_CTL_AEL) + return -EACCES; + + return 0; +} + +static int intel_spi_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, + size_t len) +{ + struct intel_spi *ispi = nor->priv; + int ret; + + /* Address of the first chip */ + writel(0, ispi->base + FADDR); + + if (ispi->swseq_reg) + ret = intel_spi_sw_cycle(ispi, opcode, len, + OPTYPE_READ_NO_ADDR); + else + ret = intel_spi_hw_cycle(ispi, opcode, len); + + if (ret) + return ret; + + return intel_spi_read_block(ispi, buf, len); +} + +static int intel_spi_write_reg(struct spi_nor *nor, u8 opcode, const u8 *buf, + size_t len) +{ + struct intel_spi *ispi = nor->priv; + int ret; + + /* + * This is handled with atomic operation and preop code in Intel + * controller so we only verify that it is available. If the + * controller is not locked, program the opcode to the PREOP + * register for later use. + * + * When hardware sequencer is used there is no need to program + * any opcodes (it handles them automatically as part of a command). + */ + if (opcode == SPINOR_OP_WREN) { + u16 preop; + + if (!ispi->swseq_reg) + return 0; + + preop = readw(ispi->sregs + PREOP_OPTYPE); + if ((preop & 0xff) != opcode && (preop >> 8) != opcode) { + if (ispi->locked) + return -EINVAL; + writel(opcode, ispi->sregs + PREOP_OPTYPE); + } + + /* + * This enables atomic sequence on next SW sycle. Will + * be cleared after next operation. + */ + ispi->atomic_preopcode = opcode; + return 0; + } + + /* + * We hope that HW sequencer will do the right thing automatically and + * with the SW sequencer we cannot use preopcode anyway, so just ignore + * the Write Disable operation and pretend it was completed + * successfully. + */ + if (opcode == SPINOR_OP_WRDI) + return 0; + + writel(0, ispi->base + FADDR); + + /* Write the value beforehand */ + ret = intel_spi_write_block(ispi, buf, len); + if (ret) + return ret; + + if (ispi->swseq_reg) + return intel_spi_sw_cycle(ispi, opcode, len, + OPTYPE_WRITE_NO_ADDR); + return intel_spi_hw_cycle(ispi, opcode, len); +} + +static ssize_t intel_spi_read(struct spi_nor *nor, loff_t from, size_t len, + u_char *read_buf) +{ + struct intel_spi *ispi = nor->priv; + size_t block_size, retlen = 0; + u32 val, status; + ssize_t ret; + + /* + * Atomic sequence is not expected with HW sequencer reads. Make + * sure it is cleared regardless. + */ + if (WARN_ON_ONCE(ispi->atomic_preopcode)) + ispi->atomic_preopcode = 0; + + switch (nor->read_opcode) { + case SPINOR_OP_READ: + case SPINOR_OP_READ_FAST: + case SPINOR_OP_READ_4B: + case SPINOR_OP_READ_FAST_4B: + break; + default: + return -EINVAL; + } + + while (len > 0) { + block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); + + /* Read cannot cross 4K boundary */ + block_size = min_t(loff_t, from + block_size, + round_up(from + 1, SZ_4K)) - from; + + writel(from, ispi->base + FADDR); + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FDBC_MASK | HSFSTS_CTL_FCYCLE_MASK); + val |= HSFSTS_CTL_AEL | HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= (block_size - 1) << HSFSTS_CTL_FDBC_SHIFT; + val |= HSFSTS_CTL_FCYCLE_READ; + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + ret = -EIO; + else if (status & HSFSTS_CTL_AEL) + ret = -EACCES; + + if (ret < 0) { + dev_err(ispi->dev, "read error: %llx: %#x\n", from, + status); + return ret; + } + + ret = intel_spi_read_block(ispi, read_buf, block_size); + if (ret) + return ret; + + len -= block_size; + from += block_size; + retlen += block_size; + read_buf += block_size; + } + + return retlen; +} + +static ssize_t intel_spi_write(struct spi_nor *nor, loff_t to, size_t len, + const u_char *write_buf) +{ + struct intel_spi *ispi = nor->priv; + size_t block_size, retlen = 0; + u32 val, status; + ssize_t ret; + + /* Not needed with HW sequencer write, make sure it is cleared */ + ispi->atomic_preopcode = 0; + + while (len > 0) { + block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); + + /* Write cannot cross 4K boundary */ + block_size = min_t(loff_t, to + block_size, + round_up(to + 1, SZ_4K)) - to; + + writel(to, ispi->base + FADDR); + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FDBC_MASK | HSFSTS_CTL_FCYCLE_MASK); + val |= HSFSTS_CTL_AEL | HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= (block_size - 1) << HSFSTS_CTL_FDBC_SHIFT; + val |= HSFSTS_CTL_FCYCLE_WRITE; + + ret = intel_spi_write_block(ispi, write_buf, block_size); + if (ret) { + dev_err(ispi->dev, "failed to write block\n"); + return ret; + } + + /* Start the write now */ + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) { + dev_err(ispi->dev, "timeout\n"); + return ret; + } + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + ret = -EIO; + else if (status & HSFSTS_CTL_AEL) + ret = -EACCES; + + if (ret < 0) { + dev_err(ispi->dev, "write error: %llx: %#x\n", to, + status); + return ret; + } + + len -= block_size; + to += block_size; + retlen += block_size; + write_buf += block_size; + } + + return retlen; +} + +static int intel_spi_erase(struct spi_nor *nor, loff_t offs) +{ + size_t erase_size, len = nor->mtd.erasesize; + struct intel_spi *ispi = nor->priv; + u32 val, status, cmd; + int ret; + + /* If the hardware can do 64k erase use that when possible */ + if (len >= SZ_64K && ispi->erase_64k) { + cmd = HSFSTS_CTL_FCYCLE_ERASE_64K; + erase_size = SZ_64K; + } else { + cmd = HSFSTS_CTL_FCYCLE_ERASE; + erase_size = SZ_4K; + } + + if (ispi->swseq_erase) { + while (len > 0) { + writel(offs, ispi->base + FADDR); + + ret = intel_spi_sw_cycle(ispi, nor->erase_opcode, + 0, OPTYPE_WRITE_WITH_ADDR); + if (ret) + return ret; + + offs += erase_size; + len -= erase_size; + } + + return 0; + } + + /* Not needed with HW sequencer erase, make sure it is cleared */ + ispi->atomic_preopcode = 0; + + while (len > 0) { + writel(offs, ispi->base + FADDR); + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FDBC_MASK | HSFSTS_CTL_FCYCLE_MASK); + val |= HSFSTS_CTL_AEL | HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= cmd; + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + return -EIO; + else if (status & HSFSTS_CTL_AEL) + return -EACCES; + + offs += erase_size; + len -= erase_size; + } + + return 0; +} + +static bool intel_spi_is_protected(const struct intel_spi *ispi, + unsigned int base, unsigned int limit) +{ + int i; + + for (i = 0; i < ispi->pr_num; i++) { + u32 pr_base, pr_limit, pr_value; + + pr_value = readl(ispi->pregs + PR(i)); + if (!(pr_value & (PR_WPE | PR_RPE))) + continue; + + pr_limit = (pr_value & PR_LIMIT_MASK) >> PR_LIMIT_SHIFT; + pr_base = pr_value & PR_BASE_MASK; + + if (pr_base >= base && pr_limit <= limit) + return true; + } + + return false; +} + +/* + * There will be a single partition holding all enabled flash regions. We + * call this "BIOS". + */ +static void intel_spi_fill_partition(struct intel_spi *ispi, + struct mtd_partition *part) +{ + u64 end; + int i; + + mem_clear(part, sizeof(*part)); + + /* Start from the mandatory descriptor region */ + part->size = 4096; + part->name = "BIOS"; + + /* + * Now try to find where this partition ends based on the flash + * region registers. + */ + for (i = 1; i < ispi->nregions; i++) { + u32 region, base, limit; + + region = readl(ispi->base + FREG(i)); + base = region & FREG_BASE_MASK; + limit = (region & FREG_LIMIT_MASK) >> FREG_LIMIT_SHIFT; + + if (base >= limit || limit == 0) + continue; + + /* + * If any of the regions have protection bits set, make the + * whole partition read-only to be on the safe side. + */ + if (intel_spi_is_protected(ispi, base, limit)) + ispi->writeable = false; + + end = (limit << 12) + 4096; + if (end > part->size) + part->size = end; + } +} + +static const struct spi_nor_controller_ops intel_spi_controller_ops = { + .read_reg = intel_spi_read_reg, + .write_reg = intel_spi_write_reg, + .read = intel_spi_read, + .write = intel_spi_write, + .erase = intel_spi_erase, +}; + +struct intel_spi *intel_spi_probe(struct device *dev, + struct resource *mem, const struct intel_spi_boardinfo *info) +{ + const struct spi_nor_hwcaps hwcaps = { + .mask = SNOR_HWCAPS_READ | + SNOR_HWCAPS_READ_FAST | + SNOR_HWCAPS_PP, + }; + struct mtd_partition part; + struct intel_spi *ispi; + int ret; + + if (!info || !mem) + return ERR_PTR(-EINVAL); + + ispi = devm_kzalloc(dev, sizeof(*ispi), GFP_KERNEL); + if (!ispi) + return ERR_PTR(-ENOMEM); + + ispi->base = devm_ioremap_resource(dev, mem); + if (IS_ERR(ispi->base)) + return ERR_CAST(ispi->base); + + ispi->dev = dev; + ispi->info = info; + ispi->writeable = info->writeable; + + ret = intel_spi_init(ispi); + if (ret) + return ERR_PTR(ret); + + ispi->nor.dev = ispi->dev; + ispi->nor.priv = ispi; + ispi->nor.controller_ops = &intel_spi_controller_ops; + + ret = spi_nor_scan(&ispi->nor, NULL, &hwcaps); + if (ret) { + dev_info(dev, "failed to locate the chip\n"); + return ERR_PTR(ret); + } + + intel_spi_fill_partition(ispi, &part); + + /* Prevent writes if not explicitly enabled */ + if (!ispi->writeable || !writeable) + ispi->nor.mtd.flags &= ~MTD_WRITEABLE; + + ret = mtd_device_register(&ispi->nor.mtd, &part, 1); + if (ret) + return ERR_PTR(ret); + + return ispi; +} +EXPORT_SYMBOL_GPL(intel_spi_probe); + +int intel_spi_remove(struct intel_spi *ispi) +{ + return mtd_device_unregister(&ispi->nor.mtd); +} +EXPORT_SYMBOL_GPL(intel_spi_remove); + +MODULE_DESCRIPTION("Intel PCH/PCU SPI flash core driver"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c new file mode 100644 index 000000000000..b9f294860ce4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c @@ -0,0 +1,167 @@ +/* + * Intel PCH/PCU SPI flash platform driver. + * + * Copyright (C) 2016, Intel Corporation + * Author: Mika Westerberg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include + +#include "intel_spi.h" + +#define PCI_VENDOR_ID_D1527_LPC (0x8c54) + +#define BIOS_CNTL (0xdc) +#define BIOS_CNTL_SRC_SHIFT 2 +#define BIOS_CNTL_WN BIT(0) +#define BIOS_CNTL_BLE BIT(1) +#define BIOS_CNTL_SMM_BMP BIT(5) + +#define RCBABASE 0xf0 + +int intel_spi_platform_debug = 0; +module_param(intel_spi_platform_debug, int, S_IRUGO | S_IWUSR); +int intel_spi_platform_error = 0; +module_param(intel_spi_platform_error, int, S_IRUGO | S_IWUSR); + +static bool writeable; +module_param(writeable, bool, 0); +MODULE_PARM_DESC(writeable, "Enable write access to BIOS (default=0)"); + +#define INTEL_SPI_PLATFORM_VERBOSE(fmt, args...) do { \ + if (intel_spi_platform_debug) { \ + printk(KERN_INFO "[INTEL_SPI_PLATFORM][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ + } while (0) + +#define INTEL_SPI_PLATFORM_ERROR(fmt, args...) do { \ + if (intel_spi_platform_error) { \ + printk(KERN_ERR "[INTEL_SPI_PLATFORM][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ + } while (0) + +static void intel_spi_enable_bios_write(struct pci_dev *pci_dev, struct intel_spi_boardinfo *info) +{ + u8 bios_cntl, value, want, new; + + if (writeable) { + pci_read_config_byte(pci_dev, BIOS_CNTL, &bios_cntl); + want = bios_cntl; + value = (bios_cntl >> BIOS_CNTL_SRC_SHIFT) & 0x3 ; + if (value == 0x3) { + INTEL_SPI_PLATFORM_VERBOSE("invalid prefetching/caching settings, "); + } else { + INTEL_SPI_PLATFORM_VERBOSE("prefetching %sabled, caching %sabled, ", + (value & 0x2) ? "en" : "dis", + (value & 0x1) ? "dis" : "en"); + } + + /* writeable regardless */ + want &= ~BIOS_CNTL_SMM_BMP; + /* write enable */ + want |= BIOS_CNTL_WN; + /* BIOS lock disabled */ + want &= ~BIOS_CNTL_BLE; + INTEL_SPI_PLATFORM_VERBOSE("bios cntl is:0x%x, want is:0x%x\n", bios_cntl, want); + pci_write_config_byte(pci_dev, BIOS_CNTL, want); + pci_read_config_byte(pci_dev, BIOS_CNTL, &new); + INTEL_SPI_PLATFORM_VERBOSE("\nBIOS_CNTL = 0x%02x: ", new); + INTEL_SPI_PLATFORM_VERBOSE("BIOS Lock Enable: %sabled, ", (new & BIOS_CNTL_BLE) ? "en" : "dis"); + INTEL_SPI_PLATFORM_VERBOSE("BIOS Write Enable: %sabled\n", (new & BIOS_CNTL_WN) ? "en" : "dis"); + + if (new & BIOS_CNTL_SMM_BMP) { + INTEL_SPI_PLATFORM_VERBOSE("BIOS region SMM protection is enabled!\n"); + } + + if (new != want) { + INTEL_SPI_PLATFORM_VERBOSE("Warning: Setting Bios Control at 0x%x from 0x%02x to 0x%02x failed.\n" + "New value is 0x%02x.\n", BIOS_CNTL, value, want, new); + } else { + info->writeable = !!(new & BIOS_CNTL_WN); + } + INTEL_SPI_PLATFORM_VERBOSE("Bios Control is 0x%x\n", new); + } else { + INTEL_SPI_PLATFORM_VERBOSE("Bios don't write\n"); + } + + return ; +} + +static int intel_spi_platform_probe(struct platform_device *pdev) +{ + struct intel_spi_boardinfo *info; + struct intel_spi *ispi; + struct resource *mem; + struct pci_dev *pci_dev = NULL; + u32 rcba; + + info = dev_get_platdata(&pdev->dev); + if (!info) + return -EINVAL; + + pci_dev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_D1527_LPC, pci_dev); + if (!pci_dev) { + INTEL_SPI_PLATFORM_ERROR("pci_get_device(0x8086, 0x8c54) failed!\n"); + return -1; + } + + switch (info->type) { + case INTEL_SPI_LPT: + pci_read_config_dword(pci_dev, RCBABASE, &rcba); + if (rcba & 1) { + intel_spi_enable_bios_write(pci_dev, info); + } + break; + default: + INTEL_SPI_PLATFORM_ERROR("info type[%d] not need set writeable.\n",info->type); + break; + } + INTEL_SPI_PLATFORM_VERBOSE("intel spi boardinfo writeable is %sabled\n", + info->writeable ? "en" : "dis"); + + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + ispi = intel_spi_probe(&pdev->dev, mem, info); + if (IS_ERR(ispi)) + return PTR_ERR(ispi); + + platform_set_drvdata(pdev, ispi); + return 0; +} + +static int intel_spi_platform_remove(struct platform_device *pdev) +{ + struct intel_spi *ispi = platform_get_drvdata(pdev); + + return intel_spi_remove(ispi); +} + +static struct of_device_id intel_spi_match[] = { + { + .compatible = "spi-c224", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, intel_spi_match); + +static struct platform_driver intel_spi_platform_driver = { + .probe = intel_spi_platform_probe, + .remove = intel_spi_platform_remove, + .driver = { + .name = "intel-spi", + .of_match_table = intel_spi_match, + }, +}; + +module_platform_driver(intel_spi_platform_driver); + +MODULE_DESCRIPTION("Intel PCH/PCU SPI flash platform driver"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:intel-spi"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile new file mode 100644 index 000000000000..4226f2734275 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile @@ -0,0 +1,34 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +#ifdef ENABLE_GCOV +#ifeq ($(ENABLE_GCOV), y) +#EXTRA_CFLAGS+= -fprofile-arcs -ftest-coverage -lgcov +#endif +#endif # ENABLE_GCOV + +obj-m := wb_lm75.o +obj-m += wb_tmp401.o +obj-m += wb_i2c_mux_pca9641.o +obj-m += wb_i2c_mux_pca954x.o +obj-m += wb_i2c_i801.o +obj-m += wb_i2c_algo_bit.o +obj-m += wb_i2c_gpio.o +obj-m += wb_i2c_gpio_device.o +obj-m += wb_at24.o +obj-m += wb_pmbus_core.o +obj-m += wb_csu550.o +obj-m += wb_ina3221.o +obj-m += wb_isl68137.o +obj-m += wb_tps53622.o +obj-m += wb_ucd9000.o + +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd $(PWD)/*.mod + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c new file mode 100644 index 000000000000..1075e6ef18de --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c @@ -0,0 +1,861 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * at24.c - handle most I2C EEPROMs + * + * Copyright (C) 2005-2007 David Brownell + * Copyright (C) 2008 Wolfram Sang, Pengutronix + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Address pointer is 16 bit. */ +#define AT24_FLAG_ADDR16 BIT(7) +/* sysfs-entry will be read-only. */ +#define AT24_FLAG_READONLY BIT(6) +/* sysfs-entry will be world-readable. */ +#define AT24_FLAG_IRUGO BIT(5) +/* Take always 8 addresses (24c00). */ +#define AT24_FLAG_TAKE8ADDR BIT(4) +/* Factory-programmed serial number. */ +#define AT24_FLAG_SERIAL BIT(3) +/* Factory-programmed mac address. */ +#define AT24_FLAG_MAC BIT(2) +/* Does not auto-rollover reads to the next slave address. */ +#define AT24_FLAG_NO_RDROL BIT(1) + +/* + * I2C EEPROMs from most vendors are inexpensive and mostly interchangeable. + * Differences between different vendor product lines (like Atmel AT24C or + * MicroChip 24LC, etc) won't much matter for typical read/write access. + * There are also I2C RAM chips, likewise interchangeable. One example + * would be the PCF8570, which acts like a 24c02 EEPROM (256 bytes). + * + * However, misconfiguration can lose data. "Set 16-bit memory address" + * to a part with 8-bit addressing will overwrite data. Writing with too + * big a page size also loses data. And it's not safe to assume that the + * conventional addresses 0x50..0x57 only hold eeproms; a PCF8563 RTC + * uses 0x51, for just one example. + * + * Accordingly, explicit board-specific configuration data should be used + * in almost all cases. (One partial exception is an SMBus used to access + * "SPD" data for DRAM sticks. Those only use 24c02 EEPROMs.) + * + * So this driver uses "new style" I2C driver binding, expecting to be + * told what devices exist. That may be in arch/X/mach-Y/board-Z.c or + * similar kernel-resident tables; or, configuration data coming from + * a bootloader. + * + * Other than binding model, current differences from "eeprom" driver are + * that this one handles write access and isn't restricted to 24c02 devices. + * It also handles larger devices (32 kbit and up) with two-byte addresses, + * which won't work on pure SMBus systems. + */ + +struct at24_client { + struct i2c_client *client; + struct regmap *regmap; +}; + +struct at24_data { + /* + * Lock protects against activities from other Linux tasks, + * but not from changes by other I2C masters. + */ + struct mutex lock; + + unsigned int write_max; + unsigned int num_addresses; + unsigned int offset_adj; + + u32 byte_len; + u16 page_size; + u8 flags; + + struct nvmem_device *nvmem; + struct regulator *vcc_reg; + void (*read_post)(unsigned int off, char *buf, size_t count); + + /* + * Some chips tie up multiple I2C addresses; dummy devices reserve + * them for us, and we'll use them with SMBus calls. + */ + struct at24_client client[]; +}; + +/* + * This parameter is to help this driver avoid blocking other drivers out + * of I2C for potentially troublesome amounts of time. With a 100 kHz I2C + * clock, one 256 byte read takes about 1/43 second which is excessive; + * but the 1/170 second it takes at 400 kHz may be quite reasonable; and + * at 1 MHz (Fm+) a 1/430 second delay could easily be invisible. + * + * This value is forced to be a power of two so that writes align on pages. + */ +static unsigned int at24_io_limit = 128; +module_param_named(io_limit, at24_io_limit, uint, 0); +MODULE_PARM_DESC(at24_io_limit, "Maximum bytes per I/O (default 128)"); + +/* + * Specs often allow 5 msec for a page write, sometimes 20 msec; + * it's important to recover from write timeouts. + */ +static unsigned int at24_write_timeout = 25; +module_param_named(write_timeout, at24_write_timeout, uint, 0); +MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)"); + +struct at24_chip_data { + u32 byte_len; + u8 flags; + void (*read_post)(unsigned int off, char *buf, size_t count); +}; + +#define AT24_CHIP_DATA(_name, _len, _flags) \ + static const struct at24_chip_data _name = { \ + .byte_len = _len, .flags = _flags, \ + } + +#define AT24_CHIP_DATA_CB(_name, _len, _flags, _read_post) \ + static const struct at24_chip_data _name = { \ + .byte_len = _len, .flags = _flags, \ + .read_post = _read_post, \ + } + +static void at24_read_post_vaio(unsigned int off, char *buf, size_t count) +{ + int i; + + if (capable(CAP_SYS_ADMIN)) + return; + + /* + * Hide VAIO private settings to regular users: + * - BIOS passwords: bytes 0x00 to 0x0f + * - UUID: bytes 0x10 to 0x1f + * - Serial number: 0xc0 to 0xdf + */ + for (i = 0; i < count; i++) { + if ((off + i <= 0x1f) || + (off + i >= 0xc0 && off + i <= 0xdf)) + buf[i] = 0; + } +} + +/* needs 8 addresses as A0-A2 are ignored */ +AT24_CHIP_DATA(at24_data_24c00, 128 / 8, AT24_FLAG_TAKE8ADDR); +/* old variants can't be handled with this generic entry! */ +AT24_CHIP_DATA(at24_data_24c01, 1024 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs01, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c02, 2048 / 8, AT24_FLAG_IRUGO); +AT24_CHIP_DATA(at24_data_24cs02, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24mac402, 48 / 8, + AT24_FLAG_MAC | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24mac602, 64 / 8, + AT24_FLAG_MAC | AT24_FLAG_READONLY); +/* spd is a 24c02 in memory DIMMs */ +AT24_CHIP_DATA(at24_data_spd, 2048 / 8, + AT24_FLAG_READONLY | AT24_FLAG_IRUGO); +/* 24c02_vaio is a 24c02 on some Sony laptops */ +AT24_CHIP_DATA_CB(at24_data_24c02_vaio, 2048 / 8, + AT24_FLAG_READONLY | AT24_FLAG_IRUGO, + at24_read_post_vaio); +AT24_CHIP_DATA(at24_data_24c04, 4096 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs04, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +/* 24rf08 quirk is handled at i2c-core */ +AT24_CHIP_DATA(at24_data_24c08, 8192 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs08, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c16, 16384 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs16, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c32, 32768 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24cs32, 16, + AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c64, 65536 / 8, AT24_FLAG_ADDR16 | AT24_FLAG_IRUGO); +AT24_CHIP_DATA(at24_data_24cs64, 16, + AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c256, 262144 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c512, 524288 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c1024, 1048576 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c2048, 2097152 / 8, AT24_FLAG_ADDR16); +/* identical to 24c08 ? */ +AT24_CHIP_DATA(at24_data_INT3499, 8192 / 8, 0); + +static const struct i2c_device_id at24_ids[] = { + { "wb_24c00", (kernel_ulong_t)&at24_data_24c00 }, + { "wb_24c01", (kernel_ulong_t)&at24_data_24c01 }, + { "wb_24cs01", (kernel_ulong_t)&at24_data_24cs01 }, + { "wb_24c02", (kernel_ulong_t)&at24_data_24c02 }, + { "wb_24cs02", (kernel_ulong_t)&at24_data_24cs02 }, + { "wb_24mac402", (kernel_ulong_t)&at24_data_24mac402 }, + { "wb_24mac602", (kernel_ulong_t)&at24_data_24mac602 }, + { "wb_spd", (kernel_ulong_t)&at24_data_spd }, + { "wb_24c02-vaio", (kernel_ulong_t)&at24_data_24c02_vaio }, + { "wb_24c04", (kernel_ulong_t)&at24_data_24c04 }, + { "wb_24cs04", (kernel_ulong_t)&at24_data_24cs04 }, + { "wb_24c08", (kernel_ulong_t)&at24_data_24c08 }, + { "wb_24cs08", (kernel_ulong_t)&at24_data_24cs08 }, + { "wb_24c16", (kernel_ulong_t)&at24_data_24c16 }, + { "wb_24cs16", (kernel_ulong_t)&at24_data_24cs16 }, + { "wb_24c32", (kernel_ulong_t)&at24_data_24c32 }, + { "wb_24cs32", (kernel_ulong_t)&at24_data_24cs32 }, + { "wb_24c64", (kernel_ulong_t)&at24_data_24c64 }, + { "wb_24cs64", (kernel_ulong_t)&at24_data_24cs64 }, + { "wb_24c128", (kernel_ulong_t)&at24_data_24c128 }, + { "wb_24c256", (kernel_ulong_t)&at24_data_24c256 }, + { "wb_24c512", (kernel_ulong_t)&at24_data_24c512 }, + { "wb_24c1024", (kernel_ulong_t)&at24_data_24c1024 }, + { "wb_24c2048", (kernel_ulong_t)&at24_data_24c2048 }, + { "wb_at24", 0 }, + { /* END OF LIST */ } +}; +MODULE_DEVICE_TABLE(i2c, at24_ids); + +static const struct of_device_id at24_of_match[] = { + { .compatible = "atmel,24c00", .data = &at24_data_24c00 }, + { .compatible = "atmel,24c01", .data = &at24_data_24c01 }, + { .compatible = "atmel,24cs01", .data = &at24_data_24cs01 }, + { .compatible = "atmel,24c02", .data = &at24_data_24c02 }, + { .compatible = "atmel,24cs02", .data = &at24_data_24cs02 }, + { .compatible = "atmel,24mac402", .data = &at24_data_24mac402 }, + { .compatible = "atmel,24mac602", .data = &at24_data_24mac602 }, + { .compatible = "atmel,spd", .data = &at24_data_spd }, + { .compatible = "atmel,24c04", .data = &at24_data_24c04 }, + { .compatible = "atmel,24cs04", .data = &at24_data_24cs04 }, + { .compatible = "atmel,24c08", .data = &at24_data_24c08 }, + { .compatible = "atmel,24cs08", .data = &at24_data_24cs08 }, + { .compatible = "atmel,24c16", .data = &at24_data_24c16 }, + { .compatible = "atmel,24cs16", .data = &at24_data_24cs16 }, + { .compatible = "atmel,24c32", .data = &at24_data_24c32 }, + { .compatible = "atmel,24cs32", .data = &at24_data_24cs32 }, + { .compatible = "atmel,24c64", .data = &at24_data_24c64 }, + { .compatible = "atmel,24cs64", .data = &at24_data_24cs64 }, + { .compatible = "atmel,24c128", .data = &at24_data_24c128 }, + { .compatible = "atmel,24c256", .data = &at24_data_24c256 }, + { .compatible = "atmel,24c512", .data = &at24_data_24c512 }, + { .compatible = "atmel,24c1024", .data = &at24_data_24c1024 }, + { .compatible = "atmel,24c2048", .data = &at24_data_24c2048 }, + { /* END OF LIST */ }, +}; +MODULE_DEVICE_TABLE(of, at24_of_match); + +static const struct acpi_device_id __maybe_unused at24_acpi_ids[] = { + { "INT3499", (kernel_ulong_t)&at24_data_INT3499 }, + { "TPF0001", (kernel_ulong_t)&at24_data_24c1024 }, + { /* END OF LIST */ } +}; +MODULE_DEVICE_TABLE(acpi, at24_acpi_ids); + +/* + * This routine supports chips which consume multiple I2C addresses. It + * computes the addressing information to be used for a given r/w request. + * Assumes that sanity checks for offset happened at sysfs-layer. + * + * Slave address and byte offset derive from the offset. Always + * set the byte address; on a multi-master board, another master + * may have changed the chip's "current" address pointer. + */ +static struct at24_client *at24_translate_offset(struct at24_data *at24, + unsigned int *offset) +{ + unsigned int i; + + if (at24->flags & AT24_FLAG_ADDR16) { + i = *offset >> 16; + *offset &= 0xffff; + } else { + i = *offset >> 8; + *offset &= 0xff; + } + + return &at24->client[i]; +} + +static struct device *at24_base_client_dev(struct at24_data *at24) +{ + return &at24->client[0].client->dev; +} + +static size_t at24_adjust_read_count(struct at24_data *at24, + unsigned int offset, size_t count) +{ + unsigned int bits; + size_t remainder; + + /* + * In case of multi-address chips that don't rollover reads to + * the next slave address: truncate the count to the slave boundary, + * so that the read never straddles slaves. + */ + if (at24->flags & AT24_FLAG_NO_RDROL) { + bits = (at24->flags & AT24_FLAG_ADDR16) ? 16 : 8; + remainder = BIT(bits) - offset; + if (count > remainder) + count = remainder; + } + + if (count > at24_io_limit) + count = at24_io_limit; + + return count; +} + +static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, + unsigned int offset, size_t count) +{ + unsigned long timeout, read_time; + struct at24_client *at24_client; + struct i2c_client *client; + struct regmap *regmap; + int ret; + + at24_client = at24_translate_offset(at24, &offset); + regmap = at24_client->regmap; + client = at24_client->client; + count = at24_adjust_read_count(at24, offset, count); + + /* adjust offset for mac and serial read ops */ + offset += at24->offset_adj; + + timeout = jiffies + msecs_to_jiffies(at24_write_timeout); + do { + /* + * The timestamp shall be taken before the actual operation + * to avoid a premature timeout in case of high CPU load. + */ + read_time = jiffies; + + ret = regmap_bulk_read(regmap, offset, buf, count); + dev_dbg(&client->dev, "read %zu@%d --> %d (%ld)\n", + count, offset, ret, jiffies); + if (!ret) + return count; + + usleep_range(1000, 1500); + } while (time_before(read_time, timeout)); + + return -ETIMEDOUT; +} + +/* + * Note that if the hardware write-protect pin is pulled high, the whole + * chip is normally write protected. But there are plenty of product + * variants here, including OTP fuses and partial chip protect. + * + * We only use page mode writes; the alternative is sloooow. These routines + * write at most one page. + */ + +static size_t at24_adjust_write_count(struct at24_data *at24, + unsigned int offset, size_t count) +{ + unsigned int next_page; + + /* write_max is at most a page */ + if (count > at24->write_max) + count = at24->write_max; + + /* Never roll over backwards, to the start of this page */ + next_page = roundup(offset + 1, at24->page_size); + if (offset + count > next_page) + count = next_page - offset; + + return count; +} + +static ssize_t at24_regmap_write(struct at24_data *at24, const char *buf, + unsigned int offset, size_t count) +{ + unsigned long timeout, write_time; + struct at24_client *at24_client; + struct i2c_client *client; + struct regmap *regmap; + int ret; + + at24_client = at24_translate_offset(at24, &offset); + regmap = at24_client->regmap; + client = at24_client->client; + count = at24_adjust_write_count(at24, offset, count); + timeout = jiffies + msecs_to_jiffies(at24_write_timeout); + + do { + /* + * The timestamp shall be taken before the actual operation + * to avoid a premature timeout in case of high CPU load. + */ + write_time = jiffies; + + ret = regmap_bulk_write(regmap, offset, buf, count); + dev_dbg(&client->dev, "write %zu@%d --> %d (%ld)\n", + count, offset, ret, jiffies); + if (!ret) + return count; + + usleep_range(1000, 1500); + } while (time_before(write_time, timeout)); + + return -ETIMEDOUT; +} + +static int at24_read(void *priv, unsigned int off, void *val, size_t count) +{ + struct at24_data *at24; + struct device *dev; + char *buf = val; + int i, ret; + + at24 = priv; + dev = at24_base_client_dev(at24); + + if (unlikely(!count)) + return count; + + if (off + count > at24->byte_len) + return -EINVAL; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + pm_runtime_put_noidle(dev); + return ret; + } + + /* + * Read data from chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&at24->lock); + + for (i = 0; count; i += ret, count -= ret) { + ret = at24_regmap_read(at24, buf + i, off + i, count); + if (ret < 0) { + mutex_unlock(&at24->lock); + pm_runtime_put(dev); + return ret; + } + } + + mutex_unlock(&at24->lock); + + pm_runtime_put(dev); + + if (unlikely(at24->read_post)) + at24->read_post(off, buf, i); + + return 0; +} + +static int at24_write(void *priv, unsigned int off, void *val, size_t count) +{ + struct at24_data *at24; + struct device *dev; + char *buf = val; + int ret; + + at24 = priv; + dev = at24_base_client_dev(at24); + + if (unlikely(!count)) + return -EINVAL; + + if (off + count > at24->byte_len) + return -EINVAL; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + pm_runtime_put_noidle(dev); + return ret; + } + + /* + * Write data to chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&at24->lock); + + while (count) { + ret = at24_regmap_write(at24, buf, off, count); + if (ret < 0) { + mutex_unlock(&at24->lock); + pm_runtime_put(dev); + return ret; + } + buf += ret; + off += ret; + count -= ret; + } + + mutex_unlock(&at24->lock); + + pm_runtime_put(dev); + + return 0; +} + +static const struct at24_chip_data *at24_get_chip_data(struct device *dev) +{ + struct device_node *of_node = dev->of_node; + const struct at24_chip_data *cdata; + const struct i2c_device_id *id; + + id = i2c_match_id(at24_ids, to_i2c_client(dev)); + + /* + * The I2C core allows OF nodes compatibles to match against the + * I2C device ID table as a fallback, so check not only if an OF + * node is present but also if it matches an OF device ID entry. + */ + if (of_node && of_match_device(at24_of_match, dev)) + cdata = of_device_get_match_data(dev); + else if (id) + cdata = (void *)id->driver_data; + else + cdata = acpi_device_get_match_data(dev); + + if (!cdata) + return ERR_PTR(-ENODEV); + + return cdata; +} + +static int at24_make_dummy_client(struct at24_data *at24, unsigned int index, + struct regmap_config *regmap_config) +{ + struct i2c_client *base_client, *dummy_client; + struct regmap *regmap; + struct device *dev; + + base_client = at24->client[0].client; + dev = &base_client->dev; + + dummy_client = devm_i2c_new_dummy_device(dev, base_client->adapter, + base_client->addr + index); + if (IS_ERR(dummy_client)) + return PTR_ERR(dummy_client); + + regmap = devm_regmap_init_i2c(dummy_client, regmap_config); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + at24->client[index].client = dummy_client; + at24->client[index].regmap = regmap; + + return 0; +} + +static unsigned int at24_get_offset_adj(u8 flags, unsigned int byte_len) +{ + if (flags & AT24_FLAG_MAC) { + /* EUI-48 starts from 0x9a, EUI-64 from 0x98 */ + return 0xa0 - byte_len; + } else if (flags & AT24_FLAG_SERIAL && flags & AT24_FLAG_ADDR16) { + /* + * For 16 bit address pointers, the word address must contain + * a '10' sequence in bits 11 and 10 regardless of the + * intended position of the address pointer. + */ + return 0x0800; + } else if (flags & AT24_FLAG_SERIAL) { + /* + * Otherwise the word address must begin with a '10' sequence, + * regardless of the intended address. + */ + return 0x0080; + } else { + return 0; + } +} + +static int at24_probe(struct i2c_client *client) +{ + struct regmap_config regmap_config = { }; + struct nvmem_config nvmem_config = { }; + u32 byte_len, page_size, flags, addrw; + const struct at24_chip_data *cdata; + struct device *dev = &client->dev; + bool i2c_fn_i2c, i2c_fn_block; + unsigned int i, num_addresses; + struct at24_data *at24; + struct regmap *regmap; + bool writable; + u8 test_byte; + int err; + + i2c_fn_i2c = i2c_check_functionality(client->adapter, I2C_FUNC_I2C); + i2c_fn_block = i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK); + + cdata = at24_get_chip_data(dev); + if (IS_ERR(cdata)) + return PTR_ERR(cdata); + + err = device_property_read_u32(dev, "pagesize", &page_size); + if (err) + /* + * This is slow, but we can't know all eeproms, so we better + * play safe. Specifying custom eeprom-types via device tree + * or properties is recommended anyhow. + */ + page_size = 1; + + flags = cdata->flags; + if (device_property_present(dev, "read-only")) + flags |= AT24_FLAG_READONLY; + if (device_property_present(dev, "no-read-rollover")) + flags |= AT24_FLAG_NO_RDROL; + + err = device_property_read_u32(dev, "address-width", &addrw); + if (!err) { + switch (addrw) { + case 8: + if (flags & AT24_FLAG_ADDR16) + dev_warn(dev, + "Override address width to be 8, while default is 16\n"); + flags &= ~AT24_FLAG_ADDR16; + break; + case 16: + flags |= AT24_FLAG_ADDR16; + break; + default: + dev_warn(dev, "Bad \"address-width\" property: %u\n", + addrw); + } + } + + err = device_property_read_u32(dev, "size", &byte_len); + if (err) + byte_len = cdata->byte_len; + + if (!i2c_fn_i2c && !i2c_fn_block) + page_size = 1; + + if (!page_size) { + dev_err(dev, "page_size must not be 0!\n"); + return -EINVAL; + } + + if (!is_power_of_2(page_size)) + dev_warn(dev, "page_size looks suspicious (no power of 2)!\n"); + + err = device_property_read_u32(dev, "num-addresses", &num_addresses); + if (err) { + if (flags & AT24_FLAG_TAKE8ADDR) + num_addresses = 8; + else + num_addresses = DIV_ROUND_UP(byte_len, + (flags & AT24_FLAG_ADDR16) ? 65536 : 256); + } + + if ((flags & AT24_FLAG_SERIAL) && (flags & AT24_FLAG_MAC)) { + dev_err(dev, + "invalid device data - cannot have both AT24_FLAG_SERIAL & AT24_FLAG_MAC."); + return -EINVAL; + } + + regmap_config.val_bits = 8; + regmap_config.reg_bits = (flags & AT24_FLAG_ADDR16) ? 16 : 8; + regmap_config.disable_locking = true; + + regmap = devm_regmap_init_i2c(client, ®map_config); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + at24 = devm_kzalloc(dev, struct_size(at24, client, num_addresses), + GFP_KERNEL); + if (!at24) + return -ENOMEM; + + mutex_init(&at24->lock); + at24->byte_len = byte_len; + at24->page_size = page_size; + at24->flags = flags; + at24->read_post = cdata->read_post; + at24->num_addresses = num_addresses; + at24->offset_adj = at24_get_offset_adj(flags, byte_len); + at24->client[0].client = client; + at24->client[0].regmap = regmap; + + at24->vcc_reg = devm_regulator_get(dev, "vcc"); + if (IS_ERR(at24->vcc_reg)) + return PTR_ERR(at24->vcc_reg); + + writable = !(flags & AT24_FLAG_READONLY); + if (writable) { + at24->write_max = min_t(unsigned int, + page_size, at24_io_limit); + if (!i2c_fn_i2c && at24->write_max > I2C_SMBUS_BLOCK_MAX) + at24->write_max = I2C_SMBUS_BLOCK_MAX; + } + + /* use dummy devices for multiple-address chips */ + for (i = 1; i < num_addresses; i++) { + err = at24_make_dummy_client(at24, i, ®map_config); + if (err) + return err; + } + + /* + * If the 'label' property is not present for the AT24 EEPROM, + * then nvmem_config.id is initialised to NVMEM_DEVID_AUTO, + * and this will append the 'devid' to the name of the NVMEM + * device. This is purely legacy and the AT24 driver has always + * defaulted to this. However, if the 'label' property is + * present then this means that the name is specified by the + * firmware and this name should be used verbatim and so it is + * not necessary to append the 'devid'. + */ + if (device_property_present(dev, "label")) { + nvmem_config.id = NVMEM_DEVID_NONE; + err = device_property_read_string(dev, "label", + &nvmem_config.name); + if (err) + return err; + } else { + nvmem_config.id = NVMEM_DEVID_AUTO; + nvmem_config.name = dev_name(dev); + } + + nvmem_config.type = NVMEM_TYPE_EEPROM; + nvmem_config.dev = dev; + nvmem_config.read_only = !writable; + nvmem_config.root_only = !(flags & AT24_FLAG_IRUGO); + nvmem_config.owner = THIS_MODULE; + nvmem_config.compat = true; + nvmem_config.base_dev = dev; + nvmem_config.reg_read = at24_read; + nvmem_config.reg_write = at24_write; + nvmem_config.priv = at24; + nvmem_config.stride = 1; + nvmem_config.word_size = 1; + nvmem_config.size = byte_len; + + i2c_set_clientdata(client, at24); + + err = regulator_enable(at24->vcc_reg); + if (err) { + dev_err(dev, "Failed to enable vcc regulator\n"); + return err; + } + + /* enable runtime pm */ + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + + at24->nvmem = devm_nvmem_register(dev, &nvmem_config); + if (IS_ERR(at24->nvmem)) { + pm_runtime_disable(dev); + if (!pm_runtime_status_suspended(dev)) + regulator_disable(at24->vcc_reg); + return PTR_ERR(at24->nvmem); + } + + /* + * Perform a one-byte test read to verify that the + * chip is functional. + */ + err = at24_read(at24, 0, &test_byte, 1); + if (err) { + pm_runtime_disable(dev); + if (!pm_runtime_status_suspended(dev)) + regulator_disable(at24->vcc_reg); + return -ENODEV; + } + + pm_runtime_idle(dev); + + if (writable) + dev_info(dev, "%u byte %s EEPROM, writable, %u bytes/write\n", + byte_len, client->name, at24->write_max); + else + dev_info(dev, "%u byte %s EEPROM, read-only\n", + byte_len, client->name); + + return 0; +} + +static int at24_remove(struct i2c_client *client) +{ + struct at24_data *at24 = i2c_get_clientdata(client); + + pm_runtime_disable(&client->dev); + if (!pm_runtime_status_suspended(&client->dev)) + regulator_disable(at24->vcc_reg); + pm_runtime_set_suspended(&client->dev); + + return 0; +} + +static int __maybe_unused at24_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct at24_data *at24 = i2c_get_clientdata(client); + + return regulator_disable(at24->vcc_reg); +} + +static int __maybe_unused at24_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct at24_data *at24 = i2c_get_clientdata(client); + + return regulator_enable(at24->vcc_reg); +} + +static const struct dev_pm_ops at24_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(at24_suspend, at24_resume, NULL) +}; + +static struct i2c_driver at24_driver = { + .driver = { + .name = "wb_at24", + .pm = &at24_pm_ops, + .of_match_table = at24_of_match, + .acpi_match_table = ACPI_PTR(at24_acpi_ids), + }, + .probe_new = at24_probe, + .remove = at24_remove, + .id_table = at24_ids, +}; + +static int __init at24_init(void) +{ + if (!at24_io_limit) { + pr_err("at24: at24_io_limit must not be 0!\n"); + return -EINVAL; + } + + at24_io_limit = rounddown_pow_of_two(at24_io_limit); + return i2c_add_driver(&at24_driver); +} +module_init(at24_init); + +static void __exit at24_exit(void) +{ + i2c_del_driver(&at24_driver); +} +module_exit(at24_exit); + +MODULE_DESCRIPTION("Driver for most I2C EEPROMs"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c new file mode 100644 index 000000000000..36d07f071a71 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for PMBus devices + * + * Copyright (c) 2010, 2011 Ericsson AB. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +struct pmbus_device_info { + int pages; + u32 flags; +}; + +static const struct i2c_device_id pmbus_id[]; + +/* + * Find sensor groups and status registers on each page. + */ +static void pmbus_find_sensor_groups(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + int page; + + /* Sensors detected on page 0 only */ + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_VIN)) + info->func[0] |= PMBUS_HAVE_VIN; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_IIN)) + info->func[0] |= PMBUS_HAVE_IIN; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_PIN)) + info->func[0] |= PMBUS_HAVE_PIN; + if (info->func[0] + && wb_pmbus_check_byte_register(client, 0, PMBUS_STATUS_INPUT)) + info->func[0] |= PMBUS_HAVE_STATUS_INPUT; + if (wb_pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_12) && + wb_pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_1)) { + info->func[0] |= PMBUS_HAVE_FAN12; + if (wb_pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_12)) + info->func[0] |= PMBUS_HAVE_STATUS_FAN12; + } + if (wb_pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_34) && + wb_pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_3)) { + info->func[0] |= PMBUS_HAVE_FAN34; + if (wb_pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34)) + info->func[0] |= PMBUS_HAVE_STATUS_FAN34; + } + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1)) + info->func[0] |= PMBUS_HAVE_TEMP; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2)) + info->func[0] |= PMBUS_HAVE_TEMP2; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3)) + info->func[0] |= PMBUS_HAVE_TEMP3; + if (info->func[0] & (PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 + | PMBUS_HAVE_TEMP3) + && wb_pmbus_check_byte_register(client, 0, + PMBUS_STATUS_TEMPERATURE)) + info->func[0] |= PMBUS_HAVE_STATUS_TEMP; + + /* Sensors detected on all pages */ + for (page = 0; page < info->pages; page++) { + if (wb_pmbus_check_word_register(client, page, PMBUS_READ_VOUT)) { + info->func[page] |= PMBUS_HAVE_VOUT; + if (wb_pmbus_check_byte_register(client, page, + PMBUS_STATUS_VOUT)) + info->func[page] |= PMBUS_HAVE_STATUS_VOUT; + } + if (wb_pmbus_check_word_register(client, page, PMBUS_READ_IOUT)) { + info->func[page] |= PMBUS_HAVE_IOUT; + if (wb_pmbus_check_byte_register(client, 0, + PMBUS_STATUS_IOUT)) + info->func[page] |= PMBUS_HAVE_STATUS_IOUT; + } + if (wb_pmbus_check_word_register(client, page, PMBUS_READ_POUT)) + info->func[page] |= PMBUS_HAVE_POUT; + } +} + +/* + * Identify chip parameters. + */ +static int pmbus_identify(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + int ret = 0; + + if (!info->pages) { + /* + * Check if the PAGE command is supported. If it is, + * keep setting the page number until it fails or until the + * maximum number of pages has been reached. Assume that + * this is the number of pages supported by the chip. + */ + if (wb_pmbus_check_byte_register(client, 0, PMBUS_PAGE)) { + int page; + + for (page = 1; page < PMBUS_PAGES; page++) { + if (wb_pmbus_set_page(client, page, 0xff) < 0) + break; + } + wb_pmbus_set_page(client, 0, 0xff); + info->pages = page; + } else { + info->pages = 1; + } + + wb_pmbus_clear_faults(client); + } + + if (wb_pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { + int vout_mode, i; + + vout_mode = wb_pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); + if (vout_mode >= 0 && vout_mode != 0xff) { + switch (vout_mode >> 5) { + case 0: + break; + case 1: + info->format[PSC_VOLTAGE_OUT] = vid; + for (i = 0; i < info->pages; i++) + info->vrm_version[i] = vr11; + break; + case 2: + info->format[PSC_VOLTAGE_OUT] = direct; + break; + default: + ret = -ENODEV; + goto abort; + } + } + } + + /* + * We should check if the COEFFICIENTS register is supported. + * If it is, and the chip is configured for direct mode, we can read + * the coefficients from the chip, one set per group of sensor + * registers. + * + * To do this, we will need access to a chip which actually supports the + * COEFFICIENTS command, since the command is too complex to implement + * without testing it. Until then, abort if a chip configured for direct + * mode was detected. + */ + if (info->format[PSC_VOLTAGE_OUT] == direct) { + ret = -ENODEV; + goto abort; + } + + /* Try to find sensor groups */ + pmbus_find_sensor_groups(client, info); +abort: + return ret; +} + +static int pmbus_probe(struct i2c_client *client) +{ + struct pmbus_driver_info *info; + struct pmbus_platform_data *pdata = NULL; + struct device *dev = &client->dev; + struct pmbus_device_info *device_info; + + info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + device_info = (struct pmbus_device_info *)i2c_match_id(pmbus_id, client)->driver_data; + if (device_info->flags & PMBUS_SKIP_STATUS_CHECK) { + pdata = devm_kzalloc(dev, sizeof(struct pmbus_platform_data), + GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + pdata->flags = PMBUS_SKIP_STATUS_CHECK; + } + + info->pages = device_info->pages; + info->identify = pmbus_identify; + dev->platform_data = pdata; + + return wb_pmbus_do_probe(client, info); +} + +static const struct pmbus_device_info pmbus_info_one = { + .pages = 1, + .flags = 0 +}; + +static const struct pmbus_device_info pmbus_info_zero = { + .pages = 0, + .flags = 0 +}; + +static const struct pmbus_device_info pmbus_info_one_skip = { + .pages = 1, + .flags = PMBUS_SKIP_STATUS_CHECK +}; + +static const struct pmbus_device_info pmbus_info_zero_skip = { + .pages = 0, + .flags = PMBUS_SKIP_STATUS_CHECK +}; +/* + * Use driver_data to set the number of pages supported by the chip. + */ +static const struct i2c_device_id pmbus_id[] = { + {"wb_csu550", (kernel_ulong_t)&pmbus_info_zero_skip}, + {"wb_csu800", (kernel_ulong_t)&pmbus_info_one_skip}, + {"wb_fsp1200", (kernel_ulong_t)&pmbus_info_one_skip}, + {"wb_dps550", (kernel_ulong_t)&pmbus_info_one_skip}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, pmbus_id); + +/* This is the driver that will be inserted */ +static struct i2c_driver pmbus_driver = { + .driver = { + .name = "wb_pmbus", + }, + .probe_new = pmbus_probe, + .remove = wb_pmbus_do_remove, + .id_table = pmbus_id, +}; + +module_i2c_driver(pmbus_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Generic PMBus driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c new file mode 100644 index 000000000000..c98ac7a1c5b6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c @@ -0,0 +1,725 @@ +/* ------------------------------------------------------------------------- + * i2c-algo-bit.c i2c driver algorithms for bit-shift adapters + * ------------------------------------------------------------------------- + * Copyright (C) 1995-2000 Simon G. Vogl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + * ------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include +#include + +static int g_i2c_algo_bit_debug = 0; +static int g_i2c_algo_bit_error = 0; + +module_param(g_i2c_algo_bit_debug, int, S_IRUGO | S_IWUSR); +module_param(g_i2c_algo_bit_error, int, S_IRUGO | S_IWUSR); + +#define I2C_ALGO_BIT_DEBUG(fmt, args...) do { \ + if (g_i2c_algo_bit_debug) { \ + printk(KERN_INFO "[I2C_ALGO_BIT][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define I2C_ALGO_BIT_ERROR(fmt, args...) do { \ + if (g_i2c_algo_bit_error) { \ + printk(KERN_ERR "[I2C_ALGO_BIT][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/* ----- global defines ----------------------------------------------- */ + +#ifdef DEBUG +#define bit_dbg(level, dev, format, args...) \ + do { \ + if (i2c_debug >= level) \ + dev_dbg(dev, format, ##args); \ + } while (0) +#else +#define bit_dbg(level, dev, format, args...) \ + do {} while (0) +#endif /* DEBUG */ + +/* ----- global variables --------------------------------------------- */ + +static int bit_test; /* see if the line-setting functions work */ +module_param(bit_test, int, S_IRUGO); +MODULE_PARM_DESC(bit_test, "lines testing - 0 off; 1 report; 2 fail if stuck"); + +#ifdef DEBUG +static int i2c_debug = 1; +module_param(i2c_debug, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(i2c_debug, + "debug level - 0 off; 1 normal; 2 verbose; 3 very verbose"); +#endif + +/* --- setting states on the bus with the right timing: --------------- */ + +#define setsda(adap, val) adap->setsda(adap->data, val) +#define setscl(adap, val) adap->setscl(adap->data, val) +#define getsda(adap) adap->getsda(adap->data) +#define getscl(adap) adap->getscl(adap->data) + +static inline void sdalo(struct i2c_algo_bit_data *adap) +{ + setsda(adap, 0); + udelay((adap->udelay + 1) / 2); +} + +static inline void sdahi(struct i2c_algo_bit_data *adap) +{ + setsda(adap, 1); + udelay((adap->udelay + 1) / 2); +} + +static inline void scllo(struct i2c_algo_bit_data *adap) +{ + setscl(adap, 0); + udelay(adap->udelay / 2); +} + +/* + * Raise scl line, and do checking for delays. This is necessary for slower + * devices. + */ +static int sclhi(struct i2c_algo_bit_data *adap) +{ + unsigned long start; + + setscl(adap, 1); + + /* Not all adapters have scl sense line... */ + if (!adap->getscl) + goto done; + + start = jiffies; + while (!getscl(adap)) { + /* This hw knows how to read the clock line, so we wait + * until it actually gets high. This is safer as some + * chips may hold it low ("clock stretching") while they + * are processing data internally. + */ + if (time_after(jiffies, start + adap->timeout)) { + /* Test one last time, as we may have been preempted + * between last check and timeout test. + */ + if (getscl(adap)) + break; + return -ETIMEDOUT; + } + cpu_relax(); + } +#ifdef DEBUG + if (jiffies != start && i2c_debug >= 3) + pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go " + "high\n", jiffies - start); +#endif + +done: + udelay(adap->udelay); + return 0; +} + +/* --- other auxiliary functions -------------------------------------- */ +static void i2c_start(struct i2c_algo_bit_data *adap) +{ + /* assert: scl, sda are high */ + setsda(adap, 0); + udelay(adap->udelay); + scllo(adap); +} + +static void i2c_repstart(struct i2c_algo_bit_data *adap) +{ + /* assert: scl is low */ + sdahi(adap); + sclhi(adap); + setsda(adap, 0); + udelay(adap->udelay); + scllo(adap); +} + +static void i2c_stop(struct i2c_algo_bit_data *adap) +{ + /* assert: scl is low */ + sdalo(adap); + sclhi(adap); + setsda(adap, 1); + udelay(adap->udelay); +} + +/* send a byte without start cond., look for arbitration, + check ackn. from slave */ +/* returns: + * 1 if the device acknowledged + * 0 if the device did not ack + * -ETIMEDOUT if an error occurred (while raising the scl line) + */ +static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) +{ + int i; + int sb; + int ack; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + /* assert: scl is low */ + for (i = 7; i >= 0; i--) { + sb = (c >> i) & 1; + setsda(adap, sb); + udelay((adap->udelay + 1) / 2); + if (sclhi(adap) < 0) { /* timed out */ + bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " + "timeout at bit #%d\n", (int)c, i); + return -ETIMEDOUT; + } + /* FIXME do arbitration here: + * if (sb && !getsda(adap)) -> ouch! Get out of here. + * + * Report a unique code, so higher level code can retry + * the whole (combined) message and *NOT* issue STOP. + */ + scllo(adap); + } + sdahi(adap); + if (sclhi(adap) < 0) { /* timeout */ + bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " + "timeout at ack\n", (int)c); + return -ETIMEDOUT; + } + + /* read ack: SDA should be pulled down by slave, or it may + * NAK (usually to report problems with the data we wrote). + */ + ack = !getsda(adap); /* ack: sda is pulled low -> success */ + bit_dbg(2, &i2c_adap->dev, "i2c_outb: 0x%02x %s\n", (int)c, + ack ? "A" : "NA"); + + scllo(adap); + return ack; + /* assert: scl is low (sda undef) */ +} + +static int i2c_inb(struct i2c_adapter *i2c_adap) +{ + /* read byte via i2c port, without start/stop sequence */ + /* acknowledge is sent in i2c_read. */ + int i; + unsigned char indata = 0; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + /* assert: scl is low */ + sdahi(adap); + for (i = 0; i < 8; i++) { + if (sclhi(adap) < 0) { /* timeout */ + bit_dbg(1, &i2c_adap->dev, "i2c_inb: timeout at bit " + "#%d\n", 7 - i); + return -ETIMEDOUT; + } + indata *= 2; + if (getsda(adap)) + indata |= 0x01; + setscl(adap, 0); + udelay(i == 7 ? adap->udelay / 2 : adap->udelay); + } + /* assert: scl is low */ + return indata; +} + +/* + * Sanity check for the adapter hardware - check the reaction of + * the bus lines only if it seems to be idle. + */ +static int test_bus(struct i2c_adapter *i2c_adap) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + const char *name = i2c_adap->name; + int scl, sda, ret; + + if (adap->pre_xfer) { + ret = adap->pre_xfer(i2c_adap); + if (ret < 0) + return -ENODEV; + } + + if (adap->getscl == NULL) + pr_info("%s: Testing SDA only, SCL is not readable\n", name); + + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (!scl || !sda) { + printk(KERN_WARNING + "%s: bus seems to be busy (scl=%d, sda=%d)\n", + name, scl, sda); + goto bailout; + } + + sdalo(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (sda) { + printk(KERN_WARNING "%s: SDA stuck high!\n", name); + goto bailout; + } + if (!scl) { + printk(KERN_WARNING "%s: SCL unexpected low " + "while pulling SDA low!\n", name); + goto bailout; + } + + sdahi(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (!sda) { + printk(KERN_WARNING "%s: SDA stuck low!\n", name); + goto bailout; + } + if (!scl) { + printk(KERN_WARNING "%s: SCL unexpected low " + "while pulling SDA high!\n", name); + goto bailout; + } + + scllo(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 0 : getscl(adap); + if (scl) { + printk(KERN_WARNING "%s: SCL stuck high!\n", name); + goto bailout; + } + if (!sda) { + printk(KERN_WARNING "%s: SDA unexpected low " + "while pulling SCL low!\n", name); + goto bailout; + } + + sclhi(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (!scl) { + printk(KERN_WARNING "%s: SCL stuck low!\n", name); + goto bailout; + } + if (!sda) { + printk(KERN_WARNING "%s: SDA unexpected low " + "while pulling SCL high!\n", name); + goto bailout; + } + + if (adap->post_xfer) + adap->post_xfer(i2c_adap); + + pr_info("%s: Test OK\n", name); + return 0; +bailout: + sdahi(adap); + sclhi(adap); + + if (adap->post_xfer) + adap->post_xfer(i2c_adap); + + return -ENODEV; +} + +/* ----- Utility functions + */ + +/* try_address tries to contact a chip for a number of + * times before it gives up. + * return values: + * 1 chip answered + * 0 chip did not answer + * -x transmission error + */ +static int try_address(struct i2c_adapter *i2c_adap, + unsigned char addr, int retries) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + int i, ret = 0; + + for (i = 0; i <= retries; i++) { + ret = i2c_outb(i2c_adap, addr); + if (ret == 1 || i == retries) + break; + bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); + i2c_stop(adap); + udelay(adap->udelay); + yield(); + bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); + i2c_start(adap); + } + if (i && ret) + bit_dbg(1, &i2c_adap->dev, "Used %d tries to %s client at " + "0x%02x: %s\n", i + 1, + addr & 1 ? "read from" : "write to", addr >> 1, + ret == 1 ? "success" : "failed, timeout?"); + return ret; +} + +static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) +{ + const unsigned char *temp = msg->buf; + int count = msg->len; + unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; + int retval; + int wrcount = 0; + + while (count > 0) { + retval = i2c_outb(i2c_adap, *temp); + + /* OK/ACK; or ignored NAK */ + if ((retval > 0) || (nak_ok && (retval == 0))) { + count--; + temp++; + wrcount++; + + /* A slave NAKing the master means the slave didn't like + * something about the data it saw. For example, maybe + * the SMBus PEC was wrong. + */ + } else if (retval == 0) { + dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n"); + return -EIO; + + /* Timeout; or (someday) lost arbitration + * + * FIXME Lost ARB implies retrying the transaction from + * the first message, after the "winning" master issues + * its STOP. As a rule, upper layer code has no reason + * to know or care about this ... it is *NOT* an error. + */ + } else { + dev_err(&i2c_adap->dev, "sendbytes: error %d\n", + retval); + return retval; + } + } + return wrcount; +} + +static int acknak(struct i2c_adapter *i2c_adap, int is_ack) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + /* assert: sda is high */ + if (is_ack) /* send ack */ + setsda(adap, 0); + udelay((adap->udelay + 1) / 2); + if (sclhi(adap) < 0) { /* timeout */ + dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n"); + return -ETIMEDOUT; + } + scllo(adap); + return 0; +} + +static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) +{ + int inval; + int rdcount = 0; /* counts bytes read */ + unsigned char *temp = msg->buf; + int count = msg->len; + const unsigned flags = msg->flags; + + while (count > 0) { + inval = i2c_inb(i2c_adap); + if (inval >= 0) { + *temp = inval; + rdcount++; + } else { /* read timed out */ + break; + } + + temp++; + count--; + + /* Some SMBus transactions require that we receive the + transaction length as the first read byte. */ + if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) { + if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) { + if (!(flags & I2C_M_NO_RD_ACK)) + acknak(i2c_adap, 0); + dev_err(&i2c_adap->dev, "readbytes: invalid " + "block length (%d)\n", inval); + return -EPROTO; + } + /* The original count value accounts for the extra + bytes, that is, either 1 for a regular transaction, + or 2 for a PEC transaction. */ + count += inval; + msg->len += inval; + } + + bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n", + inval, + (flags & I2C_M_NO_RD_ACK) + ? "(no ack/nak)" + : (count ? "A" : "NA")); + + if (!(flags & I2C_M_NO_RD_ACK)) { + inval = acknak(i2c_adap, count); + if (inval < 0) + return inval; + } + } + return rdcount; +} + +/* doAddress initiates the transfer by generating the start condition (in + * try_address) and transmits the address in the necessary format to handle + * reads, writes as well as 10bit-addresses. + * returns: + * 0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set + * -x an error occurred (like: -ENXIO if the device did not answer, or + * -ETIMEDOUT, for example if the lines are stuck...) + */ +static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) +{ + unsigned short flags = msg->flags; + unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + unsigned char addr; + int ret, retries; + + retries = nak_ok ? 0 : i2c_adap->retries; + + if (flags & I2C_M_TEN) { + /* a ten bit address */ + addr = 0xf0 | ((msg->addr >> 7) & 0x06); + bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr); + /* try extended address code...*/ + ret = try_address(i2c_adap, addr, retries); + if ((ret != 1) && !nak_ok) { + dev_err(&i2c_adap->dev, + "died at extended address code\n"); + return -ENXIO; + } + /* the remaining 8 bit address */ + ret = i2c_outb(i2c_adap, msg->addr & 0xff); + if ((ret != 1) && !nak_ok) { + /* the chip did not ack / xmission error occurred */ + dev_err(&i2c_adap->dev, "died at 2nd address code\n"); + return -ENXIO; + } + if (flags & I2C_M_RD) { + bit_dbg(3, &i2c_adap->dev, "emitting repeated " + "start condition\n"); + i2c_repstart(adap); + /* okay, now switch into reading mode */ + addr |= 0x01; + ret = try_address(i2c_adap, addr, retries); + if ((ret != 1) && !nak_ok) { + dev_err(&i2c_adap->dev, + "died at repeated address code\n"); + return -EIO; + } + } + } else { /* normal 7bit address */ + addr = msg->addr << 1; + if (flags & I2C_M_RD) + addr |= 1; + if (flags & I2C_M_REV_DIR_ADDR) + addr ^= 1; + ret = try_address(i2c_adap, addr, retries); + if ((ret != 1) && !nak_ok) + return -ENXIO; + } + + return 0; +} + +static void bit_i2c_unblock(struct i2c_adapter *i2c_adap) +{ + int i; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + for (i = 0; i < 9; i++) { + setscl(adap, 0); + udelay(5); + setscl(adap, 1); + udelay(5); + } + setscl(adap, 0); + setsda(adap, 0); + udelay(5); + setscl(adap, 1); + udelay(5); + setsda(adap, 1); +} + +static int check_bit_i2c_unblock(struct i2c_adapter *i2c_adap) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + int sda, scl; + + sda = getsda(adap); + scl = getscl(adap); + if ((sda == 0) && scl) { + I2C_ALGO_BIT_ERROR("SCL is high and SDA is low, send 9 clock to device.\n"); + bit_i2c_unblock(i2c_adap); + } + + sda = getsda(adap); + scl = getscl(adap); + if (sda && scl) { + I2C_ALGO_BIT_DEBUG("SCL and SDA are both high, i2c level check ok.\n"); + return 0; + } + dev_warn(&i2c_adap->dev, "Check i2c level failed, SCL %s, SDA %s.\n", scl ? "high" : "low", sda ? "high" : "low"); + return -EIO; +} + +static int bit_xfer(struct i2c_adapter *i2c_adap, + struct i2c_msg msgs[], int num) +{ + struct i2c_msg *pmsg; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + int i, ret; + unsigned short nak_ok; + + if (adap->pre_xfer) { + ret = adap->pre_xfer(i2c_adap); + if (ret < 0) + return ret; + } + + if (check_bit_i2c_unblock(i2c_adap) < 0) { + I2C_ALGO_BIT_ERROR("check i2c is block.\n"); + return -EIO; + } + + bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); + i2c_start(adap); + for (i = 0; i < num; i++) { + pmsg = &msgs[i]; + nak_ok = pmsg->flags & I2C_M_IGNORE_NAK; + if (!(pmsg->flags & I2C_M_NOSTART)) { + if (i) { + bit_dbg(3, &i2c_adap->dev, "emitting " + "repeated start condition\n"); + i2c_repstart(adap); + } + ret = bit_doAddress(i2c_adap, pmsg); + if ((ret != 0) && !nak_ok) { + bit_dbg(1, &i2c_adap->dev, "NAK from " + "device addr 0x%02x msg #%d\n", + msgs[i].addr, i); + goto bailout; + } + } + if (pmsg->flags & I2C_M_RD) { + /* read bytes into buffer*/ + ret = readbytes(i2c_adap, pmsg); + if (ret >= 1) + bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n", + ret, ret == 1 ? "" : "s"); + if (ret < pmsg->len) { + if (ret >= 0) + ret = -EIO; + goto bailout; + } + } else { + /* write bytes from buffer */ + ret = sendbytes(i2c_adap, pmsg); + if (ret >= 1) + bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n", + ret, ret == 1 ? "" : "s"); + if (ret < pmsg->len) { + if (ret >= 0) + ret = -EIO; + goto bailout; + } + } + } + ret = i; + +bailout: + bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); + i2c_stop(adap); + + if (adap->post_xfer) + adap->post_xfer(i2c_adap); + return ret; +} + +static u32 bit_func(struct i2c_adapter *adap) +{ + return I2C_FUNC_I2C | I2C_FUNC_NOSTART | I2C_FUNC_SMBUS_EMUL | + I2C_FUNC_SMBUS_READ_BLOCK_DATA | + I2C_FUNC_SMBUS_BLOCK_PROC_CALL | + I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING; +} + +/* -----exported algorithm data: ------------------------------------- */ + +const struct i2c_algorithm wb_i2c_bit_algo = { + .master_xfer = bit_xfer, + .functionality = bit_func, +}; +EXPORT_SYMBOL(wb_i2c_bit_algo); + +static const struct i2c_adapter_quirks i2c_bit_quirk_no_clk_stretch = { + .flags = I2C_AQ_NO_CLK_STRETCH, +}; + +/* + * registering functions to load algorithms at runtime + */ +static int __i2c_bit_add_bus(struct i2c_adapter *adap, + int (*add_adapter)(struct i2c_adapter *)) +{ + struct i2c_algo_bit_data *bit_adap = adap->algo_data; + int ret; + + if (bit_test) { + ret = test_bus(adap); + if (bit_test >= 2 && ret < 0) + return -ENODEV; + } + + /* register new adapter to i2c module... */ + adap->algo = &wb_i2c_bit_algo; + adap->retries = 3; + if (bit_adap->getscl == NULL) + adap->quirks = &i2c_bit_quirk_no_clk_stretch; + + ret = add_adapter(adap); + if (ret < 0) + return ret; + + /* Complain if SCL can't be read */ + if (bit_adap->getscl == NULL) { + dev_warn(&adap->dev, "Not I2C compliant: can't read SCL\n"); + dev_warn(&adap->dev, "Bus may be unreliable\n"); + } + return 0; +} + +int wb_i2c_bit_add_bus(struct i2c_adapter *adap) +{ + return __i2c_bit_add_bus(adap, i2c_add_adapter); +} +EXPORT_SYMBOL(wb_i2c_bit_add_bus); + +int wb_i2c_bit_add_numbered_bus(struct i2c_adapter *adap) +{ + return __i2c_bit_add_bus(adap, i2c_add_numbered_adapter); +} +EXPORT_SYMBOL(wb_i2c_bit_add_numbered_bus); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c new file mode 100644 index 000000000000..0362e905fddb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c @@ -0,0 +1,431 @@ +/* + * Bitbanging I2C bus driver using the GPIO API + * + * Copyright (C) 2007 Atmel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern int wb_i2c_bit_add_numbered_bus(struct i2c_adapter *adap); + +struct i2c_gpio_private_data { + struct gpio_desc *sda; + struct gpio_desc *scl; + struct i2c_adapter adap; + struct i2c_algo_bit_data bit_data; + struct i2c_gpio_platform_data pdata; +#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR + struct dentry *debug_dir; +#endif +}; + +/* + * Toggle SDA by changing the output value of the pin. This is only + * valid for pins configured as open drain (i.e. setting the value + * high effectively turns off the output driver.) + */ +static void i2c_gpio_setsda_val(void *data, int state) +{ + struct i2c_gpio_private_data *priv = data; + + gpiod_set_value_cansleep(priv->sda, state); +} + +/* + * Toggle SCL by changing the output value of the pin. This is used + * for pins that are configured as open drain and for output-only + * pins. The latter case will break the i2c protocol, but it will + * often work in practice. + */ +static void i2c_gpio_setscl_val(void *data, int state) +{ + struct i2c_gpio_private_data *priv = data; + + gpiod_set_value_cansleep(priv->scl, state); +} + +static int i2c_gpio_getsda(void *data) +{ + struct i2c_gpio_private_data *priv = data; + + return gpiod_get_value_cansleep(priv->sda); +} + +static int i2c_gpio_getscl(void *data) +{ + struct i2c_gpio_private_data *priv = data; + + return gpiod_get_value_cansleep(priv->scl); +} + +#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR +static struct dentry *i2c_gpio_debug_dir; + +#define setsda(bd, val) ((bd)->setsda((bd)->data, val)) +#define setscl(bd, val) ((bd)->setscl((bd)->data, val)) +#define getsda(bd) ((bd)->getsda((bd)->data)) +#define getscl(bd) ((bd)->getscl((bd)->data)) + +#define WIRE_ATTRIBUTE(wire) \ +static int fops_##wire##_get(void *data, u64 *val) \ +{ \ + struct i2c_gpio_private_data *priv = data; \ + \ + i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + *val = get##wire(&priv->bit_data); \ + i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + return 0; \ +} \ +static int fops_##wire##_set(void *data, u64 val) \ +{ \ + struct i2c_gpio_private_data *priv = data; \ + \ + i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + set##wire(&priv->bit_data, val); \ + i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + return 0; \ +} \ +DEFINE_DEBUGFS_ATTRIBUTE(fops_##wire, fops_##wire##_get, fops_##wire##_set, "%llu\n") + +WIRE_ATTRIBUTE(scl); +WIRE_ATTRIBUTE(sda); + +static void i2c_gpio_incomplete_transfer(struct i2c_gpio_private_data *priv, + u32 pattern, u8 pattern_size) +{ + struct i2c_algo_bit_data *bit_data = &priv->bit_data; + int i; + + i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); + + /* START condition */ + setsda(bit_data, 0); + udelay(bit_data->udelay); + + /* Send pattern, request ACK, don't send STOP */ + for (i = pattern_size - 1; i >= 0; i--) { + setscl(bit_data, 0); + udelay(bit_data->udelay / 2); + setsda(bit_data, (pattern >> i) & 1); + udelay((bit_data->udelay + 1) / 2); + setscl(bit_data, 1); + udelay(bit_data->udelay); + } + + i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); +} + +static int fops_incomplete_addr_phase_set(void *data, u64 addr) +{ + struct i2c_gpio_private_data *priv = data; + u32 pattern; + + if (addr > 0x7f) + return -EINVAL; + + /* ADDR (7 bit) + RD (1 bit) + Client ACK, keep SDA hi (1 bit) */ + pattern = (addr << 2) | 3; + + i2c_gpio_incomplete_transfer(priv, pattern, 9); + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_addr_phase, NULL, fops_incomplete_addr_phase_set, "%llu\n"); + +static int fops_incomplete_write_byte_set(void *data, u64 addr) +{ + struct i2c_gpio_private_data *priv = data; + u32 pattern; + + if (addr > 0x7f) + return -EINVAL; + + /* ADDR (7 bit) + WR (1 bit) + Client ACK (1 bit) */ + pattern = (addr << 2) | 1; + /* 0x00 (8 bit) + Client ACK, keep SDA hi (1 bit) */ + pattern = (pattern << 9) | 1; + + i2c_gpio_incomplete_transfer(priv, pattern, 18); + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_write_byte, NULL, fops_incomplete_write_byte_set, "%llu\n"); + +static void i2c_gpio_fault_injector_init(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); + + /* + * If there will be a debugfs-dir per i2c adapter somewhen, put the + * 'fault-injector' dir there. Until then, we have a global dir with + * all adapters as subdirs. + */ + if (!i2c_gpio_debug_dir) { + i2c_gpio_debug_dir = debugfs_create_dir("i2c-fault-injector", NULL); + if (!i2c_gpio_debug_dir) + return; + } + + priv->debug_dir = debugfs_create_dir(pdev->name, i2c_gpio_debug_dir); + if (!priv->debug_dir) + return; + + debugfs_create_file_unsafe("scl", 0600, priv->debug_dir, priv, &fops_scl); + debugfs_create_file_unsafe("sda", 0600, priv->debug_dir, priv, &fops_sda); + debugfs_create_file_unsafe("incomplete_address_phase", 0200, priv->debug_dir, + priv, &fops_incomplete_addr_phase); + debugfs_create_file_unsafe("incomplete_write_byte", 0200, priv->debug_dir, + priv, &fops_incomplete_write_byte); +} + +static void i2c_gpio_fault_injector_exit(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); + + debugfs_remove_recursive(priv->debug_dir); +} +#else +static inline void i2c_gpio_fault_injector_init(struct platform_device *pdev) {} +static inline void i2c_gpio_fault_injector_exit(struct platform_device *pdev) {} +#endif /* CONFIG_I2C_GPIO_FAULT_INJECTOR*/ + +static void of_i2c_gpio_get_props(struct device_node *np, + struct i2c_gpio_platform_data *pdata) +{ + u32 reg; + + of_property_read_u32(np, "i2c-gpio,delay-us", &pdata->udelay); + + if (!of_property_read_u32(np, "i2c-gpio,timeout-ms", ®)) + pdata->timeout = msecs_to_jiffies(reg); + + pdata->sda_is_open_drain = + of_property_read_bool(np, "i2c-gpio,sda-open-drain"); + pdata->scl_is_open_drain = + of_property_read_bool(np, "i2c-gpio,scl-open-drain"); + pdata->scl_is_output_only = + of_property_read_bool(np, "i2c-gpio,scl-output-only"); +} + +static struct gpio_desc *i2c_gpio_get_desc(struct device *dev, + const char *con_id, + unsigned int index, + enum gpiod_flags gflags) +{ + struct gpio_desc *retdesc; + int ret; + + retdesc = devm_gpiod_get(dev, con_id, gflags); + if (!IS_ERR(retdesc)) { + dev_dbg(dev, "got GPIO from name %s\n", con_id); + return retdesc; + } + + retdesc = devm_gpiod_get_index(dev, NULL, index, gflags); + if (!IS_ERR(retdesc)) { + dev_dbg(dev, "got GPIO from index %u\n", index); + return retdesc; + } + + ret = PTR_ERR(retdesc); + + /* FIXME: hack in the old code, is this really necessary? */ + if (ret == -EINVAL) + retdesc = ERR_PTR(-EPROBE_DEFER); + + /* This happens if the GPIO driver is not yet probed, let's defer */ + if (ret == -ENOENT) + retdesc = ERR_PTR(-EPROBE_DEFER); + + if (PTR_ERR(retdesc) != -EPROBE_DEFER) + dev_err(dev, "error trying to get descriptor: %d\n", ret); + + return retdesc; +} + +static int i2c_gpio_probe(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv; + struct i2c_gpio_platform_data *pdata; + struct i2c_algo_bit_data *bit_data; + struct i2c_adapter *adap; + struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node; + enum gpiod_flags gflags; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + adap = &priv->adap; + bit_data = &priv->bit_data; + pdata = &priv->pdata; + + if (np) { + of_i2c_gpio_get_props(np, pdata); + } else { + /* + * If all platform data settings are zero it is OK + * to not provide any platform data from the board. + */ + if (dev_get_platdata(dev)) + memcpy(pdata, dev_get_platdata(dev), sizeof(*pdata)); + } + + /* + * First get the GPIO pins; if it fails, we'll defer the probe. + * If the SDA line is marked from platform data or device tree as + * "open drain" it means something outside of our control is making + * this line being handled as open drain, and we should just handle + * it as any other output. Else we enforce open drain as this is + * required for an I2C bus. + */ + if (pdata->sda_is_open_drain) + gflags = GPIOD_OUT_HIGH; + else + gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; + priv->sda = i2c_gpio_get_desc(dev, "sda", 0, gflags); + if (IS_ERR(priv->sda)) + return PTR_ERR(priv->sda); + + /* + * If the SCL line is marked from platform data or device tree as + * "open drain" it means something outside of our control is making + * this line being handled as open drain, and we should just handle + * it as any other output. Else we enforce open drain as this is + * required for an I2C bus. + */ + if (pdata->scl_is_open_drain) + gflags = GPIOD_OUT_HIGH; + else + gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; + priv->scl = i2c_gpio_get_desc(dev, "scl", 1, gflags); + if (IS_ERR(priv->scl)) + return PTR_ERR(priv->scl); + + if (gpiod_cansleep(priv->sda) || gpiod_cansleep(priv->scl)) + dev_warn(dev, "Slow GPIO pins might wreak havoc into I2C/SMBus bus timing"); + + bit_data->setsda = i2c_gpio_setsda_val; + bit_data->setscl = i2c_gpio_setscl_val; + + if (!pdata->scl_is_output_only) + bit_data->getscl = i2c_gpio_getscl; + bit_data->getsda = i2c_gpio_getsda; + + if (pdata->udelay) + bit_data->udelay = pdata->udelay; + else if (pdata->scl_is_output_only) + bit_data->udelay = 50; /* 10 kHz */ + else + bit_data->udelay = 5; /* 100 kHz */ + + if (pdata->timeout) + bit_data->timeout = pdata->timeout; + else + bit_data->timeout = HZ / 10; /* 100 ms */ + + bit_data->data = priv; + + adap->owner = THIS_MODULE; + if (np) + strlcpy(adap->name, dev_name(dev), sizeof(adap->name)); + else + snprintf(adap->name, sizeof(adap->name), "i2c-gpio%d", pdev->id); + + adap->algo_data = bit_data; + adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; + adap->dev.parent = dev; + adap->dev.of_node = np; + + adap->nr = pdev->id; + ret = wb_i2c_bit_add_numbered_bus(adap); + if (ret) + return ret; + + platform_set_drvdata(pdev, priv); + + /* + * FIXME: using global GPIO numbers is not helpful. If/when we + * get accessors to get the actual name of the GPIO line, + * from the descriptor, then provide that instead. + */ + dev_info(dev, "using lines %u (SDA) and %u (SCL%s)\n", + desc_to_gpio(priv->sda), desc_to_gpio(priv->scl), + pdata->scl_is_output_only + ? ", no clock stretching" : ""); + + i2c_gpio_fault_injector_init(pdev); + + return 0; +} + +static int i2c_gpio_remove(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv; + struct i2c_adapter *adap; + + i2c_gpio_fault_injector_exit(pdev); + + priv = platform_get_drvdata(pdev); + adap = &priv->adap; + + i2c_del_adapter(adap); + + return 0; +} + +#if defined(CONFIG_OF) +static const struct of_device_id i2c_gpio_dt_ids[] = { + { .compatible = "wb-i2c-gpio", }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids); +#endif + +static struct platform_driver i2c_gpio_driver = { + .driver = { + .name = "wb-i2c-gpio", + .of_match_table = of_match_ptr(i2c_gpio_dt_ids), + }, + .probe = i2c_gpio_probe, + .remove = i2c_gpio_remove, +}; + +static int __init i2c_gpio_init(void) +{ + int ret; + + ret = platform_driver_register(&i2c_gpio_driver); + if (ret) + printk(KERN_ERR "i2c-gpio: probe failed: %d\n", ret); + + return ret; +} +subsys_initcall(i2c_gpio_init); + +static void __exit i2c_gpio_exit(void) +{ + platform_driver_unregister(&i2c_gpio_driver); +} +module_exit(i2c_gpio_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Platform-independent bitbanging I2C driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:i2c-gpio"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c new file mode 100644 index 000000000000..5cf949d70ef8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int gpio_sda = 17; +module_param(gpio_sda, int, S_IRUGO | S_IWUSR); + +static int gpio_scl = 1; +module_param(gpio_scl, int, S_IRUGO | S_IWUSR); + +static int gpio_udelay = 2; +module_param(gpio_udelay, int, S_IRUGO | S_IWUSR); + +static int g_wb_i2c_gpio_device_debug = 0; +static int g_wb_i2c_gpio_device_error = 0; + +module_param(g_wb_i2c_gpio_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_gpio_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_GPIO_DEVICE_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_gpio_device_debug) { \ + printk(KERN_INFO "[WB_I2C_GPIO_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_GPIO_DEVICE_ERROR(fmt, args...) do { \ + if (g_wb_i2c_gpio_device_error) { \ + printk(KERN_ERR "[WB_I2C_GPIO_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/****************** i2c adapter with gpio ***********************/ +static struct i2c_gpio_platform_data i2c_pdata = { + .udelay = 2, + .scl_is_output_only = 0, + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, +}; + +static void i2c_gpio_release(struct device *dev) +{ + return; +} + +static struct platform_device wb_i2c_gpio_device = { + .name = "wb-i2c-gpio", + .id = -1, + .num_resources = 0, + .resource = NULL, + .dev = { + .platform_data = &i2c_pdata, + .release = i2c_gpio_release, + }, +}; + +/* + * i2c + */ +static struct gpiod_lookup_table wb_i2c_gpio_table = { + .dev_id = "wb-i2c-gpio", + .table = { + GPIO_LOOKUP_IDX("wb_gpio_d1500", 17, NULL, 0, + GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), + GPIO_LOOKUP_IDX("wb_gpio_d1500", 1, NULL, 1, + GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), + }, +}; + +static int __init wb_i2c_gpio_device_init(void) +{ + int err; + + WB_I2C_GPIO_DEVICE_VERBOSE("wb_i2c_gpio_device_init enter!\n"); + wb_i2c_gpio_table.table[0].chip_hwnum = gpio_sda; + wb_i2c_gpio_table.table[1].chip_hwnum = gpio_scl; + i2c_pdata.udelay = gpio_udelay; + gpiod_add_lookup_table(&wb_i2c_gpio_table); + + err = platform_device_register(&wb_i2c_gpio_device); + if (err < 0) { + printk(KERN_ERR "register i2c gpio device fail(%d). \n", err); + gpiod_remove_lookup_table(&wb_i2c_gpio_table); + return -1; + } + return 0; +} + +static void __exit wb_i2c_gpio_device_exit(void) +{ + WB_I2C_GPIO_DEVICE_VERBOSE("wb_i2c_gpio_device_exit enter!\n"); + platform_device_unregister(&wb_i2c_gpio_device); + gpiod_remove_lookup_table(&wb_i2c_gpio_table); +} + +module_init(wb_i2c_gpio_device_init); +module_exit(wb_i2c_gpio_device_exit); +MODULE_DESCRIPTION("I2C GPIO Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c new file mode 100644 index 000000000000..a733c115487e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c @@ -0,0 +1,2114 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + Copyright (c) 1998 - 2002 Frodo Looijaard , + Philip Edelbrock , and Mark D. Studebaker + + Copyright (C) 2007 - 2014 Jean Delvare + Copyright (C) 2010 Intel Corporation, + David Woodhouse + +*/ + +/* + * Supports the following Intel I/O Controller Hubs (ICH): + * + * I/O Block I2C + * region SMBus Block proc. block + * Chip name PCI ID size PEC buffer call read + * --------------------------------------------------------------------------- + * 82801AA (ICH) 0x2413 16 no no no no + * 82801AB (ICH0) 0x2423 16 no no no no + * 82801BA (ICH2) 0x2443 16 no no no no + * 82801CA (ICH3) 0x2483 32 soft no no no + * 82801DB (ICH4) 0x24c3 32 hard yes no no + * 82801E (ICH5) 0x24d3 32 hard yes yes yes + * 6300ESB 0x25a4 32 hard yes yes yes + * 82801F (ICH6) 0x266a 32 hard yes yes yes + * 6310ESB/6320ESB 0x269b 32 hard yes yes yes + * 82801G (ICH7) 0x27da 32 hard yes yes yes + * 82801H (ICH8) 0x283e 32 hard yes yes yes + * 82801I (ICH9) 0x2930 32 hard yes yes yes + * EP80579 (Tolapai) 0x5032 32 hard yes yes yes + * ICH10 0x3a30 32 hard yes yes yes + * ICH10 0x3a60 32 hard yes yes yes + * 5/3400 Series (PCH) 0x3b30 32 hard yes yes yes + * 6 Series (PCH) 0x1c22 32 hard yes yes yes + * Patsburg (PCH) 0x1d22 32 hard yes yes yes + * Patsburg (PCH) IDF 0x1d70 32 hard yes yes yes + * Patsburg (PCH) IDF 0x1d71 32 hard yes yes yes + * Patsburg (PCH) IDF 0x1d72 32 hard yes yes yes + * DH89xxCC (PCH) 0x2330 32 hard yes yes yes + * Panther Point (PCH) 0x1e22 32 hard yes yes yes + * Lynx Point (PCH) 0x8c22 32 hard yes yes yes + * Lynx Point-LP (PCH) 0x9c22 32 hard yes yes yes + * Avoton (SOC) 0x1f3c 32 hard yes yes yes + * Wellsburg (PCH) 0x8d22 32 hard yes yes yes + * Wellsburg (PCH) MS 0x8d7d 32 hard yes yes yes + * Wellsburg (PCH) MS 0x8d7e 32 hard yes yes yes + * Wellsburg (PCH) MS 0x8d7f 32 hard yes yes yes + * Coleto Creek (PCH) 0x23b0 32 hard yes yes yes + * Wildcat Point (PCH) 0x8ca2 32 hard yes yes yes + * Wildcat Point-LP (PCH) 0x9ca2 32 hard yes yes yes + * BayTrail (SOC) 0x0f12 32 hard yes yes yes + * Braswell (SOC) 0x2292 32 hard yes yes yes + * Sunrise Point-H (PCH) 0xa123 32 hard yes yes yes + * Sunrise Point-LP (PCH) 0x9d23 32 hard yes yes yes + * DNV (SOC) 0x19df 32 hard yes yes yes + * Emmitsburg (PCH) 0x1bc9 32 hard yes yes yes + * Broxton (SOC) 0x5ad4 32 hard yes yes yes + * Lewisburg (PCH) 0xa1a3 32 hard yes yes yes + * Lewisburg Supersku (PCH) 0xa223 32 hard yes yes yes + * Kaby Lake PCH-H (PCH) 0xa2a3 32 hard yes yes yes + * Gemini Lake (SOC) 0x31d4 32 hard yes yes yes + * Cannon Lake-H (PCH) 0xa323 32 hard yes yes yes + * Cannon Lake-LP (PCH) 0x9da3 32 hard yes yes yes + * Cedar Fork (PCH) 0x18df 32 hard yes yes yes + * Ice Lake-LP (PCH) 0x34a3 32 hard yes yes yes + * Comet Lake (PCH) 0x02a3 32 hard yes yes yes + * Comet Lake-H (PCH) 0x06a3 32 hard yes yes yes + * Elkhart Lake (PCH) 0x4b23 32 hard yes yes yes + * Tiger Lake-LP (PCH) 0xa0a3 32 hard yes yes yes + * Tiger Lake-H (PCH) 0x43a3 32 hard yes yes yes + * Jasper Lake (SOC) 0x4da3 32 hard yes yes yes + * Comet Lake-V (PCH) 0xa3a3 32 hard yes yes yes + * Alder Lake-S (PCH) 0x7aa3 32 hard yes yes yes + * + * Features supported by this driver: + * Software PEC no + * Hardware PEC yes + * Block buffer yes + * Block process call transaction yes + * I2C block read transaction yes (doesn't use the block buffer) + * Slave mode no + * SMBus Host Notify yes + * Interrupt processing yes + * + * See the file Documentation/i2c/busses/i2c-i801.rst for details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI +#include +#include +#endif + +#define mem_clear(data, size) memset((data), 0, (size)) + +/* I801 SMBus address offsets */ +#define SMBHSTSTS(p) (0 + (p)->smba) +#define SMBHSTCNT(p) (2 + (p)->smba) +#define SMBHSTCMD(p) (3 + (p)->smba) +#define SMBHSTADD(p) (4 + (p)->smba) +#define SMBHSTDAT0(p) (5 + (p)->smba) +#define SMBHSTDAT1(p) (6 + (p)->smba) +#define SMBBLKDAT(p) (7 + (p)->smba) +#define SMBPEC(p) (8 + (p)->smba) /* ICH3 and later */ +#define SMBAUXSTS(p) (12 + (p)->smba) /* ICH4 and later */ +#define SMBAUXCTL(p) (13 + (p)->smba) /* ICH4 and later */ +#define SMBSLVSTS(p) (16 + (p)->smba) /* ICH3 and later */ +#define SMBSLVCMD(p) (17 + (p)->smba) /* ICH3 and later */ +#define SMBNTFDADD(p) (20 + (p)->smba) /* ICH3 and later */ +#define SMBPINCTL(p) (15 + (p)->smba) /* SMBus Pin Control Register */ + +/* PCI Address Constants */ +#define SMBBAR 4 +#define SMBPCICTL 0x004 +#define SMBPCISTS 0x006 +#define SMBHSTCFG 0x040 +#define TCOBASE 0x050 +#define TCOCTL 0x054 + +#define SBREG_BAR 0x10 +#define SBREG_SMBCTRL 0xc6000c +#define SBREG_SMBCTRL_DNV 0xcf000c + +/* Host status bits for SMBPCISTS */ +#define SMBPCISTS_INTS BIT(3) + +/* Control bits for SMBPCICTL */ +#define SMBPCICTL_INTDIS BIT(10) + +/* Host configuration bits for SMBHSTCFG */ +#define SMBHSTCFG_HST_EN BIT(0) +#define SMBHSTCFG_SMB_SMI_EN BIT(1) +#define SMBHSTCFG_I2C_EN BIT(2) +#define SMBHSTCFG_SSRESET BIT(3) +#define SSRESET_SLEEP_TIME 1 /* 1us */ +#define SSRESET_RETRY_TIME (1000 / SSRESET_SLEEP_TIME) + +/* Pin status for SMBPINCTL */ +#define SMBPINCTL_CLK_STS 1 /* bit0 SMBCLK_CUR_STS*/ +#define SMBPINCTL_SDA_STS 2 /* bit1 SMBDATA_CUR_STS*/ +#define SMBPINCTL_CLK_CTL 4 /* bit2 SMBCLK_CTL */ + +#define SMBHSTCFG_SPD_WD BIT(4) + +/* TCO configuration bits for TCOCTL */ +#define TCOCTL_EN BIT(8) + +/* Auxiliary status register bits, ICH4+ only */ +#define SMBAUXSTS_CRCE BIT(0) +#define SMBAUXSTS_STCO BIT(1) + +/* Auxiliary control register bits, ICH4+ only */ +#define SMBAUXCTL_CRC BIT(0) +#define SMBAUXCTL_E32B BIT(1) + +/* Other settings */ +#define MAX_RETRIES 400 + +/* I801 command constants */ +#define I801_QUICK 0x00 +#define I801_BYTE 0x04 +#define I801_BYTE_DATA 0x08 +#define I801_WORD_DATA 0x0C +#define I801_PROC_CALL 0x10 /* unimplemented */ +#define I801_BLOCK_DATA 0x14 +#define I801_I2C_BLOCK_DATA 0x18 /* ICH5 and later */ +#define I801_BLOCK_PROC_CALL 0x1C + +/* I801 Host Control register bits */ +#define SMBHSTCNT_INTREN BIT(0) +#define SMBHSTCNT_KILL BIT(1) +#define SMBHSTCNT_LAST_BYTE BIT(5) +#define SMBHSTCNT_START BIT(6) +#define SMBHSTCNT_PEC_EN BIT(7) /* ICH3 and later */ + +/* I801 Hosts Status register bits */ +#define SMBHSTSTS_BYTE_DONE BIT(7) +#define SMBHSTSTS_INUSE_STS BIT(6) +#define SMBHSTSTS_SMBALERT_STS BIT(5) +#define SMBHSTSTS_FAILED BIT(4) +#define SMBHSTSTS_BUS_ERR BIT(3) +#define SMBHSTSTS_DEV_ERR BIT(2) +#define SMBHSTSTS_INTR BIT(1) +#define SMBHSTSTS_HOST_BUSY BIT(0) + +/* Host Notify Status register bits */ +#define SMBSLVSTS_HST_NTFY_STS BIT(0) + +/* Host Notify Command register bits */ +#define SMBSLVCMD_HST_NTFY_INTREN BIT(0) + +#define STATUS_ERROR_FLAGS (SMBHSTSTS_FAILED | SMBHSTSTS_BUS_ERR | \ + SMBHSTSTS_DEV_ERR) + +#define STATUS_FLAGS (SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR | \ + STATUS_ERROR_FLAGS) + +/* Older devices have their ID defined in */ +#define PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS 0x02a3 +#define PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS 0x06a3 +#define PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS 0x0f12 +#define PCI_DEVICE_ID_INTEL_CDF_SMBUS 0x18df +#define PCI_DEVICE_ID_INTEL_DNV_SMBUS 0x19df +#define PCI_DEVICE_ID_INTEL_EBG_SMBUS 0x1bc9 +#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 +/* Patsburg also has three 'Integrated Device Function' SMBus controllers */ +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70 +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 +#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22 +#define PCI_DEVICE_ID_INTEL_AVOTON_SMBUS 0x1f3c +#define PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS 0x2292 +#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 +#define PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS 0x23b0 +#define PCI_DEVICE_ID_INTEL_GEMINILAKE_SMBUS 0x31d4 +#define PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS 0x34a3 +#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 +#define PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS 0x43a3 +#define PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS 0x4b23 +#define PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS 0x4da3 +#define PCI_DEVICE_ID_INTEL_BROXTON_SMBUS 0x5ad4 +#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS 0x7aa3 +#define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS 0x8c22 +#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS 0x8ca2 +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS 0x8d22 +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0 0x8d7d +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1 0x8d7e +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2 0x8d7f +#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS 0x9c22 +#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS 0x9ca2 +#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS 0x9d23 +#define PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS 0x9da3 +#define PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS 0xa0a3 +#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS 0xa123 +#define PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS 0xa1a3 +#define PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS 0xa223 +#define PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS 0xa2a3 +#define PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS 0xa323 +#define PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS 0xa3a3 + +struct i801_mux_config { + char *gpio_chip; + unsigned values[3]; + int n_values; + unsigned classes[3]; + unsigned gpios[2]; /* Relative to gpio_chip->base */ + int n_gpios; +}; + +struct i801_priv { + struct i2c_adapter adapter; + unsigned long smba; + unsigned char original_hstcfg; + unsigned char original_slvcmd; + struct pci_dev *pci_dev; + unsigned int features; + + /* isr processing */ + wait_queue_head_t waitq; + u8 status; + + /* Command state used by isr for byte-by-byte block transactions */ + u8 cmd; + bool is_read; + int count; + int len; + u8 *data; + +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI + const struct i801_mux_config *mux_drvdata; + struct platform_device *mux_pdev; + struct gpiod_lookup_table *lookup; +#endif + struct platform_device *tco_pdev; + + /* + * If set to true the host controller registers are reserved for + * ACPI AML use. Protected by acpi_lock. + */ + bool acpi_reserved; + struct mutex acpi_lock; +}; + +#define FEATURE_SMBUS_PEC BIT(0) +#define FEATURE_BLOCK_BUFFER BIT(1) +#define FEATURE_BLOCK_PROC BIT(2) +#define FEATURE_I2C_BLOCK_READ BIT(3) +#define FEATURE_IRQ BIT(4) +#define FEATURE_HOST_NOTIFY BIT(5) +/* Not really a feature, but it's convenient to handle it as such */ +#define FEATURE_IDF BIT(15) +#define FEATURE_TCO_SPT BIT(16) +#define FEATURE_TCO_CNL BIT(17) + +static const char *i801_feature_names[] = { + "SMBus PEC", + "Block buffer", + "Block process call", + "I2C block read", + "Interrupt", + "SMBus Host Notify", +}; + +static unsigned int disable_features; +module_param(disable_features, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n" + "\t\t 0x01 disable SMBus PEC\n" + "\t\t 0x02 disable the block buffer\n" + "\t\t 0x08 disable the I2C block read functionality\n" + "\t\t 0x10 don't use interrupts\n" + "\t\t 0x20 disable SMBus Host Notify "); + +static void i801_setscl(struct i801_priv *priv, unsigned int level) +{ + int pin_status; + pin_status = inb_p(SMBPINCTL(priv)); + if (level == 0) { + pin_status &= (~SMBPINCTL_CLK_CTL); + } + else { + pin_status |= SMBPINCTL_CLK_CTL; + } + outb_p(pin_status, SMBPINCTL(priv)); + return; +} + +static void i801_i2c_unblock(struct i801_priv *priv) +{ + int i; + for (i = 0; i < 10; i++) { + i801_setscl(priv, 0); + udelay(5); + i801_setscl(priv, 1); + udelay(5); + } + return; +} + +static int i801_check_i2c_unblock(struct i801_priv *priv) +{ + int pin_status; + + pin_status = inb_p(SMBPINCTL(priv)); + if ( (!(pin_status & SMBPINCTL_SDA_STS) ) && (pin_status & SMBPINCTL_CLK_STS) ) { + dev_dbg(&priv->pci_dev->dev, "SDA is low, send 9 clock to device!\n"); + i801_i2c_unblock(priv); + } + return 0; +} + +static void i801_do_reset(struct i801_priv *priv) +{ + unsigned char tmp; + unsigned int retry_count = 0; + + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &tmp); + tmp |= SMBHSTCFG_SSRESET; + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, tmp); + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &tmp); + + while( ((tmp & SMBHSTCFG_SSRESET) != 0) && (retry_count < SSRESET_RETRY_TIME)) { + usleep_range(SSRESET_SLEEP_TIME, SSRESET_SLEEP_TIME + 1); + retry_count++; + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &tmp); + } + + return ; +} + +static int i801_check_i2c_scl(struct i801_priv *priv) +{ + int pin_status; + + pin_status = inb_p(SMBPINCTL(priv)); + if ( (pin_status & SMBPINCTL_SDA_STS) && (pin_status & SMBPINCTL_CLK_STS) ) { + return 0; + } + + dev_dbg(&priv->pci_dev->dev, "SDA or SCL is low, begin to reset SMBus adapter, pin_status: 0x%x\n",pin_status); + i801_do_reset(priv); + pin_status = inb_p(SMBPINCTL(priv)); + if ( (pin_status & SMBPINCTL_SDA_STS) && (pin_status & SMBPINCTL_CLK_STS) ) { + return 0; + } + dev_warn(&priv->pci_dev->dev, "SDA or SCL is low.pin_status:0x%x\n",pin_status); + return -1; +} + +/* Make sure the SMBus host is ready to start transmitting. + Return 0 if it is, -EBUSY if it is not. */ +static int i801_check_pre(struct i801_priv *priv) +{ + int status; + + i801_check_i2c_unblock(priv); + + if (i801_check_i2c_scl(priv)) { + return -EIO; + } + + status = inb_p(SMBHSTSTS(priv)); + if (status & SMBHSTSTS_HOST_BUSY) { + dev_dbg(&priv->pci_dev->dev, "SMBus is busy, begin to reset SMBus adapter!\n"); + + i801_do_reset(priv); + + status = inb_p(SMBHSTSTS(priv)); + if (status & SMBHSTSTS_HOST_BUSY) { + dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n"); + return -EBUSY; + } + } + + status &= STATUS_FLAGS; + if (status) { + dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n", + status); + outb_p(status, SMBHSTSTS(priv)); + status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS; + if (status) { + dev_err(&priv->pci_dev->dev, + "Failed clearing status flags (%02x)\n", + status); + return -EBUSY; + } + } + + /* + * Clear CRC status if needed. + * During normal operation, i801_check_post() takes care + * of it after every operation. We do it here only in case + * the hardware was already in this state when the driver + * started. + */ + if (priv->features & FEATURE_SMBUS_PEC) { + status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE; + if (status) { + dev_dbg(&priv->pci_dev->dev, + "Clearing aux status flags (%02x)\n", status); + outb_p(status, SMBAUXSTS(priv)); + status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE; + if (status) { + dev_err(&priv->pci_dev->dev, + "Failed clearing aux status flags (%02x)\n", + status); + return -EBUSY; + } + } + } + + return 0; +} + +/* + * Convert the status register to an error code, and clear it. + * Note that status only contains the bits we want to clear, not the + * actual register value. + */ +static int i801_check_post(struct i801_priv *priv, int status) +{ + int result = 0; + + /* + * If the SMBus is still busy, we give up + * Note: This timeout condition only happens when using polling + * transactions. For interrupt operation, NAK/timeout is indicated by + * DEV_ERR. + */ + if (unlikely(status < 0)) { + dev_err(&priv->pci_dev->dev, "Transaction timeout\n"); + /* try to stop the current command */ + dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n"); + outb_p(SMBHSTCNT_KILL, SMBHSTCNT(priv)); + usleep_range(1000, 2000); + outb_p(0, SMBHSTCNT(priv)); + + /* Check if it worked */ + status = inb_p(SMBHSTSTS(priv)); + if ((status & SMBHSTSTS_HOST_BUSY) || + !(status & SMBHSTSTS_FAILED)) + dev_err(&priv->pci_dev->dev, + "Failed terminating the transaction\n"); + outb_p(STATUS_FLAGS, SMBHSTSTS(priv)); + return -ETIMEDOUT; + } + + if (status & SMBHSTSTS_FAILED) { + result = -EIO; + dev_err(&priv->pci_dev->dev, "Transaction failed\n"); + } + if (status & SMBHSTSTS_DEV_ERR) { + /* + * This may be a PEC error, check and clear it. + * + * AUXSTS is handled differently from HSTSTS. + * For HSTSTS, i801_isr() or i801_wait_intr() + * has already cleared the error bits in hardware, + * and we are passed a copy of the original value + * in "status". + * For AUXSTS, the hardware register is left + * for us to handle here. + * This is asymmetric, slightly iffy, but safe, + * since all this code is serialized and the CRCE + * bit is harmless as long as it's cleared before + * the next operation. + */ + if ((priv->features & FEATURE_SMBUS_PEC) && + (inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE)) { + outb_p(SMBAUXSTS_CRCE, SMBAUXSTS(priv)); + result = -EBADMSG; + dev_dbg(&priv->pci_dev->dev, "PEC error\n"); + } else { + result = -ENXIO; + dev_dbg(&priv->pci_dev->dev, "No response\n"); + } + } + if (status & SMBHSTSTS_BUS_ERR) { + result = -EAGAIN; + dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n"); + } + + /* Clear status flags except BYTE_DONE, to be cleared by caller */ + outb_p(status, SMBHSTSTS(priv)); + + return result; +} + +/* Wait for BUSY being cleared and either INTR or an error flag being set */ +static int i801_wait_intr(struct i801_priv *priv) +{ + int timeout = 0; + int status; + + /* We will always wait for a fraction of a second! */ + do { + usleep_range(250, 500); + status = inb_p(SMBHSTSTS(priv)); + } while (((status & SMBHSTSTS_HOST_BUSY) || + !(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR))) && + (timeout++ < MAX_RETRIES)); + + if (timeout > MAX_RETRIES) { + dev_dbg(&priv->pci_dev->dev, "INTR Timeout!\n"); + return -ETIMEDOUT; + } + return status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR); +} + +/* Wait for either BYTE_DONE or an error flag being set */ +static int i801_wait_byte_done(struct i801_priv *priv) +{ + int timeout = 0; + int status; + + /* We will always wait for a fraction of a second! */ + do { + usleep_range(250, 500); + status = inb_p(SMBHSTSTS(priv)); + } while (!(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_BYTE_DONE)) && + (timeout++ < MAX_RETRIES)); + + if (timeout > MAX_RETRIES) { + dev_dbg(&priv->pci_dev->dev, "BYTE_DONE Timeout!\n"); + return -ETIMEDOUT; + } + return status & STATUS_ERROR_FLAGS; +} + +static int i801_transaction(struct i801_priv *priv, int xact) +{ + int status; + int result; + const struct i2c_adapter *adap = &priv->adapter; + + result = i801_check_pre(priv); + if (result < 0) + return result; + + if (priv->features & FEATURE_IRQ) { + outb_p(xact | SMBHSTCNT_INTREN | SMBHSTCNT_START, + SMBHSTCNT(priv)); + result = wait_event_timeout(priv->waitq, + (status = priv->status), + adap->timeout); + if (!result) { + status = -ETIMEDOUT; + dev_warn(&priv->pci_dev->dev, + "Timeout waiting for interrupt!\n"); + } + priv->status = 0; + return i801_check_post(priv, status); + } + + /* the current contents of SMBHSTCNT can be overwritten, since PEC, + * SMBSCMD are passed in xact */ + outb_p(xact | SMBHSTCNT_START, SMBHSTCNT(priv)); + + status = i801_wait_intr(priv); + return i801_check_post(priv, status); +} + +static int i801_block_transaction_by_block(struct i801_priv *priv, + union i2c_smbus_data *data, + char read_write, int command, + int hwpec) +{ + int i, len; + int status; + int xact = hwpec ? SMBHSTCNT_PEC_EN : 0; + + switch (command) { + case I2C_SMBUS_BLOCK_PROC_CALL: + xact |= I801_BLOCK_PROC_CALL; + break; + case I2C_SMBUS_BLOCK_DATA: + xact |= I801_BLOCK_DATA; + break; + default: + return -EOPNOTSUPP; + } + + inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */ + + /* Use 32-byte buffer to process this transaction */ + if (read_write == I2C_SMBUS_WRITE) { + len = data->block[0]; + outb_p(len, SMBHSTDAT0(priv)); + for (i = 0; i < len; i++) + outb_p(data->block[i+1], SMBBLKDAT(priv)); + } + + status = i801_transaction(priv, xact); + if (status) + return status; + + if (read_write == I2C_SMBUS_READ || + command == I2C_SMBUS_BLOCK_PROC_CALL) { + len = inb_p(SMBHSTDAT0(priv)); + if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) + return -EPROTO; + + data->block[0] = len; + for (i = 0; i < len; i++) + data->block[i + 1] = inb_p(SMBBLKDAT(priv)); + } + return 0; +} + +static void i801_isr_byte_done(struct i801_priv *priv) +{ + if (priv->is_read) { + /* For SMBus block reads, length is received with first byte */ + if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) && + (priv->count == 0)) { + priv->len = inb_p(SMBHSTDAT0(priv)); + if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) { + dev_err(&priv->pci_dev->dev, + "Illegal SMBus block read size %d\n", + priv->len); + /* FIXME: Recover */ + priv->len = I2C_SMBUS_BLOCK_MAX; + } else { + dev_dbg(&priv->pci_dev->dev, + "SMBus block read size is %d\n", + priv->len); + } + priv->data[-1] = priv->len; + } + + /* Read next byte */ + if (priv->count < priv->len) + priv->data[priv->count++] = inb(SMBBLKDAT(priv)); + else + dev_dbg(&priv->pci_dev->dev, + "Discarding extra byte on block read\n"); + + /* Set LAST_BYTE for last byte of read transaction */ + if (priv->count == priv->len - 1) + outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE, + SMBHSTCNT(priv)); + } else if (priv->count < priv->len - 1) { + /* Write next byte, except for IRQ after last byte */ + outb_p(priv->data[++priv->count], SMBBLKDAT(priv)); + } + + /* Clear BYTE_DONE to continue with next byte */ + outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); +} + +static irqreturn_t i801_host_notify_isr(struct i801_priv *priv) +{ + unsigned short addr; + + addr = inb_p(SMBNTFDADD(priv)) >> 1; + + /* + * With the tested platforms, reading SMBNTFDDAT (22 + (p)->smba) + * always returns 0. Our current implementation doesn't provide + * data, so we just ignore it. + */ + i2c_handle_smbus_host_notify(&priv->adapter, addr); + + /* clear Host Notify bit and return */ + outb_p(SMBSLVSTS_HST_NTFY_STS, SMBSLVSTS(priv)); + return IRQ_HANDLED; +} + +/* + * There are three kinds of interrupts: + * + * 1) i801 signals transaction completion with one of these interrupts: + * INTR - Success + * DEV_ERR - Invalid command, NAK or communication timeout + * BUS_ERR - SMI# transaction collision + * FAILED - transaction was canceled due to a KILL request + * When any of these occur, update ->status and wake up the waitq. + * ->status must be cleared before kicking off the next transaction. + * + * 2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt + * occurs for each byte of a byte-by-byte to prepare the next byte. + * + * 3) Host Notify interrupts + */ +static irqreturn_t i801_isr(int irq, void *dev_id) +{ + struct i801_priv *priv = dev_id; + u16 pcists; + u8 status; + + /* Confirm this is our interrupt */ + pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); + if (!(pcists & SMBPCISTS_INTS)) + return IRQ_NONE; + + if (priv->features & FEATURE_HOST_NOTIFY) { + status = inb_p(SMBSLVSTS(priv)); + if (status & SMBSLVSTS_HST_NTFY_STS) + return i801_host_notify_isr(priv); + } + + status = inb_p(SMBHSTSTS(priv)); + if (status & SMBHSTSTS_BYTE_DONE) + i801_isr_byte_done(priv); + + /* + * Clear irq sources and report transaction result. + * ->status must be cleared before the next transaction is started. + */ + status &= SMBHSTSTS_INTR | STATUS_ERROR_FLAGS; + if (status) { + outb_p(status, SMBHSTSTS(priv)); + priv->status = status; + wake_up(&priv->waitq); + } + + return IRQ_HANDLED; +} + +/* + * For "byte-by-byte" block transactions: + * I2C write uses cmd=I801_BLOCK_DATA, I2C_EN=1 + * I2C read uses cmd=I801_I2C_BLOCK_DATA + */ +static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, + union i2c_smbus_data *data, + char read_write, int command, + int hwpec) +{ + int i, len; + int smbcmd; + int status; + int result; + const struct i2c_adapter *adap = &priv->adapter; + + if (command == I2C_SMBUS_BLOCK_PROC_CALL) + return -EOPNOTSUPP; + + result = i801_check_pre(priv); + if (result < 0) + return result; + + len = data->block[0]; + + if (read_write == I2C_SMBUS_WRITE) { + outb_p(len, SMBHSTDAT0(priv)); + outb_p(data->block[1], SMBBLKDAT(priv)); + } + + if (command == I2C_SMBUS_I2C_BLOCK_DATA && + read_write == I2C_SMBUS_READ) + smbcmd = I801_I2C_BLOCK_DATA; + else + smbcmd = I801_BLOCK_DATA; + + if (priv->features & FEATURE_IRQ) { + priv->is_read = (read_write == I2C_SMBUS_READ); + if (len == 1 && priv->is_read) + smbcmd |= SMBHSTCNT_LAST_BYTE; + priv->cmd = smbcmd | SMBHSTCNT_INTREN; + priv->len = len; + priv->count = 0; + priv->data = &data->block[1]; + + outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv)); + result = wait_event_timeout(priv->waitq, + (status = priv->status), + adap->timeout); + if (!result) { + status = -ETIMEDOUT; + dev_warn(&priv->pci_dev->dev, + "Timeout waiting for interrupt!\n"); + } + priv->status = 0; + return i801_check_post(priv, status); + } + + for (i = 1; i <= len; i++) { + if (i == len && read_write == I2C_SMBUS_READ) + smbcmd |= SMBHSTCNT_LAST_BYTE; + outb_p(smbcmd, SMBHSTCNT(priv)); + + if (i == 1) + outb_p(inb(SMBHSTCNT(priv)) | SMBHSTCNT_START, + SMBHSTCNT(priv)); + + status = i801_wait_byte_done(priv); + if (status) + goto exit; + + if (i == 1 && read_write == I2C_SMBUS_READ + && command != I2C_SMBUS_I2C_BLOCK_DATA) { + len = inb_p(SMBHSTDAT0(priv)); + if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) { + dev_err(&priv->pci_dev->dev, + "Illegal SMBus block read size %d\n", + len); + /* Recover */ + while (inb_p(SMBHSTSTS(priv)) & + SMBHSTSTS_HOST_BUSY) + outb_p(SMBHSTSTS_BYTE_DONE, + SMBHSTSTS(priv)); + outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv)); + return -EPROTO; + } + data->block[0] = len; + } + + /* Retrieve/store value in SMBBLKDAT */ + if (read_write == I2C_SMBUS_READ) + data->block[i] = inb_p(SMBBLKDAT(priv)); + if (read_write == I2C_SMBUS_WRITE && i+1 <= len) + outb_p(data->block[i+1], SMBBLKDAT(priv)); + + /* signals SMBBLKDAT ready */ + outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); + } + + status = i801_wait_intr(priv); +exit: + return i801_check_post(priv, status); +} + +static int i801_set_block_buffer_mode(struct i801_priv *priv) +{ + outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv)); + if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0) + return -EIO; + return 0; +} + +/* Block transaction function */ +static int i801_block_transaction(struct i801_priv *priv, + union i2c_smbus_data *data, char read_write, + int command, int hwpec) +{ + int result = 0; + unsigned char hostc; + + if (command == I2C_SMBUS_I2C_BLOCK_DATA) { + if (read_write == I2C_SMBUS_WRITE) { + /* set I2C_EN bit in configuration register */ + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc); + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, + hostc | SMBHSTCFG_I2C_EN); + } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) { + dev_err(&priv->pci_dev->dev, + "I2C block read is unsupported!\n"); + return -EOPNOTSUPP; + } + } + + if (read_write == I2C_SMBUS_WRITE + || command == I2C_SMBUS_I2C_BLOCK_DATA) { + if (data->block[0] < 1) + data->block[0] = 1; + if (data->block[0] > I2C_SMBUS_BLOCK_MAX) + data->block[0] = I2C_SMBUS_BLOCK_MAX; + } else { + data->block[0] = 32; /* max for SMBus block reads */ + } + + /* Experience has shown that the block buffer can only be used for + SMBus (not I2C) block transactions, even though the datasheet + doesn't mention this limitation. */ + if ((priv->features & FEATURE_BLOCK_BUFFER) + && command != I2C_SMBUS_I2C_BLOCK_DATA + && i801_set_block_buffer_mode(priv) == 0) + result = i801_block_transaction_by_block(priv, data, + read_write, + command, hwpec); + else + result = i801_block_transaction_byte_by_byte(priv, data, + read_write, + command, hwpec); + + if (command == I2C_SMBUS_I2C_BLOCK_DATA + && read_write == I2C_SMBUS_WRITE) { + /* restore saved configuration register value */ + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc); + } + return result; +} + +/* Return negative errno on error. */ +static s32 i801_access(struct i2c_adapter *adap, u16 addr, + unsigned short flags, char read_write, u8 command, + int size, union i2c_smbus_data *data) +{ + int hwpec; + int block = 0; + int ret = 0, xact = 0; + struct i801_priv *priv = i2c_get_adapdata(adap); + + mutex_lock(&priv->acpi_lock); + if (priv->acpi_reserved) { + mutex_unlock(&priv->acpi_lock); + return -EBUSY; + } + + pm_runtime_get_sync(&priv->pci_dev->dev); + + hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC) + && size != I2C_SMBUS_QUICK + && size != I2C_SMBUS_I2C_BLOCK_DATA; + + switch (size) { + case I2C_SMBUS_QUICK: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + xact = I801_QUICK; + break; + case I2C_SMBUS_BYTE: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + if (read_write == I2C_SMBUS_WRITE) + outb_p(command, SMBHSTCMD(priv)); + xact = I801_BYTE; + break; + case I2C_SMBUS_BYTE_DATA: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + if (read_write == I2C_SMBUS_WRITE) + outb_p(data->byte, SMBHSTDAT0(priv)); + xact = I801_BYTE_DATA; + break; + case I2C_SMBUS_WORD_DATA: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + if (read_write == I2C_SMBUS_WRITE) { + outb_p(data->word & 0xff, SMBHSTDAT0(priv)); + outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); + } + xact = I801_WORD_DATA; + break; + case I2C_SMBUS_BLOCK_DATA: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + block = 1; + break; + case I2C_SMBUS_I2C_BLOCK_DATA: + /* + * NB: page 240 of ICH5 datasheet shows that the R/#W + * bit should be cleared here, even when reading. + * However if SPD Write Disable is set (Lynx Point and later), + * the read will fail if we don't set the R/#W bit. + */ + outb_p(((addr & 0x7f) << 1) | + ((priv->original_hstcfg & SMBHSTCFG_SPD_WD) ? + (read_write & 0x01) : 0), + SMBHSTADD(priv)); + if (read_write == I2C_SMBUS_READ) { + /* NB: page 240 of ICH5 datasheet also shows + * that DATA1 is the cmd field when reading */ + outb_p(command, SMBHSTDAT1(priv)); + } else + outb_p(command, SMBHSTCMD(priv)); + block = 1; + break; + case I2C_SMBUS_BLOCK_PROC_CALL: + /* + * Bit 0 of the slave address register always indicate a write + * command. + */ + outb_p((addr & 0x7f) << 1, SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + block = 1; + break; + default: + dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n", + size); + ret = -EOPNOTSUPP; + goto out; + } + + if (hwpec) /* enable/disable hardware PEC */ + outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv)); + else + outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC), + SMBAUXCTL(priv)); + + if (block) + ret = i801_block_transaction(priv, data, read_write, size, + hwpec); + else + ret = i801_transaction(priv, xact); + + /* Some BIOSes don't like it when PEC is enabled at reboot or resume + time, so we forcibly disable it after every transaction. Turn off + E32B for the same reason. */ + if (hwpec || block) + outb_p(inb_p(SMBAUXCTL(priv)) & + ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); + + if (block) + goto out; + if (ret) + goto out; + if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK)) + goto out; + + switch (xact & 0x7f) { + case I801_BYTE: /* Result put in SMBHSTDAT0 */ + case I801_BYTE_DATA: + data->byte = inb_p(SMBHSTDAT0(priv)); + break; + case I801_WORD_DATA: + data->word = inb_p(SMBHSTDAT0(priv)) + + (inb_p(SMBHSTDAT1(priv)) << 8); + break; + } + +out: + pm_runtime_mark_last_busy(&priv->pci_dev->dev); + pm_runtime_put_autosuspend(&priv->pci_dev->dev); + mutex_unlock(&priv->acpi_lock); + return ret; +} + +static u32 i801_func(struct i2c_adapter *adapter) +{ + struct i801_priv *priv = i2c_get_adapdata(adapter); + + return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | + I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK | + ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) | + ((priv->features & FEATURE_BLOCK_PROC) ? + I2C_FUNC_SMBUS_BLOCK_PROC_CALL : 0) | + ((priv->features & FEATURE_I2C_BLOCK_READ) ? + I2C_FUNC_SMBUS_READ_I2C_BLOCK : 0) | + ((priv->features & FEATURE_HOST_NOTIFY) ? + I2C_FUNC_SMBUS_HOST_NOTIFY : 0); +} + +static void i801_enable_host_notify(struct i2c_adapter *adapter) +{ + struct i801_priv *priv = i2c_get_adapdata(adapter); + + if (!(priv->features & FEATURE_HOST_NOTIFY)) + return; + + if (!(SMBSLVCMD_HST_NTFY_INTREN & priv->original_slvcmd)) + outb_p(SMBSLVCMD_HST_NTFY_INTREN | priv->original_slvcmd, + SMBSLVCMD(priv)); + + /* clear Host Notify bit to allow a new notification */ + outb_p(SMBSLVSTS_HST_NTFY_STS, SMBSLVSTS(priv)); +} + +static void i801_disable_host_notify(struct i801_priv *priv) +{ + if (!(priv->features & FEATURE_HOST_NOTIFY)) + return; + + outb_p(priv->original_slvcmd, SMBSLVCMD(priv)); +} + +static const struct i2c_algorithm smbus_algorithm = { + .smbus_xfer = i801_access, + .functionality = i801_func, +}; + +static const struct pci_device_id i801_ids[] = { + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EP80579_1) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_AVOTON_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_GEMINILAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CDF_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DNV_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EBG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BROXTON_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS) }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, i801_ids); + +#if defined CONFIG_X86 && defined CONFIG_DMI +static unsigned char apanel_addr; + +/* Scan the system ROM for the signature "FJKEYINF" */ +static __init const void __iomem *bios_signature(const void __iomem *bios) +{ + ssize_t offset; + const unsigned char signature[] = "FJKEYINF"; + + for (offset = 0; offset < 0x10000; offset += 0x10) { + if (check_signature(bios + offset, signature, + sizeof(signature)-1)) + return bios + offset; + } + return NULL; +} + +static void __init input_apanel_init(void) +{ + void __iomem *bios; + const void __iomem *p; + + bios = ioremap(0xF0000, 0x10000); /* Can't fail */ + p = bios_signature(bios); + if (p) { + /* just use the first address */ + apanel_addr = readb(p + 8 + 3) >> 1; + } + iounmap(bios); +} + +struct dmi_onboard_device_info { + const char *name; + u8 type; + unsigned short i2c_addr; + const char *i2c_type; +}; + +static const struct dmi_onboard_device_info dmi_devices[] = { + { "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" }, + { "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" }, + { "Hades", DMI_DEV_TYPE_OTHER, 0x73, "fschds" }, +}; + +static void dmi_check_onboard_device(u8 type, const char *name, + struct i2c_adapter *adap) +{ + int i; + struct i2c_board_info info; + + for (i = 0; i < ARRAY_SIZE(dmi_devices); i++) { + /* & ~0x80, ignore enabled/disabled bit */ + if ((type & ~0x80) != dmi_devices[i].type) + continue; + if (strcasecmp(name, dmi_devices[i].name)) + continue; + + mem_clear(&info, sizeof(struct i2c_board_info)); + info.addr = dmi_devices[i].i2c_addr; + strlcpy(info.type, dmi_devices[i].i2c_type, I2C_NAME_SIZE); + i2c_new_client_device(adap, &info); + break; + } +} + +/* We use our own function to check for onboard devices instead of + dmi_find_device() as some buggy BIOS's have the devices we are interested + in marked as disabled */ +static void dmi_check_onboard_devices(const struct dmi_header *dm, void *adap) +{ + int i, count; + + if (dm->type != 10) + return; + + count = (dm->length - sizeof(struct dmi_header)) / 2; + for (i = 0; i < count; i++) { + const u8 *d = (char *)(dm + 1) + (i * 2); + const char *name = ((char *) dm) + dm->length; + u8 type = d[0]; + u8 s = d[1]; + + if (!s) + continue; + s--; + while (s > 0 && name[0]) { + name += strlen(name) + 1; + s--; + } + if (name[0] == 0) /* Bogus string reference */ + continue; + + dmi_check_onboard_device(type, name, adap); + } +} + +/* NOTE: Keep this list in sync with drivers/platform/x86/dell-smo8800.c */ +static const char *const acpi_smo8800_ids[] = { + "SMO8800", + "SMO8801", + "SMO8810", + "SMO8811", + "SMO8820", + "SMO8821", + "SMO8830", + "SMO8831", +}; + +static acpi_status check_acpi_smo88xx_device(acpi_handle obj_handle, + u32 nesting_level, + void *context, + void **return_value) +{ + struct acpi_device_info *info; + acpi_status status; + char *hid; + int i; + + status = acpi_get_object_info(obj_handle, &info); + if (ACPI_FAILURE(status)) + return AE_OK; + + if (!(info->valid & ACPI_VALID_HID)) + goto smo88xx_not_found; + + hid = info->hardware_id.string; + if (!hid) + goto smo88xx_not_found; + + i = match_string(acpi_smo8800_ids, ARRAY_SIZE(acpi_smo8800_ids), hid); + if (i < 0) + goto smo88xx_not_found; + + kfree(info); + + *((bool *)return_value) = true; + return AE_CTRL_TERMINATE; + +smo88xx_not_found: + kfree(info); + return AE_OK; +} + +static bool is_dell_system_with_lis3lv02d(void) +{ + bool found; + const char *vendor; + + vendor = dmi_get_system_info(DMI_SYS_VENDOR); + if (!vendor || strcmp(vendor, "Dell Inc.")) + return false; + + /* + * Check that ACPI device SMO88xx is present and is functioning. + * Function acpi_get_devices() already filters all ACPI devices + * which are not present or are not functioning. + * ACPI device SMO88xx represents our ST microelectronics lis3lv02d + * accelerometer but unfortunately ACPI does not provide any other + * information (like I2C address). + */ + found = false; + acpi_get_devices(NULL, check_acpi_smo88xx_device, NULL, + (void **)&found); + + return found; +} + +/* + * Accelerometer's I2C address is not specified in DMI nor ACPI, + * so it is needed to define mapping table based on DMI product names. + */ +static const struct { + const char *dmi_product_name; + unsigned short i2c_addr; +} dell_lis3lv02d_devices[] = { + /* + * Dell platform team told us that these Latitude devices have + * ST microelectronics accelerometer at I2C address 0x29. + */ + { "Latitude E5250", 0x29 }, + { "Latitude E5450", 0x29 }, + { "Latitude E5550", 0x29 }, + { "Latitude E6440", 0x29 }, + { "Latitude E6440 ATG", 0x29 }, + { "Latitude E6540", 0x29 }, + /* + * Additional individual entries were added after verification. + */ + { "Latitude 5480", 0x29 }, + { "Vostro V131", 0x1d }, +}; + +static void register_dell_lis3lv02d_i2c_device(struct i801_priv *priv) +{ + struct i2c_board_info info; + const char *dmi_product_name; + int i; + + dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME); + for (i = 0; i < ARRAY_SIZE(dell_lis3lv02d_devices); ++i) { + if (strcmp(dmi_product_name, + dell_lis3lv02d_devices[i].dmi_product_name) == 0) + break; + } + + if (i == ARRAY_SIZE(dell_lis3lv02d_devices)) { + dev_warn(&priv->pci_dev->dev, + "Accelerometer lis3lv02d is present on SMBus but its" + " address is unknown, skipping registration\n"); + return; + } + + mem_clear(&info, sizeof(struct i2c_board_info)); + info.addr = dell_lis3lv02d_devices[i].i2c_addr; + strlcpy(info.type, "lis3lv02d", I2C_NAME_SIZE); + i2c_new_client_device(&priv->adapter, &info); +} + +/* Register optional slaves */ +static void i801_probe_optional_slaves(struct i801_priv *priv) +{ + /* Only register slaves on main SMBus channel */ + if (priv->features & FEATURE_IDF) + return; + + if (apanel_addr) { + struct i2c_board_info info; + + mem_clear(&info, sizeof(struct i2c_board_info)); + info.addr = apanel_addr; + strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE); + i2c_new_client_device(&priv->adapter, &info); + } + + if (dmi_name_in_vendors("FUJITSU")) + dmi_walk(dmi_check_onboard_devices, &priv->adapter); + + if (is_dell_system_with_lis3lv02d()) + register_dell_lis3lv02d_i2c_device(priv); + + /* Instantiate SPD EEPROMs unless the SMBus is multiplexed */ +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) + if (!priv->mux_drvdata) +#endif + i2c_register_spd(&priv->adapter); +} +#else +static void __init input_apanel_init(void) {} +static void i801_probe_optional_slaves(struct i801_priv *priv) {} +#endif /* CONFIG_X86 && CONFIG_DMI */ + +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI +static struct i801_mux_config i801_mux_config_asus_z8_d12 = { + .gpio_chip = "gpio_ich", + .values = { 0x02, 0x03 }, + .n_values = 2, + .classes = { I2C_CLASS_SPD, I2C_CLASS_SPD }, + .gpios = { 52, 53 }, + .n_gpios = 2, +}; + +static struct i801_mux_config i801_mux_config_asus_z8_d18 = { + .gpio_chip = "gpio_ich", + .values = { 0x02, 0x03, 0x01 }, + .n_values = 3, + .classes = { I2C_CLASS_SPD, I2C_CLASS_SPD, I2C_CLASS_SPD }, + .gpios = { 52, 53 }, + .n_gpios = 2, +}; + +static const struct dmi_system_id mux_dmi_table[] = { + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8NA-D6(C)"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)E-D12(X)"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8NH-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PH-D12/IFB"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8NR-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)H-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PG-D18"), + }, + .driver_data = &i801_mux_config_asus_z8_d18, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PE-D18"), + }, + .driver_data = &i801_mux_config_asus_z8_d18, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PS-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { } +}; + +/* Setup multiplexing if needed */ +static int i801_add_mux(struct i801_priv *priv) +{ + struct device *dev = &priv->adapter.dev; + const struct i801_mux_config *mux_config; + struct i2c_mux_gpio_platform_data gpio_data; + struct gpiod_lookup_table *lookup; + int err, i; + + if (!priv->mux_drvdata) + return 0; + mux_config = priv->mux_drvdata; + + /* Prepare the platform data */ + mem_clear(&gpio_data, sizeof(struct i2c_mux_gpio_platform_data)); + gpio_data.parent = priv->adapter.nr; + gpio_data.values = mux_config->values; + gpio_data.n_values = mux_config->n_values; + gpio_data.classes = mux_config->classes; + gpio_data.idle = I2C_MUX_GPIO_NO_IDLE; + + /* Register GPIO descriptor lookup table */ + lookup = devm_kzalloc(dev, + struct_size(lookup, table, mux_config->n_gpios + 1), + GFP_KERNEL); + if (!lookup) + return -ENOMEM; + lookup->dev_id = "i2c-mux-gpio"; + for (i = 0; i < mux_config->n_gpios; i++) { + lookup->table[i] = (struct gpiod_lookup) + GPIO_LOOKUP(mux_config->gpio_chip, + mux_config->gpios[i], "mux", 0); + } + gpiod_add_lookup_table(lookup); + priv->lookup = lookup; + + /* + * Register the mux device, we use PLATFORM_DEVID_NONE here + * because since we are referring to the GPIO chip by name we are + * anyways in deep trouble if there is more than one of these + * devices, and there should likely only be one platform controller + * hub. + */ + priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio", + PLATFORM_DEVID_NONE, &gpio_data, + sizeof(struct i2c_mux_gpio_platform_data)); + if (IS_ERR(priv->mux_pdev)) { + err = PTR_ERR(priv->mux_pdev); + gpiod_remove_lookup_table(lookup); + priv->mux_pdev = NULL; + dev_err(dev, "Failed to register i2c-mux-gpio device\n"); + return err; + } + + return 0; +} + +static void i801_del_mux(struct i801_priv *priv) +{ + if (priv->mux_pdev) + platform_device_unregister(priv->mux_pdev); + if (priv->lookup) + gpiod_remove_lookup_table(priv->lookup); +} + +static unsigned int i801_get_adapter_class(struct i801_priv *priv) +{ + const struct dmi_system_id *id; + const struct i801_mux_config *mux_config; + unsigned int class = I2C_CLASS_HWMON | I2C_CLASS_SPD; + int i; + + id = dmi_first_match(mux_dmi_table); + if (id) { + /* Remove branch classes from trunk */ + mux_config = id->driver_data; + for (i = 0; i < mux_config->n_values; i++) + class &= ~mux_config->classes[i]; + + /* Remember for later */ + priv->mux_drvdata = mux_config; + } + + return class; +} +#else +static inline int i801_add_mux(struct i801_priv *priv) { return 0; } +static inline void i801_del_mux(struct i801_priv *priv) { } + +static inline unsigned int i801_get_adapter_class(struct i801_priv *priv) +{ + return I2C_CLASS_HWMON | I2C_CLASS_SPD; +} +#endif + +static const struct itco_wdt_platform_data spt_tco_platform_data = { + .name = "Intel PCH", + .version = 4, +}; + +static DEFINE_SPINLOCK(p2sb_spinlock); + +static struct platform_device * +i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev, + struct resource *tco_res) +{ + struct resource *res; + unsigned int devfn; + u64 base64_addr; + u32 base_addr; + u8 hidden; + + /* + * We must access the NO_REBOOT bit over the Primary to Sideband + * bridge (P2SB). The BIOS prevents the P2SB device from being + * enumerated by the PCI subsystem, so we need to unhide/hide it + * to lookup the P2SB BAR. + */ + spin_lock(&p2sb_spinlock); + + devfn = PCI_DEVFN(PCI_SLOT(pci_dev->devfn), 1); + + /* Unhide the P2SB device, if it is hidden */ + pci_bus_read_config_byte(pci_dev->bus, devfn, 0xe1, &hidden); + if (hidden) + pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, 0x0); + + pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR, &base_addr); + base64_addr = base_addr & 0xfffffff0; + + pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR + 0x4, &base_addr); + base64_addr |= (u64)base_addr << 32; + + /* Hide the P2SB device, if it was hidden before */ + if (hidden) + pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden); + spin_unlock(&p2sb_spinlock); + + res = &tco_res[1]; + if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) + res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV; + else + res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL; + + res->end = res->start + 3; + res->flags = IORESOURCE_MEM; + + return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, + tco_res, 2, &spt_tco_platform_data, + sizeof(spt_tco_platform_data)); +} + +static const struct itco_wdt_platform_data cnl_tco_platform_data = { + .name = "Intel PCH", + .version = 6, +}; + +static struct platform_device * +i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev, + struct resource *tco_res) +{ + return platform_device_register_resndata(&pci_dev->dev, + "iTCO_wdt", -1, tco_res, 1, &cnl_tco_platform_data, + sizeof(cnl_tco_platform_data)); +} + +static void i801_add_tco(struct i801_priv *priv) +{ + struct pci_dev *pci_dev = priv->pci_dev; + struct resource tco_res[2], *res; + u32 tco_base, tco_ctl; + + /* If we have ACPI based watchdog use that instead */ + if (acpi_has_watchdog()) + return; + + if (!(priv->features & (FEATURE_TCO_SPT | FEATURE_TCO_CNL))) + return; + + pci_read_config_dword(pci_dev, TCOBASE, &tco_base); + pci_read_config_dword(pci_dev, TCOCTL, &tco_ctl); + if (!(tco_ctl & TCOCTL_EN)) + return; + + mem_clear(tco_res, sizeof(tco_res)); + /* + * Always populate the main iTCO IO resource here. The second entry + * for NO_REBOOT MMIO is filled by the SPT specific function. + */ + res = &tco_res[0]; + res->start = tco_base & ~1; + res->end = res->start + 32 - 1; + res->flags = IORESOURCE_IO; + + if (priv->features & FEATURE_TCO_CNL) + priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); + else + priv->tco_pdev = i801_add_tco_spt(priv, pci_dev, tco_res); + + if (IS_ERR(priv->tco_pdev)) + dev_warn(&pci_dev->dev, "failed to create iTCO device\n"); +} + +#ifdef CONFIG_ACPI +static bool i801_acpi_is_smbus_ioport(const struct i801_priv *priv, + acpi_physical_address address) +{ + return address >= priv->smba && + address <= pci_resource_end(priv->pci_dev, SMBBAR); +} + +static acpi_status +i801_acpi_io_handler(u32 function, acpi_physical_address address, u32 bits, + u64 *value, void *handler_context, void *region_context) +{ + struct i801_priv *priv = handler_context; + struct pci_dev *pdev = priv->pci_dev; + acpi_status status; + + /* + * Once BIOS AML code touches the OpRegion we warn and inhibit any + * further access from the driver itself. This device is now owned + * by the system firmware. + */ + mutex_lock(&priv->acpi_lock); + + if (!priv->acpi_reserved && i801_acpi_is_smbus_ioport(priv, address)) { + priv->acpi_reserved = true; + + dev_warn(&pdev->dev, "BIOS is accessing SMBus registers\n"); + dev_warn(&pdev->dev, "Driver SMBus register access inhibited\n"); + + /* + * BIOS is accessing the host controller so prevent it from + * suspending automatically from now on. + */ + pm_runtime_get_sync(&pdev->dev); + } + + if ((function & ACPI_IO_MASK) == ACPI_READ) + status = acpi_os_read_port(address, (u32 *)value, bits); + else + status = acpi_os_write_port(address, (u32)*value, bits); + + mutex_unlock(&priv->acpi_lock); + + return status; +} + +static int i801_acpi_probe(struct i801_priv *priv) +{ + struct acpi_device *adev; + acpi_status status; + + adev = ACPI_COMPANION(&priv->pci_dev->dev); + if (adev) { + status = acpi_install_address_space_handler(adev->handle, + ACPI_ADR_SPACE_SYSTEM_IO, i801_acpi_io_handler, + NULL, priv); + if (ACPI_SUCCESS(status)) + return 0; + } + + return acpi_check_resource_conflict(&priv->pci_dev->resource[SMBBAR]); +} + +static void i801_acpi_remove(struct i801_priv *priv) +{ + struct acpi_device *adev; + + adev = ACPI_COMPANION(&priv->pci_dev->dev); + if (!adev) + return; + + acpi_remove_address_space_handler(adev->handle, + ACPI_ADR_SPACE_SYSTEM_IO, i801_acpi_io_handler); + + mutex_lock(&priv->acpi_lock); + if (priv->acpi_reserved) + pm_runtime_put(&priv->pci_dev->dev); + mutex_unlock(&priv->acpi_lock); +} +#else +static inline int i801_acpi_probe(struct i801_priv *priv) { return 0; } +static inline void i801_acpi_remove(struct i801_priv *priv) { } +#endif + +static unsigned char i801_setup_hstcfg(struct i801_priv *priv) +{ + unsigned char hstcfg = priv->original_hstcfg; + + hstcfg &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */ + hstcfg |= SMBHSTCFG_HST_EN; + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hstcfg); + return hstcfg; +} + +static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + unsigned char temp; + int err, i; + struct i801_priv *priv; + + priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + i2c_set_adapdata(&priv->adapter, priv); + priv->adapter.owner = THIS_MODULE; + priv->adapter.class = i801_get_adapter_class(priv); + priv->adapter.algo = &smbus_algorithm; + priv->adapter.dev.parent = &dev->dev; + ACPI_COMPANION_SET(&priv->adapter.dev, ACPI_COMPANION(&dev->dev)); + priv->adapter.retries = 3; + mutex_init(&priv->acpi_lock); + + priv->pci_dev = dev; + switch (dev->device) { + case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS: + case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS: + case PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS: + case PCI_DEVICE_ID_INTEL_DNV_SMBUS: + case PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS: + case PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS: + priv->features |= FEATURE_BLOCK_PROC; + priv->features |= FEATURE_I2C_BLOCK_READ; + priv->features |= FEATURE_IRQ; + priv->features |= FEATURE_SMBUS_PEC; + priv->features |= FEATURE_BLOCK_BUFFER; + priv->features |= FEATURE_TCO_SPT; + priv->features |= FEATURE_HOST_NOTIFY; + break; + + case PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS: + case PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_CDF_SMBUS: + case PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS: + case PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS: + case PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS: + case PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS: + case PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS: + case PCI_DEVICE_ID_INTEL_EBG_SMBUS: + case PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS: + priv->features |= FEATURE_BLOCK_PROC; + priv->features |= FEATURE_I2C_BLOCK_READ; + priv->features |= FEATURE_IRQ; + priv->features |= FEATURE_SMBUS_PEC; + priv->features |= FEATURE_BLOCK_BUFFER; + priv->features |= FEATURE_TCO_CNL; + priv->features |= FEATURE_HOST_NOTIFY; + break; + + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0: + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1: + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2: + case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0: + case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1: + case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2: + priv->features |= FEATURE_IDF; + fallthrough; + default: + priv->features |= FEATURE_BLOCK_PROC; + priv->features |= FEATURE_I2C_BLOCK_READ; + priv->features |= FEATURE_IRQ; + fallthrough; + case PCI_DEVICE_ID_INTEL_82801DB_3: + priv->features |= FEATURE_SMBUS_PEC; + priv->features |= FEATURE_BLOCK_BUFFER; + fallthrough; + case PCI_DEVICE_ID_INTEL_82801CA_3: + priv->features |= FEATURE_HOST_NOTIFY; + fallthrough; + case PCI_DEVICE_ID_INTEL_82801BA_2: + case PCI_DEVICE_ID_INTEL_82801AB_3: + case PCI_DEVICE_ID_INTEL_82801AA_3: + break; + } + + /* Disable features on user request */ + for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) { + if (priv->features & disable_features & (1 << i)) + dev_notice(&dev->dev, "%s disabled by user\n", + i801_feature_names[i]); + } + priv->features &= ~disable_features; + + err = pcim_enable_device(dev); + if (err) { + dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n", + err); + return err; + } + pcim_pin_device(dev); + + /* Determine the address of the SMBus area */ + priv->smba = pci_resource_start(dev, SMBBAR); + if (!priv->smba) { + dev_err(&dev->dev, + "SMBus base address uninitialized, upgrade BIOS\n"); + return -ENODEV; + } + + if (i801_acpi_probe(priv)) + return -ENODEV; + + err = pcim_iomap_regions(dev, 1 << SMBBAR, + dev_driver_string(&dev->dev)); + if (err) { + dev_err(&dev->dev, + "Failed to request SMBus region 0x%lx-0x%Lx\n", + priv->smba, + (unsigned long long)pci_resource_end(dev, SMBBAR)); + i801_acpi_remove(priv); + return err; + } + + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &priv->original_hstcfg); + temp = i801_setup_hstcfg(priv); + if (!(priv->original_hstcfg & SMBHSTCFG_HST_EN)) + dev_info(&dev->dev, "Enabling SMBus device\n"); + + if (temp & SMBHSTCFG_SMB_SMI_EN) { + dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n"); + /* Disable SMBus interrupt feature if SMBus using SMI# */ + priv->features &= ~FEATURE_IRQ; + } + if (temp & SMBHSTCFG_SPD_WD) + dev_info(&dev->dev, "SPD Write Disable is set\n"); + + /* Clear special mode bits */ + if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER)) + outb_p(inb_p(SMBAUXCTL(priv)) & + ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); + + /* Remember original Host Notify setting */ + if (priv->features & FEATURE_HOST_NOTIFY) + priv->original_slvcmd = inb_p(SMBSLVCMD(priv)); + + /* Default timeout in interrupt mode: 200 ms */ + priv->adapter.timeout = HZ / 5; + + if (dev->irq == IRQ_NOTCONNECTED) + priv->features &= ~FEATURE_IRQ; + + if (priv->features & FEATURE_IRQ) { + u16 pcictl, pcists; + + /* Complain if an interrupt is already pending */ + pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); + if (pcists & SMBPCISTS_INTS) + dev_warn(&dev->dev, "An interrupt is pending!\n"); + + /* Check if interrupts have been disabled */ + pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl); + if (pcictl & SMBPCICTL_INTDIS) { + dev_info(&dev->dev, "Interrupts are disabled\n"); + priv->features &= ~FEATURE_IRQ; + } + } + + if (priv->features & FEATURE_IRQ) { + init_waitqueue_head(&priv->waitq); + + err = devm_request_irq(&dev->dev, dev->irq, i801_isr, + IRQF_SHARED, + dev_driver_string(&dev->dev), priv); + if (err) { + dev_err(&dev->dev, "Failed to allocate irq %d: %d\n", + dev->irq, err); + priv->features &= ~FEATURE_IRQ; + } + } + dev_info(&dev->dev, "SMBus using %s\n", + priv->features & FEATURE_IRQ ? "PCI interrupt" : "polling"); + + i801_add_tco(priv); + + snprintf(priv->adapter.name, sizeof(priv->adapter.name), + "SMBus I801 adapter at %04lx", priv->smba); + err = i2c_add_adapter(&priv->adapter); + if (err) { + i801_acpi_remove(priv); + return err; + } + + i801_enable_host_notify(&priv->adapter); + + i801_probe_optional_slaves(priv); + /* We ignore errors - multiplexing is optional */ + i801_add_mux(priv); + + pci_set_drvdata(dev, priv); + + dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE); + pm_runtime_set_autosuspend_delay(&dev->dev, 1000); + pm_runtime_use_autosuspend(&dev->dev); + pm_runtime_put_autosuspend(&dev->dev); + pm_runtime_allow(&dev->dev); + dev_info(&dev->dev, "wb-i2c-i801 probe ok.\n"); + + return 0; +} + +static void i801_remove(struct pci_dev *dev) +{ + struct i801_priv *priv = pci_get_drvdata(dev); + + pm_runtime_forbid(&dev->dev); + pm_runtime_get_noresume(&dev->dev); + + i801_disable_host_notify(priv); + i801_del_mux(priv); + i2c_del_adapter(&priv->adapter); + i801_acpi_remove(priv); + pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); + + platform_device_unregister(priv->tco_pdev); + + /* + * do not call pci_disable_device(dev) since it can cause hard hangs on + * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010) + */ +} + +static void i801_shutdown(struct pci_dev *dev) +{ + struct i801_priv *priv = pci_get_drvdata(dev); + + /* Restore config registers to avoid hard hang on some systems */ + i801_disable_host_notify(priv); + pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); +} + +#ifdef CONFIG_PM_SLEEP +static int i801_suspend(struct device *dev) +{ + struct i801_priv *priv = dev_get_drvdata(dev); + + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, priv->original_hstcfg); + return 0; +} + +static int i801_resume(struct device *dev) +{ + struct i801_priv *priv = dev_get_drvdata(dev); + + i801_setup_hstcfg(priv); + i801_enable_host_notify(&priv->adapter); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(i801_pm_ops, i801_suspend, i801_resume); + +static struct pci_driver i801_driver = { + .name = "wb_i801_smbus", + .id_table = i801_ids, + .probe = i801_probe, + .remove = i801_remove, + .shutdown = i801_shutdown, + .driver = { + .pm = &i801_pm_ops, + }, +}; + +static int __init i2c_i801_init(void) +{ + if (dmi_name_in_vendors("FUJITSU")) + input_apanel_init(); + return pci_register_driver(&i801_driver); +} + +static void __exit i2c_i801_exit(void) +{ + pci_unregister_driver(&i801_driver); +} + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("I801 SMBus driver"); +MODULE_LICENSE("GPL"); + +module_init(i2c_i801_init); +module_exit(i2c_i801_exit); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c new file mode 100644 index 000000000000..0859cf16539e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c @@ -0,0 +1,1343 @@ +/* + * I2C multiplexer + * + * Copyright (c) 2008-2009 Rodolfo Giometti + * Copyright (c) 2008-2009 Eurotech S.p.A. + * + * This module supports the PCA954x series of I2C multiplexer/switch chips + * made by Philips Semiconductors. + * This includes the: + * PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547 + * and PCA9548. + * + * These chips are all controlled via the I2C bus itself, and all have a + * single 8-bit register. The upstream "parent" bus fans out to two, + * four, or eight downstream busses or channels; which of these + * are selected is determined by the chip type and register contents. A + * mux can select only one sub-bus at a time; a switch can select any + * combination simultaneously. + * + * Based on: + * pca954x.c from Kumar Gala + * Copyright (C) 2006 + * + * Based on: + * pca954x.c from Ken Harrenstien + * Copyright (C) 2004 Google, Inc. (Ken Harrenstien) + * + * Based on: + * i2c-virtual_cb.c from Brian Kuschak + * and + * pca9540.c from Jean Delvare . + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_mux_pca954x.h" + +#define PCA954X_MAX_NCHANS 8 +#define PCA954X_IRQ_OFFSET 4 + +#define I2C_RETRY_TIMES 5 +#define I2C_RETRY_WAIT_TIMES 10 /*delay 10ms*/ + +typedef struct pca9548_cfg_info_s { + uint32_t pca9548_base_nr; + uint32_t pca9548_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; + bool select_chan_check; + bool close_chan_force_reset; +} pca9548_cfg_info_t; + +int g_pca954x_debug = 0; +int g_pca954x_error = 0; + +module_param(g_pca954x_debug, int, S_IRUGO | S_IWUSR); +module_param(g_pca954x_error, int, S_IRUGO | S_IWUSR); + +#define PCA954X_DEBUG(fmt, args...) do { \ + if (g_pca954x_debug) { \ + printk(KERN_INFO "[PCA95x][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define PCA954X_ERROR(fmt, args...) do { \ + if (g_pca954x_error) { \ + printk(KERN_ERR "[PCA95x][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +extern int pca9641_setmuxflag(int nr, int flag); +enum pca_type { + pca_9540, + pca_9542, + pca_9543, + pca_9544, + pca_9545, + pca_9546, + pca_9547, + pca_9548, +}; + +struct chip_desc { + u8 nchans; + u8 enable; /* used for muxes only */ + u8 has_irq; + enum muxtype { + pca954x_ismux = 0, + pca954x_isswi + } muxtype; +}; + +struct pca954x { + const struct chip_desc *chip; + u8 last_chan; /* last register value */ + u8 deselect; + struct i2c_client *client; + struct irq_domain *irq; + unsigned int irq_mask; + raw_spinlock_t lock; + pca9548_cfg_info_t pca9548_cfg_info; /* pca9548 reset cfg */ +}; + +/* Provide specs for the PCA954x types we know about */ +static const struct chip_desc chips[] = { + [pca_9540] = { + .nchans = 2, + .enable = 0x4, + .muxtype = pca954x_ismux, + }, + [pca_9542] = { + .nchans = 2, + .enable = 0x4, + .has_irq = 1, + .muxtype = pca954x_ismux, + }, + [pca_9543] = { + .nchans = 2, + .has_irq = 1, + .muxtype = pca954x_isswi, + }, + [pca_9544] = { + .nchans = 4, + .enable = 0x4, + .has_irq = 1, + .muxtype = pca954x_ismux, + }, + [pca_9545] = { + .nchans = 4, + .has_irq = 1, + .muxtype = pca954x_isswi, + }, + [pca_9546] = { + .nchans = 4, + .muxtype = pca954x_isswi, + }, + [pca_9547] = { + .nchans = 8, + .enable = 0x8, + .muxtype = pca954x_ismux, + }, + [pca_9548] = { + .nchans = 8, + .muxtype = pca954x_isswi, + }, +}; + +static const struct i2c_device_id pca954x_id[] = { + { "wb_pca9540", pca_9540 }, + { "wb_pca9542", pca_9542 }, + { "wb_pca9543", pca_9543 }, + { "wb_pca9544", pca_9544 }, + { "wb_pca9545", pca_9545 }, + { "wb_pca9546", pca_9546 }, + { "wb_pca9547", pca_9547 }, + { "wb_pca9548", pca_9548 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, pca954x_id); + +#ifdef CONFIG_OF +static const struct of_device_id pca954x_of_match[] = { + { .compatible = "nxp,wb_pca9540", .data = &chips[pca_9540] }, + { .compatible = "nxp,wb_pca9542", .data = &chips[pca_9542] }, + { .compatible = "nxp,wb_pca9543", .data = &chips[pca_9543] }, + { .compatible = "nxp,wb_pca9544", .data = &chips[pca_9544] }, + { .compatible = "nxp,wb_pca9545", .data = &chips[pca_9545] }, + { .compatible = "nxp,wb_pca9546", .data = &chips[pca_9546] }, + { .compatible = "nxp,wb_pca9547", .data = &chips[pca_9547] }, + { .compatible = "nxp,wb_pca9548", .data = &chips[pca_9548] }, + {} +}; +MODULE_DEVICE_TABLE(of, pca954x_of_match); +#endif + +/* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer() + for this as they will try to lock adapter a second time */ +static int pca954x_reg_write(struct i2c_adapter *adap, + struct i2c_client *client, u8 val) +{ + int ret = -ENODEV; + + if (adap->algo->master_xfer) { + struct i2c_msg msg; + char buf[1]; + + msg.addr = client->addr; + msg.flags = 0; + msg.len = 1; + buf[0] = val; + msg.buf = buf; + ret = __i2c_transfer(adap, &msg, 1); + + if (ret >= 0 && ret != 1) + ret = -EREMOTEIO; + } else { + union i2c_smbus_data data; + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_WRITE, + val, I2C_SMBUS_BYTE, &data); + } + return ret; +} + + static int pca954x_reg_read(struct i2c_adapter *adap, + struct i2c_client *client, u8 *val) + { + int ret = -ENODEV; + u8 tmp_val; + + if (adap->algo->master_xfer) { + struct i2c_msg msg; + + msg.addr = client->addr; + msg.flags = I2C_M_RD; + msg.len = 1; + msg.buf = &tmp_val; + ret = __i2c_transfer(adap, &msg, 1); + + if (ret >= 0 && ret != 1) + ret = -EREMOTEIO; + } else { + union i2c_smbus_data data; + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_READ, + 0, I2C_SMBUS_BYTE, &data); + + if (!ret) { + tmp_val = data.byte; + } + } + + *val = tmp_val; + return ret; + } + +static int pca954x_setmuxflag(struct i2c_client *client, int flag) +{ + struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); + + pca9641_setmuxflag(adap->nr, flag); + return 0; +} + +static int pca9548_gpio_init(gpio_attr_t *gpio_attr) +{ + int err; + + if (gpio_attr->gpio_init) { + PCA954X_DEBUG("gpio%d already init, do nothing.\n", gpio_attr->gpio); + return 0; + } + + PCA954X_DEBUG("gpio%d init.\n", gpio_attr->gpio); + err = gpio_request(gpio_attr->gpio, "pca9548_reset"); + if (err) { + goto error; + } + err = gpio_direction_output(gpio_attr->gpio, gpio_attr->reset_off); + if (err) { + gpio_free(gpio_attr->gpio); + goto error; + } + gpio_attr->gpio_init = 1; + return 0; +error: + PCA954X_ERROR("pca9548_gpio_init failed, ret:%d.\n", err); + return err; +} + +static void pca9548_gpio_free(gpio_attr_t *gpio_attr) +{ + if (gpio_attr->gpio_init == 1) { + PCA954X_DEBUG("gpio%d release.\n", gpio_attr->gpio); + gpio_free(gpio_attr->gpio); + gpio_attr->gpio_init = 0; + } +} + +static int pca954x_reset_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + PCA954X_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA954X_ERROR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca954x_reset_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + PCA954X_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA954X_ERROR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca954x_reset_i2c_read(uint32_t bus, uint32_t addr, uint32_t offset_addr, + unsigned char *buf, uint32_t size) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i ,j ; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA954X_ERROR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = addr; + for (j = 0 ;j < size ;j++) { + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_read_byte_data(&client, (offset_addr + j)); + if (rv < 0) { + PCA954X_ERROR("i2c read failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + *(buf + j) = (unsigned char)rv; + break; + } + } +out: + filp_close(fp, NULL); + return rv; +} + +static int pca954x_reset_i2c_write(uint32_t bus, uint32_t dev_addr, uint32_t offset_addr, + uint8_t write_buf) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA954X_ERROR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = dev_addr; + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_write_byte_data(&client, offset_addr, write_buf); + if (rv < 0) { + PCA954X_ERROR("i2c write failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + break; + } +out: + filp_close(fp, NULL); + return rv; +} + +static void pca954x_close_chan_finally(struct i2c_mux_core * muxc) +{ + struct pca954x *data; + struct i2c_adapter *adapter; + struct i2c_client *client; + int adapter_timeout; + + data = i2c_mux_priv(muxc); + client = data->client; + adapter = muxc->parent; + /* get bus info */ + while (i2c_parent_is_i2c_adapter(adapter)) { + adapter = to_i2c_adapter(adapter->dev.parent); + } + adapter_timeout = adapter->timeout; + adapter->timeout = msecs_to_jiffies(50); + pca954x_reg_write(muxc->parent, client, data->last_chan); + adapter->timeout = adapter_timeout; + + return; +} + +static int pca954x_do_file_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + file_attr_t *file_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + file_attr = &reset_cfg->attr.file_attr; + ret = -1; + + PCA954X_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA954X_DEBUG("dev_name:%s, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + file_attr->dev_name, file_attr->offset, file_attr->mask, + file_attr->reset_on, file_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca954x_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= ~(file_attr->mask); + val |= file_attr->reset_on; + err = pca954x_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(file_attr->mask); + val |= file_attr->reset_off; + err = pca954x_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca954x_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (file_attr->mask); + if (val == file_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_file_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA954X_ERROR("pca954x_do_file_reset timeout.\n"); + } +out: + if (err < 0) { + PCA954X_ERROR("pca954x_do_file_reset file rd/wr failed, ret:%d.\n", err); + } + + return ret; +} + +static int pca954x_do_io_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + io_attr_t *io_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + io_attr = &reset_cfg->attr.io_attr; + + PCA954X_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA954X_DEBUG("io_addr:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + io_attr->io_addr, io_attr->mask, io_attr->reset_on, io_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + val = inb(io_attr->io_addr); + val &= ~(io_attr->mask); + val |= io_attr->reset_on; + outb(val, io_attr->io_addr); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(io_attr->mask); + val |= io_attr->reset_off; + outb(val, io_attr->io_addr); + + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = inb(io_attr->io_addr); + val &= (io_attr->mask); + if (val == io_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_io_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA954X_ERROR("pca954x_do_io_reset timeout.\n"); + } + + return ret; +} + +static int pca954x_do_gpio_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + gpio_attr_t *gpio_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + gpio_attr = &reset_cfg->attr.gpio_attr; + + ret = pca9548_gpio_init(gpio_attr); + if (ret) { + return -1; + } + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + /* reset on */ + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_on); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + /* reset off */ + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_off); + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = __gpio_get_value(gpio_attr->gpio); + if (val == gpio_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_gpio_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + /* 1MS schedule*/ + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA954X_ERROR("pca954x_do_gpio_reset timeout.\n"); + } + + pca9548_gpio_free(gpio_attr); + return ret; +} + +static int pca954x_do_i2c_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + i2c_attr_t *i2c_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + i2c_attr = &reset_cfg->attr.i2c_attr; + ret = -1; + + PCA954X_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA954X_DEBUG("bus:0x%x, addr:0x%x, reg:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + i2c_attr->i2c_bus, i2c_attr->i2c_addr, i2c_attr->reg_offset, + i2c_attr->mask, i2c_attr->reset_on, i2c_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca954x_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_on; + err = pca954x_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_off; + err = pca954x_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca954x_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (i2c_attr->mask); + if (val == i2c_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_i2c_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA954X_ERROR("pca954x_do_i2c_reset timeout.\n"); + } +out: + if (err < 0) { + PCA954X_ERROR("pca954x_do_i2c_reset i2c op failed, ret:%d.\n", err); + } + return ret; +} + +static int pca954x_do_reset(struct i2c_mux_core *muxc) +{ + int ret; + struct pca954x *data; + + data = i2c_mux_priv(muxc); + if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_NONE) { + ret = -1; + PCA954X_DEBUG("Don't need to reset.\n"); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_I2C) { + ret = pca954x_do_i2c_reset(muxc); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_GPIO) { + ret = pca954x_do_gpio_reset(muxc); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_IO) { + ret = pca954x_do_io_reset(muxc); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_FILE) { + ret = pca954x_do_file_reset(muxc); + } else { + ret = -1; + PCA954X_ERROR("Unsupport reset type:0x%x.\n", + data->pca9548_cfg_info.pca9548_reset_type); + } + + if (ret < 0) { + PCA954X_ERROR("pca9548_reset_ctrl failed, reset type:%u, ret:%d.\n", + data->pca9548_cfg_info.pca9548_reset_type, ret); + } + return ret; +} + +static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + const struct chip_desc *chip = data->chip; + u8 regval; + int ret = 0; + u8 read_val = 0; + int rv; + + /* we make switches look like muxes, not sure how to be smarter */ + if (chip->muxtype == pca954x_ismux) + regval = chan | chip->enable; + else + regval = 1 << chan; + + /* Only select the channel if its different from the last channel */ + if (data->last_chan != regval) { + pca954x_setmuxflag(client, 0); + ret = pca954x_reg_write(muxc->parent, client, regval); + data->last_chan = ret < 0 ? 0 : regval; + } + + if (data->pca9548_cfg_info.select_chan_check) { /* check chan */ + ret = pca954x_reg_read(muxc->parent, client, &read_val); + /* read failed or chan not open, reset pca9548 */ + if ((ret < 0) || (read_val != data->last_chan)) { + dev_warn(&client->dev, "pca954x open channle %u failed, do reset.\n", chan); + PCA954X_DEBUG("ret = %d, read_val = %d, last_chan = %d.\n", ret, read_val, data->last_chan); + rv = pca954x_do_reset(muxc); + if (rv >= 0) { + PCA954X_DEBUG("pca954x_do_reset success, rv = %d.\n", rv); + } else { + PCA954X_DEBUG("pca954x_do_reset failed, rv = %d.\n", rv); + } + if (ret >= 0) { + ret = -EIO; /* chan not match, return IO error */ + } + } + } + + return ret; +} + +static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int ret, rv; + + /* Deselect active channel */ + data->last_chan = 0; + if (data->pca9548_cfg_info.close_chan_force_reset) { + ret = pca954x_do_reset(muxc); + } else { + ret = pca954x_reg_write(muxc->parent, client, data->last_chan); + if (ret < 0 ) { + + dev_warn(&client->dev, "pca954x close channel %u failed, do reset.\n", chan); + rv = pca954x_do_reset(muxc); + if (rv == 0) { + ret = 0; + } + } + } + + pca954x_setmuxflag(client, 1); + (void)pca954x_reg_write(muxc->parent, client, data->last_chan); + + return ret; + +} + +static irqreturn_t pca954x_irq_handler(int irq, void *dev_id) +{ + struct pca954x *data = dev_id; + unsigned int child_irq; + int ret, i, handled = 0; + + ret = i2c_smbus_read_byte(data->client); + if (ret < 0) + return IRQ_NONE; + + for (i = 0; i < data->chip->nchans; i++) { + if (ret & BIT(PCA954X_IRQ_OFFSET + i)) { + child_irq = irq_linear_revmap(data->irq, i); + handle_nested_irq(child_irq); + handled++; + } + } + return handled ? IRQ_HANDLED : IRQ_NONE; +} + +static void pca954x_irq_mask(struct irq_data *idata) +{ + struct pca954x *data = irq_data_get_irq_chip_data(idata); + unsigned int pos = idata->hwirq; + unsigned long flags; + + raw_spin_lock_irqsave(&data->lock, flags); + + data->irq_mask &= ~BIT(pos); + if (!data->irq_mask) + disable_irq(data->client->irq); + + raw_spin_unlock_irqrestore(&data->lock, flags); +} + +static void pca954x_irq_unmask(struct irq_data *idata) +{ + struct pca954x *data = irq_data_get_irq_chip_data(idata); + unsigned int pos = idata->hwirq; + unsigned long flags; + + raw_spin_lock_irqsave(&data->lock, flags); + + if (!data->irq_mask) + enable_irq(data->client->irq); + data->irq_mask |= BIT(pos); + + raw_spin_unlock_irqrestore(&data->lock, flags); +} + +static int pca954x_irq_set_type(struct irq_data *idata, unsigned int type) +{ + if ((type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_LEVEL_LOW) + return -EINVAL; + return 0; +} + +static struct irq_chip pca954x_irq_chip = { + .name = "i2c-mux-pca954x", + .irq_mask = pca954x_irq_mask, + .irq_unmask = pca954x_irq_unmask, + .irq_set_type = pca954x_irq_set_type, +}; + +static int of_pca954x_irq_setup(struct i2c_mux_core *muxc) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int c, err, irq; + + if (!data->chip->has_irq || client->irq <= 0) + return 0; + + raw_spin_lock_init(&data->lock); + + data->irq = irq_domain_add_linear(client->dev.of_node, + data->chip->nchans, + &irq_domain_simple_ops, data); + if (!data->irq) + return -ENODEV; + + for (c = 0; c < data->chip->nchans; c++) { + irq = irq_create_mapping(data->irq, c); + irq_set_chip_data(irq, data); + irq_set_chip_and_handler(irq, &pca954x_irq_chip, + handle_simple_irq); + } + + err = devm_request_threaded_irq(&client->dev, data->client->irq, NULL, + pca954x_irq_handler, + IRQF_ONESHOT | IRQF_SHARED, + "pca954x", data); + if (err) + goto err_req_irq; + + disable_irq(data->client->irq); + + return 0; +err_req_irq: + for (c = 0; c < data->chip->nchans; c++) { + irq = irq_find_mapping(data->irq, c); + irq_dispose_mapping(irq); + } + irq_domain_remove(data->irq); + + return err; +} + +static int pca954x_irq_setup(struct i2c_mux_core *muxc) +{ + return 0; +} + +static int of_pca954x_reset_data_init(struct pca954x *data) +{ + int err; + struct device *dev = &data->client->dev; + pca9548_cfg_info_t *reset_cfg; + + reset_cfg = &data->pca9548_cfg_info; + if (dev == NULL || dev->of_node == NULL) { + PCA954X_DEBUG("dev or dev->of_node is NUll, no reset.\n"); + reset_cfg->pca9548_reset_type = PCA9548_RESET_NONE; + return 0; + } + + reset_cfg->select_chan_check = of_property_read_bool(dev->of_node, "select_chan_check"); + reset_cfg->close_chan_force_reset = of_property_read_bool(dev->of_node, "close_chan_force_reset"); + PCA954X_DEBUG("select_chan_check:%d, close_chan_force_reset:%d.\n", reset_cfg->select_chan_check, + reset_cfg->close_chan_force_reset); + + if (of_property_read_u32(dev->of_node, "pca9548_reset_type", &reset_cfg->pca9548_reset_type)) { + + PCA954X_DEBUG("pca9548_reset_type not found, no reset.\n"); + reset_cfg->pca9548_reset_type = PCA9548_RESET_NONE; + return 0; + } + err = of_property_read_u32(dev->of_node, "rst_delay_b", &reset_cfg->rst_delay_b); + err |= of_property_read_u32(dev->of_node, "rst_delay", &reset_cfg->rst_delay); + err |= of_property_read_u32(dev->of_node, "rst_delay_a", &reset_cfg->rst_delay_a); + + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9548_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9548_reset_type == PCA9548_RESET_I2C) { + + PCA954X_DEBUG("reset by i2c.\n"); + err = of_property_read_u32(dev->of_node, "i2c_bus", &reset_cfg->attr.i2c_attr.i2c_bus); + err |=of_property_read_u32(dev->of_node, "i2c_addr", &reset_cfg->attr.i2c_attr.i2c_addr); + err |=of_property_read_u32(dev->of_node, "reg_offset", &reset_cfg->attr.i2c_attr.reg_offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.i2c_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.i2c_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.i2c_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_GPIO) { + + PCA954X_DEBUG("reset by gpio.\n"); + err = of_property_read_u32(dev->of_node, "gpio", &reset_cfg->attr.gpio_attr.gpio); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.gpio_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.gpio_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_IO) { + + PCA954X_DEBUG("reset by io.\n"); + err = of_property_read_u32(dev->of_node, "io_addr", &reset_cfg->attr.io_attr.io_addr); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.io_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.io_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.io_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_FILE) { + + PCA954X_DEBUG("reset by file.\n"); + err = of_property_read_string(dev->of_node, "dev_name", &reset_cfg->attr.file_attr.dev_name); + err |=of_property_read_u32(dev->of_node, "offset", &reset_cfg->attr.file_attr.offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.file_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.file_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.file_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA954X_ERROR("Unsupport reset type:%d.\n", reset_cfg->pca9548_reset_type); + goto dts_config_err; + } + return 0; +dts_config_err: + PCA954X_ERROR("dts config error, ret:%d.\n", err); + return -EINVAL; +} + +static int pca954x_reset_data_init(struct pca954x *data) +{ + pca9548_cfg_info_t *reset_cfg; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device; + + if (data->client->dev.platform_data == NULL) { + PCA954X_DEBUG("pca954x has no reset platform data config.\n"); + return 0; + } + reset_cfg = &data->pca9548_cfg_info; + i2c_mux_pca954x_device = data->client->dev.platform_data; + reset_cfg->select_chan_check = i2c_mux_pca954x_device->select_chan_check; + reset_cfg->close_chan_force_reset = i2c_mux_pca954x_device->close_chan_force_reset; + PCA954X_DEBUG("select_chan_check:%d, close_chan_force_reset:%d.\n", reset_cfg->select_chan_check, + reset_cfg->close_chan_force_reset); + + reset_cfg->pca9548_reset_type = i2c_mux_pca954x_device->pca9548_reset_type; + if (reset_cfg->pca9548_reset_type == PCA9548_RESET_NONE) { + PCA954X_DEBUG("pca9548_reset_type not found, no reset.\n"); + return 0; + } + + reset_cfg->rst_delay_b = i2c_mux_pca954x_device->rst_delay_b; + reset_cfg->rst_delay = i2c_mux_pca954x_device->rst_delay; + reset_cfg->rst_delay_a = i2c_mux_pca954x_device->rst_delay_a; + PCA954X_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9548_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9548_reset_type == PCA9548_RESET_I2C) { + + PCA954X_DEBUG("reset by i2c.\n"); + reset_cfg->attr.i2c_attr.i2c_bus = i2c_mux_pca954x_device->attr.i2c_attr.i2c_bus; + reset_cfg->attr.i2c_attr.i2c_addr = i2c_mux_pca954x_device->attr.i2c_attr.i2c_addr; + reset_cfg->attr.i2c_attr.reg_offset = i2c_mux_pca954x_device->attr.i2c_attr.reg_offset; + reset_cfg->attr.i2c_attr.mask = i2c_mux_pca954x_device->attr.i2c_attr.mask; + reset_cfg->attr.i2c_attr.reset_on = i2c_mux_pca954x_device->attr.i2c_attr.reset_on; + reset_cfg->attr.i2c_attr.reset_off = i2c_mux_pca954x_device->attr.i2c_attr.reset_off; + PCA954X_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_GPIO) { + + PCA954X_DEBUG("reset by gpio.\n"); + reset_cfg->attr.gpio_attr.gpio = i2c_mux_pca954x_device->attr.gpio_attr.gpio; + reset_cfg->attr.gpio_attr.reset_on = i2c_mux_pca954x_device->attr.gpio_attr.reset_on; + reset_cfg->attr.gpio_attr.reset_off = i2c_mux_pca954x_device->attr.gpio_attr.reset_off; + PCA954X_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_IO) { + + PCA954X_DEBUG("reset by io.\n"); + reset_cfg->attr.io_attr.io_addr = i2c_mux_pca954x_device->attr.io_attr.io_addr; + reset_cfg->attr.io_attr.mask = i2c_mux_pca954x_device->attr.io_attr.mask; + reset_cfg->attr.io_attr.reset_on = i2c_mux_pca954x_device->attr.io_attr.reset_on; + reset_cfg->attr.io_attr.reset_off = i2c_mux_pca954x_device->attr.io_attr.reset_off; + PCA954X_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_FILE) { + + reset_cfg->attr.file_attr.dev_name = i2c_mux_pca954x_device->attr.file_attr.dev_name; + reset_cfg->attr.file_attr.offset = i2c_mux_pca954x_device->attr.file_attr.offset; + reset_cfg->attr.file_attr.mask = i2c_mux_pca954x_device->attr.file_attr.mask; + reset_cfg->attr.file_attr.reset_on = i2c_mux_pca954x_device->attr.file_attr.reset_on; + reset_cfg->attr.file_attr.reset_off = i2c_mux_pca954x_device->attr.file_attr.reset_off; + PCA954X_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA954X_ERROR("Unsupport reset type:%d.\n", reset_cfg->pca9548_reset_type); + return -EINVAL; + } + return 0; +} + +/* + * I2C init/probing/exit functions + */ +static int pca954x_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); + struct device_node *of_node = client->dev.of_node; + bool idle_disconnect_dt; + struct gpio_desc *gpio; + int num, force, class; + struct i2c_mux_core *muxc; + struct pca954x *data; + const struct of_device_id *match; + unsigned int probe_disable; + int ret, dynamic_nr; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device; + + PCA954X_DEBUG("pca954x_probe, parent bus: %d, 9548 addr:0x%x.\n", adap->nr, client->addr); + + if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE)) + return -ENODEV; + + muxc = i2c_mux_alloc(adap, &client->dev, + PCA954X_MAX_NCHANS, sizeof(*data), 0, + pca954x_select_chan, pca954x_deselect_mux); + if (!muxc) + return -ENOMEM; + data = i2c_mux_priv(muxc); + + i2c_set_clientdata(client, muxc); + data->client = client; + + /* Get the mux out of reset if a reset GPIO is specified. */ + gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(gpio)) + return PTR_ERR(gpio); + + /* check device connection status */ + + if (client->dev.of_node == NULL) { + if (client->dev.platform_data == NULL) { + probe_disable = 1; + PCA954X_DEBUG("has no platform data config, set probe_disable = 1.\n"); + } else { + i2c_mux_pca954x_device = client->dev.platform_data; + probe_disable = i2c_mux_pca954x_device->probe_disable; + } + } else { + probe_disable = of_property_read_bool(of_node, "probe_disable"); + } + + /* Write the mux register at addr to verify + * that the mux is in fact present. This also + * initializes the mux to disconnected state. + */ + if (!probe_disable && (i2c_smbus_write_byte(client, 0) < 0)) { + dev_warn(&client->dev, "probe failed\n"); + return -ENODEV; + } + + match = of_match_device(of_match_ptr(pca954x_of_match), &client->dev); + if (match) + data->chip = of_device_get_match_data(&client->dev); + else + data->chip = &chips[id->driver_data]; + + data->last_chan = 0; /* force the first selection */ + + if (client->dev.of_node == NULL) { + idle_disconnect_dt = false; + } else { + idle_disconnect_dt = of_node && + of_property_read_bool(of_node, "i2c-mux-idle-disconnect"); + } + + if (client->dev.of_node) { + ret= of_pca954x_reset_data_init(data); + } else { + ret= pca954x_reset_data_init(data); + } + if (ret < 0) { + dev_err(&client->dev, "pca954x reset config err, ret:%d.\n", ret); + return ret; + } + + if (client->dev.of_node) { + ret = of_pca954x_irq_setup(muxc); + } else { + ret = pca954x_irq_setup(muxc); + } + if (ret) { + goto fail_del_adapters; + } + + if (client->dev.of_node == NULL) { + if (client->dev.platform_data == NULL) { + dynamic_nr = 1; + PCA954X_DEBUG("platform data is NULL, use dynamic adap number.\n"); + } else { + i2c_mux_pca954x_device = client->dev.platform_data; + data->pca9548_cfg_info.pca9548_base_nr = i2c_mux_pca954x_device->pca9548_base_nr; + if (data->pca9548_cfg_info.pca9548_base_nr == 0) { + dynamic_nr = 1; + PCA954X_DEBUG("pca9548_base_nr = 0, use dynamic adap number.\n"); + } else { + dynamic_nr = 0; + PCA954X_DEBUG("pca9548_base_nr:%u.\n", data->pca9548_cfg_info.pca9548_base_nr); + } + } + } else { + if (of_property_read_u32(of_node, "pca9548_base_nr", &data->pca9548_cfg_info.pca9548_base_nr)) { + + dynamic_nr = 1; + PCA954X_DEBUG("pca9548_base_nr not found, use dynamic adap number"); + } else { + dynamic_nr = 0; + PCA954X_DEBUG("pca9548_base_nr:%u.\n", data->pca9548_cfg_info.pca9548_base_nr); + } + } + + /* Now create an adapter for each channel */ + for (num = 0; num < data->chip->nchans; num++) { + bool idle_disconnect_pd = false; + if (dynamic_nr == 1) { + force = 0; /* dynamic adap number */ + } else { + force = data->pca9548_cfg_info.pca9548_base_nr + num; + } + + class = 0; /* no class by default */ + data->deselect |= (idle_disconnect_pd || + idle_disconnect_dt) << num; + + ret = i2c_mux_add_adapter(muxc, force, num, class); + if (ret) + goto fail_del_adapters; + } + + dev_info(&client->dev, + "registered %d multiplexed busses for I2C %s %s\n", + num, data->chip->muxtype == pca954x_ismux + ? "mux" : "switch", client->name); + + return 0; + +fail_del_adapters: + i2c_mux_del_adapters(muxc); + return ret; +} + +static int pca954x_remove(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca954x *data = i2c_mux_priv(muxc); + int c, irq; + + if (data->irq) { + for (c = 0; c < data->chip->nchans; c++) { + irq = irq_find_mapping(data->irq, c); + irq_dispose_mapping(irq); + } + irq_domain_remove(data->irq); + } + + i2c_mux_del_adapters(muxc); + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int pca954x_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca954x *data = i2c_mux_priv(muxc); + + data->last_chan = 0; + return i2c_smbus_write_byte(client, 0); +} +#endif + +static SIMPLE_DEV_PM_OPS(pca954x_pm, NULL, pca954x_resume); + +static struct i2c_driver pca954x_driver = { + .driver = { + .name = "wb_pca954x", + .pm = &pca954x_pm, + .of_match_table = of_match_ptr(pca954x_of_match), + }, + .probe = pca954x_probe, + .remove = pca954x_remove, + .id_table = pca954x_id, +}; + +module_i2c_driver(pca954x_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PCA954x I2C mux/switch driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h new file mode 100644 index 000000000000..9cbe162782c5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h @@ -0,0 +1,67 @@ +#ifndef __WB_I2C_MUX_PCA954X_H__ +#define __WB_I2C_MUX_PCA954X_H__ + +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum pca9548_reset_type_s { + PCA9548_RESET_NONE = 0, + PCA9548_RESET_I2C = 1, + PCA9548_RESET_GPIO = 2, + PCA9548_RESET_IO = 3, + PCA9548_RESET_FILE = 4, +} pca9548_reset_type_t; + +typedef struct i2c_attr_s { + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t reg_offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} i2c_attr_t; + +typedef struct io_attr_s { + uint32_t io_addr; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} io_attr_t; + +typedef struct file_attr_s { + const char *dev_name; + uint32_t offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} file_attr_t; + +typedef struct gpio_attr_s { + int gpio_init; + uint32_t gpio; + uint32_t reset_on; + uint32_t reset_off; +} gpio_attr_t; + +typedef struct i2c_mux_pca954x_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t pca9548_base_nr; + uint32_t pca9548_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + bool probe_disable; + bool select_chan_check; + bool close_chan_force_reset; + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; +} i2c_mux_pca954x_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c new file mode 100644 index 000000000000..9945f6fcad25 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c @@ -0,0 +1,1375 @@ +/* + * I2C multiplexer driver for PCA9541 bus master selector + * + * Copyright (c) 2010 Ericsson AB. + * + * Author: Guenter Roeck + * + * Derived from: + * pca954x.c + * + * Copyright (c) 2008-2009 Rodolfo Giometti + * Copyright (c) 2008-2009 Eurotech S.p.A. + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_mux_pca9641.h" + +/* + * The PCA9541 is a bus master selector. It supports two I2C masters connected + * to a single slave bus. + * + * Before each bus transaction, a master has to acquire bus ownership. After the + * transaction is complete, bus ownership has to be released. This fits well + * into the I2C multiplexer framework, which provides select and release + * functions for this purpose. For this reason, this driver is modeled as + * single-channel I2C bus multiplexer. + * + * This driver assumes that the two bus masters are controlled by two different + * hosts. If a single host controls both masters, platform code has to ensure + * that only one of the masters is instantiated at any given time. + */ + +#define PCA9541_CONTROL 0x01 +#define PCA9541_ISTAT 0x02 + +#define PCA9541_CTL_MYBUS (1 << 0) +#define PCA9541_CTL_NMYBUS (1 << 1) +#define PCA9541_CTL_BUSON (1 << 2) +#define PCA9541_CTL_NBUSON (1 << 3) +#define PCA9541_CTL_BUSINIT (1 << 4) +#define PCA9541_CTL_TESTON (1 << 6) +#define PCA9541_CTL_NTESTON (1 << 7) +#define PCA9541_ISTAT_INTIN (1 << 0) +#define PCA9541_ISTAT_BUSINIT (1 << 1) +#define PCA9541_ISTAT_BUSOK (1 << 2) +#define PCA9541_ISTAT_BUSLOST (1 << 3) +#define PCA9541_ISTAT_MYTEST (1 << 6) +#define PCA9541_ISTAT_NMYTEST (1 << 7) +#define PCA9641_ID 0x00 +#define PCA9641_ID_MAGIC 0x38 +#define PCA9641_CONTROL 0x01 +#define PCA9641_STATUS 0x02 +#define PCA9641_TIME 0x03 +#define PCA9641_CTL_LOCK_REQ BIT(0) +#define PCA9641_CTL_LOCK_GRANT BIT(1) +#define PCA9641_CTL_BUS_CONNECT BIT(2) +#define PCA9641_CTL_BUS_INIT BIT(3) +#define PCA9641_CTL_SMBUS_SWRST BIT(4) +#define PCA9641_CTL_IDLE_TIMER_DIS BIT(5) +#define PCA9641_CTL_SMBUS_DIS BIT(6) +#define PCA9641_CTL_PRIORITY BIT(7) +#define PCA9641_STS_OTHER_LOCK BIT(0) +#define PCA9641_STS_BUS_INIT_FAIL BIT(1) +#define PCA9641_STS_BUS_HUNG BIT(2) +#define PCA9641_STS_MBOX_EMPTY BIT(3) +#define PCA9641_STS_MBOX_FULL BIT(4) +#define PCA9641_STS_TEST_INT BIT(5) +#define PCA9641_STS_SCL_IO BIT(6) +#define PCA9641_STS_SDA_IO BIT(7) +#define PCA9641_RES_TIME 0x03 +#define BUSON (PCA9541_CTL_BUSON | PCA9541_CTL_NBUSON) +#define MYBUS (PCA9541_CTL_MYBUS | PCA9541_CTL_NMYBUS) +#define mybus(x) (!((x) & MYBUS) || ((x) & MYBUS) == MYBUS) +#define busoff(x) (!((x) & BUSON) || ((x) & BUSON) == BUSON) +#define BUSOFF(x, y) (!((x) & PCA9641_CTL_LOCK_GRANT) && \ + !((y) & PCA9641_STS_OTHER_LOCK)) +#define other_lock(x) ((x) & PCA9641_STS_OTHER_LOCK) +#define lock_grant(x) ((x) & PCA9641_CTL_LOCK_GRANT) + +#define PCA9641_RETRY_TIME (8) +#define PCA9641_RESET_DELAY (150) + +typedef struct i2c_muxs_struct_flag +{ + int nr; + char name[48]; + struct mutex update_lock; + int flag; +}i2c_mux_flag; + +i2c_mux_flag pca_flag = { + .flag = -1, +}; + +int pca9641_setmuxflag(int nr, int flag) +{ + if (pca_flag.nr == nr) { + pca_flag.flag = flag; + } + return 0; +} +EXPORT_SYMBOL(pca9641_setmuxflag); + +static int g_debug_info = 0; +static int g_debug_err = 0; + +module_param(g_debug_info, int, S_IRUGO | S_IWUSR); +module_param(g_debug_err, int, S_IRUGO | S_IWUSR); + +#define PCA_DEBUG(fmt, args...) do { \ + if (g_debug_info) { \ + printk(KERN_INFO "[pca9641][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define PCA_DEBUG_ERR(fmt, args...) do { \ + if (g_debug_err) { \ + printk(KERN_ERR "[pca9641][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/* arbitration timeouts, in jiffies */ +#define ARB_TIMEOUT (HZ / 8) /* 125 ms until forcing bus ownership */ +#define ARB2_TIMEOUT (HZ / 4) /* 250 ms until acquisition failure */ + +/* arbitration retry delays, in us */ +#define SELECT_DELAY_SHORT 50 +#define SELECT_DELAY_LONG 1000 +#define I2C_RETRY_TIMES (5) +#define I2C_RETRY_WAIT_TIMES (10) /*delay 10ms*/ + +typedef struct pca9641_cfg_info_s { + uint32_t pca9641_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; +} pca9641_cfg_info_t; + +struct pca9541 { + struct i2c_client *client; + unsigned long select_timeout; + unsigned long arb_timeout; + uint32_t pca9641_nr; + pca9641_cfg_info_t pca9641_cfg_info; /* pca9641 reset cfg */ +}; + +static const struct i2c_device_id pca9541_id[] = { + {"wb_pca9541", 0}, + {"wb_pca9641", 1}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, pca9541_id); + +#ifdef CONFIG_OF +static const struct of_device_id pca9541_of_match[] = { + { .compatible = "nxp,wb_pca9541" }, + { .compatible = "nxp,wb_pca9641" }, + {} +}; +MODULE_DEVICE_TABLE(of, pca9541_of_match); +#endif + +static int pca9641_gpio_init(gpio_attr_t *gpio_attr) +{ + int err; + + if (gpio_attr->gpio_init) { + PCA_DEBUG("gpio%d already init, do nothing.\n", gpio_attr->gpio); + return 0; + } + + PCA_DEBUG("gpio%d init.\n", gpio_attr->gpio); + err = gpio_request(gpio_attr->gpio, "pca9641_reset"); + if (err) { + goto error; + } + err = gpio_direction_output(gpio_attr->gpio, gpio_attr->reset_off); + if (err) { + gpio_free(gpio_attr->gpio); + goto error; + } + gpio_attr->gpio_init = 1; + return 0; +error: + PCA_DEBUG_ERR("pca9641_gpio_init failed, ret:%d.\n", err); + return err; +} + +static void pca9641_gpio_free(gpio_attr_t *gpio_attr) +{ + if (gpio_attr->gpio_init == 1) { + PCA_DEBUG("gpio%d release.\n", gpio_attr->gpio); + gpio_free(gpio_attr->gpio); + gpio_attr->gpio_init = 0; + } + return; +} + +static int pca9641_reset_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + PCA_DEBUG_ERR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA_DEBUG_ERR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca9641_reset_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + PCA_DEBUG_ERR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA_DEBUG_ERR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca9641_reset_i2c_read(uint32_t bus, uint32_t addr, uint32_t offset_addr, + unsigned char *buf, uint32_t size) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i, j; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA_DEBUG_ERR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = addr; + for (j = 0; j < size; j++) { + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_read_byte_data(&client, (offset_addr + j)); + if (rv < 0) { + PCA_DEBUG_ERR("i2c read failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + *(buf + j) = (unsigned char)rv; + break; + } + } +out: + filp_close(fp, NULL); + return rv; +} + +static int pca9641_reset_i2c_write(uint32_t bus, uint32_t dev_addr, uint32_t offset_addr, + uint8_t write_buf) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA_DEBUG_ERR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = dev_addr; + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_write_byte_data(&client, offset_addr, write_buf); + if (rv < 0) { + PCA_DEBUG_ERR("i2c write failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + break; + } +out: + filp_close(fp, NULL); + return rv; +} + +static int pca9641_do_file_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + file_attr_t *file_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + file_attr = &reset_cfg->attr.file_attr; + ret = -1; + + PCA_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA_DEBUG("dev_name:%s, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + file_attr->dev_name, file_attr->offset, file_attr->mask, + file_attr->reset_on, file_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca9641_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + val &= ~(file_attr->mask); + val |= file_attr->reset_on; + err = pca9641_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(file_attr->mask); + val |= file_attr->reset_off; + err = pca9641_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca9641_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (file_attr->mask); + if (val == file_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_file_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_file_reset timeout.\n"); + } +out: + if (err < 0) { + PCA_DEBUG_ERR("pca9641_do_file_reset file rd/wr failed, ret:%d.\n", err); + } + + return ret; +} + +static int pca9641_do_io_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + io_attr_t *io_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + io_attr = &reset_cfg->attr.io_attr; + + PCA_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA_DEBUG("io_addr:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + io_attr->io_addr, io_attr->mask, io_attr->reset_on, io_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + val = inb(io_attr->io_addr); + val &= ~(io_attr->mask); + val |= io_attr->reset_on; + outb(val, io_attr->io_addr); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(io_attr->mask); + val |= io_attr->reset_off; + outb(val, io_attr->io_addr); + + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = inb(io_attr->io_addr); + val &= (io_attr->mask); + if (val == io_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_io_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_io_reset timeout.\n"); + } + + return ret; +} + +static int pca9641_do_gpio_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + gpio_attr_t *gpio_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + gpio_attr = &reset_cfg->attr.gpio_attr; + + ret = pca9641_gpio_init(gpio_attr); + if (ret) { + return -1; + } + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_on); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_off); + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = __gpio_get_value(gpio_attr->gpio); + if (val == gpio_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_gpio_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + /* 1MS schedule*/ + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_gpio_reset timeout.\n"); + } + + pca9641_gpio_free(gpio_attr); + return ret; +} + +static int pca9641_do_i2c_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + i2c_attr_t *i2c_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + i2c_attr = &reset_cfg->attr.i2c_attr; + ret = -1; + + PCA_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA_DEBUG("bus:0x%x, addr:0x%x, reg:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + i2c_attr->i2c_bus, i2c_attr->i2c_addr, i2c_attr->reg_offset, + i2c_attr->mask, i2c_attr->reset_on, i2c_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca9641_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_on; + err = pca9641_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_off; + err = pca9641_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca9641_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (i2c_attr->mask); + if (val == i2c_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_i2c_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_i2c_reset timeout.\n"); + } +out: + if (err < 0) { + PCA_DEBUG_ERR("pca9641_do_i2c_reset i2c op failed, ret:%d.\n", err); + } + return ret; +} + +static int pca9641_do_reset(struct i2c_mux_core *muxc) +{ + int ret; + struct pca9541 *data; + + data = i2c_mux_priv(muxc); + if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_NONE) { + ret = -1; + PCA_DEBUG("Don't need to reset.\n"); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_I2C) { + ret = pca9641_do_i2c_reset(muxc); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_GPIO) { + ret = pca9641_do_gpio_reset(muxc); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_IO) { + ret = pca9641_do_io_reset(muxc); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_FILE) { + ret = pca9641_do_file_reset(muxc); + } else { + ret = -1; + PCA_DEBUG_ERR("Unsupport reset type:0x%x.\n", + data->pca9641_cfg_info.pca9641_reset_type); + } + + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_reset_ctrl failed, reset type:%u, ret:%d.\n", + data->pca9641_cfg_info.pca9641_reset_type, ret); + } else { + udelay(PCA9641_RESET_DELAY); + } + return ret; +} + +/* + * Write to chip register. Don't use i2c_transfer()/i2c_smbus_xfer() + * as they will try to lock the adapter a second time. + */ +static int pca9541_reg_write(struct i2c_client *client, u8 command, u8 val) +{ + struct i2c_adapter *adap = client->adapter; + int ret; + + if (adap->algo->master_xfer) { + struct i2c_msg msg; + char buf[2]; + + msg.addr = client->addr; + msg.flags = 0; + msg.len = 2; + buf[0] = command; + buf[1] = val; + msg.buf = buf; + ret = __i2c_transfer(adap, &msg, 1); + } else { + union i2c_smbus_data data; + + data.byte = val; + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_WRITE, + command, + I2C_SMBUS_BYTE_DATA, &data); + } + + return ret; +} + +/* + * Read from chip register. Don't use i2c_transfer()/i2c_smbus_xfer() + * as they will try to lock adapter a second time. + */ +static int pca9541_reg_read(struct i2c_client *client, u8 command) +{ + struct i2c_adapter *adap = client->adapter; + int ret; + u8 val; + + if (adap->algo->master_xfer) { + struct i2c_msg msg[2] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = &command + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = 1, + .buf = &val + } + }; + ret = __i2c_transfer(adap, msg, 2); + if (ret == 2) + ret = val; + else if (ret >= 0) + ret = -EIO; + } else { + union i2c_smbus_data data; + + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_READ, + command, + I2C_SMBUS_BYTE_DATA, &data); + if (!ret) + ret = data.byte; + } + return ret; +} + +/* + * Arbitration management functions + */ + +/* Release bus. Also reset NTESTON and BUSINIT if it was set. */ +static void pca9541_release_bus(struct i2c_client *client) +{ + int reg; + + reg = pca9541_reg_read(client, PCA9541_CONTROL); + if (reg >= 0 && !busoff(reg) && mybus(reg)) + pca9541_reg_write(client, PCA9541_CONTROL, + (reg & PCA9541_CTL_NBUSON) >> 1); +} + +/* + * Arbitration is defined as a two-step process. A bus master can only activate + * the slave bus if it owns it; otherwise it has to request ownership first. + * This multi-step process ensures that access contention is resolved + * gracefully. + * + * Bus Ownership Other master Action + * state requested access + * ---------------------------------------------------- + * off - yes wait for arbitration timeout or + * for other master to drop request + * off no no take ownership + * off yes no turn on bus + * on yes - done + * on no - wait for arbitration timeout or + * for other master to release bus + * + * The main contention point occurs if the slave bus is off and both masters + * request ownership at the same time. In this case, one master will turn on + * the slave bus, believing that it owns it. The other master will request + * bus ownership. Result is that the bus is turned on, and master which did + * _not_ own the slave bus before ends up owning it. + */ + +/* Control commands per PCA9541 datasheet */ +static const u8 pca9541_control[16] = { + 4, 0, 1, 5, 4, 4, 5, 5, 0, 0, 1, 1, 0, 4, 5, 1 +}; + +/* + * Channel arbitration + * + * Return values: + * <0: error + * 0 : bus not acquired + * 1 : bus acquired + */ +static int pca9541_arbitrate(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca9541 *data = i2c_mux_priv(muxc); + int reg; + + reg = pca9541_reg_read(client, PCA9541_CONTROL); + if (reg < 0) + return reg; + + if (busoff(reg)) { + int istat; + /* + * Bus is off. Request ownership or turn it on unless + * other master requested ownership. + */ + istat = pca9541_reg_read(client, PCA9541_ISTAT); + if (!(istat & PCA9541_ISTAT_NMYTEST) + || time_is_before_eq_jiffies(data->arb_timeout)) { + /* + * Other master did not request ownership, + * or arbitration timeout expired. Take the bus. + */ + pca9541_reg_write(client, + PCA9541_CONTROL, + pca9541_control[reg & 0x0f] + | PCA9541_CTL_NTESTON); + data->select_timeout = SELECT_DELAY_SHORT; + } else { + /* + * Other master requested ownership. + * Set extra long timeout to give it time to acquire it. + */ + data->select_timeout = SELECT_DELAY_LONG * 2; + } + } else if (mybus(reg)) { + /* + * Bus is on, and we own it. We are done with acquisition. + * Reset NTESTON and BUSINIT, then return success. + */ + if (reg & (PCA9541_CTL_NTESTON | PCA9541_CTL_BUSINIT)) + pca9541_reg_write(client, + PCA9541_CONTROL, + reg & ~(PCA9541_CTL_NTESTON + | PCA9541_CTL_BUSINIT)); + return 1; + } else { + /* + * Other master owns the bus. + * If arbitration timeout has expired, force ownership. + * Otherwise request it. + */ + data->select_timeout = SELECT_DELAY_LONG; + if (time_is_before_eq_jiffies(data->arb_timeout)) { + /* Time is up, take the bus and reset it. */ + pca9541_reg_write(client, + PCA9541_CONTROL, + pca9541_control[reg & 0x0f] + | PCA9541_CTL_BUSINIT + | PCA9541_CTL_NTESTON); + } else { + /* Request bus ownership if needed */ + if (!(reg & PCA9541_CTL_NTESTON)) + pca9541_reg_write(client, + PCA9541_CONTROL, + reg | PCA9541_CTL_NTESTON); + } + } + return 0; +} + +static int pca9541_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int ret; + unsigned long timeout = jiffies + ARB2_TIMEOUT; + /* give up after this time */ + + data->arb_timeout = jiffies + ARB_TIMEOUT; + /* force bus ownership after this time */ + + do { + ret = pca9541_arbitrate(client); + if (ret) + return ret < 0 ? ret : 0; + + if (data->select_timeout == SELECT_DELAY_SHORT) + udelay(data->select_timeout); + else + msleep(data->select_timeout / 1000); + } while (time_is_after_eq_jiffies(timeout)); + + dev_warn(&client->dev, "pca9541 select channel timeout.\n"); + return -ETIMEDOUT; +} + +static int pca9541_release_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + pca9541_release_bus(client); + return 0; +} + +/* +* Arbitration management functions +*/ +static void pca9641_release_bus(struct i2c_client *client) +{ + pca9541_reg_write(client, PCA9641_CONTROL, 0x80); //master 0x80 +} + +/* +* Channel arbitration +* +* Return values: +* <0: error +* 0 : bus not acquired +* 1 : bus acquired +*/ +static int pca9641_arbitrate(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca9541 *data = i2c_mux_priv(muxc); + int reg_ctl, reg_sts; + + reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); + if (reg_ctl < 0) { + PCA_DEBUG_ERR("pca9641 read control register failed, ret:%d.\n", reg_ctl); + return reg_ctl; + } + + reg_sts = pca9541_reg_read(client, PCA9641_STATUS); + if (reg_sts < 0) { + PCA_DEBUG_ERR("pca9641 read status register failed, ret:%d.\n", reg_sts); + return reg_sts; + } + + if (BUSOFF(reg_ctl, reg_sts)) { + /* + * Bus is off. Request ownership or turn it on unless + * other master requested ownership. + */ + reg_ctl |= PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); + if (reg_ctl < 0) { + PCA_DEBUG_ERR("Bus is off, but read control register failed, ret:%d.\n", reg_ctl); + return reg_ctl; + } + + if (lock_grant(reg_ctl)) { + /* + * Other master did not request ownership, + * or arbitration timeout expired. Take the bus. + */ + PCA_DEBUG("Bus is off, get pca9641 arbitration success.\n"); + reg_ctl |= PCA9641_CTL_BUS_CONNECT | PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + return 1; + } else { + /* + * Other master requested ownership. + * Set extra long timeout to give it time to acquire it. + */ + PCA_DEBUG("Bus is off, but get pca9641 arbitration failed.\n"); + data->select_timeout = SELECT_DELAY_LONG * 2; + } + } else if (lock_grant(reg_ctl)) { + /* + * Bus is on, and we own it. We are done with acquisition. + */ + PCA_DEBUG("Bus is on, get pca9641 arbitration success.\n"); + reg_ctl |= PCA9641_CTL_BUS_CONNECT | PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + return 1; + } else if (other_lock(reg_sts)) { + /* + * Other master owns the bus. + * If arbitration timeout has expired, force ownership. + * Otherwise request it. + */ + PCA_DEBUG("Other master owns the bus, try to request it.\n"); + data->select_timeout = SELECT_DELAY_LONG; + reg_ctl |= PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + } + return 0; +} + +int pca9641_select_chan_single(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int ret; + int result; + unsigned long msleep_time; + unsigned long timeout = jiffies + ARB2_TIMEOUT; + /* give up after this time */ + data->arb_timeout = jiffies + ARB_TIMEOUT; + /* force bus ownership after this time */ + for (result = 0 ; result < PCA9641_RETRY_TIME ; result ++) { + do { + ret = pca9641_arbitrate(client); + if (ret) { + return ret < 0 ? -EIO : 0; + } + msleep_time = data->select_timeout / 1000; + if (msleep_time < 1) { + msleep(1); + } else { + msleep(msleep_time); + } + } while (time_is_after_eq_jiffies(timeout)); + timeout = jiffies + ARB2_TIMEOUT; + } + dev_warn(&client->dev, "pca9641 select channel timeout.\n"); + return -ETIMEDOUT; +} + +static int pca9641_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + int ret, rv; + + ret = pca9641_select_chan_single(muxc, chan); + if (ret < 0) { + PCA_DEBUG_ERR("pca9641 select channel failed, ret:%d, try to reset pca9641.\n", ret); + rv = pca9641_do_reset(muxc); + + if (rv < 0) { + PCA_DEBUG_ERR("pca9641 reset failed, rv:%d.\n", rv); + return ret; + } + + ret = pca9641_select_chan_single(muxc, chan); + if (ret < 0) { + PCA_DEBUG_ERR("after pca9641 reset, select channel still failed, ret:%d.\n", ret); + } + } + return ret; +} + +static int pca9641_release_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + if (pca_flag.flag) { + pca9641_release_bus(client); + } + return 0; +} + +static int pca9641_detect_id(struct i2c_client *client) +{ + int reg; + + reg = pca9541_reg_read(client, PCA9641_ID); + if (reg == PCA9641_ID_MAGIC) + return 1; + else + return 0; +} + +static int pca9641_recordflag(struct i2c_adapter *adap) { + if (pca_flag.flag != -1) { + pr_err(" %s %d has init already!!!", __func__, __LINE__); + return -1 ; + } + pca_flag.nr = adap->nr; + PCA_DEBUG(" adap->nr:%d\n", adap->nr); + snprintf(pca_flag.name, sizeof(pca_flag.name),adap->name); + return 0; +} + +static int of_pca9641_reset_data_init(struct pca9541 *data) +{ + int err; + struct device *dev = &data->client->dev; + pca9641_cfg_info_t *reset_cfg; + + reset_cfg = &data->pca9641_cfg_info; + if (dev == NULL || dev->of_node == NULL) { + PCA_DEBUG("dev or dev->of_node is NUll, no reset.\n"); + reset_cfg->pca9641_reset_type = PCA9641_RESET_NONE; + return 0; + } + + if (of_property_read_u32(dev->of_node, "pca9641_reset_type", &reset_cfg->pca9641_reset_type)) { + + PCA_DEBUG("pca9641_reset_type not found, no reset.\n"); + reset_cfg->pca9641_reset_type = PCA9641_RESET_NONE; + return 0; + } + err = of_property_read_u32(dev->of_node, "rst_delay_b", &reset_cfg->rst_delay_b); + err |= of_property_read_u32(dev->of_node, "rst_delay", &reset_cfg->rst_delay); + err |= of_property_read_u32(dev->of_node, "rst_delay_a", &reset_cfg->rst_delay_a); + + if (err) { + goto dts_config_err; + } + PCA_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9641_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9641_reset_type == PCA9641_RESET_I2C) { + + PCA_DEBUG("reset by i2c.\n"); + err = of_property_read_u32(dev->of_node, "i2c_bus", &reset_cfg->attr.i2c_attr.i2c_bus); + err |=of_property_read_u32(dev->of_node, "i2c_addr", &reset_cfg->attr.i2c_attr.i2c_addr); + err |=of_property_read_u32(dev->of_node, "reg_offset", &reset_cfg->attr.i2c_attr.reg_offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.i2c_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.i2c_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.i2c_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_GPIO) { + + PCA_DEBUG("reset by gpio.\n"); + err = of_property_read_u32(dev->of_node, "gpio", &reset_cfg->attr.gpio_attr.gpio); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.gpio_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.gpio_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_IO) { + + PCA_DEBUG("reset by io.\n"); + err = of_property_read_u32(dev->of_node, "io_addr", &reset_cfg->attr.io_attr.io_addr); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.io_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.io_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.io_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_FILE) { + + PCA_DEBUG("reset by file.\n"); + err = of_property_read_string(dev->of_node, "dev_name", &reset_cfg->attr.file_attr.dev_name); + err |=of_property_read_u32(dev->of_node, "offset", &reset_cfg->attr.file_attr.offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.file_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.file_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.file_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA_DEBUG_ERR("Unsupport reset type:%d.\n", reset_cfg->pca9641_reset_type); + goto dts_config_err; + } + return 0; +dts_config_err: + PCA_DEBUG_ERR("dts config error, ret:%d.\n", err); + return -EINVAL; +} + +static int pca9641_reset_data_init(struct pca9541 *data) +{ + pca9641_cfg_info_t *reset_cfg; + i2c_mux_pca9641_device_t *i2c_mux_pca9641_device; + + if (data->client->dev.platform_data == NULL) { + PCA_DEBUG("pca9641 has no reset platform data config.\n"); + return 0; + } + reset_cfg = &data->pca9641_cfg_info; + i2c_mux_pca9641_device = data->client->dev.platform_data; + reset_cfg->pca9641_reset_type = i2c_mux_pca9641_device->pca9641_reset_type; + if (reset_cfg->pca9641_reset_type == PCA9641_RESET_NONE) { + PCA_DEBUG("pca9641 has no reset function.\n"); + return 0; + } + + reset_cfg->rst_delay_b = i2c_mux_pca9641_device->rst_delay_b; + reset_cfg->rst_delay = i2c_mux_pca9641_device->rst_delay; + reset_cfg->rst_delay_a = i2c_mux_pca9641_device->rst_delay_a; + PCA_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9641_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9641_reset_type == PCA9641_RESET_I2C) { + + PCA_DEBUG("reset by i2c.\n"); + reset_cfg->attr.i2c_attr.i2c_bus = i2c_mux_pca9641_device->attr.i2c_attr.i2c_bus; + reset_cfg->attr.i2c_attr.i2c_addr = i2c_mux_pca9641_device->attr.i2c_attr.i2c_addr; + reset_cfg->attr.i2c_attr.reg_offset = i2c_mux_pca9641_device->attr.i2c_attr.reg_offset; + reset_cfg->attr.i2c_attr.mask = i2c_mux_pca9641_device->attr.i2c_attr.mask; + reset_cfg->attr.i2c_attr.reset_on = i2c_mux_pca9641_device->attr.i2c_attr.reset_on; + reset_cfg->attr.i2c_attr.reset_off = i2c_mux_pca9641_device->attr.i2c_attr.reset_off; + PCA_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_GPIO) { + + PCA_DEBUG("reset by gpio.\n"); + reset_cfg->attr.gpio_attr.gpio = i2c_mux_pca9641_device->attr.gpio_attr.gpio; + reset_cfg->attr.gpio_attr.reset_on = i2c_mux_pca9641_device->attr.gpio_attr.reset_on; + reset_cfg->attr.gpio_attr.reset_off = i2c_mux_pca9641_device->attr.gpio_attr.reset_off; + PCA_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_IO) { + + PCA_DEBUG("reset by io.\n"); + reset_cfg->attr.io_attr.io_addr = i2c_mux_pca9641_device->attr.io_attr.io_addr; + reset_cfg->attr.io_attr.mask = i2c_mux_pca9641_device->attr.io_attr.mask; + reset_cfg->attr.io_attr.reset_on = i2c_mux_pca9641_device->attr.io_attr.reset_on; + reset_cfg->attr.io_attr.reset_off = i2c_mux_pca9641_device->attr.io_attr.reset_off; + PCA_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_FILE) { + + PCA_DEBUG("reset by file.\n"); + reset_cfg->attr.file_attr.dev_name = i2c_mux_pca9641_device->attr.file_attr.dev_name; + reset_cfg->attr.file_attr.offset = i2c_mux_pca9641_device->attr.file_attr.offset; + reset_cfg->attr.file_attr.mask = i2c_mux_pca9641_device->attr.file_attr.mask; + reset_cfg->attr.file_attr.reset_on = i2c_mux_pca9641_device->attr.file_attr.reset_on; + reset_cfg->attr.file_attr.reset_off = i2c_mux_pca9641_device->attr.file_attr.reset_off; + PCA_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA_DEBUG_ERR("Unsupport reset type:%d.\n", reset_cfg->pca9641_reset_type); + return -EINVAL; + } + return 0; +} + +/* + * I2C init/probing/exit functions + */ +static int pca9541_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_adapter *adap = client->adapter; + struct i2c_mux_core *muxc; + struct pca9541 *data; + int force; + int ret = -ENODEV; + int detect_id; + i2c_mux_pca9641_device_t *i2c_mux_pca9641_device; + + if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE_DATA)) + return -ENODEV; + + detect_id = pca9641_detect_id(client); + + /* + * I2C accesses are unprotected here. + * We have to lock the adapter before releasing the bus. + */ + if (detect_id == 0) { + i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + pca9541_release_bus(client); + i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + } else { + i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + pca9641_release_bus(client); + i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + } + + if (detect_id == 0) { /* pca9541 */ + muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), + I2C_MUX_ARBITRATOR, + pca9541_select_chan, pca9541_release_chan); + if (!muxc) + return -ENOMEM; + + data = i2c_mux_priv(muxc); + data->client = client; + + i2c_set_clientdata(client, muxc); + /* Create mux adapter */ + if (of_property_read_u32(client->dev.of_node, "pca9641_nr", &data->pca9641_nr)) { + + force = 0; + PCA_DEBUG("pca9641_nr not found, use dynamic adap number.\n"); + } else { + force = data->pca9641_nr; + PCA_DEBUG("pca9641_nr: %d.\n", force); + } + + ret = i2c_mux_add_adapter(muxc, force, 0, 0); + if (ret) + return ret; + } else { + muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), I2C_MUX_ARBITRATOR, + pca9641_select_chan, pca9641_release_chan); + if (!muxc) { + dev_err(&client->dev, "i2c_mux_alloc failed, out of memory.\n"); + return -ENOMEM; + } + + data = i2c_mux_priv(muxc); + data->client = client; + + i2c_set_clientdata(client, muxc); + + if (client->dev.of_node) { + ret= of_pca9641_reset_data_init(data); + } else { + ret= pca9641_reset_data_init(data); + } + if (ret < 0) { + dev_err(&client->dev, "pca9641 reset config err, ret:%d.\n", ret); + return ret; + } + + if (client->dev.of_node == NULL) { + if (client->dev.platform_data == NULL) { + force = 0; + PCA_DEBUG("platform data is NULL, use dynamic adap number.\n"); + } else { + i2c_mux_pca9641_device = client->dev.platform_data; + data->pca9641_nr = i2c_mux_pca9641_device->pca9641_nr; + if (data->pca9641_nr == 0) { + force = 0; + PCA_DEBUG("pca9641_nr = 0, use dynamic adap number.\n"); + } else { + force = data->pca9641_nr; + PCA_DEBUG("pca9641_nr: %d.\n", force); + } + } + } else { + /* Create mux adapter */ + if (of_property_read_u32(client->dev.of_node, "pca9641_nr", &data->pca9641_nr)) { + + force = 0; + PCA_DEBUG("pca9641_nr not found, use dynamic adap number.\n"); + } else { + force = data->pca9641_nr; + PCA_DEBUG("pca9641_nr: %d.\n", force); + } + } + + ret = i2c_mux_add_adapter(muxc, force, 0, 0); + if (ret) { + dev_err(&client->dev, "Failed to register master selector.\n"); + return ret; + } + } + pca9641_recordflag(muxc->adapter[0]); + + dev_info(&client->dev, "registered master selector for I2C %s\n", client->name); + + return 0; +} + +static int pca9541_remove(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + + i2c_mux_del_adapters(muxc); + return 0; +} + +static struct i2c_driver pca9641_driver = { + .driver = { + .name = "wb_pca9641", + .of_match_table = of_match_ptr(pca9541_of_match), + }, + .probe = pca9541_probe, + .remove = pca9541_remove, + .id_table = pca9541_id, +}; + +module_i2c_driver(pca9641_driver); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PCA9541 I2C master selector driver"); +MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h new file mode 100644 index 000000000000..b87f7585567b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h @@ -0,0 +1,64 @@ +#ifndef __WB_I2C_MUX_PCA9641_H__ +#define __WB_I2C_MUX_PCA9641_H__ + +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum pca9641_reset_type_s { + PCA9641_RESET_NONE = 0, + PCA9641_RESET_I2C = 1, + PCA9641_RESET_GPIO = 2, + PCA9641_RESET_IO = 3, + PCA9641_RESET_FILE = 4, +} pca9641_reset_type_t; + +typedef struct i2c_attr_s { + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t reg_offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} i2c_attr_t; + +typedef struct io_attr_s { + uint32_t io_addr; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} io_attr_t; + +typedef struct file_attr_s { + const char *dev_name; + uint32_t offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} file_attr_t; + +typedef struct gpio_attr_s { + int gpio_init; + uint32_t gpio; + uint32_t reset_on; + uint32_t reset_off; +} gpio_attr_t; + +typedef struct i2c_mux_pca9641_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t pca9641_nr; + uint32_t pca9641_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; +} i2c_mux_pca9641_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c new file mode 100644 index 000000000000..fba2c4e3a68e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c @@ -0,0 +1,1031 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * INA3221 Triple Current/Voltage Monitor + * + * Copyright (C) 2016 Texas Instruments Incorporated - https://www.ti.com/ + * Andrew F. Davis + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define INA3221_DRIVER_NAME "wb_ina3221" + +#define INA3221_CONFIG 0x00 +#define INA3221_SHUNT1 0x01 +#define INA3221_BUS1 0x02 +#define INA3221_SHUNT2 0x03 +#define INA3221_BUS2 0x04 +#define INA3221_SHUNT3 0x05 +#define INA3221_BUS3 0x06 +#define INA3221_CRIT1 0x07 +#define INA3221_WARN1 0x08 +#define INA3221_CRIT2 0x09 +#define INA3221_WARN2 0x0a +#define INA3221_CRIT3 0x0b +#define INA3221_WARN3 0x0c +#define INA3221_SHUNT_SUM 0x0d +#define INA3221_CRIT_SUM 0x0e +#define INA3221_MASK_ENABLE 0x0f + +#define INA3221_CONFIG_MODE_MASK GENMASK(2, 0) +#define INA3221_CONFIG_MODE_POWERDOWN 0 +#define INA3221_CONFIG_MODE_SHUNT BIT(0) +#define INA3221_CONFIG_MODE_BUS BIT(1) +#define INA3221_CONFIG_MODE_CONTINUOUS BIT(2) +#define INA3221_CONFIG_VSH_CT_SHIFT 3 +#define INA3221_CONFIG_VSH_CT_MASK GENMASK(5, 3) +#define INA3221_CONFIG_VSH_CT(x) (((x) & GENMASK(5, 3)) >> 3) +#define INA3221_CONFIG_VBUS_CT_SHIFT 6 +#define INA3221_CONFIG_VBUS_CT_MASK GENMASK(8, 6) +#define INA3221_CONFIG_VBUS_CT(x) (((x) & GENMASK(8, 6)) >> 6) +#define INA3221_CONFIG_AVG_SHIFT 9 +#define INA3221_CONFIG_AVG_MASK GENMASK(11, 9) +#define INA3221_CONFIG_AVG(x) (((x) & GENMASK(11, 9)) >> 9) +#define INA3221_CONFIG_CHs_EN_MASK GENMASK(14, 12) +#define INA3221_CONFIG_CHx_EN(x) BIT(14 - (x)) + +#define INA3221_MASK_ENABLE_SCC_MASK GENMASK(14, 12) + +#define INA3221_CONFIG_DEFAULT 0x7127 +#define INA3221_RSHUNT_DEFAULT 10000 + +enum ina3221_fields { + /* Configuration */ + F_RST, + + /* Status Flags */ + F_CVRF, + + /* Warning Flags */ + F_WF3, F_WF2, F_WF1, + + /* Alert Flags: SF is the summation-alert flag */ + F_SF, F_CF3, F_CF2, F_CF1, + + /* sentinel */ + F_MAX_FIELDS +}; + +static const struct reg_field ina3221_reg_fields[] = { + [F_RST] = REG_FIELD(INA3221_CONFIG, 15, 15), + + [F_CVRF] = REG_FIELD(INA3221_MASK_ENABLE, 0, 0), + [F_WF3] = REG_FIELD(INA3221_MASK_ENABLE, 3, 3), + [F_WF2] = REG_FIELD(INA3221_MASK_ENABLE, 4, 4), + [F_WF1] = REG_FIELD(INA3221_MASK_ENABLE, 5, 5), + [F_SF] = REG_FIELD(INA3221_MASK_ENABLE, 6, 6), + [F_CF3] = REG_FIELD(INA3221_MASK_ENABLE, 7, 7), + [F_CF2] = REG_FIELD(INA3221_MASK_ENABLE, 8, 8), + [F_CF1] = REG_FIELD(INA3221_MASK_ENABLE, 9, 9), +}; + +enum ina3221_channels { + INA3221_CHANNEL1, + INA3221_CHANNEL2, + INA3221_CHANNEL3, + INA3221_NUM_CHANNELS +}; + +/** + * struct ina3221_input - channel input source specific information + * @label: label of channel input source + * @shunt_resistor: shunt resistor value of channel input source + * @disconnected: connection status of channel input source + */ +struct ina3221_input { + const char *label; + int shunt_resistor; + bool disconnected; +}; + +/** + * struct ina3221_data - device specific information + * @pm_dev: Device pointer for pm runtime + * @regmap: Register map of the device + * @fields: Register fields of the device + * @inputs: Array of channel input source specific structures + * @lock: mutex lock to serialize sysfs attribute accesses + * @reg_config: Register value of INA3221_CONFIG + * @summation_shunt_resistor: equivalent shunt resistor value for summation + * @single_shot: running in single-shot operating mode + */ +struct ina3221_data { + struct device *pm_dev; + struct regmap *regmap; + struct regmap_field *fields[F_MAX_FIELDS]; + struct ina3221_input inputs[INA3221_NUM_CHANNELS]; + struct mutex lock; + u32 reg_config; + int summation_shunt_resistor; + + bool single_shot; +}; + +static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel) +{ + /* Summation channel checks shunt resistor values */ + if (channel > INA3221_CHANNEL3) + return ina->summation_shunt_resistor != 0; + + return pm_runtime_active(ina->pm_dev) && + (ina->reg_config & INA3221_CONFIG_CHx_EN(channel)); +} + +/** + * Helper function to return the resistor value for current summation. + * + * There is a condition to calculate current summation -- all the shunt + * resistor values should be the same, so as to simply fit the formula: + * current summation = shunt voltage summation / shunt resistor + * + * Returns the equivalent shunt resistor value on success or 0 on failure + */ +static inline int ina3221_summation_shunt_resistor(struct ina3221_data *ina) +{ + struct ina3221_input *input = ina->inputs; + int i, shunt_resistor = 0; + + for (i = 0; i < INA3221_NUM_CHANNELS; i++) { + if (input[i].disconnected || !input[i].shunt_resistor) + continue; + if (!shunt_resistor) { + /* Found the reference shunt resistor value */ + shunt_resistor = input[i].shunt_resistor; + } else { + /* No summation if resistor values are different */ + if (shunt_resistor != input[i].shunt_resistor) + return 0; + } + } + + return shunt_resistor; +} + +/* Lookup table for Bus and Shunt conversion times in usec */ +static const u16 ina3221_conv_time[] = { + 140, 204, 332, 588, 1100, 2116, 4156, 8244, +}; + +/* Lookup table for number of samples using in averaging mode */ +static const int ina3221_avg_samples[] = { + 1, 4, 16, 64, 128, 256, 512, 1024, +}; + +/* Converting update_interval in msec to conversion time in usec */ +static inline u32 ina3221_interval_ms_to_conv_time(u16 config, int interval) +{ + u32 channels = hweight16(config & INA3221_CONFIG_CHs_EN_MASK); + u32 samples_idx = INA3221_CONFIG_AVG(config); + u32 samples = ina3221_avg_samples[samples_idx]; + + /* Bisect the result to Bus and Shunt conversion times */ + return DIV_ROUND_CLOSEST(interval * 1000 / 2, channels * samples); +} + +/* Converting CONFIG register value to update_interval in usec */ +static inline u32 ina3221_reg_to_interval_us(u16 config) +{ + u32 channels = hweight16(config & INA3221_CONFIG_CHs_EN_MASK); + u32 vbus_ct_idx = INA3221_CONFIG_VBUS_CT(config); + u32 vsh_ct_idx = INA3221_CONFIG_VSH_CT(config); + u32 samples_idx = INA3221_CONFIG_AVG(config); + u32 samples = ina3221_avg_samples[samples_idx]; + u32 vbus_ct = ina3221_conv_time[vbus_ct_idx]; + u32 vsh_ct = ina3221_conv_time[vsh_ct_idx]; + + /* Calculate total conversion time */ + return channels * (vbus_ct + vsh_ct) * samples; +} + +static inline int ina3221_wait_for_data(struct ina3221_data *ina) +{ + u32 wait, cvrf; + + wait = ina3221_reg_to_interval_us(ina->reg_config); + + /* Polling the CVRF bit to make sure read data is ready */ + return regmap_field_read_poll_timeout(ina->fields[F_CVRF], + cvrf, cvrf, wait, wait * 2); +} + +static int ina3221_read_value(struct ina3221_data *ina, unsigned int reg, + int *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(ina->regmap, reg, ®val); + if (ret) + return ret; + + /* + * Shunt Voltage Sum register has 14-bit value with 1-bit shift + * Other Shunt Voltage registers have 12 bits with 3-bit shift + */ + if (reg == INA3221_SHUNT_SUM) + *val = sign_extend32(regval >> 1, 14); + else + *val = sign_extend32(regval >> 3, 12); + + return 0; +} + +static const u8 ina3221_in_reg[] = { + INA3221_BUS1, + INA3221_BUS2, + INA3221_BUS3, + INA3221_SHUNT1, + INA3221_SHUNT2, + INA3221_SHUNT3, + INA3221_SHUNT_SUM, +}; + +static int ina3221_read_chip(struct device *dev, u32 attr, long *val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int regval; + + switch (attr) { + case hwmon_chip_samples: + regval = INA3221_CONFIG_AVG(ina->reg_config); + *val = ina3221_avg_samples[regval]; + return 0; + case hwmon_chip_update_interval: + /* Return in msec */ + *val = ina3221_reg_to_interval_us(ina->reg_config); + *val = DIV_ROUND_CLOSEST(*val, 1000); + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ina3221_read_in(struct device *dev, u32 attr, int channel, long *val) +{ + const bool is_shunt = channel > INA3221_CHANNEL3; + struct ina3221_data *ina = dev_get_drvdata(dev); + u8 reg = ina3221_in_reg[channel]; + int regval, ret; + + /* + * Translate shunt channel index to sensor channel index except + * the 7th channel (6 since being 0-aligned) is for summation. + */ + if (channel != 6) + channel %= INA3221_NUM_CHANNELS; + + switch (attr) { + case hwmon_in_input: + if (!ina3221_is_enabled(ina, channel)) + return -ENODATA; + + /* Write CONFIG register to trigger a single-shot measurement */ + if (ina->single_shot) + regmap_write(ina->regmap, INA3221_CONFIG, + ina->reg_config); + + ret = ina3221_wait_for_data(ina); + if (ret) + return ret; + + ret = ina3221_read_value(ina, reg, ®val); + if (ret) + return ret; + + /* + * Scale of shunt voltage (uV): LSB is 40uV + * Scale of bus voltage (mV): LSB is 8mV + */ + *val = regval * (is_shunt ? 40 : 8); + return 0; + case hwmon_in_enable: + *val = ina3221_is_enabled(ina, channel); + return 0; + default: + return -EOPNOTSUPP; + } +} + +static const u8 ina3221_curr_reg[][INA3221_NUM_CHANNELS + 1] = { + [hwmon_curr_input] = { INA3221_SHUNT1, INA3221_SHUNT2, + INA3221_SHUNT3, INA3221_SHUNT_SUM }, + [hwmon_curr_max] = { INA3221_WARN1, INA3221_WARN2, INA3221_WARN3, 0 }, + [hwmon_curr_crit] = { INA3221_CRIT1, INA3221_CRIT2, + INA3221_CRIT3, INA3221_CRIT_SUM }, + [hwmon_curr_max_alarm] = { F_WF1, F_WF2, F_WF3, 0 }, + [hwmon_curr_crit_alarm] = { F_CF1, F_CF2, F_CF3, F_SF }, +}; + +static int ina3221_read_curr(struct device *dev, u32 attr, + int channel, long *val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + struct ina3221_input *input = ina->inputs; + u8 reg = ina3221_curr_reg[attr][channel]; + int resistance_uo, voltage_nv; + int regval, ret; + + if (channel > INA3221_CHANNEL3) + resistance_uo = ina->summation_shunt_resistor; + else + resistance_uo = input[channel].shunt_resistor; + + switch (attr) { + case hwmon_curr_input: + if (!ina3221_is_enabled(ina, channel)) + return -ENODATA; + + /* Write CONFIG register to trigger a single-shot measurement */ + if (ina->single_shot) + regmap_write(ina->regmap, INA3221_CONFIG, + ina->reg_config); + + ret = ina3221_wait_for_data(ina); + if (ret) + return ret; + + fallthrough; + case hwmon_curr_crit: + case hwmon_curr_max: + if (!resistance_uo) + return -ENODATA; + + ret = ina3221_read_value(ina, reg, ®val); + if (ret) + return ret; + + /* Scale of shunt voltage: LSB is 40uV (40000nV) */ + voltage_nv = regval * 40000; + /* Return current in mA */ + *val = DIV_ROUND_CLOSEST(voltage_nv, resistance_uo); + return 0; + case hwmon_curr_crit_alarm: + case hwmon_curr_max_alarm: + /* No actual register read if channel is disabled */ + if (!ina3221_is_enabled(ina, channel)) { + /* Return 0 for alert flags */ + *val = 0; + return 0; + } + ret = regmap_field_read(ina->fields[reg], ®val); + if (ret) + return ret; + *val = regval; + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ina3221_write_chip(struct device *dev, u32 attr, long val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret, idx; + u32 tmp; + + switch (attr) { + case hwmon_chip_samples: + idx = find_closest(val, ina3221_avg_samples, + ARRAY_SIZE(ina3221_avg_samples)); + + tmp = (ina->reg_config & ~INA3221_CONFIG_AVG_MASK) | + (idx << INA3221_CONFIG_AVG_SHIFT); + ret = regmap_write(ina->regmap, INA3221_CONFIG, tmp); + if (ret) + return ret; + + /* Update reg_config accordingly */ + ina->reg_config = tmp; + return 0; + case hwmon_chip_update_interval: + tmp = ina3221_interval_ms_to_conv_time(ina->reg_config, val); + idx = find_closest(tmp, ina3221_conv_time, + ARRAY_SIZE(ina3221_conv_time)); + + /* Update Bus and Shunt voltage conversion times */ + tmp = INA3221_CONFIG_VBUS_CT_MASK | INA3221_CONFIG_VSH_CT_MASK; + tmp = (ina->reg_config & ~tmp) | + (idx << INA3221_CONFIG_VBUS_CT_SHIFT) | + (idx << INA3221_CONFIG_VSH_CT_SHIFT); + ret = regmap_write(ina->regmap, INA3221_CONFIG, tmp); + if (ret) + return ret; + + /* Update reg_config accordingly */ + ina->reg_config = tmp; + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ina3221_write_curr(struct device *dev, u32 attr, + int channel, long val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + struct ina3221_input *input = ina->inputs; + u8 reg = ina3221_curr_reg[attr][channel]; + int resistance_uo, current_ma, voltage_uv; + int regval; + + if (channel > INA3221_CHANNEL3) + resistance_uo = ina->summation_shunt_resistor; + else + resistance_uo = input[channel].shunt_resistor; + + if (!resistance_uo) + return -EOPNOTSUPP; + + /* clamp current */ + current_ma = clamp_val(val, + INT_MIN / resistance_uo, + INT_MAX / resistance_uo); + + voltage_uv = DIV_ROUND_CLOSEST(current_ma * resistance_uo, 1000); + + /* clamp voltage */ + voltage_uv = clamp_val(voltage_uv, -163800, 163800); + + /* + * Formula to convert voltage_uv to register value: + * regval = (voltage_uv / scale) << shift + * Note: + * The scale is 40uV for all shunt voltage registers + * Shunt Voltage Sum register left-shifts 1 bit + * All other Shunt Voltage registers shift 3 bits + * Results: + * SHUNT_SUM: (1 / 40uV) << 1 = 1 / 20uV + * SHUNT[1-3]: (1 / 40uV) << 3 = 1 / 5uV + */ + if (reg == INA3221_SHUNT_SUM) + regval = DIV_ROUND_CLOSEST(voltage_uv, 20) & 0xfffe; + else + regval = DIV_ROUND_CLOSEST(voltage_uv, 5) & 0xfff8; + + return regmap_write(ina->regmap, reg, regval); +} + +static int ina3221_write_enable(struct device *dev, int channel, bool enable) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + u16 config, mask = INA3221_CONFIG_CHx_EN(channel); + u16 config_old = ina->reg_config & mask; + u32 tmp; + int ret; + + config = enable ? mask : 0; + + /* Bypass if enable status is not being changed */ + if (config_old == config) + return 0; + + /* For enabling routine, increase refcount and resume() at first */ + if (enable) { + ret = pm_runtime_resume_and_get(ina->pm_dev); + if (ret < 0) { + dev_err(dev, "Failed to get PM runtime\n"); + return ret; + } + } + + /* Enable or disable the channel */ + tmp = (ina->reg_config & ~mask) | (config & mask); + ret = regmap_write(ina->regmap, INA3221_CONFIG, tmp); + if (ret) + goto fail; + + /* Cache the latest config register value */ + ina->reg_config = tmp; + + /* For disabling routine, decrease refcount or suspend() at last */ + if (!enable) + pm_runtime_put_sync(ina->pm_dev); + + return 0; + +fail: + if (enable) { + dev_err(dev, "Failed to enable channel %d: error %d\n", + channel, ret); + pm_runtime_put_sync(ina->pm_dev); + } + + return ret; +} + +static int ina3221_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + mutex_lock(&ina->lock); + + switch (type) { + case hwmon_chip: + ret = ina3221_read_chip(dev, attr, val); + break; + case hwmon_in: + /* 0-align channel ID */ + ret = ina3221_read_in(dev, attr, channel - 1, val); + break; + case hwmon_curr: + ret = ina3221_read_curr(dev, attr, channel, val); + break; + default: + ret = -EOPNOTSUPP; + break; + } + + mutex_unlock(&ina->lock); + + return ret; +} + +static int ina3221_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + mutex_lock(&ina->lock); + + switch (type) { + case hwmon_chip: + ret = ina3221_write_chip(dev, attr, val); + break; + case hwmon_in: + /* 0-align channel ID */ + ret = ina3221_write_enable(dev, channel - 1, val); + break; + case hwmon_curr: + ret = ina3221_write_curr(dev, attr, channel, val); + break; + default: + ret = -EOPNOTSUPP; + break; + } + + mutex_unlock(&ina->lock); + + return ret; +} + +static int ina3221_read_string(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, const char **str) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int index = channel - 1; + + if (channel == 7) + *str = "sum of shunt voltages"; + else + *str = ina->inputs[index].label; + + return 0; +} + +static umode_t ina3221_is_visible(const void *drvdata, + enum hwmon_sensor_types type, + u32 attr, int channel) +{ + const struct ina3221_data *ina = drvdata; + const struct ina3221_input *input = NULL; + + switch (type) { + case hwmon_chip: + switch (attr) { + case hwmon_chip_samples: + case hwmon_chip_update_interval: + return 0644; + default: + return 0; + } + case hwmon_in: + /* Ignore in0_ */ + if (channel == 0) + return 0; + + switch (attr) { + case hwmon_in_label: + if (channel - 1 <= INA3221_CHANNEL3) + input = &ina->inputs[channel - 1]; + else if (channel == 7) + return 0444; + /* Hide label node if label is not provided */ + return (input && input->label) ? 0444 : 0; + case hwmon_in_input: + return 0444; + case hwmon_in_enable: + return 0644; + default: + return 0; + } + case hwmon_curr: + switch (attr) { + case hwmon_curr_input: + case hwmon_curr_crit_alarm: + case hwmon_curr_max_alarm: + return 0444; + case hwmon_curr_crit: + case hwmon_curr_max: + return 0644; + default: + return 0; + } + default: + return 0; + } +} + +#define INA3221_HWMON_CURR_CONFIG (HWMON_C_INPUT | \ + HWMON_C_CRIT | HWMON_C_CRIT_ALARM | \ + HWMON_C_MAX | HWMON_C_MAX_ALARM) + +static const struct hwmon_channel_info *ina3221_info[] = { + HWMON_CHANNEL_INFO(chip, + HWMON_C_SAMPLES, + HWMON_C_UPDATE_INTERVAL), + HWMON_CHANNEL_INFO(in, + /* 0: dummy, skipped in is_visible */ + HWMON_I_INPUT, + /* 1-3: input voltage Channels */ + HWMON_I_INPUT | HWMON_I_ENABLE | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_ENABLE | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_ENABLE | HWMON_I_LABEL, + /* 4-6: shunt voltage Channels */ + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + /* 7: summation of shunt voltage channels */ + HWMON_I_INPUT | HWMON_I_LABEL), + HWMON_CHANNEL_INFO(curr, + /* 1-3: current channels*/ + INA3221_HWMON_CURR_CONFIG, + INA3221_HWMON_CURR_CONFIG, + INA3221_HWMON_CURR_CONFIG, + /* 4: summation of current channels */ + HWMON_C_INPUT | HWMON_C_CRIT | HWMON_C_CRIT_ALARM), + NULL +}; + +static const struct hwmon_ops ina3221_hwmon_ops = { + .is_visible = ina3221_is_visible, + .read_string = ina3221_read_string, + .read = ina3221_read, + .write = ina3221_write, +}; + +static const struct hwmon_chip_info ina3221_chip_info = { + .ops = &ina3221_hwmon_ops, + .info = ina3221_info, +}; + +/* Extra attribute groups */ +static ssize_t ina3221_shunt_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sensor_device_attribute *sd_attr = to_sensor_dev_attr(attr); + struct ina3221_data *ina = dev_get_drvdata(dev); + unsigned int channel = sd_attr->index; + struct ina3221_input *input = &ina->inputs[channel]; + + return snprintf(buf, PAGE_SIZE, "%d\n", input->shunt_resistor); +} + +static ssize_t ina3221_shunt_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *sd_attr = to_sensor_dev_attr(attr); + struct ina3221_data *ina = dev_get_drvdata(dev); + unsigned int channel = sd_attr->index; + struct ina3221_input *input = &ina->inputs[channel]; + int val; + int ret; + + ret = kstrtoint(buf, 0, &val); + if (ret) + return ret; + + val = clamp_val(val, 1, INT_MAX); + + input->shunt_resistor = val; + + /* Update summation_shunt_resistor for summation channel */ + ina->summation_shunt_resistor = ina3221_summation_shunt_resistor(ina); + + return count; +} + +/* shunt resistance */ +static SENSOR_DEVICE_ATTR_RW(shunt1_resistor, ina3221_shunt, INA3221_CHANNEL1); +static SENSOR_DEVICE_ATTR_RW(shunt2_resistor, ina3221_shunt, INA3221_CHANNEL2); +static SENSOR_DEVICE_ATTR_RW(shunt3_resistor, ina3221_shunt, INA3221_CHANNEL3); + +static struct attribute *ina3221_attrs[] = { + &sensor_dev_attr_shunt1_resistor.dev_attr.attr, + &sensor_dev_attr_shunt2_resistor.dev_attr.attr, + &sensor_dev_attr_shunt3_resistor.dev_attr.attr, + NULL, +}; +ATTRIBUTE_GROUPS(ina3221); + +static const struct regmap_range ina3221_yes_ranges[] = { + regmap_reg_range(INA3221_CONFIG, INA3221_BUS3), + regmap_reg_range(INA3221_SHUNT_SUM, INA3221_SHUNT_SUM), + regmap_reg_range(INA3221_MASK_ENABLE, INA3221_MASK_ENABLE), +}; + +static const struct regmap_access_table ina3221_volatile_table = { + .yes_ranges = ina3221_yes_ranges, + .n_yes_ranges = ARRAY_SIZE(ina3221_yes_ranges), +}; + +static const struct regmap_config ina3221_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + + .cache_type = REGCACHE_RBTREE, + .volatile_table = &ina3221_volatile_table, +}; + +static int ina3221_probe_child_from_dt(struct device *dev, + struct device_node *child, + struct ina3221_data *ina) +{ + struct ina3221_input *input; + u32 val; + int ret; + + ret = of_property_read_u32(child, "reg", &val); + if (ret) { + dev_err(dev, "missing reg property of %pOFn\n", child); + return ret; + } else if (val > INA3221_CHANNEL3) { + dev_err(dev, "invalid reg %d of %pOFn\n", val, child); + return ret; + } + + input = &ina->inputs[val]; + + /* Log the disconnected channel input */ + if (!of_device_is_available(child)) { + input->disconnected = true; + return 0; + } + + /* Save the connected input label if available */ + of_property_read_string(child, "label", &input->label); + + /* Overwrite default shunt resistor value optionally */ + if (!of_property_read_u32(child, "shunt-resistor-micro-ohms", &val)) { + if (val < 1 || val > INT_MAX) { + dev_err(dev, "invalid shunt resistor value %u of %pOFn\n", + val, child); + return -EINVAL; + } + input->shunt_resistor = val; + } + + return 0; +} + +static int ina3221_probe_from_dt(struct device *dev, struct ina3221_data *ina) +{ + const struct device_node *np = dev->of_node; + struct device_node *child; + int ret; + + /* Compatible with non-DT platforms */ + if (!np) + return 0; + + ina->single_shot = of_property_read_bool(np, "ti,single-shot"); + + for_each_child_of_node(np, child) { + ret = ina3221_probe_child_from_dt(dev, child, ina); + if (ret) { + of_node_put(child); + return ret; + } + } + + return 0; +} + +static int ina3221_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct ina3221_data *ina; + struct device *hwmon_dev; + int i, ret; + + ina = devm_kzalloc(dev, sizeof(*ina), GFP_KERNEL); + if (!ina) + return -ENOMEM; + + ina->regmap = devm_regmap_init_i2c(client, &ina3221_regmap_config); + if (IS_ERR(ina->regmap)) { + dev_err(dev, "Unable to allocate register map\n"); + return PTR_ERR(ina->regmap); + } + + for (i = 0; i < F_MAX_FIELDS; i++) { + ina->fields[i] = devm_regmap_field_alloc(dev, + ina->regmap, + ina3221_reg_fields[i]); + if (IS_ERR(ina->fields[i])) { + dev_err(dev, "Unable to allocate regmap fields\n"); + return PTR_ERR(ina->fields[i]); + } + } + + for (i = 0; i < INA3221_NUM_CHANNELS; i++) + ina->inputs[i].shunt_resistor = INA3221_RSHUNT_DEFAULT; + + ret = ina3221_probe_from_dt(dev, ina); + if (ret) { + dev_err(dev, "Unable to probe from device tree\n"); + return ret; + } + + /* The driver will be reset, so use reset value */ + ina->reg_config = INA3221_CONFIG_DEFAULT; + + /* Clear continuous bit to use single-shot mode */ + if (ina->single_shot) + ina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS; + + /* Disable channels if their inputs are disconnected */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) { + if (ina->inputs[i].disconnected) + ina->reg_config &= ~INA3221_CONFIG_CHx_EN(i); + } + + /* Initialize summation_shunt_resistor for summation channel control */ + ina->summation_shunt_resistor = ina3221_summation_shunt_resistor(ina); + + ina->pm_dev = dev; + mutex_init(&ina->lock); + dev_set_drvdata(dev, ina); + + /* Enable PM runtime -- status is suspended by default */ + pm_runtime_enable(ina->pm_dev); + + /* Initialize (resume) the device */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) { + if (ina->inputs[i].disconnected) + continue; + /* Match the refcount with number of enabled channels */ + ret = pm_runtime_get_sync(ina->pm_dev); + if (ret < 0) + goto fail; + } + + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, ina, + &ina3221_chip_info, + ina3221_groups); + if (IS_ERR(hwmon_dev)) { + dev_err(dev, "Unable to register hwmon device\n"); + ret = PTR_ERR(hwmon_dev); + goto fail; + } + + return 0; + +fail: + pm_runtime_disable(ina->pm_dev); + pm_runtime_set_suspended(ina->pm_dev); + /* pm_runtime_put_noidle() will decrease the PM refcount until 0 */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) + pm_runtime_put_noidle(ina->pm_dev); + mutex_destroy(&ina->lock); + + return ret; +} + +static int ina3221_remove(struct i2c_client *client) +{ + struct ina3221_data *ina = dev_get_drvdata(&client->dev); + int i; + + pm_runtime_disable(ina->pm_dev); + pm_runtime_set_suspended(ina->pm_dev); + + /* pm_runtime_put_noidle() will decrease the PM refcount until 0 */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) + pm_runtime_put_noidle(ina->pm_dev); + + mutex_destroy(&ina->lock); + + return 0; +} + +static int __maybe_unused ina3221_suspend(struct device *dev) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + /* Save config register value and enable cache-only */ + ret = regmap_read(ina->regmap, INA3221_CONFIG, &ina->reg_config); + if (ret) + return ret; + + /* Set to power-down mode for power saving */ + ret = regmap_update_bits(ina->regmap, INA3221_CONFIG, + INA3221_CONFIG_MODE_MASK, + INA3221_CONFIG_MODE_POWERDOWN); + if (ret) + return ret; + + regcache_cache_only(ina->regmap, true); + regcache_mark_dirty(ina->regmap); + + return 0; +} + +static int __maybe_unused ina3221_resume(struct device *dev) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + regcache_cache_only(ina->regmap, false); + + /* Software reset the chip */ + ret = regmap_field_write(ina->fields[F_RST], true); + if (ret) { + dev_err(dev, "Unable to reset device\n"); + return ret; + } + + /* Restore cached register values to hardware */ + ret = regcache_sync(ina->regmap); + if (ret) + return ret; + + /* Restore config register value to hardware */ + ret = regmap_write(ina->regmap, INA3221_CONFIG, ina->reg_config); + if (ret) + return ret; + + /* Initialize summation channel control */ + if (ina->summation_shunt_resistor) { + /* + * Take all three channels into summation by default + * Shunt measurements of disconnected channels should + * be 0, so it does not matter for summation. + */ + ret = regmap_update_bits(ina->regmap, INA3221_MASK_ENABLE, + INA3221_MASK_ENABLE_SCC_MASK, + INA3221_MASK_ENABLE_SCC_MASK); + if (ret) { + dev_err(dev, "Unable to control summation channel\n"); + return ret; + } + } + + return 0; +} + +static const struct dev_pm_ops ina3221_pm = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(ina3221_suspend, ina3221_resume, NULL) +}; + +static const struct of_device_id ina3221_of_match_table[] = { + { .compatible = "ti,wb_ina3221", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ina3221_of_match_table); + +static const struct i2c_device_id ina3221_ids[] = { + { "wb_ina3221", 0 }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(i2c, ina3221_ids); + +static struct i2c_driver ina3221_i2c_driver = { + .probe_new = ina3221_probe, + .remove = ina3221_remove, + .driver = { + .name = INA3221_DRIVER_NAME, + .of_match_table = ina3221_of_match_table, + .pm = &ina3221_pm, + }, + .id_table = ina3221_ids, +}; +module_i2c_driver(ina3221_i2c_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Texas Instruments INA3221 HWMon Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c new file mode 100644 index 000000000000..2797a831bd66 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c @@ -0,0 +1,572 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Hardware monitoring driver for Renesas Digital Multiphase Voltage Regulators + * + * Copyright (c) 2017 Google Inc + * Copyright (c) 2020 Renesas Electronics America + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_pmbus.h" + +#define ISL68137_VOUT_AVS (0x30) +#define RAA_DMPVR2_READ_VMON (0xc8) +#define WRITE_PROTECT_CLOSE (0x00) +#define WRITE_PROTECT_OPEN (0x40) + +static int g_wb_isl68137_debug = 0; +static int g_wb_isl68137_error = 0; + +module_param(g_wb_isl68137_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_isl68137_error, int, S_IRUGO | S_IWUSR); + +#define WB_ISL68137_VERBOSE(fmt, args...) do { \ + if (g_wb_isl68137_debug) { \ + printk(KERN_INFO "[WB_ISL68137][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_ISL68137_ERROR(fmt, args...) do { \ + if (g_wb_isl68137_error) { \ + printk(KERN_ERR "[WB_ISL68137][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +enum chips { + isl68137, + isl68220, + isl68221, + isl68222, + isl68223, + isl68224, + isl68225, + isl68226, + isl68227, + isl68229, + isl68233, + isl68239, + isl69222, + isl69223, + isl69224, + isl69225, + isl69227, + isl69228, + isl69234, + isl69236, + isl69239, + isl69242, + isl69243, + isl69247, + isl69248, + isl69254, + isl69255, + isl69256, + isl69259, + isl69260, + isl69268, + isl69269, + isl69298, + raa228000, + raa228004, + raa228006, + raa228228, + raa229001, + raa229004, +}; + +enum variants { + raa_dmpvr1_2rail, + raa_dmpvr2_1rail, + raa_dmpvr2_2rail, + raa_dmpvr2_2rail_nontc, + raa_dmpvr2_3rail, + raa_dmpvr2_hv, +}; + +static const struct i2c_device_id raa_dmpvr_id[]; + +static ssize_t isl68137_avs_enable_show_page(struct i2c_client *client, + int page, + char *buf) +{ + int val = wb_pmbus_read_byte_data(client, page, PMBUS_OPERATION); + + return sprintf(buf, "%d\n", + (val & ISL68137_VOUT_AVS) == ISL68137_VOUT_AVS ? 1 : 0); +} + +static ssize_t isl68137_avs_enable_store_page(struct i2c_client *client, + int page, + const char *buf, size_t count) +{ + int rc, op_val; + bool result; + + rc = kstrtobool(buf, &result); + if (rc) + return rc; + + op_val = result ? ISL68137_VOUT_AVS : 0; + + /* + * Writes to VOUT setpoint over AVSBus will persist after the VRM is + * switched to PMBus control. Switching back to AVSBus control + * restores this persisted setpoint rather than re-initializing to + * PMBus VOUT_COMMAND. Writing VOUT_COMMAND first over PMBus before + * enabling AVS control is the workaround. + */ + if (op_val == ISL68137_VOUT_AVS) { + rc = wb_pmbus_read_word_data(client, page, 0xff, + PMBUS_VOUT_COMMAND); + if (rc < 0) + return rc; + + rc = wb_pmbus_write_word_data(client, page, PMBUS_VOUT_COMMAND, + rc); + if (rc < 0) + return rc; + } + + rc = wb_pmbus_update_byte_data(client, page, PMBUS_OPERATION, + ISL68137_VOUT_AVS, op_val); + + return (rc < 0) ? rc : count; +} + +static ssize_t isl68137_avs_enable_show(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + + return isl68137_avs_enable_show_page(client, attr->index, buf); +} + +static ssize_t isl68137_avs_enable_store(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + + return isl68137_avs_enable_store_page(client, attr->index, buf, count); +} + +static ssize_t isl68137_avs_vout_show(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int ret, vout_cmd, vout; + + mutex_lock(&data->update_lock); + vout_cmd = wb_pmbus_read_word_data(client, attr->index, 0xff, PMBUS_VOUT_COMMAND); + if (vout_cmd < 0) { + WB_ISL68137_ERROR("%d-%04x: read page%d vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, attr->index, PMBUS_VOUT_COMMAND, ret); + mutex_unlock(&data->update_lock); + return vout_cmd; + } + vout = vout_cmd * 1000; + WB_ISL68137_VERBOSE("%d-%04x: page%d, vout: %d, vout_cmd: 0x%x\n", client->adapter->nr, + client->addr, attr->index, vout, vout_cmd); + mutex_unlock(&data->update_lock); + return snprintf(buf, PAGE_SIZE, "%d\n", vout); +} + +static ssize_t isl68137_avs_vout_store(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int vout, vout_max, vout_min; + int ret, vout_cmd, vout_cmd_set; + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &vout); + if (ret) { + WB_ISL68137_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + vout_max = data->vout_max[attr->index]; + vout_min = data->vout_min[attr->index]; + if ((vout > vout_max) || (vout < vout_min)) { + WB_ISL68137_ERROR("%d-%04x: vout value: %d, out of range [%d, %d] \n", client->adapter->nr, + client->addr, vout, vout_min, vout_max); + return -EINVAL; + } + + /* calc VOUT_COMMAND set value */ + vout_cmd_set = vout / 1000; + if (vout_cmd_set > 0xffff) { + WB_ISL68137_ERROR("%d-%04x: invalid value, vout %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, vout, vout_cmd_set); + return -EINVAL; + } + + mutex_lock(&data->update_lock); + + /* close write protect */ + ret = wb_pmbus_write_byte_data(client, attr->index, PMBUS_WRITE_PROTECT, WRITE_PROTECT_CLOSE); + if (ret < 0) { + WB_ISL68137_ERROR("%d-%04x: close page%d write protect failed, ret: %d\n", client->adapter->nr, + client->addr, attr->index, ret); + mutex_unlock(&data->update_lock); + return ret; + } + + /* set VOUT_COMMAND */ + ret = wb_pmbus_write_word_data(client, attr->index, PMBUS_VOUT_COMMAND, vout_cmd_set); + if (ret < 0) { + WB_ISL68137_ERROR("%d-%04x: set page%d vout cmd reg: 0x%x, value: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, attr->index, PMBUS_VOUT_COMMAND, vout_cmd_set, ret); + goto error; + } + + /* read back VOUT_COMMAND */ + vout_cmd = wb_pmbus_read_word_data(client, attr->index, 0xff, PMBUS_VOUT_COMMAND); + if (vout_cmd < 0) { + ret = vout_cmd; + WB_ISL68137_ERROR("%d-%04x: read page%d vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, attr->index, PMBUS_VOUT_COMMAND, ret); + goto error; + } + + /* compare vout_cmd and vout_cmd_set */ + if (vout_cmd != vout_cmd_set) { + ret = -EIO; + WB_ISL68137_ERROR("%d-%04x: vout cmd value check error, vout cmd read: 0x%x, vout cmd set: 0x%x\n", + client->adapter->nr, client->addr, vout_cmd, vout_cmd_set); + goto error; + } + + /* open write protect */ + wb_pmbus_write_byte_data(client, attr->index, PMBUS_WRITE_PROTECT, WRITE_PROTECT_OPEN); + mutex_unlock(&data->update_lock); + WB_ISL68137_VERBOSE("%d-%04x: set page%d vout cmd success, vout %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, attr->index, vout, vout_cmd_set); + return count; +error: + wb_pmbus_write_byte_data(client, attr->index, PMBUS_WRITE_PROTECT, WRITE_PROTECT_OPEN); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t isl68137_avs_vout_max_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int ret, vout_threshold; + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &vout_threshold); + if (ret) { + WB_ISL68137_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + WB_ISL68137_VERBOSE("%d-%04x: vout%d max threshold: %d", client->adapter->nr, client->addr, + attr->index, vout_threshold); + + data->vout_max[attr->index] = vout_threshold; + return count; +} + +static ssize_t isl68137_avs_vout_max_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + return snprintf(buf, PAGE_SIZE, "%d\n", data->vout_max[attr->index]); +} + +static ssize_t isl68137_avs_vout_min_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int ret, vout_threshold; + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &vout_threshold); + if (ret) { + WB_ISL68137_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + WB_ISL68137_VERBOSE("%d-%04x: vout%d min threshold: %d", client->adapter->nr, client->addr, + attr->index, vout_threshold); + + data->vout_min[attr->index] = vout_threshold; + return count; +} + +static ssize_t isl68137_avs_vout_min_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + return snprintf(buf, PAGE_SIZE, "%d\n", data->vout_min[attr->index]); +} + +static SENSOR_DEVICE_ATTR_RW(avs0_enable, isl68137_avs_enable, 0); +static SENSOR_DEVICE_ATTR_RW(avs1_enable, isl68137_avs_enable, 1); + +static SENSOR_DEVICE_ATTR_RW(avs0_vout, isl68137_avs_vout, 0); +static SENSOR_DEVICE_ATTR_RW(avs1_vout, isl68137_avs_vout, 1); +static SENSOR_DEVICE_ATTR_RW(avs0_vout_max, isl68137_avs_vout_max, 0); +static SENSOR_DEVICE_ATTR_RW(avs0_vout_min, isl68137_avs_vout_min, 0); +static SENSOR_DEVICE_ATTR_RW(avs1_vout_max, isl68137_avs_vout_max, 1); +static SENSOR_DEVICE_ATTR_RW(avs1_vout_min, isl68137_avs_vout_min, 1); + +static struct attribute *enable_attrs[] = { + &sensor_dev_attr_avs0_enable.dev_attr.attr, + &sensor_dev_attr_avs1_enable.dev_attr.attr, + NULL, +}; + +static struct attribute *avs_ctrl_attrs[] = { + &sensor_dev_attr_avs0_vout.dev_attr.attr, + &sensor_dev_attr_avs1_vout.dev_attr.attr, + &sensor_dev_attr_avs0_vout_max.dev_attr.attr, + &sensor_dev_attr_avs0_vout_min.dev_attr.attr, + &sensor_dev_attr_avs1_vout_max.dev_attr.attr, + &sensor_dev_attr_avs1_vout_min.dev_attr.attr, + NULL, +}; + +static const struct attribute_group enable_group = { + .attrs = enable_attrs, +}; + +static const struct attribute_group avs_ctrl_group = { + .attrs = avs_ctrl_attrs, +}; + +static const struct attribute_group *isl68137_attribute_groups[] = { + &enable_group, + &avs_ctrl_group, + NULL, +}; + +static int raa_dmpvr2_read_word_data(struct i2c_client *client, int page, + int phase, int reg) +{ + int ret; + + switch (reg) { + case PMBUS_VIRT_READ_VMON: + ret = wb_pmbus_read_word_data(client, page, phase, + RAA_DMPVR2_READ_VMON); + break; + default: + ret = -ENODATA; + break; + } + + return ret; +} + +static struct pmbus_driver_info raa_dmpvr_info = { + .pages = 3, + .format[PSC_VOLTAGE_IN] = direct, + .format[PSC_VOLTAGE_OUT] = direct, + .format[PSC_CURRENT_IN] = direct, + .format[PSC_CURRENT_OUT] = direct, + .format[PSC_POWER] = direct, + .format[PSC_TEMPERATURE] = direct, + .m[PSC_VOLTAGE_IN] = 1, + .b[PSC_VOLTAGE_IN] = 0, + .R[PSC_VOLTAGE_IN] = 2, + .m[PSC_VOLTAGE_OUT] = 1, + .b[PSC_VOLTAGE_OUT] = 0, + .R[PSC_VOLTAGE_OUT] = 3, + .m[PSC_CURRENT_IN] = 1, + .b[PSC_CURRENT_IN] = 0, + .R[PSC_CURRENT_IN] = 2, + .m[PSC_CURRENT_OUT] = 1, + .b[PSC_CURRENT_OUT] = 0, + .R[PSC_CURRENT_OUT] = 1, + .m[PSC_POWER] = 1, + .b[PSC_POWER] = 0, + .R[PSC_POWER] = 0, + .m[PSC_TEMPERATURE] = 1, + .b[PSC_TEMPERATURE] = 0, + .R[PSC_TEMPERATURE] = 0, + .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN + | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 + | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP + | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT + | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT + | PMBUS_HAVE_VMON, + .func[1] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT + | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP + | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT + | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT, + .func[2] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT + | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP + | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT + | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT, +}; + +static int isl68137_probe(struct i2c_client *client) +{ + struct pmbus_driver_info *info; + + info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + memcpy(info, &raa_dmpvr_info, sizeof(*info)); + + switch (i2c_match_id(raa_dmpvr_id, client)->driver_data) { + case raa_dmpvr1_2rail: + info->pages = 2; + info->R[PSC_VOLTAGE_IN] = 3; + info->func[0] &= ~PMBUS_HAVE_VMON; + info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT + | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT + | PMBUS_HAVE_POUT; + info->groups = isl68137_attribute_groups; + break; + case raa_dmpvr2_1rail: + info->pages = 1; + info->read_word_data = raa_dmpvr2_read_word_data; + break; + case raa_dmpvr2_2rail_nontc: + info->func[0] &= ~PMBUS_HAVE_TEMP3; + info->func[1] &= ~PMBUS_HAVE_TEMP3; + fallthrough; + case raa_dmpvr2_2rail: + info->pages = 2; + info->read_word_data = raa_dmpvr2_read_word_data; + break; + case raa_dmpvr2_3rail: + info->read_word_data = raa_dmpvr2_read_word_data; + break; + case raa_dmpvr2_hv: + info->pages = 1; + info->R[PSC_VOLTAGE_IN] = 1; + info->m[PSC_VOLTAGE_OUT] = 2; + info->R[PSC_VOLTAGE_OUT] = 2; + info->m[PSC_CURRENT_IN] = 2; + info->m[PSC_POWER] = 2; + info->R[PSC_POWER] = -1; + info->read_word_data = raa_dmpvr2_read_word_data; + break; + default: + return -ENODEV; + } + + return wb_pmbus_do_probe(client, info); +} + +static const struct i2c_device_id raa_dmpvr_id[] = { + {"wb_isl68127", raa_dmpvr1_2rail}, + {"wb_isl68137", raa_dmpvr1_2rail}, + {"wb_isl68220", raa_dmpvr2_2rail}, + {"wb_isl68221", raa_dmpvr2_3rail}, + {"wb_isl68222", raa_dmpvr2_2rail}, + {"wb_isl68223", raa_dmpvr2_2rail}, + {"wb_isl68224", raa_dmpvr2_3rail}, + {"wb_isl68225", raa_dmpvr2_2rail}, + {"wb_isl68226", raa_dmpvr2_3rail}, + {"wb_isl68227", raa_dmpvr2_1rail}, + {"wb_isl68229", raa_dmpvr2_3rail}, + {"wb_isl68233", raa_dmpvr2_2rail}, + {"wb_isl68239", raa_dmpvr2_3rail}, + + {"wb_isl69222", raa_dmpvr2_2rail}, + {"wb_isl69223", raa_dmpvr2_3rail}, + {"wb_isl69224", raa_dmpvr2_2rail}, + {"wb_isl69225", raa_dmpvr2_2rail}, + {"wb_isl69227", raa_dmpvr2_3rail}, + {"wb_isl69228", raa_dmpvr2_3rail}, + {"wb_isl69234", raa_dmpvr2_2rail}, + {"wb_isl69236", raa_dmpvr2_2rail}, + {"wb_isl69239", raa_dmpvr2_3rail}, + {"wb_isl69242", raa_dmpvr2_2rail}, + {"wb_isl69243", raa_dmpvr2_1rail}, + {"wb_isl69247", raa_dmpvr2_2rail}, + {"wb_isl69248", raa_dmpvr2_2rail}, + {"wb_isl69254", raa_dmpvr2_2rail}, + {"wb_isl69255", raa_dmpvr2_2rail}, + {"wb_isl69256", raa_dmpvr2_2rail}, + {"wb_isl69259", raa_dmpvr2_2rail}, + {"wb_isl69260", raa_dmpvr2_2rail}, + {"wb_isl69268", raa_dmpvr2_2rail}, + {"wb_isl69269", raa_dmpvr2_3rail}, + {"wb_isl69298", raa_dmpvr2_2rail}, + + {"wb_raa228000", raa_dmpvr2_hv}, + {"wb_raa228004", raa_dmpvr2_hv}, + {"wb_raa228006", raa_dmpvr2_hv}, + {"wb_raa228228", raa_dmpvr2_2rail_nontc}, + {"wb_raa229001", raa_dmpvr2_2rail}, + {"wb_raa229004", raa_dmpvr2_2rail}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, raa_dmpvr_id); + +/* This is the driver that will be inserted */ +static struct i2c_driver isl68137_driver = { + .driver = { + .name = "wb_isl68137", + }, + .probe_new = isl68137_probe, + .remove = wb_pmbus_do_remove, + .id_table = raa_dmpvr_id, +}; + +module_i2c_driver(isl68137_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus driver for Renesas digital multiphase voltage regulators"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c new file mode 100644 index 000000000000..b8291c553688 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c @@ -0,0 +1,987 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * lm75.c - Part of lm_sensors, Linux kernel modules for hardware + * monitoring + * Copyright (c) 1998, 1999 Frodo Looijaard + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_lm75.h" + +/* + * This driver handles the LM75 and compatible digital temperature sensors. + */ + +enum lm75_type { /* keep sorted in alphabetical order */ + adt75, + ds1775, + ds75, + ds7505, + g751, + lm75, + lm75a, + lm75b, + max6625, + max6626, + max31725, + mcp980x, + pct2075, + stds75, + stlm75, + tcn75, + tmp100, + tmp101, + tmp105, + tmp112, + tmp175, + tmp275, + tmp75, + tmp75b, + tmp75c, +}; + +/** + * struct lm75_params - lm75 configuration parameters. + * @set_mask: Bits to set in configuration register when configuring + * the chip. + * @clr_mask: Bits to clear in configuration register when configuring + * the chip. + * @default_resolution: Default number of bits to represent the temperature + * value. + * @resolution_limits: Limit register resolution. Optional. Should be set if + * the resolution of limit registers does not match the + * resolution of the temperature register. + * @resolutions: List of resolutions associated with sample times. + * Optional. Should be set if num_sample_times is larger + * than 1, and if the resolution changes with sample times. + * If set, number of entries must match num_sample_times. + * @default_sample_time:Sample time to be set by default. + * @num_sample_times: Number of possible sample times to be set. Optional. + * Should be set if the number of sample times is larger + * than one. + * @sample_times: All the possible sample times to be set. Mandatory if + * num_sample_times is larger than 1. If set, number of + * entries must match num_sample_times. + */ + +struct lm75_params { + u8 set_mask; + u8 clr_mask; + u8 default_resolution; + u8 resolution_limits; + const u8 *resolutions; + unsigned int default_sample_time; + u8 num_sample_times; + const unsigned int *sample_times; +}; +#if 0 +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, + 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; +#endif +/* The LM75 registers */ +#define LM75_REG_TEMP 0x00 +#define LM75_REG_CONF 0x01 +#define LM75_REG_HYST 0x02 +#define LM75_REG_MAX 0x03 +#define PCT2075_REG_IDLE 0x04 +#define LM75_TEMP_INVALID_RETRY_TIMES (3) + +/* Each client has this additional data */ +struct lm75_data { + struct i2c_client *client; + struct regmap *regmap; + struct regulator *vs; + u8 orig_conf; + u8 current_conf; + u8 resolution; /* In bits, 9 to 16 */ + unsigned int sample_time; /* In ms */ + enum lm75_type kind; + const struct lm75_params *params; +}; + +/*-----------------------------------------------------------------------*/ + +static const u8 lm75_sample_set_masks[] = { 0 << 5, 1 << 5, 2 << 5, 3 << 5 }; + +#define LM75_SAMPLE_CLEAR_MASK (3 << 5) + +/* The structure below stores the configuration values of the supported devices. + * In case of being supported multiple configurations, the default one must + * always be the first element of the array + */ +static const struct lm75_params device_params[] = { + [adt75] = { + .clr_mask = 1 << 5, /* not one-shot mode */ + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [ds1775] = { + .clr_mask = 3 << 5, + .set_mask = 2 << 5, /* 11-bit mode */ + .default_resolution = 11, + .default_sample_time = 500, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 125, 250, 500, 1000 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [ds75] = { + .clr_mask = 3 << 5, + .set_mask = 2 << 5, /* 11-bit mode */ + .default_resolution = 11, + .default_sample_time = 600, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 150, 300, 600, 1200 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [stds75] = { + .clr_mask = 3 << 5, + .set_mask = 2 << 5, /* 11-bit mode */ + .default_resolution = 11, + .default_sample_time = 600, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 150, 300, 600, 1200 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [stlm75] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 6, + }, + [ds7505] = { + .set_mask = 3 << 5, /* 12-bit mode*/ + .default_resolution = 12, + .default_sample_time = 200, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 25, 50, 100, 200 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [g751] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [lm75] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [lm75a] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [lm75b] = { + .default_resolution = 11, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [max6625] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 7, + }, + [max6626] = { + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 7, + .resolution_limits = 9, + }, + [max31725] = { + .default_resolution = 16, + .default_sample_time = MSEC_PER_SEC / 20, + }, + [tcn75] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 18, + }, + [pct2075] = { + .default_resolution = 11, + .default_sample_time = MSEC_PER_SEC / 10, + .num_sample_times = 31, + .sample_times = (unsigned int []){ 100, 200, 300, 400, 500, 600, + 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, + 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, + 2800, 2900, 3000, 3100 }, + }, + [mcp980x] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode */ + .default_resolution = 12, + .resolution_limits = 9, + .default_sample_time = 240, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 30, 60, 120, 240 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp100] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode */ + .default_resolution = 12, + .default_sample_time = 320, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 40, 80, 160, 320 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp101] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode */ + .default_resolution = 12, + .default_sample_time = 320, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 40, 80, 160, 320 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp105] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp112] = { + .set_mask = 3 << 5, /* 8 samples / second */ + .clr_mask = 1 << 7, /* no one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 125, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 125, 250, 1000, 4000 }, + }, + [tmp175] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp275] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp75] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp75b] = { /* not one-shot mode, Conversion rate 37Hz */ + .clr_mask = 1 << 7 | 3 << 5, + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 37, + .sample_times = (unsigned int []){ MSEC_PER_SEC / 37, + MSEC_PER_SEC / 18, + MSEC_PER_SEC / 9, MSEC_PER_SEC / 4 }, + .num_sample_times = 4, + }, + [tmp75c] = { + .clr_mask = 1 << 5, /*not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 12, + } +}; + +/* input temp threshold check */ +typedef struct lm75_temp_threshold_s { + int chip_type; + int temp_max; + int temp_min; +} lm75_temp_threshold_t; + +static lm75_temp_threshold_t g_lm75_temp_threshold_info[] = { + { + .chip_type = lm75, + .temp_max = 125000, + .temp_min = -55000, + }, +}; + +/*-----------------------------------------------------------------------*/ +static int lm75_input_temp_check(struct lm75_data *data, int input_val) +{ + int i, size; + + size = ARRAY_SIZE(g_lm75_temp_threshold_info); + + for (i = 0; i < size; i++) { + if (g_lm75_temp_threshold_info[i].chip_type == data->kind) { + if ((input_val > g_lm75_temp_threshold_info[i].temp_max) + || (input_val < g_lm75_temp_threshold_info[i].temp_min)) { + dev_dbg(&data->client->dev, "input temp: %d not in range[%d, %d]\n", + input_val, g_lm75_temp_threshold_info[i].temp_min, + g_lm75_temp_threshold_info[i].temp_max); + return -EINVAL; + } + dev_dbg(&data->client->dev, "input temp: %d in range[%d, %d]", input_val, + g_lm75_temp_threshold_info[i].temp_min, g_lm75_temp_threshold_info[i].temp_max); + return 0; + } + } + return 0; +} + +static inline long lm75_reg_to_mc(s16 temp, u8 resolution) +{ + return ((temp >> (16 - resolution)) * 1000) >> (resolution - 8); +} + +static int lm75_write_config(struct lm75_data *data, u8 set_mask, + u8 clr_mask) +{ + u8 value; + + clr_mask |= LM75_SHUTDOWN; + value = data->current_conf & ~clr_mask; + value |= set_mask; + + if (data->current_conf != value) { + s32 err; + + err = i2c_smbus_write_byte_data(data->client, LM75_REG_CONF, + value); + if (err) + return err; + data->current_conf = value; + } + return 0; +} + +static int lm75_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, + long *val) +{ + struct lm75_data *data = dev_get_drvdata(dev); + unsigned int regval; + int err, reg, i, ret; + + switch (type) { + case hwmon_chip: + switch (attr) { + case hwmon_chip_update_interval: + *val = data->sample_time; + break; + default: + return -EINVAL; + } + break; + case hwmon_temp: + switch (attr) { + case hwmon_temp_input: + reg = LM75_REG_TEMP; + break; + case hwmon_temp_max: + reg = LM75_REG_MAX; + break; + case hwmon_temp_max_hyst: + reg = LM75_REG_HYST; + break; + default: + return -EINVAL; + } + for (i = 0; i < LM75_TEMP_INVALID_RETRY_TIMES; i++) { + err = regmap_read(data->regmap, reg, ®val); + if (err < 0) { + return err; + } + *val = lm75_reg_to_mc(regval, data->resolution); + if (attr != LM75_REG_TEMP) { + return 0; + } + /* do input_temp_check */ + ret = lm75_input_temp_check(data, *val); + if (ret == 0) { /* input temp check ok */ + return 0; + } + if ((i + 1) < LM75_TEMP_INVALID_RETRY_TIMES) { + msleep(data->sample_time); + } + } + dev_info(&data->client->dev, "temp_input value: %ld invalid\n", *val); + return -EINVAL; + default: + return -EINVAL; + } + return 0; +} + +static int lm75_write_temp(struct device *dev, u32 attr, long temp) +{ + struct lm75_data *data = dev_get_drvdata(dev); + u8 resolution; + int reg; + + switch (attr) { + case hwmon_temp_max: + reg = LM75_REG_MAX; + break; + case hwmon_temp_max_hyst: + reg = LM75_REG_HYST; + break; + default: + return -EINVAL; + } + + /* + * Resolution of limit registers is assumed to be the same as the + * temperature input register resolution unless given explicitly. + */ + if (data->params->resolution_limits) + resolution = data->params->resolution_limits; + else + resolution = data->resolution; + + temp = clamp_val(temp, LM75_TEMP_MIN, LM75_TEMP_MAX); + temp = DIV_ROUND_CLOSEST(temp << (resolution - 8), + 1000) << (16 - resolution); + + return regmap_write(data->regmap, reg, (u16)temp); +} + +static int lm75_update_interval(struct device *dev, long val) +{ + struct lm75_data *data = dev_get_drvdata(dev); + unsigned int reg; + u8 index; + s32 err; + + index = find_closest(val, data->params->sample_times, + (int)data->params->num_sample_times); + + switch (data->kind) { + default: + err = lm75_write_config(data, lm75_sample_set_masks[index], + LM75_SAMPLE_CLEAR_MASK); + if (err) + return err; + + data->sample_time = data->params->sample_times[index]; + if (data->params->resolutions) + data->resolution = data->params->resolutions[index]; + break; + case tmp112: + err = regmap_read(data->regmap, LM75_REG_CONF, ®); + if (err < 0) + return err; + reg &= ~0x00c0; + reg |= (3 - index) << 6; + err = regmap_write(data->regmap, LM75_REG_CONF, reg); + if (err < 0) + return err; + data->sample_time = data->params->sample_times[index]; + break; + case pct2075: + err = i2c_smbus_write_byte_data(data->client, PCT2075_REG_IDLE, + index + 1); + if (err) + return err; + data->sample_time = data->params->sample_times[index]; + break; + } + return 0; +} + +static int lm75_write_chip(struct device *dev, u32 attr, long val) +{ + switch (attr) { + case hwmon_chip_update_interval: + return lm75_update_interval(dev, val); + default: + return -EINVAL; + } + return 0; +} + +static int lm75_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + switch (type) { + case hwmon_chip: + return lm75_write_chip(dev, attr, val); + case hwmon_temp: + return lm75_write_temp(dev, attr, val); + default: + return -EINVAL; + } + return 0; +} + +static umode_t lm75_is_visible(const void *data, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + const struct lm75_data *config_data = data; + + switch (type) { + case hwmon_chip: + switch (attr) { + case hwmon_chip_update_interval: + if (config_data->params->num_sample_times > 1) + return 0644; + return 0444; + } + break; + case hwmon_temp: + switch (attr) { + case hwmon_temp_input: + return 0444; + case hwmon_temp_max: + case hwmon_temp_max_hyst: + return 0644; + } + break; + default: + break; + } + return 0; +} + +static const struct hwmon_channel_info *lm75_info[] = { + HWMON_CHANNEL_INFO(chip, + HWMON_C_REGISTER_TZ | HWMON_C_UPDATE_INTERVAL), + HWMON_CHANNEL_INFO(temp, + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MAX_HYST), + NULL +}; + +static const struct hwmon_ops lm75_hwmon_ops = { + .is_visible = lm75_is_visible, + .read = lm75_read, + .write = lm75_write, +}; + +static const struct hwmon_chip_info lm75_chip_info = { + .ops = &lm75_hwmon_ops, + .info = lm75_info, +}; + +static bool lm75_is_writeable_reg(struct device *dev, unsigned int reg) +{ + return reg != LM75_REG_TEMP; +} + +static bool lm75_is_volatile_reg(struct device *dev, unsigned int reg) +{ + return reg == LM75_REG_TEMP || reg == LM75_REG_CONF; +} + +static const struct regmap_config lm75_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + .max_register = PCT2075_REG_IDLE, + .writeable_reg = lm75_is_writeable_reg, + .volatile_reg = lm75_is_volatile_reg, + .val_format_endian = REGMAP_ENDIAN_BIG, + .cache_type = REGCACHE_RBTREE, + .use_single_read = true, + .use_single_write = true, +}; + +static void lm75_disable_regulator(void *data) +{ + struct lm75_data *lm75 = data; + + regulator_disable(lm75->vs); +} + +static void lm75_remove(void *data) +{ + struct lm75_data *lm75 = data; + struct i2c_client *client = lm75->client; + + i2c_smbus_write_byte_data(client, LM75_REG_CONF, lm75->orig_conf); +} + +static const struct i2c_device_id lm75_ids[]; + +static int lm75_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct device *hwmon_dev; + struct lm75_data *data; + int status, err; + enum lm75_type kind; + + if (client->dev.of_node) + kind = (enum lm75_type)of_device_get_match_data(&client->dev); + else + kind = i2c_match_id(lm75_ids, client)->driver_data; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = devm_kzalloc(dev, sizeof(struct lm75_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->client = client; + data->kind = kind; + + data->vs = devm_regulator_get(dev, "vs"); + if (IS_ERR(data->vs)) + return PTR_ERR(data->vs); + + data->regmap = devm_regmap_init_i2c(client, &lm75_regmap_config); + if (IS_ERR(data->regmap)) + return PTR_ERR(data->regmap); + + /* Set to LM75 resolution (9 bits, 1/2 degree C) and range. + * Then tweak to be more precise when appropriate. + */ + + data->params = &device_params[data->kind]; + + /* Save default sample time and resolution*/ + data->sample_time = data->params->default_sample_time; + data->resolution = data->params->default_resolution; + + /* Enable the power */ + err = regulator_enable(data->vs); + if (err) { + dev_err(dev, "failed to enable regulator: %d\n", err); + return err; + } + + err = devm_add_action_or_reset(dev, lm75_disable_regulator, data); + if (err) + return err; + + /* Cache original configuration */ + status = i2c_smbus_read_byte_data(client, LM75_REG_CONF); + if (status < 0) { + dev_dbg(dev, "Can't read config? %d\n", status); + return status; + } + data->orig_conf = status; + data->current_conf = status; + + err = lm75_write_config(data, data->params->set_mask, + data->params->clr_mask); + if (err) + return err; + + err = devm_add_action_or_reset(dev, lm75_remove, data); + if (err) + return err; + + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, + data, &lm75_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) + return PTR_ERR(hwmon_dev); + + dev_info(dev, "%s: sensor '%s'\n", dev_name(hwmon_dev), client->name); + + return 0; +} + +static const struct i2c_device_id lm75_ids[] = { + { "wb_adt75", adt75, }, + { "wb_ds1775", ds1775, }, + { "wb_ds75", ds75, }, + { "wb_ds7505", ds7505, }, + { "wb_g751", g751, }, + { "wb_lm75", lm75, }, + { "wb_lm75a", lm75a, }, + { "wb_lm75b", lm75b, }, + { "wb_max6625", max6625, }, + { "wb_max6626", max6626, }, + { "wb_max31725", max31725, }, + { "wb_max31726", max31725, }, + { "wb_mcp980x", mcp980x, }, + { "wb_pct2075", pct2075, }, + { "wb_stds75", stds75, }, + { "wb_stlm75", stlm75, }, + { "wb_tcn75", tcn75, }, + { "wb_tmp100", tmp100, }, + { "wb_tmp101", tmp101, }, + { "wb_tmp105", tmp105, }, + { "wb_tmp112", tmp112, }, + { "wb_tmp175", tmp175, }, + { "wb_tmp275", tmp275, }, + { "wb_tmp75", tmp75, }, + { "wb_tmp75b", tmp75b, }, + { "wb_tmp75c", tmp75c, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, lm75_ids); + +static const struct of_device_id __maybe_unused lm75_of_match[] = { + { + .compatible = "adi,adt75", + .data = (void *)adt75 + }, + { + .compatible = "dallas,ds1775", + .data = (void *)ds1775 + }, + { + .compatible = "dallas,ds75", + .data = (void *)ds75 + }, + { + .compatible = "dallas,ds7505", + .data = (void *)ds7505 + }, + { + .compatible = "gmt,g751", + .data = (void *)g751 + }, + { + .compatible = "national,lm75", + .data = (void *)lm75 + }, + { + .compatible = "national,lm75a", + .data = (void *)lm75a + }, + { + .compatible = "national,lm75b", + .data = (void *)lm75b + }, + { + .compatible = "maxim,max6625", + .data = (void *)max6625 + }, + { + .compatible = "maxim,max6626", + .data = (void *)max6626 + }, + { + .compatible = "maxim,max31725", + .data = (void *)max31725 + }, + { + .compatible = "maxim,max31726", + .data = (void *)max31725 + }, + { + .compatible = "maxim,mcp980x", + .data = (void *)mcp980x + }, + { + .compatible = "nxp,pct2075", + .data = (void *)pct2075 + }, + { + .compatible = "st,stds75", + .data = (void *)stds75 + }, + { + .compatible = "st,stlm75", + .data = (void *)stlm75 + }, + { + .compatible = "microchip,tcn75", + .data = (void *)tcn75 + }, + { + .compatible = "ti,tmp100", + .data = (void *)tmp100 + }, + { + .compatible = "ti,tmp101", + .data = (void *)tmp101 + }, + { + .compatible = "ti,tmp105", + .data = (void *)tmp105 + }, + { + .compatible = "ti,tmp112", + .data = (void *)tmp112 + }, + { + .compatible = "ti,tmp175", + .data = (void *)tmp175 + }, + { + .compatible = "ti,tmp275", + .data = (void *)tmp275 + }, + { + .compatible = "ti,tmp75", + .data = (void *)tmp75 + }, + { + .compatible = "ti,tmp75b", + .data = (void *)tmp75b + }, + { + .compatible = "ti,tmp75c", + .data = (void *)tmp75c + }, + { }, +}; +MODULE_DEVICE_TABLE(of, lm75_of_match); + +#define LM75A_ID 0xA1 +#if 0 +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int lm75_detect(struct i2c_client *new_client, + struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = new_client->adapter; + int i; + int conf, hyst, os; + bool is_lm75a = 0; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) + return -ENODEV; + + /* + * Now, we do the remaining detection. There is no identification- + * dedicated register so we have to rely on several tricks: + * unused bits, registers cycling over 8-address boundaries, + * addresses 0x04-0x07 returning the last read value. + * The cycling+unused addresses combination is not tested, + * since it would significantly slow the detection down and would + * hardly add any value. + * + * The National Semiconductor LM75A is different than earlier + * LM75s. It has an ID byte of 0xaX (where X is the chip + * revision, with 1 being the only revision in existence) in + * register 7, and unused registers return 0xff rather than the + * last read value. + * + * Note that this function only detects the original National + * Semiconductor LM75 and the LM75A. Clones from other vendors + * aren't detected, on purpose, because they are typically never + * found on PC hardware. They are found on embedded designs where + * they can be instantiated explicitly so detection is not needed. + * The absence of identification registers on all these clones + * would make their exhaustive detection very difficult and weak, + * and odds are that the driver would bind to unsupported devices. + */ + + /* Unused bits */ + conf = i2c_smbus_read_byte_data(new_client, 1); + if (conf & 0xe0) + return -ENODEV; + + /* First check for LM75A */ + if (i2c_smbus_read_byte_data(new_client, 7) == LM75A_ID) { + /* + * LM75A returns 0xff on unused registers so + * just to be sure we check for that too. + */ + if (i2c_smbus_read_byte_data(new_client, 4) != 0xff + || i2c_smbus_read_byte_data(new_client, 5) != 0xff + || i2c_smbus_read_byte_data(new_client, 6) != 0xff) + return -ENODEV; + is_lm75a = 1; + hyst = i2c_smbus_read_byte_data(new_client, 2); + os = i2c_smbus_read_byte_data(new_client, 3); + } else { /* Traditional style LM75 detection */ + /* Unused addresses */ + hyst = i2c_smbus_read_byte_data(new_client, 2); + if (i2c_smbus_read_byte_data(new_client, 4) != hyst + || i2c_smbus_read_byte_data(new_client, 5) != hyst + || i2c_smbus_read_byte_data(new_client, 6) != hyst + || i2c_smbus_read_byte_data(new_client, 7) != hyst) + return -ENODEV; + os = i2c_smbus_read_byte_data(new_client, 3); + if (i2c_smbus_read_byte_data(new_client, 4) != os + || i2c_smbus_read_byte_data(new_client, 5) != os + || i2c_smbus_read_byte_data(new_client, 6) != os + || i2c_smbus_read_byte_data(new_client, 7) != os) + return -ENODEV; + } + /* + * It is very unlikely that this is a LM75 if both + * hysteresis and temperature limit registers are 0. + */ + if (hyst == 0 && os == 0) + return -ENODEV; + + /* Addresses cycling */ + for (i = 8; i <= 248; i += 40) { + if (i2c_smbus_read_byte_data(new_client, i + 1) != conf + || i2c_smbus_read_byte_data(new_client, i + 2) != hyst + || i2c_smbus_read_byte_data(new_client, i + 3) != os) + return -ENODEV; + if (is_lm75a && i2c_smbus_read_byte_data(new_client, i + 7) + != LM75A_ID) + return -ENODEV; + } + + strlcpy(info->type, is_lm75a ? "lm75a" : "lm75", I2C_NAME_SIZE); + + return 0; +} +#endif + +#ifdef CONFIG_PM +static int lm75_suspend(struct device *dev) +{ + int status; + struct i2c_client *client = to_i2c_client(dev); + + status = i2c_smbus_read_byte_data(client, LM75_REG_CONF); + if (status < 0) { + dev_dbg(&client->dev, "Can't read config? %d\n", status); + return status; + } + status = status | LM75_SHUTDOWN; + i2c_smbus_write_byte_data(client, LM75_REG_CONF, status); + return 0; +} + +static int lm75_resume(struct device *dev) +{ + int status; + struct i2c_client *client = to_i2c_client(dev); + + status = i2c_smbus_read_byte_data(client, LM75_REG_CONF); + if (status < 0) { + dev_dbg(&client->dev, "Can't read config? %d\n", status); + return status; + } + status = status & ~LM75_SHUTDOWN; + i2c_smbus_write_byte_data(client, LM75_REG_CONF, status); + return 0; +} + +static const struct dev_pm_ops lm75_dev_pm_ops = { + .suspend = lm75_suspend, + .resume = lm75_resume, +}; +#define LM75_DEV_PM_OPS (&lm75_dev_pm_ops) +#else +#define LM75_DEV_PM_OPS NULL +#endif /* CONFIG_PM */ + +static struct i2c_driver lm75_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wb_lm75", + .of_match_table = of_match_ptr(lm75_of_match), + .pm = LM75_DEV_PM_OPS, + }, + .probe_new = lm75_probe, + .id_table = lm75_ids, + /* .detect = lm75_detect, */ + /* .address_list = normal_i2c, */ +}; + +module_i2c_driver(lm75_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("LM75 driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h new file mode 100644 index 000000000000..a398171162a8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * lm75.h - Part of lm_sensors, Linux kernel modules for hardware monitoring + * Copyright (c) 2003 Mark M. Hoffman + */ + +/* + * This file contains common code for encoding/decoding LM75 type + * temperature readings, which are emulated by many of the chips + * we support. As the user is unlikely to load more than one driver + * which contains this code, we don't worry about the wasted space. + */ + +#include + +/* straight from the datasheet */ +#define LM75_TEMP_MIN (-55000) +#define LM75_TEMP_MAX 125000 +#define LM75_SHUTDOWN 0x01 + +/* + * TEMP: 0.001C/bit (-55C to +125C) + * REG: (0.5C/bit, two's complement) << 7 + */ +static inline u16 LM75_TEMP_TO_REG(long temp) +{ + int ntemp = clamp_val(temp, LM75_TEMP_MIN, LM75_TEMP_MAX); + + ntemp += (ntemp < 0 ? -250 : 250); + return (u16)((ntemp / 500) << 7); +} + +static inline int LM75_TEMP_FROM_REG(u16 reg) +{ + /* + * use integer division instead of equivalent right shift to + * guarantee arithmetic shift and preserve the sign + */ + return ((s16)reg / 128) * 500; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h new file mode 100644 index 000000000000..9fb2c9017ae6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h @@ -0,0 +1,535 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * wb_pmbus.h - Common defines and structures for PMBus devices + * + * Copyright (c) 2010, 2011 Ericsson AB. + * Copyright (c) 2012 Guenter Roeck + */ + +#ifndef WB_PMBUS_H +#define WB_PMBUS_H + +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +/* + * Registers + */ +enum pmbus_regs { + PMBUS_PAGE = 0x00, + PMBUS_OPERATION = 0x01, + PMBUS_ON_OFF_CONFIG = 0x02, + PMBUS_CLEAR_FAULTS = 0x03, + PMBUS_PHASE = 0x04, + + PMBUS_WRITE_PROTECT = 0x10, + + PMBUS_CAPABILITY = 0x19, + PMBUS_QUERY = 0x1A, + + PMBUS_VOUT_MODE = 0x20, + PMBUS_VOUT_COMMAND = 0x21, + PMBUS_VOUT_TRIM = 0x22, + PMBUS_VOUT_CAL_OFFSET = 0x23, + PMBUS_VOUT_MAX = 0x24, + PMBUS_VOUT_MARGIN_HIGH = 0x25, + PMBUS_VOUT_MARGIN_LOW = 0x26, + PMBUS_VOUT_TRANSITION_RATE = 0x27, + PMBUS_VOUT_DROOP = 0x28, + PMBUS_VOUT_SCALE_LOOP = 0x29, + PMBUS_VOUT_SCALE_MONITOR = 0x2A, + + PMBUS_COEFFICIENTS = 0x30, + PMBUS_POUT_MAX = 0x31, + + PMBUS_FAN_CONFIG_12 = 0x3A, + PMBUS_FAN_COMMAND_1 = 0x3B, + PMBUS_FAN_COMMAND_2 = 0x3C, + PMBUS_FAN_CONFIG_34 = 0x3D, + PMBUS_FAN_COMMAND_3 = 0x3E, + PMBUS_FAN_COMMAND_4 = 0x3F, + + PMBUS_VOUT_OV_FAULT_LIMIT = 0x40, + PMBUS_VOUT_OV_FAULT_RESPONSE = 0x41, + PMBUS_VOUT_OV_WARN_LIMIT = 0x42, + PMBUS_VOUT_UV_WARN_LIMIT = 0x43, + PMBUS_VOUT_UV_FAULT_LIMIT = 0x44, + PMBUS_VOUT_UV_FAULT_RESPONSE = 0x45, + PMBUS_IOUT_OC_FAULT_LIMIT = 0x46, + PMBUS_IOUT_OC_FAULT_RESPONSE = 0x47, + PMBUS_IOUT_OC_LV_FAULT_LIMIT = 0x48, + PMBUS_IOUT_OC_LV_FAULT_RESPONSE = 0x49, + PMBUS_IOUT_OC_WARN_LIMIT = 0x4A, + PMBUS_IOUT_UC_FAULT_LIMIT = 0x4B, + PMBUS_IOUT_UC_FAULT_RESPONSE = 0x4C, + + PMBUS_OT_FAULT_LIMIT = 0x4F, + PMBUS_OT_FAULT_RESPONSE = 0x50, + PMBUS_OT_WARN_LIMIT = 0x51, + PMBUS_UT_WARN_LIMIT = 0x52, + PMBUS_UT_FAULT_LIMIT = 0x53, + PMBUS_UT_FAULT_RESPONSE = 0x54, + PMBUS_VIN_OV_FAULT_LIMIT = 0x55, + PMBUS_VIN_OV_FAULT_RESPONSE = 0x56, + PMBUS_VIN_OV_WARN_LIMIT = 0x57, + PMBUS_VIN_UV_WARN_LIMIT = 0x58, + PMBUS_VIN_UV_FAULT_LIMIT = 0x59, + + PMBUS_IIN_OC_FAULT_LIMIT = 0x5B, + PMBUS_IIN_OC_WARN_LIMIT = 0x5D, + + PMBUS_POUT_OP_FAULT_LIMIT = 0x68, + PMBUS_POUT_OP_WARN_LIMIT = 0x6A, + PMBUS_PIN_OP_WARN_LIMIT = 0x6B, + + PMBUS_STATUS_BYTE = 0x78, + PMBUS_STATUS_WORD = 0x79, + PMBUS_STATUS_VOUT = 0x7A, + PMBUS_STATUS_IOUT = 0x7B, + PMBUS_STATUS_INPUT = 0x7C, + PMBUS_STATUS_TEMPERATURE = 0x7D, + PMBUS_STATUS_CML = 0x7E, + PMBUS_STATUS_OTHER = 0x7F, + PMBUS_STATUS_MFR_SPECIFIC = 0x80, + PMBUS_STATUS_FAN_12 = 0x81, + PMBUS_STATUS_FAN_34 = 0x82, + + PMBUS_READ_VIN = 0x88, + PMBUS_READ_IIN = 0x89, + PMBUS_READ_VCAP = 0x8A, + PMBUS_READ_VOUT = 0x8B, + PMBUS_READ_IOUT = 0x8C, + PMBUS_READ_TEMPERATURE_1 = 0x8D, + PMBUS_READ_TEMPERATURE_2 = 0x8E, + PMBUS_READ_TEMPERATURE_3 = 0x8F, + PMBUS_READ_FAN_SPEED_1 = 0x90, + PMBUS_READ_FAN_SPEED_2 = 0x91, + PMBUS_READ_FAN_SPEED_3 = 0x92, + PMBUS_READ_FAN_SPEED_4 = 0x93, + PMBUS_READ_DUTY_CYCLE = 0x94, + PMBUS_READ_FREQUENCY = 0x95, + PMBUS_READ_POUT = 0x96, + PMBUS_READ_PIN = 0x97, + + PMBUS_REVISION = 0x98, + PMBUS_MFR_ID = 0x99, + PMBUS_MFR_MODEL = 0x9A, + PMBUS_MFR_REVISION = 0x9B, + PMBUS_MFR_LOCATION = 0x9C, + PMBUS_MFR_DATE = 0x9D, + PMBUS_MFR_SERIAL = 0x9E, + + PMBUS_MFR_VIN_MIN = 0xA0, + PMBUS_MFR_VIN_MAX = 0xA1, + PMBUS_MFR_IIN_MAX = 0xA2, + PMBUS_MFR_PIN_MAX = 0xA3, + PMBUS_MFR_VOUT_MIN = 0xA4, + PMBUS_MFR_VOUT_MAX = 0xA5, + PMBUS_MFR_IOUT_MAX = 0xA6, + PMBUS_MFR_POUT_MAX = 0xA7, + + PMBUS_IC_DEVICE_ID = 0xAD, + PMBUS_IC_DEVICE_REV = 0xAE, + + PMBUS_MFR_MAX_TEMP_1 = 0xC0, + PMBUS_MFR_MAX_TEMP_2 = 0xC1, + PMBUS_MFR_MAX_TEMP_3 = 0xC2, + +/* + * Virtual registers. + * Useful to support attributes which are not supported by standard PMBus + * registers but exist as manufacturer specific registers on individual chips. + * Must be mapped to real registers in device specific code. + * + * Semantics: + * Virtual registers are all word size. + * READ registers are read-only; writes are either ignored or return an error. + * RESET registers are read/write. Reading reset registers returns zero + * (used for detection), writing any value causes the associated history to be + * reset. + * Virtual registers have to be handled in device specific driver code. Chip + * driver code returns non-negative register values if a virtual register is + * supported, or a negative error code if not. The chip driver may return + * -ENODATA or any other error code in this case, though an error code other + * than -ENODATA is handled more efficiently and thus preferred. Either case, + * the calling PMBus core code will abort if the chip driver returns an error + * code when reading or writing virtual registers. + */ + PMBUS_VIRT_BASE = 0x100, + PMBUS_VIRT_READ_TEMP_AVG, + PMBUS_VIRT_READ_TEMP_MIN, + PMBUS_VIRT_READ_TEMP_MAX, + PMBUS_VIRT_RESET_TEMP_HISTORY, + PMBUS_VIRT_READ_VIN_AVG, + PMBUS_VIRT_READ_VIN_MIN, + PMBUS_VIRT_READ_VIN_MAX, + PMBUS_VIRT_RESET_VIN_HISTORY, + PMBUS_VIRT_READ_IIN_AVG, + PMBUS_VIRT_READ_IIN_MIN, + PMBUS_VIRT_READ_IIN_MAX, + PMBUS_VIRT_RESET_IIN_HISTORY, + PMBUS_VIRT_READ_PIN_AVG, + PMBUS_VIRT_READ_PIN_MIN, + PMBUS_VIRT_READ_PIN_MAX, + PMBUS_VIRT_RESET_PIN_HISTORY, + PMBUS_VIRT_READ_POUT_AVG, + PMBUS_VIRT_READ_POUT_MIN, + PMBUS_VIRT_READ_POUT_MAX, + PMBUS_VIRT_RESET_POUT_HISTORY, + PMBUS_VIRT_READ_VOUT_AVG, + PMBUS_VIRT_READ_VOUT_MIN, + PMBUS_VIRT_READ_VOUT_MAX, + PMBUS_VIRT_RESET_VOUT_HISTORY, + PMBUS_VIRT_READ_IOUT_AVG, + PMBUS_VIRT_READ_IOUT_MIN, + PMBUS_VIRT_READ_IOUT_MAX, + PMBUS_VIRT_RESET_IOUT_HISTORY, + PMBUS_VIRT_READ_TEMP2_AVG, + PMBUS_VIRT_READ_TEMP2_MIN, + PMBUS_VIRT_READ_TEMP2_MAX, + PMBUS_VIRT_RESET_TEMP2_HISTORY, + + PMBUS_VIRT_READ_VMON, + PMBUS_VIRT_VMON_UV_WARN_LIMIT, + PMBUS_VIRT_VMON_OV_WARN_LIMIT, + PMBUS_VIRT_VMON_UV_FAULT_LIMIT, + PMBUS_VIRT_VMON_OV_FAULT_LIMIT, + PMBUS_VIRT_STATUS_VMON, + + /* + * RPM and PWM Fan control + * + * Drivers wanting to expose PWM control must define the behaviour of + * PMBUS_VIRT_PWM_[1-4] and PMBUS_VIRT_PWM_ENABLE_[1-4] in the + * {read,write}_word_data callback. + * + * pmbus core provides a default implementation for + * PMBUS_VIRT_FAN_TARGET_[1-4]. + * + * TARGET, PWM and PWM_ENABLE members must be defined sequentially; + * pmbus core uses the difference between the provided register and + * it's _1 counterpart to calculate the FAN/PWM ID. + */ + PMBUS_VIRT_FAN_TARGET_1, + PMBUS_VIRT_FAN_TARGET_2, + PMBUS_VIRT_FAN_TARGET_3, + PMBUS_VIRT_FAN_TARGET_4, + PMBUS_VIRT_PWM_1, + PMBUS_VIRT_PWM_2, + PMBUS_VIRT_PWM_3, + PMBUS_VIRT_PWM_4, + PMBUS_VIRT_PWM_ENABLE_1, + PMBUS_VIRT_PWM_ENABLE_2, + PMBUS_VIRT_PWM_ENABLE_3, + PMBUS_VIRT_PWM_ENABLE_4, + + /* Samples for average + * + * Drivers wanting to expose functionality for changing the number of + * samples used for average values should implement support in + * {read,write}_word_data callback for either PMBUS_VIRT_SAMPLES if it + * applies to all types of measurements, or any number of specific + * PMBUS_VIRT_*_SAMPLES registers to allow for individual control. + */ + PMBUS_VIRT_SAMPLES, + PMBUS_VIRT_IN_SAMPLES, + PMBUS_VIRT_CURR_SAMPLES, + PMBUS_VIRT_POWER_SAMPLES, + PMBUS_VIRT_TEMP_SAMPLES, +}; + +/* + * OPERATION + */ +#define PB_OPERATION_CONTROL_ON BIT(7) + +/* + * WRITE_PROTECT + */ +#define PB_WP_ALL BIT(7) /* all but WRITE_PROTECT */ +#define PB_WP_OP BIT(6) /* all but WP, OPERATION, PAGE */ +#define PB_WP_VOUT BIT(5) /* all but WP, OPERATION, PAGE, VOUT, ON_OFF */ + +#define PB_WP_ANY (PB_WP_ALL | PB_WP_OP | PB_WP_VOUT) + +/* + * CAPABILITY + */ +#define PB_CAPABILITY_SMBALERT BIT(4) +#define PB_CAPABILITY_ERROR_CHECK BIT(7) + +/* + * VOUT_MODE + */ +#define PB_VOUT_MODE_MODE_MASK 0xe0 +#define PB_VOUT_MODE_PARAM_MASK 0x1f + +#define PB_VOUT_MODE_LINEAR 0x00 +#define PB_VOUT_MODE_VID 0x20 +#define PB_VOUT_MODE_DIRECT 0x40 + +/* + * Fan configuration + */ +#define PB_FAN_2_PULSE_MASK (BIT(0) | BIT(1)) +#define PB_FAN_2_RPM BIT(2) +#define PB_FAN_2_INSTALLED BIT(3) +#define PB_FAN_1_PULSE_MASK (BIT(4) | BIT(5)) +#define PB_FAN_1_RPM BIT(6) +#define PB_FAN_1_INSTALLED BIT(7) + +enum pmbus_fan_mode { percent = 0, rpm }; + +/* + * STATUS_BYTE, STATUS_WORD (lower) + */ +#define PB_STATUS_NONE_ABOVE BIT(0) +#define PB_STATUS_CML BIT(1) +#define PB_STATUS_TEMPERATURE BIT(2) +#define PB_STATUS_VIN_UV BIT(3) +#define PB_STATUS_IOUT_OC BIT(4) +#define PB_STATUS_VOUT_OV BIT(5) +#define PB_STATUS_OFF BIT(6) +#define PB_STATUS_BUSY BIT(7) + +/* + * STATUS_WORD (upper) + */ +#define PB_STATUS_UNKNOWN BIT(8) +#define PB_STATUS_OTHER BIT(9) +#define PB_STATUS_FANS BIT(10) +#define PB_STATUS_POWER_GOOD_N BIT(11) +#define PB_STATUS_WORD_MFR BIT(12) +#define PB_STATUS_INPUT BIT(13) +#define PB_STATUS_IOUT_POUT BIT(14) +#define PB_STATUS_VOUT BIT(15) + +/* + * STATUS_IOUT + */ +#define PB_POUT_OP_WARNING BIT(0) +#define PB_POUT_OP_FAULT BIT(1) +#define PB_POWER_LIMITING BIT(2) +#define PB_CURRENT_SHARE_FAULT BIT(3) +#define PB_IOUT_UC_FAULT BIT(4) +#define PB_IOUT_OC_WARNING BIT(5) +#define PB_IOUT_OC_LV_FAULT BIT(6) +#define PB_IOUT_OC_FAULT BIT(7) + +/* + * STATUS_VOUT, STATUS_INPUT + */ +#define PB_VOLTAGE_UV_FAULT BIT(4) +#define PB_VOLTAGE_UV_WARNING BIT(5) +#define PB_VOLTAGE_OV_WARNING BIT(6) +#define PB_VOLTAGE_OV_FAULT BIT(7) + +/* + * STATUS_INPUT + */ +#define PB_PIN_OP_WARNING BIT(0) +#define PB_IIN_OC_WARNING BIT(1) +#define PB_IIN_OC_FAULT BIT(2) + +/* + * STATUS_TEMPERATURE + */ +#define PB_TEMP_UT_FAULT BIT(4) +#define PB_TEMP_UT_WARNING BIT(5) +#define PB_TEMP_OT_WARNING BIT(6) +#define PB_TEMP_OT_FAULT BIT(7) + +/* + * STATUS_FAN + */ +#define PB_FAN_AIRFLOW_WARNING BIT(0) +#define PB_FAN_AIRFLOW_FAULT BIT(1) +#define PB_FAN_FAN2_SPEED_OVERRIDE BIT(2) +#define PB_FAN_FAN1_SPEED_OVERRIDE BIT(3) +#define PB_FAN_FAN2_WARNING BIT(4) +#define PB_FAN_FAN1_WARNING BIT(5) +#define PB_FAN_FAN2_FAULT BIT(6) +#define PB_FAN_FAN1_FAULT BIT(7) + +/* + * CML_FAULT_STATUS + */ +#define PB_CML_FAULT_OTHER_MEM_LOGIC BIT(0) +#define PB_CML_FAULT_OTHER_COMM BIT(1) +#define PB_CML_FAULT_PROCESSOR BIT(3) +#define PB_CML_FAULT_MEMORY BIT(4) +#define PB_CML_FAULT_PACKET_ERROR BIT(5) +#define PB_CML_FAULT_INVALID_DATA BIT(6) +#define PB_CML_FAULT_INVALID_COMMAND BIT(7) + +enum pmbus_sensor_classes { + PSC_VOLTAGE_IN = 0, + PSC_VOLTAGE_OUT, + PSC_CURRENT_IN, + PSC_CURRENT_OUT, + PSC_POWER, + PSC_TEMPERATURE, + PSC_FAN, + PSC_PWM, + PSC_NUM_CLASSES /* Number of power sensor classes */ +}; + +#define PMBUS_PAGES 32 /* Per PMBus specification */ +#define PMBUS_PHASES 8 /* Maximum number of phases per page */ + +/* Functionality bit mask */ +#define PMBUS_HAVE_VIN BIT(0) +#define PMBUS_HAVE_VCAP BIT(1) +#define PMBUS_HAVE_VOUT BIT(2) +#define PMBUS_HAVE_IIN BIT(3) +#define PMBUS_HAVE_IOUT BIT(4) +#define PMBUS_HAVE_PIN BIT(5) +#define PMBUS_HAVE_POUT BIT(6) +#define PMBUS_HAVE_FAN12 BIT(7) +#define PMBUS_HAVE_FAN34 BIT(8) +#define PMBUS_HAVE_TEMP BIT(9) +#define PMBUS_HAVE_TEMP2 BIT(10) +#define PMBUS_HAVE_TEMP3 BIT(11) +#define PMBUS_HAVE_STATUS_VOUT BIT(12) +#define PMBUS_HAVE_STATUS_IOUT BIT(13) +#define PMBUS_HAVE_STATUS_INPUT BIT(14) +#define PMBUS_HAVE_STATUS_TEMP BIT(15) +#define PMBUS_HAVE_STATUS_FAN12 BIT(16) +#define PMBUS_HAVE_STATUS_FAN34 BIT(17) +#define PMBUS_HAVE_VMON BIT(18) +#define PMBUS_HAVE_STATUS_VMON BIT(19) +#define PMBUS_HAVE_PWM12 BIT(20) +#define PMBUS_HAVE_PWM34 BIT(21) +#define PMBUS_HAVE_SAMPLES BIT(22) + +#define PMBUS_PHASE_VIRTUAL BIT(30) /* Phases on this page are virtual */ +#define PMBUS_PAGE_VIRTUAL BIT(31) /* Page is virtual */ + +enum pmbus_data_format { linear = 0, direct, vid }; +enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv }; + +struct pmbus_driver_info { + int pages; /* Total number of pages */ + u8 phases[PMBUS_PAGES]; /* Number of phases per page */ + enum pmbus_data_format format[PSC_NUM_CLASSES]; + enum vrm_version vrm_version[PMBUS_PAGES]; /* vrm version per page */ + /* + * Support one set of coefficients for each sensor type + * Used for chips providing data in direct mode. + */ + int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */ + int b[PSC_NUM_CLASSES]; /* offset */ + int R[PSC_NUM_CLASSES]; /* exponent */ + + u32 func[PMBUS_PAGES]; /* Functionality, per page */ + u32 pfunc[PMBUS_PHASES];/* Functionality, per phase */ + /* + * The following functions map manufacturing specific register values + * to PMBus standard register values. Specify only if mapping is + * necessary. + * Functions return the register value (read) or zero (write) if + * successful. A return value of -ENODATA indicates that there is no + * manufacturer specific register, but that a standard PMBus register + * may exist. Any other negative return value indicates that the + * register does not exist, and that no attempt should be made to read + * the standard register. + */ + int (*read_byte_data)(struct i2c_client *client, int page, int reg); + int (*read_word_data)(struct i2c_client *client, int page, int phase, + int reg); + int (*write_word_data)(struct i2c_client *client, int page, int reg, + u16 word); + int (*write_byte)(struct i2c_client *client, int page, u8 value); + /* + * The identify function determines supported PMBus functionality. + * This function is only necessary if a chip driver supports multiple + * chips, and the chip functionality is not pre-determined. + */ + int (*identify)(struct i2c_client *client, + struct pmbus_driver_info *info); + + /* Regulator functionality, if supported by this chip driver. */ + int num_regulators; + const struct regulator_desc *reg_desc; + + /* custom attributes */ + const struct attribute_group **groups; +}; + +/* Regulator ops */ + +extern const struct regulator_ops wb_pmbus_regulator_ops; + +/* Macro for filling in array of struct regulator_desc */ +#define PMBUS_REGULATOR(_name, _id) \ + [_id] = { \ + .name = (_name # _id), \ + .id = (_id), \ + .of_match = of_match_ptr(_name # _id), \ + .regulators_node = of_match_ptr("regulators"), \ + .ops = &wb_pmbus_regulator_ops, \ + .type = REGULATOR_VOLTAGE, \ + .owner = THIS_MODULE, \ + } + +struct pmbus_data { + struct device *dev; + struct device *hwmon_dev; + + u32 flags; /* from platform data */ + + int exponent[PMBUS_PAGES]; /* linear mode: exponent for output voltages */ + + const struct pmbus_driver_info *info; + + int max_attributes; + int num_attributes; + struct attribute_group group; + const struct attribute_group **groups; + struct dentry *debugfs; /* debugfs device directory */ + + struct pmbus_sensor *sensors; + + struct mutex update_lock; + + bool has_status_word; /* device uses STATUS_WORD register */ + int (*read_status)(struct i2c_client *client, int page); + + s16 currpage; /* current page, -1 for unknown/unset */ + s16 currphase; /* current phase, 0xff for all, -1 for unknown/unset */ + int vout_max[PMBUS_PAGES]; /* pmbus maximum output voltage */ + int vout_min[PMBUS_PAGES]; /* pmbus minimum output voltage */ +}; + +/* Function declarations */ +void wb_pmbus_clear_cache(struct i2c_client *client); +int wb_pmbus_set_page(struct i2c_client *client, int page, int phase); +int wb_pmbus_read_word_data(struct i2c_client *client, int page, int phase, + u8 reg); +int wb_pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, + u16 word); +int wb_pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); +int wb_pmbus_write_byte(struct i2c_client *client, int page, u8 value); +int wb_pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, + u8 value); +int wb_pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, + u8 mask, u8 value); +void wb_pmbus_clear_faults(struct i2c_client *client); +bool wb_pmbus_check_byte_register(struct i2c_client *client, int page, int reg); +bool wb_pmbus_check_word_register(struct i2c_client *client, int page, int reg); +int wb_pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info); +int wb_pmbus_do_remove(struct i2c_client *client); +const struct pmbus_driver_info *wb_pmbus_get_driver_info(struct i2c_client + *client); +int wb_pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode); +int wb_pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode); +int wb_pmbus_update_fan(struct i2c_client *client, int page, int id, + u8 config, u8 mask, u16 command); +struct dentry *wb_pmbus_get_debugfs_dir(struct i2c_client *client); + +#endif /* WB_PMBUS_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c new file mode 100644 index 000000000000..bba6ca39cd3c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c @@ -0,0 +1,2780 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for PMBus devices + * + * Copyright (c) 2010, 2011 Ericsson AB. + * Copyright (c) 2012 Guenter Roeck + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +/* + * Number of additional attribute pointers to allocate + * with each call to krealloc + */ +#define PMBUS_ATTR_ALLOC_SIZE (32) +#define PMBUS_NAME_SIZE (24) +#define PMBUS_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define PMBUS_RETRY_TIME (3) + +struct pmbus_sensor { + struct pmbus_sensor *next; + char name[PMBUS_NAME_SIZE]; /* sysfs sensor name */ + struct device_attribute attribute; + u8 page; /* page number */ + u8 phase; /* phase number, 0xff for all phases */ + u16 reg; /* register */ + enum pmbus_sensor_classes class; /* sensor class */ + bool update; /* runtime sensor update needed */ + bool convert; /* Whether or not to apply linear/vid/direct */ + int data; /* Sensor data. + Negative if there was a read error */ +}; +#define to_pmbus_sensor(_attr) \ + container_of(_attr, struct pmbus_sensor, attribute) + +struct pmbus_boolean { + char name[PMBUS_NAME_SIZE]; /* sysfs boolean name */ + struct sensor_device_attribute attribute; + struct pmbus_sensor *s1; + struct pmbus_sensor *s2; +}; +#define to_pmbus_boolean(_attr) \ + container_of(_attr, struct pmbus_boolean, attribute) + +struct pmbus_label { + char name[PMBUS_NAME_SIZE]; /* sysfs label name */ + struct device_attribute attribute; + char label[PMBUS_NAME_SIZE]; /* label */ +}; +#define to_pmbus_label(_attr) \ + container_of(_attr, struct pmbus_label, attribute) + +/* Macros for converting between sensor index and register/page/status mask */ + +#define PB_STATUS_MASK 0xffff +#define PB_REG_SHIFT 16 +#define PB_REG_MASK 0x3ff +#define PB_PAGE_SHIFT 26 +#define PB_PAGE_MASK 0x3f + +#define pb_reg_to_index(page, reg, mask) (((page) << PB_PAGE_SHIFT) | \ + ((reg) << PB_REG_SHIFT) | (mask)) + +#define pb_index_to_page(index) (((index) >> PB_PAGE_SHIFT) & PB_PAGE_MASK) +#define pb_index_to_reg(index) (((index) >> PB_REG_SHIFT) & PB_REG_MASK) +#define pb_index_to_mask(index) ((index) & PB_STATUS_MASK) + +struct pmbus_debugfs_entry { + struct i2c_client *client; + u8 page; + u8 reg; +}; + +static const int pmbus_fan_rpm_mask[] = { + PB_FAN_1_RPM, + PB_FAN_2_RPM, + PB_FAN_1_RPM, + PB_FAN_2_RPM, +}; + +static const int pmbus_fan_config_registers[] = { + PMBUS_FAN_CONFIG_12, + PMBUS_FAN_CONFIG_12, + PMBUS_FAN_CONFIG_34, + PMBUS_FAN_CONFIG_34 +}; + +static const int pmbus_fan_command_registers[] = { + PMBUS_FAN_COMMAND_1, + PMBUS_FAN_COMMAND_2, + PMBUS_FAN_COMMAND_3, + PMBUS_FAN_COMMAND_4, +}; + +void wb_pmbus_clear_cache(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + struct pmbus_sensor *sensor; + + for (sensor = data->sensors; sensor; sensor = sensor->next) + sensor->data = -ENODATA; +} +EXPORT_SYMBOL_GPL(wb_pmbus_clear_cache); + +static int wb_pmbus_set_page_tmp(struct i2c_client *client, int page, int phase) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int rv; + + if (page < 0) + return 0; + + if (!(data->info->func[page] & PMBUS_PAGE_VIRTUAL) && + data->info->pages > 1 && page != data->currpage) { + rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page); + if (rv < 0) + return rv; + + rv = i2c_smbus_read_byte_data(client, PMBUS_PAGE); + if (rv < 0) + return rv; + + if (rv != page) + return -EIO; + } + data->currpage = page; + + if (data->info->phases[page] && data->currphase != phase && + !(data->info->func[page] & PMBUS_PHASE_VIRTUAL)) { + rv = i2c_smbus_write_byte_data(client, PMBUS_PHASE, + phase); + if (rv) + return rv; + } + data->currphase = phase; + + return 0; +} + +int wb_pmbus_set_page(struct i2c_client *client, int page, int phase) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_set_page_tmp(client, page, phase); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_set_page failed, page=%d, phase=%d, rv=%d\n", + page, phase, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_set_page); + +static int wb_pmbus_write_byte_tmp(struct i2c_client *client, int page, u8 value) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_write_byte(client, value); +} + +int wb_pmbus_write_byte(struct i2c_client *client, int page, u8 value) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_write_byte_tmp(client, page, value); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_write_byte failed, page=%d, value=0x%x, rv: %d\n", + page, value, rv); + return rv; +} + +EXPORT_SYMBOL_GPL(wb_pmbus_write_byte); + +/* + * _pmbus_write_byte() is similar to pmbus_write_byte(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_write_byte(struct i2c_client *client, int page, u8 value) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->write_byte) { + status = info->write_byte(client, page, value); + if (status != -ENODATA) + return status; + } + return wb_pmbus_write_byte(client, page, value); +} + +static int wb_pmbus_write_word_data_tmp(struct i2c_client *client, int page, u8 reg, + u16 word) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_write_word_data(client, reg, word); +} + +int wb_pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, + u16 word) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_write_word_data_tmp(client, page, reg, word); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_write_word_data failed, page: %d, reg: 0x%x, value: 0x%x, rv: %d\n", + page, reg, word, rv); + return rv; + +} +EXPORT_SYMBOL_GPL(wb_pmbus_write_word_data); + +static int pmbus_write_virt_reg(struct i2c_client *client, int page, int reg, + u16 word) +{ + int bit; + int id; + int rv; + + switch (reg) { + case PMBUS_VIRT_FAN_TARGET_1 ... PMBUS_VIRT_FAN_TARGET_4: + id = reg - PMBUS_VIRT_FAN_TARGET_1; + bit = pmbus_fan_rpm_mask[id]; + rv = wb_pmbus_update_fan(client, page, id, bit, bit, word); + break; + default: + rv = -ENXIO; + break; + } + + return rv; +} + +/* + * _pmbus_write_word_data() is similar to pmbus_write_word_data(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_write_word_data(struct i2c_client *client, int page, int reg, + u16 word) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->write_word_data) { + status = info->write_word_data(client, page, reg, word); + if (status != -ENODATA) + return status; + } + + if (reg >= PMBUS_VIRT_BASE) + return pmbus_write_virt_reg(client, page, reg, word); + + return wb_pmbus_write_word_data(client, page, reg, word); +} + +int wb_pmbus_update_fan(struct i2c_client *client, int page, int id, + u8 config, u8 mask, u16 command) +{ + int from; + int rv; + u8 to; + + from = wb_pmbus_read_byte_data(client, page, + pmbus_fan_config_registers[id]); + if (from < 0) + return from; + + to = (from & ~mask) | (config & mask); + if (to != from) { + rv = wb_pmbus_write_byte_data(client, page, + pmbus_fan_config_registers[id], to); + if (rv < 0) + return rv; + } + + return _pmbus_write_word_data(client, page, + pmbus_fan_command_registers[id], command); +} +EXPORT_SYMBOL_GPL(wb_pmbus_update_fan); + +static int wb_pmbus_read_word_data_tmp(struct i2c_client *client, int page, int phase, u8 reg) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, phase); + if (rv < 0) + return rv; + + return i2c_smbus_read_word_data(client, reg); +} + +int wb_pmbus_read_word_data(struct i2c_client *client, int page, int phase, u8 reg) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_read_word_data_tmp(client, page, phase, reg); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_read_word_data failed, page: %d, phase: %d, reg: 0x%x, rv: %d\n", + page, phase, reg, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_read_word_data); + +static int pmbus_read_virt_reg(struct i2c_client *client, int page, int reg) +{ + int rv; + int id; + + switch (reg) { + case PMBUS_VIRT_FAN_TARGET_1 ... PMBUS_VIRT_FAN_TARGET_4: + id = reg - PMBUS_VIRT_FAN_TARGET_1; + rv = wb_pmbus_get_fan_rate_device(client, page, id, rpm); + break; + default: + rv = -ENXIO; + break; + } + + return rv; +} + +/* + * _pmbus_read_word_data() is similar to wb_pmbus_read_word_data(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_read_word_data(struct i2c_client *client, int page, + int phase, int reg) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->read_word_data) { + status = info->read_word_data(client, page, phase, reg); + if (status != -ENODATA) + return status; + } + + if (reg >= PMBUS_VIRT_BASE) + return pmbus_read_virt_reg(client, page, reg); + + return wb_pmbus_read_word_data(client, page, phase, reg); +} + +/* Same as above, but without phase parameter, for use in check functions */ +static int __pmbus_read_word_data(struct i2c_client *client, int page, int reg) +{ + return _pmbus_read_word_data(client, page, 0xff, reg); +} + +static int wb_pmbus_read_byte_data_tmp(struct i2c_client *client, int page, u8 reg) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_read_byte_data(client, reg); +} + +int wb_pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_read_byte_data_tmp(client, page, reg); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_read_byte_data failed, page: %d, reg: 0x%x, rv: %d\n", + page, reg, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_read_byte_data); + +static int wb_pmbus_write_byte_data_tmp(struct i2c_client *client, int page, u8 reg, u8 value) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_write_byte_data(client, reg, value); +} + +int wb_pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, u8 value) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_write_byte_data_tmp(client, page, reg, value); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_write_byte_data failed, page: %d, reg: 0x%x, value: 0x%x, rv: %d\n", + page, reg, value, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_write_byte_data); + +int wb_pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, + u8 mask, u8 value) +{ + unsigned int tmp; + int rv; + + rv = wb_pmbus_read_byte_data(client, page, reg); + if (rv < 0) + return rv; + + tmp = (rv & ~mask) | (value & mask); + + if (tmp != rv) + rv = wb_pmbus_write_byte_data(client, page, reg, tmp); + + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_update_byte_data); + +/* + * _pmbus_read_byte_data() is similar to wb_pmbus_read_byte_data(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->read_byte_data) { + status = info->read_byte_data(client, page, reg); + if (status != -ENODATA) + return status; + } + return wb_pmbus_read_byte_data(client, page, reg); +} + +static struct pmbus_sensor *pmbus_find_sensor(struct pmbus_data *data, int page, + int reg) +{ + struct pmbus_sensor *sensor; + + for (sensor = data->sensors; sensor; sensor = sensor->next) { + if (sensor->page == page && sensor->reg == reg) + return sensor; + } + + return ERR_PTR(-EINVAL); +} + +static int pmbus_get_fan_rate(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode, + bool from_cache) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + bool want_rpm, have_rpm; + struct pmbus_sensor *s; + int config; + int reg; + + want_rpm = (mode == rpm); + + if (from_cache) { + reg = want_rpm ? PMBUS_VIRT_FAN_TARGET_1 : PMBUS_VIRT_PWM_1; + s = pmbus_find_sensor(data, page, reg + id); + if (IS_ERR(s)) + return PTR_ERR(s); + + return s->data; + } + + config = wb_pmbus_read_byte_data(client, page, + pmbus_fan_config_registers[id]); + if (config < 0) + return config; + + have_rpm = !!(config & pmbus_fan_rpm_mask[id]); + if (want_rpm == have_rpm) + return wb_pmbus_read_word_data(client, page, 0xff, + pmbus_fan_command_registers[id]); + + /* Can't sensibly map between RPM and PWM, just return zero */ + return 0; +} + +int wb_pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode) +{ + return pmbus_get_fan_rate(client, page, id, mode, false); +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_fan_rate_device); + +int wb_pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode) +{ + return pmbus_get_fan_rate(client, page, id, mode, true); +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_fan_rate_cached); + +static void pmbus_clear_fault_page(struct i2c_client *client, int page) +{ + _pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); +} + +void wb_pmbus_clear_faults(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int i; + + for (i = 0; i < data->info->pages; i++) + pmbus_clear_fault_page(client, i); +} +EXPORT_SYMBOL_GPL(wb_pmbus_clear_faults); + +static int pmbus_check_status_cml(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int status, status2; + + status = data->read_status(client, -1); + if (status < 0 || (status & PB_STATUS_CML)) { + status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML); + if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND)) + return -EIO; + } + return 0; +} + +static bool pmbus_check_register(struct i2c_client *client, + int (*func)(struct i2c_client *client, + int page, int reg), + int page, int reg) +{ + int rv; + struct pmbus_data *data = i2c_get_clientdata(client); + + rv = func(client, page, reg); + if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK)) + rv = pmbus_check_status_cml(client); + pmbus_clear_fault_page(client, -1); + return rv >= 0; +} + +static bool pmbus_check_status_register(struct i2c_client *client, int page) +{ + int status; + struct pmbus_data *data = i2c_get_clientdata(client); + + status = data->read_status(client, page); + if (status >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK) && + (status & PB_STATUS_CML)) { + status = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML); + if (status < 0 || (status & PB_CML_FAULT_INVALID_COMMAND)) + status = -EIO; + } + + pmbus_clear_fault_page(client, -1); + return status >= 0; +} + +bool wb_pmbus_check_byte_register(struct i2c_client *client, int page, int reg) +{ + return pmbus_check_register(client, _pmbus_read_byte_data, page, reg); +} +EXPORT_SYMBOL_GPL(wb_pmbus_check_byte_register); + +bool wb_pmbus_check_word_register(struct i2c_client *client, int page, int reg) +{ + return pmbus_check_register(client, __pmbus_read_word_data, page, reg); +} +EXPORT_SYMBOL_GPL(wb_pmbus_check_word_register); + +const struct pmbus_driver_info *wb_pmbus_get_driver_info(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + + return data->info; +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_driver_info); + +static int pmbus_read_status_byte(struct i2c_client *client, int page) +{ + return _pmbus_read_byte_data(client, page, PMBUS_STATUS_BYTE); +} + +static int pmbus_read_status_word(struct i2c_client *client, int page) +{ + return _pmbus_read_word_data(client, page, 0xff, PMBUS_STATUS_WORD); +} + +static int pmbus_get_status(struct i2c_client *client, int page, int reg) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int status; + + switch (reg) { + case PMBUS_STATUS_WORD: + status = data->read_status(client, page); + if ((status < 0) || (data->has_status_word && (status == 0xffff)) + || (!data->has_status_word && (status == 0xff))) { + if (data->has_status_word) { + data->read_status = pmbus_read_status_byte; + } else { + data->read_status = pmbus_read_status_word; + } + data->has_status_word = !data->has_status_word; + status = data->read_status(client, page); + } + break; + default: + status = _pmbus_read_byte_data(client, page, reg); + break; + } + if (status < 0) + wb_pmbus_clear_faults(client); + return status; +} + +static void pmbus_update_sensor_data(struct i2c_client *client, struct pmbus_sensor *sensor) +{ + if (sensor->data < 0 || sensor->update) + sensor->data = _pmbus_read_word_data(client, sensor->page, + sensor->phase, sensor->reg); +} + +/* + * Convert linear sensor values to milli- or micro-units + * depending on sensor type. + */ +static s64 pmbus_reg2data_linear(struct pmbus_data *data, + struct pmbus_sensor *sensor) +{ + s16 exponent; + s32 mantissa; + s64 val; + + if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */ + exponent = data->exponent[sensor->page]; + mantissa = (u16) sensor->data; + } else { /* LINEAR11 */ + exponent = ((s16)sensor->data) >> 11; + mantissa = ((s16)((sensor->data & 0x7ff) << 5)) >> 5; + } + + val = mantissa; + + /* scale result to milli-units for all sensors except fans */ + if (sensor->class != PSC_FAN) + val = val * 1000LL; + + /* scale result to micro-units for power sensors */ + if (sensor->class == PSC_POWER) + val = val * 1000LL; + + if (exponent >= 0) + val <<= exponent; + else + val >>= -exponent; + + return val; +} + +/* + * Convert direct sensor values to milli- or micro-units + * depending on sensor type. + */ +static s64 pmbus_reg2data_direct(struct pmbus_data *data, + struct pmbus_sensor *sensor) +{ + s64 b, val = (s16)sensor->data; + s32 m, R; + + m = data->info->m[sensor->class]; + b = data->info->b[sensor->class]; + R = data->info->R[sensor->class]; + + if (m == 0) + return 0; + + /* X = 1/m * (Y * 10^-R - b) */ + R = -R; + /* scale result to milli-units for everything but fans */ + if (!(sensor->class == PSC_FAN || sensor->class == PSC_PWM)) { + R += 3; + b *= 1000; + } + + /* scale result to micro-units for power sensors */ + if (sensor->class == PSC_POWER) { + R += 3; + b *= 1000; + } + + while (R > 0) { + val *= 10; + R--; + } + while (R < 0) { + val = div_s64(val + 5LL, 10L); /* round closest */ + R++; + } + + val = div_s64(val - b, m); + return val; +} + +/* + * Convert VID sensor values to milli- or micro-units + * depending on sensor type. + */ +static s64 pmbus_reg2data_vid(struct pmbus_data *data, + struct pmbus_sensor *sensor) +{ + long val = sensor->data; + long rv = 0; + + switch (data->info->vrm_version[sensor->page]) { + case vr11: + if (val >= 0x02 && val <= 0xb2) + rv = DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100); + break; + case vr12: + if (val >= 0x01) + rv = 250 + (val - 1) * 5; + break; + case vr13: + if (val >= 0x01) + rv = 500 + (val - 1) * 10; + break; + case imvp9: + if (val >= 0x01) + rv = 200 + (val - 1) * 10; + break; + case amd625mv: + if (val >= 0x0 && val <= 0xd8) + rv = DIV_ROUND_CLOSEST(155000 - val * 625, 100); + break; + } + return rv; +} + +static s64 pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) +{ + s64 val; + + if (!sensor->convert) + return sensor->data; + + switch (data->info->format[sensor->class]) { + case direct: + val = pmbus_reg2data_direct(data, sensor); + break; + case vid: + val = pmbus_reg2data_vid(data, sensor); + break; + case linear: + default: + val = pmbus_reg2data_linear(data, sensor); + break; + } + return val; +} + +#define MAX_MANTISSA (1023 * 1000) +#define MIN_MANTISSA (511 * 1000) + +static u16 pmbus_data2reg_linear(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + s16 exponent = 0, mantissa; + bool negative = false; + + /* simple case */ + if (val == 0) + return 0; + + if (sensor->class == PSC_VOLTAGE_OUT) { + /* LINEAR16 does not support negative voltages */ + if (val < 0) + return 0; + + /* + * For a static exponents, we don't have a choice + * but to adjust the value to it. + */ + if (data->exponent[sensor->page] < 0) + val <<= -data->exponent[sensor->page]; + else + val >>= data->exponent[sensor->page]; + val = DIV_ROUND_CLOSEST_ULL(val, 1000); + return clamp_val(val, 0, 0xffff); + } + + if (val < 0) { + negative = true; + val = -val; + } + + /* Power is in uW. Convert to mW before converting. */ + if (sensor->class == PSC_POWER) + val = DIV_ROUND_CLOSEST_ULL(val, 1000); + + /* + * For simplicity, convert fan data to milli-units + * before calculating the exponent. + */ + if (sensor->class == PSC_FAN) + val = val * 1000LL; + + /* Reduce large mantissa until it fits into 10 bit */ + while (val >= MAX_MANTISSA && exponent < 15) { + exponent++; + val >>= 1; + } + /* Increase small mantissa to improve precision */ + while (val < MIN_MANTISSA && exponent > -15) { + exponent--; + val <<= 1; + } + + /* Convert mantissa from milli-units to units */ + mantissa = clamp_val(DIV_ROUND_CLOSEST_ULL(val, 1000), 0, 0x3ff); + + /* restore sign */ + if (negative) + mantissa = -mantissa; + + /* Convert to 5 bit exponent, 11 bit mantissa */ + return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800); +} + +static u16 pmbus_data2reg_direct(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + s64 b; + s32 m, R; + + m = data->info->m[sensor->class]; + b = data->info->b[sensor->class]; + R = data->info->R[sensor->class]; + + /* Power is in uW. Adjust R and b. */ + if (sensor->class == PSC_POWER) { + R -= 3; + b *= 1000; + } + + /* Calculate Y = (m * X + b) * 10^R */ + if (!(sensor->class == PSC_FAN || sensor->class == PSC_PWM)) { + R -= 3; /* Adjust R and b for data in milli-units */ + b *= 1000; + } + val = val * m + b; + + while (R > 0) { + val *= 10; + R--; + } + while (R < 0) { + val = div_s64(val + 5LL, 10L); /* round closest */ + R++; + } + + return (u16)clamp_val(val, S16_MIN, S16_MAX); +} + +static u16 pmbus_data2reg_vid(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + val = clamp_val(val, 500, 1600); + + return 2 + DIV_ROUND_CLOSEST_ULL((1600LL - val) * 100LL, 625); +} + +static u16 pmbus_data2reg(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + u16 regval; + + if (!sensor->convert) + return val; + + switch (data->info->format[sensor->class]) { + case direct: + regval = pmbus_data2reg_direct(data, sensor, val); + break; + case vid: + regval = pmbus_data2reg_vid(data, sensor, val); + break; + case linear: + default: + regval = pmbus_data2reg_linear(data, sensor, val); + break; + } + return regval; +} + +/* + * Return boolean calculated from converted data. + * defines a status register index and mask. + * The mask is in the lower 8 bits, the register index is in bits 8..23. + * + * The associated pmbus_boolean structure contains optional pointers to two + * sensor attributes. If specified, those attributes are compared against each + * other to determine if a limit has been exceeded. + * + * If the sensor attribute pointers are NULL, the function returns true if + * (status[reg] & mask) is true. + * + * If sensor attribute pointers are provided, a comparison against a specified + * limit has to be performed to determine the boolean result. + * In this case, the function returns true if v1 >= v2 (where v1 and v2 are + * sensor values referenced by sensor attribute pointers s1 and s2). + * + * To determine if an object exceeds upper limits, specify = . + * To determine if an object exceeds lower limits, specify = . + * + * If a negative value is stored in any of the referenced registers, this value + * reflects an error code which will be returned. + */ +static int pmbus_get_boolean(struct i2c_client *client, struct pmbus_boolean *b, + int index) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + struct pmbus_sensor *s1 = b->s1; + struct pmbus_sensor *s2 = b->s2; + u16 mask = pb_index_to_mask(index); + u8 page = pb_index_to_page(index); + u16 reg = pb_index_to_reg(index); + int ret, status; + u16 regval; + + mutex_lock(&data->update_lock); + status = pmbus_get_status(client, page, reg); + if (status < 0) { + ret = status; + goto unlock; + } + + if (s1) + pmbus_update_sensor_data(client, s1); + if (s2) + pmbus_update_sensor_data(client, s2); + + regval = status & mask; + if (s1 && s2) { + s64 v1, v2; + + if (s1->data < 0) { + ret = s1->data; + goto unlock; + } + if (s2->data < 0) { + ret = s2->data; + goto unlock; + } + + v1 = pmbus_reg2data(data, s1); + v2 = pmbus_reg2data(data, s2); + ret = !!(regval && v1 >= v2); + } else { + ret = !!regval; + } +unlock: + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t pmbus_show_boolean(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct pmbus_boolean *boolean = to_pmbus_boolean(attr); + struct i2c_client *client = to_i2c_client(dev->parent); + int val; + + val = pmbus_get_boolean(client, boolean, attr->index); + if (val < 0) + return val; + return snprintf(buf, PAGE_SIZE, "%d\n", val); +} + +static ssize_t pmbus_show_sensor(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_sensor *sensor = to_pmbus_sensor(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + ssize_t ret; + + mutex_lock(&data->update_lock); + pmbus_update_sensor_data(client, sensor); + if (sensor->data < 0) + ret = sensor->data; + else + ret = snprintf(buf, PAGE_SIZE, "%lld\n", pmbus_reg2data(data, sensor)); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t pmbus_set_sensor(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_data *data = i2c_get_clientdata(client); + struct pmbus_sensor *sensor = to_pmbus_sensor(devattr); + ssize_t rv = count; + s64 val; + int ret; + u16 regval; + + if (kstrtos64(buf, 10, &val) < 0) + return -EINVAL; + + mutex_lock(&data->update_lock); + regval = pmbus_data2reg(data, sensor, val); + ret = _pmbus_write_word_data(client, sensor->page, sensor->reg, regval); + if (ret < 0) + rv = ret; + else + sensor->data = regval; + mutex_unlock(&data->update_lock); + return rv; +} + +static ssize_t pmbus_show_label(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct pmbus_label *label = to_pmbus_label(da); + + return snprintf(buf, PAGE_SIZE, "%s\n", label->label); +} + +static int pmbus_add_attribute(struct pmbus_data *data, struct attribute *attr) +{ + if (data->num_attributes >= data->max_attributes - 1) { + int new_max_attrs = data->max_attributes + PMBUS_ATTR_ALLOC_SIZE; + void *new_attrs = devm_krealloc(data->dev, data->group.attrs, + new_max_attrs * sizeof(void *), + GFP_KERNEL); + if (!new_attrs) + return -ENOMEM; + data->group.attrs = new_attrs; + data->max_attributes = new_max_attrs; + } + + data->group.attrs[data->num_attributes++] = attr; + data->group.attrs[data->num_attributes] = NULL; + return 0; +} + +static void pmbus_dev_attr_init(struct device_attribute *dev_attr, + const char *name, + umode_t mode, + ssize_t (*show)(struct device *dev, + struct device_attribute *attr, + char *buf), + ssize_t (*store)(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count)) +{ + sysfs_attr_init(&dev_attr->attr); + dev_attr->attr.name = name; + dev_attr->attr.mode = mode; + dev_attr->show = show; + dev_attr->store = store; +} + +static void pmbus_attr_init(struct sensor_device_attribute *a, + const char *name, + umode_t mode, + ssize_t (*show)(struct device *dev, + struct device_attribute *attr, + char *buf), + ssize_t (*store)(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count), + int idx) +{ + pmbus_dev_attr_init(&a->dev_attr, name, mode, show, store); + a->index = idx; +} + +static int pmbus_add_boolean(struct pmbus_data *data, + const char *name, const char *type, int seq, + struct pmbus_sensor *s1, + struct pmbus_sensor *s2, + u8 page, u16 reg, u16 mask) +{ + struct pmbus_boolean *boolean; + struct sensor_device_attribute *a; + + if (WARN((s1 && !s2) || (!s1 && s2), "Bad s1/s2 parameters\n")) + return -EINVAL; + + boolean = devm_kzalloc(data->dev, sizeof(*boolean), GFP_KERNEL); + if (!boolean) + return -ENOMEM; + + a = &boolean->attribute; + + snprintf(boolean->name, sizeof(boolean->name), "%s%d_%s", + name, seq, type); + boolean->s1 = s1; + boolean->s2 = s2; + pmbus_attr_init(a, boolean->name, 0444, pmbus_show_boolean, NULL, + pb_reg_to_index(page, reg, mask)); + + return pmbus_add_attribute(data, &a->dev_attr.attr); +} + +static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data, + const char *name, const char *type, + int seq, int page, int phase, + int reg, + enum pmbus_sensor_classes class, + bool update, bool readonly, + bool convert) +{ + struct pmbus_sensor *sensor; + struct device_attribute *a; + + sensor = devm_kzalloc(data->dev, sizeof(*sensor), GFP_KERNEL); + if (!sensor) + return NULL; + a = &sensor->attribute; + + if (type) + snprintf(sensor->name, sizeof(sensor->name), "%s%d_%s", + name, seq, type); + else + snprintf(sensor->name, sizeof(sensor->name), "%s%d", + name, seq); + + if (data->flags & PMBUS_WRITE_PROTECTED) + readonly = true; + + sensor->page = page; + sensor->phase = phase; + sensor->reg = reg; + sensor->class = class; + sensor->update = update; + sensor->convert = convert; + sensor->data = -ENODATA; + pmbus_dev_attr_init(a, sensor->name, + readonly ? 0444 : 0644, + pmbus_show_sensor, pmbus_set_sensor); + + if (pmbus_add_attribute(data, &a->attr)) + return NULL; + + sensor->next = data->sensors; + data->sensors = sensor; + + return sensor; +} + +static int pmbus_add_label(struct pmbus_data *data, + const char *name, int seq, + const char *lstring, int index, int phase) +{ + struct pmbus_label *label; + struct device_attribute *a; + + label = devm_kzalloc(data->dev, sizeof(*label), GFP_KERNEL); + if (!label) + return -ENOMEM; + + a = &label->attribute; + + snprintf(label->name, sizeof(label->name), "%s%d_label", name, seq); + if (!index) { + if (phase == 0xff) + strncpy(label->label, lstring, + sizeof(label->label) - 1); + else + snprintf(label->label, sizeof(label->label), "%s.%d", + lstring, phase); + } else { + if (phase == 0xff) + snprintf(label->label, sizeof(label->label), "%s%d", + lstring, index); + else + snprintf(label->label, sizeof(label->label), "%s%d.%d", + lstring, index, phase); + } + + pmbus_dev_attr_init(a, label->name, 0444, pmbus_show_label, NULL); + return pmbus_add_attribute(data, &a->attr); +} + +/* + * Search for attributes. Allocate sensors, booleans, and labels as needed. + */ + +/* + * The pmbus_limit_attr structure describes a single limit attribute + * and its associated alarm attribute. + */ +struct pmbus_limit_attr { + u16 reg; /* Limit register */ + u16 sbit; /* Alarm attribute status bit */ + bool update; /* True if register needs updates */ + bool low; /* True if low limit; for limits with compare + functions only */ + const char *attr; /* Attribute name */ + const char *alarm; /* Alarm attribute name */ +}; + +/* + * The pmbus_sensor_attr structure describes one sensor attribute. This + * description includes a reference to the associated limit attributes. + */ +struct pmbus_sensor_attr { + u16 reg; /* sensor register */ + u16 gbit; /* generic status bit */ + u8 nlimit; /* # of limit registers */ + enum pmbus_sensor_classes class;/* sensor class */ + const char *label; /* sensor label */ + bool paged; /* true if paged sensor */ + bool update; /* true if update needed */ + bool compare; /* true if compare function needed */ + u32 func; /* sensor mask */ + u32 sfunc; /* sensor status mask */ + int sreg; /* status register */ + const struct pmbus_limit_attr *limit;/* limit registers */ +}; + +/* + * Add a set of limit attributes and, if supported, the associated + * alarm attributes. + * returns 0 if no alarm register found, 1 if an alarm register was found, + * < 0 on errors. + */ +static int pmbus_add_limit_attrs(struct i2c_client *client, + struct pmbus_data *data, + const struct pmbus_driver_info *info, + const char *name, int index, int page, + struct pmbus_sensor *base, + const struct pmbus_sensor_attr *attr) +{ + const struct pmbus_limit_attr *l = attr->limit; + int nlimit = attr->nlimit; + int have_alarm = 0; + int i, ret; + struct pmbus_sensor *curr; + + for (i = 0; i < nlimit; i++) { + if (wb_pmbus_check_word_register(client, page, l->reg)) { + curr = pmbus_add_sensor(data, name, l->attr, index, + page, 0xff, l->reg, attr->class, + attr->update || l->update, + false, true); + if (!curr) + return -ENOMEM; + if (l->sbit && (info->func[page] & attr->sfunc)) { + ret = pmbus_add_boolean(data, name, + l->alarm, index, + attr->compare ? l->low ? curr : base + : NULL, + attr->compare ? l->low ? base : curr + : NULL, + page, attr->sreg, l->sbit); + if (ret) + return ret; + have_alarm = 1; + } + } + l++; + } + return have_alarm; +} + +static int pmbus_add_sensor_attrs_one(struct i2c_client *client, + struct pmbus_data *data, + const struct pmbus_driver_info *info, + const char *name, + int index, int page, int phase, + const struct pmbus_sensor_attr *attr, + bool paged) +{ + struct pmbus_sensor *base; + bool upper = !!(attr->gbit & 0xff00); /* need to check STATUS_WORD */ + int ret; + + if (attr->label) { + ret = pmbus_add_label(data, name, index, attr->label, + paged ? page + 1 : 0, phase); + if (ret) + return ret; + } + base = pmbus_add_sensor(data, name, "input", index, page, phase, + attr->reg, attr->class, true, true, true); + if (!base) + return -ENOMEM; + /* No limit and alarm attributes for phase specific sensors */ + if (attr->sfunc && phase == 0xff) { + ret = pmbus_add_limit_attrs(client, data, info, name, + index, page, base, attr); + if (ret < 0) + return ret; + /* + * Add generic alarm attribute only if there are no individual + * alarm attributes, if there is a global alarm bit, and if + * the generic status register (word or byte, depending on + * which global bit is set) for this page is accessible. + */ + if (!ret && attr->gbit && + (!upper || (upper && data->has_status_word)) && + pmbus_check_status_register(client, page)) { + ret = pmbus_add_boolean(data, name, "alarm", index, + NULL, NULL, + page, PMBUS_STATUS_WORD, + attr->gbit); + if (ret) + return ret; + } + } + return 0; +} + +static bool pmbus_sensor_is_paged(const struct pmbus_driver_info *info, + const struct pmbus_sensor_attr *attr) +{ + int p; + + if (attr->paged) + return true; + + /* + * Some attributes may be present on more than one page despite + * not being marked with the paged attribute. If that is the case, + * then treat the sensor as being paged and add the page suffix to the + * attribute name. + * We don't just add the paged attribute to all such attributes, in + * order to maintain the un-suffixed labels in the case where the + * attribute is only on page 0. + */ + for (p = 1; p < info->pages; p++) { + if (info->func[p] & attr->func) + return true; + } + return false; +} + +static int pmbus_add_sensor_attrs(struct i2c_client *client, + struct pmbus_data *data, + const char *name, + const struct pmbus_sensor_attr *attrs, + int nattrs) +{ + const struct pmbus_driver_info *info = data->info; + int index, i; + int ret; + + index = 1; + for (i = 0; i < nattrs; i++) { + int page, pages; + bool paged = pmbus_sensor_is_paged(info, attrs); + + pages = paged ? info->pages : 1; + for (page = 0; page < pages; page++) { + if (!(info->func[page] & attrs->func)) + continue; + ret = pmbus_add_sensor_attrs_one(client, data, info, + name, index, page, + 0xff, attrs, paged); + if (ret) + return ret; + index++; + if (info->phases[page]) { + int phase; + + for (phase = 0; phase < info->phases[page]; + phase++) { + if (!(info->pfunc[phase] & attrs->func)) + continue; + ret = pmbus_add_sensor_attrs_one(client, + data, info, name, index, page, + phase, attrs, paged); + if (ret) + return ret; + index++; + } + } + } + attrs++; + } + return 0; +} + +static const struct pmbus_limit_attr vin_limit_attrs[] = { + { + .reg = PMBUS_VIN_UV_WARN_LIMIT, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_VOLTAGE_UV_WARNING, + }, { + .reg = PMBUS_VIN_UV_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_VOLTAGE_UV_FAULT, + }, { + .reg = PMBUS_VIN_OV_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_VOLTAGE_OV_WARNING, + }, { + .reg = PMBUS_VIN_OV_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_VOLTAGE_OV_FAULT, + }, { + .reg = PMBUS_VIRT_READ_VIN_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_VIN_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_VIN_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_VIN_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_VIN_MIN, + .attr = "rated_min", + }, { + .reg = PMBUS_MFR_VIN_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr vmon_limit_attrs[] = { + { + .reg = PMBUS_VIRT_VMON_UV_WARN_LIMIT, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_VOLTAGE_UV_WARNING, + }, { + .reg = PMBUS_VIRT_VMON_UV_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_VOLTAGE_UV_FAULT, + }, { + .reg = PMBUS_VIRT_VMON_OV_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_VOLTAGE_OV_WARNING, + }, { + .reg = PMBUS_VIRT_VMON_OV_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_VOLTAGE_OV_FAULT, + } +}; + +static const struct pmbus_limit_attr vout_limit_attrs[] = { + { + .reg = PMBUS_VOUT_UV_WARN_LIMIT, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_VOLTAGE_UV_WARNING, + }, { + .reg = PMBUS_VOUT_UV_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_VOLTAGE_UV_FAULT, + }, { + .reg = PMBUS_VOUT_OV_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_VOLTAGE_OV_WARNING, + }, { + .reg = PMBUS_VOUT_OV_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_VOLTAGE_OV_FAULT, + }, { + .reg = PMBUS_VIRT_READ_VOUT_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_VOUT_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_VOUT_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_VOUT_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_VOUT_MIN, + .attr = "rated_min", + }, { + .reg = PMBUS_MFR_VOUT_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr voltage_attributes[] = { + { + .reg = PMBUS_READ_VIN, + .class = PSC_VOLTAGE_IN, + .label = "vin", + .func = PMBUS_HAVE_VIN, + .sfunc = PMBUS_HAVE_STATUS_INPUT, + .sreg = PMBUS_STATUS_INPUT, + .gbit = PB_STATUS_VIN_UV, + .limit = vin_limit_attrs, + .nlimit = ARRAY_SIZE(vin_limit_attrs), + }, { + .reg = PMBUS_VIRT_READ_VMON, + .class = PSC_VOLTAGE_IN, + .label = "vmon", + .func = PMBUS_HAVE_VMON, + .sfunc = PMBUS_HAVE_STATUS_VMON, + .sreg = PMBUS_VIRT_STATUS_VMON, + .limit = vmon_limit_attrs, + .nlimit = ARRAY_SIZE(vmon_limit_attrs), + }, { + .reg = PMBUS_READ_VCAP, + .class = PSC_VOLTAGE_IN, + .label = "vcap", + .func = PMBUS_HAVE_VCAP, + }, { + .reg = PMBUS_READ_VOUT, + .class = PSC_VOLTAGE_OUT, + .label = "vout", + .paged = true, + .func = PMBUS_HAVE_VOUT, + .sfunc = PMBUS_HAVE_STATUS_VOUT, + .sreg = PMBUS_STATUS_VOUT, + .gbit = PB_STATUS_VOUT_OV, + .limit = vout_limit_attrs, + .nlimit = ARRAY_SIZE(vout_limit_attrs), + } +}; + +/* Current attributes */ + +static const struct pmbus_limit_attr iin_limit_attrs[] = { + { + .reg = PMBUS_IIN_OC_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_IIN_OC_WARNING, + }, { + .reg = PMBUS_IIN_OC_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_IIN_OC_FAULT, + }, { + .reg = PMBUS_VIRT_READ_IIN_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_IIN_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_IIN_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_IIN_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_IIN_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr iout_limit_attrs[] = { + { + .reg = PMBUS_IOUT_OC_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_IOUT_OC_WARNING, + }, { + .reg = PMBUS_IOUT_UC_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_IOUT_UC_FAULT, + }, { + .reg = PMBUS_IOUT_OC_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_IOUT_OC_FAULT, + }, { + .reg = PMBUS_VIRT_READ_IOUT_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_IOUT_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_IOUT_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_IOUT_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_IOUT_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr current_attributes[] = { + { + .reg = PMBUS_READ_IIN, + .class = PSC_CURRENT_IN, + .label = "iin", + .func = PMBUS_HAVE_IIN, + .sfunc = PMBUS_HAVE_STATUS_INPUT, + .sreg = PMBUS_STATUS_INPUT, + .gbit = PB_STATUS_INPUT, + .limit = iin_limit_attrs, + .nlimit = ARRAY_SIZE(iin_limit_attrs), + }, { + .reg = PMBUS_READ_IOUT, + .class = PSC_CURRENT_OUT, + .label = "iout", + .paged = true, + .func = PMBUS_HAVE_IOUT, + .sfunc = PMBUS_HAVE_STATUS_IOUT, + .sreg = PMBUS_STATUS_IOUT, + .gbit = PB_STATUS_IOUT_OC, + .limit = iout_limit_attrs, + .nlimit = ARRAY_SIZE(iout_limit_attrs), + } +}; + +/* Power attributes */ + +static const struct pmbus_limit_attr pin_limit_attrs[] = { + { + .reg = PMBUS_PIN_OP_WARN_LIMIT, + .attr = "max", + .alarm = "alarm", + .sbit = PB_PIN_OP_WARNING, + }, { + .reg = PMBUS_VIRT_READ_PIN_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_PIN_MIN, + .update = true, + .attr = "input_lowest", + }, { + .reg = PMBUS_VIRT_READ_PIN_MAX, + .update = true, + .attr = "input_highest", + }, { + .reg = PMBUS_VIRT_RESET_PIN_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_PIN_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr pout_limit_attrs[] = { + { + .reg = PMBUS_POUT_MAX, + .attr = "cap", + .alarm = "cap_alarm", + .sbit = PB_POWER_LIMITING, + }, { + .reg = PMBUS_POUT_OP_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_POUT_OP_WARNING, + }, { + .reg = PMBUS_POUT_OP_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_POUT_OP_FAULT, + }, { + .reg = PMBUS_VIRT_READ_POUT_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_POUT_MIN, + .update = true, + .attr = "input_lowest", + }, { + .reg = PMBUS_VIRT_READ_POUT_MAX, + .update = true, + .attr = "input_highest", + }, { + .reg = PMBUS_VIRT_RESET_POUT_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_POUT_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr power_attributes[] = { + { + .reg = PMBUS_READ_PIN, + .class = PSC_POWER, + .label = "pin", + .func = PMBUS_HAVE_PIN, + .sfunc = PMBUS_HAVE_STATUS_INPUT, + .sreg = PMBUS_STATUS_INPUT, + .gbit = PB_STATUS_INPUT, + .limit = pin_limit_attrs, + .nlimit = ARRAY_SIZE(pin_limit_attrs), + }, { + .reg = PMBUS_READ_POUT, + .class = PSC_POWER, + .label = "pout", + .paged = true, + .func = PMBUS_HAVE_POUT, + .sfunc = PMBUS_HAVE_STATUS_IOUT, + .sreg = PMBUS_STATUS_IOUT, + .limit = pout_limit_attrs, + .nlimit = ARRAY_SIZE(pout_limit_attrs), + } +}; + +/* Temperature atributes */ + +static const struct pmbus_limit_attr temp_limit_attrs[] = { + { + .reg = PMBUS_UT_WARN_LIMIT, + .low = true, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_TEMP_UT_WARNING, + }, { + .reg = PMBUS_UT_FAULT_LIMIT, + .low = true, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_TEMP_UT_FAULT, + }, { + .reg = PMBUS_OT_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_TEMP_OT_WARNING, + }, { + .reg = PMBUS_OT_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_TEMP_OT_FAULT, + }, { + .reg = PMBUS_VIRT_READ_TEMP_MIN, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_TEMP_AVG, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_TEMP_MAX, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_TEMP_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_MAX_TEMP_1, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr temp_limit_attrs2[] = { + { + .reg = PMBUS_UT_WARN_LIMIT, + .low = true, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_TEMP_UT_WARNING, + }, { + .reg = PMBUS_UT_FAULT_LIMIT, + .low = true, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_TEMP_UT_FAULT, + }, { + .reg = PMBUS_OT_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_TEMP_OT_WARNING, + }, { + .reg = PMBUS_OT_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_TEMP_OT_FAULT, + }, { + .reg = PMBUS_VIRT_READ_TEMP2_MIN, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_TEMP2_AVG, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_TEMP2_MAX, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_TEMP2_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_MAX_TEMP_2, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr temp_limit_attrs3[] = { + { + .reg = PMBUS_UT_WARN_LIMIT, + .low = true, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_TEMP_UT_WARNING, + }, { + .reg = PMBUS_UT_FAULT_LIMIT, + .low = true, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_TEMP_UT_FAULT, + }, { + .reg = PMBUS_OT_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_TEMP_OT_WARNING, + }, { + .reg = PMBUS_OT_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_TEMP_OT_FAULT, + }, { + .reg = PMBUS_MFR_MAX_TEMP_3, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr temp_attributes[] = { + { + .reg = PMBUS_READ_TEMPERATURE_1, + .class = PSC_TEMPERATURE, + .paged = true, + .update = true, + .compare = true, + .func = PMBUS_HAVE_TEMP, + .sfunc = PMBUS_HAVE_STATUS_TEMP, + .sreg = PMBUS_STATUS_TEMPERATURE, + .gbit = PB_STATUS_TEMPERATURE, + .limit = temp_limit_attrs, + .nlimit = ARRAY_SIZE(temp_limit_attrs), + }, { + .reg = PMBUS_READ_TEMPERATURE_2, + .class = PSC_TEMPERATURE, + .paged = true, + .update = true, + .compare = true, + .func = PMBUS_HAVE_TEMP2, + .sfunc = PMBUS_HAVE_STATUS_TEMP, + .sreg = PMBUS_STATUS_TEMPERATURE, + .gbit = PB_STATUS_TEMPERATURE, + .limit = temp_limit_attrs2, + .nlimit = ARRAY_SIZE(temp_limit_attrs2), + }, { + .reg = PMBUS_READ_TEMPERATURE_3, + .class = PSC_TEMPERATURE, + .paged = true, + .update = true, + .compare = true, + .func = PMBUS_HAVE_TEMP3, + .sfunc = PMBUS_HAVE_STATUS_TEMP, + .sreg = PMBUS_STATUS_TEMPERATURE, + .gbit = PB_STATUS_TEMPERATURE, + .limit = temp_limit_attrs3, + .nlimit = ARRAY_SIZE(temp_limit_attrs3), + } +}; + +static const int pmbus_fan_registers[] = { + PMBUS_READ_FAN_SPEED_1, + PMBUS_READ_FAN_SPEED_2, + PMBUS_READ_FAN_SPEED_3, + PMBUS_READ_FAN_SPEED_4 +}; + +static const int pmbus_fan_status_registers[] = { + PMBUS_STATUS_FAN_12, + PMBUS_STATUS_FAN_12, + PMBUS_STATUS_FAN_34, + PMBUS_STATUS_FAN_34 +}; + +static const u32 pmbus_fan_flags[] = { + PMBUS_HAVE_FAN12, + PMBUS_HAVE_FAN12, + PMBUS_HAVE_FAN34, + PMBUS_HAVE_FAN34 +}; + +static const u32 pmbus_fan_status_flags[] = { + PMBUS_HAVE_STATUS_FAN12, + PMBUS_HAVE_STATUS_FAN12, + PMBUS_HAVE_STATUS_FAN34, + PMBUS_HAVE_STATUS_FAN34 +}; + +/* Fans */ + +/* Precondition: FAN_CONFIG_x_y and FAN_COMMAND_x must exist for the fan ID */ +static int pmbus_add_fan_ctrl(struct i2c_client *client, + struct pmbus_data *data, int index, int page, int id, + u8 config) +{ + struct pmbus_sensor *sensor; + + sensor = pmbus_add_sensor(data, "fan", "target", index, page, + 0xff, PMBUS_VIRT_FAN_TARGET_1 + id, PSC_FAN, + false, false, true); + + if (!sensor) + return -ENOMEM; + + if (!((data->info->func[page] & PMBUS_HAVE_PWM12) || + (data->info->func[page] & PMBUS_HAVE_PWM34))) + return 0; + + sensor = pmbus_add_sensor(data, "pwm", NULL, index, page, + 0xff, PMBUS_VIRT_PWM_1 + id, PSC_PWM, + false, false, true); + + if (!sensor) + return -ENOMEM; + + sensor = pmbus_add_sensor(data, "pwm", "enable", index, page, + 0xff, PMBUS_VIRT_PWM_ENABLE_1 + id, PSC_PWM, + true, false, false); + + if (!sensor) + return -ENOMEM; + + return 0; +} + +static int pmbus_add_fan_attributes(struct i2c_client *client, + struct pmbus_data *data) +{ + const struct pmbus_driver_info *info = data->info; + int index = 1; + int page; + int ret; + + for (page = 0; page < info->pages; page++) { + int f; + + for (f = 0; f < ARRAY_SIZE(pmbus_fan_registers); f++) { + int regval; + + if (!(info->func[page] & pmbus_fan_flags[f])) + break; + + if (!wb_pmbus_check_word_register(client, page, + pmbus_fan_registers[f])) + break; + + /* + * Skip fan if not installed. + * Each fan configuration register covers multiple fans, + * so we have to do some magic. + */ + regval = _pmbus_read_byte_data(client, page, + pmbus_fan_config_registers[f]); + if (regval < 0 || + (!(regval & (PB_FAN_1_INSTALLED >> ((f & 1) * 4))))) + continue; + + if (pmbus_add_sensor(data, "fan", "input", index, + page, 0xff, pmbus_fan_registers[f], + PSC_FAN, true, true, true) == NULL) + return -ENOMEM; + + /* Fan control */ + if (wb_pmbus_check_word_register(client, page, + pmbus_fan_command_registers[f])) { + ret = pmbus_add_fan_ctrl(client, data, index, + page, f, regval); + if (ret < 0) + return ret; + } + + /* + * Each fan status register covers multiple fans, + * so we have to do some magic. + */ + if ((info->func[page] & pmbus_fan_status_flags[f]) && + wb_pmbus_check_byte_register(client, + page, pmbus_fan_status_registers[f])) { + int reg; + + if (f > 1) /* fan 3, 4 */ + reg = PMBUS_STATUS_FAN_34; + else + reg = PMBUS_STATUS_FAN_12; + ret = pmbus_add_boolean(data, "fan", + "alarm", index, NULL, NULL, page, reg, + PB_FAN_FAN1_WARNING >> (f & 1)); + if (ret) + return ret; + ret = pmbus_add_boolean(data, "fan", + "fault", index, NULL, NULL, page, reg, + PB_FAN_FAN1_FAULT >> (f & 1)); + if (ret) + return ret; + } + index++; + } + } + return 0; +} + +struct pmbus_samples_attr { + int reg; + char *name; +}; + +struct pmbus_samples_reg { + int page; + struct pmbus_samples_attr *attr; + struct device_attribute dev_attr; +}; + +static struct pmbus_samples_attr pmbus_samples_registers[] = { + { + .reg = PMBUS_VIRT_SAMPLES, + .name = "samples", + }, { + .reg = PMBUS_VIRT_IN_SAMPLES, + .name = "in_samples", + }, { + .reg = PMBUS_VIRT_CURR_SAMPLES, + .name = "curr_samples", + }, { + .reg = PMBUS_VIRT_POWER_SAMPLES, + .name = "power_samples", + }, { + .reg = PMBUS_VIRT_TEMP_SAMPLES, + .name = "temp_samples", + } +}; + +#define to_samples_reg(x) container_of(x, struct pmbus_samples_reg, dev_attr) + +static ssize_t pmbus_show_samples(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int val; + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_samples_reg *reg = to_samples_reg(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + val = _pmbus_read_word_data(client, reg->page, 0xff, reg->attr->reg); + mutex_unlock(&data->update_lock); + if (val < 0) + return val; + + return snprintf(buf, PAGE_SIZE, "%d\n", val); +} + +static ssize_t pmbus_set_samples(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + int ret; + long val; + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_samples_reg *reg = to_samples_reg(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + if (kstrtol(buf, 0, &val) < 0) + return -EINVAL; + + mutex_lock(&data->update_lock); + ret = _pmbus_write_word_data(client, reg->page, reg->attr->reg, val); + mutex_unlock(&data->update_lock); + + return ret ? : count; +} + +static int pmbus_add_samples_attr(struct pmbus_data *data, int page, + struct pmbus_samples_attr *attr) +{ + struct pmbus_samples_reg *reg; + + reg = devm_kzalloc(data->dev, sizeof(*reg), GFP_KERNEL); + if (!reg) + return -ENOMEM; + + reg->attr = attr; + reg->page = page; + + pmbus_dev_attr_init(®->dev_attr, attr->name, 0644, + pmbus_show_samples, pmbus_set_samples); + + return pmbus_add_attribute(data, ®->dev_attr.attr); +} + +static int pmbus_add_samples_attributes(struct i2c_client *client, + struct pmbus_data *data) +{ + const struct pmbus_driver_info *info = data->info; + int s; + + if (!(info->func[0] & PMBUS_HAVE_SAMPLES)) + return 0; + + for (s = 0; s < ARRAY_SIZE(pmbus_samples_registers); s++) { + struct pmbus_samples_attr *attr; + int ret; + + attr = &pmbus_samples_registers[s]; + if (!wb_pmbus_check_word_register(client, 0, attr->reg)) + continue; + + ret = pmbus_add_samples_attr(data, 0, attr); + if (ret) + return ret; + } + + return 0; +} + +static int pmbus_find_attributes(struct i2c_client *client, + struct pmbus_data *data) +{ + int ret; + + /* Voltage sensors */ + ret = pmbus_add_sensor_attrs(client, data, "in", voltage_attributes, + ARRAY_SIZE(voltage_attributes)); + if (ret) + return ret; + + /* Current sensors */ + ret = pmbus_add_sensor_attrs(client, data, "curr", current_attributes, + ARRAY_SIZE(current_attributes)); + if (ret) + return ret; + + /* Power sensors */ + ret = pmbus_add_sensor_attrs(client, data, "power", power_attributes, + ARRAY_SIZE(power_attributes)); + if (ret) + return ret; + + /* Temperature sensors */ + ret = pmbus_add_sensor_attrs(client, data, "temp", temp_attributes, + ARRAY_SIZE(temp_attributes)); + if (ret) + return ret; + + /* Fans */ + ret = pmbus_add_fan_attributes(client, data); + if (ret) + return ret; + + ret = pmbus_add_samples_attributes(client, data); + return ret; +} + +/* + * Identify chip parameters. + * This function is called for all chips. + */ +static int pmbus_identify_common(struct i2c_client *client, + struct pmbus_data *data, int page) +{ + int vout_mode = -1; + + if (wb_pmbus_check_byte_register(client, page, PMBUS_VOUT_MODE)) + vout_mode = _pmbus_read_byte_data(client, page, + PMBUS_VOUT_MODE); + if (vout_mode >= 0 && vout_mode != 0xff) { + /* + * Not all chips support the VOUT_MODE command, + * so a failure to read it is not an error. + */ + switch (vout_mode >> 5) { + case 0: /* linear mode */ + if (data->info->format[PSC_VOLTAGE_OUT] != linear) + return -ENODEV; + + data->exponent[page] = ((s8)(vout_mode << 3)) >> 3; + break; + case 1: /* VID mode */ + if (data->info->format[PSC_VOLTAGE_OUT] != vid) + return -ENODEV; + break; + case 2: /* direct mode */ + if (data->info->format[PSC_VOLTAGE_OUT] != direct) + return -ENODEV; + break; + default: + return -ENODEV; + } + } + + pmbus_clear_fault_page(client, page); + return 0; +} + +static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data, + struct pmbus_driver_info *info) +{ + struct device *dev = &client->dev; + int page, ret, i; + + /* + * Some PMBus chips don't support PMBUS_STATUS_WORD, so try + * to use PMBUS_STATUS_BYTE instead if that is the case. + * Bail out if both registers are not supported. + */ + for(i = 0; i < PMBUS_RETRY_TIME; i++) { + data->read_status = pmbus_read_status_word; + ret = i2c_smbus_read_word_data(client, PMBUS_STATUS_WORD); + if (ret < 0 || ret == 0xffff) { + data->read_status = pmbus_read_status_byte; + ret = i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE); + if (ret < 0 || ret == 0xff) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + continue; + } + } else { + data->has_status_word = true; + } + break; + } + + if(i == PMBUS_RETRY_TIME) { + dev_err(dev, "PMBus status register not found\n"); + return -ENODEV; + } + + /* Enable PEC if the controller supports it */ + for(i = 0; i < PMBUS_RETRY_TIME; i++) { + ret = i2c_smbus_read_byte_data(client, PMBUS_CAPABILITY); + if (ret >= 0) { + break; + } + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + + if (ret >= 0 && (ret & PB_CAPABILITY_ERROR_CHECK)) + client->flags |= I2C_CLIENT_PEC; + + /* + * Check if the chip is write protected. If it is, we can not clear + * faults, and we should not try it. Also, in that case, writes into + * limit registers need to be disabled. + */ + for(i = 0; i < PMBUS_RETRY_TIME; i++) { + ret = i2c_smbus_read_byte_data(client, PMBUS_WRITE_PROTECT); + if (ret >= 0) { + break; + } + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + + if (ret > 0 && (ret & PB_WP_ANY)) + data->flags |= PMBUS_WRITE_PROTECTED | PMBUS_SKIP_STATUS_CHECK; + + if (data->info->pages) + wb_pmbus_clear_faults(client); + else + pmbus_clear_fault_page(client, -1); + + if (info->identify) { + ret = (*info->identify)(client, info); + if (ret < 0) { + dev_err(dev, "Chip identification failed\n"); + return ret; + } + } + + if (info->pages <= 0 || info->pages > PMBUS_PAGES) { + dev_err(dev, "Bad number of PMBus pages: %d\n", info->pages); + return -ENODEV; + } + + for (page = 0; page < info->pages; page++) { + ret = pmbus_identify_common(client, data, page); + if (ret < 0) { + dev_err(dev, "Failed to identify chip capabilities\n"); + return ret; + } + } + return 0; +} + +#if IS_ENABLED(CONFIG_REGULATOR) +static int pmbus_regulator_is_enabled(struct regulator_dev *rdev) +{ + struct device *dev = rdev_get_dev(rdev); + struct i2c_client *client = to_i2c_client(dev->parent); + u8 page = rdev_get_id(rdev); + int ret; + + ret = wb_pmbus_read_byte_data(client, page, PMBUS_OPERATION); + if (ret < 0) + return ret; + + return !!(ret & PB_OPERATION_CONTROL_ON); +} + +static int _pmbus_regulator_on_off(struct regulator_dev *rdev, bool enable) +{ + struct device *dev = rdev_get_dev(rdev); + struct i2c_client *client = to_i2c_client(dev->parent); + u8 page = rdev_get_id(rdev); + + return wb_pmbus_update_byte_data(client, page, PMBUS_OPERATION, + PB_OPERATION_CONTROL_ON, + enable ? PB_OPERATION_CONTROL_ON : 0); +} + +static int pmbus_regulator_enable(struct regulator_dev *rdev) +{ + return _pmbus_regulator_on_off(rdev, 1); +} + +static int pmbus_regulator_disable(struct regulator_dev *rdev) +{ + return _pmbus_regulator_on_off(rdev, 0); +} + +const struct regulator_ops wb_pmbus_regulator_ops = { + .enable = pmbus_regulator_enable, + .disable = pmbus_regulator_disable, + .is_enabled = pmbus_regulator_is_enabled, +}; +EXPORT_SYMBOL_GPL(wb_pmbus_regulator_ops); + +static int pmbus_regulator_register(struct pmbus_data *data) +{ + struct device *dev = data->dev; + const struct pmbus_driver_info *info = data->info; + const struct pmbus_platform_data *pdata = dev_get_platdata(dev); + struct regulator_dev *rdev; + int i; + + for (i = 0; i < info->num_regulators; i++) { + struct regulator_config config = { }; + + config.dev = dev; + config.driver_data = data; + + if (pdata && pdata->reg_init_data) + config.init_data = &pdata->reg_init_data[i]; + + rdev = devm_regulator_register(dev, &info->reg_desc[i], + &config); + if (IS_ERR(rdev)) { + dev_err(dev, "Failed to register %s regulator\n", + info->reg_desc[i].name); + return PTR_ERR(rdev); + } + } + + return 0; +} +#else +static int pmbus_regulator_register(struct pmbus_data *data) +{ + return 0; +} +#endif + +static struct dentry *pmbus_debugfs_dir; /* pmbus debugfs directory */ + +#if IS_ENABLED(CONFIG_DEBUG_FS) +static int pmbus_debugfs_get(void *data, u64 *val) +{ + int rc; + struct pmbus_debugfs_entry *entry = data; + + rc = _pmbus_read_byte_data(entry->client, entry->page, entry->reg); + if (rc < 0) + return rc; + + *val = rc; + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops, pmbus_debugfs_get, NULL, + "0x%02llx\n"); + +static int pmbus_debugfs_get_status(void *data, u64 *val) +{ + int rc; + struct pmbus_debugfs_entry *entry = data; + struct pmbus_data *pdata = i2c_get_clientdata(entry->client); + + rc = pdata->read_status(entry->client, entry->page); + if (rc < 0) + return rc; + + *val = rc; + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops_status, pmbus_debugfs_get_status, + NULL, "0x%04llx\n"); + +static int pmbus_debugfs_get_pec(void *data, u64 *val) +{ + struct i2c_client *client = data; + + *val = !!(client->flags & I2C_CLIENT_PEC); + + return 0; +} + +static int pmbus_debugfs_set_pec(void *data, u64 val) +{ + int rc; + struct i2c_client *client = data; + + if (!val) { + client->flags &= ~I2C_CLIENT_PEC; + return 0; + } + + if (val != 1) + return -EINVAL; + + rc = i2c_smbus_read_byte_data(client, PMBUS_CAPABILITY); + if (rc < 0) + return rc; + + if (!(rc & PB_CAPABILITY_ERROR_CHECK)) + return -EOPNOTSUPP; + + client->flags |= I2C_CLIENT_PEC; + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops_pec, pmbus_debugfs_get_pec, + pmbus_debugfs_set_pec, "%llu\n"); + +static int pmbus_init_debugfs(struct i2c_client *client, + struct pmbus_data *data) +{ + int i, idx = 0; + char name[PMBUS_NAME_SIZE]; + struct pmbus_debugfs_entry *entries; + + if (!pmbus_debugfs_dir) + return -ENODEV; + + /* + * Create the debugfs directory for this device. Use the hwmon device + * name to avoid conflicts (hwmon numbers are globally unique). + */ + data->debugfs = debugfs_create_dir(dev_name(data->hwmon_dev), + pmbus_debugfs_dir); + if (IS_ERR_OR_NULL(data->debugfs)) { + data->debugfs = NULL; + return -ENODEV; + } + + /* Allocate the max possible entries we need. */ + entries = devm_kcalloc(data->dev, + data->info->pages * 10, sizeof(*entries), + GFP_KERNEL); + if (!entries) + return -ENOMEM; + + debugfs_create_file("pec", 0664, data->debugfs, client, + &pmbus_debugfs_ops_pec); + + for (i = 0; i < data->info->pages; ++i) { + /* Check accessibility of status register if it's not page 0 */ + if (!i || pmbus_check_status_register(client, i)) { + /* No need to set reg as we have special read op. */ + entries[idx].client = client; + entries[idx].page = i; + scnprintf(name, PMBUS_NAME_SIZE, "status%d", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops_status); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_VOUT) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_VOUT; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_vout", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_IOUT) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_IOUT; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_iout", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_INPUT) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_INPUT; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_input", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_TEMP) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_TEMPERATURE; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_temp", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (wb_pmbus_check_byte_register(client, i, PMBUS_STATUS_CML)) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_CML; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_cml", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (wb_pmbus_check_byte_register(client, i, PMBUS_STATUS_OTHER)) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_OTHER; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_other", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (wb_pmbus_check_byte_register(client, i, + PMBUS_STATUS_MFR_SPECIFIC)) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_MFR_SPECIFIC; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_mfr", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_FAN12) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_FAN_12; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_fan12", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_FAN34) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_FAN_34; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_fan34", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + } + + return 0; +} +#else +static int pmbus_init_debugfs(struct i2c_client *client, + struct pmbus_data *data) +{ + return 0; +} +#endif /* IS_ENABLED(CONFIG_DEBUG_FS) */ + +int wb_pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info) +{ + struct device *dev = &client->dev; + const struct pmbus_platform_data *pdata = dev_get_platdata(dev); + struct pmbus_data *data; + size_t groups_num = 0; + int ret; + + if (!info) + return -ENODEV; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE + | I2C_FUNC_SMBUS_BYTE_DATA + | I2C_FUNC_SMBUS_WORD_DATA)) + return -ENODEV; + + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + if (info->groups) + while (info->groups[groups_num]) + groups_num++; + + data->groups = devm_kcalloc(dev, groups_num + 2, sizeof(void *), + GFP_KERNEL); + if (!data->groups) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + data->dev = dev; + + if (pdata) + data->flags = pdata->flags; + data->info = info; + data->currpage = -1; + data->currphase = -1; + + ret = pmbus_init_common(client, data, info); + if (ret < 0) + return ret; + + ret = pmbus_find_attributes(client, data); + if (ret) + return ret; + + /* + * If there are no attributes, something is wrong. + * Bail out instead of trying to register nothing. + */ + if (!data->num_attributes) { + dev_err(dev, "No attributes found\n"); + return -ENODEV; + } + + data->groups[0] = &data->group; + memcpy(data->groups + 1, info->groups, sizeof(void *) * groups_num); + data->hwmon_dev = devm_hwmon_device_register_with_groups(dev, + client->name, data, data->groups); + if (IS_ERR(data->hwmon_dev)) { + dev_err(dev, "Failed to register hwmon device\n"); + return PTR_ERR(data->hwmon_dev); + } + + ret = pmbus_regulator_register(data); + if (ret) + return ret; + + ret = pmbus_init_debugfs(client, data); + if (ret) + dev_warn(dev, "Failed to register debugfs\n"); + + return 0; +} +EXPORT_SYMBOL_GPL(wb_pmbus_do_probe); + +int wb_pmbus_do_remove(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + + debugfs_remove_recursive(data->debugfs); + + return 0; +} +EXPORT_SYMBOL_GPL(wb_pmbus_do_remove); + +struct dentry *wb_pmbus_get_debugfs_dir(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + + return data->debugfs; +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_debugfs_dir); + +static int __init pmbus_core_init(void) +{ + pmbus_debugfs_dir = debugfs_create_dir("pmbus", NULL); + if (IS_ERR(pmbus_debugfs_dir)) + pmbus_debugfs_dir = NULL; + + return 0; +} + +static void __exit pmbus_core_exit(void) +{ + debugfs_remove_recursive(pmbus_debugfs_dir); +} + +module_init(pmbus_core_init); +module_exit(pmbus_core_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus core driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c new file mode 100644 index 000000000000..4118510b1006 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c @@ -0,0 +1,798 @@ +/* tmp401.c + * + * Copyright (C) 2007,2008 Hans de Goede + * Preliminary tmp411 support by: + * Gabriel Konat, Sander Leget, Wouter Willems + * Copyright (C) 2009 Andre Prendel + * + * Cleanup and support for TMP431 and TMP432 by Guenter Roeck + * Copyright (c) 2013 Guenter Roeck + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Driver for the Texas Instruments TMP401 SMBUS temperature sensor IC. + * + * Note this IC is in some aspect similar to the LM90, but it has quite a + * few differences too, for example the local temp has a higher resolution + * and thus has 16 bits registers for its value and limit instead of 8 bits. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Addresses to scan */ +/* static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4c, 0x4d, + 0x4e, 0x4f, I2C_CLIENT_END }; */ + +enum chips { tmp401, tmp411, tmp431, tmp432, tmp435, tmp461 }; + +/* + * The TMP401 registers, note some registers have different addresses for + * reading and writing + */ +#define TMP401_STATUS 0x02 +#define TMP401_CONFIG_READ 0x03 +#define TMP401_CONFIG_WRITE 0x09 +#define TMP401_CONVERSION_RATE_READ 0x04 +#define TMP401_CONVERSION_RATE_WRITE 0x0A +#define TMP401_TEMP_CRIT_HYST 0x21 +#define TMP401_MANUFACTURER_ID_REG 0xFE +#define TMP401_DEVICE_ID_REG 0xFF + +static const u8 TMP401_TEMP_MSB_READ[7][2] = { + { 0x00, 0x01 }, /* temp */ + { 0x06, 0x08 }, /* low limit */ + { 0x05, 0x07 }, /* high limit */ + { 0x20, 0x19 }, /* therm (crit) limit */ + { 0x30, 0x34 }, /* lowest */ + { 0x32, 0x36 }, /* highest */ + { 0, 0x11 }, /* offset */ +}; + +static const u8 TMP401_TEMP_MSB_WRITE[7][2] = { + { 0, 0 }, /* temp (unused) */ + { 0x0C, 0x0E }, /* low limit */ + { 0x0B, 0x0D }, /* high limit */ + { 0x20, 0x19 }, /* therm (crit) limit */ + { 0x30, 0x34 }, /* lowest */ + { 0x32, 0x36 }, /* highest */ + { 0, 0x11 }, /* offset */ +}; + +static const u8 TMP401_TEMP_LSB[7][2] = { + { 0x15, 0x10 }, /* temp */ + { 0x17, 0x14 }, /* low limit */ + { 0x16, 0x13 }, /* high limit */ + { 0, 0 }, /* therm (crit) limit (unused) */ + { 0x31, 0x35 }, /* lowest */ + { 0x33, 0x37 }, /* highest */ + { 0, 0x12 }, /* offset */ +}; + +static const u8 TMP432_TEMP_MSB_READ[4][3] = { + { 0x00, 0x01, 0x23 }, /* temp */ + { 0x06, 0x08, 0x16 }, /* low limit */ + { 0x05, 0x07, 0x15 }, /* high limit */ + { 0x20, 0x19, 0x1A }, /* therm (crit) limit */ +}; + +static const u8 TMP432_TEMP_MSB_WRITE[4][3] = { + { 0, 0, 0 }, /* temp - unused */ + { 0x0C, 0x0E, 0x16 }, /* low limit */ + { 0x0B, 0x0D, 0x15 }, /* high limit */ + { 0x20, 0x19, 0x1A }, /* therm (crit) limit */ +}; + +static const u8 TMP432_TEMP_LSB[3][3] = { + { 0x29, 0x10, 0x24 }, /* temp */ + { 0x3E, 0x14, 0x18 }, /* low limit */ + { 0x3D, 0x13, 0x17 }, /* high limit */ +}; + +/* [0] = fault, [1] = low, [2] = high, [3] = therm/crit */ +static const u8 TMP432_STATUS_REG[] = { + 0x1b, 0x36, 0x35, 0x37 }; + +/* Flags */ +#define TMP401_CONFIG_RANGE BIT(2) +#define TMP401_CONFIG_SHUTDOWN BIT(6) +#define TMP401_STATUS_LOCAL_CRIT BIT(0) +#define TMP401_STATUS_REMOTE_CRIT BIT(1) +#define TMP401_STATUS_REMOTE_OPEN BIT(2) +#define TMP401_STATUS_REMOTE_LOW BIT(3) +#define TMP401_STATUS_REMOTE_HIGH BIT(4) +#define TMP401_STATUS_LOCAL_LOW BIT(5) +#define TMP401_STATUS_LOCAL_HIGH BIT(6) + +/* On TMP432, each status has its own register */ +#define TMP432_STATUS_LOCAL BIT(0) +#define TMP432_STATUS_REMOTE1 BIT(1) +#define TMP432_STATUS_REMOTE2 BIT(2) + +/* Manufacturer / Device ID's */ +#define TMP401_MANUFACTURER_ID 0x55 +#define TMP401_DEVICE_ID 0x11 +#define TMP411A_DEVICE_ID 0x12 +#define TMP411B_DEVICE_ID 0x13 +#define TMP411C_DEVICE_ID 0x10 +#define TMP431_DEVICE_ID 0x31 +#define TMP432_DEVICE_ID 0x32 +#define TMP435_DEVICE_ID 0x35 + +/* + * Driver data (common to all clients) + */ + +static const struct i2c_device_id tmp401_id[] = { + { "wb_tmp401", tmp401 }, + { "wb_tmp411", tmp411 }, + { "wb_tmp431", tmp431 }, + { "wb_tmp432", tmp432 }, + { "wb_tmp435", tmp435 }, + { "wb_tmp461", tmp461 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tmp401_id); + +/* + * Client data (each client gets its own) + */ + +struct tmp401_data { + struct i2c_client *client; + const struct attribute_group *groups[3]; + struct mutex update_lock; + char valid; /* zero until following fields are valid */ + unsigned long last_updated; /* in jiffies */ + enum chips kind; + + unsigned int update_interval; /* in milliseconds */ + + /* register values */ + u8 status[4]; + u8 config; + u16 temp[7][3]; + u8 temp_crit_hyst; +}; + +/* + * Sysfs attr show / store functions + */ + +static int tmp401_register_to_temp(u16 reg, u8 config) +{ + int temp = reg; + + if (config & TMP401_CONFIG_RANGE) + temp -= 64 * 256; + + return DIV_ROUND_CLOSEST(temp * 125, 32); +} + +static u16 tmp401_temp_to_register(long temp, u8 config, int zbits) +{ + if (config & TMP401_CONFIG_RANGE) { + temp = clamp_val(temp, -64000, 191000); + temp += 64000; + } else + temp = clamp_val(temp, 0, 127000); + + return DIV_ROUND_CLOSEST(temp * (1 << (8 - zbits)), 1000) << zbits; +} + +static int tmp401_update_device_reg16(struct i2c_client *client, + struct tmp401_data *data) +{ + int i, j, val; + int num_regs = data->kind == tmp411 ? 6 : 4; + int num_sensors = data->kind == tmp432 ? 3 : 2; + + for (i = 0; i < num_sensors; i++) { /* local / r1 / r2 */ + for (j = 0; j < num_regs; j++) { /* temp / low / ... */ + u8 regaddr; + /* + * High byte must be read first immediately followed + * by the low byte + */ + regaddr = data->kind == tmp432 ? + TMP432_TEMP_MSB_READ[j][i] : + TMP401_TEMP_MSB_READ[j][i]; + val = i2c_smbus_read_byte_data(client, regaddr); + if (val < 0) + return val; + data->temp[j][i] = val << 8; + if (j == 3) /* crit is msb only */ + continue; + regaddr = data->kind == tmp432 ? TMP432_TEMP_LSB[j][i] + : TMP401_TEMP_LSB[j][i]; + val = i2c_smbus_read_byte_data(client, regaddr); + if (val < 0) + return val; + data->temp[j][i] |= val; + } + } + return 0; +} + +static struct tmp401_data *tmp401_update_device(struct device *dev) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + struct tmp401_data *ret = data; + int i, val; + unsigned long next_update; + + mutex_lock(&data->update_lock); + + next_update = data->last_updated + + msecs_to_jiffies(data->update_interval); + if (time_after(jiffies, next_update) || !data->valid) { + if (data->kind != tmp432) { + /* + * The driver uses the TMP432 status format internally. + * Convert status to TMP432 format for other chips. + */ + val = i2c_smbus_read_byte_data(client, TMP401_STATUS); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->status[0] = + (val & TMP401_STATUS_REMOTE_OPEN) >> 1; + data->status[1] = + ((val & TMP401_STATUS_REMOTE_LOW) >> 2) | + ((val & TMP401_STATUS_LOCAL_LOW) >> 5); + data->status[2] = + ((val & TMP401_STATUS_REMOTE_HIGH) >> 3) | + ((val & TMP401_STATUS_LOCAL_HIGH) >> 6); + data->status[3] = val & (TMP401_STATUS_LOCAL_CRIT + | TMP401_STATUS_REMOTE_CRIT); + } else { + for (i = 0; i < ARRAY_SIZE(data->status); i++) { + val = i2c_smbus_read_byte_data(client, + TMP432_STATUS_REG[i]); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->status[i] = val; + } + } + + val = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->config = val; + val = tmp401_update_device_reg16(client, data); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + val = i2c_smbus_read_byte_data(client, TMP401_TEMP_CRIT_HYST); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->temp_crit_hyst = val; + + data->last_updated = jiffies; + data->valid = 1; + } + +abort: + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t show_temp(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int nr = to_sensor_dev_attr_2(devattr)->nr; + int index = to_sensor_dev_attr_2(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + + if (IS_ERR(data)) + return PTR_ERR(data); + + return sprintf(buf, "%d\n", + tmp401_register_to_temp(data->temp[nr][index], data->config)); +} + +static ssize_t show_temp_crit_hyst(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int temp, index = to_sensor_dev_attr(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + + if (IS_ERR(data)) + return PTR_ERR(data); + + mutex_lock(&data->update_lock); + temp = tmp401_register_to_temp(data->temp[3][index], data->config); + temp -= data->temp_crit_hyst * 1000; + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", temp); +} + +static ssize_t show_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int nr = to_sensor_dev_attr_2(devattr)->nr; + int mask = to_sensor_dev_attr_2(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + + if (IS_ERR(data)) + return PTR_ERR(data); + + return sprintf(buf, "%d\n", !!(data->status[nr] & mask)); +} + +static ssize_t store_temp(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + int nr = to_sensor_dev_attr_2(devattr)->nr; + int index = to_sensor_dev_attr_2(devattr)->index; + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + long val; + u16 reg; + u8 regaddr; + + if (kstrtol(buf, 10, &val)) + return -EINVAL; + + reg = tmp401_temp_to_register(val, data->config, nr == 3 ? 8 : 4); + + mutex_lock(&data->update_lock); + + regaddr = data->kind == tmp432 ? TMP432_TEMP_MSB_WRITE[nr][index] + : TMP401_TEMP_MSB_WRITE[nr][index]; + i2c_smbus_write_byte_data(client, regaddr, reg >> 8); + if (nr != 3) { + regaddr = data->kind == tmp432 ? TMP432_TEMP_LSB[nr][index] + : TMP401_TEMP_LSB[nr][index]; + i2c_smbus_write_byte_data(client, regaddr, reg & 0xFF); + } + data->temp[nr][index] = reg; + + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t store_temp_crit_hyst(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + int temp, index = to_sensor_dev_attr(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + long val; + u8 reg; + + if (IS_ERR(data)) + return PTR_ERR(data); + + if (kstrtol(buf, 10, &val)) + return -EINVAL; + + if (data->config & TMP401_CONFIG_RANGE) + val = clamp_val(val, -64000, 191000); + else + val = clamp_val(val, 0, 127000); + + mutex_lock(&data->update_lock); + temp = tmp401_register_to_temp(data->temp[3][index], data->config); + val = clamp_val(val, temp - 255000, temp); + reg = ((temp - val) + 500) / 1000; + + i2c_smbus_write_byte_data(data->client, TMP401_TEMP_CRIT_HYST, + reg); + + data->temp_crit_hyst = reg; + + mutex_unlock(&data->update_lock); + + return count; +} + +/* + * Resets the historical measurements of minimum and maximum temperatures. + * This is done by writing any value to any of the minimum/maximum registers + * (0x30-0x37). + */ +static ssize_t reset_temp_history(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + long val; + + if (kstrtol(buf, 10, &val)) + return -EINVAL; + + if (val != 1) { + dev_err(dev, + "temp_reset_history value %ld not supported. Use 1 to reset the history!\n", + val); + return -EINVAL; + } + mutex_lock(&data->update_lock); + i2c_smbus_write_byte_data(client, TMP401_TEMP_MSB_WRITE[5][0], val); + data->valid = 0; + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_update_interval(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", data->update_interval); +} + +static ssize_t set_update_interval(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + unsigned long val; + int err, rate; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + + /* + * For valid rates, interval can be calculated as + * interval = (1 << (7 - rate)) * 125; + * Rounded rate is therefore + * rate = 7 - __fls(interval * 4 / (125 * 3)); + * Use clamp_val() to avoid overflows, and to ensure valid input + * for __fls. + */ + val = clamp_val(val, 125, 16000); + rate = 7 - __fls(val * 4 / (125 * 3)); + mutex_lock(&data->update_lock); + i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, rate); + data->update_interval = (1 << (7 - rate)) * 125; + mutex_unlock(&data->update_lock); + + return count; +} + +static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0); +static SENSOR_DEVICE_ATTR_2(temp1_min, S_IWUSR | S_IRUGO, show_temp, + store_temp, 1, 0); +static SENSOR_DEVICE_ATTR_2(temp1_max, S_IWUSR | S_IRUGO, show_temp, + store_temp, 2, 0); +static SENSOR_DEVICE_ATTR_2(temp1_crit, S_IWUSR | S_IRUGO, show_temp, + store_temp, 3, 0); +static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, + show_temp_crit_hyst, store_temp_crit_hyst, 0); +static SENSOR_DEVICE_ATTR_2(temp1_min_alarm, S_IRUGO, show_status, NULL, + 1, TMP432_STATUS_LOCAL); +static SENSOR_DEVICE_ATTR_2(temp1_max_alarm, S_IRUGO, show_status, NULL, + 2, TMP432_STATUS_LOCAL); +static SENSOR_DEVICE_ATTR_2(temp1_crit_alarm, S_IRUGO, show_status, NULL, + 3, TMP432_STATUS_LOCAL); +static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1); +static SENSOR_DEVICE_ATTR_2(temp2_min, S_IWUSR | S_IRUGO, show_temp, + store_temp, 1, 1); +static SENSOR_DEVICE_ATTR_2(temp2_max, S_IWUSR | S_IRUGO, show_temp, + store_temp, 2, 1); +static SENSOR_DEVICE_ATTR_2(temp2_crit, S_IWUSR | S_IRUGO, show_temp, + store_temp, 3, 1); +static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, + NULL, 1); +static SENSOR_DEVICE_ATTR_2(temp2_fault, S_IRUGO, show_status, NULL, + 0, TMP432_STATUS_REMOTE1); +static SENSOR_DEVICE_ATTR_2(temp2_min_alarm, S_IRUGO, show_status, NULL, + 1, TMP432_STATUS_REMOTE1); +static SENSOR_DEVICE_ATTR_2(temp2_max_alarm, S_IRUGO, show_status, NULL, + 2, TMP432_STATUS_REMOTE1); +static SENSOR_DEVICE_ATTR_2(temp2_crit_alarm, S_IRUGO, show_status, NULL, + 3, TMP432_STATUS_REMOTE1); + +static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, show_update_interval, + set_update_interval); + +static struct attribute *tmp401_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp1_min.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp1_crit.dev_attr.attr, + &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, + &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, + + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp2_min.dev_attr.attr, + &sensor_dev_attr_temp2_max.dev_attr.attr, + &sensor_dev_attr_temp2_crit.dev_attr.attr, + &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp2_fault.dev_attr.attr, + &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, + &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, + + &dev_attr_update_interval.attr, + + NULL +}; + +static const struct attribute_group tmp401_group = { + .attrs = tmp401_attributes, +}; + +/* + * Additional features of the TMP411 chip. + * The TMP411 stores the minimum and maximum + * temperature measured since power-on, chip-reset, or + * minimum and maximum register reset for both the local + * and remote channels. + */ +static SENSOR_DEVICE_ATTR_2(temp1_lowest, S_IRUGO, show_temp, NULL, 4, 0); +static SENSOR_DEVICE_ATTR_2(temp1_highest, S_IRUGO, show_temp, NULL, 5, 0); +static SENSOR_DEVICE_ATTR_2(temp2_lowest, S_IRUGO, show_temp, NULL, 4, 1); +static SENSOR_DEVICE_ATTR_2(temp2_highest, S_IRUGO, show_temp, NULL, 5, 1); +static SENSOR_DEVICE_ATTR(temp_reset_history, S_IWUSR, NULL, reset_temp_history, + 0); + +static struct attribute *tmp411_attributes[] = { + &sensor_dev_attr_temp1_highest.dev_attr.attr, + &sensor_dev_attr_temp1_lowest.dev_attr.attr, + &sensor_dev_attr_temp2_highest.dev_attr.attr, + &sensor_dev_attr_temp2_lowest.dev_attr.attr, + &sensor_dev_attr_temp_reset_history.dev_attr.attr, + NULL +}; + +static const struct attribute_group tmp411_group = { + .attrs = tmp411_attributes, +}; + +static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2); +static SENSOR_DEVICE_ATTR_2(temp3_min, S_IWUSR | S_IRUGO, show_temp, + store_temp, 1, 2); +static SENSOR_DEVICE_ATTR_2(temp3_max, S_IWUSR | S_IRUGO, show_temp, + store_temp, 2, 2); +static SENSOR_DEVICE_ATTR_2(temp3_crit, S_IWUSR | S_IRUGO, show_temp, + store_temp, 3, 2); +static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, + NULL, 2); +static SENSOR_DEVICE_ATTR_2(temp3_fault, S_IRUGO, show_status, NULL, + 0, TMP432_STATUS_REMOTE2); +static SENSOR_DEVICE_ATTR_2(temp3_min_alarm, S_IRUGO, show_status, NULL, + 1, TMP432_STATUS_REMOTE2); +static SENSOR_DEVICE_ATTR_2(temp3_max_alarm, S_IRUGO, show_status, NULL, + 2, TMP432_STATUS_REMOTE2); +static SENSOR_DEVICE_ATTR_2(temp3_crit_alarm, S_IRUGO, show_status, NULL, + 3, TMP432_STATUS_REMOTE2); + +static struct attribute *tmp432_attributes[] = { + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp3_min.dev_attr.attr, + &sensor_dev_attr_temp3_max.dev_attr.attr, + &sensor_dev_attr_temp3_crit.dev_attr.attr, + &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp3_fault.dev_attr.attr, + &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, + &sensor_dev_attr_temp3_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr, + + NULL +}; + +static const struct attribute_group tmp432_group = { + .attrs = tmp432_attributes, +}; + +/* + * Additional features of the TMP461 chip. + * The TMP461 temperature offset for the remote channel. + */ +static SENSOR_DEVICE_ATTR_2(temp2_offset, S_IWUSR | S_IRUGO, show_temp, + store_temp, 6, 1); + +static struct attribute *tmp461_attributes[] = { + &sensor_dev_attr_temp2_offset.dev_attr.attr, + NULL +}; + +static const struct attribute_group tmp461_group = { + .attrs = tmp461_attributes, +}; + +/* + * Begin non sysfs callback code (aka Real code) + */ + +static int tmp401_init_client(struct tmp401_data *data, + struct i2c_client *client) +{ + int config, config_orig, status = 0; + + /* Set the conversion rate to 2 Hz */ + i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, 5); + data->update_interval = 500; + + /* Start conversions (disable shutdown if necessary) */ + config = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); + if (config < 0) + return config; + + config_orig = config; + config &= ~TMP401_CONFIG_SHUTDOWN; + + if (config != config_orig) + status = i2c_smbus_write_byte_data(client, + TMP401_CONFIG_WRITE, + config); + + return status; +} + +#if 0 +static int tmp401_detect(struct i2c_client *client, + struct i2c_board_info *info) +{ + enum chips kind; + struct i2c_adapter *adapter = client->adapter; + u8 reg; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) + return -ENODEV; + + /* Detect and identify the chip */ + reg = i2c_smbus_read_byte_data(client, TMP401_MANUFACTURER_ID_REG); + if (reg != TMP401_MANUFACTURER_ID) + return -ENODEV; + + reg = i2c_smbus_read_byte_data(client, TMP401_DEVICE_ID_REG); + + switch (reg) { + case TMP401_DEVICE_ID: + if (client->addr != 0x4c) + return -ENODEV; + kind = tmp401; + break; + case TMP411A_DEVICE_ID: + if (client->addr != 0x4c) + return -ENODEV; + kind = tmp411; + break; + case TMP411B_DEVICE_ID: + if (client->addr != 0x4d) + return -ENODEV; + kind = tmp411; + break; + case TMP411C_DEVICE_ID: + if (client->addr != 0x4e) + return -ENODEV; + kind = tmp411; + break; + case TMP431_DEVICE_ID: + if (client->addr != 0x4c && client->addr != 0x4d) + return -ENODEV; + kind = tmp431; + break; + case TMP432_DEVICE_ID: + if (client->addr != 0x4c && client->addr != 0x4d) + return -ENODEV; + kind = tmp432; + break; + case TMP435_DEVICE_ID: + kind = tmp435; + break; + default: + return -ENODEV; + } + + reg = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); + if (reg & 0x1b) + return -ENODEV; + + reg = i2c_smbus_read_byte_data(client, TMP401_CONVERSION_RATE_READ); + /* Datasheet says: 0x1-0x6 */ + if (reg > 15) + return -ENODEV; + + strlcpy(info->type, tmp401_id[kind].name, I2C_NAME_SIZE); + + return 0; +} +#endif + +static int tmp401_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + static const char * const names[] = { + "TMP401", "TMP411", "TMP431", "TMP432", "TMP435", "TMP461" + }; + struct device *dev = &client->dev; + struct device *hwmon_dev; + struct tmp401_data *data; + int groups = 0, status; + + data = devm_kzalloc(dev, sizeof(struct tmp401_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->client = client; + mutex_init(&data->update_lock); + data->kind = id->driver_data; + + /* Initialize the TMP401 chip */ + status = tmp401_init_client(data, client); + if (status < 0) + return status; + + /* Register sysfs hooks */ + data->groups[groups++] = &tmp401_group; + + /* Register additional tmp411 sysfs hooks */ + if (data->kind == tmp411) + data->groups[groups++] = &tmp411_group; + + /* Register additional tmp432 sysfs hooks */ + if (data->kind == tmp432) + data->groups[groups++] = &tmp432_group; + + if (data->kind == tmp461) + data->groups[groups++] = &tmp461_group; + + hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, + data, data->groups); + if (IS_ERR(hwmon_dev)) + return PTR_ERR(hwmon_dev); + + dev_info(dev, "Detected TI %s chip\n", names[data->kind]); + + return 0; +} + +static struct i2c_driver tmp401_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wb_tmp401", + }, + .probe = tmp401_probe, + .id_table = tmp401_id, + /* .detect = tmp401_detect, */ + /* .address_list = normal_i2c, */ +}; + +module_i2c_driver(tmp401_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Texas Instruments TMP401 temperature sensor driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c new file mode 100644 index 000000000000..b68196d9f57c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for Texas Instruments TPS53679 + * + * Copyright (c) 2017 Mellanox Technologies. All rights reserved. + * Copyright (c) 2017 Vadim Pasternak + */ + +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +enum chips { + tps53647, tps53667, tps53679, tps53681, tps53688, tps53622 +}; + +#define TPS53647_PAGE_NUM 1 + +#define TPS53679_PROT_VR12_5MV 0x01 /* VR12.0 mode, 5-mV DAC */ +#define TPS53679_PROT_VR12_5_10MV 0x02 /* VR12.5 mode, 10-mV DAC */ +#define TPS53679_PROT_VR13_10MV 0x04 /* VR13.0 mode, 10-mV DAC */ +#define TPS53679_PROT_IMVP8_5MV 0x05 /* IMVP8 mode, 5-mV DAC */ +#define TPS53679_PROT_VR13_5MV 0x07 /* VR13.0 mode, 5-mV DAC */ +#define TPS53679_PAGE_NUM 2 + +#define TPS53681_DEVICE_ID 0x81 + +#define TPS53681_PMBUS_REVISION 0x33 + +#define TPS53681_MFR_SPECIFIC_20 0xe4 /* Number of phases, per page */ + +static const struct i2c_device_id tps53679_id[]; + +static int tps53679_identify_mode(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + u8 vout_params; + int i, ret; + + for (i = 0; i < info->pages; i++) { + /* Read the register with VOUT scaling value.*/ + ret = wb_pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE); + if (ret < 0) + return ret; + + vout_params = ret & GENMASK(4, 0); + + switch (vout_params) { + case TPS53679_PROT_VR13_10MV: + case TPS53679_PROT_VR12_5_10MV: + info->vrm_version[i] = vr13; + break; + case TPS53679_PROT_VR13_5MV: + case TPS53679_PROT_VR12_5MV: + case TPS53679_PROT_IMVP8_5MV: + info->vrm_version[i] = vr12; + break; + default: + return -EINVAL; + } + } + + return 0; +} + +static int tps53679_identify_phases(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + int ret; + + /* On TPS53681, only channel A provides per-phase output current */ + ret = wb_pmbus_read_byte_data(client, 0, TPS53681_MFR_SPECIFIC_20); + if (ret < 0) + return ret; + info->phases[0] = (ret & 0x07) + 1; + + return 0; +} + +static int tps53679_identify_chip(struct i2c_client *client, + u8 revision, u16 id) +{ + u8 buf[I2C_SMBUS_BLOCK_MAX]; + int ret; + + ret = wb_pmbus_read_byte_data(client, 0, PMBUS_REVISION); + if (ret < 0) + return ret; + if (ret != revision) { + dev_err(&client->dev, "Unexpected PMBus revision 0x%x\n", ret); + return -ENODEV; + } + + ret = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, buf); + if (ret < 0) + return ret; + if (ret != 1 || buf[0] != id) { + dev_err(&client->dev, "Unexpected device ID 0x%x\n", buf[0]); + return -ENODEV; + } + return 0; +} + +/* + * Common identification function for chips with multi-phase support. + * Since those chips have special configuration registers, we want to have + * some level of reassurance that we are really talking with the chip + * being probed. Check PMBus revision and chip ID. + */ +static int tps53679_identify_multiphase(struct i2c_client *client, + struct pmbus_driver_info *info, + int pmbus_rev, int device_id) +{ + int ret; + + ret = tps53679_identify_chip(client, pmbus_rev, device_id); + if (ret < 0) + return ret; + + ret = tps53679_identify_mode(client, info); + if (ret < 0) + return ret; + + return tps53679_identify_phases(client, info); +} + +static int tps53679_identify(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + return tps53679_identify_mode(client, info); +} + +static int tps53681_identify(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + return tps53679_identify_multiphase(client, info, + TPS53681_PMBUS_REVISION, + TPS53681_DEVICE_ID); +} + +static int tps53681_read_word_data(struct i2c_client *client, int page, + int phase, int reg) +{ + /* + * For reading the total output current (READ_IOUT) for all phases, + * the chip datasheet is a bit vague. It says "PHASE must be set to + * FFh to access all phases simultaneously. PHASE may also be set to + * 80h readack (!) the total phase current". + * Experiments show that the command does _not_ report the total + * current for all phases if the phase is set to 0xff. Instead, it + * appears to report the current of one of the phases. Override phase + * parameter with 0x80 when reading the total output current on page 0. + */ + if (reg == PMBUS_READ_IOUT && page == 0 && phase == 0xff) + return wb_pmbus_read_word_data(client, page, 0x80, reg); + return -ENODATA; +} + +static struct pmbus_driver_info tps53679_info = { + .format[PSC_VOLTAGE_IN] = linear, + .format[PSC_VOLTAGE_OUT] = vid, + .format[PSC_TEMPERATURE] = linear, + .format[PSC_CURRENT_OUT] = linear, + .format[PSC_POWER] = linear, + .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | + PMBUS_HAVE_STATUS_INPUT | + PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | + PMBUS_HAVE_POUT, + .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | + PMBUS_HAVE_POUT, + .pfunc[0] = PMBUS_HAVE_IOUT, + .pfunc[1] = PMBUS_HAVE_IOUT, + .pfunc[2] = PMBUS_HAVE_IOUT, + .pfunc[3] = PMBUS_HAVE_IOUT, + .pfunc[4] = PMBUS_HAVE_IOUT, + .pfunc[5] = PMBUS_HAVE_IOUT, +}; + +static int tps53679_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct pmbus_driver_info *info; + enum chips chip_id; + + if (dev->of_node) + chip_id = (enum chips)of_device_get_match_data(dev); + else + chip_id = i2c_match_id(tps53679_id, client)->driver_data; + + info = devm_kmemdup(dev, &tps53679_info, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + switch (chip_id) { + case tps53647: + case tps53667: + info->pages = TPS53647_PAGE_NUM; + info->identify = tps53679_identify; + break; + case tps53679: + case tps53688: + case tps53622: + info->pages = TPS53679_PAGE_NUM; + info->identify = tps53679_identify; + break; + case tps53681: + info->pages = TPS53679_PAGE_NUM; + info->phases[0] = 6; + info->identify = tps53681_identify; + info->read_word_data = tps53681_read_word_data; + break; + default: + return -ENODEV; + } + + return wb_pmbus_do_probe(client, info); +} + +static const struct i2c_device_id tps53679_id[] = { + {"wb_tps53647", tps53647}, + {"wb_tps53667", tps53667}, + {"wb_tps53679", tps53679}, + {"wb_tps53681", tps53681}, + {"wb_tps53688", tps53688}, + {"wb_tps53622", tps53622}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, tps53679_id); + +static const struct of_device_id __maybe_unused tps53679_of_match[] = { + {.compatible = "ti,wb_tps53647", .data = (void *)tps53647}, + {.compatible = "ti,wb_tps53667", .data = (void *)tps53667}, + {.compatible = "ti,wb_tps53679", .data = (void *)tps53679}, + {.compatible = "ti,wb_tps53681", .data = (void *)tps53681}, + {.compatible = "ti,wb_tps53688", .data = (void *)tps53688}, + {.compatible = "ti,wb_tps53622", .data = (void *)tps53622}, + {} +}; +MODULE_DEVICE_TABLE(of, tps53679_of_match); + +static struct i2c_driver tps53679_driver = { + .driver = { + .name = "wb_tps53622", + .of_match_table = of_match_ptr(tps53679_of_match), + }, + .probe_new = tps53679_probe, + .remove = wb_pmbus_do_remove, + .id_table = tps53679_id, +}; + +module_i2c_driver(tps53679_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus driver for Texas Instruments TPS53679"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c new file mode 100644 index 000000000000..9b967f141a86 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c @@ -0,0 +1,675 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for UCD90xxx Sequencer and System Health + * Controller series + * + * Copyright (C) 2011 Ericsson AB. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +enum chips { ucd9000, ucd90120, ucd90124, ucd90160, ucd90320, ucd9090, + ucd90910 }; + +#define UCD9000_MONITOR_CONFIG 0xd5 +#define UCD9000_NUM_PAGES 0xd6 +#define UCD9000_FAN_CONFIG_INDEX 0xe7 +#define UCD9000_FAN_CONFIG 0xe8 +#define UCD9000_MFR_STATUS 0xf3 +#define UCD9000_GPIO_SELECT 0xfa +#define UCD9000_GPIO_CONFIG 0xfb +#define UCD9000_DEVICE_ID 0xfd + +/* GPIO CONFIG bits */ +#define UCD9000_GPIO_CONFIG_ENABLE BIT(0) +#define UCD9000_GPIO_CONFIG_OUT_ENABLE BIT(1) +#define UCD9000_GPIO_CONFIG_OUT_VALUE BIT(2) +#define UCD9000_GPIO_CONFIG_STATUS BIT(3) +#define UCD9000_GPIO_INPUT 0 +#define UCD9000_GPIO_OUTPUT 1 + +#define UCD9000_MON_TYPE(x) (((x) >> 5) & 0x07) +#define UCD9000_MON_PAGE(x) ((x) & 0x1f) + +#define UCD9000_MON_VOLTAGE 1 +#define UCD9000_MON_TEMPERATURE 2 +#define UCD9000_MON_CURRENT 3 +#define UCD9000_MON_VOLTAGE_HW 4 + +#define UCD9000_NUM_FAN 4 + +#define UCD9000_GPIO_NAME_LEN 16 +#define UCD9090_NUM_GPIOS 23 +#define UCD901XX_NUM_GPIOS 26 +#define UCD90320_NUM_GPIOS 84 +#define UCD90910_NUM_GPIOS 26 + +#define UCD9000_DEBUGFS_NAME_LEN 24 +#define UCD9000_GPI_COUNT 8 +#define UCD90320_GPI_COUNT 32 + +#define UCD9000_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define UCD9000_RETRY_TIME (3) +#define WB_DEV_NAME_MAX_LEN (64) + +static int g_wb_ucd9000_debug = 0; +static int g_wb_ucd9000_error = 0; + +module_param(g_wb_ucd9000_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_ucd9000_error, int, S_IRUGO | S_IWUSR); + +#define WB_UDC9000_VERBOSE(fmt, args...) do { \ + if (g_wb_ucd9000_debug) { \ + printk(KERN_INFO "[WB_UCD9000][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_UDC9000_ERROR(fmt, args...) do { \ + if (g_wb_ucd9000_error) { \ + printk(KERN_ERR "[WB_UCD9000][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct ucd9000_data { + u8 fan_data[UCD9000_NUM_FAN][I2C_SMBUS_BLOCK_MAX]; + struct pmbus_driver_info info; +#ifdef CONFIG_GPIOLIB + struct gpio_chip gpio; +#endif + struct dentry *debugfs; +}; +#define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info) + +struct ucd9000_debugfs_entry { + struct i2c_client *client; + u8 index; +}; + +static int wb_i2c_smbus_read_block_data(const struct i2c_client *client, u8 command, u8 *values) +{ + int rv, i; + + for(i = 0; i < UCD9000_RETRY_TIME; i++) { + rv = i2c_smbus_read_block_data(client, command, values); + if(rv >= 0){ + return rv; + } + usleep_range(UCD9000_RETRY_SLEEP_TIME, UCD9000_RETRY_SLEEP_TIME + 1); + } + WB_UDC9000_ERROR("read_block_data failed. nr:%d, addr:0x%x, reg:0x%x, rv:%d.", + client->adapter->nr, client->addr, command, rv); + return rv; +} + +static int ucd9000_get_fan_config(struct i2c_client *client, int fan) +{ + int fan_config = 0; + struct ucd9000_data *data + = to_ucd9000_data(wb_pmbus_get_driver_info(client)); + + if (data->fan_data[fan][3] & 1) + fan_config |= PB_FAN_2_INSTALLED; /* Use lower bit position */ + + /* Pulses/revolution */ + fan_config |= (data->fan_data[fan][3] & 0x06) >> 1; + + return fan_config; +} + +static int ucd9000_read_byte_data(struct i2c_client *client, int page, int reg) +{ + int ret = 0; + int fan_config; + + switch (reg) { + case PMBUS_FAN_CONFIG_12: + if (page > 0) + return -ENXIO; + + ret = ucd9000_get_fan_config(client, 0); + if (ret < 0) + return ret; + fan_config = ret << 4; + ret = ucd9000_get_fan_config(client, 1); + if (ret < 0) + return ret; + fan_config |= ret; + ret = fan_config; + break; + case PMBUS_FAN_CONFIG_34: + if (page > 0) + return -ENXIO; + + ret = ucd9000_get_fan_config(client, 2); + if (ret < 0) + return ret; + fan_config = ret << 4; + ret = ucd9000_get_fan_config(client, 3); + if (ret < 0) + return ret; + fan_config |= ret; + ret = fan_config; + break; + default: + ret = -ENODATA; + break; + } + return ret; +} + +static const struct i2c_device_id ucd9000_id[] = { + {"wb_ucd9000", ucd9000}, + {"wb_ucd90120", ucd90120}, + {"wb_ucd90124", ucd90124}, + {"wb_ucd90160", ucd90160}, + {"wb_ucd90320", ucd90320}, + {"wb_ucd9090", ucd9090}, + {"wb_ucd90910", ucd90910}, + {} +}; +MODULE_DEVICE_TABLE(i2c, ucd9000_id); + +static const struct of_device_id __maybe_unused ucd9000_of_match[] = { + { + .compatible = "ti,wb_ucd9000", + .data = (void *)ucd9000 + }, + { + .compatible = "ti,wb_ucd90120", + .data = (void *)ucd90120 + }, + { + .compatible = "ti,wb_ucd90124", + .data = (void *)ucd90124 + }, + { + .compatible = "ti,wb_ucd90160", + .data = (void *)ucd90160 + }, + { + .compatible = "ti,wb_ucd90320", + .data = (void *)ucd90320 + }, + { + .compatible = "ti,wb_ucd9090", + .data = (void *)ucd9090 + }, + { + .compatible = "ti,wb_ucd90910", + .data = (void *)ucd90910 + }, + { }, +}; +MODULE_DEVICE_TABLE(of, ucd9000_of_match); + +#ifdef CONFIG_GPIOLIB +static int ucd9000_gpio_read_config(struct i2c_client *client, + unsigned int offset) +{ + int ret; + + /* No page set required */ + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_SELECT, offset); + if (ret < 0) + return ret; + + return i2c_smbus_read_byte_data(client, UCD9000_GPIO_CONFIG); +} + +static int ucd9000_gpio_get(struct gpio_chip *gc, unsigned int offset) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) + return ret; + + return !!(ret & UCD9000_GPIO_CONFIG_STATUS); +} + +static void ucd9000_gpio_set(struct gpio_chip *gc, unsigned int offset, + int value) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) { + dev_dbg(&client->dev, "failed to read GPIO %d config: %d\n", + offset, ret); + return; + } + + if (value) { + if (ret & UCD9000_GPIO_CONFIG_STATUS) + return; + + ret |= UCD9000_GPIO_CONFIG_STATUS; + } else { + if (!(ret & UCD9000_GPIO_CONFIG_STATUS)) + return; + + ret &= ~UCD9000_GPIO_CONFIG_STATUS; + } + + ret |= UCD9000_GPIO_CONFIG_ENABLE; + + /* Page set not required */ + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret); + if (ret < 0) { + dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n", + offset, ret); + return; + } + + ret &= ~UCD9000_GPIO_CONFIG_ENABLE; + + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret); + if (ret < 0) + dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n", + offset, ret); +} + +static int ucd9000_gpio_get_direction(struct gpio_chip *gc, + unsigned int offset) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) + return ret; + + return !(ret & UCD9000_GPIO_CONFIG_OUT_ENABLE); +} + +static int ucd9000_gpio_set_direction(struct gpio_chip *gc, + unsigned int offset, bool direction_out, + int requested_out) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret, config, out_val; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) + return ret; + + if (direction_out) { + out_val = requested_out ? UCD9000_GPIO_CONFIG_OUT_VALUE : 0; + + if (ret & UCD9000_GPIO_CONFIG_OUT_ENABLE) { + if ((ret & UCD9000_GPIO_CONFIG_OUT_VALUE) == out_val) + return 0; + } else { + ret |= UCD9000_GPIO_CONFIG_OUT_ENABLE; + } + + if (out_val) + ret |= UCD9000_GPIO_CONFIG_OUT_VALUE; + else + ret &= ~UCD9000_GPIO_CONFIG_OUT_VALUE; + + } else { + if (!(ret & UCD9000_GPIO_CONFIG_OUT_ENABLE)) + return 0; + + ret &= ~UCD9000_GPIO_CONFIG_OUT_ENABLE; + } + + ret |= UCD9000_GPIO_CONFIG_ENABLE; + config = ret; + + /* Page set not required */ + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, config); + if (ret < 0) + return ret; + + config &= ~UCD9000_GPIO_CONFIG_ENABLE; + + return i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, config); +} + +static int ucd9000_gpio_direction_input(struct gpio_chip *gc, + unsigned int offset) +{ + return ucd9000_gpio_set_direction(gc, offset, UCD9000_GPIO_INPUT, 0); +} + +static int ucd9000_gpio_direction_output(struct gpio_chip *gc, + unsigned int offset, int val) +{ + return ucd9000_gpio_set_direction(gc, offset, UCD9000_GPIO_OUTPUT, + val); +} + +static void ucd9000_probe_gpio(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ + int rc; + + switch (mid->driver_data) { + case ucd9090: + data->gpio.ngpio = UCD9090_NUM_GPIOS; + break; + case ucd90120: + case ucd90124: + case ucd90160: + data->gpio.ngpio = UCD901XX_NUM_GPIOS; + break; + case ucd90320: + data->gpio.ngpio = UCD90320_NUM_GPIOS; + break; + case ucd90910: + data->gpio.ngpio = UCD90910_NUM_GPIOS; + break; + default: + return; /* GPIO support is optional. */ + } + + /* + * Pinmux support has not been added to the new gpio_chip. + * This support should be added when possible given the mux + * behavior of these IO devices. + */ + data->gpio.label = client->name; + data->gpio.get_direction = ucd9000_gpio_get_direction; + data->gpio.direction_input = ucd9000_gpio_direction_input; + data->gpio.direction_output = ucd9000_gpio_direction_output; + data->gpio.get = ucd9000_gpio_get; + data->gpio.set = ucd9000_gpio_set; + data->gpio.can_sleep = true; + data->gpio.base = -1; + data->gpio.parent = &client->dev; + + rc = devm_gpiochip_add_data(&client->dev, &data->gpio, client); + if (rc) + dev_warn(&client->dev, "Could not add gpiochip: %d\n", rc); +} +#else +static void ucd9000_probe_gpio(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ +} +#endif /* CONFIG_GPIOLIB */ + +#ifdef CONFIG_DEBUG_FS +static int ucd9000_get_mfr_status(struct i2c_client *client, u8 *buffer) +{ + int ret = wb_pmbus_set_page(client, 0, 0xff); + + if (ret < 0) + return ret; + + return wb_i2c_smbus_read_block_data(client, UCD9000_MFR_STATUS, buffer); +} + +static int ucd9000_debugfs_show_mfr_status_bit(void *data, u64 *val) +{ + struct ucd9000_debugfs_entry *entry = data; + struct i2c_client *client = entry->client; + u8 buffer[I2C_SMBUS_BLOCK_MAX]; + int ret, i; + + ret = ucd9000_get_mfr_status(client, buffer); + if (ret < 0) + return ret; + + /* + * GPI fault bits are in sets of 8, two bytes from end of response. + */ + i = ret - 3 - entry->index / 8; + if (i >= 0) + *val = !!(buffer[i] & BIT(entry->index % 8)); + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(ucd9000_debugfs_mfr_status_bit, + ucd9000_debugfs_show_mfr_status_bit, NULL, "%1lld\n"); + +static ssize_t ucd9000_debugfs_read_mfr_status(struct file *file, + char __user *buf, size_t count, + loff_t *ppos) +{ + struct i2c_client *client = file->private_data; + u8 buffer[I2C_SMBUS_BLOCK_MAX]; + char str[(I2C_SMBUS_BLOCK_MAX * 2) + 2]; + char *res; + int rc; + + rc = ucd9000_get_mfr_status(client, buffer); + if (rc < 0) + return rc; + + res = bin2hex(str, buffer, min(rc, I2C_SMBUS_BLOCK_MAX)); + *res++ = '\n'; + *res = 0; + + return simple_read_from_buffer(buf, count, ppos, str, res - str); +} + +static const struct file_operations ucd9000_debugfs_show_mfr_status_fops = { + .llseek = noop_llseek, + .read = ucd9000_debugfs_read_mfr_status, + .open = simple_open, +}; + +static int ucd9000_init_debugfs(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ + struct dentry *debugfs; + struct ucd9000_debugfs_entry *entries; + int i, gpi_count; + char name[UCD9000_DEBUGFS_NAME_LEN]; + + debugfs = wb_pmbus_get_debugfs_dir(client); + if (!debugfs) + return -ENOENT; + + data->debugfs = debugfs_create_dir(client->name, debugfs); + if (!data->debugfs) + return -ENOENT; + + /* + * Of the chips this driver supports, only the UCD9090, UCD90160, + * UCD90320, and UCD90910 report GPI faults in their MFR_STATUS + * register, so only create the GPI fault debugfs attributes for those + * chips. + */ + if (mid->driver_data == ucd9090 || mid->driver_data == ucd90160 || + mid->driver_data == ucd90320 || mid->driver_data == ucd90910) { + gpi_count = mid->driver_data == ucd90320 ? UCD90320_GPI_COUNT + : UCD9000_GPI_COUNT; + entries = devm_kcalloc(&client->dev, + gpi_count, sizeof(*entries), + GFP_KERNEL); + if (!entries) + return -ENOMEM; + + for (i = 0; i < gpi_count; i++) { + entries[i].client = client; + entries[i].index = i; + scnprintf(name, UCD9000_DEBUGFS_NAME_LEN, + "gpi%d_alarm", i + 1); + debugfs_create_file(name, 0444, data->debugfs, + &entries[i], + &ucd9000_debugfs_mfr_status_bit); + } + } + + scnprintf(name, UCD9000_DEBUGFS_NAME_LEN, "mfr_status"); + debugfs_create_file(name, 0444, data->debugfs, client, + &ucd9000_debugfs_show_mfr_status_fops); + + return 0; +} +#else +static int ucd9000_init_debugfs(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ + return 0; +} +#endif /* CONFIG_DEBUG_FS */ + +static int ucd9000_probe(struct i2c_client *client) +{ + u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1]; + char wb_device_name[WB_DEV_NAME_MAX_LEN]; + struct ucd9000_data *data; + struct pmbus_driver_info *info; + const struct i2c_device_id *mid; + enum chips chip; + int i, ret; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_BLOCK_DATA)) + return -ENODEV; + + ret = wb_i2c_smbus_read_block_data(client, UCD9000_DEVICE_ID, + block_buffer); + if (ret < 0) { + dev_err(&client->dev, "Failed to read device ID\n"); + return ret; + } + block_buffer[ret] = '\0'; + dev_info(&client->dev, "Device ID %s\n", block_buffer); + + mem_clear(wb_device_name, sizeof(wb_device_name)); + snprintf(wb_device_name, sizeof(wb_device_name), "wb_%s", block_buffer); + + for (mid = ucd9000_id; mid->name[0]; mid++) { + if (!strncasecmp(mid->name, wb_device_name, strlen(mid->name))) + break; + } + if (!mid->name[0]) { + dev_err(&client->dev, "Unsupported device\n"); + return -ENODEV; + } + + if (client->dev.of_node) + chip = (enum chips)of_device_get_match_data(&client->dev); + else + chip = mid->driver_data; + + if (chip != ucd9000 && strcmp(client->name, mid->name) != 0) + dev_notice(&client->dev, + "Device mismatch: Configured %s, detected %s\n", + client->name, mid->name); + + data = devm_kzalloc(&client->dev, sizeof(struct ucd9000_data), + GFP_KERNEL); + if (!data) + return -ENOMEM; + info = &data->info; + + ret = i2c_smbus_read_byte_data(client, UCD9000_NUM_PAGES); + if (ret < 0) { + dev_err(&client->dev, + "Failed to read number of active pages\n"); + return ret; + } + info->pages = ret; + if (!info->pages) { + dev_err(&client->dev, "No pages configured\n"); + return -ENODEV; + } + + /* The internal temperature sensor is always active */ + info->func[0] = PMBUS_HAVE_TEMP; + + /* Everything else is configurable */ + ret = wb_i2c_smbus_read_block_data(client, UCD9000_MONITOR_CONFIG, + block_buffer); + if (ret <= 0) { + dev_err(&client->dev, "Failed to read configuration data\n"); + return -ENODEV; + } + for (i = 0; i < ret; i++) { + int page = UCD9000_MON_PAGE(block_buffer[i]); + + if (page >= info->pages) + continue; + + switch (UCD9000_MON_TYPE(block_buffer[i])) { + case UCD9000_MON_VOLTAGE: + case UCD9000_MON_VOLTAGE_HW: + info->func[page] |= PMBUS_HAVE_VOUT + | PMBUS_HAVE_STATUS_VOUT; + break; + case UCD9000_MON_TEMPERATURE: + info->func[page] |= PMBUS_HAVE_TEMP2 + | PMBUS_HAVE_STATUS_TEMP; + break; + case UCD9000_MON_CURRENT: + info->func[page] |= PMBUS_HAVE_IOUT + | PMBUS_HAVE_STATUS_IOUT; + break; + default: + break; + } + } + + /* Fan configuration */ + if (mid->driver_data == ucd90124) { + for (i = 0; i < UCD9000_NUM_FAN; i++) { + i2c_smbus_write_byte_data(client, + UCD9000_FAN_CONFIG_INDEX, i); + ret = wb_i2c_smbus_read_block_data(client, + UCD9000_FAN_CONFIG, + data->fan_data[i]); + if (ret < 0) + return ret; + } + i2c_smbus_write_byte_data(client, UCD9000_FAN_CONFIG_INDEX, 0); + + info->read_byte_data = ucd9000_read_byte_data; + info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12 + | PMBUS_HAVE_FAN34 | PMBUS_HAVE_STATUS_FAN34; + } + + ucd9000_probe_gpio(client, mid, data); + + ret = wb_pmbus_do_probe(client, info); + if (ret) + return ret; + + ret = ucd9000_init_debugfs(client, mid, data); + if (ret) + dev_warn(&client->dev, "Failed to register debugfs: %d\n", + ret); + + return 0; +} + +/* This is the driver that will be inserted */ +static struct i2c_driver ucd9000_driver = { + .driver = { + .name = "wb_ucd9000", + .of_match_table = of_match_ptr(ucd9000_of_match), + }, + .probe_new = ucd9000_probe, + .remove = wb_pmbus_do_remove, + .id_table = ucd9000_id, +}; + +module_i2c_driver(ucd9000_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus driver for TI UCD90xxx"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c deleted file mode 100755 index e15bed475d2f..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c +++ /dev/null @@ -1,843 +0,0 @@ -/* - * i2c-ocores.c: I2C bus driver for OpenCores I2C controller - * (http://www.opencores.org/projects.cgi/web/i2c/overview). - * - * Peter Korsgaard - * - * Support for the GRLIB port of the controller by - * Andreas Larsson - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lpc_cpld_i2c_ocores.h" -#include -#include -#include -#include - -#define OCORES_FLAG_POLL BIT(0) - -struct ocores_i2c { - void __iomem *base; - u32 reg_shift; - u32 reg_io_width; - unsigned long flags; - wait_queue_head_t wait; - struct i2c_adapter adap; - struct i2c_msg *msg; - int pos; - int nmsgs; - int state; /* see STATE_ */ - spinlock_t process_lock; - int clock_khz; - void (*setreg)(struct ocores_i2c *i2c, int reg, u8 value); - u8 (*getreg)(struct ocores_i2c *i2c, int reg); -}; - -/* registers */ -#define OCI2C_PRELOW 0x0 -#define OCI2C_PREHIGH 0x1 -#define OCI2C_CONTROL 0x2 -#define OCI2C_DATA 0x3 -#define OCI2C_CMD 0x4 /* write only */ -#define OCI2C_STATUS 0x4 /* read only, same address as OCI2C_CMD */ - -#define OCI2C_TRAN_REV 0x14 -#define OCI2C_CMD_REV 0x18 - - -#define OCI2C_CTRL_IEN 0x40 -#define OCI2C_CTRL_EN 0x80 - -#define OCI2C_CMD_START 0x91 -#define OCI2C_CMD_STOP 0x41 -#define OCI2C_CMD_READ 0x21 -#define OCI2C_CMD_WRITE 0x11 -#define OCI2C_CMD_READ_ACK 0x21 -#define OCI2C_CMD_READ_NACK 0x29 -#define OCI2C_CMD_IACK 0x01 - -#define OCI2C_STAT_IF 0x01 -#define OCI2C_STAT_TIP 0x02 -#define OCI2C_STAT_ARBLOST 0x20 -#define OCI2C_STAT_BUSY 0x40 -#define OCI2C_STAT_NACK 0x80 - -#define STATE_DONE 0 -#define STATE_START 1 -#define STATE_WRITE 2 -#define STATE_READ 3 -#define STATE_ERROR 4 - -#define TYPE_OCORES 0 -#define TYPE_GRLIB 1 -#define OCI2C_WAIT_SLEEP 40 - -int g_lpc_cpld_i2c_debug = 0; -int g_lpc_cpld_i2c_irq = 0; -int g_lpc_cpld_i2c_error = 0; - -module_param(g_lpc_cpld_i2c_debug, int, S_IRUGO | S_IWUSR); -module_param(g_lpc_cpld_i2c_error, int, S_IRUGO | S_IWUSR); -module_param(g_lpc_cpld_i2c_irq, int, S_IRUGO | S_IWUSR); - -int g_irq_dump_debug = 0; -module_param(g_irq_dump_debug, int, S_IRUGO | S_IWUSR); -#define LPC_CPLD_I2C_DEBUG_DUMP(fmt, args...) do { \ - if (g_irq_dump_debug) { \ - printk(KERN_ERR ""fmt, ## args); \ - } \ -} while (0) -int g_irq_invalid_cnt = 0; -module_param(g_irq_invalid_cnt, int, S_IRUGO | S_IWUSR); -#define LPC_CPLD_I2C_DEBUG_XFER(fmt, args...) do { \ - if (g_lpc_cpld_i2c_irq) { \ - printk(KERN_ERR "[LPC_CPLD_I2C_OCORES][XFER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_CPLD_I2C_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_lpc_cpld_i2c_debug) { \ - printk(KERN_ERR "[LPC_CPLD_I2C_OCORES][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_CPLD_I2C_DEBUG_ERROR(fmt, args...) do { \ - if (g_lpc_cpld_i2c_error) { \ - printk(KERN_ERR "[LPC_CPLD_I2C_OCORES][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -static int g_lpc_cpld_i2c_irq_flag = 1; - -module_param(g_lpc_cpld_i2c_irq_flag, int, S_IRUGO | S_IWUSR); - -static void oc_debug_dump_reg(struct ocores_i2c *i2c); -static void oc_setreg_8(struct ocores_i2c *i2c, int reg, u8 value) -{ - u64 base = (u64)i2c->base; - - outb(value, (u16)base + reg); -} - -static inline u8 oc_getreg_8(struct ocores_i2c *i2c, int reg) -{ - u64 base = (u64)i2c->base; - - return inb((u16)base + reg); -} - -static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value) -{ - i2c->setreg(i2c, reg, value); -} - -static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg) -{ - u8 status; - - status = i2c->getreg(i2c, reg); - return status; -} - -#define LPC_CPLD_I2C_SPIN_LOCK(lock, flags) spin_lock_irqsave(&(lock), (flags)) -#define LPC_CPLD_I2C_SPIN_UNLOCK(lock, flags) spin_unlock_irqrestore(&(lock), (flags)) - -static void ocores_process(struct ocores_i2c *i2c, u8 stat) -{ - struct i2c_msg *msg = i2c->msg; - - LPC_CPLD_I2C_DEBUG_XFER("Enter nr %d.\n", i2c->adap.nr); - - /* - * If we spin here is because we are in timeout, so we are going - * to be in STATE_ERROR. See ocores_process_timeout() - */ - if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) { - /* stop has been sent */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - wake_up(&i2c->wait); - LPC_CPLD_I2C_DEBUG_XFER("stop has been sent, exit.\n"); - goto out; - } - - /* error */ - if (stat & OCI2C_STAT_ARBLOST) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - LPC_CPLD_I2C_DEBUG_XFER("error, exit.\n"); - goto out; - } - - if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { - i2c->state = - (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; - - if (stat & OCI2C_STAT_NACK) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - LPC_CPLD_I2C_DEBUG_XFER("OCI2C_STAT_NACK, exit.\n"); - goto out; - } - } else - msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA); - - /* end of msg */ - if (i2c->pos == msg->len) { - LPC_CPLD_I2C_DEBUG_XFER("Enter end of msg.\n"); - i2c->nmsgs--; - i2c->msg++; - i2c->pos = 0; - msg = i2c->msg; - - if (i2c->nmsgs) { /* end? */ - /* send start */ - if (!(msg->flags & I2C_M_NOSTART)) { - u8 addr = (msg->addr << 1); - - if (msg->flags & I2C_M_RD) - addr |= 1; - - i2c->state = STATE_START; - - oc_setreg(i2c, OCI2C_DATA, addr); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - LPC_CPLD_I2C_DEBUG_XFER("send start, exit.\n"); - goto out; - } - - i2c->state = (msg->flags & I2C_M_RD) - ? STATE_READ : STATE_WRITE; - } else { - i2c->state = STATE_DONE; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - LPC_CPLD_I2C_DEBUG_XFER("send OCI2C_CMD_STOP, exit.\n"); - goto out; - } - } - - if (i2c->state == STATE_READ) { - oc_setreg(i2c, OCI2C_CMD, i2c->pos == (msg->len-1) ? - OCI2C_CMD_READ_NACK : OCI2C_CMD_READ_ACK); - } else { - oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE); - } - -out: - LPC_CPLD_I2C_DEBUG_XFER("normal, exit nr %d.\n", i2c->adap.nr); -} - -static irqreturn_t ocores_isr(int irq, void *dev_id) -{ - struct ocores_i2c *i2c = dev_id; - unsigned long flags; - u8 stat; - if (!i2c) { - return IRQ_NONE; - } - - LPC_CPLD_I2C_SPIN_LOCK(i2c->process_lock, flags); - stat = oc_getreg(i2c, OCI2C_STATUS); - - if (!(stat & OCI2C_STAT_IF)) { - g_irq_invalid_cnt++; - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - return IRQ_NONE; - } - - LPC_CPLD_I2C_DEBUG_XFER("Enter, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, i2c->msg->addr); - ocores_process(i2c, stat); - LPC_CPLD_I2C_DEBUG_XFER("Leave, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, i2c->msg->addr); - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - - return IRQ_HANDLED; -} - -/** - * Process timeout event - * @i2c: ocores I2C device instance - */ -static void ocores_process_timeout(struct ocores_i2c *i2c) -{ - unsigned long flags; - - LPC_CPLD_I2C_SPIN_LOCK(i2c->process_lock, flags); - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - mdelay(1); - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - -} - -/** - * Wait until something change in a given register - * @i2c: ocores I2C device instance - * @reg: register to query - * @mask: bitmask to apply on register value - * @val: expected result - * @timeout: timeout in jiffies - * - * Timeout is necessary to avoid to stay here forever when the chip - * does not answer correctly. - * - * Return: 0 on success, -ETIMEDOUT on timeout - */ -static int ocores_wait(struct ocores_i2c *i2c, - int reg, u8 mask, u8 val, - const unsigned long timeout) -{ - u8 status; - unsigned long j, jiffies_tmp; - unsigned int usleep; - usleep = OCI2C_WAIT_SLEEP; - j = jiffies + timeout; - while (1) { - jiffies_tmp = jiffies; - status = oc_getreg(i2c, reg); - - if ((status & mask) == val) - break; - - if (time_after(jiffies_tmp, j)) { - LPC_CPLD_I2C_DEBUG_XFER("STATUS timeout, mask[0x%x] val[0x%x] status[0x%x]\n", mask, val, status); - return -ETIMEDOUT; - } - usleep_range(usleep,usleep + 1); - } - return 0; -} - -/** - * Wait until is possible to process some data - * @i2c: ocores I2C device instance - * - * Used when the device is in polling mode (interrupts disabled). - * - * Return: 0 on success, -ETIMEDOUT on timeout - */ -static int ocores_poll_wait(struct ocores_i2c *i2c) -{ - u8 mask; - int err; - - if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) { - /* transfer is over */ - mask = OCI2C_STAT_BUSY; - } else { - /* on going transfer */ - mask = OCI2C_STAT_TIP; - udelay((8 * 1000) / i2c->clock_khz); - } - - /* - * once we are here we expect to get the expected result immediately - * so if after 1ms we timeout then something is broken. - */ - err = ocores_wait(i2c, OCI2C_STATUS, mask, 0, msecs_to_jiffies(100)); - if (err) { - LPC_CPLD_I2C_DEBUG_XFER("STATUS timeout, bit 0x%x did not clear in 1ms, err %d\n", mask, err); - } - - return err; -} - - -/** - * It handles an IRQ-less transfer - * @i2c: ocores I2C device instance - * - * Even if IRQ are disabled, the I2C OpenCore IP behavior is exactly the same - * (only that IRQ are not produced). This means that we can re-use entirely - * ocores_isr(), we just add our polling code around it. - * - * It can run in atomic context - */ -static int ocores_process_polling(struct ocores_i2c *i2c) -{ - irqreturn_t ret; - int err; - while (1) { - err = ocores_poll_wait(i2c); - if (err) { - i2c->state = STATE_ERROR; - break; /* timeout */ - } - - ret = ocores_isr(-1, i2c); - if (ret == IRQ_NONE) - break; /* all messages have been transfered */ - } - return err; -} - -static int ocores_xfer_core(struct ocores_i2c *i2c, - struct i2c_msg *msgs, int num, - bool polling) -{ - int ret; - unsigned long flags; - u8 ctrl; - - LPC_CPLD_I2C_DEBUG_XFER("Enter.polling %d\n", polling); - LPC_CPLD_I2C_SPIN_LOCK(i2c->process_lock, flags); - ctrl = oc_getreg(i2c, OCI2C_CONTROL); - if (polling) - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~OCI2C_CTRL_IEN); - else - oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN); - - i2c->msg = msgs; - i2c->pos = 0; - i2c->nmsgs = num; - i2c->state = STATE_START; - - oc_setreg(i2c, OCI2C_DATA, - (i2c->msg->addr << 1) | - ((i2c->msg->flags & I2C_M_RD) ? 1:0)); - - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - - if (polling) { - ret = ocores_process_polling(i2c); - if (ret) { /* timeout */ - ocores_process_timeout(i2c); - return -ETIMEDOUT; - } - } else { - ret = wait_event_timeout(i2c->wait, - (i2c->state == STATE_ERROR) || - (i2c->state == STATE_DONE), HZ); - if (ret == 0) { - ocores_process_timeout(i2c); - return -ETIMEDOUT; - } - } - - return (i2c->state == STATE_DONE) ? num : -EIO; -} - -static int ocores_xfer_polling(struct i2c_adapter *adap, - struct i2c_msg *msgs, int num) -{ - LPC_CPLD_I2C_DEBUG_XFER("Enter.\n"); - return ocores_xfer_core(i2c_get_adapdata(adap), msgs, num, true); -} - -static int ocores_xfer(struct i2c_adapter *adap, - struct i2c_msg *msgs, int num) -{ - struct ocores_i2c *i2c = i2c_get_adapdata(adap); - - if (i2c->flags & OCORES_FLAG_POLL) - return ocores_xfer_polling(adap, msgs, num); - return ocores_xfer_core(i2c, msgs, num, false); -} - -static void ocores_init(struct ocores_i2c *i2c) -{ - int prescale; - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - LPC_CPLD_I2C_DEBUG_XFER("Enter.\n"); - spin_lock_init(&i2c->process_lock); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - prescale = (i2c->clock_khz / (5*100)) - 1; - oc_setreg(i2c, OCI2C_PRELOW, prescale & 0xff); - oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8); - LPC_CPLD_I2C_DEBUG_VERBOSE("i2c->base 0x%p, i2c->clock_khz %d, prescale 0x%x.\n", i2c->base, i2c->clock_khz, prescale); - - /* Init the device */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_EN); -} - - -static u32 ocores_func(struct i2c_adapter *adap) -{ - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; -} - -static const struct i2c_algorithm ocores_algorithm = { - .master_xfer = ocores_xfer, - .functionality = ocores_func, -}; - -static struct i2c_adapter ocores_adapter = { - .owner = THIS_MODULE, - .name = "rg-cpld-ocrore-i2c", - .class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED, - .algo = &ocores_algorithm, -}; - -static const struct of_device_id ocores_i2c_match[] = { - { - .compatible = "opencores,rg-cpld-ocrore-i2c", - .data = (void *)TYPE_OCORES, - }, - {}, -}; -MODULE_DEVICE_TABLE(of, ocores_i2c_match); - -#ifdef CONFIG_OF -/* Read and write functions for the GRLIB port of the controller. Registers are - * 32-bit big endian and the PRELOW and PREHIGH registers are merged into one - * register. The subsequent registers has their offset decreased accordingly. */ -static u8 oc_getreg_grlib(struct ocores_i2c *i2c, int reg) -{ - u32 rd; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - rd = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PREHIGH) - return (u8)(rd >> 8); - else - return (u8)rd; -} - -static void oc_setreg_grlib(struct ocores_i2c *i2c, int reg, u8 value) -{ - u32 curr, wr; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - if (reg == OCI2C_PRELOW || reg == OCI2C_PREHIGH) { - curr = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PRELOW) - wr = (curr & 0xff00) | value; - else - wr = (((u32)value) << 8) | (curr & 0xff); - } else { - wr = value; - } - iowrite32be(wr, i2c->base + (rreg << i2c->reg_shift)); -} - -static int ocores_i2c_of_probe(struct platform_device *pdev, - struct ocores_i2c *i2c) -{ - struct device_node *np = pdev->dev.of_node; - const struct of_device_id *match; - u32 val; - - LPC_CPLD_I2C_DEBUG_VERBOSE("Enter ocores_i2c_of_probe.\n"); - if (of_property_read_u32(np, "reg-shift", &i2c->reg_shift)) { - /* no 'reg-shift', check for deprecated 'regstep' */ - if (!of_property_read_u32(np, "regstep", &val)) { - if (!is_power_of_2(val)) { - dev_err(&pdev->dev, "invalid regstep %d\n", - val); - return -EINVAL; - } - i2c->reg_shift = ilog2(val); - dev_warn(&pdev->dev, - "regstep property deprecated, use reg-shift\n"); - } - } - - if (of_property_read_u32(np, "clock-frequency", &val)) { - dev_err(&pdev->dev, - "Missing required parameter 'clock-frequency'\n"); - return -ENODEV; - } - i2c->clock_khz = val / 1000; - - of_property_read_u32(pdev->dev.of_node, "reg-io-width", - &i2c->reg_io_width); - - match = of_match_node(ocores_i2c_match, pdev->dev.of_node); - if (match && (long)match->data == TYPE_GRLIB) { - dev_dbg(&pdev->dev, "GRLIB variant of i2c-ocores\n"); - i2c->setreg = oc_setreg_grlib; - i2c->getreg = oc_getreg_grlib; - } - - return 0; -} -#else -#define ocores_i2c_of_probe(pdev,i2c) -ENODEV -#endif - -static void oc_debug_dump_reg(struct ocores_i2c *i2c) -{ - if (i2c) { - LPC_CPLD_I2C_DEBUG_DUMP("base: %p.\n", i2c->base); - LPC_CPLD_I2C_DEBUG_DUMP("reg_shift: %d.\n", i2c->reg_shift); - LPC_CPLD_I2C_DEBUG_DUMP("reg_io_width: %d.\n", i2c->reg_io_width); - LPC_CPLD_I2C_DEBUG_DUMP("adap.nr: %d.\n", i2c->adap.nr); - LPC_CPLD_I2C_DEBUG_DUMP("msg: %p.\n", i2c->msg); - if (i2c->msg) { - LPC_CPLD_I2C_DEBUG_DUMP("msg->buf: %p.\n", i2c->msg->buf); - LPC_CPLD_I2C_DEBUG_DUMP("msg->addr: 0x%x.\n", i2c->msg->addr); - LPC_CPLD_I2C_DEBUG_DUMP("msg->flags: 0x%x.\n", i2c->msg->flags); - LPC_CPLD_I2C_DEBUG_DUMP("msg->len: %d.\n", i2c->msg->len); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("msg: %p is null.\n", i2c->msg); - } - - LPC_CPLD_I2C_DEBUG_DUMP("pos: %d.\n", i2c->pos); - LPC_CPLD_I2C_DEBUG_DUMP("nmsgs: %d.\n", i2c->nmsgs); - LPC_CPLD_I2C_DEBUG_DUMP("state: %d.\n", i2c->state); - LPC_CPLD_I2C_DEBUG_DUMP("clock_khz: %d.\n", i2c->clock_khz); - LPC_CPLD_I2C_DEBUG_DUMP("setreg: %p.\n", i2c->setreg); - LPC_CPLD_I2C_DEBUG_DUMP("getreg: %p.\n", i2c->getreg); - if (i2c->getreg) { - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_PRELOW: 0x%02x.\n", oc_getreg(i2c, OCI2C_PRELOW)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_PREHIGH: 0x%02x.\n", oc_getreg(i2c, OCI2C_PREHIGH)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_CONTROL: 0x%02x.\n", oc_getreg(i2c, OCI2C_CONTROL)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_DATA: 0x%02x.\n", oc_getreg(i2c, OCI2C_DATA)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_CMD: 0x%02x.\n", oc_getreg(i2c, OCI2C_CMD)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_STATUS: 0x%02x.\n", oc_getreg(i2c, OCI2C_STATUS)); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("getreg: %p is null.\n", i2c->getreg); - } - } else { - LPC_CPLD_I2C_DEBUG_DUMP("i2c %p is null.\n", i2c); - } -} - -void oc_debug_dump_reg_exception(void) -{ - int bus_beg, bus_end, bus; - struct i2c_adapter *adap; - struct ocores_i2c *adap_data; - - bus_beg = 1; - bus_end = 14; - for (bus = bus_beg; bus <= bus_end; bus++) { - adap = i2c_get_adapter(bus); - if (adap) { - adap_data = (struct ocores_i2c *)i2c_get_adapdata(adap); - if (adap_data) { - LPC_CPLD_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg begin.\n", bus); - oc_debug_dump_reg(adap_data); - LPC_CPLD_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg end.\n", bus); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("bus %d i2c_get_adapdata null.\n", bus); - } - i2c_put_adapter(adap); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("bus %d i2c_get_adapter null.\n", bus); - } - } -} - -static ssize_t show_oc_debug_value(struct device *dev, struct device_attribute *da, char *buf) -{ - oc_debug_dump_reg_exception(); - return 0; -} - -static SENSOR_DEVICE_ATTR(oc_debug, S_IRUGO | S_IWUSR, show_oc_debug_value, NULL, 0x15); - -static struct attribute *oc_debug_sysfs_attrs[] = { - &sensor_dev_attr_oc_debug.dev_attr.attr, - NULL -}; - -static const struct attribute_group oc_debug_sysfs_group = { - .attrs = oc_debug_sysfs_attrs, -}; - -static void oc_debug_sysfs_init(struct platform_device *pdev) -{ - int ret; - - ret = sysfs_create_group(&pdev->dev.kobj, &oc_debug_sysfs_group); - LPC_CPLD_I2C_DEBUG_VERBOSE("sysfs_create_group ret %d.\n", ret); - return; -} - -static void oc_debug_sysfs_exit(struct platform_device *pdev) -{ - sysfs_remove_group(&pdev->dev.kobj, (const struct attribute_group *)&oc_debug_sysfs_group); - LPC_CPLD_I2C_DEBUG_VERBOSE("sysfs_remove_group.\n"); - return; -} - -static int rg_ocores_i2c_probe(struct platform_device *pdev) -{ - struct ocores_i2c *i2c; - struct rg_ocores_cpld_i2c_platform_data *pdata; - struct resource *res; - int irq; - int ret; - int i; - - LPC_CPLD_I2C_DEBUG_VERBOSE("Enter.\n"); - - i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); - if (!i2c) { - LPC_CPLD_I2C_DEBUG_ERROR("devm_kzalloc failed.\n"); - return -ENOMEM; - } - res = platform_get_resource(pdev, IORESOURCE_IO, 0); - if (!res) { - LPC_CPLD_I2C_DEBUG_ERROR("can't fetch device resource info\n"); - return -ENOMEM; - } - - i2c->base = (void __iomem *)res->start; - LPC_CPLD_I2C_DEBUG_VERBOSE("i2c->base is %p., res->end[%d]\n", i2c->base, (int)res->end); - - pdata = dev_get_platdata(&pdev->dev); - if (pdata) { - i2c->reg_shift = pdata->reg_shift; - i2c->reg_io_width = pdata->reg_io_width; - i2c->clock_khz = pdata->clock_khz; - } else { - ret = ocores_i2c_of_probe(pdev, i2c); - if (ret) - return ret; - } - - LPC_CPLD_I2C_DEBUG_VERBOSE("data: shift[%d], width[%d], clock_khz[%d] i2c_irq_flag=%d\n", - pdata->reg_shift, pdata->reg_io_width, pdata->clock_khz, pdata->i2c_irq_flag); - - if (i2c->reg_io_width == 0) - i2c->reg_io_width = 1; /* Set to default value */ - - - if (!i2c->setreg || !i2c->getreg) { - switch (i2c->reg_io_width) { - case 1: - i2c->setreg = oc_setreg_8; - i2c->getreg = oc_getreg_8; - break; - default: - dev_err(&pdev->dev, "Unsupported I/O width (%d)\n", - i2c->reg_io_width); - return -EINVAL; - } - } - - init_waitqueue_head(&i2c->wait); - - irq = platform_get_irq(pdev, 0); - LPC_CPLD_I2C_DEBUG_VERBOSE("get irq %d, ENXIO[%d]", irq, ENXIO); - if (irq == -ENXIO) { - i2c->flags |= OCORES_FLAG_POLL; - } else if(g_lpc_cpld_i2c_irq_flag){ - ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0, - pdev->name, i2c); - if (ret) { - dev_err(&pdev->dev, "Cannot claim IRQ\n"); - } - - if(pdata->i2c_irq_flag) { - g_lpc_cpld_i2c_irq_flag = 0; - } - } - - ocores_init(i2c); - - /* hook up driver to tree */ - platform_set_drvdata(pdev, i2c); - i2c->adap = ocores_adapter; - i2c_set_adapdata(&i2c->adap, i2c); - i2c->adap.dev.parent = &pdev->dev; - i2c->adap.dev.of_node = pdev->dev.of_node; - - /* add i2c adapter to i2c tree */ - ret = i2c_add_adapter(&i2c->adap); - if (ret) { - dev_err(&pdev->dev, "Failed to add adapter\n"); - return ret; - } - - /* add in known devices to the bus */ - if (pdata) { - LPC_CPLD_I2C_DEBUG_VERBOSE("i2c device %d.\n", pdata->num_devices); - for (i = 0; i < pdata->num_devices; i++) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - i2c_new_client_device(&i2c->adap, pdata->devices + i); -#else - i2c_new_device(&i2c->adap, pdata->devices + i); -#endif - } - } - - oc_debug_sysfs_init(pdev); - return 0; -} - -static int rg_ocores_i2c_remove(struct platform_device *pdev) -{ - struct ocores_i2c *i2c = platform_get_drvdata(pdev); - - /* disable i2c logic */ - oc_setreg(i2c, OCI2C_CONTROL, oc_getreg(i2c, OCI2C_CONTROL) - & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - /* remove adapter & data */ - i2c_del_adapter(&i2c->adap); - oc_debug_sysfs_exit(pdev); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int ocores_i2c_suspend(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - return 0; -} - -static int ocores_i2c_resume(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - - ocores_init(i2c); - - return 0; -} - -static SIMPLE_DEV_PM_OPS(ocores_i2c_pm, ocores_i2c_suspend, ocores_i2c_resume); -#define OCORES_I2C_PM (&ocores_i2c_pm) -#else -#define OCORES_I2C_PM NULL -#endif - -static struct platform_driver ocores_i2c_driver = { - .probe = rg_ocores_i2c_probe, - .remove = rg_ocores_i2c_remove, - .driver = { - .owner = THIS_MODULE, - .name = "rg-cpld-ocrore-i2c", - .of_match_table = ocores_i2c_match, - .pm = OCORES_I2C_PM, - }, -}; - -module_platform_driver(ocores_i2c_driver); - -MODULE_AUTHOR("Peter Korsgaard "); -MODULE_DESCRIPTION("OpenCores I2C bus driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:ocores-i2c"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h deleted file mode 100755 index baf6a916b11a..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _LPC_CPLD_I2C_OCORES_H -#define _LPC_CPLD_I2C_OCORES_H - -struct rg_ocores_cpld_i2c_platform_data { - u32 reg_shift; /* register offset shift value */ - u32 reg_io_width; /* register io read/write width */ - u32 clock_khz; /* input clock in kHz */ - u8 num_devices; /* number of devices in the devices list */ - u8 i2c_irq_flag; - struct i2c_board_info const *devices; /* devices connected to the bus */ -}; - -#endif /* _LPC_CPLD_I2C_OCORES_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c deleted file mode 100755 index 9c43bcee5c4a..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c +++ /dev/null @@ -1,534 +0,0 @@ -#include -#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 19, 0) -#include -#endif - -#include -#include /* Wd're doing kernel work */ -#include /* specifically, a module */ -#include -#include /* Need for the macros */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lpc_dbg.h" - -typedef struct rg_lpc_device_s { - u16 base; - u16 size; - u8 type; - u8 id; - u8 lpc_pci_addr; -} rg_lpc_device_t; - -typedef enum rg_lpc_dev_type_s { - LPC_DEVICE_CPLD = 1, - LPC_DEVICE_FPGA = 2, -} rg_lpc_dev_type_t; - -#define MAX_LPC_DEV_NUM (4) -#define LPC_PCI_CFG_BASE(__lgir) ((0x84) + ((__lgir) * 4)) -#define MAX_CPLD_REG_SIZE (0x100) -#define MAX_FPGA_REG_SIZE (0x100) //# fix compile actual value 0x10000 -#define LPC_GET_CPLD_ID(addr) ((addr >> 16) & 0xff) -#define LPC_GET_CPLD_OFFSET(addr) ((addr) & 0xff) - -int lpc_dbg_verbose = 0; -int lpc_dbg_error = 0; -int lpc_dbg_info = 0; -module_param(lpc_dbg_verbose, int, S_IRUGO | S_IWUSR); -module_param(lpc_dbg_error, int, S_IRUGO | S_IWUSR); -module_param(lpc_dbg_info, int, S_IRUGO | S_IWUSR); - - -#define LPC_DBG_VERBOSE(fmt, args...) do { \ - if (lpc_dbg_verbose) { \ - printk(KERN_ERR "[LPC_DBG][VERBOSE][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_DBG_ERROR(fmt, args...) do { \ - if (lpc_dbg_error) { \ - printk(KERN_ERR "[LPC_DBG][ERROR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_DBG_INFO(fmt, args...) do { \ - if (lpc_dbg_info) { \ - printk(KERN_ERR ""fmt, ## args); \ - } \ -} while (0) - -static rg_lpc_device_t g_rg_lpc_dev_default[] = { - {.base = 0x700, .size = MAX_CPLD_REG_SIZE, .type = LPC_DEVICE_CPLD, .id = 0, .lpc_pci_addr = 0x84}, - {.base = 0x900, .size = MAX_CPLD_REG_SIZE, .type = LPC_DEVICE_CPLD, .id = 1, .lpc_pci_addr = 0x88}, - {.base = 0xb00, .size = MAX_CPLD_REG_SIZE, .type = LPC_DEVICE_CPLD, .id = 2, .lpc_pci_addr = 0x90}, -}; - -static rg_lpc_device_t *g_rg_lpc_dev = g_rg_lpc_dev_default; - -static rg_lpc_device_t* lpc_get_device_info(int type, int id) -{ - int i; - int size; - - size = ARRAY_SIZE(g_rg_lpc_dev_default); - for (i = 0; i < size; i++) { - if ((g_rg_lpc_dev[i].type == type) && (g_rg_lpc_dev[i].id == id)) { - return &g_rg_lpc_dev[i]; - } - } - - return NULL; -} - - -int lpc_cpld_read(int address, u8 *val) -{ - int cpld_id; - rg_lpc_device_t *info; - - cpld_id = LPC_GET_CPLD_ID(address); - info = lpc_get_device_info(LPC_DEVICE_CPLD, cpld_id); - if (info == NULL) { - LPC_DBG_ERROR("lpc_get_device_info addr 0x%x id %d failed.\r\n", address, cpld_id); - return -1; - } - - *val = inb(info->base + LPC_GET_CPLD_OFFSET(address)); - LPC_DBG_VERBOSE("Leave info->base 0x%x, addr 0x%x, cpld_id %d, val 0x%x.\r\n", info->base, address, cpld_id, *val); - return 0; -} - -int lpc_cpld_write(int address, u8 reg_val) -{ - int cpld_id; - rg_lpc_device_t *info; - - cpld_id = LPC_GET_CPLD_ID(address); - info = lpc_get_device_info(LPC_DEVICE_CPLD, cpld_id); - if (info == NULL) { - LPC_DBG_ERROR("lpc_get_device_info addr 0x%x id %d failed.\r\n", address, cpld_id); - return -1; - } - - outb(reg_val, info->base + LPC_GET_CPLD_OFFSET(address)); - LPC_DBG_VERBOSE("Leave info->base 0x%x, addr 0x%x, cpld_id %d, val 0x%x.\r\n", info->base, address, cpld_id, reg_val); - return 0; -} - -int lpc_fpga_read(int address, u8 *val) -{ - return -1; -} - -int lpc_fpga_write(int address, u8 reg_val) -{ - return -1; -} - -static ssize_t lpc_misc_cpld_dev_read (struct file *file, char __user *buf, size_t count, - loff_t *offset) -{ - int ret; - u8 value8[MAX_CPLD_REG_SIZE]; - int i; - - if ((count > MAX_CPLD_REG_SIZE) - || ((LPC_GET_CPLD_OFFSET(file->f_pos) + count) > MAX_CPLD_REG_SIZE)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_cpld_read((int)(file->f_pos + i), &value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_cpld_read i %d addr 0x%x failed ret %d.\n", - i, ((unsigned int)file->f_pos + i), ret); - return i; - } - } - - if (copy_to_user(buf, value8, count)) { - return -EFAULT; - } - - return count; -} - - -static ssize_t lpc_misc_cpld_dev_write (struct file *file, const char __user *buf, size_t count, - loff_t *offset) -{ - u8 value8[MAX_CPLD_REG_SIZE]; - int i; - int ret; - - if ((count > MAX_CPLD_REG_SIZE) - || ((LPC_GET_CPLD_OFFSET(file->f_pos) + count) > MAX_CPLD_REG_SIZE)) { - return -EFAULT; - } - - if (copy_from_user(value8, buf, count)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_cpld_write((int)(file->f_pos + i), value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_cpld_write i %d addr 0x%x value 0x%x failed ret %d.\n", - i, (unsigned int)file->f_pos + i, value8[i], ret); - return i; - } - } - - return count; -} - - -static loff_t lpc_misc_cpld_dev_llseek(struct file *file, loff_t offset, int origin) -{ - loff_t ret; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_lock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_lock(file_inode(file)); -#endif - - switch (origin) { - case 0: - file->f_pos = offset; - ret = file->f_pos; - break; - case 1: - file->f_pos += offset; - ret = file->f_pos; - break; - default: - ret = -EINVAL; - } - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_unlock(file_inode(file)); -#endif - - - return ret; -} - - -static long lpc_misc_cpld_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - return -1; -} - -static int lpc_misc_cpld_dev_open(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; - -} - -static int lpc_misc_cpld_dev_release(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; -} - -static const struct file_operations lpc_misc_cpld_dev_fops = { - .owner = THIS_MODULE, - .llseek = lpc_misc_cpld_dev_llseek, - .read = lpc_misc_cpld_dev_read, - .write = lpc_misc_cpld_dev_write, - .unlocked_ioctl = lpc_misc_cpld_dev_ioctl, - .open = lpc_misc_cpld_dev_open, - .release = lpc_misc_cpld_dev_release, -}; - -static ssize_t lpc_misc_fpga_dev_read (struct file *file, char __user *buf, size_t count, - loff_t *offset) -{ - int ret; - u8 value8[MAX_FPGA_REG_SIZE]; - int i; - - if ((count > MAX_FPGA_REG_SIZE) || ((file->f_pos + count) > MAX_FPGA_REG_SIZE)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_fpga_read((int)(file->f_pos + i), &value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_fpga_read i %d addr 0x%x failed ret %d.\n", - i, ((unsigned int)file->f_pos + i), ret); - return i; - } - - } - - if (copy_to_user(buf, value8, count)) { - return -EFAULT; - } - - return count; -} - - -static ssize_t lpc_misc_fpga_dev_write (struct file *file, const char __user *buf, size_t count, - loff_t *offset) -{ - int ret; - u8 value8[MAX_FPGA_REG_SIZE]; - int i; - - if ((count > MAX_FPGA_REG_SIZE) || ((file->f_pos + count) > MAX_FPGA_REG_SIZE)) { - return -EFAULT; - } - - if (copy_from_user(value8, buf, count)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_fpga_write((int)(file->f_pos + i), value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_fpga_write i %d addr 0x%x value 0x%x failed ret %d.\n", - i, (int)(file->f_pos + i), value8[i], ret); - return i; - } - } - - return count; -} - - -static loff_t lpc_misc_fpga_dev_llseek(struct file *file, loff_t offset, int origin) -{ - loff_t ret; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_lock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_lock(file_inode(file)); -#endif - - switch (origin) { - case 0: - file->f_pos = offset; - ret = file->f_pos; - break; - case 1: - file->f_pos += offset; - ret = file->f_pos; - break; - default: - ret = -EINVAL; - } - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_unlock(file_inode(file)); -#endif - - - return ret; -} - - -static long lpc_misc_fpga_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - return -1; -} - -static int lpc_misc_fpga_dev_open(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; - -} - -static int lpc_misc_fpga_dev_release(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; -} - -static const struct file_operations lpc_misc_fpga_dev_fops = { - .owner = THIS_MODULE, - .llseek = lpc_misc_fpga_dev_llseek, - .read = lpc_misc_fpga_dev_read, - .write = lpc_misc_fpga_dev_write, - .unlocked_ioctl = lpc_misc_fpga_dev_ioctl, - .open = lpc_misc_fpga_dev_open, - .release = lpc_misc_fpga_dev_release, -}; - -static struct miscdevice lpc_misc_cpld_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "lpc_cpld", - .fops = &lpc_misc_cpld_dev_fops, -}; - -static struct miscdevice lpc_misc_fpga_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "lpc_fpga", - .fops = &lpc_misc_fpga_dev_fops, -}; - -static int lpc_misc_drv_init(void) -{ - if (misc_register(&lpc_misc_cpld_dev) != 0) { - LPC_DBG_ERROR("Register %s failed.\r\n", lpc_misc_cpld_dev.name); - return -ENXIO; - } - - if (misc_register(&lpc_misc_fpga_dev) != 0) { - LPC_DBG_ERROR("Register %s failed.\r\n", lpc_misc_fpga_dev.name); - return -ENXIO; - } - return 0; -} - -static void lpc_misc_drv_exit(void) -{ - misc_deregister(&lpc_misc_cpld_dev); - misc_deregister(&lpc_misc_fpga_dev); -} - -#define LPC_MAKE_PCI_IO_RANGE(__base) ((0xfc0001) | ((__base) & (0xFFFC))) - -static int lpc_pci_cfg_init(struct pci_dev *pdev, - const struct pci_device_id *id) -{ - int i; - int size; - - size = ARRAY_SIZE(g_rg_lpc_dev_default); - - for (i = 0; i < size; i++) { - pci_write_config_dword(pdev, g_rg_lpc_dev[i].lpc_pci_addr, LPC_MAKE_PCI_IO_RANGE(g_rg_lpc_dev[i].base)); - LPC_DBG_VERBOSE("set lpc pci cfg[addr: 0x%x, value:0x%x].\n", LPC_PCI_CFG_BASE(i), LPC_MAKE_PCI_IO_RANGE(g_rg_lpc_dev[i].base)); - if (!request_region(g_rg_lpc_dev[i].base, g_rg_lpc_dev[i].size, "rg_lpc")) { - LPC_DBG_ERROR("request_region [0x%x][0x%x] failed!\n", g_rg_lpc_dev[i].base, g_rg_lpc_dev[i].size); - return -EBUSY; - } - } - - return 0; -} - -static void lpc_pci_cfg_exit(void) -{ - int i; - int size; - - size = ARRAY_SIZE(g_rg_lpc_dev_default); - for (i = 0; i < size; i++) { - release_region(g_rg_lpc_dev[i].base, g_rg_lpc_dev[i].size); - } - return; -} - -static int rg_lpc_cpld_probe(struct pci_dev *pdev, - const struct pci_device_id *id) -{ - int ret; - - LPC_DBG_VERBOSE("Enter.\n"); - ret = lpc_pci_cfg_init(pdev, id); - if (ret) { - LPC_DBG_ERROR("lpc_pci_cfg_init failed ret %d.\n", ret); - return ret; - } - - ret = lpc_misc_drv_init(); - if (ret) { - LPC_DBG_ERROR("lpc_misc_drv_init failed ret %d.\n", ret); - return ret; - } - LPC_DBG_VERBOSE("Leave success\n"); - - return 0; -} - -static void rg_lpc_cpld_remove(struct pci_dev *pdev) -{ - LPC_DBG_VERBOSE("Enter.\n"); - lpc_misc_drv_exit(); - lpc_pci_cfg_exit(); - LPC_DBG_VERBOSE("Leave.\n"); -} - - -#define PCI_VENDOR_ID_D1527_LPC (0x8c54) -#define PCI_VENDOR_ID_C3000_LPC (0x19dc) - -#if 0 -static const struct pci_device_id rg_lpc_cpld_pcidev_id[] = { - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_C3000_LPC) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_D1527_LPC) }, - { 0, } -}; -MODULE_DEVICE_TABLE(pci, rg_lpc_cpld_pcidev_id); - -static struct pci_driver rg_lpc_driver = { - .name = "rg_lpc", - .id_table = rg_lpc_cpld_pcidev_id, - .probe = rg_lpc_cpld_probe, - .remove = rg_lpc_cpld_remove, -}; - -module_pci_driver(rg_lpc_driver); -#else -static int __init lpc_dbg_init(void) -{ - struct pci_dev *pdev = NULL; - int ret; - - LPC_DBG_VERBOSE("Enter.\n"); - - pdev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_D1527_LPC, pdev); - if (!pdev) { - LPC_DBG_ERROR("pci_get_device(0x8086, 0x8c54) failed!\n"); - return 0; - } - - ret = rg_lpc_cpld_probe(pdev, NULL); - LPC_DBG_VERBOSE("Leave ret %d.\n", ret); - return ret; -} - -static void __exit lpc_dbg_exit(void) -{ - LPC_DBG_VERBOSE("Enter.\n"); - rg_lpc_cpld_remove(NULL); - LPC_DBG_VERBOSE("Leave.\n"); -} - - - -module_init(lpc_dbg_init); -module_exit(lpc_dbg_exit); - -#endif -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("support "); - diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h deleted file mode 100755 index d1aad9c90751..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __ETH_CMD_TYPES_H__ -#define __ETH_CMD_TYPES_H__ - -typedef enum { - ETH_START = 1, - ETH_SHOW, - ETH_SET, - ETH_TEST, - ETH_MAC_REG, - ETH_PHY_REG, -} ether_dbg_top_cmd_t; - -typedef enum { - ETH_MAC_REG_READ = 1, - ETH_MAC_REG_WRITE, - ETH_MAC_REG_CHECK, - ETH_MAC_REG_DUMP_ALL, - ETH_MAC_REG_DUMP_PCI_CFG_ALL, -} ether_mac_reg_cmd_t; - - -#define ETH_DBG_TYPE(cmd1, cmd2, cmd3, cmd4) \ - ((cmd1) | ((cmd2) << 8) | ((cmd3) << 16) | ((cmd4) << 24)) -#define ETH_DBG_PARSE_TYPE(type, cmd1, cmd2, cmd3, cmd4) \ - do {\ - (cmd1) = (type) & 0xff;\ - (cmd2) = ((type) >> 8) & 0xff;\ - (cmd3) = ((type) >> 16) & 0xff;\ - (cmd4) = ((type) >> 24) & 0xff;\ - } while (0) - -typedef struct { - int type; - int length; - unsigned char value[128]; -} ether_msg_t; - - -#endif /* __ETH_CMD_TYPES_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile new file mode 100644 index 000000000000..369b64605dd3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile @@ -0,0 +1,20 @@ +pes_parent_dir:=$(shell pwd)/$(lastword $(MAKEFILE_LIST)) +pes_parent_dir:=$(shell dirname $(pes_parent_dir)) + +SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "build") print $$9}') +INC = -I./inc + +all : CHECK $(SUBDIRS) +CHECK : + @echo $(pes_parent_dir) + +$(SUBDIRS):ECHO + #@echo $@ + make -C $@ + +ECHO: + @echo $(SUBDIRS) + +.PHONY : clean +clean : + -rm -rf $(SYSFS_OUT_PUT) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile new file mode 100644 index 000000000000..e516b70b3d92 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile @@ -0,0 +1,25 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +SUBDIR_CFG = cfg +plat_dfd-objs := dfd_module.o dfd_fan_driver.o \ +dfd_slot_driver.o \ +dfd_sensors_driver.o \ +dfd_psu_driver.o \ +dfd_sff_driver.o \ +$(SUBDIR_CFG)/dfd_cfg.o \ +$(SUBDIR_CFG)/dfd_cfg_adapter.o \ +$(SUBDIR_CFG)/dfd_cfg_file.o \ +$(SUBDIR_CFG)/dfd_cfg_info.o \ +$(SUBDIR_CFG)/dfd_cfg_listnode.o \ + +obj-m := plat_dfd.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/$(SUBDIR_CFG)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd $(PWD)/$(SUBDIR_CFG)/.*.cmd $(PWD)/*.mod + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c new file mode 100644 index 000000000000..b0c9e9f6e723 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c @@ -0,0 +1,812 @@ +#include +#include +#include +#include +#include +#include + +#include "../include/dfd_module.h" +#include "../include/dfd_cfg_file.h" +#include "../include/dfd_cfg_listnode.h" +#include "../include/dfd_cfg_info.h" +#include "../include/dfd_cfg_adapter.h" +#include "../include/dfd_cfg.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +#ifdef DFD_CFG_ITEM +#undef DFD_CFG_ITEM +#endif +#define DFD_CFG_ITEM(_id, _name, _index_min, _index_max) _name, +static char *dfd_cfg_item_name[] = { + DFD_CFG_ITEM_ALL +}; + +#ifdef DFD_CFG_ITEM +#undef DFD_CFG_ITEM +#endif +#define DFD_CFG_ITEM(_id, _name, _index_min, _index_max) {_index_min, _index_max}, +static index_range_t dfd_cfg_item_index_range[] = { + DFD_CFG_ITEM_ALL +}; + +static lnode_root_t dfd_ko_cfg_list_root; + +static void dfd_ko_cfg_del_space_lf_cr(char *str) +{ + int i, j; + int len; + + len = strlen(str); + for (i = 0; i < len; i++) { + if (str[i] == '\r' || str[i] == '\n' || str[i] == ' ') { + for (j = i; j < len - 1; j++) { + str[j] = str[j + 1]; + } + str[j] = '\0'; + len--; + i--; + } + } +} + +static int dfd_ko_cfg_get_value_from_char(char *value_str, int32_t *value, int line_num) +{ + int value_tmp = 0; + + if (strlen(value_str) == 0) { + DBG_DEBUG(DBG_WARN, "line%d: value str is empty\n", line_num); + *value = DFD_CFG_EMPTY_VALUE; + return 0; + } + + if ((strlen(value_str) > 2) && (value_str[0] == '0') + && (value_str[1] == 'x' || value_str[1] == 'X')) { + value_tmp = (int32_t)simple_strtol(value_str, NULL, 16); + } else { + value_tmp = (int32_t)simple_strtol(value_str, NULL, 10); + } + + *value = value_tmp; + return 0; +} + +static int dfd_ko_cfg_analyse_index(char *index_str, int *index1, int *index2, int line_num) +{ + int rv; + char *index1_begin_char, *index2_begin_char; + + if (index_str[0] != '_') { + DBG_DEBUG(DBG_ERROR, "line%d: no '-' between name and index1\n", line_num); + return -1; + } + + index1_begin_char = index_str; + rv = dfd_ko_cfg_get_value_from_char(++index1_begin_char, index1, line_num); + if (rv < 0) { + return -1; + } + + if (index2 == NULL) { + return 0; + } + + index2_begin_char = strchr(index1_begin_char, '_'); + if (index2_begin_char == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: no '-' between index1 and index2\n", line_num); + return -1; + } else { + rv = dfd_ko_cfg_get_value_from_char(++index2_begin_char, index2, line_num); + if (rv < 0) { + return -1; + } + } + + return 0; +} + +static int dfd_ko_cfg_check_array_index(index_range_t *index_range, int *index1, int *index2, + int line_num) +{ + + if ((*index1 < 0) || (*index1 > index_range->index1_max)) { + DBG_DEBUG(DBG_ERROR, "line%d: index1[%d] invalid, max=%d\n", line_num, *index1, + index_range->index1_max); + return -1; + } + + if (index2 == NULL) { + return 0; + } + + if ((*index2 < 0) || (*index2 > index_range->index2_max)) { + DBG_DEBUG(DBG_ERROR, "line%d: index2[%d] invalid, max=%d\n", line_num, *index2, + index_range->index2_max); + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_get_index(char *index_str, index_range_t *index_range, int *index1, + int *index2, int line_num) +{ + int rv; + + if (index_range->index2_max == INDEX_NOT_EXIST) { + index2 = NULL; + } + + rv = dfd_ko_cfg_analyse_index(index_str, index1, index2, line_num); + if (rv < 0) { + return -1; + } + + rv = dfd_ko_cfg_check_array_index(index_range, index1, index2, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_add_int_item(int key, int value, int line_num) +{ + int rv; + int *int_cfg; + + int_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (int_cfg == NULL) { + + int_cfg = (int *)kmalloc(sizeof(int), GFP_KERNEL); + if (int_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc int fail\n", line_num); + return -1; + } + + *int_cfg = value; + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, int_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add int item[%d] success, key=0x%08x\n", line_num, value, key); + } else { + kfree(int_cfg); + int_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add int item[%d] fail, key=0x%08x rv=%d \n", line_num, value, key, rv); + return -1; + } + } else { + + DBG_DEBUG(DBG_WARN, "line%d: replace int item[%d->%d], key=0x%08x\n", line_num, *int_cfg, value, key); + *int_cfg = value; + } + + return 0; +} + +static int dfd_ko_cfg_analyse_int_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, char *arg_value, + char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int value, key; + char *arg_name_tmp; + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + rv = dfd_ko_cfg_get_value_from_char(arg_value, &value, line_num); + if (rv < 0) { + return -1; + } + + key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_int_item(key, value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_add_str_item(int key, char *str, int line_num) +{ + int rv; + char *str_cfg; + + str_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (str_cfg == NULL) { + + str_cfg = (char *)kmalloc(DFD_CFG_STR_MAX_LEN, GFP_KERNEL); + if (str_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc str[%lu] fail\n", line_num, strlen(str)); + return -1; + } + mem_clear(str_cfg, DFD_CFG_STR_MAX_LEN); + strncpy(str_cfg, str, DFD_CFG_STR_MAX_LEN - 1); + + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, str_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add string item[%s] success, key=0x%08x\n", line_num, str_cfg, key); + } else { + kfree(str_cfg); + str_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add string item[%s] fail, key=0x%08x rv=%d \n", line_num, str_cfg, key, rv); + return -1; + } + } else { + DBG_DEBUG(DBG_WARN, "line%d: replace string item[%s->%s], key=0x%08x\n", line_num, str_cfg, str, key); + mem_clear(str_cfg, DFD_CFG_STR_MAX_LEN); + strncpy(str_cfg, str, DFD_CFG_STR_MAX_LEN - 1); + } + + return 0; +} + +static int dfd_ko_cfg_analyse_str_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, char *arg_value, + char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int btree_key; + char *arg_name_tmp; + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + if (strlen(arg_value) >= DFD_CFG_STR_MAX_LEN) { + DBG_DEBUG(DBG_ERROR, "line%d: string item[%s] is too long \n", line_num, arg_value); + return -1; + } + + btree_key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_str_item(btree_key, arg_value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_get_i2c_dev_member(char *member_str, dfd_i2c_dev_mem_t *member, int line_num) +{ + dfd_i2c_dev_mem_t mem_index; + + for (mem_index = DFD_I2C_DEV_MEM_BUS; mem_index < DFD_I2C_DEV_MEM_END; mem_index++) { + if (memcmp(member_str, g_dfd_i2c_dev_mem_str[mem_index], + strlen(g_dfd_i2c_dev_mem_str[mem_index])) == 0) { + *member = mem_index; + return 0; + } + } + + DBG_DEBUG(DBG_ERROR, "line%d: i2c dev member[%s] invalid\n", line_num, member_str); + return -1; +} + +static void dfd_ko_cfg_set_i2c_dev_mem_value(dfd_i2c_dev_t *i2c_dev, dfd_i2c_dev_mem_t member, + int value) +{ + switch (member) { + case DFD_I2C_DEV_MEM_BUS: + i2c_dev->bus = value; + break; + case DFD_I2C_DEV_MEM_ADDR: + i2c_dev->addr = value; + break; + default: + break; + } +} + +static int dfd_ko_cfg_add_i2c_dev_item(int key, dfd_i2c_dev_mem_t member, int value, int line_num) +{ + int rv; + dfd_i2c_dev_t *i2c_dev_cfg; + + i2c_dev_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (i2c_dev_cfg == NULL) { + + i2c_dev_cfg = (dfd_i2c_dev_t *)kmalloc(sizeof(dfd_i2c_dev_t), GFP_KERNEL); + if (i2c_dev_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc i2c_dev fail\n", line_num); + return -1; + } + mem_clear(i2c_dev_cfg, sizeof(dfd_i2c_dev_t)); + + dfd_ko_cfg_set_i2c_dev_mem_value(i2c_dev_cfg, member, value); + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, i2c_dev_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add i2c_dev item[%s=%d] success, key=0x%08x\n", line_num, + g_dfd_i2c_dev_mem_str[member], value, key); + } else { + kfree(i2c_dev_cfg); + i2c_dev_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add i2c_dev item[%s=%d] fail, key=0x%08x rv=%d\n", line_num, + g_dfd_i2c_dev_mem_str[member], value, key, rv); + return -1; + } + } else { + + DBG_DEBUG(DBG_VERBOSE, "line%d: replace i2c_dev item[%s=%d], key=0x%08x\n", line_num, + g_dfd_i2c_dev_mem_str[member], value, key); + dfd_ko_cfg_set_i2c_dev_mem_value(i2c_dev_cfg, member, value); + } + + return 0; +} + +static int dfd_ko_cfg_analyse_i2c_dev_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, + char *arg_value, char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int value, key; + char *arg_name_tmp; + dfd_i2c_dev_mem_t member; + + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_i2c_dev_member(arg_name_tmp, &member, line_num); + if (rv < 0) { + return -1; + } + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp += strlen(g_dfd_i2c_dev_mem_str[member]); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + rv = dfd_ko_cfg_get_value_from_char(arg_value, &value, line_num); + if (rv < 0) { + return -1; + } + + key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_i2c_dev_item(key, member, value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_get_enum_value_by_str(char *enum_val_str[], int enum_val_end, char *buf) +{ + int i; + int enum_val; + + enum_val = DFD_CFG_INVALID_VALUE; + for (i = 0; i < enum_val_end; i++) { + if (memcmp(buf, enum_val_str[i], strlen(enum_val_str[i])) == 0) { + enum_val = i; + break; + } + } + + return enum_val; +} + +static int dfd_ko_cfg_get_info_ctrl_member(char *member_str, info_ctrl_mem_t *member, int line_num) +{ + info_ctrl_mem_t mem_index; + + for (mem_index = INFO_CTRL_MEM_MODE; mem_index < INFO_CTRL_MEM_END; mem_index++) { + if (memcmp(member_str, g_info_ctrl_mem_str[mem_index], + strlen(g_info_ctrl_mem_str[mem_index])) == 0) { + *member = mem_index; + return 0; + } + } + + DBG_DEBUG(DBG_ERROR, "line%d: info ctrl member[%s] invalid\n", line_num, member_str); + return -1; +} + +static void dfd_ko_cfg_set_info_ctrl_mem_value(info_ctrl_t *info_ctrl, info_ctrl_mem_t member, + char *buf_val, int line_num) +{ + switch (member) { + case INFO_CTRL_MEM_MODE: + info_ctrl->mode = dfd_ko_cfg_get_enum_value_by_str(g_info_ctrl_mode_str, INFO_CTRL_MODE_END, buf_val);; + break; + case INFO_CTRL_MEM_INT_CONS: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->int_cons), line_num); + break; + case INFO_CTRL_MEM_SRC: + info_ctrl->src = dfd_ko_cfg_get_enum_value_by_str(g_info_src_str, INFO_SRC_END, buf_val); + break; + case INFO_CTRL_MEM_FRMT: + info_ctrl->frmt = dfd_ko_cfg_get_enum_value_by_str(g_info_frmt_str, INFO_FRMT_END, buf_val); + break; + case INFO_CTRL_MEM_POLA: + info_ctrl->pola = dfd_ko_cfg_get_enum_value_by_str(g_info_pola_str, INFO_POLA_END, buf_val); + break; + case INFO_CTRL_MEM_FPATH: + mem_clear(info_ctrl->fpath, sizeof(info_ctrl->fpath)); + strncpy(info_ctrl->fpath, buf_val, sizeof(info_ctrl->fpath) - 1); + break; + case INFO_CTRL_MEM_ADDR: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->addr), line_num); + break; + case INFO_CTRL_MEM_LEN: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->len), line_num); + break; + case INFO_CTRL_MEM_BIT_OFFSET: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->bit_offset), line_num); + break; + case INFO_CTRL_MEM_STR_CONS: + mem_clear(info_ctrl->str_cons, sizeof(info_ctrl->str_cons)); + strncpy(info_ctrl->str_cons, buf_val, sizeof(info_ctrl->str_cons) - 1); + break; + case INFO_CTRL_MEM_INT_EXTRA1: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->int_extra1), line_num); + break; + case INFO_CTRL_MEM_INT_EXTRA2: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->int_extra2), line_num); + break; + default: + break; + } +} + +static int dfd_ko_cfg_add_info_ctrl_item(int key, info_ctrl_mem_t member, char *buf_val, + int line_num) +{ + int rv; + info_ctrl_t *info_ctrl_cfg; + + info_ctrl_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (info_ctrl_cfg == NULL) { + + info_ctrl_cfg = (info_ctrl_t *)kmalloc(sizeof(info_ctrl_t), GFP_KERNEL); + if (info_ctrl_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc info_ctrl fail\n", line_num); + return -1; + } + mem_clear(info_ctrl_cfg, sizeof(info_ctrl_t)); + + dfd_ko_cfg_set_info_ctrl_mem_value(info_ctrl_cfg, member, buf_val, line_num); + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, info_ctrl_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add info_ctrl item[%s=%s] success, key=0x%08x\n", line_num, + g_info_ctrl_mem_str[member], buf_val, key); + } else { + kfree(info_ctrl_cfg); + info_ctrl_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add info_ctrl item[%s=%s] fail, key=0x%08x rv=%d\n", line_num, + g_info_ctrl_mem_str[member], buf_val, key, rv); + return -1; + } + } else { + + DBG_DEBUG(DBG_VERBOSE, "line%d: replace info_ctrl item[%s=%s], key=0x%08x\n", line_num, + g_info_ctrl_mem_str[member], buf_val, key); + dfd_ko_cfg_set_info_ctrl_mem_value(info_ctrl_cfg, member, buf_val, line_num); + } + + return 0; +} + +static int dfd_ko_cfg_analyse_info_ctrl_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, + char *arg_value, char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int key; + char *arg_name_tmp; + info_ctrl_mem_t member; + + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_info_ctrl_member(arg_name_tmp, &member, line_num); + if (rv < 0) { + return -1; + } + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp += strlen(g_info_ctrl_mem_str[member]); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_info_ctrl_item(key, member, arg_value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_analyse_config(char *arg_name, char*arg_value, int line_num) +{ + int i, rv = 0; + int cfg_item_num; + + cfg_item_num = sizeof(dfd_cfg_item_name) / sizeof(dfd_cfg_item_name[0]); + for (i = 0; i < cfg_item_num; i++) { + if (memcmp(arg_name, dfd_cfg_item_name[i], strlen(dfd_cfg_item_name[i])) == 0){ + if (DFD_CFG_ITEM_IS_INT(i)) { + rv = dfd_ko_cfg_analyse_int_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else if (DFD_CFG_ITEM_IS_STRING(i)) { + rv = dfd_ko_cfg_analyse_str_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else if (DFD_CFG_ITEM_IS_I2C_DEV(i)) { + rv = dfd_ko_cfg_analyse_i2c_dev_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else if (DFD_CFG_ITEM_IS_INFO_CTRL(i)) { + rv = dfd_ko_cfg_analyse_info_ctrl_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else { + rv = -1; + } + break; + } + } + + return rv; +} + +static int dfd_ko_cfg_cut_config_line(char *config_line, char *arg_name, char *arg_value) +{ + int i, j = 0, k = 0; + int len, name_value_flag = 0; + + len = strlen(config_line); + for (i = 0; i < len; i++) { + if (config_line[i] == '=') { + name_value_flag = 1; + continue; + } + + if (name_value_flag == 0) { + arg_name[j++] = config_line[i]; + } else { + arg_value[k++] = config_line[i]; + } + } + + if (name_value_flag == 0) { + return -1; + } else { + return 0; + } +} + +static int dfd_ko_cfg_analyse_config_line(char *config_line, int line_num) +{ + int rv; + char arg_name[DFD_CFG_NAME_MAX_LEN] = {0}; + char arg_value[DFD_CFG_VALUE_MAX_LEN] = {0}; + + dfd_ko_cfg_del_space_lf_cr(config_line); + + if (strlen(config_line) == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: space line\n", line_num); + return 0; + } + + if (config_line[0] == '#') { + DBG_DEBUG(DBG_VERBOSE, "line%d: comment line[%s]\n", line_num, config_line); + return 0; + } + + rv = dfd_ko_cfg_cut_config_line(config_line, arg_name, arg_value); + if (rv < 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: [%s]no '=' between name and value\n", line_num, config_line); + return -1; + } + + DBG_DEBUG(DBG_VERBOSE, "line%d: config_line[%s] name[%s] value[%s]\n", line_num, config_line, arg_name, arg_value); + return dfd_ko_cfg_analyse_config(arg_name, arg_value, line_num); +} + +static int dfd_ko_cfg_analyse_config_file(char *fpath) +{ + int rv; + int line_num = 1; + kfile_ctrl_t kfile_ctrl; + char config_line[DFD_CFG_CMDLINE_MAX_LEN] = {0}; + + rv = kfile_open(fpath, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_ERROR, "open config file[%s] fail, rv=%d\n", fpath, rv); + return -1; + } + + while(kfile_gets(config_line, sizeof(config_line), &kfile_ctrl) > 0){ + rv = dfd_ko_cfg_analyse_config_line(config_line, line_num++); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "!!!!file[%s] config line[%d %s] analyse fail\n", fpath, line_num - 1, + config_line); + break; + } + + (void)mem_clear(config_line, sizeof(config_line)); + + } + kfile_close(&kfile_ctrl); + + return rv; +} + +void *dfd_ko_cfg_get_item(int key) +{ + return lnode_find_node(&dfd_ko_cfg_list_root, key); +} + +static void dfd_ko_cfg_print_item(int key, const void *cfg) +{ + int item_id; + dfd_i2c_dev_t *i2c_dev; + info_ctrl_t *info_ctrl; + + if (cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "input arguments error\n"); + return; + } + printk(KERN_INFO "**************************\n"); + printk(KERN_INFO "key=0x%08x\n", key); + + item_id = DFD_CFG_ITEM_ID(key); + if (DFD_CFG_ITEM_IS_INT(item_id)) { + printk(KERN_INFO "int=%d\n", *((int *)cfg)); + } else if (DFD_CFG_ITEM_IS_I2C_DEV(item_id)) { + i2c_dev = (dfd_i2c_dev_t *)cfg; + printk(KERN_INFO ".bus=0x%02x\n", i2c_dev->bus); + printk(KERN_INFO ".addr=0x%02x\n", i2c_dev->addr); + } else if (DFD_CFG_ITEM_IS_INFO_CTRL(item_id)) { + info_ctrl = (info_ctrl_t *)cfg; + printk(KERN_INFO ".mode=%s\n", g_info_ctrl_mode_str[info_ctrl->mode]); + printk(KERN_INFO ".int_cons=%d\n", info_ctrl->int_cons); + printk(KERN_INFO ".src=%s\n", g_info_src_str[info_ctrl->src]); + printk(KERN_INFO ".frmt=%s\n", g_info_frmt_str[info_ctrl->frmt]); + printk(KERN_INFO ".pola=%s\n", g_info_pola_str[info_ctrl->pola]); + printk(KERN_INFO ".fpath=%s\n", info_ctrl->fpath); + printk(KERN_INFO ".addr=0x%02x\n", info_ctrl->addr); + printk(KERN_INFO ".len=%d\n", info_ctrl->len); + printk(KERN_INFO ".bit_offset=%d\n", info_ctrl->bit_offset); + } else { + printk(KERN_INFO "item[%d] error!\n", item_id); + } +} + +void dfd_ko_cfg_show_item(int key) +{ + void *cfg; + + cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (cfg == 0) { + printk(KERN_INFO "item[0x%08x] not exist\n", key); + return; + } + + dfd_ko_cfg_print_item(key, cfg); +} + +static int dfd_get_my_dev_type_by_file(void) +{ + struct file *fp; + loff_t pos; + int card_type; + char buf[DFD_PID_BUF_LEN]; + int ret; + + fp= filp_open(DFD_PUB_CARDTYPE_FILE, O_RDONLY, 0); + if (IS_ERR(fp)) { + DBG_DEBUG(DBG_VERBOSE, "open file fail!\n"); + return -1; + } + mem_clear(buf, DFD_PID_BUF_LEN); + pos = 0; + ret = kernel_read(fp, buf, DFD_PRODUCT_ID_LENGTH + 1, &pos); + if (ret < 0) { + DBG_DEBUG(DBG_VERBOSE, "kernel_read failed, path=%s, addr=0, size=%d, ret=%d\n", + DFD_PUB_CARDTYPE_FILE, DFD_PRODUCT_ID_LENGTH + 1, ret); + filp_close(fp, NULL); + return -1; + } + + card_type = simple_strtoul(buf, NULL, 10); + DBG_DEBUG(DBG_VERBOSE, "card_type 0x%x.\n", card_type); + + filp_close(fp, NULL); + return card_type; +} + +static int drv_get_my_dev_type(void) +{ + static int type = -1; + + if (type > 0) { + return type; + } + type = dfd_get_my_dev_type_by_file(); + DBG_DEBUG(DBG_VERBOSE, "ko board type %d\n", type); + return type; +} + +static int dfd_ko_cfg_init(void) +{ + int rv; + int card_type; + char file_name[32] = {0}; + char fpath[128] = {0}; + kfile_ctrl_t kfile_ctrl; + + rv = lnode_init_root(&dfd_ko_cfg_list_root); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "init list root fail, rv=%d\n", rv); + return -1; + } + + card_type = drv_get_my_dev_type(); + if (card_type > 0) { + snprintf(fpath, sizeof(fpath), "%s0x%x", DFD_KO_CFG_FILE_DIR, card_type); + rv = kfile_open(fpath, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_VERBOSE, "open config file[%s] fail, rv=%d, maybe not exist\n", + fpath, rv); + + rv = kfile_open(DFD_KO_CFG_FILE_NAME, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_ERROR, "open config file[%s] fail, rv=%d\n", DFD_KO_CFG_FILE_NAME, + rv); + return -1; + } + DBG_DEBUG(DBG_ERROR, "get config file from: %s, success.\n", DFD_KO_CFG_FILE_NAME); + } else { + DBG_DEBUG(DBG_VERBOSE, "get config file from: %s, success.\n", fpath); + } + } else { + DBG_DEBUG(DBG_VERBOSE, "get board id failed, try to get config file from: %s\n", + DFD_KO_CFG_FILE_NAME); + + rv = kfile_open(DFD_KO_CFG_FILE_NAME, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_ERROR, "open config file[%s] fail, rv=%d\n", DFD_KO_CFG_FILE_NAME, rv); + return -1; + } + DBG_DEBUG(DBG_ERROR, "get config file from: %s, success.\n", DFD_KO_CFG_FILE_NAME); + } + + while (kfile_gets(file_name, sizeof(file_name), &kfile_ctrl) > 0) { + + dfd_ko_cfg_del_space_lf_cr(file_name); + mem_clear(fpath, sizeof(fpath)); + snprintf(fpath, sizeof(fpath), "%s%s.cfg", DFD_KO_CFG_FILE_DIR, file_name); + DBG_DEBUG(DBG_VERBOSE, ">>>>start parsing config file[%s]\n", fpath); + + rv = dfd_ko_cfg_analyse_config_file(fpath); + if (rv < 0) { + break; + } + } + kfile_close(&kfile_ctrl); + + return 0; +} + +int32_t dfd_dev_cfg_init(void) +{ + return dfd_ko_cfg_init(); +} + +void dfd_dev_cfg_exit(void) +{ + lnode_free_list(&dfd_ko_cfg_list_root); + return; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c new file mode 100644 index 000000000000..1d5ca7072f8f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c @@ -0,0 +1,351 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "../include/dfd_module.h" +#include "../include/dfd_cfg_file.h" +#include "../include/dfd_cfg.h" +#include "../include/dfd_cfg_adapter.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +char *g_dfd_i2c_dev_mem_str[DFD_I2C_DEV_MEM_END] = { + ".bus", + ".addr", +}; + +static dfd_i2c_dev_t* dfd_ko_get_cpld_i2c_dev(int sub_slot, int cpld_id) +{ + int key; + dfd_i2c_dev_t *i2c_dev; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_I2C_DEV, sub_slot, cpld_id); + i2c_dev = dfd_ko_cfg_get_item(key); + if (i2c_dev == NULL) { + DBG_DEBUG(DBG_ERROR, "get cpld[%d] i2c dev config fail, key=0x%08x\n", cpld_id, key); + return NULL; + } + + return i2c_dev; +} + +static int32_t dfd_ko_i2c_smbus_transfer(int read_write, int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int rv; + struct i2c_adapter *i2c_adap; + union i2c_smbus_data data; + + i2c_adap = i2c_get_adapter(bus); + if (i2c_adap == NULL) { + DBG_DEBUG(DBG_ERROR, "get i2c bus[%d] adapter fail\n", bus); + return -DFD_RV_DEV_FAIL; + } + + if (read_write == I2C_SMBUS_WRITE) { + data.byte = *buf; + } else { + data.byte = 0; + } + rv = i2c_smbus_xfer(i2c_adap, addr, 0, read_write, offset, I2C_SMBUS_BYTE_DATA, &data); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "i2c dev[bus=%d addr=0x%x offset=0x%x size=%d rw=%d] transfer fail, rv=%d\n", + bus, addr, offset, size, read_write, rv); + rv = -DFD_RV_DEV_FAIL; + } else { + DBG_DEBUG(DBG_VERBOSE, "i2c dev[bus=%d addr=0x%x offset=0x%x size=%d rw=%d] transfer success\n", + bus, addr, offset, size, read_write); + rv = DFD_RV_OK; + } + + if (read_write == I2C_SMBUS_READ) { + if (rv == DFD_RV_OK) { + *buf = data.byte; + } else { + *buf = 0; + } + } + + i2c_put_adapter(i2c_adap); + return rv; +} + +static int32_t dfd_ko_i2c_read_data(int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int i, rv; + for (i = 0; i < DFD_KO_CPLD_I2C_RETRY_TIMES; i++) { + rv = dfd_ko_i2c_smbus_transfer(I2C_SMBUS_READ, bus, addr, offset, buf, size); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "[%d]cpld read[offset=0x%x] fail, rv %d\n", i, addr, rv); + msleep(DFD_KO_CPLD_I2C_RETRY_SLEEP); + } else { + DBG_DEBUG(DBG_VERBOSE, "[%d]cpld read[offset=0x%x] success, value=0x%x\n", + i, addr, *buf); + break; + } + } + return rv; +} + +static int32_t dfd_ko_i2c_write_data(int bus, int addr, int offset, uint8_t data, uint32_t size) +{ + int i, rv; + for (i = 0; i < DFD_KO_CPLD_I2C_RETRY_TIMES; i++) { + rv = dfd_ko_i2c_smbus_transfer(I2C_SMBUS_WRITE, bus, addr, offset, &data, size); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "[%d]cpld write[offset=0x%x] fail, rv=%d\n", i, addr, rv); + msleep(DFD_KO_CPLD_I2C_RETRY_SLEEP); + } else { + DBG_DEBUG(DBG_VERBOSE, "[%d]cpld write[offset=0x%x, data=%d] success\n", i, addr, data); + break; + } + } + + return rv; +} + +static int32_t dfd_ko_cpld_i2c_read(int32_t addr, uint8_t *buf) +{ + int rv; + int sub_slot, cpld_id, cpld_addr; + dfd_i2c_dev_t *i2c_dev; + + if (buf == NULL) { + DBG_DEBUG(DBG_ERROR, "input arguments error\n"); + return -DFD_RV_INDEX_INVALID; + } + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + cpld_addr = DFD_KO_CPLD_GET_INDEX(addr); + + i2c_dev = dfd_ko_get_cpld_i2c_dev(sub_slot, cpld_id); + if (i2c_dev == NULL) { + return -DFD_RV_DEV_NOTSUPPORT; + } + rv = dfd_ko_i2c_read_data(i2c_dev->bus, i2c_dev->addr, cpld_addr, buf, sizeof(uint8_t)); + + return rv; +} + +static int32_t dfd_ko_cpld_i2c_write(int32_t addr, uint8_t data) +{ + int rv; + int sub_slot, cpld_id, cpld_addr; + dfd_i2c_dev_t *i2c_dev; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + cpld_addr = DFD_KO_CPLD_GET_INDEX(addr); + + i2c_dev = dfd_ko_get_cpld_i2c_dev(sub_slot, cpld_id); + if (i2c_dev == NULL) { + return -DFD_RV_DEV_NOTSUPPORT; + } + + rv = dfd_ko_i2c_write_data(i2c_dev->bus, i2c_dev->addr, cpld_addr, data, sizeof(uint8_t)); + + return rv; +} + +static int32_t dfd_ko_cpld_io_read(int32_t addr, uint8_t *buf) +{ + int cpld_id, sub_slot, offset; + int key; + int *tmp; + uint16_t io_port; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + offset = DFD_KO_CPLD_GET_INDEX(addr); + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_LPC_DEV, sub_slot, cpld_id); + tmp = dfd_ko_cfg_get_item(key); + if (tmp == NULL) { + DBG_DEBUG(DBG_ERROR,"get cpld io base config fail, key=0x%08x\n", key); + return -1; + } + + io_port = (u16)(*tmp) + offset; + *buf = inb(io_port); + DBG_DEBUG(DBG_VERBOSE, "read cpld io port addr 0x%x, data 0x%x\n", io_port, *buf); + + return DFD_RV_OK; + +} + +static int32_t dfd_ko_cpld_io_write(int32_t addr, uint8_t data) +{ + int cpld_id, sub_slot, offset; + int key; + int *tmp; + uint16_t io_port; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + offset = DFD_KO_CPLD_GET_INDEX(addr); + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_LPC_DEV, sub_slot, cpld_id); + tmp = dfd_ko_cfg_get_item(key); + if (tmp == NULL) { + DBG_DEBUG(DBG_ERROR, "get cpld io base config fail, key=0x%08x\n", key); + return -1; + } + + io_port = (u16)(*tmp) + offset; + DBG_DEBUG(DBG_VERBOSE, "write cpld io port addr 0x%x, data 0x%x\n", io_port, data); + outb(data, (u16)io_port); + + return DFD_RV_OK; +} + +static int dfd_cfg_get_cpld_mode(int sub_slot, int cpld_id, int *mode) +{ + int key; + char *name; + + if (mode == NULL) { + DBG_DEBUG(DBG_ERROR, "input arguments error\n"); + return -DFD_RV_TYPE_ERR; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_MODE, sub_slot, cpld_id); + name = dfd_ko_cfg_get_item(key); + if (name == NULL) { + DBG_DEBUG(DBG_ERROR, "get cpld[%d] mode info ctrl fail, key=0x%08x\n", cpld_id, key); + return -DFD_RV_NODE_FAIL; + } + + DBG_DEBUG(DBG_VERBOSE, "cpld_id %d mode_name %s.\n", cpld_id, name); + if (!strncmp(name, DFD_KO_CPLD_MODE_I2C_STRING, strlen(DFD_KO_CPLD_MODE_I2C_STRING))) { + *mode = DFD_CPLD_MODE_I2C; + } else if (!strncmp(name, DFD_KO_CPLD_MODE_LPC_STRING, strlen(DFD_KO_CPLD_MODE_LPC_STRING))) { + *mode = DFD_CPLD_MODE_LPC; + } else { + + *mode = DFD_CPLD_MODE_I2C; + } + + DBG_DEBUG(DBG_VERBOSE, "cpld_id %d mode %d.\n", cpld_id, *mode); + return 0; +} + +int32_t dfd_ko_cpld_read(int32_t addr, uint8_t *buf) +{ + int ret; + int sub_slot, cpld_id; + int cpld_mode; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + + ret = dfd_cfg_get_cpld_mode(sub_slot, cpld_id, &cpld_mode); + if (ret) { + DBG_DEBUG(DBG_WARN, "drv_get_cpld_mode sub_slot %d cpldid %d faile, set default i2c mode.\n", sub_slot, cpld_id); + cpld_mode = DFD_CPLD_MODE_I2C; + } + + if (cpld_mode == DFD_CPLD_MODE_I2C) { + ret = dfd_ko_cpld_i2c_read(addr, buf); + } else if (cpld_mode == DFD_CPLD_MODE_LPC) { + ret = dfd_ko_cpld_io_read(addr, buf); + } else { + DBG_DEBUG(DBG_ERROR, "cpld_mode %d invalid.\n", cpld_mode); + ret = -DFD_RV_DEV_NOTSUPPORT; + } + + DBG_DEBUG(DBG_VERBOSE, "addr 0x%x val 0x%x ret %d\n", addr, *buf, ret); + return ret; +} + +int32_t dfd_ko_cpld_write(int32_t addr, uint8_t val) +{ + int ret; + int sub_slot, cpld_id, cpld_mode; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + + ret = dfd_cfg_get_cpld_mode(sub_slot, cpld_id, &cpld_mode); + if (ret) { + DBG_DEBUG(DBG_ERROR, "drv_get_cpld_mode sub_slot %d cpldid %d faile, set default local_bus mode.\n", sub_slot, cpld_id); + cpld_mode = DFD_CPLD_MODE_I2C; + } + + if (cpld_mode == DFD_CPLD_MODE_I2C) { + ret = dfd_ko_cpld_i2c_write(addr, val); + } else if (cpld_mode == DFD_CPLD_MODE_LPC) { + ret = dfd_ko_cpld_io_write(addr, val); + } else { + DBG_DEBUG(DBG_ERROR, "cpld_mode %d invalid.\n", cpld_mode); + ret = -DFD_RV_DEV_NOTSUPPORT; + } + + DBG_DEBUG(DBG_VERBOSE, "addr 0x%x val 0x%x ret %d\n", addr, val, ret); + return ret; +} + +int32_t dfd_ko_i2c_read(int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int i, rv; + + for (i = 0; i < size; i++) { + rv = dfd_ko_i2c_read_data(bus, addr, offset, &buf[i], sizeof(uint8_t)); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "dfd_ko_i2c_read[bus=%d addr=0x%x offset=0x%x]fail, rv=%d\n", + bus, addr, offset, rv); + return rv; + } + offset++; + } + + return size; +} + +int32_t dfd_ko_i2c_write(int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int i, rv; + + for (i = 0; i < size; i++) { + rv = dfd_ko_i2c_write_data(bus, addr, offset, buf[i], sizeof(uint8_t)); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "dfd_ko_i2c_write[bus=%d addr=0x%x offset=0x%x]fail, rv=%d\n", + bus, addr, offset, rv); + return rv; + } + offset++; + } + + return size; + +} + +int32_t dfd_ko_read_file(char *fpath, int32_t addr, uint8_t *val, int32_t read_bytes) +{ + int32_t ret; + struct file *filp; + loff_t pos; + + if ((fpath == NULL) || (val == NULL) || (addr < 0) || (read_bytes < 0)) { + DBG_DEBUG(DBG_ERROR, "input arguments error, addr=%d read_bytes=%d\n", addr, read_bytes); + return -DFD_RV_INDEX_INVALID; + } + + filp = filp_open(fpath, O_RDONLY, 0); + if (IS_ERR(filp)){ + DBG_DEBUG(DBG_ERROR, "open file[%s] fail\n", fpath); + return -DFD_RV_DEV_FAIL; + } + + pos = addr; + ret = kernel_read(filp, val, read_bytes, &pos); + if (ret < 0) { + DBG_DEBUG(DBG_ERROR, "kernel_read failed, path=%s, addr=%d, size=%d, ret=%d\n", fpath, addr, read_bytes, ret); + ret = -DFD_RV_DEV_FAIL; + } + + filp_close(filp, NULL); + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c new file mode 100644 index 000000000000..8d77759ba7e0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c @@ -0,0 +1,236 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/dfd_cfg_file.h" +#include "../include/dfd_module.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +struct getdents_callback { + struct dir_context ctx; + const char *obj_name; + char *match_name; + int dir_len; + int found; +}; + +int kfile_open(char *fname, kfile_ctrl_t *kfile_ctrl) +{ + int ret; + struct file *filp; + loff_t pos; + + if ((fname == NULL) || (kfile_ctrl == NULL)) { + return KFILE_RV_INPUT_ERR; + } + + filp = filp_open(fname, O_RDONLY, 0); + if (IS_ERR(filp)){ + return KFILE_RV_OPEN_FAIL; + } + + kfile_ctrl->size = filp->f_inode->i_size; + + kfile_ctrl->buf = kmalloc(kfile_ctrl->size, GFP_KERNEL); + if (kfile_ctrl->buf == NULL) { + ret = KFILE_RV_MALLOC_FAIL; + goto close_fp; + } + mem_clear(kfile_ctrl->buf, kfile_ctrl->size); + + pos = 0; + ret = kernel_read(filp, kfile_ctrl->buf, kfile_ctrl->size, &pos); + if (ret < 0) { + ret = KFILE_RV_RD_FAIL; + goto free_buf; + } + + kfile_ctrl->pos = 0; + + ret = KFILE_RV_OK; + goto close_fp; + +free_buf: + kfree(kfile_ctrl->buf); + kfile_ctrl->buf = NULL; + +close_fp: + filp_close(filp, NULL); + return ret; +} + +void kfile_close(kfile_ctrl_t *kfile_ctrl) +{ + if (kfile_ctrl == NULL) { + return; + } + + kfile_ctrl->size = 0; + kfile_ctrl->pos = 0; + if (kfile_ctrl->buf) { + kfree(kfile_ctrl->buf); + kfile_ctrl->buf = NULL; + } +} + +int kfile_gets(char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl) +{ + int i; + int has_cr = 0; + + if ((buf == NULL) || (buf_size <= 0) || (kfile_ctrl == NULL) || (kfile_ctrl->buf == NULL) + || (kfile_ctrl->size <= 0)) { + return KFILE_RV_INPUT_ERR; + } + + mem_clear(buf, buf_size); + for (i = 0; i < buf_size; i++) { + + if (kfile_ctrl->pos >= kfile_ctrl->size) { + break; + } + + if (has_cr) { + break; + } + + if (IS_CR(kfile_ctrl->buf[kfile_ctrl->pos])) { + has_cr = 1; + } + + buf[i] = kfile_ctrl->buf[kfile_ctrl->pos]; + kfile_ctrl->pos++; + } + + return i; +} + +int kfile_read(int32_t addr, char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl) +{ + int i; + + if ((buf == NULL) || (buf_size <= 0) || (kfile_ctrl == NULL) || (kfile_ctrl->buf == NULL) + || (kfile_ctrl->size <= 0)) { + return KFILE_RV_INPUT_ERR; + } + + if ((addr < 0) || (addr >= kfile_ctrl->size)) { + return KFILE_RV_ADDR_ERR; + } + + mem_clear(buf, buf_size); + + kfile_ctrl->pos = addr; + for (i = 0; i < buf_size; i++) { + + if (kfile_ctrl->pos >= kfile_ctrl->size) { + break; + } + + buf[i] = kfile_ctrl->buf[kfile_ctrl->pos]; + kfile_ctrl->pos++; + } + + return i; +} + +static int kfile_filldir_one(struct dir_context *ctx, const char * name, int len, + loff_t pos, u64 ino, unsigned int d_type) +{ + struct getdents_callback *buf ; + int result; + buf = container_of(ctx, struct getdents_callback, ctx); + result = 0; + if (strncmp(buf->obj_name, name, strlen(buf->obj_name)) == 0) { + if (buf->dir_len < len) { + DBG_DEBUG(DBG_ERROR, "match ok. dir name:%s, but buf_len %d small than dir len %d.\n", + name, buf->dir_len, len); + buf->found = 0; + return -1; + } + mem_clear(buf->match_name, buf->dir_len); + memcpy(buf->match_name, name, len); + buf->found = 1; + result = -1; + } + return result; +} + +int kfile_iterate_dir(const char *dir_path, const char *obj_name, char *match_name, int len) +{ + int ret; + struct file *dir; + struct getdents_callback buffer = { + .ctx.actor = kfile_filldir_one, + }; + + if(!dir_path || !obj_name || !match_name) { + DBG_DEBUG(DBG_ERROR, "params error. \n"); + return KFILE_RV_INPUT_ERR; + } + buffer.obj_name = obj_name; + buffer.match_name = match_name; + buffer.dir_len = len; + buffer.found = 0; + + dir = filp_open(dir_path, O_RDONLY, 0); + if (IS_ERR(dir)) { + DBG_DEBUG(DBG_ERROR, "filp_open error, dir path:%s\n", dir_path); + return KFILE_RV_OPEN_FAIL; + } + ret = iterate_dir(dir, &buffer.ctx); + if (buffer.found) { + DBG_DEBUG(DBG_VERBOSE, "match ok, dir name:%s\n", match_name); + filp_close(dir, NULL); + return DFD_RV_OK; + } + filp_close(dir, NULL); + return -DFD_RV_NODE_FAIL; +} + +#if 0 + +int kfile_write(char *fpath, int32_t addr, char *buf, int buf_size) +{ + int ret = KFILE_RV_OK; + struct file *filp; + mm_segment_t old_fs; + int wlen; + + if ((fpath == NULL) || (buf == NULL) || (buf_size <= 0)) { + return KFILE_RV_INPUT_ERR; + } + + if (addr < 0) { + return KFILE_RV_ADDR_ERR; + } + + filp = filp_open(fpath, O_RDWR, 0); + if (IS_ERR(filp)){ + return KFILE_RV_OPEN_FAIL; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + + filp->f_op->llseek(filp,0,0); + filp->f_pos = addr; + + wlen = filp->f_op->write(filp, buf, buf_size, &(filp->f_pos)); + if (wlen < 0) { + ret = KFILE_RV_WR_FAIL; + } + + filp->f_op->llseek(filp,0,0); + set_fs(old_fs); + filp_close(filp, NULL); + + return ret; +} +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c new file mode 100644 index 000000000000..5dae1539a116 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c @@ -0,0 +1,587 @@ +#include +#include +#include + +#include "../include/dfd_module.h" +#include "../include/dfd_cfg_adapter.h" +#include "../include/dfd_cfg.h" +#include "../include/dfd_cfg_info.h" +#include "../include/dfd_cfg_file.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +#define DFD_HWMON_NAME "hwmon" +#define DFD_GET_CPLD_VOLATGE_CODE_VALUE(value) ((value >> 4)& 0xfff) +#define DFD_GET_CPLD_VOLATGE_REAL_VALUE(code_val, k) ((code_val * 16 * 33 * k) / ((65536 - 5000) * 10)) + +char *g_info_ctrl_mem_str[INFO_CTRL_MEM_END] = { + ".mode", + ".int_cons", + ".src", + ".frmt", + ".pola", + ".fpath", + ".addr", + ".len", + ".bit_offset", + ".str_cons", + ".int_extra1", + ".int_extra2", +}; + +char *g_info_ctrl_mode_str[INFO_CTRL_MODE_END] = { + "none", + "config", + "constant", + "tlv", + "str_constant", +}; + +char *g_info_src_str[INFO_SRC_END] = { + "none", + "cpld", + "fpga", + "other_i2c", + "file", +}; + +char *g_info_frmt_str[INFO_FRMT_END] = { + "none", + "bit", + "byte", + "num_bytes", + "num_str", + "num_buf", + "buf", +}; + +char *g_info_pola_str[INFO_POLA_END] = { + "none", + "positive", + "negative", +}; + +static int dfd_read_info_from_cpld(int32_t addr, int read_bytes, uint8_t *val) +{ + int i, rv; + + for (i = 0; i < read_bytes; i++) { + rv = dfd_ko_cpld_read(addr, &(val[i])); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "read info[addr=0x%x read_bytes=%d] from cpld fail, reading_byte=%d rv=%d\n", + addr, read_bytes, i, rv); + return rv; + } + addr++; + } + + return read_bytes; +} + +static int dfd_write_info_to_cpld(int32_t addr, int write_bytes, uint8_t *val, uint8_t bit_mask) +{ + int rv; + uint8_t val_tmp; + + if (bit_mask != 0xff) { + rv = dfd_ko_cpld_read(addr, &val_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "read original info[addr=0x%x] from cpld fail, rv=%d\n", addr, rv); + return -1; + } + + val_tmp = (val_tmp & (~bit_mask)) | (val[0] & bit_mask); + } else { + val_tmp = val[0]; + } + + rv = dfd_ko_cpld_write(addr, val_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "write info[addr=0x%x val=0x%x] to cpld fail, rv=%d\n", addr, val_tmp, rv); + return -1; + } + + return 0; +} + +static int dfd_read_info(info_src_t src, char *fpath, int32_t addr, int read_bytes, uint8_t *val) +{ + int rv = 0; + + switch (src) { + case INFO_SRC_CPLD: + rv = dfd_read_info_from_cpld(addr, read_bytes, val); + break; + case INFO_SRC_FPGA: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support read info from fpga\n"); + break; + case INFO_SRC_OTHER_I2C: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support read info from other i2c\n"); + break; + case INFO_SRC_FILE: + rv = dfd_ko_read_file(fpath, addr, val, read_bytes); + break; + default: + rv = -1; + DBG_DEBUG(DBG_ERROR, "info src[%d] error\n", src); + break; + } + + return rv; +} + +static int dfd_write_info(info_src_t src, char *fpath, int32_t addr, int write_bytes, uint8_t *val, uint8_t bit_mask) +{ + int rv = 0; + + switch (src) { + case INFO_SRC_CPLD: + rv = dfd_write_info_to_cpld(addr, write_bytes, val, bit_mask); + break; + case INFO_SRC_FPGA: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support write info to fpga\n"); + break; + case INFO_SRC_OTHER_I2C: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support write info to other i2c\n"); + break; + case INFO_SRC_FILE: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support write info to file\n"); + break; + default: + rv = -1; + DBG_DEBUG(DBG_ERROR, "info src[%d] error\n", src); + break; + } + + return rv; +} + +int dfd_info_get_int(int key, int *ret, info_num_buf_to_value_f pfun) +{ + int i, rv; + int read_bytes, readed_bytes, int_tmp; + uint8_t byte_tmp, val[INFO_INT_MAX_LEN + 1] = {0}; + info_ctrl_t *info_ctrl; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key)) || (ret == NULL)) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key=0x%08x\n", key); + return -DFD_RV_INDEX_INVALID; + } + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if (info_ctrl->mode == INFO_CTRL_MODE_CONS) { + *ret = info_ctrl->int_cons; + return DFD_RV_OK; + } else if (info_ctrl->mode == INFO_CTRL_MODE_TLV) { + return INFO_CTRL_MODE_TLV; + } + + if (IS_INFO_FRMT_BIT(info_ctrl->frmt)) { + + if (!INFO_BIT_OFFSET_VALID(info_ctrl->bit_offset)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] bit_offsest[%d] invalid\n", + key, info_ctrl->bit_offset); + return -DFD_RV_TYPE_ERR; + } + + read_bytes = 1; + } else if (IS_INFO_FRMT_BYTE(info_ctrl->frmt) || IS_INFO_FRMT_NUM_STR(info_ctrl->frmt) + || IS_INFO_FRMT_NUM_BUF(info_ctrl->frmt)) { + + if (!INFO_INT_LEN_VALAID(info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] len[%d] invalid\n", key, info_ctrl->len); + return -DFD_RV_TYPE_ERR; + } + read_bytes = info_ctrl->len; + } else { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] info format[%d] error\n", key, info_ctrl->frmt); + return -DFD_RV_TYPE_ERR; + } + + readed_bytes = dfd_read_info(info_ctrl->src, info_ctrl->fpath, info_ctrl->addr, read_bytes, &(val[0])); + if (readed_bytes <= 0) { + DBG_DEBUG(DBG_ERROR, "read int info[key=0x%08x src=%s frmt=%s fpath=%s addr=0x%x read_bytes=%d] fail, rv=%d\n", + key, g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], info_ctrl->fpath, + info_ctrl->addr, read_bytes, readed_bytes); + return -DFD_RV_DEV_FAIL; + } + + if (IS_INFO_FRMT_BIT(info_ctrl->frmt)) { + + if (info_ctrl->pola == INFO_POLA_NEGA) { + val[0] = ~val[0]; + } + + byte_tmp = (val[0] >> info_ctrl->bit_offset) & (~(0xff << info_ctrl->len)); + + if (pfun) { + rv = pfun(&byte_tmp, sizeof(byte_tmp), &int_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] bit process fail, rv=%d\n", key, rv); + return rv; + } + } else { + int_tmp = (int)byte_tmp; + } + } else if (IS_INFO_FRMT_BYTE(info_ctrl->frmt)) { + + int_tmp = 0; + for (i = 0; i < info_ctrl->len; i++) { + if (info_ctrl->pola == INFO_POLA_NEGA) { + int_tmp |= val[info_ctrl->len - i - 1]; + } else { + int_tmp |= val[i]; + } + + if (i != (info_ctrl->len - 1)) { + int_tmp <<= 8; + } + } + } else if (IS_INFO_FRMT_NUM_STR(info_ctrl->frmt)) { + + val[readed_bytes] = '\0'; + int_tmp = simple_strtol((char *)(&(val[0])), NULL, 10); + } else { + if (pfun == NULL) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] number buf process function is null\n", key); + return -DFD_RV_INDEX_INVALID; + } + + rv = pfun(val, readed_bytes, &int_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] number buf process fail, rv=%d\n", key, rv); + return rv; + } + } + + *ret = int_tmp; + DBG_DEBUG(DBG_VERBOSE, "read int info[key=0x%08x src=%s frmt=%s pola=%s fpath=%s addr=0x%x len=%d bit_offset=%d] success, ret=%d\n", + key, g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], g_info_pola_str[info_ctrl->pola], + info_ctrl->fpath, info_ctrl->addr, info_ctrl->len, info_ctrl->bit_offset, *ret); + return DFD_RV_OK; +} + +int dfd_info_get_buf(int key, uint8_t *buf, int buf_len, info_buf_to_buf_f pfun) +{ + int rv; + int read_bytes, buf_real_len; + uint8_t buf_tmp[INFO_BUF_MAX_LEN]; + info_ctrl_t *info_ctrl; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key)) || (buf == NULL)) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key=0x%08x\n", key); + return -DFD_RV_INDEX_INVALID; + } + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if (info_ctrl->mode != INFO_CTRL_MODE_CFG) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] mode[%d] invalid\n", key, info_ctrl->mode); + return -DFD_RV_TYPE_ERR; + } + + if (!IS_INFO_FRMT_BUF(info_ctrl->frmt) || !INFO_BUF_LEN_VALAID(info_ctrl->len) + || (buf_len <= info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] format=%d or len=%d invlaid, buf_len=%d\n", + key, info_ctrl->frmt, info_ctrl->len, buf_len); + return -DFD_RV_TYPE_ERR; + } + + read_bytes = dfd_read_info(info_ctrl->src, info_ctrl->fpath, info_ctrl->addr, info_ctrl->len, buf_tmp); + if (read_bytes <= 0) { + DBG_DEBUG(DBG_ERROR, "read buf info[key=0x%08x src=%s frmt=%s fpath=%s addr=0x%x len=%d] fail, rv=%d\n", + key, g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], info_ctrl->fpath, + info_ctrl->addr, info_ctrl->len, read_bytes); + return -DFD_RV_DEV_FAIL; + } + + if (pfun) { + buf_real_len = buf_len; + rv = pfun(buf_tmp, read_bytes, buf, &buf_real_len); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] buf process fail, rv=%d\n", key, rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + } else { + buf_real_len = read_bytes; + memcpy(buf, buf_tmp, read_bytes); + } + + return buf_real_len; +} + +static int dfd_2key_info_get_buf(info_ctrl_t *info_ctrl, uint8_t *buf, int buf_len, info_hwmon_buf_f pfun) +{ + int rv; + int read_bytes, buf_real_len; + uint8_t buf_tmp[INFO_BUF_MAX_LEN]; + char temp_fpath[INFO_FPATH_MAX_LEN]; + + if (!IS_INFO_FRMT_BUF(info_ctrl->frmt) || !INFO_BUF_LEN_VALAID(info_ctrl->len) + || (buf_len <= info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "key_path info ctrl format=%d or len=%d invlaid, buf_len=%d\n", + info_ctrl->frmt, info_ctrl->len, buf_len); + return -DFD_RV_TYPE_ERR; + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + rv = kfile_iterate_dir(info_ctrl->fpath, DFD_HWMON_NAME, buf_tmp, INFO_BUF_MAX_LEN); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "dir patch:%s ,can find name %s dir \n", + info_ctrl->fpath, DFD_HWMON_NAME); + return -DFD_RV_NO_NODE; + } + mem_clear(temp_fpath, sizeof(temp_fpath)); + snprintf(temp_fpath, sizeof(temp_fpath), "%s%s/%s", + info_ctrl->fpath, buf_tmp, info_ctrl->str_cons); + DBG_DEBUG(DBG_VERBOSE, "match ok path = %s \n", temp_fpath); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + + read_bytes = dfd_read_info(info_ctrl->src, temp_fpath, info_ctrl->addr, info_ctrl->len, buf_tmp); + if (read_bytes <= 0) { + DBG_DEBUG(DBG_ERROR, "read buf info[src=%s frmt=%s fpath=%s addr=0x%x len=%d] fail, rv=%d\n", + g_info_src_str[info_ctrl->src], g_info_src_str[info_ctrl->frmt], temp_fpath, + info_ctrl->addr, info_ctrl->len, read_bytes); + return -DFD_RV_DEV_FAIL; + } + + if (pfun) { + buf_real_len = buf_len; + rv = pfun(buf_tmp, read_bytes, buf, &buf_real_len, info_ctrl); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl buf process fail, rv=%d\n", rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + } else { + buf_real_len = read_bytes; + memcpy(buf, buf_tmp, buf_real_len); + } + return buf_real_len; +} + +int dfd_info_set_int(int key, int val) +{ + int rv; + int write_bytes; + uint8_t byte_tmp, bit_mask; + info_ctrl_t *info_ctrl; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key))) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key=0x%08x\n", key); + return -DFD_RV_INDEX_INVALID; + } + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if (info_ctrl->mode != INFO_CTRL_MODE_CFG) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] mode[%d] warnning\n", key, info_ctrl->mode); + return -DFD_RV_TYPE_ERR; + } + + if (IS_INFO_FRMT_BIT(info_ctrl->frmt)) { + + if (!INFO_BIT_OFFSET_VALID(info_ctrl->bit_offset)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] bit_offsest[%d] invalid\n", + key, info_ctrl->bit_offset); + return -DFD_RV_TYPE_ERR; + } + + write_bytes = 1; + + byte_tmp = (uint8_t)(val & 0xff); + byte_tmp <<= info_ctrl->bit_offset; + if (info_ctrl->pola == INFO_POLA_NEGA) { + byte_tmp = ~byte_tmp; + } + + bit_mask = (~(0xff << info_ctrl->len)) << info_ctrl->bit_offset; + } else if (IS_INFO_FRMT_BYTE(info_ctrl->frmt)) { + + if (!INFO_INT_LEN_VALAID(info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] len[%d] invalid\n", key, info_ctrl->len); + return -DFD_RV_TYPE_ERR; + } + + write_bytes = 1; + + byte_tmp = (uint8_t)(val & 0xff); + + bit_mask = 0xff; + } else if (IS_INFO_FRMT_NUM_STR(info_ctrl->frmt)) { + + DBG_DEBUG(DBG_ERROR, "not support str int set\n"); + return -1; + } else if (IS_INFO_FRMT_NUM_BUF(info_ctrl->frmt)) { + + if (!INFO_INT_LEN_VALAID(info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] len[%d] invalid\n", key, info_ctrl->len); + return -DFD_RV_TYPE_ERR; + } + + write_bytes = 1; + + byte_tmp = (uint8_t)(val & 0xff); + + bit_mask = 0xff; + } else { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] format[%d] error\n", key, info_ctrl->frmt); + return -DFD_RV_TYPE_ERR; + } + + rv = dfd_write_info(info_ctrl->src, info_ctrl->fpath, info_ctrl->addr, write_bytes, + &byte_tmp, bit_mask); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "write int info[src=%s frmt=%s fpath=%s addr=0x%x len=%d val=%d] fail, rv=%d\n", + g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], info_ctrl->fpath, + info_ctrl->addr, info_ctrl->len, val, rv); + return -DFD_RV_DEV_FAIL; + } + + DBG_DEBUG(DBG_VERBOSE, "write int info[src=%s frmt=%s pola=%s fpath=%s addr=0x%x len=%d bit_offset=%d val=%d] success\n", + g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], g_info_pola_str[info_ctrl->pola], + info_ctrl->fpath, info_ctrl->addr, info_ctrl->len, info_ctrl->bit_offset, val); + return DFD_RV_OK; +} + +static int dfd_info_get_cpld_voltage(int key, int *value) +{ + int rv, addr_tmp; + int vol_ref_tmp, vol_ref; + int vol_curr_tmp, vol_curr; + info_ctrl_t *info_ctrl; + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + rv = dfd_info_get_int(key, &vol_curr_tmp, NULL); + if(rv < 0) { + DBG_DEBUG(DBG_ERROR, "get cpld current voltage error, addr:0x%x, rv =%d\n", info_ctrl->addr, rv); + return rv; + } + vol_curr_tmp = DFD_GET_CPLD_VOLATGE_CODE_VALUE(vol_curr_tmp); + if(info_ctrl->addr == info_ctrl->int_extra1) { + + vol_curr = DFD_GET_CPLD_VOLATGE_REAL_VALUE(vol_curr_tmp, info_ctrl->int_extra2); + } else { + + addr_tmp = info_ctrl->addr; + info_ctrl->addr = info_ctrl->int_extra1; + rv = dfd_info_get_int(key, &vol_ref_tmp, NULL); + info_ctrl->addr = addr_tmp; + if(rv < 0) { + DBG_DEBUG(DBG_ERROR, "get cpld reference voltage error, addr:0x%x rv:%d\n", info_ctrl->addr, rv); + return rv; + } + vol_ref = DFD_GET_CPLD_VOLATGE_CODE_VALUE(vol_ref_tmp); + vol_curr = (vol_curr_tmp * info_ctrl->int_extra2) / vol_ref; + } + *value = vol_curr; + return DFD_RV_OK; +} + +static int dfd_info_get_sensor_value(int key, uint8_t *buf, int buf_len, info_hwmon_buf_f pfun) +{ + int rv, buf_real_len; + int value; + uint8_t buf_tmp[INFO_BUF_MAX_LEN]; + info_ctrl_t *info_ctrl; + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_ERROR, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if ( DFD_CFG_ITEM_ID(key) == DFD_CFG_ITEM_HWMON_IN && info_ctrl->src == INFO_SRC_CPLD) { + + rv = dfd_info_get_cpld_voltage(key, &value); + if(rv < 0) { + DBG_DEBUG(DBG_ERROR, "get cpld voltage failed.key=0x%08x, rv:%d\n", key, rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + DBG_DEBUG(DBG_VERBOSE, "get cpld voltage ok, value:%d\n", value); + mem_clear(buf_tmp, sizeof(buf_tmp)); + snprintf(buf_tmp, sizeof(buf_tmp), "%d\n", value); + buf_real_len = strlen(buf_tmp); + if(buf_len <= buf_real_len) { + DBG_DEBUG(DBG_ERROR, "length not enough.buf_len:%d,need length:%d\n", buf_len, buf_real_len); + return -DFD_RV_DEV_FAIL; + } + if (pfun) { + buf_real_len = buf_len; + rv = pfun(buf_tmp, strlen(buf_tmp), buf, &buf_real_len, info_ctrl); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "deal date error.org value:%s, buf_len:%d, rv=%d\n", + buf_tmp, buf_len, rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + } else { + memcpy(buf, buf_tmp, buf_real_len); + } + return buf_real_len; + } + + DBG_DEBUG(DBG_ERROR, "not support mode. key:0x%08x\n", key); + return -DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_info_get_sensor(uint32_t key, char *buf, int buf_len, info_hwmon_buf_f pfun) +{ + info_ctrl_t *key_info_ctrl; + int rv; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key)) || + (buf == NULL) || buf_len <= 0) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key_path=0x%08x, buf_len:%d.\n", + key, buf_len); + return -DFD_RV_INVALID_VALUE; + } + + key_info_ctrl = dfd_ko_cfg_get_item(key); + if (key_info_ctrl == NULL) { + DBG_DEBUG(DBG_ERROR, "key_path info error, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + mem_clear(buf, buf_len); + + if (key_info_ctrl->mode == INFO_CTRL_MODE_SRT_CONS) { + snprintf(buf, buf_len, "%s\n", key_info_ctrl->str_cons); + DBG_DEBUG(DBG_VERBOSE, "get sensor value through string config, key=0x%08x, value:%s\n", key, buf); + return strlen(buf); + } + + if (key_info_ctrl->mode == INFO_CTRL_MODE_CFG && key_info_ctrl->src == INFO_SRC_FILE) { + DBG_DEBUG(DBG_VERBOSE, "get sensor value through hwmon, key:0x%08x\n", key); + rv = dfd_2key_info_get_buf(key_info_ctrl, buf, buf_len, pfun); + if (rv < 0) { + DBG_DEBUG(DBG_VERBOSE, "get sensor value through hwmon failed, key:0x%08x, rv:%d\n", key, rv); + } + return rv; + } + rv = dfd_info_get_sensor_value(key, buf, buf_len, pfun); + if( rv < 0) { + DBG_DEBUG(DBG_ERROR, "get sensor value failed, key=0x%08x, rv:%d.\n", key, rv); + } + return rv; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c new file mode 100644 index 000000000000..d6fd7e104c9f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c @@ -0,0 +1,82 @@ +#include +#include + +#include "../include/dfd_cfg_listnode.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +void *lnode_find_node(lnode_root_t *root, int key) +{ + lnode_node_t *lnode; + + if (root == NULL){ + return NULL; + } + + list_for_each_entry(lnode, &(root->root), lst) { + if (lnode->key == key) { + return lnode->data; + } + } + + return NULL; +} + +int lnode_insert_node(lnode_root_t *root, int key, void *data) +{ + lnode_node_t *lnode; + void *data_tmp; + + if ((root == NULL) || (data == NULL)) { + return LNODE_RV_INPUT_ERR; + } + + data_tmp = lnode_find_node(root, key); + if (data_tmp != NULL) { + return LNODE_RV_NODE_EXIST; + } + + lnode = kmalloc(sizeof(lnode_node_t), GFP_KERNEL); + if (lnode == NULL) { + return LNODE_RV_NOMEM; + } + + lnode->key = key; + lnode->data = data; + list_add_tail(&(lnode->lst), &(root->root)); + + return LNODE_RV_OK; +} + +int lnode_init_root(lnode_root_t *root) +{ + if (root == NULL) { + return LNODE_RV_INPUT_ERR; + } + + INIT_LIST_HEAD(&(root->root)); + + return LNODE_RV_OK; +} + +void lnode_free_list(lnode_root_t *root) +{ + lnode_node_t *lnode, *lnode_next; + + if (root == NULL){ + return ; + } + + list_for_each_entry_safe(lnode, lnode_next, &(root->root), lst) { + if ( lnode->data ) { + kfree(lnode->data); + lnode->data = NULL; + lnode->key = 0; + } + list_del(&lnode->lst); + kfree(lnode); + lnode = NULL; + } + + return ; + +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c new file mode 100644 index 000000000000..efc322046c07 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c @@ -0,0 +1,170 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define FAN_SIZE (256) + +int g_dfd_fan_dbg_level = 0; +module_param(g_dfd_fan_dbg_level, int, S_IRUGO | S_IWUSR); + +int dfd_get_fan_roll_status(unsigned int fan_index, unsigned int motor_index) +{ + int key, ret; + int status; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_ROLL_STATUS, fan_index, motor_index); + ret = dfd_info_get_int(key, &status, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "get fan roll status error, fan:%d,motor:%d\n", + fan_index, motor_index); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan%u motor%u get fan roll status success, status:%d.\n", + fan_index, motor_index, status); + return status; +} + +int dfd_get_fan_present_status(unsigned int fan_index) +{ + int key, ret; + int status; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_DEV_PRESENT_STATUS, WB_MAIN_DEV_FAN, fan_index); + ret = dfd_info_get_int(key, &status, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan%u get present status error, key:0x%x\n", fan_index, key); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan%u get present status success, status:%d.\n", fan_index, status); + return status; +} + +ssize_t dfd_get_fan_speed(unsigned int fan_index, unsigned int motor_index,unsigned int *speed) +{ + int key, ret, speed_tmp; + + if (speed == NULL) { + DFD_FAN_DEBUG(DBG_ERROR, "param error. fan index:%d, motor index:%d.\n", + fan_index, motor_index); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_SPEED, fan_index, motor_index); + ret = dfd_info_get_int(key, &speed_tmp, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "get fan speed error, key:0x%x,ret:%d\n",key, ret); + return ret; + } + + if (speed_tmp == 0 || speed_tmp == 0xffff) { + *speed = 0; + } else { + *speed = 15000000 / speed_tmp; + } + return DFD_RV_OK; +} + +int dfd_set_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int level) +{ + int key, ret; + + if (level < 0 || level > 0xff) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, can not set fan speed level: %d.\n", + fan_index, motor_index, level); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_RATIO, fan_index, motor_index); + ret = dfd_info_set_int(key, level); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, set fan level 0x%02x error, key:0x%x,ret:%d\n", + fan_index, motor_index, level, key, ret); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, set fan speed level 0x%02x success.\n", + fan_index, motor_index, level); + return DFD_RV_OK; +} + +int dfd_set_fan_pwm(unsigned int fan_index, unsigned int motor_index, int pwm) +{ + int ret, data; + + if (pwm < 0 || pwm > 100) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, can't set pwm: %d.\n", + fan_index, motor_index, pwm); + return -DFD_RV_INVALID_VALUE; + } + + data = pwm * 255 / 100; + ret = dfd_set_fan_speed_level(fan_index, motor_index, data); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, set fan ratio:%d error, ret:%d\n", + fan_index, motor_index, data, ret); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, set fan ratio %d success.\n", + fan_index, motor_index, data); + return DFD_RV_OK; +} + +int dfd_get_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int *level) +{ + int key, ret, speed_level; + + if (level == NULL) { + DFD_FAN_DEBUG(DBG_ERROR, "param error. fan index:%d, motor index:%d.\n", + fan_index, motor_index); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_RATIO, fan_index, motor_index); + ret = dfd_info_get_int(key, &speed_level, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, get fan speed level error, key:0x%x,ret:%d\n", + fan_index, motor_index, key, ret); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, get fan speed level success, value:0x%02x.\n", + fan_index, motor_index, speed_level); + *level = speed_level; + return DFD_RV_OK; +} + +int dfd_get_fan_pwm(unsigned int fan_index, unsigned int motor_index, int *pwm) +{ + int ret, level; + + if (pwm == NULL) { + DFD_FAN_DEBUG(DBG_ERROR, "param error. fan index:%d, motor index:%d.\n", + fan_index, motor_index); + return -DFD_RV_INVALID_VALUE; + } + + ret = dfd_get_fan_speed_level(fan_index, motor_index, &level); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, get fan pwm error, ret:%d\n", + fan_index, motor_index, ret); + return ret; + } + + if ((level * 100) % 255 > 0) { + *pwm = level * 100 / 255 + 1; + } else { + *pwm = level * 100 / 255; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, get fan pwm success, value:%d.\n", + fan_index, motor_index, *pwm); + return DFD_RV_OK; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c new file mode 100644 index 000000000000..9e5b00b795de --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c @@ -0,0 +1,95 @@ +#include + +#include "../dev_sysfs/include/sysfs_common.h" +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_fan_driver.h" +#include "./include/dfd_slot_driver.h" +#include "./include/dfd_sensors_driver.h" +#include "./include/dfd_psu_driver.h" +#include "./include/dfd_sff_driver.h" + +typedef enum dfd_dev_init_fail_s { + DFD_KO_INIT_CPLD_FAIL = 1, + DFD_KO_INIT_FPGA_FAIL = 2, + DFD_KO_INIT_IRQ_FAIL = 3, + DFD_KO_INIT_CFG_FAIL = 4, + DFD_KO_INIT_DATA_FAIL = 5, +} dfd_dev_init_fail_t; + +int g_dfd_dbg_level = 0; + +int dfd_get_dev_number(unsigned int main_dev_id, unsigned int minor_dev_id) +{ + int key,dev_num; + int *p_dev_num; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_DEV_NUM, main_dev_id, minor_dev_id); + p_dev_num = dfd_ko_cfg_get_item(key); + if (p_dev_num == NULL) { + DBG_DEBUG(DBG_ERROR, "get device number failed, key:0x%x\n",key); + return -DFD_RV_DEV_NOTSUPPORT; + } + dev_num = *p_dev_num; + DBG_DEBUG(DBG_VERBOSE, "get device number ok, number:%d\n",dev_num); + return dev_num; +} + +static struct switch_drivers_t switch_drivers= { + .get_dev_number = dfd_get_dev_number, + /* fan */ + .get_fan_speed = dfd_get_fan_speed, + .get_fan_pwm = dfd_get_fan_pwm, + .set_fan_pwm = dfd_set_fan_pwm, + .get_fan_present_status = dfd_get_fan_present_status, + .get_fan_roll_status = dfd_get_fan_roll_status, + .get_fan_speed_level = dfd_get_fan_speed_level, + .set_fan_speed_level = dfd_set_fan_speed_level, + /* slot */ + .get_slot_present_status = dfd_get_slot_present_status, + /* sensors */ + .get_temp_info = dfd_get_temp_info, + .get_voltage_info = dfd_get_voltage_info, + /* psu */ + .get_psu_present_status = dfd_get_psu_present_status, + .get_psu_output_status = dfd_get_psu_output_status, + .get_psu_alert_status = dfd_get_psu_alert_status, + /* sff */ + .get_sff_cpld_info = dfd_get_sff_cpld_info, + .get_sff_dir_name = dfd_get_sff_dir_name, +}; + +struct switch_drivers_t * dfd_plat_driver_get(void) { + return &switch_drivers; +} + +static int32_t __init dfd_dev_init(void) +{ + int ret; + + DBG_DEBUG(DBG_VERBOSE, "Enter.\n"); + + ret = dfd_dev_cfg_init(); + if (ret != 0) { + DBG_DEBUG(DBG_ERROR, "dfd_dev_cfg_init failed ret %d.\n", ret); + ret = -DFD_KO_INIT_CFG_FAIL; + return ret; + } + + DBG_DEBUG(DBG_VERBOSE, "success.\n"); + return 0; +} + +static void __exit dfd_dev_exit(void) +{ + DBG_DEBUG(DBG_VERBOSE, "dfd_dev_exit.\n"); + dfd_dev_cfg_exit(); + return ; +} + +module_init(dfd_dev_init); +module_exit(dfd_dev_exit); +module_param(g_dfd_dbg_level, int, S_IRUGO | S_IWUSR); +EXPORT_SYMBOL(dfd_plat_driver_get); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c new file mode 100644 index 000000000000..55e2e4339ae7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c @@ -0,0 +1,70 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define PSU_SIZE (256) + +typedef enum dfd_psu_status_e { + DFD_PSU_PRESENT_STATUS = 0, + DFD_PSU_OUTPUT_STATUS = 1, + DFD_PSU_ALERT_STATUS = 2, +} dfd_psu_status_t; + +int g_dfd_psu_dbg_level = 0; +module_param(g_dfd_psu_dbg_level, int, S_IRUGO | S_IWUSR); + +int dfd_get_psu_present_status(unsigned int psu_index) +{ + int ret, present_key, present_status; + + present_key = DFD_CFG_KEY(DFD_CFG_ITEM_PSU_STATUS, psu_index, DFD_PSU_PRESENT_STATUS); + ret = dfd_info_get_int(present_key, &present_status, NULL); + if (ret < 0) { + DFD_PSU_DEBUG(DBG_ERROR, "dfd_get_psu_present_status error. psu_index:%d, ret:%d\n", + psu_index, ret); + return ret; + } + + DFD_PSU_DEBUG(DBG_VERBOSE, "dfd_get_psu_present_status success. psu_index:%d, status:%d\n", + psu_index, present_status); + return present_status; +} + +int dfd_get_psu_output_status(unsigned int psu_index) +{ + int ret, output_key, output_status; + + output_key = DFD_CFG_KEY(DFD_CFG_ITEM_PSU_STATUS, psu_index, DFD_PSU_OUTPUT_STATUS); + ret = dfd_info_get_int(output_key, &output_status, NULL); + if (ret < 0) { + DFD_PSU_DEBUG(DBG_ERROR, "dfd_get_psu_output_status error. psu_index:%d, ret:%d\n", + psu_index, ret); + return ret; + } + + DFD_PSU_DEBUG(DBG_VERBOSE, "dfd_get_psu_output_status success. psu_index:%d, status:%d\n", + psu_index, output_status); + return output_status; +} + +int dfd_get_psu_alert_status(unsigned int psu_index) +{ + int ret, alert_key, alert_status; + + alert_key = DFD_CFG_KEY(DFD_CFG_ITEM_PSU_STATUS, psu_index, DFD_PSU_ALERT_STATUS); + ret = dfd_info_get_int(alert_key, &alert_status, NULL); + if (ret < 0) { + DFD_PSU_DEBUG(DBG_ERROR, "dfd_get_psu_alert_status error. psu_index:%d, ret:%d\n", + psu_index, ret); + return ret; + } + + DFD_PSU_DEBUG(DBG_VERBOSE, "dfd_get_psu_alert_status success. psu_index:%d, status:%d\n", + psu_index, alert_status); + return alert_status; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c new file mode 100644 index 000000000000..bfca20290efb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c @@ -0,0 +1,149 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "./include/dfd_cfg_file.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define DFD_GET_TEMP_SENSOR_KEY1(dev_index, temp_index) \ + (((dev_index & 0xff) << 8) | (temp_index & 0xff)) +#define DFD_GET_TEMP_SENSOR_KEY2(main_dev_id, temp_type) \ + (((main_dev_id & 0x0f) << 4) | (temp_type & 0x0f)) +#define DFD_FORMAT_STR_MAX_LEN (32) + +int g_dfd_sensor_dbg_level = 0; +module_param(g_dfd_sensor_dbg_level, int, S_IRUGO | S_IWUSR); + +static int dfd_deal_hwmon_buf(uint8_t *buf, int buf_len, uint8_t *buf_new, int *buf_len_new, info_ctrl_t *info_ctrl) +{ + int i, tmp_len; + int exp, decimal, divisor; + int org_value, tmp_value; + int div_result, div_mod; + char fmt_str[DFD_FORMAT_STR_MAX_LEN]; + + exp = info_ctrl->int_cons; + decimal = info_ctrl->bit_offset; + + if (exp <= 0) { + DBG_DEBUG(DBG_VERBOSE, "exponent %d, don't need transform. buf_len:%d, buf_len_new:%d\n", + exp, buf_len, *buf_len_new); + snprintf(buf_new, *buf_len_new, "%s", buf); + *buf_len_new = strlen(buf_new); + return DFD_RV_OK; + } + divisor = 1; + for (i = 0; i < exp; i++) { + divisor *= 10; + } + org_value = simple_strtol(buf, NULL, 10); + if (org_value < 0) { + tmp_value = 0 - org_value; + } else { + tmp_value = org_value; + } + div_result = tmp_value / divisor; + div_mod = tmp_value % divisor; + DBG_DEBUG(DBG_VERBOSE, "exp:%d, decimal:%d, original value:%d, divisor:%d, result :%d, mod:%d\n", + exp, decimal, org_value, divisor, div_result, div_mod); + + mem_clear(fmt_str, sizeof(fmt_str)); + if (org_value < 0) { + snprintf(fmt_str, sizeof(fmt_str), "-%%d.%%0%dd\n",exp); + } else { + snprintf(fmt_str, sizeof(fmt_str), "%%d.%%0%dd\n",exp); + } + DBG_DEBUG(DBG_VERBOSE, "format string:%s",fmt_str); + snprintf(buf_new, *buf_len_new, fmt_str, div_result, div_mod); + *buf_len_new = strlen(buf_new); + tmp_len = *buf_len_new; + + if ( decimal > 0) { + for(i = 0; i < *buf_len_new; i++) { + if (buf_new[i] == '.') { + if( i + decimal + 2 <= *buf_len_new ) { + buf_new[i + decimal + 1 ] = '\n'; + buf_new[i + decimal + 2 ] = '\0'; + *buf_len_new = strlen(buf_new); + DBG_DEBUG(DBG_VERBOSE, "deal decimal[%d] ok, str len:%d, value:%s\n", + decimal, *buf_len_new, buf_new); + } + break; + } + } + if (tmp_len == *buf_len_new) { + DBG_DEBUG(DBG_WARN, "deal decimal[%d] failed, use original value:%s\n", decimal, buf_new); + } + } + return DFD_RV_OK; +} + +static int dfd_get_sensor_info(uint8_t main_dev_id, uint8_t dev_index, uint8_t sensor_type, + uint8_t sensor_index, uint8_t sensor_attr, char *buf) +{ + uint32_t key; + uint16_t key_index1; + uint8_t key_index2; + int rv; + info_hwmon_buf_f pfunc; + + key_index1 = DFD_GET_TEMP_SENSOR_KEY1(dev_index, sensor_index); + key_index2 = DFD_GET_TEMP_SENSOR_KEY2(main_dev_id, sensor_attr); + if (sensor_type == WB_MINOR_DEV_TEMP ) { + key = DFD_CFG_KEY(DFD_CFG_ITEM_HWMON_TEMP, key_index1, key_index2); + } else if (sensor_type == WB_MINOR_DEV_IN) { + key = DFD_CFG_KEY(DFD_CFG_ITEM_HWMON_IN, key_index1, key_index2); + } else { + DFD_SENSOR_DEBUG(DBG_ERROR, "unknow sensor type:%d.\n",sensor_type); + return -DFD_RV_INVALID_VALUE; + } + + DFD_SENSOR_DEBUG(DBG_VERBOSE, "get sensor info.main_dev_id:%d, dev_index:0x%x, sensor_index:0x%x, sensor_attr:0x%x, key:0x%x,\n", + main_dev_id, dev_index, sensor_index, sensor_attr, key); + + pfunc = dfd_deal_hwmon_buf; + mem_clear(buf, PAGE_SIZE); + rv = dfd_info_get_sensor(key, buf, PAGE_SIZE, pfunc); + return rv; +} + +ssize_t dfd_get_temp_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t temp_index, uint8_t temp_attr, char *buf) +{ + int rv; + + if (buf == NULL) { + DFD_SENSOR_DEBUG(DBG_ERROR, "param error. buf is NULL.\n"); + return -DFD_RV_INVALID_VALUE; + } + + rv = dfd_get_sensor_info(main_dev_id, dev_index, WB_MINOR_DEV_TEMP, temp_index, temp_attr, buf); + if (rv < 0) { + DFD_SENSOR_DEBUG(DBG_ERROR, "get temp info error. rv:%d\n", rv); + } else { + DFD_SENSOR_DEBUG(DBG_VERBOSE, "get temp info ok.value:%s\n", buf); + } + return rv; +} + +ssize_t dfd_get_voltage_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t in_index, uint8_t in_attr, char *buf) +{ + int rv; + + if (buf == NULL) { + DFD_SENSOR_DEBUG(DBG_ERROR, "param error. buf is NULL.\n"); + return -DFD_RV_INVALID_VALUE; + } + + rv = dfd_get_sensor_info(main_dev_id, dev_index, WB_MINOR_DEV_IN, in_index, in_attr, buf); + if (rv < 0) { + DFD_SENSOR_DEBUG(DBG_ERROR, "get voltage info error. rv:%d\n", rv); + } else { + DFD_SENSOR_DEBUG(DBG_VERBOSE, "get voltage info ok.value:%s\n", buf); + } + return rv; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c new file mode 100644 index 000000000000..5c1faff975b1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c @@ -0,0 +1,56 @@ +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_info.h" +#include "./include/dfd_cfg_adapter.h" +#include "../dev_sysfs/include/sysfs_common.h" + +int g_dfd_sff_dbg_level = 0; +module_param(g_dfd_sff_dbg_level, int, S_IRUGO | S_IWUSR); + +ssize_t dfd_get_sff_cpld_info(unsigned int sff_index, int cpld_reg_type, char *buf, int len) +{ + int key, ret, value; + + if(buf == NULL) { + DFD_SFF_DEBUG(DBG_ERROR, "param error, buf is NULL. sff_index:%d, cpld_reg_type:%d.\n", + sff_index, cpld_reg_type); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_SFF_CPLD_REG, sff_index, cpld_reg_type); + ret = dfd_info_get_int(key, &value, NULL); + if (ret < 0) { + DFD_SFF_DEBUG(DBG_ERROR, "get sff cpld reg error, key:0x%x,ret:%d.\n", key, ret); + return ret; + } + + mem_clear(buf, len); + return (ssize_t)snprintf(buf, len, "%d\n", value); +} + +ssize_t dfd_get_sff_dir_name(unsigned int sff_index, char *buf, int buf_len) +{ + int key; + char *sff_dir_name; + + if (buf == NULL) { + DFD_SFF_DEBUG(DBG_ERROR, "param error. buf is NULL.sff index:%d", sff_index); + return -DFD_RV_INVALID_VALUE; + } + + mem_clear(buf, buf_len); + + key = DFD_CFG_KEY(DFD_CFG_ITEM_SFF_DIR_NAME, sff_index, 0); + sff_dir_name = dfd_ko_cfg_get_item(key); + if (sff_dir_name == NULL) { + DFD_SFF_DEBUG(DBG_ERROR, "sff dir name config error, key=0x%08x\n", key); + return -DFD_RV_NODE_FAIL; + } + + DFD_SFF_DEBUG(DBG_VERBOSE, "%s\n", sff_dir_name); + snprintf(buf, buf_len, "%s", sff_dir_name); + return strlen(buf); + +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c new file mode 100644 index 000000000000..69c82adabef0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c @@ -0,0 +1,27 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define SLOT_SIZE (256) + +int g_dfd_slot_dbg_level = 0; +module_param(g_dfd_slot_dbg_level, int, S_IRUGO | S_IWUSR); + +int dfd_get_slot_present_status(unsigned int slot_index) +{ + int key, ret; + int status; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_DEV_PRESENT_STATUS, WB_MAIN_DEV_SLOT, slot_index); + ret = dfd_info_get_int(key, &status, NULL); + if (ret < 0) { + DFD_SLOT_DEBUG(DBG_ERROR, "get slot status error, key:0x%x\n",key); + return ret; + } + return status; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h new file mode 100644 index 000000000000..062654d01504 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h @@ -0,0 +1,97 @@ +#ifndef __DFD_CFG_H__ +#define __DFD_CFG_H__ + +#include + +#define DFD_KO_CFG_FILE_NAME "/etc/plat_sysfs_cfg/cfg_file_name" +#define DFD_KO_CFG_FILE_DIR "/etc/plat_sysfs_cfg/" +#define DFD_PUB_CARDTYPE_FILE "/sys/module/platform_common/parameters/dfd_my_type" + +#define DFD_CFG_CMDLINE_MAX_LEN (256) +#define DFD_CFG_NAME_MAX_LEN (256) +#define DFD_CFG_VALUE_MAX_LEN (256) +#define DFD_CFG_STR_MAX_LEN (64) +#define DFD_CFG_CPLD_NUM_MAX (16) +#define DFD_PRODUCT_ID_LENGTH (8) +#define DFD_PID_BUF_LEN (32) +#define DFD_TEMP_NAME_BUF_LEN (32) + +#define DFD_CFG_EMPTY_VALUE (-1) +#define DFD_CFG_INVALID_VALUE (0) + +#define DFD_CFG_KEY(item, index1, index2) \ + ((((item) & 0xff) << 24) | (((index1) & 0xffff) << 8) | ((index2) & 0xff)) +#define DFD_CFG_ITEM_ID(key) (((key) >> 24) & 0xff) +#define DFD_CFG_INDEX1(key) (((key) >> 8) & 0xffff) +#define DFD_CFG_INDEX2(key) ((key)& 0xff) + +#define INDEX_NOT_EXIST (-1) +#define INDEX1_MAX (0xffff) +#define INDEX2_MAX (0xff) + +#define DFD_CFG_ITEM_ALL \ + DFD_CFG_ITEM(DFD_CFG_ITEM_NONE, "none", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_DEV_NUM, "dev_num", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_CPLD_LPC_DEV, "cpld_lpc_dev", INDEX1_MAX, DFD_CFG_CPLD_NUM_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_INT_END, "end_int", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + \ + DFD_CFG_ITEM(DFD_CFG_ITEM_CPLD_MODE, "mode_cpld", INDEX1_MAX, DFD_CFG_CPLD_NUM_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_SFF_DIR_NAME, "sff_dir_name", INDEX1_MAX, INDEX_NOT_EXIST) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_STRING_END, "end_string", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + \ + DFD_CFG_ITEM(DFD_CFG_ITEM_CPLD_I2C_DEV, "cpld_i2c_dev", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_OTHER_I2C_DEV, "other_i2c_dev", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_I2C_DEV_END, "end_i2c_dev", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + \ + DFD_CFG_ITEM(DFD_CFG_ITEM_FAN_ROLL_STATUS, "fan_roll_status", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_FAN_SPEED, "fan_speed", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_FAN_RATIO, "fan_ratio", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_DEV_PRESENT_STATUS, "dev_present_status", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_PSU_STATUS, "psu_status", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_HWMON_TEMP, "hwmon_temp", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_HWMON_IN, "hwmon_in", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_SFF_CPLD_REG, "sff_cpld_reg", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_INFO_CTRL_END, "end_info_ctrl", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + +#ifdef DFD_CFG_ITEM +#undef DFD_CFG_ITEM +#endif +#define DFD_CFG_ITEM(_id, _name, _index_min, _index_max) _id, +typedef enum dfd_cfg_item_id_s { + DFD_CFG_ITEM_ALL +} dfd_cfg_item_id_t; + +#define DFD_CFG_ITEM_IS_INT(item_id) \ + (((item_id) > DFD_CFG_ITEM_NONE) && ((item_id) < DFD_CFG_ITEM_INT_END)) + +#define DFD_CFG_ITEM_IS_STRING(item_id) \ + (((item_id) > DFD_CFG_ITEM_INT_END) && ((item_id) < DFD_CFG_ITEM_STRING_END)) + +#define DFD_CFG_ITEM_IS_I2C_DEV(item_id) \ + (((item_id) > DFD_CFG_ITEM_STRING_END) && ((item_id) < DFD_CFG_ITEM_I2C_DEV_END)) + +#define DFD_CFG_ITEM_IS_INFO_CTRL(item_id) \ + (((item_id) > DFD_CFG_ITEM_I2C_DEV_END) && ((item_id) < DFD_CFG_ITEM_INFO_CTRL_END)) + +typedef struct index_range_s { + int index1_max; + int index2_max; +} index_range_t; + +typedef struct val_convert_node_s { + struct list_head lst; + int int_val; + char str_val[DFD_CFG_STR_MAX_LEN]; + int index1; + int index2; +} val_convert_node_t; + +void *dfd_ko_cfg_get_item(int key); + +void dfd_ko_cfg_show_item(int key); + +int32_t dfd_dev_cfg_init(void); + +void dfd_dev_cfg_exit(void); + +#endif /* __DFD_CFG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h new file mode 100644 index 000000000000..70d8b536c437 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h @@ -0,0 +1,46 @@ +#ifndef __DFD_CFG_ADAPTER_H__ +#define __DFD_CFG_ADAPTER_H__ + +#define DFD_KO_CPLD_I2C_RETRY_SLEEP (10) /* ms */ +#define DFD_KO_CPLD_I2C_RETRY_TIMES (50 / DFD_KO_CPLD_I2C_RETRY_SLEEP) + +#define DFD_KO_CPLD_GET_SLOT(addr) ((addr >> 24) & 0xff) +#define DFD_KO_CPLD_GET_ID(addr) ((addr >> 16) & 0xff) +#define DFD_KO_CPLD_GET_INDEX(addr) (addr & 0xffff) +#define DFD_KO_CPLD_MODE_I2C_STRING "i2c" +#define DFD_KO_CPLD_MODE_LPC_STRING "lpc" + +typedef struct dfd_i2c_dev_s { + int bus; + int addr; +} dfd_i2c_dev_t; + +typedef enum dfd_i2c_dev_mem_s { + DFD_I2C_DEV_MEM_BUS, + DFD_I2C_DEV_MEM_ADDR, + DFD_I2C_DEV_MEM_END +} dfd_i2c_dev_mem_t; + +typedef enum cpld_mode_e { + DFD_CPLD_MODE_I2C, + DFD_CPLD_MODE_LPC, +} cpld_mode_t; + +typedef enum i2c_mode_e { + DFD_I2C_MODE_NORMAL_I2C, + DFD_I2C_MODE_SMBUS, +} i2c_mode_t; + +extern char *g_dfd_i2c_dev_mem_str[DFD_I2C_DEV_MEM_END]; + +int32_t dfd_ko_cpld_read(int32_t addr, uint8_t *buf); + +int32_t dfd_ko_cpld_write(int32_t addr, uint8_t val); + +int32_t dfd_ko_i2c_read(int bus, int addr, int offset, uint8_t *buf, uint32_t size); + +int32_t dfd_ko_i2c_write(int bus, int addr, int offset, uint8_t *buf, uint32_t size); + +int32_t dfd_ko_read_file(char *fpath, int32_t addr, uint8_t *val, int32_t read_bytes); + +#endif /* __DFD_CFG_ADAPTER_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h new file mode 100644 index 000000000000..50d7a42d5564 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h @@ -0,0 +1,37 @@ +#ifndef __DFD_CFG_FILE_H__ +#define __DFD_CFG_FILE_H__ + +#include + +#define KFILE_RV_OK (0) +#define KFILE_RV_INPUT_ERR (-1) +#define KFILE_RV_STAT_FAIL (-2) +#define KFILE_RV_OPEN_FAIL (-3) +#define KFILE_RV_MALLOC_FAIL (-4) +#define KFILE_RV_RD_FAIL (-5) +#define KFILE_RV_ADDR_ERR (-6) +#define KFILE_RV_WR_FAIL (-7) + +#define IS_CR(c) ((c) == '\n') + +typedef struct kfile_ctrl_s { + int32_t size; + int32_t pos; + char *buf; +} kfile_ctrl_t; + +int kfile_open(char *fname, kfile_ctrl_t *kfile_ctrl); + +void kfile_close(kfile_ctrl_t *kfile_ctrl); + +int kfile_gets(char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl); + +int kfile_read(int32_t addr, char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl); + +int kfile_iterate_dir(const char *dir_path, const char *obj_name, char *match_name, int len); + +#if 0 + +int kfile_write(char *fpath, int32_t addr, char *buf, int buf_size); +#endif +#endif /* __DFD_CFG_FILE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h new file mode 100644 index 000000000000..dc1ed17651b9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h @@ -0,0 +1,109 @@ +#ifndef __DFD_CFG_INFO_H__ +#define __DFD_CFG_INFO_H__ + +#include + +typedef int (*info_num_buf_to_value_f)(uint8_t *num_buf, int buf_len, int *num_val); + +typedef int (*info_buf_to_buf_f)(uint8_t *buf, int buf_len, uint8_t *buf_new, int *buf_len_new); + +#define IS_INFO_FRMT_BIT(frmt) ((frmt) == INFO_FRMT_BIT) +#define IS_INFO_FRMT_BYTE(frmt) (((frmt) == INFO_FRMT_BYTE) || ((frmt) == INFO_FRMT_NUM_BYTES)) +#define IS_INFO_FRMT_NUM_STR(frmt) ((frmt) == INFO_FRMT_NUM_STR) +#define IS_INFO_FRMT_NUM_BUF(frmt) ((frmt) == INFO_FRMT_NUM_BUF) +#define IS_INFO_FRMT_BUF(frmt) ((frmt) == INFO_FRMT_BUF) + +#define INFO_INT_MAX_LEN (32) +#define INFO_INT_LEN_VALAID(len) (((len) > 0) && ((len) < INFO_INT_MAX_LEN)) + +#define INFO_BUF_MAX_LEN (128) +#define INFO_BUF_LEN_VALAID(len) (((len) > 0) && ((len) < INFO_BUF_MAX_LEN)) + +#define INFO_BIT_OFFSET_VALID(bit_offset) (((bit_offset) >= 0) && ((bit_offset) < 8)) + +typedef enum info_ctrl_mode_e { + INFO_CTRL_MODE_NONE, + INFO_CTRL_MODE_CFG, + INFO_CTRL_MODE_CONS, + INFO_CTRL_MODE_TLV, + INFO_CTRL_MODE_SRT_CONS, + INFO_CTRL_MODE_END +} info_ctrl_mode_t; + +typedef enum info_frmt_e { + INFO_FRMT_NONE, + INFO_FRMT_BIT, + INFO_FRMT_BYTE, + INFO_FRMT_NUM_BYTES, + INFO_FRMT_NUM_STR, + INFO_FRMT_NUM_BUF, + INFO_FRMT_BUF, + INFO_FRMT_END +} info_frmt_t; + +typedef enum info_src_e { + INFO_SRC_NONE, + INFO_SRC_CPLD, + INFO_SRC_FPGA, + INFO_SRC_OTHER_I2C, + INFO_SRC_FILE, + INFO_SRC_END +} info_src_t; + +typedef enum info_pola_e { + INFO_POLA_NONE, + INFO_POLA_POSI, + INFO_POLA_NEGA, + INFO_POLA_END +} info_pola_t; + +#define INFO_FPATH_MAX_LEN (128) +#define INFO_STR_CONS_MAX_LEN (64) +typedef struct info_ctrl_s { + info_ctrl_mode_t mode; + int32_t int_cons; + info_src_t src; + info_frmt_t frmt; + info_pola_t pola; + char fpath[INFO_FPATH_MAX_LEN]; + int32_t addr; + int32_t len; + int32_t bit_offset; + char str_cons[INFO_STR_CONS_MAX_LEN]; + int32_t int_extra1; + int32_t int_extra2; +} info_ctrl_t; + +typedef enum info_ctrl_mem_s { + INFO_CTRL_MEM_MODE, + INFO_CTRL_MEM_INT_CONS, + INFO_CTRL_MEM_SRC, + INFO_CTRL_MEM_FRMT, + INFO_CTRL_MEM_POLA, + INFO_CTRL_MEM_FPATH, + INFO_CTRL_MEM_ADDR, + INFO_CTRL_MEM_LEN, + INFO_CTRL_MEM_BIT_OFFSET, + INFO_CTRL_MEM_STR_CONS, + INFO_CTRL_MEM_INT_EXTRA1, + INFO_CTRL_MEM_INT_EXTRA2, + INFO_CTRL_MEM_END +} info_ctrl_mem_t; + +typedef int (*info_hwmon_buf_f)(uint8_t *buf, int buf_len, uint8_t *buf_new, int *buf_len_new, info_ctrl_t *info_ctrl); + +extern char *g_info_ctrl_mem_str[INFO_CTRL_MEM_END]; +extern char *g_info_src_str[INFO_SRC_END]; +extern char *g_info_frmt_str[INFO_FRMT_END]; +extern char *g_info_pola_str[INFO_POLA_END]; +extern char *g_info_ctrl_mode_str[INFO_CTRL_MODE_END]; + +int dfd_info_get_int(int key, int *ret, info_num_buf_to_value_f pfun); + +int dfd_info_get_buf(int key, uint8_t *buf, int buf_len, info_buf_to_buf_f pfun); + +int dfd_info_set_int(int key, int val); + +int dfd_info_get_sensor(uint32_t key, char *buf, int buf_len, info_hwmon_buf_f pfun); + +#endif /* __DFD_CFG_INFO_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h new file mode 100644 index 000000000000..955dfa96e42e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h @@ -0,0 +1,30 @@ +#ifndef __DFD_CFG_LISTNODE_H__ +#define __DFD_CFG_LISTNODE_H__ + +#include + +#define LNODE_RV_OK (0) +#define LNODE_RV_INPUT_ERR (-1) +#define LNODE_RV_NODE_EXIST (-2) +#define LNODE_RV_NOMEM (-3) + +typedef struct lnode_root_s { + struct list_head root; +} lnode_root_t; + +typedef struct lnode_node_s { + struct list_head lst; + + int key; + void *data; +} lnode_node_t; + +void *lnode_find_node(lnode_root_t *root, int key); + +int lnode_insert_node(lnode_root_t *root, int key, void *data); + +int lnode_init_root(lnode_root_t *root); + +void lnode_free_list(lnode_root_t *root); + +#endif /* __DFD_CFG_LISTNODE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h new file mode 100644 index 000000000000..1065fd9eed3f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h @@ -0,0 +1,18 @@ +#ifndef _DFD_FAN_DRIVER_H_ +#define _DFD_FAN_DRIVER_H_ + +ssize_t dfd_get_fan_speed(unsigned int fan_index, unsigned int motor_index,unsigned int *speed); + +int dfd_set_fan_pwm(unsigned int fan_index, unsigned int motor_index, int pwm); + +int dfd_get_fan_pwm(unsigned int fan_index, unsigned int motor_index, int *pwm); + +int dfd_get_fan_present_status(unsigned int fan_index); + +int dfd_get_fan_roll_status(unsigned int fan_index, unsigned int motor_index); + +int dfd_get_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int *level); + +int dfd_set_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int level); + +#endif /* _DFD_FAN_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h new file mode 100644 index 000000000000..a547255cf3ab --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h @@ -0,0 +1,96 @@ +#ifndef __DFD_MODULE_H__ +#define __DFD_MODULE_H__ + +typedef enum dfd_rv_s { + DFD_RV_OK = 0, + DFD_RV_INIT_ERR = 1, + DFD_RV_SLOT_INVALID = 2, + DFD_RV_MODE_INVALID = 3, + DFD_RV_MODE_NOTSUPPORT = 4, + DFD_RV_TYPE_ERR = 5, + DFD_RV_DEV_NOTSUPPORT = 6, + DFD_RV_DEV_FAIL = 7, + DFD_RV_INDEX_INVALID = 8, + DFD_RV_NO_INTF = 9, + DFD_RV_NO_NODE = 10, + DFD_RV_NODE_FAIL = 11, + DFD_RV_INVALID_VALUE = 12, + DFD_RV_NO_MEMORY = 13, +} dfd_rv_t; + +typedef enum { + DBG_VERBOSE = 0x01, + DBG_WARN = 0x02, + DBG_ERROR = 0x04, +} dbg_level_t; + +extern int g_dfd_dbg_level; +extern int g_dfd_fan_dbg_level; +extern int g_dfd_slot_dbg_level; +extern int g_dfd_sensor_dbg_level; +extern int g_dfd_psu_dbg_level; +extern int g_dfd_sff_dbg_level; + +#define DBG_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_FAN_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_fan_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_SLOT_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_slot_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_SENSOR_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_sensor_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_PSU_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_psu_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_SFF_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_sff_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +int dfd_get_dev_number(unsigned int main_dev_id, unsigned int minor_dev_id); + +#endif /* __DFD_MODULE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h new file mode 100644 index 000000000000..ce7199660557 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h @@ -0,0 +1,10 @@ +#ifndef _DFD_PSU_DRIVER_H_ +#define _DFD_PSU_DRIVER_H_ + +int dfd_get_psu_present_status(unsigned int psu_index); + +int dfd_get_psu_output_status(unsigned int psu_index); + +int dfd_get_psu_alert_status(unsigned int psu_index); + +#endif /* _DFD_PSU_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h new file mode 100644 index 000000000000..16733b26029f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h @@ -0,0 +1,10 @@ +#ifndef _DFD_SENSORS_DRIVER_H_ +#define _DFD_SENSORS_DRIVER_H_ + +ssize_t dfd_get_temp_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t temp_index, uint8_t temp_attr, char *buf); + +ssize_t dfd_get_voltage_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t in_index, uint8_t in_attr, char *buf); + +#endif /* _DFD_SENSORS_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h new file mode 100644 index 000000000000..7107b72ee4b2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h @@ -0,0 +1,8 @@ +#ifndef _DFD_SFF_DRIVER_H_ +#define _DFD_SFF_DRIVER_H_ + +ssize_t dfd_get_sff_cpld_info(unsigned int sff_index, int cpld_reg_type, char *buf, int len); + +ssize_t dfd_get_sff_dir_name(unsigned int sff_index, char *buf, int buf_len); + +#endif /* _DFD_SFF_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h new file mode 100644 index 000000000000..c68caecd2e66 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h @@ -0,0 +1,6 @@ +#ifndef _DFD_SLOT_DRIVER_H_ +#define _DFD_SLOT_DRIVER_H_ + +int dfd_get_slot_present_status(unsigned int slot_index); + +#endif /* _DFD_SLOT_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile new file mode 100644 index 000000000000..1a1044bb1fe8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile @@ -0,0 +1,21 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +KBUILD_EXTRA_SYMBOLS += $(PLAT_SYSFS_DIR)/dev_cfg/Module.symvers + +obj-m := plat_switch.o +obj-m += plat_fan.o +obj-m += plat_psu.o +obj-m += plat_sff.o +obj-m += plat_sensor.o +obj-m += plat_slot.o + +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd $(PWD)/*.mod + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h new file mode 100644 index 000000000000..bbd813e87114 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h @@ -0,0 +1,86 @@ +#ifndef _PLAT_SWITCH_H_ +#define _PLAT_SWITCH_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +enum LOG_LEVEL{ + INFO = 0x1, + ERR = 0x2, + DBG = 0x4, + ALL = 0xf +}; + +#define LOG_INFO(_prefix, fmt, args...) \ + do { \ + if (g_loglevel & INFO) \ + { \ + printk( KERN_INFO _prefix "%s "fmt, __FUNCTION__, ##args); \ + } \ + } while (0) + +#define LOG_ERR(_prefix, fmt, args...) \ + do { \ + if (g_loglevel & ERR) \ + { \ + printk( KERN_ERR _prefix "%s "fmt, __FUNCTION__, ##args); \ + } \ + } while (0) + +#define LOG_DBG(_prefix, fmt, args...) \ + do { \ + if (g_loglevel & DBG) \ + { \ + printk( KERN_DEBUG _prefix "%s "fmt, __FUNCTION__, ##args); \ + } \ + } while (0) + +#define check_pfun(p) \ + do { \ + if (p == NULL) { \ + printk( KERN_ERR "%s, %s = NULL.\n", __FUNCTION__, #p); \ + return -ENOSYS; \ + } \ + }while(0) + +#define check_p(p) check_pfun(p) + +#define to_switch_obj(x) container_of(x, struct switch_obj, kobj) +#define to_switch_attr(x) container_of(x, struct switch_attribute, attr) +#define to_switch_device_attr(x) container_of(x, struct switch_device_attribute, switch_attr) + +#define SWITCH_ATTR(_name, _mode, _show, _store, _type) \ + { .switch_attr = __ATTR(_name, _mode, _show, _store), \ + .type = _type } + +#define SWITCH_DEVICE_ATTR(_name, _mode, _show, _store, _type) \ +struct switch_device_attribute switch_dev_attr_##_name \ + = SWITCH_ATTR(_name, _mode, _show, _store, _type) + +struct switch_obj { + struct kobject kobj; + unsigned int index; +}; + +/* a custom attribute that works just for a struct switch_obj. */ +struct switch_attribute { + struct attribute attr; + ssize_t (*show)(struct switch_obj *foo, struct switch_attribute *attr, char *buf); + ssize_t (*store)(struct switch_obj *foo, struct switch_attribute *attr, const char *buf, size_t count); +}; + +struct switch_device_attribute { + struct switch_attribute switch_attr; + int type; +}; + +extern struct switch_obj *wb_plat_kobject_create(const char *name, struct kobject *parent); +extern void wb_plat_kobject_delete(struct switch_obj **obj); + +#endif /* _PLAT_SWITCH_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h new file mode 100644 index 000000000000..5b73731e1fbf --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h @@ -0,0 +1,90 @@ +#ifndef _SYSFS_COMMON_H_ +#define _SYSFS_COMMON_H_ + +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define DIR_NAME_MAX_LEN (64) + +#define WB_SYSFS_DEV_ERROR "NA" +/* sysfs directory name */ +#define FAN_SYSFS_NAME "fan" +#define PSU_SYSFS_NAME "psu" +#define SLOT_SYSFS_NAME "slot" +#define VOLTAGE_SYSFS_NAME "in" +#define TEMP_SYSFS_NAME "temp" +#define SFF_SYSFS_NAME "sff" + +typedef enum wb_main_dev_type_e { + WB_MAIN_DEV_MAINBOARD = 0, + WB_MAIN_DEV_FAN = 1, + WB_MAIN_DEV_PSU = 2, + WB_MAIN_DEV_SFF = 3, + WB_MAIN_DEV_CPLD = 4, + WB_MAIN_DEV_SLOT = 5, +} wb_main_dev_type_t; + +typedef enum wb_minor_dev_type_e { + WB_MINOR_DEV_NONE = 0, /* None */ + WB_MINOR_DEV_TEMP = 1, + WB_MINOR_DEV_IN = 2, + WB_MINOR_DEV_CURR = 3, + WB_MINOR_DEV_POWER = 4, + WB_MINOR_DEV_MOTOR = 5, + WB_MINOR_DEV_PSU = 6, +} wb_minor_dev_type_t; + +typedef enum wb_sensor_type_e { + WB_SENSOR_INPUT = 0, + WB_SENSOR_ALIAS = 1, + WB_SENSOR_TYPE = 2, + WB_SENSOR_MAX = 3, + WB_SENSOR_MAX_HYST = 4, + WB_SENSOR_MIN = 5, + WB_SENSOR_CRIT = 6, +} wb_sensor_type_t; + +typedef enum wb_sff_cpld_attr_e { + WB_SFF_POWER_ON = 0x01, + WB_SFF_TX_FAULT, + WB_SFF_TX_DIS, + WB_SFF_PRE_N, + WB_SFF_RX_LOS, + WB_SFF_RESET, + WB_SFF_LPMODE, + WB_SFF_MODULE_PRESENT, + WB_SFF_INTERRUPT, +} wb_sff_cpld_attr_t; + +struct switch_drivers_t{ + /* device */ + int (*get_dev_number) (unsigned int main_dev_id, unsigned int minor_dev_id); + /* fan */ + int (*get_fan_number) (void); + ssize_t (*get_fan_speed) (unsigned int fan_index, unsigned int motor_index, unsigned int *speed); + int (*get_fan_pwm) (unsigned int fan_index, unsigned int motor_index, int *pwm); + int (*set_fan_pwm) (unsigned int fan_index, unsigned int motor_index, int pwm); + int (*get_fan_present_status)(unsigned int fan_index); + int (*get_fan_roll_status)(unsigned int fan_index, unsigned int motor_index); + int (*get_fan_speed_level)(unsigned int fan_index, unsigned int motor_index, int *level); + int (*set_fan_speed_level)(unsigned int fan_index, unsigned int motor_index, int level); + /* slot */ + int (*get_slot_present_status) (unsigned int slot_index); + /* sensors */ + ssize_t (*get_temp_info)( uint8_t main_dev_id, uint8_t dev_index, + uint8_t temp_index, uint8_t temp_attr, char *buf); + ssize_t (*get_voltage_info)( uint8_t main_dev_id, uint8_t dev_index, + uint8_t in_index, uint8_t in_attr, char *buf); + /* psu */ + int (*get_psu_present_status)(unsigned int psu_index); + int (*get_psu_output_status)(unsigned int psu_index); + int (*get_psu_alert_status)(unsigned int psu_index); + /* sff */ + ssize_t (*get_sff_cpld_info)( unsigned int sff_index, int cpld_reg_type, char *buf, int len); + ssize_t (*get_sff_dir_name)(unsigned int sff_index, char *buf, int buf_len); +}; + +extern struct switch_drivers_t * dfd_plat_driver_get(void); + +#endif /*_SYSFS_COMMON_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c new file mode 100644 index 000000000000..d841f2547b6f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c @@ -0,0 +1,505 @@ +/* + * plat_fan.c + * Original Author: support 2020-02-17 + * + * This module create fan kobjects and attributes in /sys/wb_plat/fan + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define FAN_INFO(fmt, args...) LOG_INFO("fan: ", fmt, ##args) +#define FAN_ERR(fmt, args...) LOG_ERR("fan: ", fmt, ##args) +#define FAN_DBG(fmt, args...) LOG_DBG("fan: ", fmt, ##args) + +struct motor_obj_t{ + struct switch_obj *obj; +}; + +struct fan_obj_t{ + unsigned int motor_number; + struct motor_obj_t *motor; + struct switch_obj *obj; +}; + +struct fan_t{ + unsigned int fan_number; + struct fan_obj_t *fan; +}; + +static int g_loglevel = 0; +static struct fan_t g_fan; +static struct switch_obj *g_fan_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t fan_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_fan.fan_number); +} + +static ssize_t fan_motor_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int index; + + index = obj->index; + FAN_DBG("fan_motor_number_show,fan index:%d\n",index); + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_fan.fan[index-1].motor_number); +} + +static ssize_t fan_roll_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index, motor_index; + struct switch_obj *p_obj; + int ret; + + check_p(g_drv); + check_p(g_drv->get_fan_roll_status); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + fan_index = p_obj->index; + motor_index = obj->index; + + ret = g_drv->get_fan_roll_status(fan_index, motor_index); + if (ret < 0 ) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t fan_present_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index; + int ret; + + fan_index = obj->index; + FAN_DBG("fan_present_status_show, fan index:%d\n",fan_index); + check_p(g_drv); + check_p(g_drv->get_fan_present_status); + + ret = g_drv->get_fan_present_status(fan_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t fan_speed_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index, motor_index, speed; + int ret; + struct switch_obj *p_obj; + + check_p(g_drv); + check_p(g_drv->get_fan_speed); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + fan_index = p_obj->index; + motor_index = obj->index; + + ret = g_drv->get_fan_speed(fan_index, motor_index, &speed); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", speed); +} + +static ssize_t fan_motor_ratio_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index, motor_index; + struct switch_obj *p_obj; + int ret, pwm; + + check_p(g_drv); + check_p(g_drv->get_fan_pwm); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + fan_index = p_obj->index; + motor_index = obj->index; + ret = g_drv->get_fan_pwm(fan_index, motor_index, &pwm); + + if (ret < 0 ) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", pwm); +} + +static ssize_t fan_motor_ratio_store(struct switch_obj *obj, struct switch_attribute *attr, + const char* buf, size_t count) +{ + unsigned int fan_index, motor_index; + struct switch_obj *p_obj; + int ret, pwm; + + check_p(g_drv); + check_p(g_drv->set_fan_pwm); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + fan_index = p_obj->index; + motor_index = obj->index; + sscanf(buf, "%d", &pwm); + + if (pwm < 0 || pwm > 100) { + FAN_ERR("can not set pwm = %d.\n", pwm); + return -EINVAL; + } + ret = g_drv->set_fan_pwm(fan_index, motor_index, pwm); + if (ret < 0) { + FAN_ERR("can not set pwm = %d.\n", pwm); + return -EIO; + } + return count; +} + +/************************************fan dir and attrs*******************************************/ +static struct switch_attribute fan_number_att = __ATTR(num_fans, S_IRUGO, fan_number_show, NULL); + +static struct attribute *fan_dir_attrs[] = { + &fan_number_att.attr, + NULL, +}; + +static struct attribute_group fan_root_attr_group = { + .attrs = fan_dir_attrs, +}; + +/*******************************fan1 fan2 dir and attrs*******************************************/ +static struct switch_attribute fan_num_motors_att = __ATTR(num_motors, S_IRUGO, fan_motor_number_show, NULL); +static struct switch_attribute fan_present_att = __ATTR(present, S_IRUGO, fan_present_status_show, NULL); + +static struct attribute *fan_attrs[] = { + &fan_num_motors_att.attr, + &fan_present_att.attr, + NULL, +}; + +static struct attribute_group fan_attr_group = { + .attrs = fan_attrs, +}; + +/*******************************motor0 motor1 dir and attrs*******************************************/ +static struct switch_attribute motor_speed_att = __ATTR(speed, S_IRUGO, fan_speed_show, NULL); +static struct switch_attribute motor_status_att = __ATTR(status, S_IRUGO, fan_roll_status_show, NULL); +static struct switch_attribute motor_ratio_att = __ATTR(ratio, S_IRUGO | S_IWUSR, fan_motor_ratio_show, fan_motor_ratio_store); + +static struct attribute *motor_attrs[] = { + &motor_speed_att.attr, + &motor_status_att.attr, + &motor_ratio_att.attr, + NULL, +}; + +static struct attribute_group motor_attr_group = { + .attrs = motor_attrs, +}; + +static void fanindex_single_motor_remove_kobj_and_attrs(struct fan_obj_t * curr_fan, unsigned int motor_index) +{ + struct motor_obj_t *curr_motor; /* point to motor0 motor1...*/ + + curr_motor = &curr_fan->motor[motor_index]; + if (curr_motor->obj) { + sysfs_remove_group(&curr_motor->obj->kobj, &motor_attr_group); + wb_plat_kobject_delete(&curr_motor->obj); + FAN_DBG("delete fan:%d motor%d.\n", curr_fan->obj->index, motor_index); + } + return; +} + +static int fanindex_single_motor_create_kobj_and_attrs(struct fan_obj_t * curr_fan, unsigned int motor_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct motor_obj_t *curr_motor; /* point to motor0 motor1...*/ + + FAN_DBG("create fan_index:%d, motor%d ...\n", curr_fan->obj->index, motor_index); + + curr_motor = &curr_fan->motor[motor_index]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "motor%d", motor_index); + curr_motor->obj = wb_plat_kobject_create(name, &curr_fan->obj->kobj); + if (!curr_motor->obj) { + FAN_ERR("create fan_index:%d, motor%d object error!\n", curr_fan->obj->index, motor_index); + return -EBADRQC; + } + curr_motor->obj->index = motor_index; + if (sysfs_create_group(&curr_motor->obj->kobj, &motor_attr_group) != 0) { + FAN_ERR("create fan_index:%d, motor%d attrs error.\n", curr_fan->obj->index, motor_index); + wb_plat_kobject_delete(&curr_motor->obj); + return -EBADRQC; + } + FAN_DBG("create fan_index:%d, motor%d ok.\n", curr_fan->obj->index, motor_index); + return 0; +} + +static int fanindex_motor_create_kobj_and_attrs(struct fan_obj_t * curr_fan, int motor_num) +{ + int motor_index, i; + + curr_fan->motor = kzalloc(sizeof(struct motor_obj_t) * motor_num, GFP_KERNEL); + if (!curr_fan->motor) { + FAN_ERR("kzalloc motor error, fan index = %d, motor number = %d.\n", curr_fan->obj->index, motor_num); + return -ENOMEM; + } + curr_fan->motor_number = motor_num; + for (motor_index = 0; motor_index < motor_num; motor_index++) { + if (fanindex_single_motor_create_kobj_and_attrs(curr_fan, motor_index) != 0) { + goto motor_error; + } + } + return 0; +motor_error: + for(i = motor_index - 1; i >= 0; i--) { + fanindex_single_motor_remove_kobj_and_attrs(curr_fan, i); + } + if(curr_fan->motor) { + kfree(curr_fan->motor); + curr_fan->motor = NULL; + } + return -EBADRQC; +} + +static void fanindex_motor_remove_kobj_and_attrs(struct fan_obj_t *curr_fan, int motor_num) +{ + int motor_index; + + for (motor_index = motor_num - 1; motor_index >= 0; motor_index--) { + fanindex_single_motor_remove_kobj_and_attrs(curr_fan, motor_index); + } + return; +} + +static int fan_motor_create(void) +{ + int fan_num, motor_num; + unsigned int fan_index, i; + struct fan_obj_t *curr_fan; /* point to fan1 fan2...*/ + + check_p(g_drv->get_dev_number); + + motor_num = g_drv->get_dev_number(WB_MAIN_DEV_FAN, WB_MINOR_DEV_MOTOR); + if (motor_num <= 0) { + FAN_ERR("get fan motor number error, motor_num:%d error.\n", motor_num); + return -ENODEV; + } + + fan_num = g_fan.fan_number; + for (fan_index = 1; fan_index <= fan_num; fan_index++) { + curr_fan = &g_fan.fan[fan_index - 1]; + if (fanindex_motor_create_kobj_and_attrs(curr_fan, motor_num) != 0) { + goto error; + } + } + return 0; +error: + for (i = fan_index - 1; i > 0; i--) { + curr_fan = &g_fan.fan[i - 1]; + motor_num = curr_fan->motor_number; + fanindex_motor_remove_kobj_and_attrs(curr_fan, motor_num); + } + return -EBADRQC; +} + +static void fan_motor_remove(void) +{ + unsigned int fan_index; + struct fan_obj_t *curr_fan; + + if (g_fan.fan) { + for (fan_index = g_fan.fan_number; fan_index > 0; fan_index--) { + curr_fan = &g_fan.fan[fan_index - 1]; + if (curr_fan->motor) { + fanindex_motor_remove_kobj_and_attrs(curr_fan, curr_fan->motor_number); + kfree(curr_fan->motor); + curr_fan->motor = NULL; + curr_fan->motor_number = 0; + } + } + } + return; +} + +static void fan_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct fan_obj_t *curr_fan; + + curr_fan = &g_fan.fan[index - 1]; + if (curr_fan->obj) { + sysfs_remove_group(&curr_fan->obj->kobj, &fan_attr_group); + wb_plat_kobject_delete(&curr_fan->obj); + FAN_DBG("delete fan%d.\n", index); + } + return; +} + +static int fan_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct fan_obj_t *curr_fan; + + curr_fan = &g_fan.fan[index - 1]; + FAN_DBG("create fan%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "fan%d", index); + curr_fan->obj = wb_plat_kobject_create(name, parent); + if (!curr_fan->obj) { + FAN_ERR("create fan%d object error!\n", index); + return -EBADRQC; + } + curr_fan->obj->index = index; + if (sysfs_create_group(&curr_fan->obj->kobj, &fan_attr_group) != 0) { + FAN_ERR("create fan%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_fan->obj); + return -EBADRQC; + } + FAN_DBG("create fan%d ok.\n", index); + return 0; +} + +static int fan_sub_create_kobj_and_attrs(struct kobject *parent, int fan_num) +{ + unsigned int fan_index, i; + + g_fan.fan = kzalloc(sizeof(struct fan_obj_t) * fan_num, GFP_KERNEL); + if (!g_fan.fan) { + FAN_ERR("kzalloc fan.fan error, fan number = %d.\n", fan_num); + return -ENOMEM; + } + + for (fan_index = 1; fan_index <= fan_num; fan_index++) { + if(fan_sub_single_create_kobj_and_attrs(parent, fan_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = fan_index - 1; i > 0; i--) { + fan_sub_single_remove_kobj_and_attrs(i); + } + if (g_fan.fan) { + kfree(g_fan.fan); + g_fan.fan = NULL; + } + return -EBADRQC; +} + +static int fan_sub_create(void) +{ + int ret, fan_num; + + check_p(g_drv->get_dev_number); + fan_num = g_drv->get_dev_number(WB_MAIN_DEV_FAN, WB_MINOR_DEV_NONE); + if (fan_num < 0) { + FAN_ERR("fan number = %d error.\n", fan_num); + return -EINVAL; + } + g_fan.fan_number = fan_num; + ret = fan_sub_create_kobj_and_attrs(&g_fan_obj->kobj, fan_num); + return ret; +} + +static void fan_sub_remove(void) +{ + unsigned int fan_index; + + if (g_fan.fan) { + for (fan_index = g_fan.fan_number; fan_index > 0; fan_index--) { + fan_sub_single_remove_kobj_and_attrs(fan_index); + } + kfree(g_fan.fan); + } + mem_clear(&g_fan, sizeof(struct fan_t)); + return; +} + +static int fan_root_create(void) +{ + g_fan_obj = wb_plat_kobject_create("fan", NULL); + if (!g_fan_obj) { + FAN_ERR("wb_plat_kobject_create fan error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_fan_obj->kobj, &fan_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_fan_obj); + FAN_ERR("create fan dir attrs error!\n"); + return -EBADRQC; + } + FAN_DBG("wb_plat_kobject_create fan directory and attribute success.\n"); + return 0; +} + +static void fan_root_remove(void) +{ + if (g_fan_obj) { + sysfs_remove_group(&g_fan_obj->kobj, &fan_root_attr_group); + wb_plat_kobject_delete(&g_fan_obj); + FAN_DBG("delete fan root success\n"); + } + + return; +} + +static int fan_init(void) +{ + int ret; + + FAN_INFO("fan_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = fan_root_create(); + if (ret < 0) { + goto fan_root_error; + } + + ret = fan_sub_create(); + if (ret < 0) { + goto fan_sub_error; + } + + ret = fan_motor_create(); + if (ret < 0) { + goto fan_motor_error; + } + + FAN_INFO("fan_init ok.\n"); + return 0; +fan_motor_error: + fan_sub_remove(); +fan_sub_error: + fan_root_remove(); +fan_root_error: + return ret; +} + +static void fan_exit(void) +{ + fan_motor_remove(); + fan_sub_remove(); + fan_root_remove(); + FAN_INFO("fan_exit ok.\n"); + return ; +} + +module_init(fan_init); +module_exit(fan_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("fan sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c new file mode 100644 index 000000000000..af3b414314ff --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c @@ -0,0 +1,430 @@ +/* + * plat_psu.c + * Original Author: support 2020-02-17 + * + * This module create psu kobjects and attributes in /sys/wb_plat/psu + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define PSU_INFO(fmt, args...) LOG_INFO("psu: ", fmt, ##args) +#define PSU_ERR(fmt, args...) LOG_ERR("psu: ", fmt, ##args) +#define PSU_DBG(fmt, args...) LOG_DBG("psu: ", fmt, ##args) + +struct temp_obj_t{ + struct switch_obj *obj; +}; + +struct psu_obj_t{ + unsigned int temp_number; + struct temp_obj_t *temp; + struct switch_obj *obj; +}; + +struct psu_t{ + unsigned int psu_number; + struct psu_obj_t *psu; +}; + +static int g_loglevel = 0; +static struct psu_t g_psu; +static struct switch_obj *g_psu_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t psu_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_psu.psu_number); +} + +static ssize_t psu_present_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int psu_index; + int ret; + + psu_index = obj->index; + PSU_DBG("psu_present_status_show, psu index:%d\n",psu_index); + check_p(g_drv); + check_p(g_drv->get_psu_present_status); + + ret = g_drv->get_psu_present_status(psu_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t psu_output_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int psu_index; + int ret; + + psu_index = obj->index; + PSU_DBG("psu_output_status_show, psu index:%d\n",psu_index); + check_p(g_drv); + check_p(g_drv->get_psu_output_status); + + ret = g_drv->get_psu_output_status(psu_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t psu_alert_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int psu_index; + int ret; + + psu_index = obj->index; + PSU_DBG("psu_alert_status_show, psu index:%d\n",psu_index); + check_p(g_drv); + check_p(g_drv->get_psu_alert_status); + + ret = g_drv->get_psu_alert_status(psu_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +/************************************psu dir and attrs*******************************************/ +static struct switch_attribute psu_number_att = __ATTR(num_psus, S_IRUGO, psu_number_show, NULL); + +static struct attribute *psu_dir_attrs[] = { + &psu_number_att.attr, + NULL, +}; + +static struct attribute_group psu_root_attr_group = { + .attrs = psu_dir_attrs, +}; + +/*******************************psu1 psu2 dir and attrs*******************************************/ +static struct switch_attribute psu_present_status_att = __ATTR(present, S_IRUGO, psu_present_status_show, NULL); +static struct switch_attribute psu_output_status_att = __ATTR(output, S_IRUGO, psu_output_status_show, NULL); +static struct switch_attribute psu_alert_status_att = __ATTR(alert, S_IRUGO, psu_alert_status_show, NULL); + +static struct attribute *psu_attrs[] = { + &psu_present_status_att.attr, + &psu_output_status_att.attr, + &psu_alert_status_att.attr, + NULL, +}; + +static struct attribute_group psu_attr_group = { + .attrs = psu_attrs, +}; + +/*******************************psu temp0 temp1 dir and attrs*******************************************/ +static struct attribute *psu_temp_attrs[] = { + NULL, +}; + +static struct attribute_group psu_temp_attr_group = { + .attrs = psu_temp_attrs, +}; + +static void psuindex_single_temp_remove_kobj_and_attrs(struct psu_obj_t * curr_psu, unsigned int temp_index) +{ + + struct temp_obj_t *curr_temp; /* point to temp0 temp1...*/ + + curr_temp = &curr_psu->temp[temp_index]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &psu_temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + PSU_DBG("delete psu:%d temp%d.\n", curr_psu->obj->index, temp_index); + } + return; +} + +static int psuindex_single_temp_create_kobj_and_attrs(struct psu_obj_t * curr_psu, unsigned int temp_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct temp_obj_t *curr_temp; /* point to temp0 temp1...*/ + + PSU_DBG("create psu_index:%d, temp%d ...\n", curr_psu->obj->index, temp_index); + + curr_temp = &curr_psu->temp[temp_index]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "temp%d", temp_index); + curr_temp->obj = wb_plat_kobject_create(name, &curr_psu->obj->kobj); + if (!curr_temp->obj) { + PSU_ERR("create psu_index:%d, temp%d object error!\n", curr_psu->obj->index, temp_index); + return -EBADRQC; + } + curr_temp->obj->index = temp_index; + if (sysfs_create_group(&curr_temp->obj->kobj, &psu_temp_attr_group) != 0) { + PSU_ERR("create psu_index:%d, temp%d attrs error.\n", curr_psu->obj->index, temp_index); + wb_plat_kobject_delete(&curr_temp->obj); + return -EBADRQC; + } + PSU_DBG("create psu_index:%d, temp%d ok.\n", curr_psu->obj->index, temp_index); + return 0; +} + +static int psuindex_temp_create_kobj_and_attrs(struct psu_obj_t * curr_psu, int temp_num) +{ + int temp_index, i; + + curr_psu->temp = kzalloc(sizeof(struct temp_obj_t) * temp_num, GFP_KERNEL); + if (!curr_psu->temp) { + PSU_ERR("kzalloc temp error, psu index = %d, temp number = %d.\n", curr_psu->obj->index, temp_num); + return -ENOMEM; + } + curr_psu->temp_number = temp_num; + for (temp_index = 0; temp_index < temp_num; temp_index++) { + if (psuindex_single_temp_create_kobj_and_attrs(curr_psu, temp_index) != 0) { + goto temp_error; + } + } + return 0; +temp_error: + for (i = temp_index - 1; i >= 0; i--) { + psuindex_single_temp_remove_kobj_and_attrs(curr_psu, i); + } + if (curr_psu->temp) { + kfree(curr_psu->temp); + curr_psu->temp = NULL; + } + return -EBADRQC; +} + +static void psuindex_temp_remove_kobj_and_attrs(struct psu_obj_t * curr_psu, int temp_num) +{ + unsigned int temp_index; + + for (temp_index = temp_num - 1; temp_index >= 0; temp_index--) { + psuindex_single_temp_remove_kobj_and_attrs(curr_psu, temp_index); + } + return; +} + +static int psu_temp_create(void) +{ + int psu_num, temp_num; + unsigned int psu_index, i; + struct psu_obj_t *curr_psu; /* point to psu1 psu2...*/ + + check_p(g_drv->get_dev_number); + temp_num = g_drv->get_dev_number(WB_MAIN_DEV_PSU, WB_MINOR_DEV_TEMP); + if (temp_num <= 0) { + PSU_INFO("psu temp_num:%d, don't need creat temp directory.\n", temp_num); + return 0; + } + + psu_num = g_psu.psu_number; + for(psu_index = 1; psu_index <= psu_num; psu_index++) { + curr_psu = &g_psu.psu[psu_index - 1]; + if(psuindex_temp_create_kobj_and_attrs(curr_psu, temp_num) != 0) { + goto error; + } + } + return 0; +error: + for(i = psu_index - 1; i > 0; i--) { + curr_psu = &g_psu.psu[i - 1]; + temp_num = curr_psu->temp_number; + psuindex_temp_remove_kobj_and_attrs(curr_psu, temp_num); + } + return -EBADRQC; +} + +static void psu_temp_remove(void) +{ + unsigned int psu_index; + struct psu_obj_t *curr_psu; + + if (g_psu.psu) { + for (psu_index = g_psu.psu_number; psu_index > 0; psu_index--) { + curr_psu = &g_psu.psu[psu_index - 1]; + if (curr_psu->temp) { + psuindex_temp_remove_kobj_and_attrs(curr_psu,curr_psu->temp_number); + kfree(curr_psu->temp); + curr_psu->temp = NULL; + curr_psu->temp_number = 0; + } + } + } + return; +} + +static void psu_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct psu_obj_t *curr_psu; + + curr_psu = &g_psu.psu[index - 1]; + if (curr_psu->obj) { + sysfs_remove_group(&curr_psu->obj->kobj, &psu_attr_group); + wb_plat_kobject_delete(&curr_psu->obj); + PSU_DBG("delete psu%d.\n", index); + } + return; +} + +static int psu_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct psu_obj_t *curr_psu; + + curr_psu = &g_psu.psu[index-1]; + PSU_DBG("create psu%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d",PSU_SYSFS_NAME, index); + curr_psu->obj = wb_plat_kobject_create(name, parent); + if (!curr_psu->obj) { + PSU_ERR("create psu%d object error!\n", index); + return -EBADRQC; + } + curr_psu->obj->index = index; + if (sysfs_create_group(&curr_psu->obj->kobj, &psu_attr_group) != 0) { + PSU_ERR("create psu%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_psu->obj); + return -EBADRQC; + } + PSU_DBG("create psu%d ok.\n", index); + return 0; +} + +static int psu_sub_create_kobj_and_attrs(struct kobject *parent, int psu_num) +{ + unsigned int psu_index, i; + + g_psu.psu = kzalloc(sizeof(struct psu_obj_t) * psu_num, GFP_KERNEL); + if (!g_psu.psu) { + PSU_ERR("kzalloc psu.psu error, psu number = %d.\n", psu_num); + return -ENOMEM; + } + + for (psu_index = 1; psu_index <= psu_num; psu_index++) { + if (psu_sub_single_create_kobj_and_attrs(parent, psu_index) != 0) { + goto error; + } + } + return 0; +error: + for(i = psu_index - 1; i > 0; i--) { + psu_sub_single_remove_kobj_and_attrs(i); + } + if(g_psu.psu) { + kfree(g_psu.psu); + g_psu.psu = NULL; + } + return -EBADRQC; +} + +static int psu_sub_create(void) +{ + int ret, psu_num; + + check_p(g_drv->get_dev_number); + psu_num = g_drv->get_dev_number(WB_MAIN_DEV_PSU, WB_MINOR_DEV_NONE); + if (psu_num < 0) { + PSU_ERR("psu number = %d error.\n", psu_num); + return -EINVAL; + } + g_psu.psu_number = psu_num; + ret = psu_sub_create_kobj_and_attrs(&g_psu_obj->kobj, psu_num); + return ret; +} + +static void psu_sub_remove(void) +{ + unsigned int psu_index; + + if (g_psu.psu) { + for (psu_index = g_psu.psu_number; psu_index > 0; psu_index--) { + psu_sub_single_remove_kobj_and_attrs(psu_index); + } + kfree(g_psu.psu); + } + mem_clear(&g_psu, sizeof(struct psu_t)); + return ; +} + +static int psu_root_create(void) +{ + g_psu_obj = wb_plat_kobject_create(PSU_SYSFS_NAME, NULL); + if (!g_psu_obj) { + PSU_ERR("wb_plat_kobject_create psu error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_psu_obj->kobj, &psu_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_psu_obj); + PSU_ERR("create psu dir attrs error!\n"); + return -EBADRQC; + } + PSU_DBG("wb_plat_kobject_create psu directory and attribute success.\n"); + return 0; +} + +static void psu_root_remove(void) +{ + if (g_psu_obj) { + sysfs_remove_group(&g_psu_obj->kobj, &psu_root_attr_group); + wb_plat_kobject_delete(&g_psu_obj); + PSU_DBG("delete psu root success\n"); + } + return; +} + +static int wb_psu_init(void) +{ + int ret; + + PSU_INFO("wb_psu_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = psu_root_create(); + if (ret < 0) { + goto psu_root_error; + } + + ret = psu_sub_create(); + if (ret < 0) { + goto psu_sub_error; + } + + ret = psu_temp_create(); + if (ret < 0) { + goto psu_temp_error; + } + + PSU_INFO("wb_psu_init ok.\n"); + return 0; +psu_temp_error: + psu_sub_remove(); +psu_sub_error: + psu_root_remove(); +psu_root_error: + return ret; +} + +static void wb_psu_exit(void) +{ + psu_temp_remove(); + psu_sub_remove(); + psu_root_remove(); + PSU_INFO("wb_psu_exit ok.\n"); + return ; +} + +module_init(wb_psu_init); +module_exit(wb_psu_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("psu sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c new file mode 100644 index 000000000000..04b764e82df9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c @@ -0,0 +1,457 @@ +/* + * plat_sensor.c + * Original Author: support 2020-02-17 + * + * This module create sensor kobjects and attributes in /sys/wb_plat/sensor + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define SENSOR_INFO(fmt, args...) LOG_INFO("sensor: ", fmt, ##args) +#define SENSOR_ERR(fmt, args...) LOG_ERR("sensor: ", fmt, ##args) +#define SENSOR_DBG(fmt, args...) LOG_DBG("sensor: ", fmt, ##args) + +struct sensor_t { + unsigned int in_number; + unsigned int temp_number; + struct sensor_in_t *in; + struct sensor_temp_t *temp; +}; + +struct sensor_temp_t { + struct switch_obj *obj; +}; + +struct sensor_in_t { + struct switch_obj *obj; +}; + +static int g_loglevel = 0; +static struct switch_drivers_t *g_drv = NULL; +static struct sensor_t g_sensor; +static struct switch_obj *g_sensor_obj = NULL; + +static ssize_t sensor_temp_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_sensor.temp_number); +} + +static ssize_t sensor_in_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_sensor.in_number); +} + +static ssize_t sensor_voltage_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int in_index; + int ret; + struct switch_device_attribute *in_attr; + + check_p(g_drv); + check_p(g_drv->get_voltage_info); + in_index = obj->index; + + in_attr = to_switch_device_attr(attr); + check_p(in_attr); + SENSOR_DBG("sensor_in_show, in index:0x%x, in type:0x%x\n",in_index, in_attr->type); + ret = g_drv->get_voltage_info(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_NONE, in_index, in_attr->type, buf); + if (ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +static ssize_t sensor_temp_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int temp_index; + int ret; + struct switch_device_attribute *temp_attr; + + check_p(g_drv); + check_p(g_drv->get_temp_info); + temp_index = obj->index; + + temp_attr = to_switch_device_attr(attr); + check_p(temp_attr); + SENSOR_DBG("sensor_temp_show, temp index:0x%x, temp type:0x%x\n", temp_index, temp_attr->type); + ret = g_drv->get_temp_info(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_NONE, temp_index, temp_attr->type, buf); + if (ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +/************************************sensor dir and attrs*******************************************/ +static struct switch_attribute num_temp_att = __ATTR(num_temp_sensors, S_IRUGO, sensor_temp_number_show, NULL); +static struct switch_attribute num_in_att = __ATTR(num_in_sensors, S_IRUGO, sensor_in_number_show, NULL); + +static struct attribute *sensor_dir_attrs[] = { + &num_temp_att.attr, + &num_in_att.attr, + NULL, +}; + +static struct attribute_group sensor_root_attr_group = { + .attrs = sensor_dir_attrs, +}; + +/*******************************temp0 temp1 dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(temp_input, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_INPUT); +static SWITCH_DEVICE_ATTR(temp_alias, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(temp_type, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(temp_max, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(temp_max_hyst, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_MAX_HYST); +static SWITCH_DEVICE_ATTR(temp_min, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_MIN); + +static struct attribute *sensor_temp_attrs[] = { + &switch_dev_attr_temp_input.switch_attr.attr, + &switch_dev_attr_temp_alias.switch_attr.attr, + &switch_dev_attr_temp_type.switch_attr.attr, + &switch_dev_attr_temp_max.switch_attr.attr, + &switch_dev_attr_temp_max_hyst.switch_attr.attr, + &switch_dev_attr_temp_min.switch_attr.attr, + NULL, +}; + +static struct attribute_group sensor_temp_attr_group = { + .attrs = sensor_temp_attrs, +}; + +/*******************************in0 in1 dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(in_input, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_INPUT); +static SWITCH_DEVICE_ATTR(in_alias, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(in_type, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(in_max, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(in_min, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_MIN); +static SWITCH_DEVICE_ATTR(in_crit, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_CRIT); + +static struct attribute *sensor_in_attrs[] = { + &switch_dev_attr_in_input.switch_attr.attr, + &switch_dev_attr_in_alias.switch_attr.attr, + &switch_dev_attr_in_type.switch_attr.attr, + &switch_dev_attr_in_max.switch_attr.attr, + &switch_dev_attr_in_min.switch_attr.attr, + &switch_dev_attr_in_crit.switch_attr.attr, + NULL, +}; + +static struct attribute_group sensor_in_attr_group = { + .attrs = sensor_in_attrs, +}; + +static int sensor_in_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct sensor_in_t *curr_sensor; + + curr_sensor = &g_sensor.in[index - 1]; + SENSOR_DBG("create sensor in%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "in%d", index); + curr_sensor->obj = wb_plat_kobject_create(name, parent); + if (!curr_sensor->obj) { + SENSOR_ERR("create sensor in%d object error!\n", index); + return -EBADRQC; + } + curr_sensor->obj->index = index; + if (sysfs_create_group(&curr_sensor->obj->kobj, &sensor_in_attr_group) != 0) { + SENSOR_ERR("create sensor in%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_sensor->obj); + return -EBADRQC; + } + SENSOR_DBG("create sensor in%d ok.\n", index); + return 0; + +} + +static void sensor_in_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_in_t *curr_in; + + curr_in = &g_sensor.in[index - 1]; + if (curr_in->obj) { + sysfs_remove_group(&curr_in->obj->kobj, &sensor_in_attr_group); + wb_plat_kobject_delete(&curr_in->obj); + SENSOR_DBG("delete in%d.\n", index); + } + return; +} + +static int sensor_temp_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct sensor_temp_t *curr_sensor; + + curr_sensor = &g_sensor.temp[index - 1]; + SENSOR_DBG("create sensor temp%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "temp%d", index); + curr_sensor->obj = wb_plat_kobject_create(name, parent); + if (!curr_sensor->obj) { + SENSOR_ERR("create sensor temp%d object error!\n", index); + return -EBADRQC; + } + curr_sensor->obj->index = index; + if (sysfs_create_group(&curr_sensor->obj->kobj, &sensor_temp_attr_group) != 0) { + SENSOR_ERR("create sensor temp%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_sensor->obj); + return -EBADRQC; + } + SENSOR_DBG("create sensor temp%d ok.\n", index); + return 0; + +} + +static void sensor_temp_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_temp_t *curr_temp; + + curr_temp = &g_sensor.temp[index - 1]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &sensor_temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + SENSOR_DBG("delete temp%d.\n", index); + } + return; +} + +static int sensor_temp_sub_create_kobj_and_attrs(struct kobject *parent, int temp_num) +{ + unsigned int temp_index, i; + + g_sensor.temp = kzalloc(sizeof(struct sensor_temp_t) * temp_num, GFP_KERNEL); + if (!g_sensor.temp ) { + SENSOR_ERR("kzalloc g_sensor.temp error, temp number = %d.\n", temp_num); + return -ENOMEM; + } + for (temp_index = 1; temp_index <= temp_num; temp_index++) { + if (sensor_temp_sub_single_create_kobj_and_attrs(parent, temp_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = temp_index - 1; i > 0; i--) { + sensor_temp_sub_single_remove_kobj_and_attrs(i); + } + + if (g_sensor.temp) { + kfree(g_sensor.temp); + g_sensor.temp = NULL; + } + return -EBADRQC; +} + +static int sensor_in_sub_create_kobj_and_attrs(struct kobject *parent, int in_num) +{ + unsigned int in_index, i; + + g_sensor.in = kzalloc(sizeof(struct sensor_in_t) * in_num, GFP_KERNEL); + if (!g_sensor.in) { + SENSOR_ERR("kzalloc g_sensor.in error, in number = %d.\n", in_num); + return -ENOMEM; + } + + for (in_index = 1; in_index <= in_num; in_index++) { + if (sensor_in_sub_single_create_kobj_and_attrs(parent, in_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = in_index - 1; i > 0; i--) { + sensor_in_sub_single_remove_kobj_and_attrs(i); + } + + if (g_sensor.in) { + kfree(g_sensor.in); + g_sensor.in = NULL; + } + return -EBADRQC; +} + +static int sensor_temp_sub_create(void) +{ + int ret, temp_num; + + check_p(g_drv->get_dev_number); + temp_num = g_drv->get_dev_number(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_TEMP); + g_sensor.temp_number = temp_num; + if (temp_num <= 0) { + SENSOR_DBG("Warning:sensor temp number = %d \n", temp_num); + return 0; + } + ret = sensor_temp_sub_create_kobj_and_attrs(&g_sensor_obj->kobj, temp_num); + return ret; +} + +static int sensor_in_sub_create(void) +{ + int ret, in_num; + + check_p(g_drv->get_dev_number); + in_num = g_drv->get_dev_number(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_IN); + g_sensor.in_number = in_num; + + if (in_num <= 0) { + SENSOR_DBG("Warning:sensor in number = %d \n", in_num); + return 0; + } + ret = sensor_in_sub_create_kobj_and_attrs(&g_sensor_obj->kobj, in_num); + return ret; +} + +static void temp_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_temp_t * curr_temp; + + curr_temp = &g_sensor.temp[index - 1]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &sensor_temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + SENSOR_DBG("delete sensor temp%d.\n", index); + } + return; +} + +static void in_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_in_t * curr_in; + + curr_in = &g_sensor.in[index - 1]; + if (curr_in->obj) { + sysfs_remove_group(&curr_in->obj->kobj, &sensor_in_attr_group); + wb_plat_kobject_delete(&curr_in->obj); + SENSOR_DBG("delete sensor in%d.\n", index); + } + return; +} + +static void sensor_temp_sub_remove(void) +{ + unsigned int temp_index; + + if (g_sensor.temp) { + for (temp_index = g_sensor.temp_number; temp_index > 0; temp_index--) { + temp_sub_single_remove_kobj_and_attrs(temp_index); + } + kfree(g_sensor.temp); + g_sensor.temp = NULL; + } + return; +} + +static void sensor_in_sub_remove(void) +{ + unsigned int in_index; + + if (g_sensor.in) { + for (in_index = g_sensor.in_number; in_index > 0; in_index--) { + in_sub_single_remove_kobj_and_attrs(in_index); + } + kfree(g_sensor.in); + g_sensor.in = NULL; + } + return; +} + +static void sensor_sub_remove(void) +{ + sensor_temp_sub_remove(); + sensor_in_sub_remove(); +} + +static int sensor_sub_create(void) +{ + int ret; + /* temp creat */ + ret = sensor_temp_sub_create(); + if (ret < 0) { + goto temp_err; + } + /* Voltage creat */ + ret = sensor_in_sub_create(); + if (ret < 0) { + goto in_err; + } + return 0; +in_err: + sensor_temp_sub_remove(); +temp_err: + return ret; +} +static void sensor_root_remove(void) +{ + if (g_sensor_obj) { + sysfs_remove_group(&g_sensor_obj->kobj, &sensor_root_attr_group); + wb_plat_kobject_delete(&g_sensor_obj); + SENSOR_DBG("delete sensor root success\n"); + } + + return; +} + +static int sensor_root_create(void) +{ + g_sensor_obj = wb_plat_kobject_create("sensor", NULL); + if (!g_sensor_obj) { + SENSOR_ERR("wb_plat_kobject_create sensor error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_sensor_obj->kobj, &sensor_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_sensor_obj); + SENSOR_ERR("create sensor dir attrs error!\n"); + return -EBADRQC; + } + SENSOR_DBG("wb_plat_kobject_create sensor directory and attribute success.\n"); + return 0; +} + +static int wb_sensor_init(void) +{ + int ret; + + SENSOR_INFO("wb_sensor_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = sensor_root_create(); + if (ret < 0) { + goto sensor_root_error; + } + + ret = sensor_sub_create(); + if (ret < 0) { + goto sensor_sub_error; + } + SENSOR_INFO("sensor_init ok.\n"); + return 0; +sensor_sub_error: + sensor_root_remove(); +sensor_root_error: + return ret; +} + +static void wb_sensor_exit(void) +{ + sensor_sub_remove(); + sensor_root_remove(); + SENSOR_INFO("sensor_exit ok.\n"); + return; +} + +module_init(wb_sensor_init); +module_exit(wb_sensor_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("sensors sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c new file mode 100644 index 000000000000..8f09c551f62c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c @@ -0,0 +1,291 @@ +/* + * plat_sff.c + * Original Author: support 2020-02-17 + * + * This module create sff kobjects and attributes in /sys/wb_plat/sff + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define SFF_INFO(fmt, args...) LOG_INFO("sff: ", fmt, ##args) +#define SFF_ERR(fmt, args...) LOG_ERR("sff: ", fmt, ##args) +#define SFF_DBG(fmt, args...) LOG_DBG("sff: ", fmt, ##args) + +struct sff_obj_t{ + struct switch_obj *sff_obj; + struct bin_attribute bin; + int sff_creat_bin_flag; +}; + +struct sff_t{ + unsigned int sff_number; + struct sff_obj_t *sff; +}; + +static int g_loglevel = 0; +static struct sff_t g_sff; +static struct switch_obj *g_sff_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t sff_cpld_info_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int sff_index; + int ret; + struct switch_device_attribute *sff_cpld_attr; + + check_p(g_drv); + check_p(g_drv->get_sff_cpld_info); + + sff_index = obj->index; + sff_cpld_attr = to_switch_device_attr(attr); + check_p(sff_cpld_attr); + SFF_DBG("sff_cpld_info_show, sff index:0x%x, sff cpld attr type:0x%x\n", sff_index, sff_cpld_attr->type); + ret = g_drv->get_sff_cpld_info(sff_index, sff_cpld_attr->type, buf, PAGE_SIZE); + if(ret < 0) { + SFF_ERR("sff_cpld_info_show error. sff index:0x%x, sff cpld attr type:0x%x, ret:%d\n", + sff_index, sff_cpld_attr->type,ret ); + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + SFF_DBG("sff_cpld_info_show ok. sff index:0x%x, sff cpld attr type:0x%x, ret:%d\n", sff_index, sff_cpld_attr->type, ret); + return ret; +} + +static ssize_t sff_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_sff.sff_number); +} + +/************************************sff attrs*******************************************/ +static struct switch_attribute sff_number_att = __ATTR(num_sffs, S_IRUGO, sff_number_show, NULL); +static SWITCH_DEVICE_ATTR(present, S_IRUGO, sff_cpld_info_show, NULL, WB_SFF_MODULE_PRESENT); + +/*******************************xcvr dir and attrs*******************************************/ +static struct attribute *xcvr_dir_attrs[] = { + &sff_number_att.attr, + NULL, +}; + +static struct attribute_group sff_xcvr_attr_group = { + .attrs = xcvr_dir_attrs, +}; + +/*******************************sff dir and attrs*******************************************/ +static struct attribute *sff_attrs[] = { + &switch_dev_attr_present.switch_attr.attr, + NULL, +}; + +static struct attribute_group sff_attr_group = { + .attrs = sff_attrs, +}; + +static int sff_sub_single_create_attrs(unsigned int index) +{ + struct sff_obj_t *curr_sff; + + curr_sff = &g_sff.sff[index-1]; + if (sysfs_create_group(&curr_sff->sff_obj->kobj, &sff_attr_group) != 0) { + SFF_ERR("create sff%d dir attrs error!\n", index); + wb_plat_kobject_delete(&curr_sff->sff_obj); + return -EBADRQC; + } + SFF_DBG("create sff%d dir attrs ok!\n", index); + return 0; +} + +static int sff_sub_single_create_kobj(struct kobject *parent, unsigned int index) +{ + struct sff_obj_t *curr_sff; + char sff_dir_name[DIR_NAME_MAX_LEN]; + int ret; + + check_p(g_drv->get_sff_dir_name); + ret = g_drv->get_sff_dir_name(index, sff_dir_name, sizeof(sff_dir_name)); + if (ret < 0) { + SFF_ERR("sff index:%d, get sff dir name error. please check sff config.\n", index); + return -ENOSYS; + } + + curr_sff = &g_sff.sff[index - 1]; + + curr_sff->sff_obj = wb_plat_kobject_create(sff_dir_name, parent); + if (!curr_sff->sff_obj) { + SFF_ERR("sff index:%d, create %s object error! \n", index, sff_dir_name); + return -EBADRQC; + } + + SFF_DBG("create sff kobj ok. sff index:%d, dir name:%s\n",index, sff_dir_name); + curr_sff->sff_obj->index = index; + + return 0; +} + +static void sff_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sff_obj_t *curr_sff; + + curr_sff = &g_sff.sff[index - 1]; + /* remove sff dir and attr */ + if (curr_sff->sff_obj) { + SFF_DBG("delete sff%d attrs.\n", curr_sff->sff_obj->index); + curr_sff->sff_obj->index = 0; + sysfs_remove_group(&curr_sff->sff_obj->kobj, &sff_attr_group); + wb_plat_kobject_delete(&curr_sff->sff_obj); + } + + return; +} + +static int sff_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + int ret; + + ret = sff_sub_single_create_kobj(parent, index); + if (ret < 0) { + SFF_ERR("sff index:%d, create sff dir error.\n", index); + return ret; + } + + ret = sff_sub_single_create_attrs(index); + if (ret < 0) { + SFF_ERR("sff index:%d, create sff attr error.\n", index); + return ret; + } + return 0; +} + +static int sff_sub_create_kobj_and_attrs(struct kobject *parent, int sff_num) +{ + unsigned int sff_index, i; + + g_sff.sff = kzalloc(sizeof(struct sff_obj_t) * sff_num, GFP_KERNEL); + if (!g_sff.sff) { + SFF_ERR("kzalloc g_sff.sff error, sff number = %d.\n", sff_num); + return -ENOMEM; + } + + for (sff_index = 1; sff_index <= sff_num; sff_index++) { + if (sff_sub_single_create_kobj_and_attrs(parent, sff_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = sff_index - 1; i > 0; i--) { + sff_sub_single_remove_kobj_and_attrs(i); + } + if (g_sff.sff) { + kfree(g_sff.sff); + g_sff.sff = NULL; + } + return -EBADRQC; +} + +static int sff_sub_create(void) +{ + int ret, sff_num; + + check_p(g_drv->get_dev_number); + sff_num = g_drv->get_dev_number(WB_MAIN_DEV_SFF, WB_MINOR_DEV_NONE); + g_sff.sff_number = sff_num; + if (sff_num <= 0) { + SFF_ERR("ERROR. port number:%d\n", sff_num); + return -EINVAL; + } + + ret = sff_sub_create_kobj_and_attrs(&g_sff_obj->kobj, sff_num); + + return ret; +} + +static void sff_sub_remove(void) +{ + unsigned int sff_index; + + if (g_sff.sff) { + for (sff_index = g_sff.sff_number; sff_index > 0; sff_index--) { + sff_sub_single_remove_kobj_and_attrs(sff_index); + } + kfree(g_sff.sff); + } + mem_clear(&g_sff, sizeof(struct sff_t)); + return ; +} + +static int sff_xcvr_create(void) +{ + g_sff_obj = wb_plat_kobject_create(SFF_SYSFS_NAME, NULL); + if (!g_sff_obj) { + SFF_ERR("wb_plat_kobject_create sff error!\n"); + return -ENOMEM; + } + + g_sff_obj->index = 0; + if (sysfs_create_group(&g_sff_obj->kobj, &sff_xcvr_attr_group) != 0) { + wb_plat_kobject_delete(&g_sff_obj); + SFF_ERR("create sff dir attrs error!\n"); + return -EBADRQC; + } + SFF_DBG("wb_plat_kobject_create sff directory and attribute success.\n"); + return 0; +} + +static void sff_xcvr_remove(void) +{ + if (g_sff_obj) { + sysfs_remove_group(&g_sff_obj->kobj, &sff_xcvr_attr_group); + wb_plat_kobject_delete(&g_sff_obj); + SFF_DBG("delete sff root success\n"); + } + + return; +} + +static int wb_sff_init(void) +{ + int ret; + + SFF_INFO("wb_sff_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = sff_xcvr_create(); + if (ret < 0) { + goto sff_root_error; + } + + ret = sff_sub_create(); + if (ret < 0) { + goto sff_sub_error; + } + SFF_INFO("wb_sff_init ok.\n"); + return 0; + +sff_sub_error: + sff_xcvr_remove(); +sff_root_error: + return ret; +} + +static void wb_sff_exit(void) +{ + sff_sub_remove(); + sff_xcvr_remove(); + SFF_INFO("wb_sff_exit ok.\n"); + return ; +} + +module_init(wb_sff_init); +module_exit(wb_sff_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("sff sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c new file mode 100644 index 000000000000..97539a4c24cc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c @@ -0,0 +1,667 @@ +/* + * plat_slot.c + * Original Author: support 2020-02-17 + * + * This module create sff kobjects and attributes in /sys/wb_plat/slot + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define SLOT_INFO(fmt, args...) LOG_INFO("slot: ", fmt, ##args) +#define SLOT_ERR(fmt, args...) LOG_ERR("slot: ", fmt, ##args) +#define SLOT_DBG(fmt, args...) LOG_DBG("slot: ", fmt, ##args) + +struct slot_temp_obj_t{ + struct switch_obj *obj; +}; + +struct slot_in_obj_t{ + struct switch_obj *obj; +}; + +struct slot_obj_t{ + unsigned int temp_number; + unsigned int in_number; + struct slot_temp_obj_t *temp; + struct slot_in_obj_t *in; + struct switch_obj *obj; +}; + +struct slot_t{ + unsigned int slot_number; + struct slot_obj_t *slot; +}; + +static int g_loglevel = 0; +static struct slot_t g_slot; +static struct switch_obj *g_slot_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t slot_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_slot.slot_number); +} + +static ssize_t slot_temp_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int index; + + index = obj->index; + SLOT_DBG("slot_temp_number_show,slot index:%d\n",index); + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_slot.slot[index-1].temp_number); +} + +static ssize_t slot_in_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int index; + + index = obj->index; + SLOT_DBG("slot_in_number_show,slot index:%d\n",index); + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_slot.slot[index-1].in_number); +} + +static ssize_t slot_present_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int slot_index; + int ret; + + slot_index = obj->index; + SLOT_DBG("slot_present_status_show, slot index:%d\n",slot_index); + check_p(g_drv); + check_p(g_drv->get_slot_present_status); + + ret = g_drv->get_slot_present_status(slot_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t slot_voltage_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int slot_index, in_index; + int ret; + struct switch_obj *p_obj; + struct switch_device_attribute *in_attr; + + check_p(g_drv); + check_p(g_drv->get_voltage_info); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + slot_index = p_obj->index; + in_index = obj->index; + + in_attr = to_switch_device_attr(attr); + check_p(in_attr); + SLOT_DBG("slot_voltage_show, slot index:0x%x, temp index:0x%x, temp type:0x%x\n",slot_index, in_index, in_attr->type); + ret = g_drv->get_voltage_info(WB_MAIN_DEV_SLOT, slot_index, in_index, in_attr->type, buf); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +static ssize_t slot_temp_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int slot_index, temp_index; + int ret; + struct switch_obj *p_obj; + struct switch_device_attribute *temp_attr; + + check_p(g_drv); + check_p(g_drv->get_temp_info); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + slot_index = p_obj->index; + temp_index = obj->index; + + temp_attr = to_switch_device_attr(attr); + check_p(temp_attr); + SLOT_DBG("slot_temp_show, slot index:0x%x, temp index:0x%x, temp type:0x%x\n",slot_index, temp_index, temp_attr->type); + ret = g_drv->get_temp_info(WB_MAIN_DEV_SLOT, slot_index, temp_index, temp_attr->type, buf); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +/************************************slot dir and attrs*******************************************/ +static struct switch_attribute slot_number_att = __ATTR(num_slots, S_IRUGO, slot_number_show, NULL); + +static struct attribute *slot_dir_attrs[] = { + &slot_number_att.attr, + NULL, +}; + +static struct attribute_group slot_root_attr_group = { + .attrs = slot_dir_attrs, +}; + +/*******************************slot1 slot2 dir and attrs*******************************************/ +static struct switch_attribute num_temp_sensors_att = __ATTR(num_temp_sensors, S_IRUGO, slot_temp_number_show, NULL); +static struct switch_attribute num_in_sensors_att = __ATTR(num_in_sensors, S_IRUGO, slot_in_number_show, NULL); +static struct switch_attribute slot_present_status_att = __ATTR(present, S_IRUGO, slot_present_status_show, NULL); + +static struct attribute *slot_attrs[] = { + &num_temp_sensors_att.attr, + &num_in_sensors_att.attr, + &slot_present_status_att.attr, + NULL, +}; + +static struct attribute_group slot_attr_group = { + .attrs = slot_attrs, +}; + +/*******************************temp dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(temp_alias, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(temp_type, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(temp_max, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(temp_max_hyst, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_MAX_HYST); +static SWITCH_DEVICE_ATTR(temp_min, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_MIN); +static SWITCH_DEVICE_ATTR(temp_input, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_INPUT); + +static struct attribute *temp_attrs[] = { + &switch_dev_attr_temp_alias.switch_attr.attr, + &switch_dev_attr_temp_type.switch_attr.attr, + &switch_dev_attr_temp_max.switch_attr.attr, + &switch_dev_attr_temp_max_hyst.switch_attr.attr, + &switch_dev_attr_temp_min.switch_attr.attr, + &switch_dev_attr_temp_input.switch_attr.attr, + NULL, +}; + +static struct attribute_group temp_attr_group = { + .attrs = temp_attrs, +}; + +/*******************************Voltage dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(in_alias, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(in_type, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(in_max, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(in_crit, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_CRIT); +static SWITCH_DEVICE_ATTR(in_min, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_MIN); +static SWITCH_DEVICE_ATTR(in_input, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_INPUT); + +static struct attribute *in_attrs[] = { + &switch_dev_attr_in_alias.switch_attr.attr, + &switch_dev_attr_in_type.switch_attr.attr, + &switch_dev_attr_in_max.switch_attr.attr, + &switch_dev_attr_in_crit.switch_attr.attr, + &switch_dev_attr_in_min.switch_attr.attr, + &switch_dev_attr_in_input.switch_attr.attr, + NULL, +}; + +static struct attribute_group in_attr_group = { + .attrs = in_attrs, +}; + +static void slotindex_single_temp_remove_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int temp_index) +{ + + struct slot_temp_obj_t *curr_temp; /* point to temp1 temp2...*/ + + curr_temp = &curr_slot->temp[temp_index - 1]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + SLOT_DBG("delete slot:%d temp%d.\n", curr_slot->obj->index, temp_index); + } + return; +} + +static int slotindex_single_temp_create_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int temp_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct slot_temp_obj_t *curr_temp; /* point to temp1 temp2...*/ + + curr_temp = &curr_slot->temp[temp_index - 1]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d", TEMP_SYSFS_NAME, temp_index); + + curr_temp->obj = wb_plat_kobject_create(name, &curr_slot->obj->kobj); + if (!curr_temp->obj) { + SLOT_ERR("create slot_index:%d, temp%d object error!\n", curr_slot->obj->index, temp_index); + return -EBADRQC; + } + curr_temp->obj->index = temp_index; + if (sysfs_create_group(&curr_temp->obj->kobj, &temp_attr_group) != 0) { + SLOT_ERR("create slot_index:%d, temp%d attrs error.\n", curr_slot->obj->index, temp_index); + wb_plat_kobject_delete(&curr_temp->obj); + return -EBADRQC; + } + SLOT_DBG("create slot_index:%d, temp%d ok.\n", curr_slot->obj->index, temp_index); + return 0; +} + +static void slotindex_temp_remove_kobj_and_attrs(struct slot_obj_t * curr_slot) +{ + int temp_index; + + for(temp_index = curr_slot->temp_number; temp_index > 0; temp_index--) { + slotindex_single_temp_remove_kobj_and_attrs(curr_slot, temp_index); + } + + if(curr_slot->temp) { + kfree(curr_slot->temp); + curr_slot->temp = NULL; + curr_slot->temp_number = 0; + } + return; +} + +static int slotindex_temp_create_kobj_and_attrs(struct slot_obj_t * curr_slot, int temp_num) +{ + int temp_index, i; + + curr_slot->temp_number = temp_num; + curr_slot->temp = kzalloc(sizeof(struct slot_temp_obj_t) * temp_num, GFP_KERNEL); + if (!curr_slot->temp) { + SLOT_ERR("kzalloc slot temp error, slot index = %d, temp number = %d.\n", curr_slot->obj->index, temp_num); + return -ENOMEM; + } + + for (temp_index = 1; temp_index <= temp_num; temp_index++) { + if (slotindex_single_temp_create_kobj_and_attrs(curr_slot, temp_index) != 0) { + goto error; + } + } + return 0; +error: + for (i = temp_index - 1; i > 0; i--) { + slotindex_single_temp_remove_kobj_and_attrs(curr_slot, i); + } + + if (curr_slot->temp) { + kfree(curr_slot->temp); + curr_slot->temp = NULL; + curr_slot->temp_number = 0; + } + return -EBADRQC; +} + +static void slotindex_single_in_remove_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int in_index) +{ + + struct slot_in_obj_t *curr_in; /* point to in1 in2...*/ + + curr_in = &curr_slot->in[in_index - 1]; + if (curr_in->obj) { + sysfs_remove_group(&curr_in->obj->kobj, &in_attr_group); + wb_plat_kobject_delete(&curr_in->obj); + SLOT_DBG("delete slot:%d in%d.\n", curr_slot->obj->index, in_index); + } + return; +} + +static int slotindex_single_in_create_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int in_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct slot_in_obj_t *curr_in; /* point to in1 in2...*/ + + curr_in = &curr_slot->in[in_index - 1]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d", VOLTAGE_SYSFS_NAME, in_index); + curr_in->obj = wb_plat_kobject_create(name, &curr_slot->obj->kobj); + if (!curr_in->obj) { + SLOT_ERR("create slot_index:%d, in%d object error!\n", curr_slot->obj->index, in_index); + return -EBADRQC; + } + curr_in->obj->index = in_index; + if (sysfs_create_group(&curr_in->obj->kobj, &in_attr_group) != 0) { + SLOT_ERR("create slot_index:%d, in%d attrs error.\n", curr_slot->obj->index, in_index); + wb_plat_kobject_delete(&curr_in->obj); + return -EBADRQC; + } + SLOT_DBG("create slot_index:%d, in%d ok.\n", curr_slot->obj->index, in_index); + return 0; +} + +static void slotindex_in_remove_kobj_and_attrs(struct slot_obj_t * curr_slot) +{ + int in_index; + + for(in_index = curr_slot->in_number; in_index > 0; in_index--) { + slotindex_single_in_remove_kobj_and_attrs(curr_slot, in_index); + } + + if(curr_slot->in) { + kfree(curr_slot->in); + curr_slot->in = NULL; + curr_slot->in_number = 0; + } + return; +} + +static int slotindex_in_create_kobj_and_attrs(struct slot_obj_t * curr_slot, int in_num) +{ + int in_index, i; + + curr_slot->in_number = in_num; + curr_slot->in = kzalloc(sizeof(struct slot_in_obj_t) * in_num, GFP_KERNEL); + if (!curr_slot->in) { + SLOT_ERR("kzalloc slot Voltage error, slot index = %d, Voltage number = %d.\n", curr_slot->obj->index, in_num); + return -ENOMEM; + } + + for (in_index = 1; in_index <= in_num; in_index++) { + if (slotindex_single_in_create_kobj_and_attrs(curr_slot, in_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = in_index - 1; i > 0; i++) { + slotindex_single_in_remove_kobj_and_attrs(curr_slot, i); + } + + if (curr_slot->in) { + kfree(curr_slot->in); + curr_slot->in = NULL; + curr_slot->in_number = 0; + } + return -EBADRQC; +} + +static void slotindex_obj_remove_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int obj_id) +{ + switch (obj_id) { + case WB_MINOR_DEV_TEMP: + slotindex_temp_remove_kobj_and_attrs(curr_slot); + break; + case WB_MINOR_DEV_IN: + slotindex_in_remove_kobj_and_attrs(curr_slot); + break; + default: + SLOT_ERR("Unknow obj id:%d\n", obj_id); + } + return ; +} + +static int slotindex_obj_create_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int obj_id, int obj_num) +{ + int ret; + + switch (obj_id) { + case WB_MINOR_DEV_TEMP: + ret = slotindex_temp_create_kobj_and_attrs(curr_slot, obj_num); + break; + case WB_MINOR_DEV_IN: + ret = slotindex_in_create_kobj_and_attrs(curr_slot, obj_num); + break; + default: + SLOT_ERR("Unknow obj id:%d\n", obj_id); + ret = -EINVAL; + } + return ret; +} + +static void slot_child_obj_remove_by_id(unsigned int obj_id) +{ + int slot_num; + unsigned int slot_index; + struct slot_obj_t *curr_slot; /* point to slot1 slot2...*/ + + slot_num = g_slot.slot_number; + if (slot_num <= 0 || !g_slot.slot) { + SLOT_DBG("Warning:slot number = %d\n", slot_num); + return; + } + + for(slot_index = slot_num; slot_index > 0; slot_index--) { + curr_slot = &g_slot.slot[slot_index - 1]; + slotindex_obj_remove_kobj_and_attrs(curr_slot, obj_id); + } + return; +} + +static int slot_child_obj_create_by_id(unsigned int obj_id) +{ + int slot_num, obj_num; + unsigned int slot_index, i; + struct slot_obj_t *curr_slot; /* point to slot1 slot2...*/ + + check_p(g_drv->get_dev_number); + obj_num = g_drv->get_dev_number(WB_MAIN_DEV_SLOT,obj_id); + slot_num = g_slot.slot_number; + if (obj_num <= 0 || slot_num <= 0 || !g_slot.slot) { + SLOT_DBG("Warning:slot number = %d, object number:%d.obj_id:%d\n", slot_num, obj_num, obj_id); + return 0; + } + + for (slot_index = 1; slot_index <= slot_num; slot_index++) { + curr_slot = &g_slot.slot[slot_index - 1]; + if (slotindex_obj_create_kobj_and_attrs(curr_slot, obj_id, obj_num) != 0) { + goto error; + } + } + return 0; +error: + for(i = slot_index - 1; i > 0; i++) { + curr_slot = &g_slot.slot[i - 1]; + slotindex_obj_remove_kobj_and_attrs(curr_slot, obj_id); + } + return -EBADRQC; +} + +static void slot_child_obj_remove(void) +{ + /* temp remove */ + slot_child_obj_remove_by_id(WB_MINOR_DEV_TEMP); + + /* in creat */ + slot_child_obj_remove_by_id(WB_MINOR_DEV_IN); + return; +} + +static int slot_child_obj_create(void) +{ + int ret; + + /* temp creat */ + ret = slot_child_obj_create_by_id(WB_MINOR_DEV_TEMP); + if (ret < 0) { + goto temp_err; + } + /* Voltage creat */ + ret = slot_child_obj_create_by_id(WB_MINOR_DEV_IN); + if(ret < 0) { + goto in_err; + } + return 0; +in_err: + slot_child_obj_remove_by_id(WB_MINOR_DEV_TEMP); +temp_err: + return ret; +} + +static void slot_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct slot_obj_t *curr_slot; + + curr_slot = &g_slot.slot[index - 1]; + if (curr_slot->obj) { + sysfs_remove_group(&curr_slot->obj->kobj, &slot_attr_group); + wb_plat_kobject_delete(&curr_slot->obj); + SLOT_DBG("delete slot%d.\n", index); + } + return; +} + +static int slot_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct slot_obj_t *curr_slot; + + curr_slot = &g_slot.slot[index - 1]; + SLOT_DBG("create %s%d ...\n", SLOT_SYSFS_NAME, index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d", SLOT_SYSFS_NAME, index); + curr_slot->obj = wb_plat_kobject_create(name, parent); + if (!curr_slot->obj) { + SLOT_ERR("create slot%d object error!\n", index); + return -EBADRQC; + } + curr_slot->obj->index = index; + if (sysfs_create_group(&curr_slot->obj->kobj, &slot_attr_group) != 0) { + SLOT_ERR("create slot%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_slot->obj); + return -EBADRQC; + } + SLOT_DBG("create slot%d ok.\n", index); + return 0; +} + +static int slot_sub_create_kobj_and_attrs(struct kobject *parent, int slot_num) +{ + unsigned int slot_index, i; + + g_slot.slot = kzalloc(sizeof(struct slot_obj_t) * slot_num, GFP_KERNEL); + if (!g_slot.slot) { + SLOT_ERR("kzalloc slot.slot error, slot number = %d.\n", slot_num); + return -ENOMEM; + } + + for (slot_index = 1; slot_index <= slot_num; slot_index++) { + if (slot_sub_single_create_kobj_and_attrs(parent, slot_index) != 0) { + goto error; + } + } + return 0; +error: + for (i = slot_index - 1; i > 0; i--) { + slot_sub_single_remove_kobj_and_attrs(i); + } + if (g_slot.slot) { + kfree(g_slot.slot); + g_slot.slot = NULL; + } + return -EBADRQC; +} + +/* create slot1 slot2...dir and attrs */ +static int slot_sub_create(void) +{ + int ret, slot_num; + + check_p(g_drv->get_dev_number); + slot_num = g_drv->get_dev_number(WB_MAIN_DEV_SLOT, WB_MINOR_DEV_NONE); + g_slot.slot_number = slot_num; + if (slot_num <= 0) { + SLOT_DBG("Warning:slot number = %d \n", slot_num); + return 0; + } + ret = slot_sub_create_kobj_and_attrs(&g_slot_obj->kobj, slot_num); + return ret; +} + +/** + * slot_sub_remove - delete slot1 slot2...dir and attrs + */ +static void slot_sub_remove(void) +{ + unsigned int slot_index; + + if (g_slot.slot) { + for (slot_index = g_slot.slot_number; slot_index > 0; slot_index--) { + slot_sub_single_remove_kobj_and_attrs(slot_index); + } + kfree(g_slot.slot); + } + mem_clear(&g_slot, sizeof(struct slot_t)); + return ; +} + +/* create slot dir and num_slots attr */ +static int slot_root_create(void) +{ + g_slot_obj = wb_plat_kobject_create(SLOT_SYSFS_NAME, NULL); + if (!g_slot_obj) { + SLOT_ERR("wb_plat_kobject_create slot error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_slot_obj->kobj, &slot_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_slot_obj); + SLOT_ERR("create slot dir attrs error!\n"); + return -EBADRQC; + } + SLOT_DBG("wb_plat_kobject_create slot directory and attribute success.\n"); + return 0; +} + +static void slot_root_remove(void) +{ + if (g_slot_obj) { + sysfs_remove_group(&g_slot_obj->kobj, &slot_root_attr_group); + wb_plat_kobject_delete(&g_slot_obj); + SLOT_DBG("delete slot root success\n"); + } + + return; +} + +static int wb_slot_init(void) +{ + int ret; + + SLOT_INFO("wb_slot_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = slot_root_create(); + if (ret < 0) { + goto slot_root_error; + } + + ret = slot_sub_create(); + if (ret < 0) { + goto slot_sub_error; + } + + ret = slot_child_obj_create(); + if (ret < 0) { + goto slot_child_obj_error; + } + + SLOT_INFO("wb_slot_init ok.\n"); + return 0; +slot_child_obj_error: + slot_sub_remove(); +slot_sub_error: + slot_root_remove(); +slot_root_error: + return ret; +} + +static void wb_slot_exit(void) +{ + slot_child_obj_remove(); + slot_sub_remove(); + slot_root_remove(); + SLOT_INFO("wb_slot_exit ok.\n"); + return ; +} + +module_init(wb_slot_init); +module_exit(wb_slot_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("slot sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c new file mode 100644 index 000000000000..7c71fdb3bd62 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c @@ -0,0 +1,135 @@ +/* + * plat_switch.c + * Original Author: support 2020-02-17 + * + * This module create a kset in sysfs called /sys/wb_plat + * Then other switch kobjects are created and assigned to this kset, + * such as "board", "cpld", "fan", "psu", "sff", ... + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ +#include "./include/plat_switch.h" + +#define SWITCH_INFO(fmt, args...) LOG_INFO("switch: ", fmt, ##args) +#define SWITCH_ERR(fmt, args...) LOG_ERR("switch: ", fmt, ##args) +#define SWITCH_DBG(fmt, args...) LOG_DBG("switch: ", fmt, ##args) + +static int g_loglevel = 0; + +static ssize_t switch_attr_show(struct kobject *kobj, + struct attribute *attr, char *buf) +{ + struct switch_attribute *attribute; + struct switch_obj *device; + + attribute = to_switch_attr(attr); + device = to_switch_obj(kobj); + + if (!attribute->show) + return -ENOSYS; + + return attribute->show(device, attribute, buf); +} + +static ssize_t switch_attr_store(struct kobject *kobj, + struct attribute *attr, const char *buf, size_t len) +{ + struct switch_attribute *attribute; + struct switch_obj *obj; + + attribute = to_switch_attr(attr); + obj = to_switch_obj(kobj); + + if (!attribute->store) + return -ENOSYS; + + return attribute->store(obj, attribute, buf, len); +} + +static const struct sysfs_ops switch_sysfs_ops = { + .show = switch_attr_show, + .store = switch_attr_store, +}; + +static void switch_obj_release(struct kobject *kobj) +{ + struct switch_obj *obj; + + obj = to_switch_obj(kobj); + kfree(obj); +} + +static struct kobj_type switch_ktype = { + .sysfs_ops = &switch_sysfs_ops, + .release = switch_obj_release, + .default_attrs = NULL, +}; + +static struct kset *switch_kset; + +struct switch_obj *wb_plat_kobject_create(const char *name, struct kobject *parent) +{ + struct switch_obj *obj = NULL; + int ret = 0; + + obj = kzalloc(sizeof(*obj), GFP_KERNEL); + if (!obj) { + SWITCH_DBG("wb_plat_kobject_create %s kzalloc error", name); + return NULL; + } + + obj->kobj.kset = switch_kset; + + ret = kobject_init_and_add(&obj->kobj, &switch_ktype, parent, "%s", name); + if (ret) { + kobject_put(&obj->kobj); + SWITCH_DBG("kobject_init_and_add %s error", name); + return NULL; + } + + return obj; +} + +void wb_plat_kobject_delete(struct switch_obj **obj) +{ + if (*obj) { + SWITCH_DBG("%s delete %s.\n", (*obj)->kobj.parent->name, (*obj)->kobj.name); + kobject_put(&((*obj)->kobj)); + *obj = NULL; + } +} + +static int __init switch_init(void) +{ + SWITCH_INFO("...\n"); + + switch_kset = kset_create_and_add("wb_plat", NULL, NULL); + if (!switch_kset) { + SWITCH_ERR("create switch_kset error.\n"); + return -ENOMEM; + } + + SWITCH_INFO("ok.\n"); + return 0; +} + +static void __exit switch_exit(void) +{ + if (switch_kset) { + kset_unregister(switch_kset); + } + + SWITCH_INFO("ok.\n"); +} + +module_init(switch_init); +module_exit(switch_exit); +EXPORT_SYMBOL(wb_plat_kobject_create); +EXPORT_SYMBOL(wb_plat_kobject_delete); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Switch driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h new file mode 100644 index 000000000000..9e4a4fae00c1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h @@ -0,0 +1,74 @@ +#ifndef __PLATFORM_COMMON_H__ +#define __PLATFORM_COMMON_H__ + +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum { + DBG_START, + DBG_VERBOSE, + DBG_KEY, + DBG_WARN, + DBG_ERROR, + DBG_END, +} dbg_level_t; + + typedef struct dfd_i2c_dev_s { + int bus; + int addr; + } dfd_i2c_dev_t; + +typedef struct dfd_dev_head_info_s { + uint8_t ver; + uint8_t flag; + uint8_t hw_ver; + uint8_t type; + int16_t tlv_len; +} dfd_dev_head_info_t; + +typedef struct dfd_dev_tlv_info_s { + uint8_t type; + uint8_t len; + uint8_t data[0]; +} dfd_dev_tlv_info_t; + +typedef enum dfd_dev_info_type_e { + DFD_DEV_INFO_TYPE_MAC = 1, + DFD_DEV_INFO_TYPE_NAME = 2, + DFD_DEV_INFO_TYPE_SN = 3, + DFD_DEV_INFO_TYPE_PWR_CONS = 4, + DFD_DEV_INFO_TYPE_HW_INFO = 5, + DFD_DEV_INFO_TYPE_DEV_TYPE = 6, +} dfd_dev_tlv_type_t; + +extern int debuglevel; +extern s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command); +extern s32 platform_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, + u8 command, u8 length, u8 *values); +extern s32 platform_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command); + +#define DBG_DEBUG(fmt, arg...) do { \ + if ( debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ + printk(KERN_INFO "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else if ( debuglevel >= DBG_ERROR ) { \ + printk(KERN_ERR "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else { } \ +} while (0) + +#define DBG_INFO(fmt, arg...) do { \ + if ( debuglevel > DBG_KEY) { \ + printk(KERN_INFO "[INFO]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } \ + } while (0) + +#define DBG_ERROR(fmt, arg...) do { \ + if ( debuglevel > DBG_START) { \ + printk(KERN_ERR "[ERROR]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } \ + } while (0) + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c new file mode 100644 index 000000000000..62e04b7db837 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c @@ -0,0 +1,210 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,152) +#include +#else +#include +#endif +#include +#include +#include +#include +#include "platform_common.h" +#include "dfd_tlveeprom.h" + +#define PLATFORM_I2C_RETRY_TIMES 3 + +#define DFD_TLVEEPROM_I2C_BUS (0) +#define DFD_TLVEEPROM_I2C_ADDR (0x56) +#define DFD_E2PROM_MAX_LEN (256) +#define DFD_CARDTYPE_EXT_TLVLEN (4) + +#define PLATFORM_CARDTYPE_RETRY_CNT (10) +#define PLATFORM_CARDTYPE_RETRY_TIMES (1000) + +int debuglevel = 0; +module_param(debuglevel, int, S_IRUGO | S_IWUSR); + +static int dfd_my_type = 0; +module_param(dfd_my_type, int, S_IRUGO | S_IWUSR); + +int g_common_debug_error = 0; +module_param(g_common_debug_error, int, S_IRUGO | S_IWUSR); + +int g_common_debug_verbose = 0; +module_param(g_common_debug_verbose, int, S_IRUGO | S_IWUSR); + +uint32_t dfd_my_type_i2c_bus = 0; +module_param(dfd_my_type_i2c_bus, int, S_IRUGO | S_IWUSR); + +uint32_t dfd_my_type_i2c_addr = 0; +module_param(dfd_my_type_i2c_addr, int, S_IRUGO | S_IWUSR); + +#define RUJIE_COMMON_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_common_debug_verbose) { \ + printk(KERN_ERR "[PLATFORM_COMMON][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define RUJIE_COMMON_DEBUG_ERROR(fmt, args...) do { \ + if (g_common_debug_error) { \ + printk(KERN_ERR "[PLATFORM_COMMON][ERROR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static int32_t dfd_i2c_read(char *dev, uint32_t addr, uint32_t offset_addr, unsigned char * +buf, int32_t size) +{ + struct file *fp; + struct i2c_client client; + int i ,j; + int rv; + s32 val_t; + + val_t = -1; + rv = 0; + fp = filp_open(dev, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + DBG_ERROR("i2c open fail.\n"); + RUJIE_COMMON_DEBUG_ERROR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = addr; + for (j = 0 ;j < size ;j++){ + for (i = 0; i < PLATFORM_I2C_RETRY_TIMES; i++) { + if ((val_t = i2c_smbus_read_byte_data(&client, (offset_addr + j)))< 0) { + DBG_DEBUG("read try(%d)time offset_addr:%x \n", i, offset_addr); + continue; + } else { + * (buf + j) = val_t; + break; + } + } + if (val_t < 0) { + rv = -1; + break; + } + } + filp_close(fp, NULL); + return rv; +} + +static int dfd_tlvinfo_get_cardtype(void) +{ + char i2c_path[16] = {0}; + int ret; + int cardtype; + u_int8_t eeprom[DFD_E2PROM_MAX_LEN]; + dfd_i2c_dev_t i2c_dev; + uint8_t buf[DFD_CARDTYPE_EXT_TLVLEN]; + uint8_t len; + dfd_tlv_type_t tlv_type; + + if (dfd_my_type_i2c_bus != 0) { + i2c_dev.bus = dfd_my_type_i2c_bus; + } else { + i2c_dev.bus = DFD_TLVEEPROM_I2C_BUS; + } + + if (dfd_my_type_i2c_addr != 0) { + i2c_dev.addr = dfd_my_type_i2c_addr; + } else { + i2c_dev.addr = DFD_TLVEEPROM_I2C_ADDR; + } + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_dev.bus); + RUJIE_COMMON_DEBUG_VERBOSE("Read device eeprom info:(dev:%s, addr:%02x).\n", i2c_path, i2c_dev.addr); + + ret = dfd_i2c_read(i2c_path, i2c_dev.addr, 0, eeprom, DFD_E2PROM_MAX_LEN); + if (ret != 0) { + DBG_ERROR("Read eeprom info error(dev: %s, addr: %02x).\n", i2c_path, i2c_dev.addr); + RUJIE_COMMON_DEBUG_ERROR("Read eeprom info error(dev: %s, addr: %02x).\n", i2c_path, i2c_dev.addr); + return ret; + } + + tlv_type.main_type = TLV_CODE_VENDOR_EXT; + tlv_type.ext_type = DFD_TLVINFO_EXT_TLV_TYPE_DEV_TYPE; + len = sizeof(buf); + mem_clear(buf, len); + ret = dfd_tlvinfo_get_e2prom_info(eeprom, DFD_E2PROM_MAX_LEN, &tlv_type, buf, &len); + if (ret) { + DBG_ERROR("dfd_tlvinfo_get_e2prom_info failed ret %d.\n", ret); + return -1; + } + for (ret = 0; ret < 4; ret++) { + DBG_DEBUG("buf 0x%02x.\n", buf[ret]); + } + + cardtype = ntohl(*((uint32_t *)buf)); + DBG_DEBUG("cardtype 0x%x.\n", cardtype); + return cardtype; +} + +static int __dfd_get_my_card_type(void) +{ + return dfd_tlvinfo_get_cardtype(); +} + +int dfd_get_my_card_type(void) +{ + int type; + int cnt; + + if (dfd_my_type != 0) { + DBG_DEBUG("my_type = 0x%x\r\n", dfd_my_type); + return dfd_my_type; + } + + cnt = PLATFORM_CARDTYPE_RETRY_CNT; + while (cnt--) { + type = __dfd_get_my_card_type(); + if (type < 0) { + RUJIE_COMMON_DEBUG_ERROR("__dfd_get_my_card_type fail cnt %d, ret %d.\n", cnt, type); + msleep(PLATFORM_CARDTYPE_RETRY_TIMES); + continue; + } + RUJIE_COMMON_DEBUG_VERBOSE("success to get type 0x%x.\n", type); + break; + } + + dfd_my_type = type; + return dfd_my_type; +} +EXPORT_SYMBOL(dfd_get_my_card_type); + +static int __init platform_common_init(void) +{ + int ret; + + RUJIE_COMMON_DEBUG_VERBOSE("Enter.\n"); + ret = dfd_get_my_card_type(); + if (ret <= 0) { + RUJIE_COMMON_DEBUG_ERROR("dfd_get_my_card_type failed, ret %d.\n", ret); + printk(KERN_ERR "Warning: Device type get failed, please check the TLV-EEPROM!\n"); + return -1; + } + + RUJIE_COMMON_DEBUG_VERBOSE("Leave success type 0x%x.\n", ret); + return 0; +} + +static void __exit platform_common_exit(void) +{ + RUJIE_COMMON_DEBUG_VERBOSE("Exit.\n"); +} + +module_init(platform_common_init); +module_exit(platform_common_exit); + +MODULE_DESCRIPTION("Platform Support"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h deleted file mode 100755 index cd5550ab41b3..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h +++ /dev/null @@ -1,520 +0,0 @@ -/* - * pmbus.h - Common defines and structures for PMBus devices - * - * Copyright (c) 2010, 2011 Ericsson AB. - * Copyright (c) 2012 Guenter Roeck - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef PMBUS_H -#define PMBUS_H - -#include -#include -#include - -/* - * Registers - */ -enum pmbus_regs { - PMBUS_PAGE = 0x00, - PMBUS_OPERATION = 0x01, - PMBUS_ON_OFF_CONFIG = 0x02, - PMBUS_CLEAR_FAULTS = 0x03, - PMBUS_PHASE = 0x04, - - PMBUS_WRITE_PROTECT = 0x10, - - PMBUS_CAPABILITY = 0x19, - PMBUS_QUERY = 0x1A, - - PMBUS_VOUT_MODE = 0x20, - PMBUS_VOUT_COMMAND = 0x21, - PMBUS_VOUT_TRIM = 0x22, - PMBUS_VOUT_CAL_OFFSET = 0x23, - PMBUS_VOUT_MAX = 0x24, - PMBUS_VOUT_MARGIN_HIGH = 0x25, - PMBUS_VOUT_MARGIN_LOW = 0x26, - PMBUS_VOUT_TRANSITION_RATE = 0x27, - PMBUS_VOUT_DROOP = 0x28, - PMBUS_VOUT_SCALE_LOOP = 0x29, - PMBUS_VOUT_SCALE_MONITOR = 0x2A, - - PMBUS_COEFFICIENTS = 0x30, - PMBUS_POUT_MAX = 0x31, - - PMBUS_FAN_CONFIG_12 = 0x3A, - PMBUS_FAN_COMMAND_1 = 0x3B, - PMBUS_FAN_COMMAND_2 = 0x3C, - PMBUS_FAN_CONFIG_34 = 0x3D, - PMBUS_FAN_COMMAND_3 = 0x3E, - PMBUS_FAN_COMMAND_4 = 0x3F, - - PMBUS_VOUT_OV_FAULT_LIMIT = 0x40, - PMBUS_VOUT_OV_FAULT_RESPONSE = 0x41, - PMBUS_VOUT_OV_WARN_LIMIT = 0x42, - PMBUS_VOUT_UV_WARN_LIMIT = 0x43, - PMBUS_VOUT_UV_FAULT_LIMIT = 0x44, - PMBUS_VOUT_UV_FAULT_RESPONSE = 0x45, - PMBUS_IOUT_OC_FAULT_LIMIT = 0x46, - PMBUS_IOUT_OC_FAULT_RESPONSE = 0x47, - PMBUS_IOUT_OC_LV_FAULT_LIMIT = 0x48, - PMBUS_IOUT_OC_LV_FAULT_RESPONSE = 0x49, - PMBUS_IOUT_OC_WARN_LIMIT = 0x4A, - PMBUS_IOUT_UC_FAULT_LIMIT = 0x4B, - PMBUS_IOUT_UC_FAULT_RESPONSE = 0x4C, - - PMBUS_OT_FAULT_LIMIT = 0x4F, - PMBUS_OT_FAULT_RESPONSE = 0x50, - PMBUS_OT_WARN_LIMIT = 0x51, - PMBUS_UT_WARN_LIMIT = 0x52, - PMBUS_UT_FAULT_LIMIT = 0x53, - PMBUS_UT_FAULT_RESPONSE = 0x54, - PMBUS_VIN_OV_FAULT_LIMIT = 0x55, - PMBUS_VIN_OV_FAULT_RESPONSE = 0x56, - PMBUS_VIN_OV_WARN_LIMIT = 0x57, - PMBUS_VIN_UV_WARN_LIMIT = 0x58, - PMBUS_VIN_UV_FAULT_LIMIT = 0x59, - - PMBUS_IIN_OC_FAULT_LIMIT = 0x5B, - PMBUS_IIN_OC_WARN_LIMIT = 0x5D, - - PMBUS_POUT_OP_FAULT_LIMIT = 0x68, - PMBUS_POUT_OP_WARN_LIMIT = 0x6A, - PMBUS_PIN_OP_WARN_LIMIT = 0x6B, - - PMBUS_STATUS_BYTE = 0x78, - PMBUS_STATUS_WORD = 0x79, - PMBUS_STATUS_VOUT = 0x7A, - PMBUS_STATUS_IOUT = 0x7B, - PMBUS_STATUS_INPUT = 0x7C, - PMBUS_STATUS_TEMPERATURE = 0x7D, - PMBUS_STATUS_CML = 0x7E, - PMBUS_STATUS_OTHER = 0x7F, - PMBUS_STATUS_MFR_SPECIFIC = 0x80, - PMBUS_STATUS_FAN_12 = 0x81, - PMBUS_STATUS_FAN_34 = 0x82, - - PMBUS_READ_VIN = 0x88, - PMBUS_READ_IIN = 0x89, - PMBUS_READ_VCAP = 0x8A, - PMBUS_READ_VOUT = 0x8B, - PMBUS_READ_IOUT = 0x8C, - PMBUS_READ_TEMPERATURE_1 = 0x8D, - PMBUS_READ_TEMPERATURE_2 = 0x8E, - PMBUS_READ_TEMPERATURE_3 = 0x8F, - PMBUS_READ_FAN_SPEED_1 = 0x90, - PMBUS_READ_FAN_SPEED_2 = 0x91, - PMBUS_READ_FAN_SPEED_3 = 0x92, - PMBUS_READ_FAN_SPEED_4 = 0x93, - PMBUS_READ_DUTY_CYCLE = 0x94, - PMBUS_READ_FREQUENCY = 0x95, - PMBUS_READ_POUT = 0x96, - PMBUS_READ_PIN = 0x97, - - PMBUS_REVISION = 0x98, - PMBUS_MFR_ID = 0x99, - PMBUS_MFR_MODEL = 0x9A, - PMBUS_MFR_REVISION = 0x9B, - PMBUS_MFR_LOCATION = 0x9C, - PMBUS_MFR_DATE = 0x9D, - PMBUS_MFR_SERIAL = 0x9E, - - PMBUS_MFR_VIN_MIN = 0xA0, - PMBUS_MFR_VIN_MAX = 0xA1, - PMBUS_MFR_IIN_MAX = 0xA2, - PMBUS_MFR_PIN_MAX = 0xA3, - PMBUS_MFR_VOUT_MIN = 0xA4, - PMBUS_MFR_VOUT_MAX = 0xA5, - PMBUS_MFR_IOUT_MAX = 0xA6, - PMBUS_MFR_POUT_MAX = 0xA7, - - PMBUS_IC_DEVICE_ID = 0xAD, - PMBUS_IC_DEVICE_REV = 0xAE, - - PMBUS_MFR_MAX_TEMP_1 = 0xC0, - PMBUS_MFR_MAX_TEMP_2 = 0xC1, - PMBUS_MFR_MAX_TEMP_3 = 0xC2, - - - /* - * Virtual registers. - * Useful to support attributes which are not supported by standard PMBus - * registers but exist as manufacturer specific registers on individual chips. - * Must be mapped to real registers in device specific code. - * - * Semantics: - * Virtual registers are all word size. - * READ registers are read-only; writes are either ignored or return an error. - * RESET registers are read/write. Reading reset registers returns zero - * (used for detection), writing any value causes the associated history to be - * reset. - * Virtual registers have to be handled in device specific driver code. Chip - * driver code returns non-negative register values if a virtual register is - * supported, or a negative error code if not. The chip driver may return - * -ENODATA or any other error code in this case, though an error code other - * than -ENODATA is handled more efficiently and thus preferred. Either case, - * the calling PMBus core code will abort if the chip driver returns an error - * code when reading or writing virtual registers. - */ - PMBUS_VIRT_BASE = 0x100, - PMBUS_VIRT_READ_TEMP_AVG, - PMBUS_VIRT_READ_TEMP_MIN, - PMBUS_VIRT_READ_TEMP_MAX, - PMBUS_VIRT_RESET_TEMP_HISTORY, - PMBUS_VIRT_READ_VIN_AVG, - PMBUS_VIRT_READ_VIN_MIN, - PMBUS_VIRT_READ_VIN_MAX, - PMBUS_VIRT_RESET_VIN_HISTORY, - PMBUS_VIRT_READ_IIN_AVG, - PMBUS_VIRT_READ_IIN_MIN, - PMBUS_VIRT_READ_IIN_MAX, - PMBUS_VIRT_RESET_IIN_HISTORY, - PMBUS_VIRT_READ_PIN_AVG, - PMBUS_VIRT_READ_PIN_MIN, - PMBUS_VIRT_READ_PIN_MAX, - PMBUS_VIRT_RESET_PIN_HISTORY, - PMBUS_VIRT_READ_POUT_AVG, - PMBUS_VIRT_READ_POUT_MIN, - PMBUS_VIRT_READ_POUT_MAX, - PMBUS_VIRT_RESET_POUT_HISTORY, - PMBUS_VIRT_READ_VOUT_AVG, - PMBUS_VIRT_READ_VOUT_MIN, - PMBUS_VIRT_READ_VOUT_MAX, - PMBUS_VIRT_RESET_VOUT_HISTORY, - PMBUS_VIRT_READ_IOUT_AVG, - PMBUS_VIRT_READ_IOUT_MIN, - PMBUS_VIRT_READ_IOUT_MAX, - PMBUS_VIRT_RESET_IOUT_HISTORY, - PMBUS_VIRT_READ_TEMP2_AVG, - PMBUS_VIRT_READ_TEMP2_MIN, - PMBUS_VIRT_READ_TEMP2_MAX, - PMBUS_VIRT_RESET_TEMP2_HISTORY, - - PMBUS_VIRT_READ_VMON, - PMBUS_VIRT_VMON_UV_WARN_LIMIT, - PMBUS_VIRT_VMON_OV_WARN_LIMIT, - PMBUS_VIRT_VMON_UV_FAULT_LIMIT, - PMBUS_VIRT_VMON_OV_FAULT_LIMIT, - PMBUS_VIRT_STATUS_VMON, - - /* - * RPM and PWM Fan control - * - * Drivers wanting to expose PWM control must define the behaviour of - * PMBUS_VIRT_PWM_[1-4] and PMBUS_VIRT_PWM_ENABLE_[1-4] in the - * {read,write}_word_data callback. - * - * pmbus core provides a default implementation for - * PMBUS_VIRT_FAN_TARGET_[1-4]. - * - * TARGET, PWM and PWM_ENABLE members must be defined sequentially; - * pmbus core uses the difference between the provided register and - * it's _1 counterpart to calculate the FAN/PWM ID. - */ - PMBUS_VIRT_FAN_TARGET_1, - PMBUS_VIRT_FAN_TARGET_2, - PMBUS_VIRT_FAN_TARGET_3, - PMBUS_VIRT_FAN_TARGET_4, - PMBUS_VIRT_PWM_1, - PMBUS_VIRT_PWM_2, - PMBUS_VIRT_PWM_3, - PMBUS_VIRT_PWM_4, - PMBUS_VIRT_PWM_ENABLE_1, - PMBUS_VIRT_PWM_ENABLE_2, - PMBUS_VIRT_PWM_ENABLE_3, - PMBUS_VIRT_PWM_ENABLE_4, - /* Samples for average - * - * Drivers wanting to expose functionality for changing the number of - * samples used for average values should implement support in - * {read,write}_word_data callback for either PMBUS_VIRT_SAMPLES if it - * applies to all types of measurements, or any number of specific - * PMBUS_VIRT_*_SAMPLES registers to allow for individual control. - */ - PMBUS_VIRT_SAMPLES, - PMBUS_VIRT_IN_SAMPLES, - PMBUS_VIRT_CURR_SAMPLES, - PMBUS_VIRT_POWER_SAMPLES, - PMBUS_VIRT_TEMP_SAMPLES, -}; - -/* - * OPERATION - */ -#define PB_OPERATION_CONTROL_ON BIT(7) - -/* - * WRITE_PROTECT - */ -#define PB_WP_ALL BIT(7) /* all but WRITE_PROTECT */ -#define PB_WP_OP BIT(6) /* all but WP, OPERATION, PAGE */ -#define PB_WP_VOUT BIT(5) /* all but WP, OPERATION, PAGE, VOUT, ON_OFF */ - -#define PB_WP_ANY (PB_WP_ALL | PB_WP_OP | PB_WP_VOUT) - -/* - * CAPABILITY - */ -#define PB_CAPABILITY_SMBALERT BIT(4) -#define PB_CAPABILITY_ERROR_CHECK BIT(7) - -/* - * VOUT_MODE - */ -#define PB_VOUT_MODE_MODE_MASK 0xe0 -#define PB_VOUT_MODE_PARAM_MASK 0x1f - -#define PB_VOUT_MODE_LINEAR 0x00 -#define PB_VOUT_MODE_VID 0x20 -#define PB_VOUT_MODE_DIRECT 0x40 - -/* - * Fan configuration - */ -#define PB_FAN_2_PULSE_MASK (BIT(0) | BIT(1)) -#define PB_FAN_2_RPM BIT(2) -#define PB_FAN_2_INSTALLED BIT(3) -#define PB_FAN_1_PULSE_MASK (BIT(4) | BIT(5)) -#define PB_FAN_1_RPM BIT(6) -#define PB_FAN_1_INSTALLED BIT(7) - -enum pmbus_fan_mode { percent = 0, rpm }; - -/* - * STATUS_BYTE, STATUS_WORD (lower) - */ -#define PB_STATUS_NONE_ABOVE BIT(0) -#define PB_STATUS_CML BIT(1) -#define PB_STATUS_TEMPERATURE BIT(2) -#define PB_STATUS_VIN_UV BIT(3) -#define PB_STATUS_IOUT_OC BIT(4) -#define PB_STATUS_VOUT_OV BIT(5) -#define PB_STATUS_OFF BIT(6) -#define PB_STATUS_BUSY BIT(7) - -/* - * STATUS_WORD (upper) - */ -#define PB_STATUS_UNKNOWN BIT(8) -#define PB_STATUS_OTHER BIT(9) -#define PB_STATUS_FANS BIT(10) -#define PB_STATUS_POWER_GOOD_N BIT(11) -#define PB_STATUS_WORD_MFR BIT(12) -#define PB_STATUS_INPUT BIT(13) -#define PB_STATUS_IOUT_POUT BIT(14) -#define PB_STATUS_VOUT BIT(15) - -/* - * STATUS_IOUT - */ -#define PB_POUT_OP_WARNING BIT(0) -#define PB_POUT_OP_FAULT BIT(1) -#define PB_POWER_LIMITING BIT(2) -#define PB_CURRENT_SHARE_FAULT BIT(3) -#define PB_IOUT_UC_FAULT BIT(4) -#define PB_IOUT_OC_WARNING BIT(5) -#define PB_IOUT_OC_LV_FAULT BIT(6) -#define PB_IOUT_OC_FAULT BIT(7) - -/* - * STATUS_VOUT, STATUS_INPUT - */ -#define PB_VOLTAGE_UV_FAULT BIT(4) -#define PB_VOLTAGE_UV_WARNING BIT(5) -#define PB_VOLTAGE_OV_WARNING BIT(6) -#define PB_VOLTAGE_OV_FAULT BIT(7) - -/* - * STATUS_INPUT - */ -#define PB_PIN_OP_WARNING BIT(0) -#define PB_IIN_OC_WARNING BIT(1) -#define PB_IIN_OC_FAULT BIT(2) - -/* - * STATUS_TEMPERATURE - */ -#define PB_TEMP_UT_FAULT BIT(4) -#define PB_TEMP_UT_WARNING BIT(5) -#define PB_TEMP_OT_WARNING BIT(6) -#define PB_TEMP_OT_FAULT BIT(7) - -/* - * STATUS_FAN - */ -#define PB_FAN_AIRFLOW_WARNING BIT(0) -#define PB_FAN_AIRFLOW_FAULT BIT(1) -#define PB_FAN_FAN2_SPEED_OVERRIDE BIT(2) -#define PB_FAN_FAN1_SPEED_OVERRIDE BIT(3) -#define PB_FAN_FAN2_WARNING BIT(4) -#define PB_FAN_FAN1_WARNING BIT(5) -#define PB_FAN_FAN2_FAULT BIT(6) -#define PB_FAN_FAN1_FAULT BIT(7) - -/* - * CML_FAULT_STATUS - */ -#define PB_CML_FAULT_OTHER_MEM_LOGIC BIT(0) -#define PB_CML_FAULT_OTHER_COMM BIT(1) -#define PB_CML_FAULT_PROCESSOR BIT(3) -#define PB_CML_FAULT_MEMORY BIT(4) -#define PB_CML_FAULT_PACKET_ERROR BIT(5) -#define PB_CML_FAULT_INVALID_DATA BIT(6) -#define PB_CML_FAULT_INVALID_COMMAND BIT(7) - -enum pmbus_sensor_classes { - PSC_VOLTAGE_IN = 0, - PSC_VOLTAGE_OUT, - PSC_CURRENT_IN, - PSC_CURRENT_OUT, - PSC_POWER, - PSC_TEMPERATURE, - PSC_FAN, - PSC_PWM, - PSC_NUM_CLASSES /* Number of power sensor classes */ -}; - -#define PMBUS_PAGES 32 /* Per PMBus specification */ -#define PMBUS_PHASES 8 /* Maximum number of phases per page */ -/* Functionality bit mask */ -#define PMBUS_HAVE_VIN BIT(0) -#define PMBUS_HAVE_VCAP BIT(1) -#define PMBUS_HAVE_VOUT BIT(2) -#define PMBUS_HAVE_IIN BIT(3) -#define PMBUS_HAVE_IOUT BIT(4) -#define PMBUS_HAVE_PIN BIT(5) -#define PMBUS_HAVE_POUT BIT(6) -#define PMBUS_HAVE_FAN12 BIT(7) -#define PMBUS_HAVE_FAN34 BIT(8) -#define PMBUS_HAVE_TEMP BIT(9) -#define PMBUS_HAVE_TEMP2 BIT(10) -#define PMBUS_HAVE_TEMP3 BIT(11) -#define PMBUS_HAVE_STATUS_VOUT BIT(12) -#define PMBUS_HAVE_STATUS_IOUT BIT(13) -#define PMBUS_HAVE_STATUS_INPUT BIT(14) -#define PMBUS_HAVE_STATUS_TEMP BIT(15) -#define PMBUS_HAVE_STATUS_FAN12 BIT(16) -#define PMBUS_HAVE_STATUS_FAN34 BIT(17) -#define PMBUS_HAVE_VMON BIT(18) -#define PMBUS_HAVE_STATUS_VMON BIT(19) -#define PMBUS_HAVE_PWM12 BIT(20) -#define PMBUS_HAVE_PWM34 BIT(21) -#define PMBUS_HAVE_SAMPLES BIT(22) -#define PMBUS_PHASE_VIRTUAL BIT(30) -#define PMBUS_PAGE_VIRTUAL BIT(31) - -enum pmbus_data_format { linear = 0, direct, vid }; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv }; -#else -enum vrm_version { vr11 = 0, vr12, vr13 }; -#endif - -struct pmbus_driver_info { - int pages; /* Total number of pages */ - enum pmbus_data_format format[PSC_NUM_CLASSES]; - enum vrm_version vrm_version[PMBUS_PAGES]; - u8 phases[PMBUS_PAGES];/* Number of phases per page */ - u32 pfunc[PMBUS_PHASES];/* Functionality, per phase */ - /* - * Support one set of coefficients for each sensor type - * Used for chips providing data in direct mode. - */ - int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */ - int b[PSC_NUM_CLASSES]; /* offset */ - int R[PSC_NUM_CLASSES]; /* exponent */ - - u32 func[PMBUS_PAGES]; /* Functionality, per page */ - /* - * The following functions map manufacturing specific register values - * to PMBus standard register values. Specify only if mapping is - * necessary. - * Functions return the register value (read) or zero (write) if - * successful. A return value of -ENODATA indicates that there is no - * manufacturer specific register, but that a standard PMBus register - * may exist. Any other negative return value indicates that the - * register does not exist, and that no attempt should be made to read - * the standard register. - */ - int (*read_byte_data)(struct i2c_client *client, int page, int reg); - int (*read_word_data)(struct i2c_client *client, int page, int reg); - int (*write_word_data)(struct i2c_client *client, int page, int reg, - u16 word); - int (*write_byte)(struct i2c_client *client, int page, u8 value); - /* - * The identify function determines supported PMBus functionality. - * This function is only necessary if a chip driver supports multiple - * chips, and the chip functionality is not pre-determined. - */ - int (*identify)(struct i2c_client *client, - struct pmbus_driver_info *info); - - /* Regulator functionality, if supported by this chip driver. */ - int num_regulators; - const struct regulator_desc *reg_desc; - const struct attribute_group **groups; -}; - -/* Regulator ops */ - -extern const struct regulator_ops pmbus_regulator_ops; - -/* Macro for filling in array of struct regulator_desc */ -#define PMBUS_REGULATOR(_name, _id) \ - [_id] = { \ - .name = (_name # _id), \ - .id = (_id), \ - .of_match = of_match_ptr(_name # _id), \ - .regulators_node = of_match_ptr("regulators"), \ - .ops = &pmbus_regulator_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - } - -/* Function declarations */ - -void pmbus_clear_cache(struct i2c_client *client); -int pmbus_set_page(struct i2c_client *client, int page); -int pmbus_read_word_data(struct i2c_client *client, int page, u8 reg); -int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, u16 word); -int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); -int pmbus_write_byte(struct i2c_client *client, int page, u8 value); -int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, - u8 value); -int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, - u8 mask, u8 value); -void pmbus_clear_faults(struct i2c_client *client); -bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg); -bool pmbus_check_word_register(struct i2c_client *client, int page, int reg); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -int pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info); -#else -int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id, - struct pmbus_driver_info *info); -#endif -int pmbus_do_remove(struct i2c_client *client); -const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client - *client); -int pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, - enum pmbus_fan_mode mode); -int pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, - enum pmbus_fan_mode mode); -int pmbus_update_fan(struct i2c_client *client, int page, int id, - u8 config, u8 mask, u16 command); -struct dentry *pmbus_get_debugfs_dir(struct i2c_client *client); - -#endif /* PMBUS_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c deleted file mode 100755 index f28852ec3317..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int dfd_my_type = 0; -module_param(dfd_my_type, int, S_IRUGO | S_IWUSR); - -int g_common_debug_error = 0; -module_param(g_common_debug_error, int, S_IRUGO | S_IWUSR); - -int g_common_debug_verbose = 0; -module_param(g_common_debug_verbose, int, S_IRUGO | S_IWUSR); - -#define RAGILE_COMMON_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_common_debug_verbose) { \ - printk(KERN_ERR "[RAGILE_COMMON][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define RAGILE_COMMON_DEBUG_ERROR(fmt, args...) do { \ - if (g_common_debug_error) { \ - printk(KERN_ERR "[RAGILE_COMMON][ERROR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - - -int dfd_get_my_card_type(void) -{ - if (dfd_my_type != 0) { - RAGILE_COMMON_DEBUG_VERBOSE("my_type = 0x%x\r\n", dfd_my_type); - return dfd_my_type; - } - - return -1; -} -EXPORT_SYMBOL(dfd_get_my_card_type); - -static int __init ragile_common_init(void) -{ - int ret; - - RAGILE_COMMON_DEBUG_VERBOSE("Enter.\n"); - ret = dfd_get_my_card_type(); - if (ret <= 0) { - RAGILE_COMMON_DEBUG_ERROR("dfd_get_my_card_type failed, ret %d.\n", ret); - printk(KERN_ERR "Warning: Device type get failed, please check the TLV-EEPROM!\n"); - return -1; - } - - RAGILE_COMMON_DEBUG_VERBOSE("Leave success type 0x%x.\n", ret); - return 0; -} - -static void __exit ragile_common_exit(void) -{ - RAGILE_COMMON_DEBUG_VERBOSE("Exit.\n"); -} - -module_init(ragile_common_init); -module_exit(ragile_common_exit); - -MODULE_DESCRIPTION("ragile Platform Support"); -MODULE_AUTHOR("support "); -MODULE_LICENSE("GPL"); - diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c deleted file mode 100755 index 5d9908f8c3e2..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ragile_platform.c - A driver for ragile platform module - * - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PLATFORM_I2C_RETRY_TIMES (3) - -s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < PLATFORM_I2C_RETRY_TIMES; try ++) { - if ((ret = i2c_smbus_read_byte_data(client, command)) >= 0) - break; - } - return ret; -} -EXPORT_SYMBOL(platform_i2c_smbus_read_byte_data); - -s32 platform_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, - u8 command, u8 length, u8 *values) -{ - int try ; - s32 ret; - - ret = -1; - for (try = 0; try < PLATFORM_I2C_RETRY_TIMES; try ++) { - if ((ret = i2c_smbus_read_i2c_block_data(client, command, length, values)) >= 0) - break; - } - return ret; -} -EXPORT_SYMBOL(platform_i2c_smbus_read_i2c_block_data); - -s32 platform_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < PLATFORM_I2C_RETRY_TIMES; try ++) { - if ((ret = i2c_smbus_read_word_data(client, command)) >= 0) - break; - } - return ret; -} -EXPORT_SYMBOL(platform_i2c_smbus_read_word_data); - -static int __init ragile_platform_init(void) -{ - return 0; -} - -static void __exit ragile_platform_exit(void) -{ - return; -} - -module_init(ragile_platform_init); -module_exit(ragile_platform_exit); - -MODULE_DESCRIPTION("ragile Platform Support"); -MODULE_AUTHOR("support "); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c deleted file mode 100755 index 84b62c50ab0b..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - * GPIO interface for XEON Super I/O chip - * - * Author: support - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define GPIO_NAME "xeon-gpio" -#define GPIO_IOSIZE 7 -#define GPIO_BASE 0x500 - -#define GPIO_USE_SEL GPIO_BASE -#define GP_IO_SEL (GPIO_BASE+0x4) -#define GP_LVL (GPIO_BASE+0xC) - -#define GPIO_USE_SEL2 (GPIO_BASE+0x30) -#define GP_IO_SEL2 (GPIO_BASE+0x34) -#define GP_LVL2 (GPIO_BASE+0x38) - -#define GPIO_USE_SEL3 (GPIO_BASE+0x40) -#define GP_IO_SEL3 (GPIO_BASE+0x44) -#define GP_LVL3 (GPIO_BASE+0x48) - - -#define GPIO_BASE_ID 0 -#define BANKSIZE 32 - -#define GPIO_SDA 17 -#define GPIO_SCL 1 - -#define GPIO_XEON_SPIN_LOCK(lock, flags) spin_lock_irqsave(&(lock), (flags)) -#define GPIO_XEON_SPIN_UNLOCK(lock, flags) spin_unlock_irqrestore(&(lock), (flags)) -static DEFINE_SPINLOCK(sio_lock); - -/****************** i2c adapter with gpio ***********************/ - -static struct i2c_gpio_platform_data i2c_pdata = { - .timeout = 200, - .udelay = 10, - .scl_is_output_only = 0, - .sda_is_open_drain = 0, - .scl_is_open_drain = 0, -}; - -static struct gpiod_lookup_table rg_gpio_lookup_table = { - .dev_id = "i2c-gpio", - .table = { - GPIO_LOOKUP(GPIO_NAME, GPIO_SDA, "sda", - GPIO_ACTIVE_HIGH), - GPIO_LOOKUP(GPIO_NAME, GPIO_SCL, "scl", - GPIO_ACTIVE_HIGH), - }, -}; - -static void i2c_gpio_release(struct device *dev) -{ - return; -} - -static struct platform_device i2c_gpio = { - .name = "i2c-gpio", - .num_resources = 0, - .id = -1, - - .dev = { - .platform_data = &i2c_pdata, - .release = i2c_gpio_release, - } -}; - -static int xeon_gpio_get(struct gpio_chip *gc, unsigned gpio_num) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - data = 0; - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_LVL) & (1 << offset); - if (data) { - data = 1; - } - } else if (bank == 1) { - data = inl(GP_LVL2) & (1 << offset); - if (data) { - data = 1; - } - } else if (bank == 2) { - data = inl(GP_LVL3) & (1 << offset); - if (data) { - data = 1; - } - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - - return data; -} - -static int xeon_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_IO_SEL); - data = data | (1 << offset); - outl(data, GP_IO_SEL); - } else if (bank == 1) { - data = inl(GP_IO_SEL2); - data = data | (1 << offset); - outl(data, GP_IO_SEL2); - } else if (bank == 2) { - data = inl(GP_IO_SEL3); - data = data | (1 << offset); - outl(data, GP_IO_SEL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - - return 0; -} - -static void xeon_gpio_set(struct gpio_chip *gc, - unsigned gpio_num, int val) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_LVL); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL); - } else if (bank == 1) { - data = inl(GP_LVL2); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL2); - } else if (bank == 2) { - data = inl(GP_LVL3); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); -} - -static int xeon_gpio_direction_out(struct gpio_chip *gc, - unsigned gpio_num, int val) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_IO_SEL); - data = data & ~(1 << offset); - outl(data, GP_IO_SEL); - - data = inl(GP_LVL); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL); - } else if (bank == 1) { - data = inl(GP_IO_SEL2); - data = data & ~(1 << offset); - outl(data, GP_IO_SEL2); - - data = inl(GP_LVL2); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL2); - } else if (bank == 2) { - data = inl(GP_IO_SEL3); - data = data & ~(1 << offset); - outl(data, GP_IO_SEL3); - - data = inl(GP_LVL3); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - - return 0; -} - -static int xeon_gpio_request(struct gpio_chip *chip, unsigned int offset) -{ - unsigned int data; - unsigned int bank, tmp_offset; - unsigned long flags; - - bank = offset / BANKSIZE; - tmp_offset = offset % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GPIO_USE_SEL); - data = data | (1 << tmp_offset); - outl(data, GPIO_USE_SEL); - } else if (bank == 1) { - data = inl(GPIO_USE_SEL2); - data = data | (1 << tmp_offset); - outl(data, GPIO_USE_SEL2); - } else if (bank == 2) { - data = inl(GPIO_USE_SEL3); - data = data | (1 << tmp_offset); - outl(data, GPIO_USE_SEL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - return 0; -} - -static void xeon_gpio_free(struct gpio_chip *chip, unsigned int offset) -{ - unsigned int data; - unsigned int bank, tmp_offset; - unsigned long flags; - - bank = offset / BANKSIZE; - tmp_offset = offset % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GPIO_USE_SEL); - data = data & ~(1 << tmp_offset); - outl(data, GPIO_USE_SEL); - } else if (bank == 1) { - data = inl(GPIO_USE_SEL2); - data = data & ~(1 << tmp_offset); - outl(data, GPIO_USE_SEL2); - } else if (bank == 2) { - data = inl(GPIO_USE_SEL3); - data = data & ~(1 << tmp_offset); - outl(data, GPIO_USE_SEL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); -} - -static struct gpio_chip xeon_gpio_chip = { - .label = GPIO_NAME, - .owner = THIS_MODULE, - .get = xeon_gpio_get, - .direction_input = xeon_gpio_direction_in, - .set = xeon_gpio_set, - .direction_output = xeon_gpio_direction_out, - .request = xeon_gpio_request, - .free = xeon_gpio_free, -}; - -static int __init xeon_gpio_init(void) -{ - int err; - if (!request_region(GPIO_BASE, GPIO_IOSIZE, GPIO_NAME)) - return -EBUSY; - - xeon_gpio_chip.base = GPIO_BASE_ID; - xeon_gpio_chip.ngpio = 96; - - err = gpiochip_add_data(&xeon_gpio_chip, NULL); - if (err < 0) - goto gpiochip_add_err; - gpiod_add_lookup_table(&rg_gpio_lookup_table); - err = platform_device_register(&i2c_gpio); - if (err < 0) { - goto i2c_get_adapter_err; - } - return 0; - -i2c_get_adapter_err: - gpiod_remove_lookup_table(&rg_gpio_lookup_table); - platform_device_unregister(&i2c_gpio); - gpiochip_remove(&xeon_gpio_chip); - -gpiochip_add_err: - release_region(GPIO_BASE, GPIO_IOSIZE); - return -1; -} - -static void __exit xeon_gpio_exit(void) -{ - gpiod_remove_lookup_table(&rg_gpio_lookup_table); - platform_device_unregister(&i2c_gpio); - mdelay(100); - gpiochip_remove(&xeon_gpio_chip); - release_region(GPIO_BASE, GPIO_IOSIZE); -} - -module_init(xeon_gpio_init); -module_exit(xeon_gpio_exit); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("GPIO interface for XEON Super I/O chip"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c deleted file mode 100644 index 5e8f2c29d2a0..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c +++ /dev/null @@ -1,734 +0,0 @@ -/* ------------------------------------------------------------------------- - * i2c-algo-bit.c i2c driver algorithms for bit-shift adapters - * ------------------------------------------------------------------------- - * Copyright (C) 1995-2000 Simon G. Vogl - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - * ------------------------------------------------------------------------- */ - -/* With some changes from Frodo Looijaard , Kyösti Mälkki - and Jean Delvare */ - -#include -#include -#include -#include -#include -#include -#include - - -/* ----- global defines ----------------------------------------------- */ - -#ifdef DEBUG -#define bit_dbg(level, dev, format, args...) \ - do { \ - if (i2c_debug >= level) \ - dev_dbg(dev, format, ##args); \ - } while (0) -#else -#define bit_dbg(level, dev, format, args...) \ - do {} while (0) -#endif /* DEBUG */ - -/* ----- global variables --------------------------------------------- */ - -static int bit_test; /* see if the line-setting functions work */ -module_param(bit_test, int, S_IRUGO); -MODULE_PARM_DESC(bit_test, "lines testing - 0 off; 1 report; 2 fail if stuck"); - -#ifdef DEBUG -static int i2c_debug = 1; -module_param(i2c_debug, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(i2c_debug, - "debug level - 0 off; 1 normal; 2 verbose; 3 very verbose"); -#endif - -/* --- setting states on the bus with the right timing: --------------- */ - -#define setsda(adap, val) adap->setsda(adap->data, val) -#define setscl(adap, val) adap->setscl(adap->data, val) -#define getsda(adap) adap->getsda(adap->data) -#define getscl(adap) adap->getscl(adap->data) - -static inline void sdalo(struct i2c_algo_bit_data *adap) -{ - setsda(adap, 0); - udelay((adap->udelay + 1) / 2); -} - -static inline void sdahi(struct i2c_algo_bit_data *adap) -{ - setsda(adap, 1); - udelay((adap->udelay + 1) / 2); -} - -static inline void scllo(struct i2c_algo_bit_data *adap) -{ - setscl(adap, 0); - udelay(adap->udelay / 2); -} - -/* - * Raise scl line, and do checking for delays. This is necessary for slower - * devices. - */ -static int sclhi(struct i2c_algo_bit_data *adap) -{ - unsigned long start; - - setscl(adap, 1); - - /* Not all adapters have scl sense line... */ - if (!adap->getscl) - goto done; - - start = jiffies; - while (!getscl(adap)) { - /* This hw knows how to read the clock line, so we wait - * until it actually gets high. This is safer as some - * chips may hold it low ("clock stretching") while they - * are processing data internally. - */ - if (time_after(jiffies, start + adap->timeout)) { - /* Test one last time, as we may have been preempted - * between last check and timeout test. - */ - if (getscl(adap)) - break; - return -ETIMEDOUT; - } - cpu_relax(); - } -#ifdef DEBUG - if (jiffies != start && i2c_debug >= 3) - pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go high\n", - jiffies - start); -#endif - -done: - udelay(adap->udelay); - return 0; -} - - -/* --- other auxiliary functions -------------------------------------- */ -static void i2c_start(struct i2c_algo_bit_data *adap) -{ - /* assert: scl, sda are high */ - setsda(adap, 0); - udelay(adap->udelay); - scllo(adap); -} - -static void i2c_repstart(struct i2c_algo_bit_data *adap) -{ - /* assert: scl is low */ - sdahi(adap); - sclhi(adap); - setsda(adap, 0); - udelay(adap->udelay); - scllo(adap); -} - - -static void i2c_stop(struct i2c_algo_bit_data *adap) -{ - /* assert: scl is low */ - sdalo(adap); - sclhi(adap); - setsda(adap, 1); - udelay(adap->udelay); -} - - - -/* send a byte without start cond., look for arbitration, - check ackn. from slave */ -/* returns: - * 1 if the device acknowledged - * 0 if the device did not ack - * -ETIMEDOUT if an error occurred (while raising the scl line) - */ -static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) -{ - int i; - int sb; - int ack; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - /* assert: scl is low */ - for (i = 7; i >= 0; i--) { - sb = (c >> i) & 1; - setsda(adap, sb); - udelay((adap->udelay + 1) / 2); - if (sclhi(adap) < 0) { /* timed out */ - bit_dbg(1, &i2c_adap->dev, - "i2c_outb: 0x%02x, timeout at bit #%d\n", - (int)c, i); - return -ETIMEDOUT; - } - /* FIXME do arbitration here: - * if (sb && !getsda(adap)) -> ouch! Get out of here. - * - * Report a unique code, so higher level code can retry - * the whole (combined) message and *NOT* issue STOP. - */ - scllo(adap); - } - sdahi(adap); - if (sclhi(adap) < 0) { /* timeout */ - bit_dbg(1, &i2c_adap->dev, - "i2c_outb: 0x%02x, timeout at ack\n", (int)c); - return -ETIMEDOUT; - } - - /* read ack: SDA should be pulled down by slave, or it may - * NAK (usually to report problems with the data we wrote). - */ - ack = !getsda(adap); /* ack: sda is pulled low -> success */ - bit_dbg(2, &i2c_adap->dev, "i2c_outb: 0x%02x %s\n", (int)c, - ack ? "A" : "NA"); - - scllo(adap); - return ack; - /* assert: scl is low (sda undef) */ -} - - -static int i2c_inb(struct i2c_adapter *i2c_adap) -{ - /* read byte via i2c port, without start/stop sequence */ - /* acknowledge is sent in i2c_read. */ - int i; - unsigned char indata = 0; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - /* assert: scl is low */ - sdahi(adap); - for (i = 0; i < 8; i++) { - if (sclhi(adap) < 0) { /* timeout */ - bit_dbg(1, &i2c_adap->dev, - "i2c_inb: timeout at bit #%d\n", - 7 - i); - return -ETIMEDOUT; - } - indata *= 2; - if (getsda(adap)) - indata |= 0x01; - setscl(adap, 0); - udelay(i == 7 ? adap->udelay / 2 : adap->udelay); - } - /* assert: scl is low */ - return indata; -} - -/* - * Sanity check for the adapter hardware - check the reaction of - * the bus lines only if it seems to be idle. - */ -static int test_bus(struct i2c_adapter *i2c_adap) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - const char *name = i2c_adap->name; - int scl, sda, ret; - - if (adap->pre_xfer) { - ret = adap->pre_xfer(i2c_adap); - if (ret < 0) - return -ENODEV; - } - - if (adap->getscl == NULL) - pr_info("%s: Testing SDA only, SCL is not readable\n", name); - - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (!scl || !sda) { - printk(KERN_WARNING - "%s: bus seems to be busy (scl=%d, sda=%d)\n", - name, scl, sda); - goto bailout; - } - - sdalo(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (sda) { - printk(KERN_WARNING "%s: SDA stuck high!\n", name); - goto bailout; - } - if (!scl) { - printk(KERN_WARNING - "%s: SCL unexpected low while pulling SDA low!\n", - name); - goto bailout; - } - - sdahi(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (!sda) { - printk(KERN_WARNING "%s: SDA stuck low!\n", name); - goto bailout; - } - if (!scl) { - printk(KERN_WARNING - "%s: SCL unexpected low while pulling SDA high!\n", - name); - goto bailout; - } - - scllo(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 0 : getscl(adap); - if (scl) { - printk(KERN_WARNING "%s: SCL stuck high!\n", name); - goto bailout; - } - if (!sda) { - printk(KERN_WARNING - "%s: SDA unexpected low while pulling SCL low!\n", - name); - goto bailout; - } - - sclhi(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (!scl) { - printk(KERN_WARNING "%s: SCL stuck low!\n", name); - goto bailout; - } - if (!sda) { - printk(KERN_WARNING - "%s: SDA unexpected low while pulling SCL high!\n", - name); - goto bailout; - } - - if (adap->post_xfer) - adap->post_xfer(i2c_adap); - - pr_info("%s: Test OK\n", name); - return 0; -bailout: - sdahi(adap); - sclhi(adap); - - if (adap->post_xfer) - adap->post_xfer(i2c_adap); - - return -ENODEV; -} - -/* ----- Utility functions -*/ - -/* try_address tries to contact a chip for a number of - * times before it gives up. - * return values: - * 1 chip answered - * 0 chip did not answer - * -x transmission error - */ -static int try_address(struct i2c_adapter *i2c_adap, - unsigned char addr, int retries) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - int i, ret = 0; - - for (i = 0; i <= retries; i++) { - ret = i2c_outb(i2c_adap, addr); - if (ret == 1 || i == retries) - break; - bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); - i2c_stop(adap); - udelay(adap->udelay); - yield(); - bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); - i2c_start(adap); - } - if (i && ret) - bit_dbg(1, &i2c_adap->dev, - "Used %d tries to %s client at 0x%02x: %s\n", i + 1, - addr & 1 ? "read from" : "write to", addr >> 1, - ret == 1 ? "success" : "failed, timeout?"); - return ret; -} - -static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) -{ - const unsigned char *temp = msg->buf; - int count = msg->len; - unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; - int retval; - int wrcount = 0; - - while (count > 0) { - retval = i2c_outb(i2c_adap, *temp); - - /* OK/ACK; or ignored NAK */ - if ((retval > 0) || (nak_ok && (retval == 0))) { - count--; - temp++; - wrcount++; - - /* A slave NAKing the master means the slave didn't like - * something about the data it saw. For example, maybe - * the SMBus PEC was wrong. - */ - } else if (retval == 0) { - dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n"); - return -EIO; - - /* Timeout; or (someday) lost arbitration - * - * FIXME Lost ARB implies retrying the transaction from - * the first message, after the "winning" master issues - * its STOP. As a rule, upper layer code has no reason - * to know or care about this ... it is *NOT* an error. - */ - } else { - dev_err(&i2c_adap->dev, "sendbytes: error %d\n", - retval); - return retval; - } - } - return wrcount; -} - -static int acknak(struct i2c_adapter *i2c_adap, int is_ack) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - /* assert: sda is high */ - if (is_ack) /* send ack */ - setsda(adap, 0); - udelay((adap->udelay + 1) / 2); - if (sclhi(adap) < 0) { /* timeout */ - dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n"); - return -ETIMEDOUT; - } - scllo(adap); - return 0; -} - -static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) -{ - int inval; - int rdcount = 0; /* counts bytes read */ - unsigned char *temp = msg->buf; - int count = msg->len; - const unsigned flags = msg->flags; - - while (count > 0) { - inval = i2c_inb(i2c_adap); - if (inval >= 0) { - *temp = inval; - rdcount++; - } else { /* read timed out */ - break; - } - - temp++; - count--; - - /* Some SMBus transactions require that we receive the - transaction length as the first read byte. */ - if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) { - if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) { - if (!(flags & I2C_M_NO_RD_ACK)) - acknak(i2c_adap, 0); - dev_err(&i2c_adap->dev, - "readbytes: invalid block length (%d)\n", - inval); - return -EPROTO; - } - /* The original count value accounts for the extra - bytes, that is, either 1 for a regular transaction, - or 2 for a PEC transaction. */ - count += inval; - msg->len += inval; - } - - bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n", - inval, - (flags & I2C_M_NO_RD_ACK) - ? "(no ack/nak)" - : (count ? "A" : "NA")); - - if (!(flags & I2C_M_NO_RD_ACK)) { - inval = acknak(i2c_adap, count); - if (inval < 0) - return inval; - } - } - return rdcount; -} - -/* doAddress initiates the transfer by generating the start condition (in - * try_address) and transmits the address in the necessary format to handle - * reads, writes as well as 10bit-addresses. - * returns: - * 0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set - * -x an error occurred (like: -ENXIO if the device did not answer, or - * -ETIMEDOUT, for example if the lines are stuck...) - */ -static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) -{ - unsigned short flags = msg->flags; - unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - unsigned char addr; - int ret, retries; - - retries = nak_ok ? 0 : i2c_adap->retries; - - if (flags & I2C_M_TEN) { - /* a ten bit address */ - addr = 0xf0 | ((msg->addr >> 7) & 0x06); - bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr); - /* try extended address code...*/ - ret = try_address(i2c_adap, addr, retries); - if ((ret != 1) && !nak_ok) { - dev_err(&i2c_adap->dev, - "died at extended address code\n"); - return -ENXIO; - } - /* the remaining 8 bit address */ - ret = i2c_outb(i2c_adap, msg->addr & 0xff); - if ((ret != 1) && !nak_ok) { - /* the chip did not ack / xmission error occurred */ - dev_err(&i2c_adap->dev, "died at 2nd address code\n"); - return -ENXIO; - } - if (flags & I2C_M_RD) { - bit_dbg(3, &i2c_adap->dev, - "emitting repeated start condition\n"); - i2c_repstart(adap); - /* okay, now switch into reading mode */ - addr |= 0x01; - ret = try_address(i2c_adap, addr, retries); - if ((ret != 1) && !nak_ok) { - dev_err(&i2c_adap->dev, - "died at repeated address code\n"); - return -EIO; - } - } - } else { /* normal 7bit address */ - addr = i2c_8bit_addr_from_msg(msg); - if (flags & I2C_M_REV_DIR_ADDR) - addr ^= 1; - ret = try_address(i2c_adap, addr, retries); - if ((ret != 1) && !nak_ok) - return -ENXIO; - } - - return 0; -} - -static void bit_i2c_unblock(struct i2c_adapter *i2c_adap) -{ - int i; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - for (i = 0; i < 9; i++) { - setscl(adap, 0); - udelay(5); - setscl(adap, 1); - udelay(5); - } - setscl(adap, 0); - setsda(adap, 0); - udelay(5); - setscl(adap, 1); - udelay(5); - setsda(adap, 1); -} - -static int check_bit_i2c_unblock(struct i2c_adapter *i2c_adap) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - int sda, scl; - - sda = getsda(adap); - scl = getscl(adap); - if ((sda == 0) && scl) { - // I2C_ALGO_BIT_ERROR("SCL is high and SDA is low, send 9 clock to device.\n"); - bit_i2c_unblock(i2c_adap); - } - - sda = getsda(adap); - scl = getscl(adap); - if (sda && scl) { - // I2C_ALGO_BIT_DEBUG("SCL and SDA are both high, i2c level check ok.\n"); - return 0; - } - dev_warn(&i2c_adap->dev, "Check i2c level failed, SCL %s, SDA %s.\n", scl ? "high" : "low", sda ? "high" : "low"); - return -EIO; -} - -static int bit_xfer(struct i2c_adapter *i2c_adap, - struct i2c_msg msgs[], int num) -{ - struct i2c_msg *pmsg; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - int i, ret; - unsigned short nak_ok; - - if (adap->pre_xfer) { - ret = adap->pre_xfer(i2c_adap); - if (ret < 0) - return ret; - } - - if (check_bit_i2c_unblock(i2c_adap) < 0) { - // I2C_ALGO_BIT_ERROR("check i2c is block.\n"); - return -EIO; - } - - bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); - i2c_start(adap); - for (i = 0; i < num; i++) { - pmsg = &msgs[i]; - nak_ok = pmsg->flags & I2C_M_IGNORE_NAK; - if (!(pmsg->flags & I2C_M_NOSTART)) { - if (i) { - if (msgs[i - 1].flags & I2C_M_STOP) { - bit_dbg(3, &i2c_adap->dev, - "emitting enforced stop/start condition\n"); - i2c_stop(adap); - i2c_start(adap); - } else { - bit_dbg(3, &i2c_adap->dev, - "emitting repeated start condition\n"); - i2c_repstart(adap); - } - } - ret = bit_doAddress(i2c_adap, pmsg); - if ((ret != 0) && !nak_ok) { - bit_dbg(1, &i2c_adap->dev, - "NAK from device addr 0x%02x msg #%d\n", - msgs[i].addr, i); - goto bailout; - } - } - if (pmsg->flags & I2C_M_RD) { - /* read bytes into buffer*/ - ret = readbytes(i2c_adap, pmsg); - if (ret >= 1) - bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n", - ret, ret == 1 ? "" : "s"); - if (ret < pmsg->len) { - if (ret >= 0) - ret = -EIO; - goto bailout; - } - } else { - /* write bytes from buffer */ - ret = sendbytes(i2c_adap, pmsg); - if (ret >= 1) - bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n", - ret, ret == 1 ? "" : "s"); - if (ret < pmsg->len) { - if (ret >= 0) - ret = -EIO; - goto bailout; - } - } - } - ret = i; - -bailout: - bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); - i2c_stop(adap); - - if (adap->post_xfer) - adap->post_xfer(i2c_adap); - return ret; -} - -static u32 bit_func(struct i2c_adapter *adap) -{ - return I2C_FUNC_I2C | I2C_FUNC_NOSTART | I2C_FUNC_SMBUS_EMUL | - I2C_FUNC_SMBUS_READ_BLOCK_DATA | - I2C_FUNC_SMBUS_BLOCK_PROC_CALL | - I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING; -} - - -/* -----exported algorithm data: ------------------------------------- */ - -const struct i2c_algorithm rg_i2c_bit_algo = { - .master_xfer = bit_xfer, - .functionality = bit_func, -}; -EXPORT_SYMBOL(rg_i2c_bit_algo); - -static const struct i2c_adapter_quirks i2c_bit_quirk_no_clk_stretch = { - .flags = I2C_AQ_NO_CLK_STRETCH, -}; - -/* - * registering functions to load algorithms at runtime - */ -static int __i2c_bit_add_bus(struct i2c_adapter *adap, - int (*add_adapter)(struct i2c_adapter *)) -{ - struct i2c_algo_bit_data *bit_adap = adap->algo_data; - int ret; - - if (bit_test) { - ret = test_bus(adap); - if (bit_test >= 2 && ret < 0) - return -ENODEV; - } - - /* register new adapter to i2c module... */ - adap->algo = &rg_i2c_bit_algo; - adap->retries = 3; - if (bit_adap->getscl == NULL) - adap->quirks = &i2c_bit_quirk_no_clk_stretch; - - /* - * We tried forcing SCL/SDA to an initial state here. But that caused a - * regression, sadly. Check Bugzilla #200045 for details. - */ - - ret = add_adapter(adap); - if (ret < 0) - return ret; - - /* Complain if SCL can't be read */ - if (bit_adap->getscl == NULL) { - dev_warn(&adap->dev, "Not I2C compliant: can't read SCL\n"); - dev_warn(&adap->dev, "Bus may be unreliable\n"); - } - return 0; -} - -int rg_i2c_bit_add_bus(struct i2c_adapter *adap) -{ - return __i2c_bit_add_bus(adap, i2c_add_adapter); -} -EXPORT_SYMBOL(rg_i2c_bit_add_bus); - -int rg_i2c_bit_add_numbered_bus(struct i2c_adapter *adap) -{ - return __i2c_bit_add_bus(adap, i2c_add_numbered_adapter); -} -EXPORT_SYMBOL(rg_i2c_bit_add_numbered_bus); - -MODULE_AUTHOR("Simon G. Vogl "); -MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c deleted file mode 100644 index bce3afac61a5..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Bitbanging I2C bus driver using the GPIO API - * - * Copyright (C) 2007 Atmel Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int rg_i2c_bit_add_numbered_bus(struct i2c_adapter *adap); - -struct i2c_gpio_private_data { - struct gpio_desc *sda; - struct gpio_desc *scl; - struct i2c_adapter adap; - struct i2c_algo_bit_data bit_data; - struct i2c_gpio_platform_data pdata; -#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR - struct dentry *debug_dir; -#endif -}; - -/* - * Toggle SDA by changing the output value of the pin. This is only - * valid for pins configured as open drain (i.e. setting the value - * high effectively turns off the output driver.) - */ -static void i2c_gpio_setsda_val(void *data, int state) -{ - struct i2c_gpio_private_data *priv = data; - - gpiod_set_value_cansleep(priv->sda, state); -} - -/* - * Toggle SCL by changing the output value of the pin. This is used - * for pins that are configured as open drain and for output-only - * pins. The latter case will break the i2c protocol, but it will - * often work in practice. - */ -static void i2c_gpio_setscl_val(void *data, int state) -{ - struct i2c_gpio_private_data *priv = data; - - gpiod_set_value_cansleep(priv->scl, state); -} - -static int i2c_gpio_getsda(void *data) -{ - struct i2c_gpio_private_data *priv = data; - - return gpiod_get_value_cansleep(priv->sda); -} - -static int i2c_gpio_getscl(void *data) -{ - struct i2c_gpio_private_data *priv = data; - - return gpiod_get_value_cansleep(priv->scl); -} - -#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR -static struct dentry *i2c_gpio_debug_dir; - -#define setsda(bd, val) ((bd)->setsda((bd)->data, val)) -#define setscl(bd, val) ((bd)->setscl((bd)->data, val)) -#define getsda(bd) ((bd)->getsda((bd)->data)) -#define getscl(bd) ((bd)->getscl((bd)->data)) - -#define WIRE_ATTRIBUTE(wire) \ - static int fops_##wire##_get(void *data, u64 *val) \ -{ \ - struct i2c_gpio_private_data *priv = data; \ - \ - i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - *val = get##wire(&priv->bit_data); \ - i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - return 0; \ -} \ -static int fops_##wire##_set(void *data, u64 val) \ -{ \ - struct i2c_gpio_private_data *priv = data; \ - \ - i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - set##wire(&priv->bit_data, val); \ - i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - return 0; \ -} \ -DEFINE_DEBUGFS_ATTRIBUTE(fops_##wire, fops_##wire##_get, fops_##wire##_set, "%llu\n") - -WIRE_ATTRIBUTE(scl); -WIRE_ATTRIBUTE(sda); - -static void i2c_gpio_incomplete_transfer(struct i2c_gpio_private_data *priv, - u32 pattern, u8 pattern_size) -{ - struct i2c_algo_bit_data *bit_data = &priv->bit_data; - int i; - - i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); - - /* START condition */ - setsda(bit_data, 0); - udelay(bit_data->udelay); - - /* Send pattern, request ACK, don't send STOP */ - for (i = pattern_size - 1; i >= 0; i--) { - setscl(bit_data, 0); - udelay(bit_data->udelay / 2); - setsda(bit_data, (pattern >> i) & 1); - udelay((bit_data->udelay + 1) / 2); - setscl(bit_data, 1); - udelay(bit_data->udelay); - } - - i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); -} - -static int fops_incomplete_addr_phase_set(void *data, u64 addr) -{ - struct i2c_gpio_private_data *priv = data; - u32 pattern; - - if (addr > 0x7f) - return -EINVAL; - - /* ADDR (7 bit) + RD (1 bit) + Client ACK, keep SDA hi (1 bit) */ - pattern = (addr << 2) | 3; - - i2c_gpio_incomplete_transfer(priv, pattern, 9); - - return 0; -} -DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_addr_phase, NULL, fops_incomplete_addr_phase_set, "%llu\n"); - -static int fops_incomplete_write_byte_set(void *data, u64 addr) -{ - struct i2c_gpio_private_data *priv = data; - u32 pattern; - - if (addr > 0x7f) - return -EINVAL; - - /* ADDR (7 bit) + WR (1 bit) + Client ACK (1 bit) */ - pattern = (addr << 2) | 1; - /* 0x00 (8 bit) + Client ACK, keep SDA hi (1 bit) */ - pattern = (pattern << 9) | 1; - - i2c_gpio_incomplete_transfer(priv, pattern, 18); - - return 0; -} -DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_write_byte, NULL, fops_incomplete_write_byte_set, "%llu\n"); - -static void i2c_gpio_fault_injector_init(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); - - /* - * If there will be a debugfs-dir per i2c adapter somewhen, put the - * 'fault-injector' dir there. Until then, we have a global dir with - * all adapters as subdirs. - */ - if (!i2c_gpio_debug_dir) { - i2c_gpio_debug_dir = debugfs_create_dir("i2c-fault-injector", NULL); - if (!i2c_gpio_debug_dir) - return; - } - - priv->debug_dir = debugfs_create_dir(pdev->name, i2c_gpio_debug_dir); - if (!priv->debug_dir) - return; - - debugfs_create_file_unsafe("scl", 0600, priv->debug_dir, priv, &fops_scl); - debugfs_create_file_unsafe("sda", 0600, priv->debug_dir, priv, &fops_sda); - debugfs_create_file_unsafe("incomplete_address_phase", 0200, priv->debug_dir, - priv, &fops_incomplete_addr_phase); - debugfs_create_file_unsafe("incomplete_write_byte", 0200, priv->debug_dir, - priv, &fops_incomplete_write_byte); -} - -static void i2c_gpio_fault_injector_exit(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); - - debugfs_remove_recursive(priv->debug_dir); -} -#else -static inline void i2c_gpio_fault_injector_init(struct platform_device *pdev) {} -static inline void i2c_gpio_fault_injector_exit(struct platform_device *pdev) {} -#endif /* CONFIG_I2C_GPIO_FAULT_INJECTOR*/ - -static void of_i2c_gpio_get_props(struct device_node *np, - struct i2c_gpio_platform_data *pdata) -{ - u32 reg; - - of_property_read_u32(np, "i2c-gpio,delay-us", &pdata->udelay); - - if (!of_property_read_u32(np, "i2c-gpio,timeout-ms", ®)) - pdata->timeout = msecs_to_jiffies(reg); - - pdata->sda_is_open_drain = - of_property_read_bool(np, "i2c-gpio,sda-open-drain"); - pdata->scl_is_open_drain = - of_property_read_bool(np, "i2c-gpio,scl-open-drain"); - pdata->scl_is_output_only = - of_property_read_bool(np, "i2c-gpio,scl-output-only"); -} - -static struct gpio_desc *i2c_gpio_get_desc(struct device *dev, - const char *con_id, - unsigned int index, - enum gpiod_flags gflags) -{ - struct gpio_desc *retdesc; - int ret; - - retdesc = devm_gpiod_get(dev, con_id, gflags); - if (!IS_ERR(retdesc)) { - dev_dbg(dev, "got GPIO from name %s\n", con_id); - return retdesc; - } - - retdesc = devm_gpiod_get_index(dev, NULL, index, gflags); - if (!IS_ERR(retdesc)) { - dev_dbg(dev, "got GPIO from index %u\n", index); - return retdesc; - } - - ret = PTR_ERR(retdesc); - - /* FIXME: hack in the old code, is this really necessary? */ - if (ret == -EINVAL) - retdesc = ERR_PTR(-EPROBE_DEFER); - - /* This happens if the GPIO driver is not yet probed, let's defer */ - if (ret == -ENOENT) - retdesc = ERR_PTR(-EPROBE_DEFER); - - if (PTR_ERR(retdesc) != -EPROBE_DEFER) - dev_err(dev, "error trying to get descriptor: %d\n", ret); - - return retdesc; -} - -static int i2c_gpio_probe(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv; - struct i2c_gpio_platform_data *pdata; - struct i2c_algo_bit_data *bit_data; - struct i2c_adapter *adap; - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; - enum gpiod_flags gflags; - int ret; - - priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - adap = &priv->adap; - bit_data = &priv->bit_data; - pdata = &priv->pdata; - - if (np) { - of_i2c_gpio_get_props(np, pdata); - } else { - /* - * If all platform data settings are zero it is OK - * to not provide any platform data from the board. - */ - if (dev_get_platdata(dev)) - memcpy(pdata, dev_get_platdata(dev), sizeof(*pdata)); - } - - /* - * First get the GPIO pins; if it fails, we'll defer the probe. - * If the SDA line is marked from platform data or device tree as - * "open drain" it means something outside of our control is making - * this line being handled as open drain, and we should just handle - * it as any other output. Else we enforce open drain as this is - * required for an I2C bus. - */ - if (pdata->sda_is_open_drain) - gflags = GPIOD_OUT_HIGH; - else - gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; - priv->sda = i2c_gpio_get_desc(dev, "sda", 0, gflags); - if (IS_ERR(priv->sda)) - return PTR_ERR(priv->sda); - - /* - * If the SCL line is marked from platform data or device tree as - * "open drain" it means something outside of our control is making - * this line being handled as open drain, and we should just handle - * it as any other output. Else we enforce open drain as this is - * required for an I2C bus. - */ - if (pdata->scl_is_open_drain) - gflags = GPIOD_OUT_HIGH; - else - gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; - priv->scl = i2c_gpio_get_desc(dev, "scl", 1, gflags); - if (IS_ERR(priv->scl)) - return PTR_ERR(priv->scl); - - if (gpiod_cansleep(priv->sda) || gpiod_cansleep(priv->scl)) - dev_warn(dev, "Slow GPIO pins might wreak havoc into I2C/SMBus bus timing"); - - bit_data->setsda = i2c_gpio_setsda_val; - bit_data->setscl = i2c_gpio_setscl_val; - - if (!pdata->scl_is_output_only) - bit_data->getscl = i2c_gpio_getscl; - bit_data->getsda = i2c_gpio_getsda; - - if (pdata->udelay) - bit_data->udelay = pdata->udelay; - else if (pdata->scl_is_output_only) - bit_data->udelay = 50; /* 10 kHz */ - else - bit_data->udelay = 5; /* 100 kHz */ - - if (pdata->timeout) - bit_data->timeout = pdata->timeout; - else - bit_data->timeout = HZ / 10; /* 100 ms */ - - bit_data->data = priv; - - adap->owner = THIS_MODULE; - if (np) - strlcpy(adap->name, dev_name(dev), sizeof(adap->name)); - else - snprintf(adap->name, sizeof(adap->name), "i2c-gpio%d", pdev->id); - - adap->algo_data = bit_data; - adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; - adap->dev.parent = dev; - adap->dev.of_node = np; - - adap->nr = pdev->id; - ret = rg_i2c_bit_add_numbered_bus(adap); - if (ret) - return ret; - - platform_set_drvdata(pdev, priv); - - /* - * FIXME: using global GPIO numbers is not helpful. If/when we - * get accessors to get the actual name of the GPIO line, - * from the descriptor, then provide that instead. - */ - dev_info(dev, "using lines %u (SDA) and %u (SCL%s)\n", - desc_to_gpio(priv->sda), desc_to_gpio(priv->scl), - pdata->scl_is_output_only - ? ", no clock stretching" : ""); - - i2c_gpio_fault_injector_init(pdev); - - return 0; -} - -static int i2c_gpio_remove(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv; - struct i2c_adapter *adap; - - i2c_gpio_fault_injector_exit(pdev); - - priv = platform_get_drvdata(pdev); - adap = &priv->adap; - - i2c_del_adapter(adap); - - return 0; -} - -#if defined(CONFIG_OF) -static const struct of_device_id i2c_gpio_dt_ids[] = { - { .compatible = "rg-i2c-gpio", }, - { /* sentinel */ } -}; - -MODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids); -#endif - -static struct platform_driver i2c_gpio_driver = { - .driver = { - .name = "rg-i2c-gpio", - .of_match_table = of_match_ptr(i2c_gpio_dt_ids), - }, - .probe = i2c_gpio_probe, - .remove = i2c_gpio_remove, -}; - -static int __init i2c_gpio_init(void) -{ - int ret; - - ret = platform_driver_register(&i2c_gpio_driver); - if (ret) - printk(KERN_ERR "i2c-gpio: probe failed: %d\n", ret); - - return ret; -} -subsys_initcall(i2c_gpio_init); - -static void __exit i2c_gpio_exit(void) -{ - platform_driver_unregister(&i2c_gpio_driver); -} -module_exit(i2c_gpio_exit); - -MODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); -MODULE_DESCRIPTION("Platform-independent bitbanging I2C driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:i2c-gpio"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c deleted file mode 100755 index f8a70adeee27..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * rg_fan.c - A driver for control rg_fan base on rg_fan.c - * - * Copyright (c) 1998, 1999 Frodo Looijaard - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define FAN_SIZE (256) -#define SYS_FAN_BUF_LEN (64) - -typedef enum { - DBG_START, - DBG_VERBOSE, - DBG_KEY, - DBG_WARN, - DBG_ERROR, - DBG_END, -} dbg_level_t; - -static int debuglevel = 0; - -#define DBG_DEBUG(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ - printk(KERN_INFO "[DEBUG]:<%s, %d>:" fmt, \ - __FUNCTION__, __LINE__, ##arg); \ - } else if (debuglevel >= DBG_ERROR) { \ - printk(KERN_ERR "[DEBUG]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } else { \ - } \ - } while (0) - -#define DBG_ERROR(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START) { \ - printk(KERN_ERR "[ERROR]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } \ - } while (0) - -extern s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command); -extern s32 platform_i2c_smbus_read_i2c_block_data( - const struct i2c_client *client, u8 command, u8 length, u8 *values); -extern s32 platform_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command); - -typedef enum dfd_dev_info_type_e { - DFD_DEV_INFO_TYPE_MAC = 1, - DFD_DEV_INFO_TYPE_NAME = 2, - DFD_DEV_INFO_TYPE_SN = 3, - DFD_DEV_INFO_TYPE_PWR_CONS = 4, - DFD_DEV_INFO_TYPE_HW_INFO = 5, - DFD_DEV_INFO_TYPE_DEV_TYPE = 6, -} dfd_dev_tlv_type_t; - -typedef struct dfd_dev_head_info_s { - uint8_t ver; /* define E2PROM version,default is 0x01 */ - uint8_t flag; /* flag is 0x7E in new version E2PROM */ - uint8_t hw_ver; /* consists of main version and revise version */ - uint8_t type; /* HW type */ - int16_t tlv_len; /* 16 bits */ -} dfd_dev_head_info_t; - -typedef struct dfd_dev_tlv_info_s { - uint8_t type; - uint8_t len; - uint8_t data[0]; -} dfd_dev_tlv_info_t; - -struct fan_data { - struct i2c_client *client; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated[8]; /* In jiffies */ - u8 data[FAN_SIZE]; /* Register value */ -}; - -static ssize_t show_fan_sysfs_tlv_value(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct fan_data *data = i2c_get_clientdata(client); - - dfd_dev_head_info_t info; - uint8_t tmp_tlv_len[sizeof(uint16_t)]; - uint8_t *tlv_data; - dfd_dev_tlv_info_t *tlv; - int type; - int buf_len = SYS_FAN_BUF_LEN - 1; - u8 sysfs_buf[SYS_FAN_BUF_LEN]; - int i; - int ret = 0; - - mutex_lock(&data->update_lock); - memset(sysfs_buf, 0, SYS_FAN_BUF_LEN); - ret = platform_i2c_smbus_read_i2c_block_data( - client, 0, sizeof(dfd_dev_head_info_t), (uint8_t *)&info); - if (ret != sizeof(dfd_dev_head_info_t)) { - DBG_ERROR("fan maybe not set mac or not present0"); - goto exit; - } - - /* transform TLV_LEN */ - memcpy(tmp_tlv_len, (uint8_t *)&info.tlv_len, sizeof(int16_t)); - info.tlv_len = (tmp_tlv_len[0] << 8) + tmp_tlv_len[1]; - - if ((info.tlv_len <= 0) || (info.tlv_len > 0xFF)) { - DBG_ERROR("fan maybe not set mac or not present1"); - goto exit; - } - - type = attr->index; - tlv_data = (uint8_t *)kmalloc(info.tlv_len, GFP_KERNEL); - memset(tlv_data, 0, info.tlv_len); - - if (i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { - for (i = 0; i < info.tlv_len; i += 32) - if (platform_i2c_smbus_read_i2c_block_data(client, - sizeof(dfd_dev_head_info_t) + i, - 32, tlv_data + i) != 32) - break; - } - - DBG_DEBUG("TLV Len:%d\n", (int)sizeof(dfd_dev_tlv_info_t)); - for (tlv = (dfd_dev_tlv_info_t *)tlv_data; - (ulong)tlv < (ulong)tlv_data + info.tlv_len;) { - DBG_DEBUG( - "tlv: %p, tlv->type: 0x%x, tlv->len: 0x%x info->tlv_len: 0x%x\n", - tlv, tlv->type, tlv->len, info.tlv_len); - if (tlv->type == type && buf_len >= tlv->len) { - memcpy((uint8_t *)sysfs_buf, (uint8_t *)tlv->data, - tlv->len); - buf_len = (uint32_t)tlv->len; - break; - } - tlv = (dfd_dev_tlv_info_t *)((uint8_t *)tlv + - sizeof(dfd_dev_tlv_info_t) + - tlv->len); - } - - kfree(tlv_data); - DBG_DEBUG("value: %s \n", sysfs_buf); -exit: - mutex_unlock(&data->update_lock); - return sprintf(buf, "%s\n", sysfs_buf); -} - -static ssize_t show_fan_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct fan_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - int i; - - mutex_lock(&data->update_lock); - - if (i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { - for (i = 0; i < FAN_SIZE; i += 32) { - if (platform_i2c_smbus_read_i2c_block_data( - client, i, 32, data->data + i) != 32) - goto exit; - } - } else { - for (i = 0; i < FAN_SIZE; i += 2) { - int word = platform_i2c_smbus_read_word_data(client, i); - if (word < 0) - goto exit; - data->data[i] = word & 0xff; - data->data[i + 1] = word >> 8; - } - } - memcpy(buf, &data->data[0], FAN_SIZE); -exit: - mutex_unlock(&data->update_lock); - return FAN_SIZE; -} - -static SENSOR_DEVICE_ATTR(fan_hw_version, S_IRUGO, show_fan_sysfs_tlv_value, NULL, DFD_DEV_INFO_TYPE_HW_INFO); -static SENSOR_DEVICE_ATTR(fan_sn, S_IRUGO, show_fan_sysfs_tlv_value, NULL, DFD_DEV_INFO_TYPE_SN); -static SENSOR_DEVICE_ATTR(fan_type, S_IRUGO, show_fan_sysfs_tlv_value, NULL, DFD_DEV_INFO_TYPE_NAME); -static SENSOR_DEVICE_ATTR(fan, S_IRUGO, show_fan_value, NULL, 0); - -static struct attribute *fan_sysfs_attrs[] = { - &sensor_dev_attr_fan_hw_version.dev_attr.attr, - &sensor_dev_attr_fan_sn.dev_attr.attr, - &sensor_dev_attr_fan_type.dev_attr.attr, - &sensor_dev_attr_fan.dev_attr.attr, - NULL -}; - -static const struct attribute_group fan_sysfs_group = { - .attrs = fan_sysfs_attrs, -}; - -static int fan_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct fan_data *data; - int status; - - status = -1; - DBG_DEBUG("fan_probe(0x%02x)\n", client->addr); - data = devm_kzalloc(&client->dev, sizeof(struct fan_data), GFP_KERNEL); - if (!data) { - return -ENOMEM; - } - - data->client = client; - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - status = sysfs_create_group(&client->dev.kobj, &fan_sysfs_group); - if (status != 0) { - DBG_ERROR(" sysfs_create_group err\n"); - return status; - } - return 0; -} - -static int fan_remove(struct i2c_client *client) -{ - sysfs_remove_group(&client->dev.kobj, &fan_sysfs_group); - return 0; -} - -static const struct i2c_device_id fan_id[] = { { "rg_fan", 0 }, {} }; -MODULE_DEVICE_TABLE(i2c, fan_id); - -static struct i2c_driver rg_fan_driver = { - .driver = { - .name = "rg_fan", - }, - .probe = fan_probe, - .remove = fan_remove, - .id_table = fan_id, -}; - -module_i2c_driver(rg_fan_driver); -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile fan driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c deleted file mode 100755 index 78abd41cf525..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - * rg_cpld.c - A driver for pmbus psu - * - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAGIC_PSU_RATE (0xA7) -#define MAGIC_PSU_OUT_CURRENT (0x8C) -#define MAGIC_PSU_OUT_VOLTAGE (0x8B) -#define MAGIC_PSU_IN_VOLTAGE (0x88) -#define MAGIC_PSU_IN_CURRENT (0x89) -#define MAGIC_PSU_TEMP (0x8D) -#define MAGIC_PSU_TYPE (0x25) -#define MAGIC_PSU_SN (0x38) -#define MAGIC_PSU_HW (0x35) -#define PSU_SIZE (256) - -typedef enum { - DBG_START, - DBG_VERBOSE, - DBG_KEY, - DBG_WARN, - DBG_ERROR, - DBG_END, -} dbg_level_t; - -static int debuglevel = 0; - -#define DBG_DEBUG(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ - printk(KERN_INFO "[DEBUG]:<%s, %d>:" fmt, \ - __FUNCTION__, __LINE__, ##arg); \ - } else if (debuglevel >= DBG_ERROR) { \ - printk(KERN_ERR "[DEBUG]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } else { \ - } \ - } while (0) - -#define DBG_INFO(fmt, arg...) \ - do { \ - if (debuglevel > DBG_KEY) { \ - printk(KERN_INFO "[INFO]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } \ - } while (0) - -#define DBG_ERROR(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START) { \ - printk(KERN_ERR "[ERROR]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } \ - } while (0) - -static const unsigned short rg_i2c_psu[] = { 0x50, 0x53, 0x58, 0x5b, I2C_CLIENT_END }; - -extern s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command); -extern s32 platform_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, - u8 command, u8 length, u8 *values); - -struct psu_data { - struct i2c_client *client; - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 data[PSU_SIZE]; /* Register value */ -}; - -static ssize_t show_psu_sysfs_value(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_sysfs_15_value(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_psu_value(struct device *dev, struct device_attribute *da, char *buf); - -static SENSOR_DEVICE_ATTR(psu_rate, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_RATE); -static SENSOR_DEVICE_ATTR(psu_out_current, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_OUT_CURRENT); -static SENSOR_DEVICE_ATTR(psu_out_voltage, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_OUT_VOLTAGE); -static SENSOR_DEVICE_ATTR(psu_in_voltage, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_IN_VOLTAGE); -static SENSOR_DEVICE_ATTR(psu_in_current, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_IN_CURRENT); -static SENSOR_DEVICE_ATTR(psu_temp, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_TEMP); -static SENSOR_DEVICE_ATTR(psu_type, S_IRUGO, show_sysfs_15_value, NULL, MAGIC_PSU_TYPE); -static SENSOR_DEVICE_ATTR(psu_sn, S_IRUGO, show_sysfs_15_value, NULL, MAGIC_PSU_SN); -static SENSOR_DEVICE_ATTR(psu_hw, S_IRUGO, show_psu_value, NULL, MAGIC_PSU_HW); - -static struct attribute *psu_pmbus_sysfs_attrs[] = { - &sensor_dev_attr_psu_rate.dev_attr.attr, - &sensor_dev_attr_psu_out_current.dev_attr.attr, - &sensor_dev_attr_psu_out_voltage.dev_attr.attr, - &sensor_dev_attr_psu_in_voltage.dev_attr.attr, - &sensor_dev_attr_psu_in_current.dev_attr.attr, - &sensor_dev_attr_psu_temp.dev_attr.attr, - NULL -}; - -static struct attribute *psu_fru_sysfs_attrs[] = { - &sensor_dev_attr_psu_type.dev_attr.attr, - &sensor_dev_attr_psu_sn.dev_attr.attr, - &sensor_dev_attr_psu_hw.dev_attr.attr, - NULL -}; - -static const struct attribute_group psu_pmbus_sysfs_attrs_group = { - .attrs = psu_pmbus_sysfs_attrs, -}; - -static const struct attribute_group psu_fru_sysfs_attrs_group = { - .attrs = psu_fru_sysfs_attrs, -}; - -static ssize_t show_psu_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - char psu_buf[PSU_SIZE]; - memset(psu_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 2, psu_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu\n"); - } - DBG_DEBUG("cpld reg pos:0x%x value:0x%02x\n", attr->index, data->data[0]); - mutex_unlock(&data->update_lock); - return snprintf(buf, 3, "%s\n", psu_buf); -} - -static int linear_to_value(short reg, bool v_out) -{ - short exponent; - int mantissa; - long val; - - if (v_out) { - exponent = -9; - mantissa = reg; - } else { - exponent = reg >> 11; - mantissa = (((reg & 0x7ff) << 5)) >> 5; - } - val = mantissa; - val = val * 1000L; - if (exponent >= 0) { - val <<= exponent; - } else { - val >>= -exponent; - } - - return val; -} - -static ssize_t show_psu_sysfs_value(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - u8 smbud_buf[PSU_SIZE]; - uint16_t value; - int result; - - ret = -1; - memset(smbud_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - DBG_DEBUG("ret:%d", ret); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 2, smbud_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu \n"); - } - value = smbud_buf[1]; - value = value << 8; - value |= smbud_buf[0]; - - if (attr->index == 0x8b) { - result = linear_to_value(value, true); - } else { - result = linear_to_value(value, false); - } - mutex_unlock(&data->update_lock); - return snprintf(buf, PSU_SIZE, "%d\n", result); -} - -static ssize_t show_sysfs_15_value(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - u8 smbud_buf[PSU_SIZE]; - - memset(smbud_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 15, smbud_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu\n"); - } - mutex_unlock(&data->update_lock); - return snprintf(buf, PSU_SIZE, "%s\n", smbud_buf); -} - -static ssize_t show_sysfs_13_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - u8 smbud_buf[PSU_SIZE]; - - memset(smbud_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 13, smbud_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu \n"); - } - mutex_unlock(&data->update_lock); - return snprintf(buf, PSU_SIZE, "%s\n", smbud_buf); -} - -static int psu_detect(struct i2c_client *new_client, - struct i2c_board_info *info) -{ - struct i2c_adapter *adapter = new_client->adapter; - int conf; - - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | - I2C_FUNC_SMBUS_WORD_DATA)) - return -ENODEV; - conf = platform_i2c_smbus_read_byte_data(new_client, 0); - if (!conf) - return -ENODEV; - - return 0; -} - -static int psu_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct psu_data *data; - int status; - - status = -1; - data = devm_kzalloc(&client->dev, sizeof(struct psu_data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->client = client; - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - switch (client->addr) { - case 0x50: - case 0x53: - status = sysfs_create_group(&client->dev.kobj, - &psu_fru_sysfs_attrs_group); - if (status != 0) { - DBG_ERROR("%s %d sysfs_create_group err\n", __func__, __LINE__); - } - break; - case 0x58: - case 0x5b: - status = sysfs_create_group(&client->dev.kobj, - &psu_pmbus_sysfs_attrs_group); - if (status != 0) { - DBG_ERROR("%s %d sysfs_create_group err\n", __func__, __LINE__); - break; - } - break; - default: - break; - } - - return status; -} - -static int psu_remove(struct i2c_client *client) -{ - switch (client->addr) { - case 0x50: - case 0x53: - sysfs_remove_group(&client->dev.kobj, &psu_fru_sysfs_attrs_group); - break; - case 0x58: - case 0x5b: - sysfs_remove_group(&client->dev.kobj, &psu_pmbus_sysfs_attrs_group); - break; - default: - break; - } - return 0; -} - -static const struct i2c_device_id psu_id[] = { - { "rg_psu", 0 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, psu_id); - -static struct i2c_driver rg_psu_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "rg_psu", - }, - .probe = psu_probe, - .remove = psu_remove, - .id_table = psu_id, - .detect = psu_detect, - .address_list = rg_i2c_psu, -}; - -module_i2c_driver(rg_psu_driver); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile pmbus psu driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h new file mode 100644 index 000000000000..47bb9b898dfd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h @@ -0,0 +1,107 @@ +/* + * Mix this utility code with some glue code to get one of several types of + * simple SPI master driver. Two do polled word-at-a-time I/O: + * + * - GPIO/parport bitbangers. Provide chipselect() and txrx_word[](), + * expanding the per-word routines from the inline templates below. + * + * - Drivers for controllers resembling bare shift registers. Provide + * chipselect() and txrx_word[](), with custom setup()/cleanup() methods + * that use your controller's clock and chipselect registers. + * + * Some hardware works well with requests at spi_transfer scope: + * + * - Drivers leveraging smarter hardware, with fifos or DMA; or for half + * duplex (MicroWire) controllers. Provide chipselect() and txrx_bufs(), + * and custom setup()/cleanup() methods. + */ + +/* + * The code that knows what GPIO pins do what should have declared four + * functions, ideally as inlines, before including this header: + * + * void setsck(struct spi_device *, int is_on); + * void setmosi(struct spi_device *, int is_on); + * int getmiso(struct spi_device *); + * void spidelay(unsigned); + * + * setsck()'s is_on parameter is a zero/nonzero boolean. + * + * setmosi()'s is_on parameter is a zero/nonzero boolean. + * + * getmiso() is required to return 0 or 1 only. Any other value is invalid + * and will result in improper operation. + * + * A non-inlined routine would call bitbang_txrx_*() routines. The + * main loop could easily compile down to a handful of instructions, + * especially if the delay is a NOP (to run at peak speed). + * + * Since this is software, the timings may not be exactly what your board's + * chips need ... there may be several reasons you'd need to tweak timings + * in these routines, not just to make it faster or slower to match a + * particular CPU clock rate. + */ + +static inline u32 +bitbang_txrx_be_cpha0(struct spi_device *spi, + unsigned nsecs, unsigned cpol, unsigned flags, + u32 word, u8 bits) +{ + /* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */ + + u32 oldbit = (!(word & (1<<(bits-1)))) << 31; + /* clock starts at inactive polarity */ + for (word <<= (32 - bits); likely(bits); bits--) { + + /* setup MSB (to slave) on trailing edge */ + if ((flags & SPI_MASTER_NO_TX) == 0) { + if ((word & (1 << 31)) != oldbit) { + setmosi(spi, word & (1 << 31)); + oldbit = word & (1 << 31); + } + } + spidelay(nsecs); /* T(setup) */ + + setsck(spi, !cpol); + spidelay(nsecs); + + /* sample MSB (from slave) on leading edge */ + word <<= 1; + if ((flags & SPI_MASTER_NO_RX) == 0) + word |= getmiso(spi); + setsck(spi, cpol); + } + return word; +} + +static inline u32 +bitbang_txrx_be_cpha1(struct spi_device *spi, + unsigned nsecs, unsigned cpol, unsigned flags, + u32 word, u8 bits) +{ + /* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */ + + u32 oldbit = (!(word & (1<<(bits-1)))) << 31; + /* clock starts at inactive polarity */ + for (word <<= (32 - bits); likely(bits); bits--) { + + /* setup MSB (to slave) on leading edge */ + setsck(spi, !cpol); + if ((flags & SPI_MASTER_NO_TX) == 0) { + if ((word & (1 << 31)) != oldbit) { + setmosi(spi, word & (1 << 31)); + oldbit = word & (1 << 31); + } + } + spidelay(nsecs); /* T(setup) */ + + setsck(spi, cpol); + spidelay(nsecs); + + /* sample MSB (from slave) on trailing edge */ + word <<= 1; + if ((flags & SPI_MASTER_NO_RX) == 0) + word |= getmiso(spi); + } + return word; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c new file mode 100644 index 000000000000..2ba7e7912ed5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c @@ -0,0 +1,558 @@ +/* + * Driver for 93xx46 EEPROMs + * + * (C) 2011 DENX Software Engineering, Anatolij Gustschin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define OP_START 0x4 +#define OP_WRITE (OP_START | 0x1) +#define OP_READ (OP_START | 0x2) +#define ADDR_EWDS 0x00 +#define ADDR_ERAL 0x20 +#define ADDR_EWEN 0x30 + +static int g_wb_eeprom_93xx46_debug = 0; + +module_param(g_wb_eeprom_93xx46_debug, int, S_IRUGO | S_IWUSR); + +#define SPI_93xx46_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_eeprom_93xx46_debug) { \ + printk(KERN_INFO "[EEPROM-93xx46][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct eeprom_93xx46_devtype_data { + unsigned int quirks; +}; + +static const struct eeprom_93xx46_devtype_data atmel_at93c46d_data = { + .quirks = EEPROM_93XX46_QUIRK_SINGLE_WORD_READ | + EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH, +}; + +struct eeprom_93xx46_dev { + struct spi_device *spi; + struct eeprom_93xx46_platform_data *pdata; + struct mutex lock; + struct nvmem_config nvmem_config; + struct nvmem_device *nvmem; + int addrlen; + int size; +}; + +static inline bool has_quirk_single_word_read(struct eeprom_93xx46_dev *edev) +{ + return edev->pdata->quirks & EEPROM_93XX46_QUIRK_SINGLE_WORD_READ; +} + +static inline bool has_quirk_instruction_length(struct eeprom_93xx46_dev *edev) +{ + return edev->pdata->quirks & EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH; +} + +static int eeprom_93xx46_read(void *priv, unsigned int off, + void *val, size_t count) +{ + struct eeprom_93xx46_dev *edev = priv; + char *buf = val; + int err = 0; + + if (unlikely(off >= edev->size)) + return 0; + if ((off + count) > edev->size) + count = edev->size - off; + if (unlikely(!count)) + return count; + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + while (count) { + struct spi_message m; + struct spi_transfer t[2] = { { 0 } }; + u16 cmd_addr = OP_READ << edev->addrlen; + size_t nbytes = count; + int bits; + int data_bit; + + if (edev->addrlen == 7) { + cmd_addr |= off & 0x7f; + bits = 10; + data_bit = 8; + if (has_quirk_single_word_read(edev)) + nbytes = 1; + } else { + cmd_addr |= (off >> 1) & 0x3f; + bits = 9; + data_bit = 16; + if (has_quirk_single_word_read(edev)) + nbytes = 2; + } + + dev_dbg(&edev->spi->dev, "read cmd 0x%x, %d Hz\n", + cmd_addr, edev->spi->max_speed_hz); + + spi_message_init(&m); + + t[0].tx_buf = (char *)&cmd_addr; + t[0].len = 2; + t[0].bits_per_word = bits; + spi_message_add_tail(&t[0], &m); + + t[1].rx_buf = buf; + t[1].len = nbytes; + t[1].bits_per_word = data_bit; + spi_message_add_tail(&t[1], &m); + + err = spi_sync(edev->spi, &m); + /* have to wait at least Tcsl ns */ + ndelay(250); + + if (err) { + dev_err(&edev->spi->dev, "read %zu bytes at %d: err. %d\n", + nbytes, (int)off, err); + break; + } + + buf += nbytes; + off += nbytes; + count -= nbytes; + } + + if (edev->pdata->finish) + edev->pdata->finish(edev); + + mutex_unlock(&edev->lock); + + return err; +} + +static int eeprom_93xx46_ew(struct eeprom_93xx46_dev *edev, int is_on) +{ + struct spi_message m; + struct spi_transfer t; + int bits, ret; + u16 cmd_addr; + + cmd_addr = OP_START << edev->addrlen; + if (edev->addrlen == 7) { + cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << 1; + bits = 10; + } else { + cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS); + bits = 9; + } + + if (has_quirk_instruction_length(edev)) { + cmd_addr <<= 2; + bits += 2; + } + + dev_dbg(&edev->spi->dev, "ew%s cmd 0x%04x, %d bits\n", + is_on ? "en" : "ds", cmd_addr, bits); + + spi_message_init(&m); + mem_clear(&t, sizeof(t)); + + t.tx_buf = &cmd_addr; + t.len = 2; + t.bits_per_word = bits; + spi_message_add_tail(&t, &m); + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + ret = spi_sync(edev->spi, &m); + /* have to wait at least Tcsl ns */ + ndelay(250); + if (ret) + dev_err(&edev->spi->dev, "erase/write %sable error %d\n", + is_on ? "en" : "dis", ret); + + if (edev->pdata->finish) + edev->pdata->finish(edev); + + mutex_unlock(&edev->lock); + return ret; +} + +static ssize_t +eeprom_93xx46_write_word(struct eeprom_93xx46_dev *edev, + char *buf, unsigned off) +{ + struct spi_message m; + struct spi_transfer t[2]; + int bits, data_len, ret; + u16 cmd_addr; + int data_bit; + + cmd_addr = OP_WRITE << edev->addrlen; + + if (edev->addrlen == 7) { + cmd_addr |= off & 0x7f; + bits = 10; + data_len = 1; + data_bit = 8; + } else { + cmd_addr |= (off >> 1) & 0x3f; + bits = 9; + data_len = 2; + data_bit = 16; + } + + dev_dbg(&edev->spi->dev, "write cmd 0x%x\n", cmd_addr); + + spi_message_init(&m); + mem_clear(t, sizeof(t)); + + t[0].tx_buf = (char *)&cmd_addr; + t[0].len = 2; + t[0].bits_per_word = bits; + spi_message_add_tail(&t[0], &m); + + t[1].tx_buf = buf; + t[1].len = data_len; + t[1].bits_per_word = data_bit; + spi_message_add_tail(&t[1], &m); + + ret = spi_sync(edev->spi, &m); + /* have to wait program cycle time Twc ms */ + mdelay(6); + return ret; +} + +static int eeprom_93xx46_write(void *priv, unsigned int off, + void *val, size_t count) +{ + struct eeprom_93xx46_dev *edev = priv; + char *buf = val; + int i, ret, step = 1; + + if (unlikely(off >= edev->size)) + return -EFBIG; + if ((off + count) > edev->size) + count = edev->size - off; + if (unlikely(!count)) + return count; + + /* only write even number of bytes on 16-bit devices */ + if (edev->addrlen == 6) { + step = 2; + count &= ~1; + } + + /* erase/write enable */ + ret = eeprom_93xx46_ew(edev, 1); + if (ret) + return ret; + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + for (i = 0; i < count; i += step) { + ret = eeprom_93xx46_write_word(edev, &buf[i], off + i); + if (ret) { + dev_err(&edev->spi->dev, "write failed at %d: %d\n", + (int)off + i, ret); + break; + } + } + + if (edev->pdata->finish) + edev->pdata->finish(edev); + + mutex_unlock(&edev->lock); + + /* erase/write disable */ + eeprom_93xx46_ew(edev, 0); + return ret; +} + +static int eeprom_93xx46_eral(struct eeprom_93xx46_dev *edev) +{ + struct eeprom_93xx46_platform_data *pd = edev->pdata; + struct spi_message m; + struct spi_transfer t; + int bits, ret; + u16 cmd_addr; + + cmd_addr = OP_START << edev->addrlen; + if (edev->addrlen == 7) { + cmd_addr |= ADDR_ERAL << 1; + bits = 10; + } else { + cmd_addr |= ADDR_ERAL; + bits = 9; + } + + if (has_quirk_instruction_length(edev)) { + cmd_addr <<= 2; + bits += 2; + } + + dev_dbg(&edev->spi->dev, "eral cmd 0x%04x, %d bits\n", cmd_addr, bits); + + spi_message_init(&m); + mem_clear(&t, sizeof(t)); + + t.tx_buf = &cmd_addr; + t.len = 2; + t.bits_per_word = bits; + spi_message_add_tail(&t, &m); + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + ret = spi_sync(edev->spi, &m); + if (ret) + dev_err(&edev->spi->dev, "erase error %d\n", ret); + /* have to wait erase cycle time Tec ms */ + mdelay(6); + + if (pd->finish) + pd->finish(edev); + + mutex_unlock(&edev->lock); + return ret; +} + +static ssize_t eeprom_93xx46_store_erase(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct eeprom_93xx46_dev *edev = dev_get_drvdata(dev); + int erase = 0, ret; + + sscanf(buf, "%d", &erase); + if (erase) { + ret = eeprom_93xx46_ew(edev, 1); + if (ret) + return ret; + ret = eeprom_93xx46_eral(edev); + if (ret) + return ret; + ret = eeprom_93xx46_ew(edev, 0); + if (ret) + return ret; + } + return count; +} +static DEVICE_ATTR(erase, S_IWUSR, NULL, eeprom_93xx46_store_erase); + +static void select_assert(void *context) +{ + struct eeprom_93xx46_dev *edev = context; + + gpiod_set_value_cansleep(edev->pdata->select, 1); +} + +static void select_deassert(void *context) +{ + struct eeprom_93xx46_dev *edev = context; + + gpiod_set_value_cansleep(edev->pdata->select, 0); +} + +static const struct of_device_id eeprom_93xx46_of_table[] = { + { .compatible = "eeprom-93xx46", }, + { .compatible = "atmel,at93c46d", .data = &atmel_at93c46d_data, }, + {} +}; +MODULE_DEVICE_TABLE(of, eeprom_93xx46_of_table); + +static int eeprom_93xx46_probe_dt(struct spi_device *spi) +{ + const struct of_device_id *of_id = + of_match_device(eeprom_93xx46_of_table, &spi->dev); + struct device_node *np = spi->dev.of_node; + struct eeprom_93xx46_platform_data *pd; + u32 tmp; + int gpio; + enum of_gpio_flags of_flags; + int ret; + + pd = devm_kzalloc(&spi->dev, sizeof(*pd), GFP_KERNEL); + if (!pd) + return -ENOMEM; + + ret = of_property_read_u32(np, "data-size", &tmp); + if (ret < 0) { + dev_err(&spi->dev, "data-size property not found\n"); + return ret; + } + + if (tmp == 8) { + pd->flags |= EE_ADDR8; + } else if (tmp == 16) { + pd->flags |= EE_ADDR16; + } else { + dev_err(&spi->dev, "invalid data-size (%d)\n", tmp); + return -EINVAL; + } + + if (of_property_read_bool(np, "read-only")) + pd->flags |= EE_READONLY; + + gpio = of_get_named_gpio_flags(np, "select-gpios", 0, &of_flags); + if (gpio_is_valid(gpio)) { + unsigned long flags = + of_flags == OF_GPIO_ACTIVE_LOW ? GPIOF_ACTIVE_LOW : 0; + + ret = devm_gpio_request_one(&spi->dev, gpio, flags, + "eeprom_93xx46_select"); + if (ret) + return ret; + + pd->select = gpio_to_desc(gpio); + pd->prepare = select_assert; + pd->finish = select_deassert; + + gpiod_direction_output(pd->select, 0); + } + + if (of_id) { + if (of_id->data) { + const struct eeprom_93xx46_devtype_data *data = of_id->data; + + pd->quirks = data->quirks; + } + } + + spi->dev.platform_data = pd; + + return 0; +} + +static int eeprom_93xx46_probe(struct spi_device *spi) +{ + struct eeprom_93xx46_platform_data *pd; + struct eeprom_93xx46_dev *edev; + int err; + + if (spi->dev.of_node) { + err = eeprom_93xx46_probe_dt(spi); + if (err < 0) + return err; + } + + pd = spi->dev.platform_data; + if (!pd) { + dev_err(&spi->dev, "missing platform data\n"); + return -ENODEV; + } + + edev = kzalloc(sizeof(*edev), GFP_KERNEL); + if (!edev) + return -ENOMEM; + + if (pd->flags & EE_ADDR8) + edev->addrlen = 7; + else if (pd->flags & EE_ADDR16) + edev->addrlen = 6; + else { + dev_err(&spi->dev, "unspecified address type\n"); + err = -EINVAL; + goto fail; + } + + mutex_init(&edev->lock); + + edev->spi = spi; + edev->pdata = pd; + + edev->size = 128; + edev->nvmem_config.name = dev_name(&spi->dev); + edev->nvmem_config.dev = &spi->dev; + edev->nvmem_config.read_only = pd->flags & EE_READONLY; + edev->nvmem_config.root_only = true; + edev->nvmem_config.owner = THIS_MODULE; + edev->nvmem_config.compat = true; + edev->nvmem_config.base_dev = &spi->dev; + edev->nvmem_config.reg_read = eeprom_93xx46_read; + edev->nvmem_config.reg_write = eeprom_93xx46_write; + edev->nvmem_config.priv = edev; + edev->nvmem_config.stride = 4; + edev->nvmem_config.word_size = 1; + edev->nvmem_config.size = edev->size; + + edev->nvmem = nvmem_register(&edev->nvmem_config); + if (IS_ERR(edev->nvmem)) { + err = PTR_ERR(edev->nvmem); + goto fail; + } + + if (g_wb_eeprom_93xx46_debug) { + dev_info(&spi->dev, "%d-bit eeprom %s\n", + (pd->flags & EE_ADDR8) ? 8 : 16, + (pd->flags & EE_READONLY) ? "(readonly)" : ""); + } + + if (!(pd->flags & EE_READONLY)) { + if (device_create_file(&spi->dev, &dev_attr_erase)) + dev_err(&spi->dev, "can't create erase interface\n"); + } + + spi_set_drvdata(spi, edev); + return 0; +fail: + kfree(edev); + return err; +} + +static int eeprom_93xx46_remove(struct spi_device *spi) +{ + struct eeprom_93xx46_dev *edev = spi_get_drvdata(spi); + + nvmem_unregister(edev->nvmem); + + if (!(edev->pdata->flags & EE_READONLY)) + device_remove_file(&spi->dev, &dev_attr_erase); + + kfree(edev); + return 0; +} + +static struct spi_driver wb_eeprom_93xx46_driver = { + .driver = { + .name = "wb_93xx46", + .of_match_table = of_match_ptr(eeprom_93xx46_of_table), + }, + .probe = eeprom_93xx46_probe, + .remove = eeprom_93xx46_remove, +}; + +module_spi_driver(wb_eeprom_93xx46_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Driver for 93xx46 EEPROMs"); +MODULE_AUTHOR("support"); +MODULE_ALIAS("spi:93xx46"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c new file mode 100644 index 000000000000..e46663514e06 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c @@ -0,0 +1,1121 @@ +/* + * fpga_i2c_bus_drv.c + * ko to create fpga i2c adapter + */ +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) +#include +#endif +#include +#include +#include +#include +#include +#include +#include "fpga_i2c.h" + +#include +#include + +#define DRV_NAME "wb-fpga-i2c" +#define DRV_VERSION "1.0" +#define DTS_NO_CFG_FLAG (0) + +extern int i2c_device_func_write(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int i2c_device_func_read(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int io_device_func_read(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int spi_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int spi_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); + + +#define FPGA_I2C_STRETCH_TIMEOUT (0x01) +#define FPGA_I2C_DEADLOCK_FAILED (0x02) +#define FPGA_I2C_SLAVE_NO_RESPOND (0x03) +#define FPGA_I2C_STA_FAIL (0x01) +#define FPGA_I2C_STA_BUSY (0x02) +#define FPGA_I2C_CTL_BG (0x01 << 1) +#define FPGA_I2C_CTL_NO_REG (0x01 << 2) +#define FPGA_I2C_CTL_RD (0x01) +#define FPGA_I2C_CTL_WR (0x00) +#define I2C_READ_MSG_NUM (0x02) +#define I2C_WRITE_MSG_NUM (0x01) +#define FPGA_REG_WIDTH (4) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) +#define SYMBOL_SPI_DEV_MODE (5) + +int g_wb_fpga_i2c_debug = 0; +int g_wb_fpga_i2c_error = 0; + +module_param(g_wb_fpga_i2c_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_fpga_i2c_error, int, S_IRUGO | S_IWUSR); + +#define FPGA_I2C_VERBOSE(fmt, args...) do { \ + if (g_wb_fpga_i2c_debug) { \ + printk(KERN_INFO "[FPFA_I2C_BUS][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FPGA_I2C_ERROR(fmt, args...) do { \ + if (g_wb_fpga_i2c_error) { \ + printk(KERN_ERR "[FPFA_I2C_BUS][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static int fpga_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + FPGA_I2C_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + FPGA_I2C_ERROR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int fpga_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FPGA_I2C_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + FPGA_I2C_ERROR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int fpga_device_write(fpga_i2c_dev_t *fpga_i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (fpga_i2c->i2c_func_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = fpga_file_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_SPI_DEV_MODE: + ret = spi_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + default: + FPGA_I2C_ERROR("err func_mode, write failed.\n"); + return -EINVAL; + } + return ret; + +} + +static int fpga_device_read(fpga_i2c_dev_t *fpga_i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (fpga_i2c->i2c_func_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = fpga_file_read(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_SPI_DEV_MODE: + ret = spi_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + default: + FPGA_I2C_ERROR("err func_mode, read failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int little_endian_dword_to_buf(uint8_t *buf, int len, uint32_t dword) +{ + uint8_t tmp_buf[FPGA_REG_WIDTH]; + + if (len < 4) { + FPGA_I2C_ERROR("Not enough buf, dword to buf: len[%d], dword[0x%x]\n", len, dword); + return -1; + } + + mem_clear(tmp_buf, sizeof(tmp_buf)); + tmp_buf[0] = dword & 0xff; + tmp_buf[1] = (dword >> 8) & 0xff; + tmp_buf[2] = (dword >> 16) & 0xff; + tmp_buf[3] = (dword >> 24) & 0xff; + + memcpy(buf, tmp_buf, sizeof(tmp_buf)); + + return 0; +} + +static int little_endian_buf_to_dword(uint8_t *buf, int len, uint32_t *dword) +{ + int i; + uint32_t dword_tmp; + + if (len != FPGA_REG_WIDTH) { + FPGA_I2C_ERROR("buf length %d error, can't convert to dowrd.\n", len); + return -1; + } + dword_tmp = 0; + for (i = 0; i < FPGA_REG_WIDTH; i++) { + dword_tmp |= (buf[i] << (i * 8)); + } + *dword = dword_tmp; + return 0; +} + +static int fpga_reg_write(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t val) +{ + int ret; + + ret = fpga_device_write(fpga_i2c, addr, &val, sizeof(uint8_t)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg write failed, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga reg write success, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return 0; +} + +static int fpga_reg_read(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t *val) +{ + int ret; + + ret = fpga_device_read(fpga_i2c, addr, val, sizeof(uint8_t)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg read failed, dev name:%s, offset:0x%x\n", + fpga_i2c->dev_name, addr); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga reg read success, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, *val); + return 0; +} + +static int fpga_data_write(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + + ret = fpga_device_write(fpga_i2c, addr, val, size); + if (ret < 0) { + FPGA_I2C_ERROR("fpga data write failed, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga data write success, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return 0; +} + +static int fpga_data_read(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + + ret = fpga_device_read(fpga_i2c, addr, val, size); + if (ret < 0) { + FPGA_I2C_ERROR("fpga data read failed, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga data read success, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return 0; +} + +static int fpga_reg_write_32(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint32_t val) +{ + int ret; + uint8_t buf[FPGA_REG_WIDTH]; + + mem_clear(buf, sizeof(buf)); + little_endian_dword_to_buf(buf, sizeof(buf), val); + ret = fpga_device_write(fpga_i2c, addr, buf, sizeof(buf)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg write failed, dev name: %s, offset: 0x%x, value: 0x%x.\n", + fpga_i2c->dev_name, addr, val); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga reg write success, dev name: %s, offset: 0x%x, value: 0x%x.\n", + fpga_i2c->dev_name, addr, val); + return 0; +} + +static int fpga_reg_read_32(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint32_t *val) +{ + int ret; + uint8_t buf[FPGA_REG_WIDTH]; + + mem_clear(buf, sizeof(buf)); + ret = fpga_device_read(fpga_i2c, addr, buf, sizeof(buf)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg read failed, dev name: %s, offset: 0x%x, ret: %d\n", + fpga_i2c->dev_name, addr, ret); + return -EIO; + } + little_endian_buf_to_dword(buf, sizeof(buf), val); + FPGA_I2C_VERBOSE("fpga reg read success, dev name: %s, offset: 0x%x, value: 0x%x.\n", + fpga_i2c->dev_name, addr, *val); + return 0; +} + +static int fpga_i2c_is_busy(fpga_i2c_dev_t *fpga_i2c) +{ + uint8_t val; + int ret; + fpga_i2c_reg_t *reg; + + reg = &fpga_i2c->reg; + ret = fpga_reg_read(fpga_i2c, reg->i2c_status, &val); + if (ret < 0 ) { + FPGA_I2C_ERROR("read fpga i2c status reg failed, reg addr:0x%x, ret:%d.\n", + reg->i2c_status, ret); + return 1; + } + if (val & FPGA_I2C_STA_BUSY) { + FPGA_I2C_ERROR("fpga i2c status busy, reg addr:0x%x, value:0x%x.\n", + reg->i2c_status, val); + return 1; + } else { + return 0; + } +} + +static int fpga_i2c_wait(fpga_i2c_dev_t *fpga_i2c) +{ + int retry_cnt; + + retry_cnt = FPGA_I2C_XFER_TIME_OUT/FPGA_I2C_SLEEP_TIME; + while (retry_cnt--) { + if (fpga_i2c_is_busy(fpga_i2c)) { + usleep_range(FPGA_I2C_SLEEP_TIME, FPGA_I2C_SLEEP_TIME + 1); + } else { + return 0; + } + } + + return -EBUSY; +} + +static int fpga_i2c_check_status(fpga_i2c_dev_t *fpga_i2c) +{ + uint8_t data; + int ret; + fpga_i2c_reg_t *reg; + + reg = &fpga_i2c->reg; + + ret = fpga_reg_read(fpga_i2c, reg->i2c_status, &data); + if (ret) { + FPGA_I2C_ERROR("read fpga i2c status reg failed, reg addr:0x%x, ret:%d.\n", + reg->i2c_status, ret); + return ret; + } + + if (data & FPGA_I2C_STA_FAIL) { + FPGA_I2C_ERROR("fpga i2c status error, reg addr:0x%x, value:%d.\n", + reg->i2c_status, data); + + /* read i2c_err_vec to confirm err type*/ + if (reg->i2c_err_vec != DTS_NO_CFG_FLAG) { + /* read i2c_err_vec reg */ + ret = fpga_reg_read(fpga_i2c, reg->i2c_err_vec, &data); + if (ret) { + FPGA_I2C_ERROR("read fpga i2c err vec reg failed, reg addr:0x%x, ret:%d.\n", + reg->i2c_err_vec, ret); + return ret; + } + FPGA_I2C_VERBOSE("get i2c err vec, reg addr:0x%x, read value:0x%x\n", reg->i2c_err_vec, data); + + /* match i2c_err_vec reg value and err type*/ + switch (data) { + case FPGA_I2C_STRETCH_TIMEOUT: + ret = -ETIMEDOUT; + break; + case FPGA_I2C_DEADLOCK_FAILED: + ret = -EDEADLK; + break; + case FPGA_I2C_SLAVE_NO_RESPOND: + ret = -ENXIO; + break; + default: + FPGA_I2C_ERROR("get i2c err vec value out of range, reg addr:0x%x, read value:0x%x\n", + reg->i2c_err_vec, data); + ret = -EREMOTEIO; + break; + } + return ret; + } else { + FPGA_I2C_VERBOSE("i2c err vec not config, fpga i2c status check return -1\n"); + return -EREMOTEIO; + } + } + return 0; +} + +static int fpga_i2c_do_work(fpga_i2c_dev_t *fpga_i2c, int i2c_addr, + unsigned char *data, uint32_t length, int is_read) +{ + int ret, i; + uint8_t op, i2c_reg_addr_len; + uint8_t *i2c_read_addr_buf; + fpga_i2c_reg_t *reg; + fpga_i2c_reg_addr_t *i2c_addr_desc; + + reg = &fpga_i2c->reg; + + ret = fpga_reg_write(fpga_i2c, reg->i2c_slave, i2c_addr); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c slave reg failed, reg addr:0x%x, value:0x%x, ret:%d.\n", + reg->i2c_slave, i2c_addr, ret); + goto exit; + } + + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + i2c_reg_addr_len = i2c_addr_desc->reg_addr_len; + i2c_read_addr_buf = &i2c_addr_desc->read_reg_addr[0]; + + if (i2c_reg_addr_len > 0 && i2c_reg_addr_len <= I2C_REG_MAX_WIDTH) { + ret = fpga_data_write(fpga_i2c, reg->i2c_reg, i2c_read_addr_buf, i2c_reg_addr_len); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c offset reg failed, fpga addr:0x%x, reg len:%d, ret:%d\n", + reg->i2c_reg, i2c_reg_addr_len, ret); + for (i = 0; i < i2c_reg_addr_len; i++) { + FPGA_I2C_ERROR("%02d : %02x\n", i, i2c_read_addr_buf[i]); + } + goto exit; + } + } + + ret = fpga_reg_write_32(fpga_i2c, reg->i2c_data_len, length); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c date len reg failed, reg addr:0x%x, value:0x%x, ret:%d.\n", + reg->i2c_data_len, length, ret); + goto exit; + } + + ret = fpga_reg_write(fpga_i2c, reg->i2c_reg_len, i2c_reg_addr_len); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c reg len reg failed, reg addr:0x%x, value:0x%x, ret:%d.\n", + reg->i2c_reg_len, i2c_reg_addr_len, ret); + goto exit; + } + + if (is_read) { + op = FPGA_I2C_CTL_RD | FPGA_I2C_CTL_BG; + } else { + + ret = fpga_data_write(fpga_i2c, reg->i2c_data_buf, data, length); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c date buf failed, reg addr:0x%x, write len:%d, ret:%d.\n", + reg->i2c_data_buf, length, ret); + goto exit; + } + op = FPGA_I2C_CTL_WR | FPGA_I2C_CTL_BG ; + } + + ret = fpga_reg_write(fpga_i2c, reg->i2c_ctrl, op); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c control reg failed, reg addr:0x%x, value:%d, ret:%d.\n", + reg->i2c_ctrl, op, ret); + goto exit; + } + + ret = fpga_i2c_wait(fpga_i2c); + if (ret) { + FPGA_I2C_ERROR("wait fpga i2c status timeout.\n"); + goto exit; + } + + ret = fpga_i2c_check_status(fpga_i2c); + if (ret) { + FPGA_I2C_ERROR("check fpga i2c status error.\n"); + goto exit; + } + + if (is_read) { + + ret = fpga_data_read(fpga_i2c, reg->i2c_data_buf, data, length); + if (ret) { + FPGA_I2C_ERROR("read fpga i2c data buf failed, reg addr:0x%x, read len:%d, ret:%d.\n", + reg->i2c_data_buf, length, ret); + goto exit; + } + } + +exit: + return ret; +} + +static int fpga_i2c_write(fpga_i2c_dev_t *fpga_i2c, int target, + u8 *data, int length, int i2c_msg_num) +{ + int ret, i; + fpga_i2c_reg_addr_t *i2c_addr_desc; + + if (i2c_msg_num == I2C_READ_MSG_NUM) { + + if (length > I2C_REG_MAX_WIDTH) { + FPGA_I2C_ERROR("read reg addr len %d, more than max length.\n", length); + return -EINVAL; + } + + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + for (i = 0; i < length; i++) { + i2c_addr_desc->read_reg_addr[i] = data[length -i -1]; + FPGA_I2C_VERBOSE("%02d : %02x\n", i, i2c_addr_desc->read_reg_addr[i]); + } + i2c_addr_desc->reg_addr_len = length; + ret = 0; + } else { + + ret = fpga_i2c_do_work(fpga_i2c, target, data, length, 0); + } + + return ret; +} + +/** + * fpga_i2c_read - receive data from the bus. + * @i2c: The struct fpga_i2c_dev_t. + * @target: Target address. + * @data: Pointer to the location to store the datae . + * @length: Length of the data. + * + * The address is sent over the bus, then the data is read. + * + * Returns 0 on success, otherwise a negative errno. + */ +static int fpga_i2c_read(fpga_i2c_dev_t *fpga_i2c, int target, + u8 *data, int length) +{ + int ret, offset_size; + int i, tmp_val; + fpga_i2c_reg_addr_t *i2c_addr_desc; + uint8_t i2c_reg_addr_len; + uint8_t *i2c_read_addr_buf; + + offset_size = 0; + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + i2c_reg_addr_len = i2c_addr_desc->reg_addr_len; + i2c_read_addr_buf = &i2c_addr_desc->read_reg_addr[0]; + + while (1) { + if (length <= fpga_i2c->reg.i2c_data_buf_len) { + return fpga_i2c_do_work(fpga_i2c, target, data + offset_size, length, 1); + } + + ret = fpga_i2c_do_work(fpga_i2c, target, data + offset_size, fpga_i2c->reg.i2c_data_buf_len, 1); + if (ret != 0) { + FPGA_I2C_ERROR("fpga_i2c_read failed, i2c addr:0x%x, offset:0x%x, ret:%d.\n", + target, offset_size, ret); + return ret; + } + + tmp_val = i2c_read_addr_buf[0]; + tmp_val += fpga_i2c->reg.i2c_data_buf_len; + if (tmp_val > 0xff) { + i2c_read_addr_buf[0] = tmp_val & 0xff; + for (i = 1; i < i2c_reg_addr_len; i++) { + if (i2c_read_addr_buf[i] == 0xff) { + i2c_read_addr_buf[i] = 0; + } else { + i2c_read_addr_buf[i]++; + break; + } + } + } else { + i2c_read_addr_buf[0] = tmp_val & 0xff; + } + offset_size += fpga_i2c->reg.i2c_data_buf_len; + length -= fpga_i2c->reg.i2c_data_buf_len; + } + + return ret; +} + +static void fpga_i2c_reset(fpga_i2c_dev_t *fpga_i2c) { + fpga_i2c_reset_cfg_t *reset_cfg; + uint32_t reset_addr; + + reset_cfg = &fpga_i2c->reset_cfg; + reset_addr = reset_cfg->reset_addr; + if (reset_cfg->reset_delay_b) { + usleep_range(reset_cfg->reset_delay_b, reset_cfg->reset_delay_b + 1); + } + + fpga_reg_write_32(fpga_i2c, reset_addr, reset_cfg->reset_on); + if (reset_cfg->reset_delay) { + usleep_range(reset_cfg->reset_delay, reset_cfg->reset_delay + 1); + } + + fpga_reg_write_32(fpga_i2c, reset_addr, reset_cfg->reset_off); + if (reset_cfg->reset_delay_a) { + usleep_range(reset_cfg->reset_delay_a, reset_cfg->reset_delay_a + 1); + } + + return; +} + +/** + * fpga_i2c_xfer - The driver's master_xfer function. + * @adap: Pointer to the i2c_adapter structure. + * @msgs: Pointer to the messages to be processed. + * @num: Length of the MSGS array. + * + * Returns the number of messages processed, or a negative errno on + * failure. + */ +static int fpga_i2c_adapter_init(fpga_i2c_dev_t *fpga_i2c) +{ + int ret; + fpga_i2c_reg_t *reg; + + reg = &fpga_i2c->reg; + + ret = 0; + ret += fpga_reg_write(fpga_i2c, reg->i2c_scale, fpga_i2c->i2c_scale_value); + ret += fpga_reg_write(fpga_i2c, reg->i2c_filter, fpga_i2c->i2c_filter_value); + ret += fpga_reg_write(fpga_i2c, reg->i2c_stretch, fpga_i2c->i2c_stretch_value); + if (ret < 0) { + FPGA_I2C_ERROR("fpga_i2c_init failed.\n"); + return ret; + } + + FPGA_I2C_VERBOSE("fpga_i2c_init ok.\n"); + return 0; +} + +static int fpga_i2c_params_check(fpga_i2c_dev_t *fpga_i2c) +{ + int ret; + fpga_i2c_reg_t *reg; + uint8_t i2c_scale_value, i2c_filter_value, i2c_stretch_value; + + reg = &fpga_i2c->reg; + ret = 0; + ret += fpga_reg_read(fpga_i2c, reg->i2c_scale, &i2c_scale_value); + ret += fpga_reg_read(fpga_i2c, reg->i2c_filter, &i2c_filter_value); + ret += fpga_reg_read(fpga_i2c, reg->i2c_stretch, &i2c_stretch_value); + if (ret < 0) { + FPGA_I2C_ERROR("read fpga i2c params failed.\n"); + return 1; + } + + if ((i2c_scale_value != fpga_i2c->i2c_scale_value) + || (i2c_filter_value != fpga_i2c->i2c_filter_value) + || (i2c_stretch_value != fpga_i2c->i2c_stretch_value)) { + FPGA_I2C_ERROR("fpga i2c params check error, read value: i2c_scale 0x%x, i2c_filter:0x%x, i2c_stretch:0x%x.\n", + i2c_scale_value, i2c_filter_value, i2c_stretch_value); + FPGA_I2C_ERROR("fpga i2c params check error, config value: i2c_scale 0x%x, i2c_filter:0x%x, i2c_stretch:0x%x.\n", + fpga_i2c->i2c_scale_value, fpga_i2c->i2c_filter_value, fpga_i2c->i2c_stretch_value); + return 1; + } + + FPGA_I2C_VERBOSE("fpga i2c params check ok.\n"); + return 0; +} + +static int fpga_i2c_xfer(struct i2c_adapter *adap, + struct i2c_msg *msgs, int num) +{ + struct i2c_msg *pmsg; + int i; + int ret; + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_addr_t *i2c_addr_desc; + + fpga_i2c = i2c_get_adapdata(adap); + + if (num != I2C_READ_MSG_NUM && num != I2C_WRITE_MSG_NUM) { + FPGA_I2C_ERROR("unsupport i2c_msg len:%d.\n", num); + return -EINVAL; + } + + if ((num == I2C_WRITE_MSG_NUM) && (msgs[0].len > fpga_i2c->reg.i2c_data_buf_len)) { + FPGA_I2C_ERROR("unsupport i2c_msg type:msg[0].flag:0x%x, buf len:0x%x.\n", + msgs[0].flags, msgs[0].len); + return -EINVAL; + } + + if (num == I2C_READ_MSG_NUM ) { + if ((msgs[0].flags & I2C_M_RD) ||!(msgs[1].flags & I2C_M_RD)) { + FPGA_I2C_ERROR("unsupport i2c_msg type:msg[0].flag:0x%x, msg[1].flag:0x%x.\n", + msgs[0].flags, msgs[1].flags); + return -EINVAL; + } + } + + if (fpga_i2c_is_busy(fpga_i2c)) { + FPGA_I2C_ERROR("fpga i2c adapter %d is busy, do reset.\n", adap->nr); + if (fpga_i2c->reset_cfg.i2c_adap_reset_flag == 1) { + + fpga_i2c_reset(fpga_i2c); + + fpga_i2c_adapter_init(fpga_i2c); + } + return -EAGAIN; + } + + if (fpga_i2c->i2c_params_check && fpga_i2c_params_check(fpga_i2c)) { + FPGA_I2C_ERROR("fpga i2c params check failed, try to reinitialize.\n"); + fpga_i2c_adapter_init(fpga_i2c); + } + + ret = 0; + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + i2c_addr_desc->reg_addr_len = 0; + mem_clear(i2c_addr_desc->read_reg_addr, sizeof(i2c_addr_desc->read_reg_addr)); + + for (i = 0; ret == 0 && i < num; i++) { + pmsg = &msgs[i]; + FPGA_I2C_VERBOSE("Doing %s %d byte(s) to/from 0x%02x - %d of %d messages\n", + pmsg->flags & I2C_M_RD ? "read" : "write", pmsg->len, pmsg->addr, i + 1, num); + + if (pmsg->flags & I2C_M_RD) { + ret = fpga_i2c_read(fpga_i2c, pmsg->addr, pmsg->buf, pmsg->len); + + if ((pmsg->len == 1) && (pmsg->flags & I2C_M_RECV_LEN)) { + if ((ret != 0) || (pmsg->buf[0] > I2C_SMBUS_BLOCK_MAX)) { + FPGA_I2C_ERROR("smbus block data read failed, ret:%d, read len:%u.\n", + ret, pmsg->buf[0]); + return -EPROTO; + } + pmsg->len = 1 + pmsg->buf[0]; + FPGA_I2C_VERBOSE("smbus block data read, read len:%d.\n", pmsg->len); + ret = fpga_i2c_read(fpga_i2c, pmsg->addr, pmsg->buf, pmsg->len); + } + } else { + ret = fpga_i2c_write(fpga_i2c, pmsg->addr, pmsg->buf, pmsg->len, num); + } + } + + return (ret != 0) ? ret : num; +} + +static u32 fpga_i2c_functionality(struct i2c_adapter *adap) +{ + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_BLOCK_DATA; +} + +static const struct i2c_algorithm fpga_i2c_algo = { + .master_xfer = fpga_i2c_xfer, + .functionality = fpga_i2c_functionality, +}; + +static struct i2c_adapter fpga_i2c_ops = { + .owner = THIS_MODULE, + .name = "wb_fpga_i2c", + .algo = &fpga_i2c_algo, +}; + +static int fpga_i2c_config_init(fpga_i2c_dev_t *fpga_i2c) +{ + int ret = 0, rv = 0; + fpga_i2c_reg_t *reg; + fpga_i2c_reset_cfg_t *reset_cfg; + struct device *dev; + uint32_t i2c_offset_reg, i2c_data_buf_len_reg; + int32_t i2c_offset_val; + + fpga_i2c_bus_device_t *fpga_i2c_bus_device; + + dev = fpga_i2c->dev; + reg = &fpga_i2c->reg; + reset_cfg = &fpga_i2c->reset_cfg; + + i2c_offset_val = 0; + + if (dev->of_node) { + ret = 0; + ret += of_property_read_u32(dev->of_node, "i2c_ext_9548_addr", ®->i2c_ext_9548_addr); + ret += of_property_read_u32(dev->of_node, "i2c_ext_9548_chan", ®->i2c_ext_9548_chan); + ret += of_property_read_u32(dev->of_node, "i2c_slave", ®->i2c_slave); + ret += of_property_read_u32(dev->of_node, "i2c_reg", ®->i2c_reg); + ret += of_property_read_u32(dev->of_node, "i2c_data_len", ®->i2c_data_len); + ret += of_property_read_u32(dev->of_node, "i2c_ctrl", ®->i2c_ctrl); + ret += of_property_read_u32(dev->of_node, "i2c_status", ®->i2c_status); + ret += of_property_read_u32(dev->of_node, "i2c_scale", ®->i2c_scale); + ret += of_property_read_u32(dev->of_node, "i2c_filter", ®->i2c_filter); + ret += of_property_read_u32(dev->of_node, "i2c_stretch", ®->i2c_stretch); + ret += of_property_read_u32(dev->of_node, "i2c_ext_9548_exits_flag", ®->i2c_ext_9548_exits_flag); + ret += of_property_read_u32(dev->of_node, "i2c_reg_len", ®->i2c_reg_len); + ret += of_property_read_u32(dev->of_node, "i2c_in_9548_chan", ®->i2c_in_9548_chan); + ret += of_property_read_u32(dev->of_node, "i2c_data_buf", ®->i2c_data_buf); + ret += of_property_read_string(dev->of_node, "dev_name", &fpga_i2c->dev_name); + ret += of_property_read_u32(dev->of_node, "i2c_scale_value", &fpga_i2c->i2c_scale_value); + ret += of_property_read_u32(dev->of_node, "i2c_filter_value", &fpga_i2c->i2c_filter_value); + ret += of_property_read_u32(dev->of_node, "i2c_stretch_value", &fpga_i2c->i2c_stretch_value); + ret += of_property_read_u32(dev->of_node, "i2c_timeout", &fpga_i2c->i2c_timeout); + ret += of_property_read_u32(dev->of_node, "i2c_func_mode", &fpga_i2c->i2c_func_mode); + ret += of_property_read_u32(dev->of_node, "i2c_reset_addr", &reset_cfg->reset_addr); + ret += of_property_read_u32(dev->of_node, "i2c_reset_on", &reset_cfg->reset_on); + ret += of_property_read_u32(dev->of_node, "i2c_reset_off", &reset_cfg->reset_off); + ret += of_property_read_u32(dev->of_node, "i2c_rst_delay_b", &reset_cfg->reset_delay_b); + ret += of_property_read_u32(dev->of_node, "i2c_rst_delay", &reset_cfg->reset_delay); + ret += of_property_read_u32(dev->of_node, "i2c_rst_delay_a", &reset_cfg->reset_delay_a); + ret += of_property_read_u32(dev->of_node, "i2c_adap_reset_flag", &reset_cfg->i2c_adap_reset_flag); + + if (ret != 0) { + FPGA_I2C_ERROR("dts config error, ret:%d.\n", ret); + ret = -ENXIO; + return ret; + } + + rv = of_property_read_u32(dev->of_node, "i2c_data_buf_len_reg", &i2c_data_buf_len_reg); + if (rv == 0) { + ret = fpga_reg_read_32(fpga_i2c, i2c_data_buf_len_reg, ®->i2c_data_buf_len); + if (ret < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c data buf length, reg addr: 0x%x, ret: %d\n", + i2c_data_buf_len_reg, ret); + return ret; + } + FPGA_I2C_VERBOSE("fpga i2c data buf length reg addr: 0x%x, value: %d\n", + i2c_data_buf_len_reg, reg->i2c_data_buf_len); + if (reg->i2c_data_buf_len == 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + } + } else { + ret = of_property_read_u32(dev->of_node, "i2c_data_buf_len", ®->i2c_data_buf_len); + if (ret != 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + ret = 0; + } + } + + rv = of_property_read_u32(dev->of_node, "i2c_offset_reg", &i2c_offset_reg); + if (rv == 0) { + ret = fpga_reg_read_32(fpga_i2c, i2c_offset_reg, &i2c_offset_val); + if (ret < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c adapter offset value, reg addr: 0x%x, ret: %d\n", + i2c_offset_reg, ret); + return ret; + } + FPGA_I2C_VERBOSE("fpga i2c adapter offset reg addr: 0x%x, value: %d\n", + i2c_offset_reg, i2c_offset_val); + reg->i2c_scale +=i2c_offset_val; + reg->i2c_filter += i2c_offset_val; + reg->i2c_stretch += i2c_offset_val; + reg->i2c_ext_9548_exits_flag += i2c_offset_val; + reg->i2c_ext_9548_addr += i2c_offset_val; + reg->i2c_ext_9548_chan += i2c_offset_val; + reg->i2c_in_9548_chan += i2c_offset_val; + reg->i2c_slave += i2c_offset_val; + reg->i2c_reg += i2c_offset_val; + reg->i2c_reg_len += i2c_offset_val; + reg->i2c_data_len += i2c_offset_val; + reg->i2c_ctrl += i2c_offset_val; + reg->i2c_status += i2c_offset_val; + reg->i2c_data_buf += i2c_offset_val; + } + + ret = of_property_read_u32(dev->of_node, "i2c_err_vec", ®->i2c_err_vec); + if (ret != 0) { + reg->i2c_err_vec = DTS_NO_CFG_FLAG; + FPGA_I2C_VERBOSE("not support i2c_err_vec cfg. ret: %d, set DTS_NO_CFG_FLAG: %d\n", + ret, reg->i2c_err_vec); + ret = 0; /* Not configuring i2c_err_vec is not an error */ + } else { + if (i2c_offset_val != 0) { + reg->i2c_err_vec += i2c_offset_val; + } + } + } else { + if (dev->platform_data == NULL) { + dev_err(fpga_i2c->dev, "Failed to get platform data config.\n"); + ret = -ENXIO; + return ret; + } + fpga_i2c_bus_device = dev->platform_data; + fpga_i2c->dev_name = fpga_i2c_bus_device->dev_name; + fpga_i2c->adap_nr = fpga_i2c_bus_device->adap_nr; + fpga_i2c->i2c_scale_value = fpga_i2c_bus_device->i2c_scale_value; + fpga_i2c->i2c_filter_value = fpga_i2c_bus_device->i2c_filter_value; + fpga_i2c->i2c_stretch_value = fpga_i2c_bus_device->i2c_stretch_value; + fpga_i2c->i2c_timeout = fpga_i2c_bus_device->i2c_timeout; + fpga_i2c->i2c_func_mode = fpga_i2c_bus_device->i2c_func_mode; + fpga_i2c->i2c_params_check = fpga_i2c_bus_device->i2c_func_mode; + + reset_cfg->reset_addr = fpga_i2c_bus_device->i2c_reset_addr; + reset_cfg->reset_on = fpga_i2c_bus_device->i2c_reset_on; + reset_cfg->reset_off = fpga_i2c_bus_device->i2c_reset_off; + reset_cfg->reset_delay_b = fpga_i2c_bus_device->i2c_rst_delay_b; + reset_cfg->reset_delay = fpga_i2c_bus_device->i2c_rst_delay; + reset_cfg->reset_delay_a = fpga_i2c_bus_device->i2c_rst_delay_a; + reset_cfg->i2c_adap_reset_flag = fpga_i2c_bus_device->i2c_adap_reset_flag; + + reg->i2c_ext_9548_addr = fpga_i2c_bus_device->i2c_ext_9548_addr; + reg->i2c_ext_9548_chan = fpga_i2c_bus_device->i2c_ext_9548_chan; + reg->i2c_slave = fpga_i2c_bus_device->i2c_slave; + reg->i2c_reg = fpga_i2c_bus_device->i2c_reg; + reg->i2c_data_len = fpga_i2c_bus_device->i2c_data_len; + reg->i2c_ctrl = fpga_i2c_bus_device->i2c_ctrl; + reg->i2c_status = fpga_i2c_bus_device->i2c_status; + reg->i2c_scale = fpga_i2c_bus_device->i2c_scale; + reg->i2c_filter = fpga_i2c_bus_device->i2c_filter; + reg->i2c_stretch = fpga_i2c_bus_device->i2c_stretch; + reg->i2c_ext_9548_exits_flag = fpga_i2c_bus_device->i2c_ext_9548_exits_flag; + reg->i2c_reg_len = fpga_i2c_bus_device->i2c_reg_len; + reg->i2c_in_9548_chan = fpga_i2c_bus_device->i2c_in_9548_chan; + reg->i2c_data_buf = fpga_i2c_bus_device->i2c_data_buf; + + i2c_data_buf_len_reg = fpga_i2c_bus_device->i2c_data_buf_len_reg; + if (i2c_data_buf_len_reg > 0) { + ret = fpga_reg_read_32(fpga_i2c, i2c_data_buf_len_reg, ®->i2c_data_buf_len); + if (ret < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c data buf length, reg addr: 0x%x, ret: %d\n", + i2c_data_buf_len_reg, ret); + return ret; + } + FPGA_I2C_VERBOSE("fpga i2c data buf length reg addr: 0x%x, value: %d\n", + i2c_data_buf_len_reg, reg->i2c_data_buf_len); + if (reg->i2c_data_buf_len == 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + } + } else { + if (fpga_i2c_bus_device->i2c_data_buf_len == 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + FPGA_I2C_VERBOSE("not support i2c_data_buf_len cfg, set default_val:%d\n", + reg->i2c_data_buf_len); + } else { + reg->i2c_data_buf_len = fpga_i2c_bus_device->i2c_data_buf_len; + } + } + + i2c_offset_reg = fpga_i2c_bus_device->i2c_offset_reg; + if (i2c_offset_reg > 0) { + rv = fpga_reg_read_32(fpga_i2c, i2c_offset_reg, &i2c_offset_val); + if (rv < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c adapter offset value, reg addr: 0x%x, rv: %d\n", + i2c_offset_reg, rv); + return rv; + } + FPGA_I2C_VERBOSE("fpga i2c adapter offset reg addr: 0x%x, value: %d\n", + i2c_offset_reg, i2c_offset_val); + reg->i2c_scale +=i2c_offset_val; + reg->i2c_filter += i2c_offset_val; + reg->i2c_stretch += i2c_offset_val; + reg->i2c_ext_9548_exits_flag += i2c_offset_val; + reg->i2c_ext_9548_addr += i2c_offset_val; + reg->i2c_ext_9548_chan += i2c_offset_val; + reg->i2c_in_9548_chan += i2c_offset_val; + reg->i2c_slave += i2c_offset_val; + reg->i2c_reg += i2c_offset_val; + reg->i2c_reg_len += i2c_offset_val; + reg->i2c_data_len += i2c_offset_val; + reg->i2c_ctrl += i2c_offset_val; + reg->i2c_status += i2c_offset_val; + reg->i2c_data_buf += i2c_offset_val; + } + + if (fpga_i2c_bus_device->i2c_err_vec == 0) { + reg->i2c_err_vec = DTS_NO_CFG_FLAG; + FPGA_I2C_VERBOSE("not support i2c_err_vec cfg, set DTS_NO_CFG_FLAG:%d\n", + reg->i2c_err_vec); + } else { + reg->i2c_err_vec = fpga_i2c_bus_device->i2c_err_vec; + if (i2c_offset_val != 0) { + reg->i2c_err_vec += i2c_offset_val; + } + } + } + + FPGA_I2C_VERBOSE("i2c_ext_9548_addr:0x%x, i2c_ext_9548_chan:0x%x, i2c_slave:0x%x, i2c_reg:0x%x, i2c_data_len:0x%x.\n", + reg->i2c_ext_9548_addr, reg->i2c_ext_9548_chan, reg->i2c_slave, reg->i2c_reg, reg->i2c_data_len); + FPGA_I2C_VERBOSE("i2c_ctrl:0x%x, i2c_status:0x%x, i2c_scale:0x%x, i2c_filter:0x%x, i2c_stretch:0x%x.\n", + reg->i2c_ctrl, reg->i2c_status, reg->i2c_scale, reg->i2c_filter, reg->i2c_stretch); + FPGA_I2C_VERBOSE("i2c_ext_9548_exits_flag:0x%x, i2c_in_9548_chan:0x%x, i2c_data_buf:0x%x, i2c_reg_len:0x%x, i2c_data_buf_len:0x%x.\n", + reg->i2c_ext_9548_exits_flag, reg->i2c_in_9548_chan, reg->i2c_data_buf, reg->i2c_reg_len, reg->i2c_data_buf_len); + FPGA_I2C_VERBOSE("dev_name:%s, i2c_scale_value:0x%x, i2c_filter_value:0x%x, i2c_stretch_value:0x%x, i2c_timeout:0x%x.\n", + fpga_i2c->dev_name, fpga_i2c->i2c_scale_value, fpga_i2c->i2c_filter_value, fpga_i2c->i2c_stretch_value, fpga_i2c->i2c_timeout); + FPGA_I2C_VERBOSE("i2c_reset_addr:0x%x, i2c_reset_on:0x%x, i2c_reset_off:0x%x, i2c_rst_delay_b:0x%x, i2c_rst_delay:0x%x, i2c_rst_delay_a:0x%x.\n", + reset_cfg->reset_addr, reset_cfg->reset_on, reset_cfg->reset_off, reset_cfg->reset_delay_b, reset_cfg->reset_delay, reset_cfg->reset_delay_a); + FPGA_I2C_VERBOSE("i2c_adap_reset_flag:0x%x.\n", reset_cfg->i2c_adap_reset_flag); + FPGA_I2C_VERBOSE("i2c_err_vec:0x%x\n", reg->i2c_err_vec); + + return ret; +} + +static int fpga_i2c_probe(struct platform_device *pdev) +{ + int ret; + fpga_i2c_dev_t *fpga_i2c; + struct device *dev; + + fpga_i2c = devm_kzalloc(&pdev->dev, sizeof(fpga_i2c_dev_t), GFP_KERNEL); + if (!fpga_i2c) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + goto out; + } + + fpga_i2c->dev = &pdev->dev; + + ret = fpga_i2c_config_init(fpga_i2c); + if (ret !=0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c dts config.\n"); + goto out; + } + + ret = fpga_i2c_adapter_init(fpga_i2c); + if (ret !=0) { + dev_err(fpga_i2c->dev, "Failed to init fpga i2c adapter.\n"); + goto out; + } + + if (fpga_i2c->dev->of_node) { + fpga_i2c->i2c_params_check = of_property_read_bool(fpga_i2c->dev->of_node, "i2c_params_check"); + } + FPGA_I2C_VERBOSE("fpga i2c params check flag:%d.\n", fpga_i2c->i2c_params_check); + + init_waitqueue_head(&fpga_i2c->queue); + + dev = fpga_i2c->dev; + fpga_i2c->adap = fpga_i2c_ops; + fpga_i2c->adap.timeout = msecs_to_jiffies(fpga_i2c->i2c_timeout); + fpga_i2c->adap.dev.parent = &pdev->dev; + fpga_i2c->adap.dev.of_node = pdev->dev.of_node; + i2c_set_adapdata(&fpga_i2c->adap, fpga_i2c); + platform_set_drvdata(pdev, fpga_i2c); + + if (fpga_i2c->dev->of_node) { + /* adap.nr get from dts aliases */ + ret = i2c_add_adapter(&fpga_i2c->adap); + } else { + fpga_i2c->adap.nr = fpga_i2c->adap_nr; + ret = i2c_add_numbered_adapter(&fpga_i2c->adap); + } + + if (ret < 0) { + dev_info(fpga_i2c->dev, "Failed to add adapter.\n"); + goto fail_add; + } + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) + of_i2c_register_devices(&fpga_i2c->adap); +#endif + dev_info(fpga_i2c->dev, "registered i2c-%d for %s using mode %d with base address:0x%x, data buf len: %d success.\n", + fpga_i2c->adap.nr, fpga_i2c->dev_name, fpga_i2c->i2c_func_mode, fpga_i2c->reg.i2c_scale, + fpga_i2c->reg.i2c_data_buf_len); + return 0; + +fail_add: + platform_set_drvdata(pdev, NULL); +out: + return ret; +}; + +static int fpga_i2c_remove(struct platform_device *pdev) +{ + fpga_i2c_dev_t *fpga_i2c; + + fpga_i2c = platform_get_drvdata(pdev); + i2c_del_adapter(&fpga_i2c->adap); + platform_set_drvdata(pdev, NULL); + return 0; +}; + +static struct of_device_id fpga_i2c_match[] = { + { + .compatible = "wb-fpga-i2c", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, fpga_i2c_match); + +static struct platform_driver wb_fpga_i2c_driver = { + .probe = fpga_i2c_probe, + .remove = fpga_i2c_remove, + .driver = { + .owner = THIS_MODULE, + .name = DRV_NAME, + .of_match_table = fpga_i2c_match, + }, +}; + +static int __init wb_fpga_i2c_init(void) +{ + return platform_driver_register(&wb_fpga_i2c_driver); +} + +static void __exit wb_fpga_i2c_exit(void) +{ + platform_driver_unregister(&wb_fpga_i2c_driver); +} + +module_init(wb_fpga_i2c_init); +module_exit(wb_fpga_i2c_exit); +MODULE_DESCRIPTION("fpga i2c adapter driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c new file mode 100644 index 000000000000..5845195bb310 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c @@ -0,0 +1,525 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fpga_i2c.h" + +extern int i2c_device_func_write(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); + +#define PCA954X_MAX_NCHANS (8) +#define FPGA_INTERNAL_PCA9548 (1) +#define FPGA_EXTERNAL_PCA9548 (2) +#define FPGA_I2C_EXT_9548_EXITS (0x01 << 0) +#define FPGA_I2C_9548_NO_RESET (0x01 << 1) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) + +int g_fpga_pca954x_debug = 0; +int g_fpga_pca954x_error = 0; + +module_param(g_fpga_pca954x_debug, int, S_IRUGO | S_IWUSR); +module_param(g_fpga_pca954x_error, int, S_IRUGO | S_IWUSR); + +#define FPGA_PCA954X_VERBOSE(fmt, args...) do { \ + if (g_fpga_pca954x_debug) { \ + printk(KERN_INFO "[FPGA_PCA954X][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FPGA_PCA954X_ERROR(fmt, args...) do { \ + if (g_fpga_pca954x_error) { \ + printk(KERN_ERR "[FPGA_PCA954X][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +enum pca_type { + pca_9540, + pca_9541, + pca_9542, + pca_9543, + pca_9544, + pca_9545, + pca_9546, + pca_9547, + pca_9548, +}; + +struct pca954x { + enum pca_type type; + struct i2c_adapter *virt_adaps[PCA954X_MAX_NCHANS]; + u8 last_chan; /* last register value */ + uint32_t fpga_9548_flag; + uint32_t fpga_9548_reset_flag; + uint32_t pca9548_base_nr; + struct i2c_client *client; +}; + +struct chip_desc { + u8 nchans; + u8 enable; /* used for muxes only */ + enum muxtype { + pca954x_ismux = 0, + pca954x_isswi + } muxtype; +}; + +/* Provide specs for the PCA954x types we know about */ +static const struct chip_desc chips[] = { + [pca_9540] = { + .nchans = 2, + .enable = 0x4, + .muxtype = pca954x_ismux, + }, + [pca_9541] = { + .nchans = 1, + .muxtype = pca954x_isswi, + }, + [pca_9543] = { + .nchans = 2, + .muxtype = pca954x_isswi, + }, + [pca_9544] = { + .nchans = 4, + .enable = 0x4, + .muxtype = pca954x_ismux, + }, + [pca_9545] = { + .nchans = 4, + .muxtype = pca954x_isswi, + }, + [pca_9547] = { + .nchans = 8, + .enable = 0x8, + .muxtype = pca954x_ismux, + }, + [pca_9548] = { + .nchans = 8, + .muxtype = pca954x_isswi, + }, +}; + +static const struct i2c_device_id fpga_pca954x_id[] = { + { "wb_fpga_pca9540", pca_9540 }, + { "wb_fpga_pca9541", pca_9541 }, + { "wb_fpga_pca9542", pca_9543 }, + { "wb_fpga_pca9543", pca_9543 }, + { "wb_fpga_pca9544", pca_9544 }, + { "wb_fpga_pca9545", pca_9545 }, + { "wb_fpga_pca9546", pca_9545 }, + { "wb_fpga_pca9547", pca_9547 }, + { "wb_fpga_pca9548", pca_9548 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, fpga_pca954x_id); + +static int fpga_file_write(const char *path, int pos, unsigned char *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FPGA_PCA954X_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + FPGA_PCA954X_ERROR("kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; + +} +static int fpga_device_write(fpga_i2c_dev_t *fpga_i2c, int pos, unsigned char *val, size_t size) +{ + int ret; + + switch (fpga_i2c->i2c_func_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = fpga_file_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + default: + FPGA_PCA954X_ERROR("err func mode, write failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int fpga_reg_write(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t val) +{ + int ret; + + ret = fpga_device_write(fpga_i2c, addr, &val, sizeof(uint8_t)); + if (ret < 0) { + FPGA_PCA954X_ERROR("fpga_device_write failed. name:%s, addr:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return ret; + } + + FPGA_PCA954X_VERBOSE("fpga reg write success, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return 0; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,7) +static int pca954x_select_chan(struct i2c_adapter *adap, void *client, u32 chan) +{ + struct pca954x *data = i2c_get_clientdata(client); + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + u8 regval, i2c_9548_opt; + + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + FPGA_PCA954X_VERBOSE("root bus:%d, chan:0x%x, 9548 flag:0x%x, 9548 addr:0x%x.\n", + adap->nr, chan, data->fpga_9548_flag, client->addr); + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + + regval = 1 << chan; + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, regval); + } else { + if (data->fpga_9548_reset_flag == 1) { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS & ~(FPGA_I2C_9548_NO_RESET); + } else { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS | FPGA_I2C_9548_NO_RESET; + } + FPGA_PCA954X_VERBOSE("fpga pca9548 reset flag:0x%x, opt:0x%x.\n", + data->fpga_9548_reset_flag, i2c_9548_opt); + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, i2c_9548_opt); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_addr, client->addr); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, regval); + } + + return ret; +} + +static int pca954x_deselect_mux(struct i2c_adapter *adap, void *client, u32 chan) +{ + struct pca954x *data = i2c_get_clientdata(client); + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + /* Deselect active channel */ + data->last_chan = 0; + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, 0); + } else { + + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, FPGA_I2C_9548_NO_RESET); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, 0); + } + + return ret; +} +#else +static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + struct i2c_adapter *adap; + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + u8 regval, i2c_9548_opt; + + adap = muxc->parent; + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + FPGA_PCA954X_VERBOSE("root bus:%d, chan:0x%x, 9548 flag:0x%x, 9548 addr:0x%x.\n", + adap->nr, chan, data->fpga_9548_flag, client->addr); + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + + regval = 1 << chan; + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, regval); + } else { + if (data->fpga_9548_reset_flag == 1) { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS & ~(FPGA_I2C_9548_NO_RESET); + } else { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS | FPGA_I2C_9548_NO_RESET; + } + FPGA_PCA954X_VERBOSE("fpga pca9548 reset flag:0x%x, opt:0x%x.\n", + data->fpga_9548_reset_flag, i2c_9548_opt); + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, i2c_9548_opt); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_addr, client->addr); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, regval); + } + + return ret; +} + +static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_adapter *adap; + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + + adap = muxc->parent; + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + ret = 0; + /* Deselect active channel */ + data->last_chan = 0; + + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, 0); + } else { + + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, FPGA_I2C_9548_NO_RESET); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, 0); + } + + return ret; +} +#endif +/* + * I2C init/probing/exit functions + */ +static int fpga_i2c_pca954x_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); + int num, force, class; + struct pca954x *data; + int ret = -ENODEV; + struct device *dev; + int dynamic_nr = 1; + fpga_pca954x_device_t *fpga_pca954x_device; + +#if LINUX_VERSION_CODE > KERNEL_VERSION(4,6,7) + struct i2c_mux_core *muxc; +#endif + + if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE)) { + dev_err(&client->dev, "i2c adapter:%d, unsupport I2C_FUNC_SMBUS_BYTE.\n", adap->nr); + goto err; + } + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + data = kzalloc(sizeof(struct pca954x), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "kzalloc failed.\n"); + ret = -ENOMEM; + goto err; + } + + i2c_set_clientdata(client, data); +#else + muxc = i2c_mux_alloc(adap, &client->dev, + PCA954X_MAX_NCHANS, sizeof(*data), 0, + pca954x_select_chan, pca954x_deselect_mux); + if (!muxc) { + dev_err(&client->dev, "i2c_mux_alloc failed.\n"); + return -ENOMEM; + } + data = i2c_mux_priv(muxc); + i2c_set_clientdata(client, muxc); + data->client = client; +#endif + + dev = &client->dev; + if (dev == NULL) { + dev_err(&client->dev, "dev is NULL.\n"); + ret = -ENODEV; + goto exit_free; + } + + if (dev->of_node == NULL) { + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "Failed to get 954x platform data config.\n"); + ret = -EINVAL; + goto exit_free; + } + fpga_pca954x_device = client->dev.platform_data; + data->fpga_9548_flag = fpga_pca954x_device->fpga_9548_flag; + data->fpga_9548_reset_flag = fpga_pca954x_device->fpga_9548_reset_flag; + data->pca9548_base_nr = fpga_pca954x_device->pca9548_base_nr; + if (data->pca9548_base_nr == 0) { + + dynamic_nr = 1; + } else { + dynamic_nr = 0; + FPGA_PCA954X_VERBOSE("pca9548_base_nr:%u.\n", data->pca9548_base_nr); + } + } else { + data->type = id->driver_data; + /* BUS ID */ + ret = of_property_read_u32(dev->of_node, "fpga_9548_flag", &data->fpga_9548_flag); + ret += of_property_read_u32(dev->of_node, "fpga_9548_reset_flag", &data->fpga_9548_reset_flag); + if (ret != 0) { + dev_err(&client->dev, "Failed to get 954x dts config, ret:%d.\n", ret); + ret = -EINVAL; + goto exit_free; + } + if (of_property_read_u32(dev->of_node, "pca9548_base_nr", &data->pca9548_base_nr)) { + + dynamic_nr = 1; + FPGA_PCA954X_VERBOSE("pca9548_base_nr not found, use dynamic adap number"); + } else { + dynamic_nr = 0; + FPGA_PCA954X_VERBOSE("pca9548_base_nr:%u.\n", data->pca9548_base_nr); + } + } + + if (data->fpga_9548_flag != FPGA_EXTERNAL_PCA9548 && data->fpga_9548_flag != FPGA_INTERNAL_PCA9548) { + dev_err(&client->dev, "Error: fpga 954x flag config error, value:0x%x.\n", data->fpga_9548_flag); + ret = -EINVAL; + goto exit_free; + } + + data->type = id->driver_data; + data->last_chan = 0; /* force the first selection */ + + /* Now create an adapter for each channel */ + for (num = 0; num < chips[data->type].nchans; num++) { + if (dynamic_nr == 1) { + force = 0; /* dynamic adap number */ + } else { + force = data->pca9548_base_nr + num; + } + class = 0; /* no class by default */ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + data->virt_adaps[num] = + i2c_add_mux_adapter(adap, &client->dev, client, + force, num, class, pca954x_select_chan, pca954x_deselect_mux); + + if (data->virt_adaps[num] == NULL) { + ret = -ENODEV; + dev_err(&client->dev, "Failed to register multiplexed adapter %d as bus %d\n", + num, force); + goto virt_reg_failed; + } +#else + ret = i2c_mux_add_adapter(muxc, force, num, class); + if (ret) { + dev_err(&client->dev, "Failed to register multiplexed adapter %d as bus %d\n", + num, force); + goto virt_reg_failed; + } +#endif + } /* end for num = 0; num < chips[data->type].nchans... */ + + dev_info(&client->dev, "registered %d multiplexed busses for I2C %s %s\n", + num, chips[data->type].muxtype == pca954x_ismux ? "mux" : "switch", client->name); + + return 0; + +virt_reg_failed: +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + for (num--; num >= 0; num--) + i2c_del_mux_adapter(data->virt_adaps[num]); +exit_free: + kfree(data); +#else +exit_free: + i2c_mux_del_adapters(muxc); +#endif +err: + return ret; +} + +static int fpga_i2c_pca954x_remove(struct i2c_client *client) +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + struct pca954x *data = i2c_get_clientdata(client); + const struct chip_desc *chip = &chips[data->type]; + int i; + + for (i = 0; i < chip->nchans; ++i) + if (data->virt_adaps[i]) { + i2c_del_mux_adapter(data->virt_adaps[i]); + data->virt_adaps[i] = NULL; + } + + kfree(data); +#else + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + + i2c_mux_del_adapters(muxc); +#endif + + return 0; +} + +static struct i2c_driver fpga_i2c_pca954x_driver = { + .driver = { + .name = "wb_fpga_pca954x", + .owner = THIS_MODULE, + }, + .probe = fpga_i2c_pca954x_probe, + .remove = fpga_i2c_pca954x_remove, + .id_table = fpga_pca954x_id, +}; + +static int __init fpga_i2c_pca954x_init(void) +{ + int ret; + + ret = i2c_add_driver(&fpga_i2c_pca954x_driver); + return ret; +} + +static void __exit fpga_i2c_pca954x_exit(void) +{ + i2c_del_driver(&fpga_i2c_pca954x_driver); +} + +module_init(fpga_i2c_pca954x_init); +module_exit(fpga_i2c_pca954x_exit); +MODULE_DESCRIPTION("fpga pca954x driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c new file mode 100644 index 000000000000..aedcc78dab90 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c @@ -0,0 +1,164 @@ +/* + * wb_fpga_pcie.c + * ko to enable fpga pcie + */ +#include +#include +#include +#include +#include + +#define FPGA_MSI_IRQ_NUM (14) +#define FPGA_MSI_IRQ_BEGIN (0) +#define XILINX_FPGA_USE_MSI (0) +#define XILINX_FPGA_NUSE_MSI (1) + +int g_fpga_pcie_dev_debug = 0; +int g_fpga_pcie_dev_error = 0; +module_param(g_fpga_pcie_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_fpga_pcie_dev_error, int, S_IRUGO | S_IWUSR); + +#define FPGA_PCIE_DEV_VERBOSE(fmt, args...) do { \ + if (g_fpga_pcie_dev_debug) { \ + printk(KERN_INFO "[FPGA_PCIE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FPGA_PCIE_DEV_ERROR(fmt, args...) do { \ + if (g_fpga_pcie_dev_error) { \ + printk(KERN_ERR "[FPGA_PCIE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct wb_fpga_pcie_s { + struct pci_dev *pci_dev; + int driver_data; +} wb_fpga_pcie_t; + +static void fpga_pcie_recover(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct resource *mem_base; + u32 bar0_val; + int ret; + + mem_base = &pdev->resource[0]; + ret = pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &bar0_val); + if (ret) { + FPGA_PCIE_DEV_ERROR("pci_read_config_dword failed ret %d.\n", ret); + return; + } + FPGA_PCIE_DEV_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], ret %d.\n", + mem_base->start, bar0_val, ret); + + if (bar0_val != mem_base->start) { + ret = pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, mem_base->start); + if (ret) { + FPGA_PCIE_DEV_ERROR("pci_write_config_dword mem_base->start[0x%llx], failed ret %d.\n", mem_base->start, ret); + return; + } + FPGA_PCIE_DEV_VERBOSE("pci_write_config_dword mem_base->start[0x%llx] success.\n", mem_base->start); + } else { + FPGA_PCIE_DEV_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], do nothing.\n", + mem_base->start, bar0_val); + } +} + +static int fpga_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + int err; + wb_fpga_pcie_t *wb_fpga_pcie; + + FPGA_PCIE_DEV_VERBOSE("Enter vendor 0x%x, subsystem_vendor 0x%x.\n", pdev->vendor, pdev->subsystem_vendor); + + wb_fpga_pcie = devm_kzalloc(&pdev->dev, sizeof(wb_fpga_pcie_t), GFP_KERNEL); + if (!wb_fpga_pcie) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + fpga_pcie_recover(pdev, id); + + /* enable device: ask low-level code to enable I/O and memory */ + FPGA_PCIE_DEV_VERBOSE("start pci_enable_device!\n"); + err = pci_enable_device(pdev); + if (err) { + dev_err(&pdev->dev, "Failed to enable pci device, ret:%d.\n", err); + return err; + } + + FPGA_PCIE_DEV_VERBOSE("start pci_set_master!\n"); + pci_set_master(pdev); + + wb_fpga_pcie->driver_data = id->driver_data; + wb_fpga_pcie->pci_dev = pdev; + pci_set_drvdata(pdev, wb_fpga_pcie); + + if (wb_fpga_pcie->driver_data == XILINX_FPGA_USE_MSI) { + FPGA_PCIE_DEV_VERBOSE("start pci_enable_msi_range!\n"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,152) + err = pci_enable_msi_range(pdev, FPGA_MSI_IRQ_BEGIN + 1, FPGA_MSI_IRQ_NUM); +#else + err = pci_alloc_irq_vectors_affinity(pdev, FPGA_MSI_IRQ_BEGIN + 1, + FPGA_MSI_IRQ_NUM, PCI_IRQ_MSI, NULL); +#endif + if (err != FPGA_MSI_IRQ_NUM) { + FPGA_PCIE_DEV_ERROR("pci_enable_msi_block err %d FPGA_MSI_IRQ_NUM %d.\n", err, + FPGA_MSI_IRQ_NUM); + dev_err(&pdev->dev, "Failed to enable pci msi, ret:%d.\n", err); + return -EINVAL; + } + } + + dev_info(&pdev->dev, "fpga pci device init success.\n"); + return 0; +} + +static void fpga_pcie_remove(struct pci_dev *pdev) +{ + wb_fpga_pcie_t *wb_fpga_pcie; + + FPGA_PCIE_DEV_VERBOSE("fpga_pcie_remove.\n"); + + wb_fpga_pcie = pci_get_drvdata(pdev); + if (wb_fpga_pcie->driver_data == XILINX_FPGA_USE_MSI) { + FPGA_PCIE_DEV_VERBOSE("start pci_disable_msi!\n"); + pci_disable_msi(pdev); + } + + pci_disable_device(pdev); + return; +} + +static const struct pci_device_id fpga_pci_ids[] = { + { PCI_DEVICE(0x10ee, 0x7022), .driver_data = XILINX_FPGA_USE_MSI}, + { PCI_DEVICE(0x10ee, 0x7011), .driver_data = XILINX_FPGA_NUSE_MSI}, + {0} +}; +MODULE_DEVICE_TABLE(pci, fpga_pci_ids); + +static struct pci_driver wb_fpga_pcie_driver = { + .name = "wb_fpga_pcie", + .id_table = fpga_pci_ids,/* only dynamic id's */ + .probe = fpga_pcie_probe, + .remove = fpga_pcie_remove, +}; + +static int __init wb_fpga_pcie_init(void) +{ + + FPGA_PCIE_DEV_VERBOSE("wb_fpga_pcie_init enter!\n"); + return pci_register_driver(&wb_fpga_pcie_driver); +} + +static void __exit wb_fpga_pcie_exit(void) +{ + FPGA_PCIE_DEV_VERBOSE("wb_fpga_pcie_exit enter!\n"); + pci_unregister_driver(&wb_fpga_pcie_driver); + return; +} + +module_init(wb_fpga_pcie_init); +module_exit(wb_fpga_pcie_exit); +MODULE_DESCRIPTION("fpga pcie driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c new file mode 100644 index 000000000000..7d5d5da87ea7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c @@ -0,0 +1,367 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2011, 2012 Cavium Inc. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GPIO_NAME "wb_gpio_d1500" + +#define GPIO_BASE (0x500) +#define GP_IO_SEL (GPIO_BASE + 0x4) +#define GP_LVL (GPIO_BASE + 0xC) +#define GPI_NMI_EN (GPIO_BASE + 0x28) +#define GPI_NMI_STS (GPIO_BASE + 0x2a) +#define GPI_INV (GPIO_BASE + 0x2c) +#define GPIO_USE_SEL2 (GPIO_BASE + 0x30) +#define GP_IO_SEL2 (GPIO_BASE + 0x34) +#define GP_LVL2 (GPIO_BASE + 0x38) +#define GPI_NMI_EN_2 (GPIO_BASE + 0x3c) +#define GPI_NMI_STS_2 (GPIO_BASE + 0x3e) +#define GPIO_USE_SEL3 (GPIO_BASE + 0x40) +#define GP_IO_SEL3 (GPIO_BASE + 0x44) +#define GP_LVL3 (GPIO_BASE + 0x48) +#define GPI_NMI_EN_3 (GPIO_BASE + 0x50) +#define GPI_NMI_STS_3 (GPIO_BASE + 0x54) + +#define GPIO_BASE_ID (0) +#define BANKSIZE (32) +#define D1500_GPIO_PIN_NUM (96) +#define CELL_NUM (2) + +int g_gpio_d1500_debug = 0; +int g_gpio_d1500_error = 0; +module_param(g_gpio_d1500_debug, int, S_IRUGO | S_IWUSR); +module_param(g_gpio_d1500_error, int, S_IRUGO | S_IWUSR); + +#define GPIO_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_gpio_d1500_debug) { \ + printk(KERN_ERR "[GPIO-D1500][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define GPIO_DEBUG_ERROR(fmt, args...) do { \ + if (g_gpio_d1500_error) { \ + printk(KERN_ERR "[GPIO-D1500][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static DEFINE_SPINLOCK(sio_lock); + +struct gpio_d1500_t { + struct gpio_chip chip; + u64 register_base; +}; + +static int wb_gpio_get(struct gpio_chip *gc, unsigned gpio_num) +{ + u32 data = 0; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_LVL) & (1 << offset); + if (data) { + data = 1; + } + } else if (bank == 1) { + data = inl(GP_LVL2) & (1 << offset); + if (data) { + data = 1; + } + } else if (bank == 2) { + data = inl(GP_LVL3) & (1 << offset); + if (data) { + data = 1; + } + } + spin_unlock_irqrestore(&sio_lock, flags); + + return data; +} + +static int wb_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num) +{ + u32 data; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_IO_SEL); + data = data | (1 << offset); + outl(data, GP_IO_SEL); + } else if (bank == 1) { + data = inl(GP_IO_SEL2); + data = data | (1 << offset); + outl(data, GP_IO_SEL2); + } else if (bank == 2) { + data = inl(GP_IO_SEL3); + data = data | (1 << offset); + outl(data, GP_IO_SEL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return 0; +} + +static void wb_gpio_set(struct gpio_chip *gc, + unsigned gpio_num, int val) +{ + u32 data; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_LVL); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL); + } else if (bank == 1) { + data = inl(GP_LVL2); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL2); + } else if (bank == 2) { + data = inl(GP_LVL3); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return; +} + +static int wb_gpio_direction_out(struct gpio_chip *gc, + unsigned gpio_num, int val) +{ + u32 data; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_IO_SEL); + data = data & ~(1 << offset); + outl(data, GP_IO_SEL); + + data = inl(GP_LVL); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL); + } else if (bank == 1) { + data = inl(GP_IO_SEL2); + data = data & ~(1 << offset); + outl(data, GP_IO_SEL2); + + data = inl(GP_LVL2); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL2); + } else if (bank == 2) { + data = inl(GP_IO_SEL3); + data = data & ~(1 << offset); + outl(data, GP_IO_SEL3); + + data = inl(GP_LVL3); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return 0; +} + +#ifdef CONFIG_OF +static int wb_gpio_of_xlate(struct gpio_chip *chip, + const struct of_phandle_args *gpio_desc, + u32 *flags) +{ + if (chip->of_gpio_n_cells < 2) { + return -EINVAL; + } + + if (flags) { + *flags = gpio_desc->args[1]; + } + + return gpio_desc->args[0]; +} +#endif + +static int wb_gpio_request(struct gpio_chip *chip, unsigned int offset) +{ + u32 data; + unsigned int bank, tmp_offset; + unsigned long flags; + + bank = offset / BANKSIZE; + tmp_offset = offset % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GPIO_BASE); + data = data | (1 << tmp_offset); + outl(data, GPIO_BASE); + } else if (bank == 1) { + data = inl(GPIO_USE_SEL2); + data = data | (1 << tmp_offset); + outl(data, GPIO_USE_SEL2); + } else if (bank == 2) { + data = inl(GPIO_USE_SEL3); + data = data | (1 << tmp_offset); + outl(data, GPIO_USE_SEL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return 0; +} + +#if 0 +static void wb_gpio_free(struct gpio_chip *chip, unsigned int offset) +{ + u32 data; + unsigned int bank, tmp_offset; + unsigned long flags; + + bank = offset / BANKSIZE; + tmp_offset = offset % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GPIO_BASE); + data = data & ~(1 << tmp_offset); + outl(data, GPIO_BASE); + } else if (bank == 1) { + data = inl(GPIO_USE_SEL2); + data = data & ~(1 << tmp_offset); + outl(data, GPIO_USE_SEL2); + } else if (bank == 2) { + data = inl(GPIO_USE_SEL3); + data = data & ~(1 << tmp_offset); + outl(data, GPIO_USE_SEL3); + } + + spin_unlock_irqrestore(&sio_lock, flags); + + return; +} +#endif + +static struct gpio_chip wb_gpio_chip = { + .label = GPIO_NAME, + .owner = THIS_MODULE, + .base = GPIO_BASE_ID, + .get = wb_gpio_get, + .direction_input = wb_gpio_direction_in, + .set = wb_gpio_set, + .direction_output = wb_gpio_direction_out, +#ifdef CONFIG_OF + .of_xlate = wb_gpio_of_xlate, +#endif + .request = wb_gpio_request, + .ngpio = D1500_GPIO_PIN_NUM, +#ifdef CONFIG_OF + .of_gpio_n_cells = CELL_NUM, +#endif + .can_sleep = false, +}; + +static int wb_gpio_probe(struct platform_device *pdev) +{ + struct gpio_d1500_t *gpio; + int err; + + gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); + if (!gpio) { + dev_err(&pdev->dev, "gpio kzalloc failed\n"); + return -ENOMEM; + } + + wb_gpio_chip.parent = &pdev->dev; + gpio->register_base = GPIO_BASE; + gpio->chip = wb_gpio_chip; + pdev->dev.platform_data = &wb_gpio_chip; + err = devm_gpiochip_add_data(&pdev->dev, &wb_gpio_chip, gpio); + if (err) { + dev_err(&pdev->dev, "gpiochip add failed\n"); + return err; + } + + dev_info(&pdev->dev, "register %llu gpio success.\n", gpio->register_base); + + return 0; +} + +static int wb_gpio_remove(struct platform_device *pdev) +{ + dev_info(&pdev->dev, "unregister d1500 gpio success\n"); + return 0; +} + +static const struct of_device_id gpio_d1500_match[] = { + { + .compatible = "wb_gpio_d1500", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, gpio_d1500_match); + +static struct platform_driver wb_gpio_driver = { + .driver = { + .name = GPIO_NAME, + .of_match_table = gpio_d1500_match, + }, + .probe = wb_gpio_probe, + .remove = wb_gpio_remove, +}; + +module_platform_driver(wb_gpio_driver); + +MODULE_DESCRIPTION("d1500 gpio driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c new file mode 100644 index 000000000000..75f883b5909d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include + +static int g_wb_gpio_device_debug = 0; +static int g_wb_gpio_device_error = 0; + +module_param(g_wb_gpio_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_gpio_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_GPIO_DEVICE_VERBOSE(fmt, args...) do { \ + if (g_wb_gpio_device_debug) { \ + printk(KERN_INFO "[WB_GPIO_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_GPIO_DEVICE_ERROR(fmt, args...) do { \ + if (g_wb_gpio_device_error) { \ + printk(KERN_ERR "[WB_GPIO_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static void wb_gpio_device_release(struct device *dev) +{ + return; +} + +static struct platform_device wb_gpio_d1500_device = { + .name = "wb_gpio_d1500", + .id = -1, + .dev = { + .release = wb_gpio_device_release, + }, +}; + +static int __init wb_gpio_device_init(void) +{ + WB_GPIO_DEVICE_VERBOSE("wb_gpio_device_init enter!\n"); + return platform_device_register(&wb_gpio_d1500_device); +} + +static void __exit wb_gpio_device_exit(void) +{ + WB_GPIO_DEVICE_VERBOSE("wb_gpio_device_exit enter!\n"); + return platform_device_unregister(&wb_gpio_d1500_device); +} + +module_init(wb_gpio_device_init); +module_exit(wb_gpio_device_exit); +MODULE_DESCRIPTION("GPIO Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c new file mode 100644 index 000000000000..14f85f33f572 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c @@ -0,0 +1,774 @@ +/* + * wb_io_dev.c + * ko to read/write i2c client through /dev/XXX device + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_dev.h" + +#define MAX_I2C_DEV_NUM (256) +#define FPGA_MAX_LEN (256) +#define MAX_NAME_SIZE (20) +#define MAX_BUS_WIDTH (16) +#define TRANSFER_WRITE_BUFF (FPGA_MAX_LEN + MAX_BUS_WIDTH) + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) + +static int g_i2c_dev_debug = 0; +static int g_i2c_dev_error = 0; + +module_param(g_i2c_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_i2c_dev_error, int, S_IRUGO | S_IWUSR); + +#define I2C_DEV_DEBUG_DMESG(fmt, args...) do { \ + if (g_i2c_dev_debug) { \ + printk(KERN_ERR "[I2C_DEV][DEBUG][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define I2C_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_i2c_dev_error) { \ + printk(KERN_ERR "[I2C_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct i2c_dev_info* i2c_dev_arry[MAX_I2C_DEV_NUM]; + +struct i2c_dev_info { + const char *name; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + uint32_t i2c_len; + struct miscdevice misc; + struct i2c_client *client; +}; + +static int transfer_read(struct i2c_client *client, u8 *buf, loff_t regaddr, size_t count) +{ + struct i2c_adapter *adap; + int i; + u8 offset_buf[MAX_BUS_WIDTH]; + struct i2c_msg msgs[2]; + int msgs_num, ret; + struct i2c_dev_info *i2c_dev; + + if (!client) { + I2C_DEV_DEBUG_ERROR("can't get read client\n"); + return -ENODEV; + } + + adap = client->adapter; + if (!adap) { + I2C_DEV_DEBUG_ERROR("can't get read adap\n"); + return -ENODEV; + } + + i2c_dev = i2c_get_clientdata(client); + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\n", + i2c_dev->addr_bus_width); + return -EINVAL; + } + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + msgs[0].addr = client->addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width; + msgs[0].buf = offset_buf; + + msgs[1].addr = client->addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len = count; + msgs[1].buf = buf; + + msgs_num = 2; + ret = i2c_transfer(client->adapter, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer read error\n"); + return -EINVAL; + } + } else { + I2C_DEV_DEBUG_ERROR("don't find read master_xfer\n"); + return -EINVAL; + + } + return 0; +} + +static int transfer_write(struct i2c_client *client, u8 *buf, loff_t regaddr, size_t count) +{ + struct i2c_adapter *adap; + int i; + u8 offset_buf[TRANSFER_WRITE_BUFF]; + struct i2c_msg msgs[1]; + int msgs_num, ret; + struct i2c_dev_info *i2c_dev; + + if (!client) { + I2C_DEV_DEBUG_ERROR("can't get write client\n"); + return -ENODEV; + } + + adap = client->adapter; + if (!adap) { + I2C_DEV_DEBUG_ERROR("can't get write adap\n"); + return -ENODEV; + } + + i2c_dev = i2c_get_clientdata(client); + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\n", + i2c_dev->addr_bus_width); + return -EINVAL; + } + + memcpy(offset_buf + i2c_dev->addr_bus_width, buf, count); + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + + msgs[0].addr = client->addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width + count; + msgs[0].buf = offset_buf; + + msgs_num = 1; + ret = i2c_transfer(adap, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer write error\n"); + return -EINVAL; + } + } else { + I2C_DEV_DEBUG_ERROR("don't find write master_xfer\n"); + return -EINVAL; + } + + return 0; +} + +static long i2c_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static int i2c_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + struct i2c_dev_info *i2c_dev; + + i2c_dev = i2c_dev_arry[minor]; + if (i2c_dev == NULL) { + return -ENODEV; + } + + file->private_data = i2c_dev; + + return 0; +} + +static int i2c_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + + return 0; +} + +static int device_read(struct i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 tmp_offset; + u8 val[FPGA_MAX_LEN]; + u32 width, rd_len, per_len, tmp; + u32 max_per_len; + + if (offset > i2c_dev->i2c_len) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, count: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + if (count > (i2c_dev->i2c_len - offset)) { + I2C_DEV_DEBUG_DMESG("read count out of range. input len:%lu, read len:%u.\n", + count, i2c_dev->i2c_len - offset); + count = i2c_dev->i2c_len - offset; + } + + if (count == 0) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, read len: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\n", width); + return -EINVAL; + } + + max_per_len = i2c_dev->per_rd_len; + tmp = (width - 1) & count; + rd_len = (tmp == 0) ? count : count + width - tmp; + per_len = (rd_len > max_per_len) ? (max_per_len) : (rd_len); + + mem_clear(val, sizeof(val)); + for (i = 0; i < rd_len; i += per_len) { + ret = transfer_read(i2c_dev->client, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("read error.read offset = %u\n", (offset + i)); + return -EFAULT; + } + } + + if (width == WIDTH_1Byte) { + memcpy(buf, val, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + buf[i + j] = val[i + width - j - 1]; + } + } + } + + return count; +} + +static int device_write(struct i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 tmp_offset; + u32 width; + u8 val[FPGA_MAX_LEN]; + u32 wr_len, per_len, tmp; + u32 max_per_len; + + if (offset > i2c_dev->i2c_len) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, count: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + if (count > (i2c_dev->i2c_len - offset)) { + I2C_DEV_DEBUG_DMESG("read count out of range. input len:%lu, read len:%u.\n", + count, i2c_dev->i2c_len - offset); + count = i2c_dev->i2c_len - offset; + } + + if (count == 0) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, read len: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\n", width); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + + if (width == WIDTH_1Byte) { + memcpy(val, buf, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + val[i + width - j - 1] = buf[i + j]; + } + } + } + + max_per_len = i2c_dev->per_wr_len; + tmp = (width - 1) & count; + wr_len = (tmp == 0) ? count : count + width - tmp; + per_len = (wr_len > max_per_len) ? (max_per_len) : (wr_len); + + for (i = 0; i < wr_len; i += per_len) { + ret = transfer_write(i2c_dev->client, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("write error.offset = %u\n", (offset + i)); + return -EFAULT; + } + } + return count; +} + +static ssize_t i2c_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int ret, read_len; + struct i2c_dev_info *i2c_dev; + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("can't get read private_data.n"); + return -EINVAL; + } + + if (count == 0) { + I2C_DEV_DEBUG_ERROR("Invalid params, read count is 0.n"); + return -EINVAL; + } + + if (count > sizeof(val)) { + I2C_DEV_DEBUG_DMESG("read conut %lu exceed max %lu.\n", count, sizeof(val)); + count = sizeof(val); + } + + mem_clear(val, sizeof(val)); + read_len = device_read(i2c_dev, (uint32_t)*offset, val, count); + if (read_len < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, (uint32_t)*offset, count); + return read_len; + } + + if (access_ok(buf, read_len)) { + I2C_DEV_DEBUG_DMESG("user space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + if (copy_to_user(buf, val, read_len)) { + I2C_DEV_DEBUG_ERROR("copy_to_user failed.\n"); + return -EFAULT; + } + } else { + I2C_DEV_DEBUG_DMESG("kernel space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + memcpy(buf, val, read_len); + } + + *offset += read_len; + ret = read_len; + return ret; +} + +static ssize_t i2c_dev_read_iter(struct kiocb *iocb, struct iov_iter *to) +{ + int ret; + + I2C_DEV_DEBUG_DMESG("i2c_dev_read_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, to->count, iocb->ki_pos); + ret = i2c_dev_read(iocb->ki_filp, to->kvec->iov_base, to->count, &iocb->ki_pos); + return ret; +} + +static ssize_t i2c_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int write_len; + struct i2c_dev_info *i2c_dev; + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("get write private_data error.\n"); + return -EINVAL; + } + + if (count == 0) { + I2C_DEV_DEBUG_ERROR("Invalid params, write count is 0.\n"); + return -EINVAL; + } + + if (count > sizeof(val)) { + I2C_DEV_DEBUG_DMESG("write conut %lu exceed max %lu.\n", count, sizeof(val)); + count = sizeof(val); + } + + mem_clear(val, sizeof(val)); + if (access_ok(buf, count)) { + I2C_DEV_DEBUG_DMESG("user space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + if (copy_from_user(val, buf, count)) { + I2C_DEV_DEBUG_ERROR("copy_from_user failed.\n"); + return -EFAULT; + } + } else { + I2C_DEV_DEBUG_DMESG("kernel space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + memcpy(val, buf, count); + } + + write_len = device_write(i2c_dev, (uint32_t)*offset, val, count); + if (write_len < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%llx, len:%lu.\n", + i2c_dev->name, *offset, count); + return write_len; + } + + *offset += write_len; + return write_len; +} + +static ssize_t i2c_dev_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + int ret; + + I2C_DEV_DEBUG_DMESG("i2c_dev_write_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, from->count, iocb->ki_pos); + ret = i2c_dev_write(iocb->ki_filp, from->kvec->iov_base, from->count, &iocb->ki_pos); + return ret; +} + +static loff_t i2c_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + struct i2c_dev_info *i2c_dev; + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev is NULL, llseek failed.\n"); + return -EINVAL; + } + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + I2C_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + if (offset > i2c_dev->i2c_len) { + I2C_DEV_DEBUG_ERROR("SEEK_SET out of range, offset:%lld, i2c_len:0x%x.\n", + offset, i2c_dev->i2c_len); + ret = - EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (((file->f_pos + offset) > i2c_dev->i2c_len) || ((file->f_pos + offset) < 0)) { + I2C_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld, i2c_len:0x%x.\n", + file->f_pos, offset, i2c_dev->i2c_len); + ret = - EINVAL; + break; + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + I2C_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static const struct file_operations i2c_dev_fops = { + .owner = THIS_MODULE, + .llseek = i2c_dev_llseek, + .read_iter = i2c_dev_read_iter, + .write_iter = i2c_dev_write_iter, + .unlocked_ioctl = i2c_dev_ioctl, + .open = i2c_dev_open, + .release = i2c_dev_release, +}; + +static struct i2c_dev_info * dev_match(const char *path) +{ + struct i2c_dev_info * i2c_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + for (i = 0; i < MAX_I2C_DEV_NUM; i++) { + if (i2c_dev_arry[ i ] == NULL) { + continue; + } + i2c_dev = i2c_dev_arry[ i ]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", i2c_dev->name); + if (!strcmp(path, dev_name)) { + I2C_DEV_DEBUG_DMESG("get dev_name = %s, minor = %d\n", dev_name, i); + return i2c_dev; + } + } + + return NULL; +} + +int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("read conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_read(i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("fpga i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(i2c_device_func_read); + +int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("write conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_write (i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(i2c_device_func_write); + +static int i2c_dev_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int ret = 0; + struct i2c_dev_info *i2c_dev; + struct miscdevice *misc; + i2c_dev_device_t *i2c_dev_device; + + i2c_dev = devm_kzalloc(&client->dev, sizeof(struct i2c_dev_info), GFP_KERNEL); + if (!i2c_dev) { + dev_err(&client->dev, "devm_kzalloc error. \n"); + return -ENOMEM; + } + + i2c_set_clientdata(client, i2c_dev); + i2c_dev->client = client; + + if (client->dev.of_node) { + + ret += of_property_read_string(client->dev.of_node, "i2c_name", &i2c_dev->name); + ret += of_property_read_u32(client->dev.of_node, "data_bus_width", &i2c_dev->data_bus_width); + ret += of_property_read_u32(client->dev.of_node, "addr_bus_width", &i2c_dev->addr_bus_width); + ret += of_property_read_u32(client->dev.of_node, "per_rd_len", &i2c_dev->per_rd_len); + ret += of_property_read_u32(client->dev.of_node, "per_wr_len", &i2c_dev->per_wr_len); + ret += of_property_read_u32(client->dev.of_node, "i2c_len", &i2c_dev->i2c_len); + if (ret != 0) { + dev_err(&client->dev, "dts config error.ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + i2c_dev_device = client->dev.platform_data; + i2c_dev->name = i2c_dev_device->i2c_name; + i2c_dev->data_bus_width = i2c_dev_device->data_bus_width; + i2c_dev->addr_bus_width = i2c_dev_device->addr_bus_width; + i2c_dev->per_rd_len = i2c_dev_device->per_rd_len; + i2c_dev->per_wr_len = i2c_dev_device->per_wr_len; + i2c_dev->i2c_len = i2c_dev_device->i2c_len; + } + + if ((i2c_dev->per_rd_len & (i2c_dev->data_bus_width - 1)) || + (i2c_dev->per_wr_len & (i2c_dev->data_bus_width - 1))) { + dev_err(&client->dev, "Invalid config per_rd_len %d per_wr_len %d data bus_width %d.\n", + i2c_dev->per_rd_len, i2c_dev->per_wr_len, i2c_dev->data_bus_width); + return -ENXIO; + } + + if ((i2c_dev->i2c_len == 0) || (i2c_dev->i2c_len & (i2c_dev->data_bus_width - 1))) { + dev_err(&client->dev, "Invalid config i2c_len %d, data bus_width %d.\n", + i2c_dev->i2c_len, i2c_dev->data_bus_width); + return -ENXIO; + } + + misc = &i2c_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = i2c_dev->name; + misc->fops = &i2c_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&client->dev, "register %s faild.\n", misc->name); + return -ENXIO; + } + + if (misc->minor >= MAX_I2C_DEV_NUM) { + dev_err(&client->dev, "minor number beyond the limit! is %d.\n", misc->minor); + misc_deregister(misc); + return -ENXIO; + } + i2c_dev_arry[misc->minor] = i2c_dev; + + dev_info(&client->dev, "register %u addr_bus_width %u data_bus_width 0x%x i2c_len device %s with %u per_rd_len %u per_wr_len success.\n", + i2c_dev->addr_bus_width, i2c_dev->data_bus_width, i2c_dev->i2c_len, i2c_dev->name, i2c_dev->per_rd_len, i2c_dev->per_wr_len); + + return 0; +} + +static int i2c_dev_remove(struct i2c_client *client) +{ + int i; + for (i = 0; i < MAX_I2C_DEV_NUM; i++) { + if (i2c_dev_arry[i] != NULL) { + misc_deregister(&i2c_dev_arry[i]->misc); + i2c_dev_arry[i] = NULL; + } + } + return 0; +} + +static const struct i2c_device_id i2c_dev_id[] = { + { "wb-i2c-dev", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, i2c_dev_id); + +static const struct of_device_id i2c_dev_of_match[] = { + { .compatible = "wb-i2c-dev" }, + { }, +}; +MODULE_DEVICE_TABLE(of, i2c_dev_of_match); + +static struct i2c_driver i2c_dev_driver = { + .driver = { + .name = "wb-i2c-dev", + .of_match_table = i2c_dev_of_match, + }, + .probe = i2c_dev_probe, + .remove = i2c_dev_remove, + .id_table = i2c_dev_id, +}; +module_i2c_driver(i2c_dev_driver); + +MODULE_DESCRIPTION("i2c dev driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h new file mode 100644 index 000000000000..9cc95d88e804 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h @@ -0,0 +1,20 @@ +#ifndef __WB_I2C_DEV_H__ +#define __WB_I2C_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define I2C_DEV_NAME_MAX_LEN (64) + +typedef struct i2c_dev_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + char i2c_name[I2C_DEV_NAME_MAX_LEN]; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + uint32_t i2c_len; +} i2c_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c new file mode 100644 index 000000000000..1f69d96bad0b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c @@ -0,0 +1,1143 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * i2c-ocores.c: I2C bus driver for OpenCores I2C controller + * (https://opencores.org/project/i2c/overview) + * + * Peter Korsgaard + * + * Support for the GRLIB port of the controller by + * Andreas Larsson + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_ocores.h" + +#define OCORES_FLAG_POLL BIT(0) + +/* registers */ +#define OCI2C_PRELOW (0) +#define OCI2C_PREHIGH (1) +#define OCI2C_CONTROL (2) +#define OCI2C_DATA (3) +#define OCI2C_CMD (4) /* write only */ +#define OCI2C_STATUS (4) /* read only, same address as OCI2C_CMD */ + +#define OCI2C_CTRL_IEN (0x40) +#define OCI2C_CTRL_EN (0x80) + +#define OCI2C_CMD_START (0x91) +#define OCI2C_CMD_STOP (0x41) +#define OCI2C_CMD_READ (0x21) +#define OCI2C_CMD_WRITE (0x11) +#define OCI2C_CMD_READ_ACK (0x21) +#define OCI2C_CMD_READ_NACK (0x29) +#define OCI2C_CMD_IACK (0x01) + +#define OCI2C_STAT_IF (0x01) +#define OCI2C_STAT_TIP (0x02) +#define OCI2C_STAT_ARBLOST (0x20) +#define OCI2C_STAT_BUSY (0x40) +#define OCI2C_STAT_NACK (0x80) + +#define STATE_DONE (0) +#define STATE_START (1) +#define STATE_WRITE (2) +#define STATE_READ (3) +#define STATE_ERROR (4) + +#define TYPE_OCORES (0) +#define TYPE_GRLIB (1) + +#define OCORE_WAIT_SCH (40) +#define REG_IO_WIDTH_1 (1) +#define REG_IO_WIDTH_2 (2) +#define REG_IO_WIDTH_4 (4) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) + +typedef struct wb_pci_dev_s { + uint32_t domain; + uint32_t bus; + uint32_t slot; + uint32_t fn; +} wb_pci_dev_t; + +/* + * 'process_lock' exists because ocores_process() and ocores_process_timeout() + * can't run in parallel. + */ +struct ocores_i2c { + uint32_t base_addr; + uint32_t reg_shift; + uint32_t reg_io_width; + unsigned long flags; + wait_queue_head_t wait; + struct i2c_adapter adap; + int adap_nr; + struct i2c_msg *msg; + int pos; + int nmsgs; + int state; + spinlock_t process_lock; + uint32_t ip_clock_khz; + uint32_t bus_clock_khz; + void (*setreg)(struct ocores_i2c *i2c, int reg, u32 value); + u32 (*getreg)(struct ocores_i2c *i2c, int reg); + const char *dev_name; + uint32_t reg_access_mode; + uint32_t big_endian; + uint32_t irq_offset; + wb_pci_dev_t wb_pci_dev; + struct device *dev; +}; + +int g_wb_ocores_i2c_debug = 0; +int g_wb_ocores_i2c_error = 0; +int g_wb_ocores_i2c_xfer = 0; + +module_param(g_wb_ocores_i2c_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_ocores_i2c_error, int, S_IRUGO | S_IWUSR); +module_param(g_wb_ocores_i2c_xfer, int, S_IRUGO | S_IWUSR); + +#define OCORES_I2C_VERBOSE(fmt, args...) do { \ + if (g_wb_ocores_i2c_debug) { \ + printk(KERN_INFO "[OCORES_I2C][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define OCORES_I2C_ERROR(fmt, args...) do { \ + if (g_wb_ocores_i2c_error) { \ + printk(KERN_ERR "[OCORES_I2C][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define OCORES_I2C_XFER(fmt, args...) do { \ + if (g_wb_ocores_i2c_xfer) { \ + printk(KERN_INFO "[OCORES_I2C][XFER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +extern int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +#if 0 +int __attribute__((weak)) i2c_device_func_read(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak i2c func read\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) i2c_device_func_write(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak i2c func write\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) pcie_device_func_read(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak pcie func read\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) pcie_device_func_write(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak pcie func write\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) io_device_func_read(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak io func read\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) io_device_func_write(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak io func write\r\n"); + return -EINVAL; +} +#endif +static int ocores_i2c_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + OCORES_I2C_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + OCORES_I2C_ERROR("kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int ocores_i2c_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + OCORES_I2C_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + OCORES_I2C_ERROR("kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int ocores_i2c_reg_write(struct ocores_i2c *i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (i2c->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = ocores_i2c_file_write(i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(i2c->dev_name, pos, val, size); + break; + default: + OCORES_I2C_ERROR("err func_mode, write failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int ocores_i2c_reg_read(struct ocores_i2c *i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (i2c->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = ocores_i2c_file_read(i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(i2c->dev_name, pos, val, size); + break; + default: + OCORES_I2C_ERROR("err func_mode, read failed.\n"); + return -EINVAL; + } + + return ret; +} +static void oc_setreg_8(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_1); + return; +} + +static void oc_setreg_16(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + buf_tmp[1] = (value >> 8) & 0xff; + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_setreg_32(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0xff); + buf_tmp[1] = (value >> 8) & 0xff; + buf_tmp[2] = (value >> 16) & 0xff; + buf_tmp[3] = (value >> 24) & 0xff; + + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static void oc_setreg_16be(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 8) & 0xff; + buf_tmp[1] = (value & 0Xff); + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_setreg_32be(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 24) & 0xff; + buf_tmp[1] = (value >> 16) & 0xff; + buf_tmp[2] = (value >> 8) & 0xff; + buf_tmp[3] = (value & 0xff); + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static inline u32 oc_getreg_8(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 value, pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_1); + value = buf_tmp[0]; + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + return value; +} + +static inline u32 oc_getreg_16(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_getreg_32(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_getreg_16be(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_2 -i - 1)); + } + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_getreg_32be(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_4 -i - 1)); + } + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; + +} + +static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u32 value) +{ + i2c->setreg(i2c, reg, value); + return; +} + +static inline u32 oc_getreg(struct ocores_i2c *i2c, int reg) +{ + return i2c->getreg(i2c, reg); +} + +static int ocores_msg_check(struct i2c_msg *msgs, int num) +{ + int i, ret = 0; + + if (!msgs) { + ret = -EFAULT; + goto out; + } + + for (i = 0; i < num; ++i) { + if (!msgs[i].buf) { + ret = -EFAULT; + goto out; + } + } + +out: + return ret; +} + +static void ocores_process(struct ocores_i2c *i2c, u8 stat) +{ + struct i2c_msg *msg = i2c->msg; + + OCORES_I2C_XFER("Enter nr %d.\n", i2c->adap.nr); + if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) { + /* stop has been sent */ + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); + wake_up(&i2c->wait); + OCORES_I2C_XFER("stop has been sent, exit.\n"); + goto out; + } + + /* error? */ + if (stat & OCI2C_STAT_ARBLOST) { + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + OCORES_I2C_XFER("error exit, lose arbitration.\n"); + goto out; + } + + if (ocores_msg_check(i2c->msg, i2c->nmsgs) != 0) { + OCORES_I2C_XFER("msg buf is NULL\n"); + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + goto out; + } + + if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { + i2c->state = + (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; + + if (stat & OCI2C_STAT_NACK) { + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + OCORES_I2C_XFER("OCI2C_STAT_NACK, exit.\n"); + goto out; + } + } else { + msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA); + } + + /* end of msg? */ + if (i2c->pos == msg->len) { + OCORES_I2C_XFER("Enter end of msg.\n"); + i2c->nmsgs--; + i2c->msg++; + i2c->pos = 0; + msg = i2c->msg; + + if (i2c->nmsgs) { /* end? */ + /* send start? */ + if (!(msg->flags & I2C_M_NOSTART)) { + u8 addr = i2c_8bit_addr_from_msg(msg); + + i2c->state = STATE_START; + + oc_setreg(i2c, OCI2C_DATA, addr); + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); + OCORES_I2C_XFER("send start, exit.\n"); + goto out; + } + i2c->state = (msg->flags & I2C_M_RD) + ? STATE_READ : STATE_WRITE; + } else { + i2c->state = STATE_DONE; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + OCORES_I2C_XFER("send OCI2C_CMD_STOP, exit.\n"); + goto out; + } + } + + if (i2c->state == STATE_READ) { + oc_setreg(i2c, OCI2C_CMD, i2c->pos == (msg->len-1) ? + OCI2C_CMD_READ_NACK : OCI2C_CMD_READ_ACK); + } else { + oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]); + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE); + } + +out: + OCORES_I2C_XFER("normal, exit nr %d.\n", i2c->adap.nr); + return; +} + +static irqreturn_t ocores_isr(int irq, void *dev_id) +{ + struct ocores_i2c *i2c = dev_id; + u8 stat; + unsigned long flags; + + if (!i2c) { + return IRQ_NONE; + } + + spin_lock_irqsave(&i2c->process_lock, flags); + stat = oc_getreg(i2c, OCI2C_STATUS); + if (!(stat & OCI2C_STAT_IF)) { + spin_unlock_irqrestore(&i2c->process_lock, flags); + return IRQ_NONE; + } + OCORES_I2C_XFER("Enter, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)? 0 : i2c->msg->addr); + ocores_process(i2c, stat); + OCORES_I2C_XFER("Leave, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)? 0 : i2c->msg->addr); + spin_unlock_irqrestore(&i2c->process_lock, flags); + + return IRQ_HANDLED; +} + +/** + * Process timeout event + * @i2c: ocores I2C device instance + */ +static void ocores_process_timeout(struct ocores_i2c *i2c) +{ + unsigned long flags; + + spin_lock_irqsave(&i2c->process_lock, flags); + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + mdelay(1); + spin_unlock_irqrestore(&i2c->process_lock, flags); + return; +} + +/** + * Wait until something change in a given register + * @i2c: ocores I2C device instance + * @reg: register to query + * @mask: bitmask to apply on register value + * @val: expected result + * @timeout: timeout in jiffies + * + * Timeout is necessary to avoid to stay here forever when the chip + * does not answer correctly. + * + * Return: 0 on success, -ETIMEDOUT on timeout + */ +static int ocores_wait(struct ocores_i2c *i2c, + int reg, u8 mask, u8 val, + const unsigned long timeout) +{ + u8 status; + unsigned long j, jiffies_tmp; + unsigned int usleep; + + usleep = OCORE_WAIT_SCH; + j = jiffies + timeout; + while (1) { + jiffies_tmp = jiffies; + status = oc_getreg(i2c, reg); + + if ((status & mask) == val) { + break; + } + + if (time_after(jiffies_tmp, j)) { + OCORES_I2C_XFER("STATUS timeout, mask[0x%x] val[0x%x] status[0x%x]\n", mask, val, status); + return -ETIMEDOUT; + } + usleep_range(usleep,usleep + 1); + } + return 0; + +} + +/** + * Wait until is possible to process some data + * @i2c: ocores I2C device instance + * + * Used when the device is in polling mode (interrupts disabled). + * + * Return: 0 on success, -ETIMEDOUT on timeout + */ +static int ocores_poll_wait(struct ocores_i2c *i2c) +{ + u8 mask; + int err; + + if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) { + /* transfer is over */ + mask = OCI2C_STAT_BUSY; + } else { + /* on going transfer */ + mask = OCI2C_STAT_TIP; + /* + * We wait for the data to be transferred (8bit), + * then we start polling on the ACK/NACK bit + */ + udelay((8 * 1000) / i2c->bus_clock_khz); + } + + /* + * once we are here we expect to get the expected result immediately + * so if after 100ms we timeout then something is broken. + */ + err = ocores_wait(i2c, OCI2C_STATUS, mask, 0, msecs_to_jiffies(100)); + if (err) { + OCORES_I2C_XFER("STATUS timeout, bit 0x%x did not clear in 100ms, err %d\n", mask, err); + } + return err; +} + +/** + * It handles an IRQ-less transfer + * @i2c: ocores I2C device instance + * + * Even if IRQ are disabled, the I2C OpenCore IP behavior is exactly the same + * (only that IRQ are not produced). This means that we can re-use entirely + * ocores_isr(), we just add our polling code around it. + * + * It can run in atomic context + */ +static int ocores_process_polling(struct ocores_i2c *i2c) +{ + irqreturn_t ret; + int err; + + while (1) { + err = ocores_poll_wait(i2c); + if (err) { + i2c->state = STATE_ERROR; + break; /* timeout */ + } + + ret = ocores_isr(-1, i2c); + if (ret == IRQ_NONE) { + break; /* all messages have been transferred */ + } + } + + return err; +} + +static int ocores_xfer_core(struct ocores_i2c *i2c, + struct i2c_msg *msgs, int num, + bool polling) +{ + int ret; + u8 ctrl; + unsigned long flags; + + OCORES_I2C_VERBOSE("Enter ocores_xfer_core. polling mode:%d.\n", polling); + spin_lock_irqsave(&i2c->process_lock, flags); + + ctrl = oc_getreg(i2c, OCI2C_CONTROL); + if (polling) { + oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~OCI2C_CTRL_IEN); + } else { + oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN); + } + + i2c->msg = msgs; + i2c->pos = 0; + i2c->nmsgs = num; + i2c->state = STATE_START; + + oc_setreg(i2c, OCI2C_DATA, i2c_8bit_addr_from_msg(i2c->msg)); + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); + + spin_unlock_irqrestore(&i2c->process_lock, flags); + + if (polling) { + ret = ocores_process_polling(i2c); + if (ret) { + ocores_process_timeout(i2c); + return -ETIMEDOUT; + } + } else { + ret = wait_event_timeout(i2c->wait, + (i2c->state == STATE_ERROR) || + (i2c->state == STATE_DONE), HZ); + if (ret == 0) { + ocores_process_timeout(i2c); + return -ETIMEDOUT; + } + } + + return (i2c->state == STATE_DONE) ? num : -EIO; +} + +static int ocores_xfer(struct i2c_adapter *adap, + struct i2c_msg *msgs, int num) +{ + struct ocores_i2c *i2c; + int ret; + + OCORES_I2C_VERBOSE("Enter ocores_xfer.\n"); + if (!adap || ocores_msg_check(msgs, num)) { + OCORES_I2C_ERROR("[MAY BE USER SPACE ERROR]:msg buf is NULL\n"); + return -EFAULT; + } + OCORES_I2C_VERBOSE("i2c bus:%d, msgs num:%d.\n", adap->nr, num); + + i2c = i2c_get_adapdata(adap); + + if (i2c->flags & OCORES_FLAG_POLL) { + ret = ocores_xfer_core(i2c, msgs, num, true); + } else { + ret = ocores_xfer_core(i2c, msgs, num, false); + } + + return ret; +} + +static int ocores_init(struct device *dev, struct ocores_i2c *i2c) +{ + int prescale; + int diff; + u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); + + /* make sure the device is disabled */ + ctrl &= ~(OCI2C_CTRL_EN | OCI2C_CTRL_IEN); + oc_setreg(i2c, OCI2C_CONTROL, ctrl); + + prescale = (i2c->ip_clock_khz / (5 * i2c->bus_clock_khz)) - 1; + prescale = clamp(prescale, 0, 0xffff); + + diff = i2c->ip_clock_khz / (5 * (prescale + 1)) - i2c->bus_clock_khz; + if (abs(diff) > i2c->bus_clock_khz / 10) { + dev_err(dev, "Unsupported clock settings: core: %d KHz, bus: %d KHz\n", + i2c->ip_clock_khz, i2c->bus_clock_khz); + return -EINVAL; + } + + oc_setreg(i2c, OCI2C_PRELOW, prescale & 0xff); + oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8); + + /* Init the device */ + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); + oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_EN); + + return 0; +} + +static u32 ocores_func(struct i2c_adapter *adap) +{ + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; +} + +static const struct i2c_algorithm ocores_algorithm = { + .master_xfer = ocores_xfer, + .functionality = ocores_func, +}; + +static const struct i2c_adapter ocores_adapter = { + .owner = THIS_MODULE, + .name = "wb-i2c-ocores", + .class = I2C_CLASS_DEPRECATED, + .algo = &ocores_algorithm, +}; + +static const struct of_device_id ocores_i2c_match[] = { + { + .compatible = "opencores,wb-i2c-ocores", + .data = (void *)TYPE_OCORES, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, ocores_i2c_match); + +static int fpga_ocores_i2c_get_irq(struct ocores_i2c *i2c) +{ + int devfn, irq; + struct device *dev; + wb_pci_dev_t *wb_pci_dev; + struct pci_dev *pci_dev; + i2c_ocores_device_t *i2c_ocores_device; + int ret; + + dev = i2c->dev; + wb_pci_dev = &i2c->wb_pci_dev; + + if (dev->of_node) { + ret = 0; + ret += of_property_read_u32(dev->of_node, "pci_domain", &wb_pci_dev->domain); + ret += of_property_read_u32(dev->of_node, "pci_bus", &wb_pci_dev->bus); + ret += of_property_read_u32(dev->of_node, "pci_slot", &wb_pci_dev->slot); + ret += of_property_read_u32(dev->of_node, "pci_fn", &wb_pci_dev->fn); + + if (ret != 0) { + OCORES_I2C_ERROR("dts config error, ret:%d.\n", ret); + ret = -EINVAL; + return ret; + } + } else { + if (i2c->dev->platform_data == NULL) { + OCORES_I2C_ERROR("Failed to get platform data config.\n"); + ret = -EINVAL; + return ret; + } + i2c_ocores_device = i2c->dev->platform_data; + wb_pci_dev->domain = i2c_ocores_device->pci_domain; + wb_pci_dev->bus = i2c_ocores_device->pci_bus; + wb_pci_dev->slot = i2c_ocores_device->pci_slot; + wb_pci_dev->fn = i2c_ocores_device->pci_fn; + } + + OCORES_I2C_VERBOSE("pci_domain:0x%x, pci_bus:0x%x, pci_slot:0x%x, pci_fn:0x%x.\n", + wb_pci_dev->domain, wb_pci_dev->bus, wb_pci_dev->slot, wb_pci_dev->fn); + + devfn = PCI_DEVFN(wb_pci_dev->slot, wb_pci_dev->fn); + pci_dev = pci_get_domain_bus_and_slot(wb_pci_dev->domain, wb_pci_dev->bus, devfn); + if (pci_dev == NULL) { + OCORES_I2C_ERROR("Failed to find pci_dev, domain:0x%04x, bus:0x%02x, devfn:0x%x\n", + wb_pci_dev->domain, wb_pci_dev->bus, devfn); + return -ENODEV; + } + irq = pci_dev->irq + i2c->irq_offset; + OCORES_I2C_VERBOSE("get irq no:%d.\n", irq); + return irq; +} + +static int ocores_i2c_config_init(struct ocores_i2c *i2c) +{ + int ret; + struct device *dev; + i2c_ocores_device_t *i2c_ocores_device; + + dev = i2c->dev; + ret = 0; + + if (dev->of_node) { + ret += of_property_read_string(dev->of_node, "dev_name", &i2c->dev_name); + ret += of_property_read_u32(dev->of_node, "dev_base", &i2c->base_addr); + ret += of_property_read_u32(dev->of_node, "reg_shift", &i2c->reg_shift); + ret += of_property_read_u32(dev->of_node, "reg_io_width", &i2c->reg_io_width); + ret += of_property_read_u32(dev->of_node, "ip_clock_khz", &i2c->ip_clock_khz); + ret += of_property_read_u32(dev->of_node, "bus_clock_khz", &i2c->bus_clock_khz); + ret += of_property_read_u32(dev->of_node, "reg_access_mode", &i2c->reg_access_mode); + + if (ret != 0) { + OCORES_I2C_ERROR("dts config error, ret:%d.\n", ret); + ret = -ENXIO; + return ret; + } + } else { + if (i2c->dev->platform_data == NULL) { + OCORES_I2C_ERROR("Failed to get platform data config.\n"); + ret = -ENXIO; + return ret; + } + i2c_ocores_device = i2c->dev->platform_data; + i2c->dev_name = i2c_ocores_device->dev_name; + i2c->adap_nr = i2c_ocores_device->adap_nr; + i2c->big_endian = i2c_ocores_device->big_endian; + i2c->base_addr = i2c_ocores_device->dev_base; + i2c->reg_shift = i2c_ocores_device->reg_shift; + i2c->reg_io_width = i2c_ocores_device->reg_io_width; + i2c->ip_clock_khz = i2c_ocores_device->ip_clock_khz; + i2c->bus_clock_khz = i2c_ocores_device->bus_clock_khz; + i2c->reg_access_mode = i2c_ocores_device->reg_access_mode; + } + + OCORES_I2C_VERBOSE("name:%s, base:0x%x, reg_shift:0x%x, io_width:0x%x, ip_clock_khz:0x%x, bus_clock_khz:0x%x.\n", + i2c->dev_name, i2c->base_addr, i2c->reg_shift, i2c->reg_io_width, i2c->ip_clock_khz, i2c->bus_clock_khz); + OCORES_I2C_VERBOSE("reg access mode:%d.\n", i2c->reg_access_mode); + return ret; +} + +static int ocores_i2c_probe(struct platform_device *pdev) +{ + struct ocores_i2c *i2c; + int irq, ret; + bool be; + i2c_ocores_device_t *i2c_ocores_device; + + OCORES_I2C_VERBOSE("Enter main probe\n"); + + i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); + if (!i2c) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + spin_lock_init(&i2c->process_lock); + + i2c->dev = &pdev->dev; + ret = ocores_i2c_config_init(i2c); + if (ret !=0) { + dev_err(i2c->dev, "Failed to get ocores i2c dts config.\n"); + goto out; + } + + if (i2c->dev->of_node) { + if (of_property_read_u32(i2c->dev->of_node, "big_endian", &i2c->big_endian)) { + + be = 0; + } else { + be = i2c->big_endian; + } + } else { + be = i2c->big_endian; + } + + if (i2c->reg_io_width == 0) { + i2c->reg_io_width = 1; /* Set to default value */ + } + + if (!i2c->setreg || !i2c->getreg) { + switch (i2c->reg_io_width) { + case REG_IO_WIDTH_1: + i2c->setreg = oc_setreg_8; + i2c->getreg = oc_getreg_8; + break; + + case REG_IO_WIDTH_2: + i2c->setreg = be ? oc_setreg_16be : oc_setreg_16; + i2c->getreg = be ? oc_getreg_16be : oc_getreg_16; + break; + + case REG_IO_WIDTH_4: + i2c->setreg = be ? oc_setreg_32be : oc_setreg_32; + i2c->getreg = be ? oc_getreg_32be : oc_getreg_32; + break; + + default: + dev_err(i2c->dev, "Unsupported I/O width (%d)\n", + i2c->reg_io_width); + ret = -EINVAL; + goto out; + } + } + + init_waitqueue_head(&i2c->wait); + irq = -1; + + if (i2c->dev->of_node) { + if (of_property_read_u32(i2c->dev->of_node, "irq_offset", &i2c->irq_offset)) { + + i2c->flags |= OCORES_FLAG_POLL; + } else { + + irq = fpga_ocores_i2c_get_irq(i2c); + if (irq < 0 ) { + dev_err(i2c->dev, "Failed to get ocores i2c irq number, ret: %d.\n", irq); + ret = irq; + goto out; + } + } + } else { + if (i2c->dev->platform_data == NULL) { + + i2c->flags |= OCORES_FLAG_POLL; + OCORES_I2C_VERBOSE("Failed to get platform data config, set OCORES_FLAG_POLL.\n"); + } else { + i2c_ocores_device = i2c->dev->platform_data; + if (i2c_ocores_device->irq_type == 0) { + + i2c->flags |= OCORES_FLAG_POLL; + } else { + + irq = fpga_ocores_i2c_get_irq(i2c); + if (irq < 0 ) { + dev_err(i2c->dev, "Failed to get ocores i2c irq number, ret: %d.\n", irq); + ret = irq; + goto out; + } + } + } + } + + if (!(i2c->flags & OCORES_FLAG_POLL)) { + ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0, + pdev->name, i2c); + if (ret) { + dev_err(i2c->dev, "Cannot claim IRQ\n"); + goto out; + } + } + + ret = ocores_init(i2c->dev, i2c); + if (ret) { + goto out; + } + + /* hook up driver to tree */ + platform_set_drvdata(pdev, i2c); + i2c->adap = ocores_adapter; + i2c_set_adapdata(&i2c->adap, i2c); + i2c->adap.dev.parent = &pdev->dev; + i2c->adap.dev.of_node = pdev->dev.of_node; + + if (i2c->dev->of_node) { + /* adap.nr get from dts aliases */ + ret = i2c_add_adapter(&i2c->adap); + } else { + i2c->adap.nr = i2c->adap_nr; + ret = i2c_add_numbered_adapter(&i2c->adap); + } + if (ret) { + goto fail_add; + } + OCORES_I2C_VERBOSE("Main probe out\n"); + dev_info(i2c->dev, "registered i2c-%d for %s with base address:0x%x success.\n", + i2c->adap.nr, i2c->dev_name, i2c->base_addr); + return 0; +fail_add: + platform_set_drvdata(pdev, NULL); +out: + return ret; +} + +static int ocores_i2c_remove(struct platform_device *pdev) +{ + struct ocores_i2c *i2c = platform_get_drvdata(pdev); + u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); + + /* disable i2c logic */ + ctrl &= ~(OCI2C_CTRL_EN | OCI2C_CTRL_IEN); + oc_setreg(i2c, OCI2C_CONTROL, ctrl); + + /* remove adapter & data */ + i2c_del_adapter(&i2c->adap); + return 0; +} + +static struct platform_driver ocores_i2c_driver = { + .probe = ocores_i2c_probe, + .remove = ocores_i2c_remove, + .driver = { + .name = "wb-ocores-i2c", + .of_match_table = ocores_i2c_match, + }, +}; + +module_platform_driver(ocores_i2c_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("OpenCores I2C bus driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ocores-i2c"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h new file mode 100644 index 000000000000..acd2710a92f0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h @@ -0,0 +1,28 @@ +#ifndef __WB_I2C_OCORES_H__ +#define __WB_I2C_OCORES_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define I2C_OCORES_DEV_NAME_MAX_LEN (64) + +typedef struct i2c_ocores_device_s { + uint32_t big_endian; + char dev_name[I2C_OCORES_DEV_NAME_MAX_LEN]; + int adap_nr; + uint32_t dev_base; + uint32_t reg_shift; + uint32_t reg_io_width; + uint32_t ip_clock_khz; + uint32_t bus_clock_khz; + uint32_t reg_access_mode; + + uint32_t irq_type; + uint32_t irq_offset; + uint32_t pci_domain; + uint32_t pci_bus; + uint32_t pci_slot; + uint32_t pci_fn; + int device_flag; +} i2c_ocores_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c new file mode 100644 index 000000000000..4a4bbba0ade5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c @@ -0,0 +1,571 @@ +/* + * wb_io_dev.c + * ko to read/write ioports through /dev/XXX device + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_io_dev.h" + +#define PROXY_NAME "wb-io-dev" +#define MAX_IO_DEV_NUM (256) +#define IO_RDWR_MAX_LEN (256) +#define MAX_NAME_SIZE (20) +#define IO_INDIRECT_ADDR_H(addr) ((addr >> 8) & 0xff) +#define IO_INDIRECT_ADDR_L(addr) ((addr) & 0xff) +#define IO_INDIRECT_OP_WRITE (0x2) +#define IO_INDIRECT_OP_READ (0X3) + +static int g_io_dev_debug = 0; +static int g_io_dev_error = 0; + +module_param(g_io_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_io_dev_error, int, S_IRUGO | S_IWUSR); + +#define IO_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_io_dev_debug) { \ + printk(KERN_INFO "[IO_DEV][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define IO_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_io_dev_error) { \ + printk(KERN_ERR "[IO_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct wb_io_dev_s { + const char *name; + uint32_t io_base; + uint32_t io_len; + uint32_t indirect_addr; + uint32_t wr_data; + uint32_t addr_low; + uint32_t addr_high; + uint32_t rd_data; + uint32_t opt_ctl; + spinlock_t io_dev_lock; + struct miscdevice misc; +} wb_io_dev_t; + +static wb_io_dev_t* io_dev_arry[MAX_IO_DEV_NUM]; + +static int io_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + wb_io_dev_t *wb_io_dev; + + if (minor >= MAX_IO_DEV_NUM) { + IO_DEV_DEBUG_ERROR("minor out of range, minor = %d.\n", minor); + return -ENODEV; + } + + wb_io_dev = io_dev_arry[minor]; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, open failed, minor = %d\n", minor); + return -ENODEV; + } + + file->private_data = wb_io_dev; + return 0; +} + +static int io_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +uint8_t io_indirect_addressing_read(wb_io_dev_t *wb_io_dev, uint32_t address) +{ + uint8_t addr_l, addr_h, value; + unsigned long flags; + + addr_h = IO_INDIRECT_ADDR_H(address); + addr_l = IO_INDIRECT_ADDR_L(address); + IO_DEV_DEBUG_VERBOSE("read one count, addr = 0x%x\n", address); + + spin_lock_irqsave(&wb_io_dev->io_dev_lock, flags); + + outb(addr_l, wb_io_dev->io_base + wb_io_dev->addr_low); + + outb(addr_h, wb_io_dev->io_base + wb_io_dev->addr_high); + + outb(IO_INDIRECT_OP_READ, wb_io_dev->io_base + wb_io_dev->opt_ctl); + + value = inb(wb_io_dev->io_base + wb_io_dev->rd_data); + + spin_unlock_irqrestore(&wb_io_dev->io_dev_lock, flags); + + return value; +} + +static int io_dev_read_tmp(wb_io_dev_t *wb_io_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i; + + if (offset > wb_io_dev->io_len) { + IO_DEV_DEBUG_VERBOSE("offset:0x%x, io len:0x%x, EOF.\n", offset, wb_io_dev->io_len); + return 0; + } + + if (count > wb_io_dev->io_len - offset) { + IO_DEV_DEBUG_VERBOSE("read count out of range. input len:%lu, read len:%u.\n", + count, wb_io_dev->io_len - offset); + count = wb_io_dev->io_len - offset; + } + if (wb_io_dev->indirect_addr) { + for (i = 0; i < count; i++) { + buf[i] = io_indirect_addressing_read(wb_io_dev, offset + i); + } + } else { + for (i = 0; i < count; i++) { + buf[i] = inb(wb_io_dev->io_base + offset + i); + } + } + + return count; +} + +static ssize_t io_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + wb_io_dev_t *wb_io_dev; + int ret, read_len; + u8 buf_tmp[IO_RDWR_MAX_LEN]; + + wb_io_dev = file->private_data; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, read failed.\n"); + return -EINVAL; + } + + if (count == 0) { + IO_DEV_DEBUG_ERROR("Invalid params, read count is 0.n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + IO_DEV_DEBUG_VERBOSE("read conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + read_len = io_dev_read_tmp(wb_io_dev, *offset, buf_tmp, count); + if (read_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_read_tmp failed, ret:%d.\n", read_len); + return read_len; + } + + if (access_ok(buf, read_len)) { + IO_DEV_DEBUG_VERBOSE("user space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + if (copy_to_user(buf, buf_tmp, read_len)) { + IO_DEV_DEBUG_ERROR("copy_to_user failed.\n"); + return -EFAULT; + } + } else { + IO_DEV_DEBUG_VERBOSE("kernel space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + memcpy(buf, buf_tmp, read_len); + } + *offset += read_len; + ret = read_len; + return ret; +} + +static ssize_t io_dev_read_iter(struct kiocb *iocb, struct iov_iter *to) +{ + int ret; + + IO_DEV_DEBUG_VERBOSE("io_dev_read_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, to->count, iocb->ki_pos); + ret = io_dev_read(iocb->ki_filp, to->kvec->iov_base, to->count, &iocb->ki_pos); + return ret; +} + +void io_indirect_addressing_write(wb_io_dev_t *wb_io_dev, uint32_t address, uint8_t reg_val) +{ + uint8_t addr_l, addr_h; + unsigned long flags; + + addr_h = IO_INDIRECT_ADDR_H(address); + addr_l = IO_INDIRECT_ADDR_L(address); + IO_DEV_DEBUG_VERBOSE("write one count, addr = 0x%x\n", address); + + spin_lock_irqsave(&wb_io_dev->io_dev_lock, flags); + + outb(reg_val, wb_io_dev->io_base + wb_io_dev->wr_data); + + outb(addr_l, wb_io_dev->io_base + wb_io_dev->addr_low); + + outb(addr_h, wb_io_dev->io_base + wb_io_dev->addr_high); + + outb(IO_INDIRECT_OP_WRITE, wb_io_dev->io_base + wb_io_dev->opt_ctl); + + spin_unlock_irqrestore(&wb_io_dev->io_dev_lock, flags); + + return; +} + +static int io_dev_write_tmp(wb_io_dev_t *wb_io_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i; + + if (offset > wb_io_dev->io_len) { + IO_DEV_DEBUG_VERBOSE("offset:0x%x, io len:0x%x, EOF.\n", offset, wb_io_dev->io_len); + return 0; + } + + if (count > wb_io_dev->io_len - offset) { + IO_DEV_DEBUG_VERBOSE("write count out of range. input len:%lu, write len:%u.\n", + count, wb_io_dev->io_len - offset); + count = wb_io_dev->io_len - offset; + } + if (wb_io_dev->indirect_addr) { + for (i = 0; i < count; i++) { + io_indirect_addressing_write(wb_io_dev, offset + i, buf[i]); + } + } else { + for (i = 0; i < count; i++) { + outb(buf[i], wb_io_dev->io_base + offset + i); + } + } + + return count; +} + +static ssize_t io_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +{ + wb_io_dev_t *wb_io_dev; + int write_len; + u8 buf_tmp[IO_RDWR_MAX_LEN]; + + wb_io_dev = file->private_data; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, write failed.\n"); + return -EINVAL; + } + + if (count == 0) { + IO_DEV_DEBUG_ERROR("Invalid params, write count is 0.\n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + IO_DEV_DEBUG_VERBOSE("write conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + if (access_ok(buf, count)) { + IO_DEV_DEBUG_VERBOSE("user space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + if (copy_from_user(buf_tmp, buf, count)) { + IO_DEV_DEBUG_ERROR("copy_from_user failed.\n"); + return -EFAULT; + } + } else { + IO_DEV_DEBUG_VERBOSE("kernel space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + memcpy(buf_tmp, buf, count); + } + + write_len = io_dev_write_tmp(wb_io_dev, *offset, buf_tmp, count); + if (write_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_write_tmp failed, ret:%d.\n", write_len); + return write_len; + } + + *offset += write_len; + return write_len; +} + +static ssize_t io_dev_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + int ret; + + IO_DEV_DEBUG_VERBOSE("io_dev_write_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, from->count, iocb->ki_pos); + ret = io_dev_write(iocb->ki_filp, from->kvec->iov_base, from->count, &iocb->ki_pos); + return ret; +} + +static loff_t io_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + wb_io_dev_t *wb_io_dev; + + wb_io_dev = file->private_data; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, llseek failed.\n"); + return -EINVAL; + } + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + IO_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + if (offset > wb_io_dev->io_len) { + IO_DEV_DEBUG_ERROR("SEEK_SET out of range, offset:%lld, io_len:0x%x.\n", + offset, wb_io_dev->io_len); + ret = - EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (((file->f_pos + offset) > wb_io_dev->io_len) || ((file->f_pos + offset) < 0)) { + IO_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld, io_len:0x%x.\n", + file->f_pos, offset, wb_io_dev->io_len); + ret = - EINVAL; + break; + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + IO_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static long io_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static const struct file_operations io_dev_fops = { + .owner = THIS_MODULE, + .llseek = io_dev_llseek, + .read_iter = io_dev_read_iter, + .write_iter = io_dev_write_iter, + .unlocked_ioctl = io_dev_ioctl, + .open = io_dev_open, + .release = io_dev_release, +}; + +static wb_io_dev_t *dev_match(const char *path) +{ + wb_io_dev_t *wb_io_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + + for (i = 0; i < MAX_IO_DEV_NUM; i++) { + if (io_dev_arry[i] == NULL) { + continue; + } + wb_io_dev = io_dev_arry[i]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", wb_io_dev->name); + if (!strcmp(path, dev_name)) { + IO_DEV_DEBUG_VERBOSE("get dev_name = %s, minor = %d\n", dev_name, i); + return wb_io_dev; + } + } + + return NULL; +} + +int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_io_dev_t *wb_io_dev; + int read_len; + + if (path == NULL) { + IO_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + IO_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_io_dev = dev_match(path); + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("io_dev match failed. dev path = %s", path); + return -EINVAL; + } + + read_len = io_dev_read_tmp(wb_io_dev, offset, buf, count); + if (read_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_read_tmp failed, ret:%d.\n", read_len); + } + return read_len; +} +EXPORT_SYMBOL(io_device_func_read); + +int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_io_dev_t *wb_io_dev; + int write_len; + + if (path == NULL) { + IO_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + IO_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_io_dev = dev_match(path); + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + write_len = io_dev_write_tmp(wb_io_dev, offset, buf, count); + if (write_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_write_tmp failed, ret:%d.\n", write_len); + } + return write_len; +} +EXPORT_SYMBOL(io_device_func_write); + +static int io_dev_probe(struct platform_device *pdev) +{ + int ret; + wb_io_dev_t *wb_io_dev; + struct miscdevice *misc; + io_dev_device_t *io_dev_device; + + wb_io_dev = devm_kzalloc(&pdev->dev, sizeof(wb_io_dev_t), GFP_KERNEL); + if (!wb_io_dev) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + return ret; + } + spin_lock_init(&wb_io_dev->io_dev_lock); + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "io_dev_name", &wb_io_dev->name); + ret += of_property_read_u32(pdev->dev.of_node, "io_base", &wb_io_dev->io_base); + ret += of_property_read_u32(pdev->dev.of_node, "io_len", &wb_io_dev->io_len); + if (of_property_read_bool(pdev->dev.of_node, "indirect_addr")) { + + wb_io_dev->indirect_addr = 1; + ret += of_property_read_u32(pdev->dev.of_node, "wr_data", &wb_io_dev->wr_data); + ret += of_property_read_u32(pdev->dev.of_node, "addr_low", &wb_io_dev->addr_low); + ret += of_property_read_u32(pdev->dev.of_node, "addr_high", &wb_io_dev->addr_high); + ret += of_property_read_u32(pdev->dev.of_node, "rd_data", &wb_io_dev->rd_data); + ret += of_property_read_u32(pdev->dev.of_node, "opt_ctl", &wb_io_dev->opt_ctl); + } else { + + wb_io_dev->indirect_addr = 0; + } + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get dts config, ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + io_dev_device = pdev->dev.platform_data; + wb_io_dev->name = io_dev_device->io_dev_name; + wb_io_dev->io_base = io_dev_device->io_base; + wb_io_dev->io_len = io_dev_device->io_len; + wb_io_dev->indirect_addr = io_dev_device->indirect_addr; + if (wb_io_dev->indirect_addr == 1) { + wb_io_dev->wr_data = io_dev_device->wr_data; + wb_io_dev->addr_low = io_dev_device->addr_low; + wb_io_dev->addr_high = io_dev_device->addr_high; + wb_io_dev->rd_data = io_dev_device->rd_data; + wb_io_dev->opt_ctl = io_dev_device->opt_ctl; + } + } + + IO_DEV_DEBUG_VERBOSE("name:%s, io base:0x%x, io len:0x%x, addressing type:%s.\n", + wb_io_dev->name, wb_io_dev->io_base, wb_io_dev->io_len, + wb_io_dev->indirect_addr ? "indirect" : "direct"); + + misc = &wb_io_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = wb_io_dev->name; + misc->fops = &io_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&pdev->dev, "Failed to register %s device.\n", misc->name); + return -ENXIO; + } + if (misc->minor >= MAX_IO_DEV_NUM) { + dev_err(&pdev->dev, "Error: device minor[%d] more than max io device num[%d].\n", + misc->minor, MAX_IO_DEV_NUM); + misc_deregister(misc); + return -EINVAL; + } + io_dev_arry[misc->minor] = wb_io_dev; + dev_info(&pdev->dev, "register %s device [0x%x][0x%x] with minor %d using %s addressing success.\n", + misc->name, wb_io_dev->io_base, wb_io_dev->io_len, misc->minor, + wb_io_dev->indirect_addr ? "indirect" : "direct"); + + return 0; +} + +static int io_dev_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < MAX_IO_DEV_NUM ; i++) { + if (io_dev_arry[i] != NULL) { + misc_deregister(&io_dev_arry[i]->misc); + io_dev_arry[i] = NULL; + } + } + + return 0; +} + +static struct of_device_id io_dev_match[] = { + { + .compatible = "wb-io-dev", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, io_dev_match); + +static struct platform_driver wb_io_dev_driver = { + .probe = io_dev_probe, + .remove = io_dev_remove, + .driver = { + .owner = THIS_MODULE, + .name = PROXY_NAME, + .of_match_table = io_dev_match, + }, +}; + +static int __init wb_io_dev_init(void) +{ + return platform_driver_register(&wb_io_dev_driver); +} + +static void __exit wb_io_dev_exit(void) +{ + platform_driver_unregister(&wb_io_dev_driver); +} + +module_init(wb_io_dev_init); +module_exit(wb_io_dev_exit); +MODULE_DESCRIPTION("IO device driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h new file mode 100644 index 000000000000..3a1a10f0f20c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h @@ -0,0 +1,21 @@ +#ifndef __WB_IO_DEV_H__ +#define __WB_IO_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define IO_DEV_NAME_MAX_LEN (64) + +typedef struct io_dev_device_s { + char io_dev_name[IO_DEV_NAME_MAX_LEN]; + uint32_t io_base; + uint32_t io_len; + uint32_t indirect_addr; + uint32_t wr_data; + uint32_t addr_low; + uint32_t addr_high; + uint32_t rd_data; + uint32_t opt_ctl; + int device_flag; +} io_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c new file mode 100644 index 000000000000..c079dc409696 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c @@ -0,0 +1,166 @@ +/* + * wb_lpc_drv.c + * ko to set lpc pcie config io addr and enable lpc + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_lpc_drv.h" + +#define LPC_DRIVER_NAME "wb-lpc" +#define LPC_MAKE_PCI_IO_RANGE(__base) ((0xfc0001) | ((__base) & (0xFFFC))) + +int g_lpc_dev_debug = 0; +int g_lpc_dev_error = 0; + +module_param(g_lpc_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_lpc_dev_error, int, S_IRUGO | S_IWUSR); + +#define LPC_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_lpc_dev_debug) { \ + printk(KERN_INFO "[LPC_DEV][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define LPC_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_lpc_dev_error) { \ + printk(KERN_ERR "[LPC_DEV][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct wb_lpc_dev_s { + const char *lpc_io_name; + uint32_t domain; + uint32_t bus; + uint32_t slot; + uint32_t fn; + uint32_t lpc_io_base; + uint32_t lpc_io_size; + uint32_t lpc_gen_dec; +} wb_lpc_dev_t; + +static int wb_lpc_probe(struct platform_device *pdev) +{ + int ret, devfn; + wb_lpc_dev_t *wb_lpc_dev; + struct pci_dev *pci_dev; + lpc_drv_device_t *lpc_drv_device; + + wb_lpc_dev = devm_kzalloc(&pdev->dev, sizeof(wb_lpc_dev_t), GFP_KERNEL); + if (!wb_lpc_dev) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + return ret; + } + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "lpc_io_name", &wb_lpc_dev->lpc_io_name); + ret += of_property_read_u32(pdev->dev.of_node, "pci_domain", &wb_lpc_dev->domain); + ret += of_property_read_u32(pdev->dev.of_node, "pci_bus", &wb_lpc_dev->bus); + ret += of_property_read_u32(pdev->dev.of_node, "pci_slot", &wb_lpc_dev->slot); + ret += of_property_read_u32(pdev->dev.of_node, "pci_fn", &wb_lpc_dev->fn); + ret += of_property_read_u32(pdev->dev.of_node, "lpc_io_base", &wb_lpc_dev->lpc_io_base); + ret += of_property_read_u32(pdev->dev.of_node, "lpc_io_size", &wb_lpc_dev->lpc_io_size); + ret += of_property_read_u32(pdev->dev.of_node, "lpc_gen_dec", &wb_lpc_dev->lpc_gen_dec); + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get dts config, ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + lpc_drv_device = pdev->dev.platform_data; + wb_lpc_dev->lpc_io_name = lpc_drv_device->lpc_io_name; + wb_lpc_dev->domain = lpc_drv_device->pci_domain; + wb_lpc_dev->bus = lpc_drv_device->pci_bus; + wb_lpc_dev->slot = lpc_drv_device->pci_slot; + wb_lpc_dev->fn = lpc_drv_device->pci_fn; + wb_lpc_dev->lpc_io_base = lpc_drv_device->lpc_io_base; + wb_lpc_dev->lpc_io_size = lpc_drv_device->lpc_io_size; + wb_lpc_dev->lpc_gen_dec = lpc_drv_device->lpc_gen_dec; + } + + LPC_DEV_DEBUG_VERBOSE("domain:0x%04x, bus:0x%02x, slot:0x%02x, fn:%u\n", + wb_lpc_dev->domain,wb_lpc_dev->bus, wb_lpc_dev->slot, wb_lpc_dev->fn); + LPC_DEV_DEBUG_VERBOSE("lpc_io_name:%s, lpc_io_base:0x%x, lpc_io_size:%u, lpc_gen_dec:0x%x.\n", + wb_lpc_dev->lpc_io_name, wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size, wb_lpc_dev->lpc_gen_dec); + + devfn = PCI_DEVFN(wb_lpc_dev->slot, wb_lpc_dev->fn); + pci_dev = pci_get_domain_bus_and_slot(wb_lpc_dev->domain, wb_lpc_dev->bus, devfn); + if (pci_dev == NULL) { + dev_err(&pdev->dev, "Failed to find pci_dev, domain:0x%04x, bus:0x%02x, devfn:0x%x\n", + wb_lpc_dev->domain, wb_lpc_dev->bus, devfn); + return -ENXIO; + } + + pci_write_config_dword(pci_dev, wb_lpc_dev->lpc_gen_dec, LPC_MAKE_PCI_IO_RANGE(wb_lpc_dev->lpc_io_base)); + if (!request_region(wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size, wb_lpc_dev->lpc_io_name)) { + dev_err(&pdev->dev, "Failed to request_region [0x%x][0x%x].\n", wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size); + return -EBUSY; + } + + platform_set_drvdata(pdev, wb_lpc_dev); + + dev_info(&pdev->dev, "lpc request_region [0x%x][0x%x] success.\n", wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size); + + return 0; +} + +static int wb_lpc_remove(struct platform_device *pdev) +{ + wb_lpc_dev_t *wb_lpc_dev; + + wb_lpc_dev = platform_get_drvdata(pdev); + if (wb_lpc_dev) { + release_region(wb_lpc_dev->lpc_io_base , wb_lpc_dev->lpc_io_size); + LPC_DEV_DEBUG_VERBOSE("lpc base:0x%x, len:0x%x.\n", wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size); + } + LPC_DEV_DEBUG_VERBOSE("lpc remove.\n"); + + return 0; +} + +static struct of_device_id lpc_dev_match[] = { + { + .compatible = "wb-lpc", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, lpc_dev_match); + +static struct platform_driver wb_lpc_driver = { + .probe = wb_lpc_probe, + .remove = wb_lpc_remove, + .driver = { + .owner = THIS_MODULE, + .name = LPC_DRIVER_NAME, + .of_match_table = lpc_dev_match, + }, +}; + +static int __init wb_lpc_init(void) +{ + return platform_driver_register(&wb_lpc_driver); +} + +static void __exit wb_lpc_exit(void) +{ + platform_driver_unregister(&wb_lpc_driver); +} + +module_init(wb_lpc_init); +module_exit(wb_lpc_exit); +MODULE_DESCRIPTION("lpc driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h new file mode 100644 index 000000000000..76e8c32c12e9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h @@ -0,0 +1,18 @@ +#ifndef __WB_LPC_DRV_H__ +#define __WB_LPC_DRV_H__ + +#define LPC_IO_NAME_MAX_LEN (64) + +typedef struct lpc_drv_device_s { + char lpc_io_name[LPC_IO_NAME_MAX_LEN]; + int pci_domain; + int pci_bus; + int pci_slot; + int pci_fn; + int lpc_io_base; + int lpc_io_size; + int lpc_gen_dec; + int device_flag; +} lpc_drv_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c new file mode 100644 index 000000000000..1e84e65d7b11 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c @@ -0,0 +1,660 @@ +/* + * wb_mac_th3.c - A driver for control wb_mac_th3 base on wb_mac.c + * + * Copyright (c) 1998, 1999 Frodo Looijaard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define MAC_TEMP_INVALID (99999999) + +#define MAC_SIZE (256) +#define MAC_TEMP_NUM (16) + +#define MAC_ID_REG (0x02000000) + +typedef enum { + DBG_START, + DBG_VERBOSE, + DBG_KEY, + DBG_WARN, + DBG_ERROR, + DBG_END, +} dbg_level_t; + +typedef enum{ + MAC_TYPE_START, + TD4_X9 = 0xb780, + TD4_X9_8 = 0xb788, + TH3 = 0xb980, + TD3 = 0xb870, + TD4 = 0xb880, + TH4 = 0xb990, + MAC_TYPE_END, +} mac_type; + +typedef struct sensor_regs_s { + int id; + u32 reg; +} sensor_reg_t; + +typedef struct mac_temp_regs_s { + int mac_type; + sensor_reg_t sensor_reg[MAC_TEMP_NUM]; +} mac_temp_reg_t; + +typedef enum { + MAC_TEMP_START, + MAC_TEMP_INDEX1, + MAC_TEMP_INDEX2, + MAC_TEMP_INDEX3, + MAC_TEMP_INDEX4, + MAC_TEMP_INDEX5, + MAC_TEMP_INDEX6, + MAC_TEMP_INDEX7, + MAC_TEMP_INDEX8, + MAC_TEMP_INDEX9, + MAC_TEMP_INDEX10, + MAC_TEMP_INDEX11, + MAC_TEMP_INDEX12, + MAC_TEMP_INDEX13, + MAC_TEMP_INDEX14, + MAC_TEMP_INDEX15, + MAC_TEMP_END, +} mac_hwmon_index; + +static mac_temp_reg_t mac_temp_reg[] = { + { + /* TD3 */ + .mac_type = TD3, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02004700}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02004800}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02004900}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02004a00}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02004b00}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02004c00}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02004d00}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02004e00}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02005200}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02005100}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02005000}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02004f00}, + }, + }, + { + /* TD4 */ + .mac_type = TD4, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02004900}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02004b00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02004d00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02004f00}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02005100}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02005300}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02005500}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02005700}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02005900}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02005b00}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02005d00}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02005f00}, + {.id = MAC_TEMP_INDEX13, .reg = 0x02006100}, + {.id = MAC_TEMP_INDEX14, .reg = 0x02006300}, + {.id = MAC_TEMP_INDEX15, .reg = 0x02006500}, + }, + }, + { + /* TD4_X9 */ + .mac_type = TD4_X9, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02005a00}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02005c00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02005e00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02006000}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02006200}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02006400}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02006600}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02006800}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02006a00}, + }, + }, + { + /* TD4_X9_8 */ + .mac_type = TD4_X9_8, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02005a00}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02005c00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02005e00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02006000}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02006200}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02006400}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02006600}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02006800}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02006a00}, + }, + }, + { + /* TH3 */ + .mac_type = TH3, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02004a00}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02004b00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02004c00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02004d00}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02004e00}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02004f00}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02005000}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02005100}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02005200}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02005300}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02005400}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02005500}, + {.id = MAC_TEMP_INDEX13, .reg = 0x02005600}, + {.id = MAC_TEMP_INDEX14, .reg = 0x02005700}, + {.id = MAC_TEMP_INDEX15, .reg = 0x02005800}, + }, + }, + { + /* TH4 */ + .mac_type = TH4, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x0201d800}, + {.id = MAC_TEMP_INDEX2, .reg = 0x0201e000}, + {.id = MAC_TEMP_INDEX3, .reg = 0x0201e800}, + {.id = MAC_TEMP_INDEX4, .reg = 0x0201f000}, + {.id = MAC_TEMP_INDEX5, .reg = 0x0201f800}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02020000}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02020800}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02021000}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02021800}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02022000}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02022800}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02023000}, + {.id = MAC_TEMP_INDEX13, .reg = 0x02023800}, + {.id = MAC_TEMP_INDEX14, .reg = 0x02024000}, + {.id = MAC_TEMP_INDEX15, .reg = 0x02024800}, + }, + }, +}; + +static int debuglevel = 0; +module_param(debuglevel, int, S_IRUGO | S_IWUSR); + +static int mac_pcie_id = MAC_TYPE_START; +module_param(mac_pcie_id, int, S_IRUGO | S_IWUSR); + +#define DBG_DEBUG(fmt, arg...) do { \ + if ( debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ + printk(KERN_INFO "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else if ( debuglevel >= DBG_ERROR ) { \ + printk(KERN_ERR "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else { } \ +} while (0) + +#define DBG_ERROR(fmt, arg...) do { \ + if ( debuglevel > DBG_START) { \ + printk(KERN_ERR "[ERROR]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } \ + } while (0) + +struct mac_data { + struct i2c_client *client; + struct device *hwmon_dev; + struct mutex update_lock; + u8 data[MAC_SIZE]; /* Register value */ +}; + +static int wb_i2c_read_one_time(struct i2c_client *client, u8 *recv_buf, int size) +{ + struct i2c_msg msgs[2]; + int ret = 0; + + if ((client == NULL) || (recv_buf == NULL)) { + DBG_DEBUG("i2c_client || recv_buf = NULL\r\n"); + return -1; + } + + mem_clear(msgs, sizeof(msgs)); + + msgs[0].buf = recv_buf; + msgs[0].len = size; + msgs[0].addr = client->addr; + msgs[0].flags |= I2C_M_RD; + + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + return ret; + } + DBG_DEBUG("i2c_transfer, dev_addr 0x%x, size %d.\n", client->addr, size); + + return 0; +} + +static int wb_i2c_write_one_time(struct i2c_client *client, u8 *write_buf, int size) +{ + struct i2c_msg msgs[2]; + int ret = 0; + + if ((client == NULL) || (write_buf == NULL)) { + DBG_DEBUG("i2c_client || write_buf = NULL\r\n"); + return -1; + } + + if ((size <= 0)) { + DBG_DEBUG("size invalid, size %d\n", size); + return -1; + } + + mem_clear(msgs, sizeof(msgs)); + + msgs[0].len = size; + msgs[0].buf = write_buf; + msgs[0].addr = client->addr; + + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + return ret; + } + DBG_DEBUG("i2c_transfer, dev_addr 0x%x, size %d\n", client->addr, size); + + return 0; +} + +static u8 step2_buf1[8] = {0x03, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00}; +static u8 step2_buf2[8] = {0x03, 0x21, 0x04, 0x0c, 0x2c, 0x38, 0x02, 0x00}; +static u8 step2_buf3[8] = {0x03, 0x21, 0x04, 0x10, 0x02, 0x00, 0x4a, 0x00}; +static u8 step2_buf4[8] = {0x03, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01}; +static u8 step2_buf5[4] = {0x03, 0x21, 0x04, 0x08}; +static u8 step2_buf6[4] = {0x03, 0x21, 0x04, 0x10}; + +static int getmac_register(struct i2c_client *client, u32 index, int *reg_value) +{ + int i; + int ret = 0; + int value = 0; + unsigned char read_buf[8]; + + if (index == 0) { + DBG_ERROR("invalid index\n"); + return -1; + } + + step2_buf3[7] = index & 0xff; + step2_buf3[6] = (index >> 8) & 0xff; + step2_buf3[5] = (index >> 16) & 0xff; + step2_buf3[4] = (index >> 24) & 0xff; + + ret = wb_i2c_write_one_time(client, step2_buf1, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf1 failed, ret = %d\n", ret); + } + ret = wb_i2c_write_one_time(client, step2_buf2, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf2 failed, ret = %d\n", ret); + } + ret = wb_i2c_write_one_time(client, step2_buf3, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf3 failed, ret = %d\n", ret); + } + ret = wb_i2c_write_one_time(client, step2_buf4, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf4 failed, ret = %d\n", ret); + } + + ret = wb_i2c_write_one_time(client, step2_buf5, 4); + if (ret < 0) { + DBG_ERROR("write step2_buf5 failed, ret = %d\n", ret); + } + ret = wb_i2c_read_one_time(client, read_buf, 4); + if (ret < 0) { + DBG_ERROR("read failed, ret = %d\n", ret); + } + for (i = 0; i < 4; i++) { + DBG_DEBUG("read_buf[%d] = 0x%x \n", i, read_buf[i]); + } + + ret = wb_i2c_write_one_time(client, step2_buf6, 4); + if (ret < 0) { + DBG_ERROR("write step2_buf6 failed, ret = %d\n", ret); + } + + ret = wb_i2c_read_one_time(client, read_buf, 4); + if (ret < 0) { + DBG_ERROR("read failed, ret = %d\n", ret); + return ret; + } + + value = (read_buf[0] << 24)| (read_buf[1] << 16) | (read_buf[2] << 8) | read_buf[3]; + *reg_value = value; + + return ret; +} + +static int mac_calcute(u32 reg, int *temp) +{ + int ret = 0; + u32 tmp = 0; + + switch(mac_pcie_id) { + case TD3: + case TH3: + tmp = reg & 0x3ff; + *temp = 434100 - (tmp * 535); + break; + case TD4: + case TH4: + case TD4_X9: + case TD4_X9_8: + tmp = reg & 0x7ff; + *temp = (356070 - (tmp * 237)); + break; + default: + ret = -1; + DBG_ERROR("read failed, ret = %d\n", ret); + break; + } + + if ((*temp / 1000 < -70) || (*temp / 1000 > 200)) { + ret = -1; + DBG_ERROR("mac temp invalid, temp = %d\n", *temp ); + } + + return ret; +} + +static int find_reg_type(int type, int *type_index) +{ + int i; + int size; + + size = ARRAY_SIZE(mac_temp_reg); + for (i = 0; i < size; i++) { + if (mac_temp_reg[i].mac_type == type) { + *type_index = i; + return 0; + } + } + + return -1; +} + +static sensor_reg_t * find_reg_offset(int type, int index) +{ + int i; + int type_index; + int ret; + + ret = find_reg_type(type, &type_index); + if (ret < 0) { + DBG_ERROR("find_reg_type failed, ret = %d\n", ret); + return NULL; + } + + for (i = 0; i < MAC_TEMP_NUM; i++) { + if (mac_temp_reg[type_index].sensor_reg[i].id == index) { + return &(mac_temp_reg[type_index].sensor_reg[i]); + } + } + + return NULL; +} + +static int get_mactemp(struct i2c_client *client, int index, int *temp) +{ + int ret; + int reg_value; + + if (index == 0) { + DBG_ERROR("invalid index\n"); + return -1; + } + + ret = getmac_register(client, index, ®_value); + if (ret < 0) { + DBG_ERROR("getmac_register failed, ret = %d\n", ret); + return ret; + } + DBG_DEBUG("reg_value = 0x%x \n", reg_value); + + ret = mac_calcute(reg_value, temp); + if (ret < 0) { + DBG_ERROR("mac_calcute failed, ret = %d\n", ret); + return ret; + } + + return 0; +} + +static ssize_t show_mac_temp(struct device *dev, struct device_attribute *da, char *buf) +{ + struct mac_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + u32 index_value = to_sensor_dev_attr_2(da)->index; + sensor_reg_t *t; + int result = 0; + int temp = -MAC_TEMP_INVALID; + + mutex_lock(&data->update_lock); + t = find_reg_offset(mac_pcie_id, index_value); + if (t == NULL) { + temp = -MAC_TEMP_INVALID; + DBG_ERROR("find_reg_offset failed, mac_pcie_id = %d, index_value = %d\n", mac_pcie_id, index_value); + } else { + result = get_mactemp(client, t->reg, &temp); + if (result < 0) { + temp = -MAC_TEMP_INVALID; + DBG_ERROR("get_mactemp failed, ret = %d\n", result); + } + } + + mutex_unlock(&data->update_lock); + return snprintf(buf, MAC_SIZE, "%d\n", temp); +} + +static ssize_t show_mac_max_temp(struct device *dev, struct device_attribute *da, char *buf) +{ + struct mac_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + int i; + int result; + int temp = -MAC_TEMP_INVALID; + int type_index; + int tmp; + + mutex_lock(&data->update_lock); + + result = find_reg_type(mac_pcie_id, &type_index); + if (result < 0) { + DBG_ERROR("find_reg_type failed, ret = %d\n", result); + goto exit; + } + + for (i = 0; i < MAC_TEMP_NUM; i++) { + result = get_mactemp(client, mac_temp_reg[type_index].sensor_reg[i].reg, &tmp); + if (result < 0) { + DBG_ERROR("get_mactemp failed, ret = %d\n", result); + tmp = -MAC_TEMP_INVALID; + } + + temp = (temp > tmp) ? temp : tmp; + } + +exit: + mutex_unlock(&data->update_lock); + return snprintf(buf, MAC_SIZE, "%d\n", temp); +} + +static int mac_bsc_init(struct i2c_client *client) +{ + int ret; + int reg_value; + int mac_id = 0; + + ret = getmac_register(client, MAC_ID_REG, ®_value); + if (ret < 0) { + DBG_ERROR("getmac_register failed, ret = %d\n", ret); + return ret; + } + + DBG_DEBUG("reg_value = 0x%x \n", reg_value); + mac_id = reg_value & 0xffff; + return mac_id; +} + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX1); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX2); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX3); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX4); +static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX5); +static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX6); +static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX7); +static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX8); +static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX9); +static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX10); +static SENSOR_DEVICE_ATTR(temp11_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX11); +static SENSOR_DEVICE_ATTR(temp12_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX12); +static SENSOR_DEVICE_ATTR(temp13_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX13); +static SENSOR_DEVICE_ATTR(temp14_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX14); +static SENSOR_DEVICE_ATTR(temp15_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX15); +static SENSOR_DEVICE_ATTR(temp99_input, S_IRUGO, show_mac_max_temp, NULL, 0); + +static struct attribute *mac_hwmon_attrs[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp4_input.dev_attr.attr, + &sensor_dev_attr_temp5_input.dev_attr.attr, + &sensor_dev_attr_temp6_input.dev_attr.attr, + &sensor_dev_attr_temp7_input.dev_attr.attr, + &sensor_dev_attr_temp8_input.dev_attr.attr, + &sensor_dev_attr_temp9_input.dev_attr.attr, + &sensor_dev_attr_temp10_input.dev_attr.attr, + &sensor_dev_attr_temp11_input.dev_attr.attr, + &sensor_dev_attr_temp12_input.dev_attr.attr, + &sensor_dev_attr_temp13_input.dev_attr.attr, + &sensor_dev_attr_temp14_input.dev_attr.attr, + &sensor_dev_attr_temp15_input.dev_attr.attr, + &sensor_dev_attr_temp99_input.dev_attr.attr, + NULL +}; +ATTRIBUTE_GROUPS(mac_hwmon); + +static int init_bcs_command(int mac_type) { + int ret; + + ret = 0; + switch (mac_type) { + case TD3: + step2_buf2[5] = 0x38; + break; + case TH3: + case TH4: + case TD4: + case TD4_X9: + case TD4_X9_8: + step2_buf2[5] = 0x40; + break; + default: + ret = -1; + break; + } + return ret; +} + +static int mac_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct mac_data *data; + int mac_type; + int ret; + + mac_type = id->driver_data; + mac_pcie_id = mac_type; + if (init_bcs_command(mac_type) < 0) { + DBG_ERROR("mactype[%x] not support \n", mac_type); + return -1; + }; + + if (mac_type == TD4) { + ret = mac_bsc_init(client); + if (ret < 0) { + DBG_ERROR("mac_bsc_init failed, ret = %d\n", ret); + return -1; + } + mac_type = ret; + mac_pcie_id = mac_type; + } + + DBG_DEBUG("=========mac_probe(%x)===========\n",client->addr); + DBG_DEBUG("mac_type: %x\n", mac_type); + data = devm_kzalloc(&client->dev, sizeof(struct mac_data), GFP_KERNEL); + if (!data) { + return -ENOMEM; + } + + data->client = client; + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + data->hwmon_dev = hwmon_device_register_with_groups(&client->dev, client->name, data, mac_hwmon_groups); + if (IS_ERR(data->hwmon_dev)) { + return PTR_ERR(data->hwmon_dev); + } + + return 0; +} + +static int mac_remove(struct i2c_client *client) +{ + struct mac_data *data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + return 0; +} + +static const struct i2c_device_id mac_id[] = { + { "wb_mac_bsc_td3", TD3 }, + { "wb_mac_bsc_td4", TD4 }, + { "wb_mac_bsc_th3", TH3 }, + { "wb_mac_bsc_th4", TH4 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, mac_id); + +static struct i2c_driver wb_mac_bsc_driver = { + .driver = { + .name = "wb_mac_bsc", + }, + .probe = mac_probe, + .remove = mac_remove, + .id_table = mac_id, +}; + +module_i2c_driver(wb_mac_bsc_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("mac bsc driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c new file mode 100644 index 000000000000..c09162368ad0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c @@ -0,0 +1,1192 @@ +/* + * optoe.c - A driver to read and write the EEPROM on optical transceivers + * (SFP, QSFP and similar I2C based devices) + * + * Copyright (C) 2014 Cumulus networks Inc. + * Copyright (C) 2017 Finisar Corp. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Freeoftware Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* + * Description: + * a) Optical transceiver EEPROM read/write transactions are just like + * the at24 eeproms managed by the at24.c i2c driver + * b) The register/memory layout is up to 256 128 byte pages defined by + * a "pages valid" register and switched via a "page select" + * register as explained in below diagram. + * c) 256 bytes are mapped at a time. 'Lower page 00h' is the first 128 + * bytes of address space, and always references the same + * location, independent of the page select register. + * All mapped pages are mapped into the upper 128 bytes + * (offset 128-255) of the i2c address. + * d) Devices with one I2C address (eg QSFP) use I2C address 0x50 + * (A0h in the spec), and map all pages in the upper 128 bytes + * of that address. + * e) Devices with two I2C addresses (eg SFP) have 256 bytes of data + * at I2C address 0x50, and 256 bytes of data at I2C address + * 0x51 (A2h in the spec). Page selection and paged access + * only apply to this second I2C address (0x51). + * e) The address space is presented, by the driver, as a linear + * address space. For devices with one I2C client at address + * 0x50 (eg QSFP), offset 0-127 are in the lower + * half of address 50/A0h/client[0]. Offset 128-255 are in + * page 0, 256-383 are page 1, etc. More generally, offset + * 'n' resides in page (n/128)-1. ('page -1' is the lower + * half, offset 0-127). + * f) For devices with two I2C clients at address 0x50 and 0x51 (eg SFP), + * the address space places offset 0-127 in the lower + * half of 50/A0/client[0], offset 128-255 in the upper + * half. Offset 256-383 is in the lower half of 51/A2/client[1]. + * Offset 384-511 is in page 0, in the upper half of 51/A2/... + * Offset 512-639 is in page 1, in the upper half of 51/A2/... + * Offset 'n' is in page (n/128)-3 (for n > 383) + * + * One I2c addressed (eg QSFP) Memory Map + * + * 2-Wire Serial Address: 1010000x + * + * Lower Page 00h (128 bytes) + * ===================== + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * |Page Select Byte(127)| + * ===================== + * | + * | + * | + * | + * V + * ------------------------------------------------------------ + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * V V V V + * ------------ -------------- --------------- -------------- + * | | | | | | | | + * | Upper | | Upper | | Upper | | Upper | + * | Page 00h | | Page 01h | | Page 02h | | Page 03h | + * | | | (Optional) | | (Optional) | | (Optional | + * | | | | | | | for Cable | + * | | | | | | | Assemblies) | + * | ID | | AST | | User | | | + * | Fields | | Table | | EEPROM Data | | | + * | | | | | | | | + * | | | | | | | | + * | | | | | | | | + * ------------ -------------- --------------- -------------- + * + * The SFF 8436 (QSFP) spec only defines the 4 pages described above. + * In anticipation of future applications and devices, this driver + * supports access to the full architected range, 256 pages. + * + * The CMIS (Common Management Interface Specification) defines use of + * considerably more pages (at least to page 0xAF), which this driver + * supports. + * + * NOTE: This version of the driver ONLY SUPPORTS BANK 0 PAGES on CMIS + * devices. + * + **/ + +/* #define DEBUG 1 */ + +#undef EEPROM_CLASS +#ifdef CONFIG_EEPROM_CLASS +#define EEPROM_CLASS +#endif +#ifdef CONFIG_EEPROM_CLASS_MODULE +#define EEPROM_CLASS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#ifdef EEPROM_CLASS +#include +#endif + +#include + +/* The maximum length of a port name */ +#define MAX_PORT_NAME_LEN 20 + +struct optoe_platform_data { + u32 byte_len; /* size (sum of all addr) */ + u16 page_size; /* for writes */ + u8 flags; + void *dummy1; /* backward compatibility */ + void *dummy2; /* backward compatibility */ + +#ifdef EEPROM_CLASS + struct eeprom_platform_data *eeprom_data; +#endif + char port_name[MAX_PORT_NAME_LEN]; +}; + +/* fundamental unit of addressing for EEPROM */ +#define OPTOE_PAGE_SIZE 128 +/* + * Single address devices (eg QSFP) have 256 pages, plus the unpaged + * low 128 bytes. If the device does not support paging, it is + * only 2 'pages' long. + */ +#define OPTOE_ARCH_PAGES 256 +#define ONE_ADDR_EEPROM_SIZE ((1 + OPTOE_ARCH_PAGES) * OPTOE_PAGE_SIZE) +#define ONE_ADDR_EEPROM_UNPAGED_SIZE (2 * OPTOE_PAGE_SIZE) +/* + * Dual address devices (eg SFP) have 256 pages, plus the unpaged + * low 128 bytes, plus 256 bytes at 0x50. If the device does not + * support paging, it is 4 'pages' long. + */ +#define TWO_ADDR_EEPROM_SIZE ((3 + OPTOE_ARCH_PAGES) * OPTOE_PAGE_SIZE) +#define TWO_ADDR_EEPROM_UNPAGED_SIZE (4 * OPTOE_PAGE_SIZE) +#define TWO_ADDR_NO_0X51_SIZE (2 * OPTOE_PAGE_SIZE) + +/* a few constants to find our way around the EEPROM */ +#define OPTOE_PAGE_SELECT_REG 0x7F +#define ONE_ADDR_PAGEABLE_REG 0x02 +#define QSFP_NOT_PAGEABLE (1<<2) +#define CMIS_NOT_PAGEABLE (1<<7) +#define TWO_ADDR_PAGEABLE_REG 0x40 +#define TWO_ADDR_PAGEABLE (1<<4) +#define TWO_ADDR_0X51_REG 92 +#define TWO_ADDR_0X51_SUPP (1<<6) +#define OPTOE_ID_REG 0 +#define OPTOE_READ_OP 0 +#define OPTOE_WRITE_OP 1 +#define OPTOE_EOF 0 /* used for access beyond end of device */ + +struct optoe_data { + struct optoe_platform_data chip; + int use_smbus; + char port_name[MAX_PORT_NAME_LEN]; + + /* + * Lock protects against activities from other Linux tasks, + * but not from changes by other I2C masters. + */ + struct mutex lock; + struct bin_attribute bin; + struct attribute_group attr_group; + + u8 *writebuf; + unsigned int write_max; + + unsigned int num_addresses; + +#ifdef EEPROM_CLASS + struct eeprom_device *eeprom_dev; +#endif + + /* dev_class: ONE_ADDR (QSFP) or TWO_ADDR (SFP) */ + int dev_class; + + struct i2c_client *client[]; +}; + +/* + * This parameter is to help this driver avoid blocking other drivers out + * of I2C for potentially troublesome amounts of time. With a 100 kHz I2C + * clock, one 256 byte read takes about 1/43 second which is excessive; + * but the 1/170 second it takes at 400 kHz may be quite reasonable; and + * at 1 MHz (Fm+) a 1/430 second delay could easily be invisible. + * + * This value is forced to be a power of two so that writes align on pages. + */ +static unsigned int io_limit = OPTOE_PAGE_SIZE; + +/* + * specs often allow 5 msec for a page write, sometimes 20 msec; + * it's important to recover from write timeouts. + */ +static unsigned int write_timeout = 50; + +/* + * flags to distinguish one-address (QSFP family) from two-address (SFP family) + * If the family is not known, figure it out when the device is accessed + */ +#define ONE_ADDR 1 +#define TWO_ADDR 2 +#define CMIS_ADDR 3 + +static const struct i2c_device_id optoe_ids[] = { + { "wb_optoe1", ONE_ADDR }, + { "wb_optoe2", TWO_ADDR }, + { "wb_optoe3", CMIS_ADDR }, + { "wb_sff8436", ONE_ADDR }, + { "wb_24c04", TWO_ADDR }, + { /* END OF LIST */ } +}; +MODULE_DEVICE_TABLE(i2c, optoe_ids); + +/*-------------------------------------------------------------------------*/ +/* + * This routine computes the addressing information to be used for + * a given r/w request. + * + * Task is to calculate the client (0 = i2c addr 50, 1 = i2c addr 51), + * the page, and the offset. + * + * Handles both single address (eg QSFP) and two address (eg SFP). + * For SFP, offset 0-255 are on client[0], >255 is on client[1] + * Offset 256-383 are on the lower half of client[1] + * Pages are accessible on the upper half of client[1]. + * Offset >383 are in 128 byte pages mapped into the upper half + * + * For QSFP, all offsets are on client[0] + * offset 0-127 are on the lower half of client[0] (no paging) + * Pages are accessible on the upper half of client[1]. + * Offset >127 are in 128 byte pages mapped into the upper half + * + * Callers must not read/write beyond the end of a client or a page + * without recomputing the client/page. Hence offset (within page) + * plus length must be less than or equal to 128. (Note that this + * routine does not have access to the length of the call, hence + * cannot do the validity check.) + * + * Offset within Lower Page 00h and Upper Page 00h are not recomputed + */ + +static uint8_t optoe_translate_offset(struct optoe_data *optoe, + loff_t *offset, struct i2c_client **client) +{ + unsigned int page = 0; + + *client = optoe->client[0]; + + /* if SFP style, offset > 255, shift to i2c addr 0x51 */ + if (optoe->dev_class == TWO_ADDR) { + if (*offset > 255) { + /* like QSFP, but shifted to client[1] */ + *client = optoe->client[1]; + *offset -= 256; + } + } + + /* + * if offset is in the range 0-128... + * page doesn't matter (using lower half), return 0. + * offset is already correct (don't add 128 to get to paged area) + */ + if (*offset < OPTOE_PAGE_SIZE) + return page; + + /* note, page will always be positive since *offset >= 128 */ + page = (*offset >> 7)-1; + /* 0x80 places the offset in the top half, offset is last 7 bits */ + *offset = OPTOE_PAGE_SIZE + (*offset & 0x7f); + + return page; /* note also returning client and offset */ +} + +static ssize_t optoe_eeprom_read(struct optoe_data *optoe, + struct i2c_client *client, + char *buf, unsigned int offset, size_t count) +{ + struct i2c_msg msg[2]; + u8 msgbuf[2]; + unsigned long timeout, read_time; + int status, i; + + mem_clear(msg, sizeof(msg)); + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + /*smaller eeproms can work given some SMBus extension calls */ + if (count > I2C_SMBUS_BLOCK_MAX) + count = I2C_SMBUS_BLOCK_MAX; + break; + case I2C_SMBUS_WORD_DATA: + /* Check for odd length transaction */ + count = (count == 1) ? 1 : 2; + break; + case I2C_SMBUS_BYTE_DATA: + count = 1; + break; + default: + /* + * When we have a better choice than SMBus calls, use a + * combined I2C message. Write address; then read up to + * io_limit data bytes. msgbuf is u8 and will cast to our + * needs. + */ + i = 0; + msgbuf[i++] = offset; + + msg[0].addr = client->addr; + msg[0].buf = msgbuf; + msg[0].len = i; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + } + + /* + * Reads fail if the previous write didn't complete yet. We may + * loop a few times until this one succeeds, waiting at least + * long enough for one entire page write to work. + */ + timeout = jiffies + msecs_to_jiffies(write_timeout); + do { + read_time = jiffies; + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + status = i2c_smbus_read_i2c_block_data(client, offset, + count, buf); + break; + case I2C_SMBUS_WORD_DATA: + status = i2c_smbus_read_word_data(client, offset); + if (status >= 0) { + buf[0] = status & 0xff; + if (count == 2) + buf[1] = status >> 8; + status = count; + } + break; + case I2C_SMBUS_BYTE_DATA: + status = i2c_smbus_read_byte_data(client, offset); + if (status >= 0) { + buf[0] = status; + status = count; + } + break; + default: + status = i2c_transfer(client->adapter, msg, 2); + if (status == 2) + status = count; + } + + dev_dbg(&client->dev, "eeprom read %zu@%d --> %d (%ld)\n", + count, offset, status, jiffies); + + if (status == count) /* happy path */ + return count; + + /* REVISIT: at HZ=100, this is sloooow */ + usleep_range(1000, 2000); + } while (time_before(read_time, timeout)); + + return -ETIMEDOUT; +} + +static ssize_t optoe_eeprom_write(struct optoe_data *optoe, + struct i2c_client *client, + const char *buf, + unsigned int offset, size_t count) +{ + struct i2c_msg msg; + ssize_t status; + unsigned long timeout, write_time; + unsigned int next_page_start; + int i = 0; + + /* write max is at most a page + * (In this driver, write_max is actually one byte!) + */ + if (count > optoe->write_max) + count = optoe->write_max; + + /* shorten count if necessary to avoid crossing page boundary */ + next_page_start = roundup(offset + 1, OPTOE_PAGE_SIZE); + if (offset + count > next_page_start) + count = next_page_start - offset; + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + /*smaller eeproms can work given some SMBus extension calls */ + if (count > I2C_SMBUS_BLOCK_MAX) + count = I2C_SMBUS_BLOCK_MAX; + break; + case I2C_SMBUS_WORD_DATA: + /* Check for odd length transaction */ + count = (count == 1) ? 1 : 2; + break; + case I2C_SMBUS_BYTE_DATA: + count = 1; + break; + default: + /* If we'll use I2C calls for I/O, set up the message */ + msg.addr = client->addr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = optoe->writebuf; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + break; + } + + /* + * Reads fail if the previous write didn't complete yet. We may + * loop a few times until this one succeeds, waiting at least + * long enough for one entire page write to work. + */ + timeout = jiffies + msecs_to_jiffies(write_timeout); + do { + write_time = jiffies; + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + status = i2c_smbus_write_i2c_block_data(client, + offset, count, buf); + if (status == 0) + status = count; + break; + case I2C_SMBUS_WORD_DATA: + if (count == 2) { + status = i2c_smbus_write_word_data(client, + offset, (u16)((buf[0])|(buf[1] << 8))); + } else { + /* count = 1 */ + status = i2c_smbus_write_byte_data(client, + offset, buf[0]); + } + if (status == 0) + status = count; + break; + case I2C_SMBUS_BYTE_DATA: + status = i2c_smbus_write_byte_data(client, offset, + buf[0]); + if (status == 0) + status = count; + break; + default: + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + break; + } + + dev_dbg(&client->dev, "eeprom write %zu@%d --> %ld (%lu)\n", + count, offset, (long int) status, jiffies); + + if (status == count) + return count; + + /* REVISIT: at HZ=100, this is sloooow */ + usleep_range(1000, 2000); + } while (time_before(write_time, timeout)); + + return -ETIMEDOUT; +} + +static ssize_t optoe_eeprom_update_client(struct optoe_data *optoe, + char *buf, loff_t off, + size_t count, int opcode) +{ + struct i2c_client *client; + ssize_t retval = 0; + uint8_t page = 0; + uint8_t loc; + loff_t phy_offset = off; + int ret = 0; + + page = optoe_translate_offset(optoe, &phy_offset, &client); + dev_dbg(&client->dev, + "%s off %lld page:%d phy_offset:%lld, count:%ld, opcode:%d\n", + __func__, off, page, phy_offset, (long int) count, opcode); + + ret = optoe_eeprom_read(optoe, client, &loc, OPTOE_PAGE_SELECT_REG, 1); + if (ret < 0) { + dev_dbg(&client->dev, "Read page register for get now location page failed. ret:%d\n", ret); + return ret; + } + + /* Only when read and now location page is inconsistent, will doing switch page */ + if (loc != page) { + ret = optoe_eeprom_write(optoe, client, &page, + OPTOE_PAGE_SELECT_REG, 1); + if (ret < 0) { + dev_dbg(&client->dev, + "Write page register for page %d failed ret:%d!\n", + page, ret); + return ret; + } + } + + while (count) { + ssize_t status; + + if (opcode == OPTOE_READ_OP) { + status = optoe_eeprom_read(optoe, client, + buf, phy_offset, count); + } else { + status = optoe_eeprom_write(optoe, client, + buf, phy_offset, count); + } + if (status <= 0) { + if (retval == 0) + retval = status; + break; + } + buf += status; + phy_offset += status; + count -= status; + retval += status; + } + + return retval; +} + +/* + * Figure out if this access is within the range of supported pages. + * Note this is called on every access because we don't know if the + * module has been replaced since the last call. + * If/when modules support more pages, this is the routine to update + * to validate and allow access to additional pages. + * + * Returns updated len for this access: + * - entire access is legal, original len is returned. + * - access begins legal but is too long, len is truncated to fit. + * - initial offset exceeds supported pages, return OPTOE_EOF (zero) + */ +static ssize_t optoe_page_legal(struct optoe_data *optoe, + loff_t off, size_t len) +{ + struct i2c_client *client = optoe->client[0]; + u8 regval; + int not_pageable; + int status; + size_t maxlen; + + if (off < 0) + return -EINVAL; + if (optoe->dev_class == TWO_ADDR) { + /* SFP case */ + /* if only using addr 0x50 (first 256 bytes) we're good */ + if ((off + len) <= TWO_ADDR_NO_0X51_SIZE) + return len; + /* if offset exceeds possible pages, we're not good */ + if (off >= TWO_ADDR_EEPROM_SIZE) + return OPTOE_EOF; + /* in between, are pages supported? */ + status = optoe_eeprom_read(optoe, client, ®val, + TWO_ADDR_PAGEABLE_REG, 1); + if (status < 0) + return status; /* error out (no module?) */ + if (regval & TWO_ADDR_PAGEABLE) { + /* Pages supported, trim len to the end of pages */ + maxlen = TWO_ADDR_EEPROM_SIZE - off; + } else { + /* pages not supported, trim len to unpaged size */ + if (off >= TWO_ADDR_EEPROM_UNPAGED_SIZE) + return OPTOE_EOF; + + /* will be accessing addr 0x51, is that supported? */ + /* byte 92, bit 6 implies DDM support, 0x51 support */ + status = optoe_eeprom_read(optoe, client, ®val, + TWO_ADDR_0X51_REG, 1); + if (status < 0) + return status; + if (regval & TWO_ADDR_0X51_SUPP) { + /* addr 0x51 is OK */ + maxlen = TWO_ADDR_EEPROM_UNPAGED_SIZE - off; + } else { + /* addr 0x51 NOT supported, trim to 256 max */ + if (off >= TWO_ADDR_NO_0X51_SIZE) + return OPTOE_EOF; + maxlen = TWO_ADDR_NO_0X51_SIZE - off; + } + } + len = (len > maxlen) ? maxlen : len; + dev_dbg(&client->dev, + "page_legal, SFP, off %lld len %ld\n", + off, (long int) len); + } else { + /* QSFP case, CMIS case */ + /* if no pages needed, we're good */ + if ((off + len) <= ONE_ADDR_EEPROM_UNPAGED_SIZE) + return len; + /* if offset exceeds possible pages, we're not good */ + if (off >= ONE_ADDR_EEPROM_SIZE) + return OPTOE_EOF; + /* in between, are pages supported? */ + status = optoe_eeprom_read(optoe, client, ®val, + ONE_ADDR_PAGEABLE_REG, 1); + if (status < 0) + return status; /* error out (no module?) */ + + if (optoe->dev_class == ONE_ADDR) { + not_pageable = QSFP_NOT_PAGEABLE; + } else { + not_pageable = CMIS_NOT_PAGEABLE; + } + dev_dbg(&client->dev, + "Paging Register: 0x%x; not_pageable mask: 0x%x\n", + regval, not_pageable); + + if (regval & not_pageable) { + /* pages not supported, trim len to unpaged size */ + if (off >= ONE_ADDR_EEPROM_UNPAGED_SIZE) + return OPTOE_EOF; + maxlen = ONE_ADDR_EEPROM_UNPAGED_SIZE - off; + } else { + /* Pages supported, trim len to the end of pages */ + maxlen = ONE_ADDR_EEPROM_SIZE - off; + } + len = (len > maxlen) ? maxlen : len; + dev_dbg(&client->dev, + "page_legal, QSFP, off %lld len %ld\n", + off, (long int) len); + } + return len; +} + +static ssize_t optoe_read_write(struct optoe_data *optoe, + char *buf, loff_t off, size_t len, int opcode) +{ + struct i2c_client *client = optoe->client[0]; + int chunk; + int status = 0; + ssize_t retval; + size_t pending_len = 0, chunk_len = 0; + loff_t chunk_offset = 0, chunk_start_offset = 0; + loff_t chunk_end_offset = 0; + + dev_dbg(&client->dev, + "%s: off %lld len:%ld, opcode:%s\n", + __func__, off, (long int) len, + (opcode == OPTOE_READ_OP) ? "r" : "w"); + if (unlikely(!len)) + return len; + + /* + * Read data from chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&optoe->lock); + + /* + * Confirm this access fits within the device suppored addr range + */ + status = optoe_page_legal(optoe, off, len); + if ((status == OPTOE_EOF) || (status < 0)) { + mutex_unlock(&optoe->lock); + return status; + } + len = status; + + /* + * For each (128 byte) chunk involved in this request, issue a + * separate call to sff_eeprom_update_client(), to + * ensure that each access recalculates the client/page + * and writes the page register as needed. + * Note that chunk to page mapping is confusing, is different for + * QSFP and SFP, and never needs to be done. Don't try! + */ + pending_len = len; /* amount remaining to transfer */ + retval = 0; /* amount transferred */ + for (chunk = off >> 7; chunk <= (off + len - 1) >> 7; chunk++) { + + /* + * Compute the offset and number of bytes to be read/write + * + * 1. start at an offset not equal to 0 (within the chunk) + * and read/write less than the rest of the chunk + * 2. start at an offset not equal to 0 and read/write the rest + * of the chunk + * 3. start at offset 0 (within the chunk) and read/write less + * than entire chunk + * 4. start at offset 0 (within the chunk), and read/write + * the entire chunk + */ + chunk_start_offset = chunk * OPTOE_PAGE_SIZE; + chunk_end_offset = chunk_start_offset + OPTOE_PAGE_SIZE; + + if (chunk_start_offset < off) { + chunk_offset = off; + if ((off + pending_len) < chunk_end_offset) + chunk_len = pending_len; + else + chunk_len = chunk_end_offset - off; + } else { + chunk_offset = chunk_start_offset; + if (pending_len < OPTOE_PAGE_SIZE) + chunk_len = pending_len; + else + chunk_len = OPTOE_PAGE_SIZE; + } + + dev_dbg(&client->dev, + "sff_r/w: off %lld, len %ld, chunk_start_offset %lld, chunk_offset %lld, chunk_len %ld, pending_len %ld\n", + off, (long int) len, chunk_start_offset, chunk_offset, + (long int) chunk_len, (long int) pending_len); + + /* + * note: chunk_offset is from the start of the EEPROM, + * not the start of the chunk + */ + status = optoe_eeprom_update_client(optoe, buf, + chunk_offset, chunk_len, opcode); + if (status != chunk_len) { + /* This is another 'no device present' path */ + dev_dbg(&client->dev, + "o_u_c: chunk %d c_offset %lld c_len %ld failed %d!\n", + chunk, chunk_offset, (long int) chunk_len, status); + if (status > 0) + retval += status; + if (retval == 0) + retval = status; + break; + } + buf += status; + pending_len -= status; + retval += status; + } + mutex_unlock(&optoe->lock); + + return retval; +} + +static ssize_t optoe_bin_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, + struct device, kobj)); + struct optoe_data *optoe = i2c_get_clientdata(client); + + return optoe_read_write(optoe, buf, off, count, OPTOE_READ_OP); +} + +static ssize_t optoe_bin_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, + struct device, kobj)); + struct optoe_data *optoe = i2c_get_clientdata(client); + + return optoe_read_write(optoe, buf, off, count, OPTOE_WRITE_OP); +} + +static int optoe_remove(struct i2c_client *client) +{ + struct optoe_data *optoe; + int i; + + optoe = i2c_get_clientdata(client); + sysfs_remove_group(&client->dev.kobj, &optoe->attr_group); + sysfs_remove_bin_file(&client->dev.kobj, &optoe->bin); + + for (i = 1; i < optoe->num_addresses; i++) + i2c_unregister_device(optoe->client[i]); + +#ifdef EEPROM_CLASS + eeprom_device_unregister(optoe->eeprom_dev); +#endif + + kfree(optoe->writebuf); + kfree(optoe); + return 0; +} + +static ssize_t show_dev_class(struct device *dev, + struct device_attribute *dattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&optoe->lock); + count = sprintf(buf, "%d\n", optoe->dev_class); + mutex_unlock(&optoe->lock); + + return count; +} + +static ssize_t set_dev_class(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + int dev_class; + + /* + * dev_class is actually the number of i2c addresses used, thus + * legal values are "1" (QSFP class) and "2" (SFP class) + * And... CMIS spec is 1 i2c address, but puts the pageable + * bit in a different location, so CMIS devices are "3" + */ + + if (kstrtoint(buf, 0, &dev_class) != 0 || + dev_class < 1 || dev_class > 3) + return -EINVAL; + + mutex_lock(&optoe->lock); + if (dev_class == TWO_ADDR) { + /* SFP family */ + /* if it doesn't exist, create 0x51 i2c address */ + if (!optoe->client[1]) { + optoe->client[1] = i2c_new_dummy_device(client->adapter, 0x51); + if (!optoe->client[1]) { + dev_err(&client->dev, + "address 0x51 unavailable\n"); + mutex_unlock(&optoe->lock); + return -EADDRINUSE; + } + } + optoe->bin.size = TWO_ADDR_EEPROM_SIZE; + optoe->num_addresses = 2; + } else { + /* one-address (eg QSFP) and CMIS family */ + /* if it exists, remove 0x51 i2c address */ + if (optoe->client[1]) { + i2c_unregister_device(optoe->client[1]); + optoe->client[1] = NULL; + } + optoe->bin.size = ONE_ADDR_EEPROM_SIZE; + optoe->num_addresses = 1; + } + optoe->dev_class = dev_class; + mutex_unlock(&optoe->lock); + + return count; +} + +/* + * if using the EEPROM CLASS driver, we don't report a port_name, + * the EEPROM CLASS drive handles that. Hence all this code is + * only compiled if we are NOT using the EEPROM CLASS driver. + */ +#ifndef EEPROM_CLASS + +static ssize_t show_port_name(struct device *dev, + struct device_attribute *dattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&optoe->lock); + count = sprintf(buf, "%s\n", optoe->port_name); + mutex_unlock(&optoe->lock); + + return count; +} + +static ssize_t set_port_name(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + char port_name[MAX_PORT_NAME_LEN]; + + /* no checking, this value is not used except by show_port_name */ + + if (sscanf(buf, "%19s", port_name) != 1) + return -EINVAL; + + mutex_lock(&optoe->lock); + strcpy(optoe->port_name, port_name); + mutex_unlock(&optoe->lock); + + return count; +} + +static DEVICE_ATTR(port_name, 0644, show_port_name, set_port_name); +#endif /* if NOT defined EEPROM_CLASS, the common case */ + +static DEVICE_ATTR(dev_class, 0644, show_dev_class, set_dev_class); + +static struct attribute *optoe_attrs[] = { +#ifndef EEPROM_CLASS + &dev_attr_port_name.attr, +#endif + &dev_attr_dev_class.attr, + NULL, +}; + +static struct attribute_group optoe_attr_group = { + .attrs = optoe_attrs, +}; + +static int optoe_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int err; + int use_smbus = 0; + struct optoe_platform_data chip; + struct optoe_data *optoe; + int num_addresses = 0; + char port_name[MAX_PORT_NAME_LEN]; + + if (client->addr != 0x50) { + dev_dbg(&client->dev, "probe, bad i2c addr: 0x%x\n", + client->addr); + err = -EINVAL; + goto exit; + } + + if (client->dev.platform_data) { + chip = *(struct optoe_platform_data *)client->dev.platform_data; + /* take the port name from the supplied platform data */ +#ifdef EEPROM_CLASS + strncpy(port_name, chip.eeprom_data->label, MAX_PORT_NAME_LEN); +#else + memcpy(port_name, chip.port_name, MAX_PORT_NAME_LEN); +#endif + dev_dbg(&client->dev, + "probe, chip provided, flags:0x%x; name: %s\n", + chip.flags, client->name); + } else { + if (!id->driver_data) { + err = -ENODEV; + goto exit; + } + dev_dbg(&client->dev, "probe, building chip\n"); + strcpy(port_name, "unitialized"); + chip.flags = 0; +#ifdef EEPROM_CLASS + chip.eeprom_data = NULL; +#endif + } + + /* Use I2C operations unless we're stuck with SMBus extensions. */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { + use_smbus = I2C_SMBUS_I2C_BLOCK_DATA; + } else if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_WORD_DATA)) { + use_smbus = I2C_SMBUS_WORD_DATA; + } else if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_BYTE_DATA)) { + use_smbus = I2C_SMBUS_BYTE_DATA; + } else { + err = -EPFNOSUPPORT; + goto exit; + } + } + + /* + * Make room for two i2c clients + */ + num_addresses = 2; + + optoe = kzalloc(sizeof(struct optoe_data) + + num_addresses * sizeof(struct i2c_client *), + GFP_KERNEL); + if (!optoe) { + err = -ENOMEM; + goto exit; + } + + mutex_init(&optoe->lock); + + /* determine whether this is a one-address or two-address module */ + if ((strcmp(client->name, "wb_optoe1") == 0) || + (strcmp(client->name, "wb_sff8436") == 0)) { + /* one-address (eg QSFP) family */ + optoe->dev_class = ONE_ADDR; + chip.byte_len = ONE_ADDR_EEPROM_SIZE; + num_addresses = 1; + } else if ((strcmp(client->name, "wb_optoe2") == 0) || + (strcmp(client->name, "wb_24c04") == 0)) { + /* SFP family */ + optoe->dev_class = TWO_ADDR; + chip.byte_len = TWO_ADDR_EEPROM_SIZE; + num_addresses = 2; + } else if (strcmp(client->name, "wb_optoe3") == 0) { + /* CMIS spec */ + optoe->dev_class = CMIS_ADDR; + chip.byte_len = ONE_ADDR_EEPROM_SIZE; + num_addresses = 1; + } else { /* those were the only choices */ + err = -EINVAL; + goto exit; + } + + dev_dbg(&client->dev, "dev_class: %d\n", optoe->dev_class); + optoe->use_smbus = use_smbus; + optoe->chip = chip; + optoe->num_addresses = num_addresses; + memcpy(optoe->port_name, port_name, MAX_PORT_NAME_LEN); + + /* + * Export the EEPROM bytes through sysfs, since that's convenient. + * By default, only root should see the data (maybe passwords etc) + */ + sysfs_bin_attr_init(&optoe->bin); + optoe->bin.attr.name = "eeprom"; + optoe->bin.attr.mode = 0444; + optoe->bin.read = optoe_bin_read; + optoe->bin.size = chip.byte_len; + + if (!use_smbus || + (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) || + i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_WORD_DATA) || + i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { + /* + * NOTE: AN-2079 + * Finisar recommends that the host implement 1 byte writes + * only since this module only supports 32 byte page boundaries. + * 2 byte writes are acceptable for PE and Vout changes per + * Application Note AN-2071. + */ + unsigned int write_max = 1; + + optoe->bin.write = optoe_bin_write; + optoe->bin.attr.mode |= 0200; + + if (write_max > io_limit) + write_max = io_limit; + if (use_smbus && write_max > I2C_SMBUS_BLOCK_MAX) + write_max = I2C_SMBUS_BLOCK_MAX; + optoe->write_max = write_max; + + /* buffer (data + address at the beginning) */ + optoe->writebuf = kmalloc(write_max + 2, GFP_KERNEL); + if (!optoe->writebuf) { + err = -ENOMEM; + goto exit_kfree; + } + } else { + dev_warn(&client->dev, + "cannot write due to controller restrictions."); + } + + optoe->client[0] = client; + + /* SFF-8472 spec requires that the second I2C address be 0x51 */ + if (num_addresses == 2) { + optoe->client[1] = i2c_new_dummy_device(client->adapter, 0x51); + if (!optoe->client[1]) { + dev_err(&client->dev, "address 0x51 unavailable\n"); + err = -EADDRINUSE; + goto err_struct; + } + } + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &optoe->bin); + if (err) + goto err_struct; + + optoe->attr_group = optoe_attr_group; + + err = sysfs_create_group(&client->dev.kobj, &optoe->attr_group); + if (err) { + dev_err(&client->dev, "failed to create sysfs attribute group.\n"); + goto err_struct; + } + +#ifdef EEPROM_CLASS + optoe->eeprom_dev = eeprom_device_register(&client->dev, + chip.eeprom_data); + if (IS_ERR(optoe->eeprom_dev)) { + dev_err(&client->dev, "error registering eeprom device.\n"); + err = PTR_ERR(optoe->eeprom_dev); + goto err_sysfs_cleanup; + } +#endif + + i2c_set_clientdata(client, optoe); + + dev_info(&client->dev, "%zu byte %s EEPROM, %s\n", + optoe->bin.size, client->name, + optoe->bin.write ? "read/write" : "read-only"); + + if (use_smbus == I2C_SMBUS_WORD_DATA || + use_smbus == I2C_SMBUS_BYTE_DATA) { + dev_notice(&client->dev, + "Falling back to %s reads, performance will suffer\n", + use_smbus == I2C_SMBUS_WORD_DATA ? "word" : "byte"); + } + + return 0; + +#ifdef EEPROM_CLASS +err_sysfs_cleanup: + sysfs_remove_group(&client->dev.kobj, &optoe->attr_group); + sysfs_remove_bin_file(&client->dev.kobj, &optoe->bin); +#endif + +err_struct: + if (num_addresses == 2) { + if (optoe->client[1]) { + i2c_unregister_device(optoe->client[1]); + optoe->client[1] = NULL; + } + } + + kfree(optoe->writebuf); +exit_kfree: + kfree(optoe); +exit: + dev_dbg(&client->dev, "probe error %d\n", err); + + return err; +} + +/*-------------------------------------------------------------------------*/ + +static struct i2c_driver optoe_driver = { + .driver = { + .name = "wb_optoe", + .owner = THIS_MODULE, + }, + .probe = optoe_probe, + .remove = optoe_remove, + .id_table = optoe_ids, +}; + +static int __init optoe_init(void) +{ + + if (!io_limit) { + pr_err("optoe: io_limit must not be 0!\n"); + return -EINVAL; + } + + io_limit = rounddown_pow_of_two(io_limit); + return i2c_add_driver(&optoe_driver); +} +module_init(optoe_init); + +static void __exit optoe_exit(void) +{ + i2c_del_driver(&optoe_driver); +} +module_exit(optoe_exit); + +MODULE_DESCRIPTION("Driver for optical transceiver (SFP, QSFP, ...) EEPROMs"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c new file mode 100644 index 000000000000..1f5180ffccdc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c @@ -0,0 +1,770 @@ +/* + * wb_pcie_dev.c + * ko to read/write pcie iomem and ioports through /dev/XXX device + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_pcie_dev.h" + +#define PROXY_NAME "wb-pci-dev" +#define MAX_NAME_SIZE (20) +#define MAX_PCIE_NUM (256) +#define PCI_RDWR_MAX_LEN (256) +#define PCIE_BUS_WIDTH_1 (1) +#define PCIE_BUS_WIDTH_2 (2) +#define PCIE_BUS_WIDTH_4 (4) + +static int g_pcie_dev_debug = 0; +static int g_pcie_dev_error = 0; + +module_param(g_pcie_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_pcie_dev_error, int, S_IRUGO | S_IWUSR); + +#define PCIE_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_pcie_dev_debug) { \ + printk(KERN_INFO "[PCIE_DEV][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define PCIE_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_pcie_dev_error) { \ + printk(KERN_ERR "[PCIE_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct firmware_upg_s { + int upg_ctrl_base; + int upg_flash_base; +} firmware_upg_t; + +typedef struct wb_pci_dev_s { + const char *name; + uint32_t domain; + uint32_t bus; + uint32_t slot; + uint32_t fn; + uint32_t bar; + void __iomem *pci_mem_base; + uint32_t pci_io_base; + uint32_t bar_len; + uint32_t bar_flag; + uint32_t bus_width; + struct miscdevice misc; + void (*setreg)(struct wb_pci_dev_s *wb_pci_dev, int reg, u32 value); + u32 (*getreg)(struct wb_pci_dev_s *wb_pci_dev, int reg); + firmware_upg_t firmware_upg; +} wb_pci_dev_t; + +static wb_pci_dev_t* pcie_dev_arry[MAX_PCIE_NUM]; + +static void pci_dev_setreg_8(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + u8 w_value; + + w_value = (u8)(value & 0xff); + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + writeb(w_value, wb_pci_dev->pci_mem_base + reg); + } else { + outb(w_value, wb_pci_dev->pci_io_base + reg); + } + return; +} + +static void pci_dev_setreg_16(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + u16 w_value; + + w_value = (u16)(value & 0xffff); + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + writew(w_value, wb_pci_dev->pci_mem_base + reg); + } else { + outw(w_value, wb_pci_dev->pci_io_base + reg); + } + + return; +} + +static void pci_dev_setreg_32(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + writel(value, wb_pci_dev->pci_mem_base + reg); + } else { + outl(value, wb_pci_dev->pci_io_base + reg); + } + return; +} + +static inline u32 pci_dev_getreg_8(wb_pci_dev_t *wb_pci_dev, int reg) +{ + u32 value; + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + value = readb(wb_pci_dev->pci_mem_base + reg); + } else { + value = inb(wb_pci_dev->pci_io_base + reg); + } + + return value; +} + +static inline u32 pci_dev_getreg_16(wb_pci_dev_t *wb_pci_dev, int reg) +{ + u32 value; + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + value = readw(wb_pci_dev->pci_mem_base + reg); + } else { + value = inw(wb_pci_dev->pci_io_base + reg); + } + + return value; +} + +static inline u32 pci_dev_getreg_32(wb_pci_dev_t *wb_pci_dev, int reg) +{ + u32 value; + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + value = readl(wb_pci_dev->pci_mem_base + reg); + } else { + value = inl(wb_pci_dev->pci_io_base + reg); + } + + return value; +} + +static inline void pci_dev_setreg(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + wb_pci_dev->setreg(wb_pci_dev, reg, value); +} + +static inline u32 pci_dev_getreg(wb_pci_dev_t *wb_pci_dev, int reg) +{ + return wb_pci_dev->getreg(wb_pci_dev, reg); +} + +static int pci_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + wb_pci_dev_t *wb_pci_dev; + + PCIE_DEV_DEBUG_VERBOSE("inode: %p, file: %p, minor: %u", inode, file, minor); + + if (minor >= MAX_PCIE_NUM) { + PCIE_DEV_DEBUG_ERROR("minor out of range, minor = %d.\n", minor); + return -ENODEV; + } + + wb_pci_dev = pcie_dev_arry[minor]; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, open failed, minor = %d\n", minor); + return -ENODEV; + } + + file->private_data = wb_pci_dev; + return 0; +} + +static int pci_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +static int pci_dev_read_tmp(wb_pci_dev_t *wb_pci_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int width, i, j; + u32 val; + + if (offset > wb_pci_dev->bar_len) { + PCIE_DEV_DEBUG_VERBOSE("offset:0x%x, bar len:0x%x, EOF.\n", offset, wb_pci_dev->bar_len); + return 0; + } + + width = wb_pci_dev->bus_width; + + if (offset % width) { + PCIE_DEV_DEBUG_ERROR("pci bus width:%d, offset:0x%x, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + + if (count > wb_pci_dev->bar_len - offset) { + PCIE_DEV_DEBUG_VERBOSE("read count out of range. input len:%lu, read len:%u.\n", + count, wb_pci_dev->bar_len - offset); + count = wb_pci_dev->bar_len - offset; + } + + for (i = 0; i < count; i += width) { + val = pci_dev_getreg(wb_pci_dev, offset + i); + for (j = 0; (j < width) && (i + j < count); j++) { + buf[i + j] = (val >> (8 * j)) & 0xff; + } + } + return count; +} + +static ssize_t pci_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + wb_pci_dev_t *wb_pci_dev; + int ret, read_len; + u8 buf_tmp[PCI_RDWR_MAX_LEN]; + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, read failed.\n"); + return -EINVAL; + } + + if (count == 0) { + PCIE_DEV_DEBUG_ERROR("Invalid params, read count is 0.n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + PCIE_DEV_DEBUG_VERBOSE("read conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + read_len = pci_dev_read_tmp(wb_pci_dev, *offset, buf_tmp, count); + if (read_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_read_tmp failed, ret:%d.\n", read_len); + return read_len; + } + if (access_ok(buf, read_len)) { + PCIE_DEV_DEBUG_VERBOSE("user space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + if (copy_to_user(buf, buf_tmp, read_len)) { + PCIE_DEV_DEBUG_ERROR("copy_to_user failed.\n"); + return -EFAULT; + } + } else { + PCIE_DEV_DEBUG_VERBOSE("kernel space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + memcpy(buf, buf_tmp, read_len); + } + *offset += read_len; + ret = read_len; + return ret; +} + +static ssize_t pci_dev_read_iter(struct kiocb *iocb, struct iov_iter *to) +{ + int ret; + + PCIE_DEV_DEBUG_VERBOSE("pci_dev_read_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, to->count, iocb->ki_pos); + ret = pci_dev_read(iocb->ki_filp, to->kvec->iov_base, to->count, &iocb->ki_pos); + return ret; +} + +static int pci_dev_write_tmp(wb_pci_dev_t *wb_pci_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int width, i, j; + u32 val; + + if (offset > wb_pci_dev->bar_len) { + PCIE_DEV_DEBUG_VERBOSE("offset:0x%x, bar len:0x%x, EOF.\n", offset, wb_pci_dev->bar_len); + return 0; + } + + width = wb_pci_dev->bus_width; + + if (offset % width) { + PCIE_DEV_DEBUG_ERROR("pci bus width:%d, offset:0x%x, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + + if (count > wb_pci_dev->bar_len - offset) { + PCIE_DEV_DEBUG_VERBOSE("write count out of range. input len:%lu, write len:%u.\n", + count, wb_pci_dev->bar_len - offset); + count = wb_pci_dev->bar_len - offset; + } + + for (i = 0; i < count; i += width) { + val = 0; + for (j = 0; (j < width) && (i + j < count); j++) { + val |= buf[i + j] << (8 * j); + } + pci_dev_setreg(wb_pci_dev, i + offset, val); + } + + return count; +} + +static ssize_t pci_dev_write(struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + wb_pci_dev_t *wb_pci_dev; + u8 buf_tmp[PCI_RDWR_MAX_LEN]; + int write_len; + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, write failed.\n"); + return -EINVAL; + } + + if (count == 0) { + PCIE_DEV_DEBUG_ERROR("Invalid params, write count is 0.\n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + PCIE_DEV_DEBUG_VERBOSE("write conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + if (access_ok(buf, count)) { + PCIE_DEV_DEBUG_VERBOSE("user space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + if (copy_from_user(buf_tmp, buf, count)) { + PCIE_DEV_DEBUG_ERROR("copy_from_user failed.\n"); + return -EFAULT; + } + } else { + PCIE_DEV_DEBUG_VERBOSE("kernel space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + memcpy(buf_tmp, buf, count); + } + + write_len = pci_dev_write_tmp(wb_pci_dev, *offset, buf_tmp, count); + if (write_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_write_tmp failed, ret:%d.\n", write_len); + return write_len; + } + + *offset += write_len; + return write_len; +} + +static ssize_t pci_dev_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + int ret; + + PCIE_DEV_DEBUG_VERBOSE("pci_dev_write_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, from->count, iocb->ki_pos); + ret = pci_dev_write(iocb->ki_filp, from->kvec->iov_base, from->count, &iocb->ki_pos); + return ret; +} + +static loff_t pci_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + wb_pci_dev_t *wb_pci_dev; + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, llseek failed.\n"); + return -EINVAL; + } + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + PCIE_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + if (offset > wb_pci_dev->bar_len) { + PCIE_DEV_DEBUG_ERROR("SEEK_SET out of range, offset:%lld, bar len:0x%x.\n", + offset, wb_pci_dev->bar_len); + ret = - EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (((file->f_pos + offset) > wb_pci_dev->bar_len) || ((file->f_pos + offset) < 0)) { + PCIE_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld, bar len:0x%x.\n", + file->f_pos, offset, wb_pci_dev->bar_len); + ret = - EINVAL; + break; + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + PCIE_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static long pci_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + wb_pci_dev_t *wb_pci_dev; + void __user *argp; + firmware_upg_t *firmware_upg; + int upg_ctrl_base; + int upg_flash_base; + + PCIE_DEV_DEBUG_VERBOSE("ioctl, cmd=0x%02x, arg=0x%02lx\n",cmd, arg); + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, ioctl failed.\n"); + return -EINVAL; + } + + firmware_upg = &wb_pci_dev->firmware_upg; + + argp = (void __user *)arg; + + switch (cmd) { + case GET_FPGA_UPG_CTL_BASE: + if (firmware_upg->upg_ctrl_base < 0) { + PCIE_DEV_DEBUG_ERROR("dts not adaptive upg_ctrl_base\n"); + return -EFAULT; + } else { + upg_ctrl_base = firmware_upg->upg_ctrl_base; + if (copy_to_user(argp, &upg_ctrl_base, sizeof(upg_ctrl_base))) { + PCIE_DEV_DEBUG_ERROR("upg_ctrl_base copy_from_user failed\n"); + return -EFAULT; + } + } + break; + case GET_FPGA_UPG_FLASH_BASE: + if (firmware_upg->upg_flash_base < 0) { + PCIE_DEV_DEBUG_ERROR("dts not adaptive upg_flash_base\n"); + return -EFAULT; + } else { + upg_flash_base = firmware_upg->upg_flash_base; + if (copy_to_user(argp, &upg_flash_base, sizeof(upg_flash_base))) { + PCIE_DEV_DEBUG_ERROR("upg_flash_base copy_from_user failed\n"); + return -EFAULT; + } + } + break; + default: + PCIE_DEV_DEBUG_ERROR("command unsupported \n"); + return -ENOTTY; + } + + return 0; +} + +static const struct file_operations pcie_dev_fops = { + .owner = THIS_MODULE, + .llseek = pci_dev_llseek, + .read_iter = pci_dev_read_iter, + .write_iter = pci_dev_write_iter, + .unlocked_ioctl = pci_dev_ioctl, + .open = pci_dev_open, + .release = pci_dev_release, +}; + +static wb_pci_dev_t *dev_match(const char *path) +{ + wb_pci_dev_t *wb_pci_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + + for (i = 0; i < MAX_PCIE_NUM; i++) { + if (pcie_dev_arry[i] == NULL) { + continue; + } + wb_pci_dev = pcie_dev_arry[i]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", wb_pci_dev->name); + if (!strcmp(path, dev_name)) { + PCIE_DEV_DEBUG_VERBOSE("get dev_name = %s, minor = %d\n", dev_name, i); + return wb_pci_dev; + } + } + + return NULL; +} + +int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_pci_dev_t *wb_pci_dev; + int read_len; + + if (path == NULL) { + PCIE_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + PCIE_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_pci_dev = dev_match(path); + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + read_len = pci_dev_read_tmp(wb_pci_dev, offset, buf, count); + if (read_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_read_tmp failed, ret:%d.\n", read_len); + } + return read_len; +} +EXPORT_SYMBOL(pcie_device_func_read); + +int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_pci_dev_t *wb_pci_dev; + int write_len; + + if (path == NULL) { + PCIE_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + PCIE_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_pci_dev = dev_match(path); + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + write_len = pci_dev_write_tmp(wb_pci_dev, offset, buf, count); + if (write_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_write_tmp failed, ret:%d.\n", write_len); + } + return write_len; +} +EXPORT_SYMBOL(pcie_device_func_write); + +static int pci_setup_bars(wb_pci_dev_t *wb_pci_dev, struct pci_dev *dev) +{ + int ret; + uint32_t addr, len, flags; + + ret = 0; + addr = pci_resource_start(dev, wb_pci_dev->bar); + len = pci_resource_len(dev, wb_pci_dev->bar); + if (addr == 0 || len == 0) { + PCIE_DEV_DEBUG_ERROR("get bar addr failed. bar:%d, addr:0x%x, len:0x%x.\n", + wb_pci_dev->bar, addr, len); + return -EFAULT; + } + wb_pci_dev->bar_len = len; + + flags = pci_resource_flags(dev, wb_pci_dev->bar); + PCIE_DEV_DEBUG_VERBOSE("bar:%d, flag:0x%08x, phys addr:0x%x, len:0x%x\n", + wb_pci_dev->bar, flags, addr, len); + if (flags & IORESOURCE_MEM) { + wb_pci_dev->bar_flag = IORESOURCE_MEM; + wb_pci_dev->pci_mem_base = ioremap(addr, len); + PCIE_DEV_DEBUG_VERBOSE("pci mem base:%p.\n", wb_pci_dev->pci_mem_base); + } else if (flags & IORESOURCE_IO) { + wb_pci_dev->bar_flag = IORESOURCE_IO; + wb_pci_dev->pci_io_base = addr; + PCIE_DEV_DEBUG_VERBOSE("pci io base:0x%x.\n", wb_pci_dev->pci_io_base); + } else { + PCIE_DEV_DEBUG_ERROR("unknow pci bar flag:0x%08x.\n", flags); + ret = -EINVAL; + } + + return ret; +} + +static int pci_dev_probe(struct platform_device *pdev) +{ + int ret, devfn; + wb_pci_dev_t *wb_pci_dev; + struct pci_dev *pci_dev; + struct miscdevice *misc; + firmware_upg_t *firmware_upg; + pci_dev_device_t *pci_dev_device; + + wb_pci_dev = devm_kzalloc(&pdev->dev, sizeof(wb_pci_dev_t), GFP_KERNEL); + if (!wb_pci_dev) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + return ret; + } + + firmware_upg = &wb_pci_dev->firmware_upg; + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "pci_dev_name", &wb_pci_dev->name); + ret += of_property_read_u32(pdev->dev.of_node, "pci_domain", &wb_pci_dev->domain); + ret += of_property_read_u32(pdev->dev.of_node, "pci_bus", &wb_pci_dev->bus); + ret += of_property_read_u32(pdev->dev.of_node, "pci_slot", &wb_pci_dev->slot); + ret += of_property_read_u32(pdev->dev.of_node, "pci_fn", &wb_pci_dev->fn); + ret += of_property_read_u32(pdev->dev.of_node, "pci_bar", &wb_pci_dev->bar); + ret += of_property_read_u32(pdev->dev.of_node, "bus_width", &wb_pci_dev->bus_width); + + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get dts config, ret:%d.\n", ret); + return -ENXIO; + } + + ret = 0; + ret += of_property_read_u32(pdev->dev.of_node, "upg_ctrl_base", &firmware_upg->upg_ctrl_base); + ret += of_property_read_u32(pdev->dev.of_node, "upg_flash_base", &firmware_upg->upg_flash_base); + if (ret != 0) { + PCIE_DEV_DEBUG_VERBOSE("dts don't adaptive fpga upg related, ret:%d.\n", ret); + firmware_upg->upg_ctrl_base = -1; + firmware_upg->upg_flash_base = -1; + } else { + PCIE_DEV_DEBUG_VERBOSE("upg_ctrl_base:0x%04x, upg_flash_base:0x%02x.\n", + firmware_upg->upg_ctrl_base, firmware_upg->upg_flash_base); + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + pci_dev_device = pdev->dev.platform_data; + wb_pci_dev->name = pci_dev_device->pci_dev_name; + wb_pci_dev->domain = pci_dev_device->pci_domain; + wb_pci_dev->bus = pci_dev_device->pci_bus; + wb_pci_dev->slot = pci_dev_device->pci_slot; + wb_pci_dev->fn = pci_dev_device->pci_fn; + wb_pci_dev->bar = pci_dev_device->pci_bar; + wb_pci_dev->bus_width = pci_dev_device->bus_width; + firmware_upg->upg_ctrl_base = pci_dev_device->upg_ctrl_base; + firmware_upg->upg_flash_base = pci_dev_device->upg_flash_base; + PCIE_DEV_DEBUG_VERBOSE("upg_ctrl_base:0x%04x, upg_flash_base:0x%02x.\n", + firmware_upg->upg_ctrl_base, firmware_upg->upg_flash_base); + } + + PCIE_DEV_DEBUG_VERBOSE("name:%s, domain:0x%04x, bus:0x%02x, slot:0x%02x, fn:%u, bar:%u, bus_width:%d.\n", + wb_pci_dev->name, wb_pci_dev->domain, wb_pci_dev->bus, wb_pci_dev->slot, wb_pci_dev->fn, + wb_pci_dev->bar, wb_pci_dev->bus_width); + + devfn = PCI_DEVFN(wb_pci_dev->slot, wb_pci_dev->fn); + pci_dev = pci_get_domain_bus_and_slot(wb_pci_dev->domain, wb_pci_dev->bus, devfn); + if (pci_dev == NULL) { + dev_err(&pdev->dev, "Failed to find pci_dev, domain:0x%04x, bus:0x%02x, devfn:0x%x\n", + wb_pci_dev->domain, wb_pci_dev->bus, devfn); + return -ENXIO; + } + ret = pci_setup_bars(wb_pci_dev, pci_dev); + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get pci bar address.\n"); + return ret; + } + + if (!wb_pci_dev->setreg || !wb_pci_dev->getreg) { + switch (wb_pci_dev->bus_width) { + case 1: + wb_pci_dev->setreg = pci_dev_setreg_8; + wb_pci_dev->getreg = pci_dev_getreg_8; + break; + + case 2: + wb_pci_dev->setreg = pci_dev_setreg_16; + wb_pci_dev->getreg = pci_dev_getreg_16; + break; + + case 4: + wb_pci_dev->setreg = pci_dev_setreg_32; + wb_pci_dev->getreg = pci_dev_getreg_32; + break; + default: + dev_err(&pdev->dev, "Error: unsupported I/O width (%d).\n", wb_pci_dev->bus_width); + ret = -EINVAL; + goto io_unmap; + } + } + + misc = &wb_pci_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = wb_pci_dev->name; + misc->fops = &pcie_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&pdev->dev, "Failed to register %s device.\n", misc->name); + ret = -ENXIO; + goto io_unmap; + } + if (misc->minor >= MAX_PCIE_NUM) { + dev_err(&pdev->dev, "Error: device minor[%d] more than max pcie num[%d].\n", + misc->minor, MAX_PCIE_NUM); + misc_deregister(misc); + ret = -EINVAL; + goto io_unmap; + } + pcie_dev_arry[misc->minor] = wb_pci_dev; + dev_info(&pdev->dev, "%04x:%02x:%02x.%d[bar%d: %s]: register %s device with minor:%d success.\n", + wb_pci_dev->domain, wb_pci_dev->bus, wb_pci_dev->slot, wb_pci_dev->fn, wb_pci_dev->bar, + wb_pci_dev->bar_flag == IORESOURCE_MEM ? "IORESOURCE_MEM" : "IORESOURCE_IO", + misc->name, misc->minor ); + return 0; + +io_unmap: + if (wb_pci_dev->pci_mem_base) { + iounmap(wb_pci_dev->pci_mem_base); + } + return ret; +} + +static int pci_dev_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < MAX_PCIE_NUM ; i++) { + if (pcie_dev_arry[i] != NULL) { + if (pcie_dev_arry[i]->pci_mem_base) { + iounmap(pcie_dev_arry[i]->pci_mem_base); + } + misc_deregister(&pcie_dev_arry[i]->misc); + pcie_dev_arry[i] = NULL; + } + } + + return 0; +} + +static struct of_device_id pci_dev_match[] = { + { + .compatible = "wb-pci-dev", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, pci_dev_match); + +static struct platform_driver wb_pci_dev_driver = { + .probe = pci_dev_probe, + .remove = pci_dev_remove, + .driver = { + .owner = THIS_MODULE, + .name = PROXY_NAME, + .of_match_table = pci_dev_match, + }, +}; + +static int __init wb_pci_dev_init(void) +{ + return platform_driver_register(&wb_pci_dev_driver); +} + +static void __exit wb_pci_dev_exit(void) +{ + platform_driver_unregister(&wb_pci_dev_driver); +} + +module_init(wb_pci_dev_init); +module_exit(wb_pci_dev_exit); +MODULE_DESCRIPTION("pcie device driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h new file mode 100644 index 000000000000..9ba0f3b457ea --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h @@ -0,0 +1,26 @@ +#ifndef __WB_PCIE_DEV_H__ +#define __WB_PCIE_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define UPG_TYPE 'U' +#define GET_FPGA_UPG_CTL_BASE _IOR(UPG_TYPE, 0, int) +#define GET_FPGA_UPG_FLASH_BASE _IOR(UPG_TYPE, 1, int) + +#define PCI_DEV_NAME_MAX_LEN (64) + +typedef struct pci_dev_device_s { + char pci_dev_name[PCI_DEV_NAME_MAX_LEN]; + int pci_domain; + int pci_bus; + int pci_slot; + int pci_fn; + int pci_bar; + int bus_width; + int upg_ctrl_base; + int upg_flash_base; + int device_flag; +} pci_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c new file mode 100644 index 000000000000..3fe1c4aa10f5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c @@ -0,0 +1,749 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_platform_i2c_dev.h" + +#define PROXY_NAME "wb-platform-i2c-dev" +#define MAX_I2C_DEV_NUM (256) +#define FPGA_MAX_LEN (256) +#define MAX_NAME_SIZE (20) +#define MAX_BUS_WIDTH (16) +#define TRANSFER_WRITE_BUFF (FPGA_MAX_LEN + MAX_BUS_WIDTH) + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) + +int g_i2c_dev_debug = 0; +int g_i2c_dev_error = 0; + +module_param(g_i2c_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_i2c_dev_error, int, S_IRUGO | S_IWUSR); + +#define I2C_DEV_DEBUG_DMESG(fmt, args...) do { \ + if (g_i2c_dev_debug) { \ + printk(KERN_ERR "[I2C_DEV][DEBUG][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define I2C_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_i2c_dev_error) { \ + printk(KERN_ERR "[I2C_DEV][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct platform_i2c_dev_info* i2c_dev_arry[MAX_I2C_DEV_NUM]; + +struct platform_i2c_dev_info { + uint32_t i2c_bus; + uint32_t i2c_addr; + const char *name; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + struct miscdevice misc; +}; + +static int transfer_read(struct platform_i2c_dev_info *i2c_dev, u8 *buf, loff_t regaddr, size_t count) +{ + int i, j; + struct i2c_adapter *adap; + union i2c_smbus_data data; + u8 offset_buf[MAX_BUS_WIDTH]; + struct i2c_msg msgs[2]; + int msgs_num, ret; + u8 offset; + u8 length; + + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\r\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\r\n", i2c_dev->addr_bus_width); + return -EINVAL; + } + + adap = i2c_get_adapter(i2c_dev->i2c_bus); + if (adap == NULL) { + I2C_DEV_DEBUG_ERROR("get i2c adapter %d faild.\n", i2c_dev->i2c_bus); + return -ENXIO; + } + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + msgs[0].addr = i2c_dev->i2c_addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width; + msgs[0].buf = offset_buf; + + msgs[1].addr = i2c_dev->i2c_addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len = count; + msgs[1].buf = buf; + + msgs_num = 2; + ret = i2c_transfer(adap, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer read error\r\n"); + ret = -EFAULT; + goto error_exit; + } + } else { + if (i2c_dev->addr_bus_width == WIDTH_1Byte) { + offset = regaddr & 0xFF; + if (i2c_check_functionality(adap, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { + for (j = 0; j < count; j += I2C_SMBUS_BLOCK_MAX) { + if (count - j > I2C_SMBUS_BLOCK_MAX) { + length = I2C_SMBUS_BLOCK_MAX; + } else { + length = count - j; + } + data.block[0] = length; + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_READ, + offset, I2C_SMBUS_I2C_BLOCK_DATA, &data); + if (ret) { + I2C_DEV_DEBUG_ERROR("smbus_xfer read block error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + memcpy(buf + j, data.block + 1, length); + offset += length; + } + } else { + for (j = 0; j < count; j++) { + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_READ, + offset, I2C_SMBUS_BYTE_DATA, &data); + + if (!ret) { + buf[j] = data.byte; + } else { + I2C_DEV_DEBUG_ERROR("smbus_xfer read byte error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + offset++; + } + } + } else { + I2C_DEV_DEBUG_ERROR("smbus_xfer not support addr_bus_width = %d\r\n", i2c_dev->addr_bus_width); + ret = -EINVAL; + goto error_exit; + } + } + + i2c_put_adapter(adap); + return 0; +error_exit: + i2c_put_adapter(adap); + return ret; +} + +static int transfer_write(struct platform_i2c_dev_info *i2c_dev, u8 *buf, loff_t regaddr, size_t count) +{ + int i, j; + struct i2c_adapter *adap; + union i2c_smbus_data data; + u8 offset_buf[TRANSFER_WRITE_BUFF]; + struct i2c_msg msgs[1]; + int msgs_num, ret; + u8 offset; + u8 length; + + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\r\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\r\n", i2c_dev->addr_bus_width); + return -EINVAL; + } + + memcpy(offset_buf + i2c_dev->addr_bus_width, buf, count); + + adap = i2c_get_adapter(i2c_dev->i2c_bus); + if (adap == NULL) { + I2C_DEV_DEBUG_ERROR("get i2c adapter %d faild.\n", i2c_dev->i2c_bus); + return -ENXIO; + } + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + + msgs[0].addr = i2c_dev->i2c_addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width + count; + msgs[0].buf = offset_buf; + + msgs_num = 1; + ret = i2c_transfer(adap, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer write error\r\n"); + ret = -EFAULT; + goto error_exit; + } + } else { + if (i2c_dev->addr_bus_width == WIDTH_1Byte) { + offset = regaddr & 0xFF; + if (i2c_check_functionality(adap, I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) { + for (j = 0; j < count; j += I2C_SMBUS_BLOCK_MAX) { + if (count - j > I2C_SMBUS_BLOCK_MAX) { + length = I2C_SMBUS_BLOCK_MAX; + } else { + length = count - j; + } + data.block[0] = length; + memcpy(data.block + 1, buf + j, length); + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_WRITE, + offset, I2C_SMBUS_I2C_BLOCK_DATA, &data); + if (ret) { + I2C_DEV_DEBUG_ERROR("smbus_xfer write block error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + offset += length; + } + } else { + for (j = 0; j < count; j++) { + data.byte = buf[j]; + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_WRITE, + offset, I2C_SMBUS_BYTE_DATA, &data); + if (ret) { + I2C_DEV_DEBUG_ERROR("smbus_xfer write byte error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + offset += 1; + } + } + } else { + I2C_DEV_DEBUG_ERROR("smbus_xfer not support addr_bus_width = %d\r\n", i2c_dev->addr_bus_width); + ret = -EINVAL; + goto error_exit; + } + } + + i2c_put_adapter(adap); + return 0; +error_exit: + i2c_put_adapter(adap); + return ret; +} + +static long i2c_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static int i2c_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + struct platform_i2c_dev_info *i2c_dev; + + i2c_dev = i2c_dev_arry[minor]; + if (i2c_dev == NULL) { + return -ENODEV; + } + + file->private_data = i2c_dev; + + return 0; +} + +static int i2c_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + + return 0; +} + +static int device_read(struct platform_i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, int count) +{ + int i, j, ret; + u8 tmp_offset; + u8 val[FPGA_MAX_LEN]; + u32 width, rd_len, per_len, tmp; + u32 max_per_len; + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %d invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %d invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\r\n", width); + return -EINVAL; + } + + max_per_len = i2c_dev->per_rd_len; + tmp = (width - 1) & count; + rd_len = (tmp == 0) ? count : count + width - tmp; + per_len = (rd_len > max_per_len) ? (max_per_len) : (rd_len); + + mem_clear(val, sizeof(val)); + for (i = 0; i < rd_len; i += per_len) { + ret = transfer_read(i2c_dev, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("read error.read offset = %u\r\n", (offset + i)); + return -EFAULT; + } + } + + if (width == WIDTH_1Byte) { + memcpy(buf, val, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + buf[i + j] = val[i + width - j - 1]; + } + } + } + + return 0; +} + +static int device_write(struct platform_i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 tmp_offset; + u32 width; + u8 val[FPGA_MAX_LEN]; + u32 wr_len, per_len, tmp; + u32 max_per_len; + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\r\n", width); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + + if (width == WIDTH_1Byte) { + memcpy(val, buf, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + val[i + width - j - 1] = buf[i + j]; + } + } + } + + max_per_len = i2c_dev->per_wr_len; + tmp = (width - 1) & count; + wr_len = (tmp == 0) ? count : count + width - tmp; + per_len = (wr_len > max_per_len) ? (max_per_len) : (wr_len); + + for (i = 0; i < wr_len; i += per_len) { + ret = transfer_write(i2c_dev, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("write error.offset = %u\r\n", (offset + i)); + return -EFAULT; + } + } + return 0; +} + +static ssize_t i2c_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int ret; + struct platform_i2c_dev_info *i2c_dev; + + if (count <= 0 || count > sizeof(val)) { + I2C_DEV_DEBUG_ERROR("read conut %lu , beyond max:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("can't get read private_data .\r\n"); + return -EINVAL; + } + + ret = device_read(i2c_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, (uint32_t)*offset, count); + return -EINVAL; + } + + if (copy_to_user(buf, val, count)) { + I2C_DEV_DEBUG_ERROR("copy_to_user error \r\n"); + return -EFAULT; + } else{ + *offset += count; + } + + return count; +} + +static ssize_t i2c_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int ret; + struct platform_i2c_dev_info *i2c_dev; + + if (count <= 0 || count > sizeof(val)) { + I2C_DEV_DEBUG_ERROR("write conut %lu, beyond max val:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("get write private_data error.\r\n"); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + if (copy_from_user(val, buf, count)) { + I2C_DEV_DEBUG_ERROR("copy_from_user error.\r\n"); + return -EFAULT; + } + + ret = device_write (i2c_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%llx, len:%lu.\n", + i2c_dev->name, *offset, count); + return -EINVAL; + } + + *offset += count; + return count; +} + +static loff_t i2c_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + I2C_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\r\n", offset); + ret = -EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (file->f_pos + offset < 0) { + I2C_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld.\n", + file->f_pos, offset); + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + I2C_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static const struct file_operations i2c_dev_fops = { + .owner = THIS_MODULE, + .llseek = i2c_dev_llseek, + .read = i2c_dev_read, + .write = i2c_dev_write, + .unlocked_ioctl = i2c_dev_ioctl, + .open = i2c_dev_open, + .release = i2c_dev_release, +}; + +static struct platform_i2c_dev_info * dev_match(const char *path) +{ + struct platform_i2c_dev_info *i2c_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + for (i = 0; i < MAX_I2C_DEV_NUM; i++) { + if (i2c_dev_arry[ i ] == NULL) { + continue; + } + i2c_dev = i2c_dev_arry[ i ]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", i2c_dev->name); + if (!strcmp(path, dev_name)) { + I2C_DEV_DEBUG_DMESG("get dev_name = %s, minor = %d\n", dev_name, i); + return i2c_dev; + } + } + + return NULL; +} + +int platform_i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct platform_i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("read conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_read(i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("fpga i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(platform_i2c_device_func_read); + +int platform_i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct platform_i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("write conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_write (i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(platform_i2c_device_func_write); + +static int platform_i2c_dev_probe(struct platform_device *pdev) +{ + int ret = 0; + struct platform_i2c_dev_info *i2c_dev; + struct miscdevice *misc; + platform_i2c_dev_device_t *platform_i2c_dev_device; + + i2c_dev = devm_kzalloc(&pdev->dev, sizeof(struct platform_i2c_dev_info), GFP_KERNEL); + if (!i2c_dev) { + dev_err(&pdev->dev, "devm_kzalloc error. \r\n"); + return -ENOMEM; + } + + if (pdev->dev.of_node) { + + ret += of_property_read_u32(pdev->dev.of_node, "i2c_bus", &i2c_dev->i2c_bus); + ret += of_property_read_u32(pdev->dev.of_node, "i2c_addr", &i2c_dev->i2c_addr); + ret += of_property_read_string(pdev->dev.of_node, "i2c_name", &i2c_dev->name); + ret += of_property_read_u32(pdev->dev.of_node, "data_bus_width", &i2c_dev->data_bus_width); + ret += of_property_read_u32(pdev->dev.of_node, "addr_bus_width", &i2c_dev->addr_bus_width); + ret += of_property_read_u32(pdev->dev.of_node, "per_rd_len", &i2c_dev->per_rd_len); + ret += of_property_read_u32(pdev->dev.of_node, "per_wr_len", &i2c_dev->per_wr_len); + if (ret != 0) { + dev_err(&pdev->dev, "dts config error.ret:%d.\r\n", ret); + return -ENXIO; + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + platform_i2c_dev_device = pdev->dev.platform_data; + i2c_dev->i2c_bus = platform_i2c_dev_device->i2c_bus; + i2c_dev->i2c_addr = platform_i2c_dev_device->i2c_addr; + i2c_dev->name = platform_i2c_dev_device->i2c_name; + i2c_dev->data_bus_width = platform_i2c_dev_device->data_bus_width; + i2c_dev->addr_bus_width = platform_i2c_dev_device->addr_bus_width; + i2c_dev->per_rd_len = platform_i2c_dev_device->per_rd_len; + i2c_dev->per_wr_len = platform_i2c_dev_device->per_wr_len; + } + + if ((i2c_dev->per_rd_len & (i2c_dev->data_bus_width - 1)) || (i2c_dev->per_wr_len & (i2c_dev->data_bus_width - 1))) { + dev_err(&pdev->dev, "Invalid config per_rd_len %d per_wr_len %d data bus_width %d.\r\n", i2c_dev->per_rd_len, + i2c_dev->per_wr_len, i2c_dev->data_bus_width); + return -ENXIO; + } + + misc = &i2c_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = i2c_dev->name; + misc->fops = &i2c_dev_fops; + if (misc_register(misc) != 0) { + dev_err(&pdev->dev, "register %s faild.\r\n", misc->name); + return -ENXIO; + } + + if (misc->minor >= MAX_I2C_DEV_NUM) { + dev_err(&pdev->dev, "minor number beyond the limit! is %d.\r\n", misc->minor); + misc_deregister(misc); + return -ENXIO; + } + i2c_dev_arry[misc->minor] = i2c_dev; + + dev_info(&pdev->dev, "register %u addr_bus_width %u data_bus_width device %s with %u per_rd_len %u per_wr_len success.\r\n", + i2c_dev->addr_bus_width, i2c_dev->data_bus_width, i2c_dev->name, i2c_dev->per_rd_len, i2c_dev->per_wr_len); + + return 0; +} + +static int platform_i2c_dev_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < MAX_I2C_DEV_NUM ; i++) { + if (i2c_dev_arry[i] != NULL) { + misc_deregister(&i2c_dev_arry[i]->misc); + i2c_dev_arry[i] = NULL; + } + } + + return 0; +} + +static const struct of_device_id platform_i2c_dev_of_match[] = { + { .compatible = "wb-platform-i2c-dev" }, + { }, +}; +MODULE_DEVICE_TABLE(of, platform_i2c_dev_of_match); + +static struct platform_driver wb_platform_i2c_dev_driver = { + .probe = platform_i2c_dev_probe, + .remove = platform_i2c_dev_remove, + .driver = { + .owner = THIS_MODULE, + .name = PROXY_NAME, + .of_match_table = platform_i2c_dev_of_match, + }, +}; + +static int __init wb_platform_i2c_dev_init(void) +{ + return platform_driver_register(&wb_platform_i2c_dev_driver); +} + +static void __exit wb_platform_i2c_dev_exit(void) +{ + platform_driver_unregister(&wb_platform_i2c_dev_driver); +} + +module_init(wb_platform_i2c_dev_init); +module_exit(wb_platform_i2c_dev_exit); + +MODULE_DESCRIPTION("platform i2c dev driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h new file mode 100644 index 000000000000..b5158c9fec57 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h @@ -0,0 +1,19 @@ +#ifndef __WB_PLATFORM_I2C_DEV_H__ +#define __WB_PLATFORM_I2C_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define I2C_DEV_NAME_MAX_LEN (64) + +typedef struct platform_i2c_dev_device_s { + uint32_t i2c_bus; + uint32_t i2c_addr; + char i2c_name[I2C_DEV_NAME_MAX_LEN]; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + int device_flag; +} platform_i2c_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c new file mode 100644 index 000000000000..abc4f1567aec --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c @@ -0,0 +1,111 @@ +/* + * EEPROMs access control driver for display configuration EEPROMs + * on DigsyMTC board. + * + * (C) 2011 DENX Software Engineering, Anatolij Gustschin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DEFAULT_SPI_BUS_NUM (0) +#define DEFAULT_SPI_CS_NUM (0) +#define DEFAULT_SPI_HZ (100000) + +#define GPIO_EEPROM_CS (-1) + +int g_wb_spi_93xx46_debug = 0; +int g_wb_spi_93xx46_error = 0; +int spi_bus_num = DEFAULT_SPI_BUS_NUM; +int spi_cs_gpio = GPIO_EEPROM_CS; + +module_param(g_wb_spi_93xx46_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_spi_93xx46_error, int, S_IRUGO | S_IWUSR); +module_param(spi_bus_num, int, S_IRUGO | S_IWUSR); +module_param(spi_cs_gpio, int, S_IRUGO | S_IWUSR); + +#define SPI_93xx46_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_spi_93xx46_debug) { \ + printk(KERN_INFO "[SPI-93xx46][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_93xx46_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_spi_93xx46_error) { \ + printk(KERN_ERR "[SPI-93xx46][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct eeprom_93xx46_platform_data eeprom_data = { + .flags = EE_ADDR16, + .quirks = EEPROM_93XX46_QUIRK_SINGLE_WORD_READ, +}; + +struct spi_board_info eeprom_93xx46_info __initdata = { + .modalias = "wb_93xx46", + .max_speed_hz = DEFAULT_SPI_HZ, + .bus_num = DEFAULT_SPI_BUS_NUM, + .chip_select = DEFAULT_SPI_CS_NUM, + .mode = SPI_MODE_0 | SPI_CS_HIGH, + .controller_data = (void *)GPIO_EEPROM_CS, + .platform_data = &eeprom_data, +}; + +static struct spi_device *g_spi_device; + +static int __init wb_spi_93xx46_init(void) +{ + struct spi_master *master; + + SPI_93xx46_DEBUG_VERBOSE("Enter.\n"); + + eeprom_93xx46_info.bus_num = spi_bus_num; + eeprom_93xx46_info.controller_data = (void *)(long)spi_cs_gpio; + master = spi_busnum_to_master(eeprom_93xx46_info.bus_num); + if (!master) { + SPI_93xx46_DEBUG_ERROR("get bus_num %u spi master failed.\n", + eeprom_93xx46_info.bus_num); + return -EINVAL; + } + + g_spi_device = spi_new_device(master, &eeprom_93xx46_info); + put_device(&master->dev); + if (!g_spi_device) { + SPI_93xx46_DEBUG_ERROR("register spi new device failed.\n"); + return -EPERM; + } + + if (g_wb_spi_93xx46_debug) { + dev_info(&g_spi_device->dev, "register %u bus_num spi 93xx46 eeprom success\n", + eeprom_93xx46_info.bus_num); + } + + return 0; +} + +static void __exit wb_spi_93xx46_exit(void) +{ + spi_unregister_device(g_spi_device); + + if (g_wb_spi_93xx46_debug) { + dev_info(&g_spi_device->dev, "unregister spi 93xx46 eeprom success\n"); + } + + return; +} + +module_init(wb_spi_93xx46_init); +module_exit(wb_spi_93xx46_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("create 93xx46 eeprom device"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c new file mode 100644 index 000000000000..807663592db4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c @@ -0,0 +1,583 @@ +/* + * wb_spi_dev.c + * ko to read/write spi device through /dev/XXX device + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_spi_dev.h" + +#define MAX_SPI_DEV_NUM (256) +#define MAX_RW_LEN (256) +#define MAX_NAME_SIZE (20) +#define MAX_ADDR_BUS_WIDTH (4) + +#define TRANSFER_WRITE_BUFF (1 + MAX_ADDR_BUS_WIDTH + MAX_RW_LEN) + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) + +#define OP_READ (0x3) +#define OP_WRITE (0x2) + +int g_spi_dev_debug = 0; +int g_spi_dev_error = 0; + +module_param(g_spi_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_spi_dev_error, int, S_IRUGO | S_IWUSR); + +#define SPI_DEV_DEBUG(fmt, args...) do { \ + if (g_spi_dev_debug) { \ + printk(KERN_ERR "[SPI_DEV][DEBUG][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_DEV_ERROR(fmt, args...) do { \ + if (g_spi_dev_error) { \ + printk(KERN_ERR "[SPI_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct spi_dev_info* spi_dev_arry[MAX_SPI_DEV_NUM]; + +struct spi_dev_info { + const char *name; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + struct miscdevice misc; + struct spi_device *spi_device; +}; + +static int transfer_read(struct spi_dev_info *spi_dev, u8 *buf, uint32_t regaddr, size_t count) +{ + int i, ret; + u8 tx_buf[MAX_ADDR_BUS_WIDTH + 1]; + struct spi_message m; + struct spi_transfer xfer[2]; + + i = 0; + mem_clear(tx_buf, sizeof(tx_buf)); + tx_buf[i++] = OP_READ; + + switch (spi_dev->addr_bus_width) { + case WIDTH_4Byte: + tx_buf[i++] = (regaddr >> 24) & 0xFF; + tx_buf[i++] = (regaddr >> 16) & 0xFF; + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + tx_buf[i++] = regaddr & 0xFF; + break; + default: + SPI_DEV_ERROR("Only support 1,2,4 Byte Width,but set width = %u\n", + spi_dev->addr_bus_width); + return -EINVAL; + } + + mem_clear(xfer, sizeof(xfer)); + spi_message_init(&m); + xfer[0].tx_buf = tx_buf; + xfer[0].len = spi_dev->addr_bus_width + 1; + spi_message_add_tail(&xfer[0], &m); + + xfer[1].rx_buf = buf; + xfer[1].len = count; + spi_message_add_tail(&xfer[1], &m); + + ret = spi_sync(spi_dev->spi_device, &m); + if (ret) { + SPI_DEV_ERROR("transfer_read failed, reg addr:0x%x, len:%lu, ret:%d.\n", + regaddr, count, ret); + return -EIO; + } + return 0; +} + +static int transfer_write(struct spi_dev_info *spi_dev, u8 *buf, uint32_t regaddr, size_t count) +{ + int i, ret; + u8 tx_buf[TRANSFER_WRITE_BUFF]; + struct spi_message m; + struct spi_transfer xfer ; + + i = 0; + mem_clear(tx_buf, sizeof(tx_buf)); + tx_buf[i++] = OP_WRITE; + switch (spi_dev->addr_bus_width) { + case WIDTH_4Byte: + tx_buf[i++] = (regaddr >> 24) & 0xFF; + tx_buf[i++] = (regaddr >> 16) & 0xFF; + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + tx_buf[i++] = regaddr & 0xFF; + break; + default: + SPI_DEV_ERROR("Only support 1,2,4 Byte Width, but set width = %u\n", + spi_dev->addr_bus_width); + return -EINVAL; + } + + memcpy(tx_buf + i, buf, count); + + mem_clear(&xfer, sizeof(xfer)); + spi_message_init(&m); + xfer.tx_buf = tx_buf; + xfer.len = count + i; + spi_message_add_tail(&xfer, &m); + + ret = spi_sync(spi_dev->spi_device, &m); + if (ret) { + SPI_DEV_ERROR("transfer_write failed, reg addr:0x%x, len:%lu, ret:%d.\n", + regaddr, count, ret); + return -EIO; + } + return 0; +} + +static long spi_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static int spi_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + struct spi_dev_info *spi_dev; + + if (minor >= MAX_SPI_DEV_NUM) { + SPI_DEV_ERROR("minor out of range, minor = %d.\n", minor); + return -ENODEV; + } + + spi_dev = spi_dev_arry[minor]; + if (spi_dev == NULL) { + SPI_DEV_ERROR("spi_dev is NULL, open failed, minor = %d\n", minor); + return -ENODEV; + } + + file->private_data = spi_dev; + + return 0; +} + +static int spi_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + + return 0; +} + +static int device_read(struct spi_dev_info *spi_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 val[MAX_RW_LEN]; + u32 data_width, rd_len, per_len, tmp; + u32 max_per_len; + + data_width = spi_dev->data_bus_width; + + if (offset % data_width) { + SPI_DEV_ERROR("data bus width:%d, offset:0x%x, read size %lu invalid.\n", + data_width, offset, count); + return -EINVAL; + } + + max_per_len = spi_dev->per_rd_len; + tmp = (data_width - 1) & count; + rd_len = (tmp == 0) ? count : count + data_width - tmp; + per_len = (rd_len > max_per_len) ? (max_per_len) : (rd_len); + + mem_clear(val, sizeof(val)); + for (i = 0; i < rd_len; i += per_len) { + ret = transfer_read(spi_dev, val + i, offset + i, per_len); + if (ret < 0) { + SPI_DEV_ERROR("read error.read offset = %u\n", (offset + i)); + return -EFAULT; + } + } + + if (data_width == WIDTH_1Byte) { + memcpy(buf, val, count); + } else { + for (i = 0; i < count; i += data_width) { + for (j = 0; (j < data_width) && (i + j < count); j++) { + buf[i + j] = val[i + data_width - j - 1]; + } + } + } + + return 0; +} + +static int device_write(struct spi_dev_info *spi_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u32 data_width; + u8 val[MAX_RW_LEN]; + u32 wr_len, per_len, tmp; + u32 max_per_len; + + data_width = spi_dev->data_bus_width; + + if (offset % data_width) { + SPI_DEV_ERROR("data bus width:%d, offset:0x%x, read size %lu invalid.\n", + data_width, offset, count); + return -EINVAL; + } + mem_clear(val, sizeof(val)); + + if (data_width == WIDTH_1Byte) { + memcpy(val, buf, count); + } else { + for (i = 0; i < count; i += data_width) { + for (j = 0; (j < data_width) && (i + j < count); j++) { + val[i + data_width - j - 1] = buf[i + j]; + } + } + } + + max_per_len = spi_dev->per_wr_len; + tmp = (data_width - 1) & count; + wr_len = (tmp == 0) ? count : count + data_width - tmp; + per_len = (wr_len > max_per_len) ? (max_per_len) : (wr_len); + + for (i = 0; i < wr_len; i += per_len) { + ret = transfer_write(spi_dev, val + i, offset + i, per_len); + if (ret < 0) { + SPI_DEV_ERROR("write error.offset = %u\n", (offset + i)); + return -EFAULT; + } + } + return 0; +} + +static ssize_t spi_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + u8 val[MAX_RW_LEN]; + int ret; + struct spi_dev_info *spi_dev; + + if (count <= 0 || count > sizeof(val)) { + SPI_DEV_ERROR("read conut %lu , beyond max:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + spi_dev = file->private_data; + if (spi_dev == NULL) { + SPI_DEV_ERROR("can't get read private_data .\n"); + return -EINVAL; + } + + ret = device_read(spi_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + SPI_DEV_ERROR("spi dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + spi_dev->name, (uint32_t)*offset, count); + return -EINVAL; + } + + if (copy_to_user(buf, val, count)) { + SPI_DEV_ERROR("copy_to_user error \n"); + return -EFAULT; + } else{ + *offset += count; + } + + return count; +} + +static ssize_t spi_dev_write(struct file *file, const char __user *buf, + size_t count, loff_t *offset) +{ + u8 val[MAX_RW_LEN]; + int ret; + struct spi_dev_info *spi_dev; + + if (count <= 0 || count > sizeof(val)) { + SPI_DEV_ERROR("write conut %lu, beyond max val:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + spi_dev = file->private_data; + if (spi_dev == NULL) { + SPI_DEV_ERROR("get write private_data error.\n"); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + if (copy_from_user(val, buf, count)) { + SPI_DEV_ERROR("copy_from_user error.\n"); + return -EFAULT; + } + + ret = device_write(spi_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + SPI_DEV_ERROR("spi dev write failed, dev name:%s, offset:0x%llx, len:%lu.\n", + spi_dev->name, *offset, count); + return -EINVAL; + } + + *offset += count; + return count; +} + +static loff_t spi_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + SPI_DEV_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (file->f_pos + offset < 0) { + SPI_DEV_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld.\n", + file->f_pos, offset); + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + SPI_DEV_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static const struct file_operations spi_dev_fops = { + .owner = THIS_MODULE, + .llseek = spi_dev_llseek, + .read = spi_dev_read, + .write = spi_dev_write, + .unlocked_ioctl = spi_dev_ioctl, + .open = spi_dev_open, + .release = spi_dev_release, +}; + +static struct spi_dev_info * dev_match(const char *path) +{ + struct spi_dev_info * spi_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + for (i = 0; i < MAX_SPI_DEV_NUM; i++) { + if (spi_dev_arry[ i ] == NULL) { + continue; + } + spi_dev = spi_dev_arry[ i ]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", spi_dev->name); + if (!strcmp(path, dev_name)) { + SPI_DEV_DEBUG("get dev_name = %s, minor = %d\n", dev_name, i); + return spi_dev; + } + } + + return NULL; +} + +int spi_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct spi_dev_info *spi_dev = NULL; + int ret; + + if(path == NULL){ + SPI_DEV_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + SPI_DEV_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > MAX_RW_LEN) { + SPI_DEV_ERROR("read conut %lu, beyond max:%d.\n", count, MAX_RW_LEN); + return -EINVAL; + } + + spi_dev = dev_match(path); + if (spi_dev == NULL) { + SPI_DEV_ERROR("spi_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_read(spi_dev, offset, buf, count); + if (ret < 0) { + SPI_DEV_ERROR("spi dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + spi_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(spi_device_func_read); + +int spi_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct spi_dev_info *spi_dev = NULL; + int ret; + + if(path == NULL){ + SPI_DEV_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + SPI_DEV_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > MAX_RW_LEN) { + SPI_DEV_ERROR("write conut %lu, beyond max:%d.\n", count, MAX_RW_LEN); + return -EINVAL; + } + + spi_dev = dev_match(path); + if (spi_dev == NULL) { + SPI_DEV_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_write (spi_dev, offset, buf, count); + if (ret < 0) { + SPI_DEV_ERROR("i2c dev write failed, dev name:%s, offset:0x%x, len:%lu.\n", + spi_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(spi_device_func_write); + +static int spi_dev_probe(struct spi_device *spi) +{ + int ret; + struct spi_dev_info *spi_dev; + struct miscdevice *misc; + spi_dev_device_t *spi_dev_device; + + spi_dev = devm_kzalloc(&spi->dev, sizeof(struct spi_dev_info), GFP_KERNEL); + if (!spi_dev) { + dev_err(&spi->dev, "devm_kzalloc error. \n"); + return -ENOMEM; + } + + spi_set_drvdata(spi, spi_dev); + spi_dev->spi_device = spi; + + if (spi->dev.of_node) { + + ret = 0; + ret += of_property_read_string(spi->dev.of_node, "spi_dev_name", &spi_dev->name); + ret += of_property_read_u32(spi->dev.of_node, "data_bus_width", &spi_dev->data_bus_width); + ret += of_property_read_u32(spi->dev.of_node, "addr_bus_width", &spi_dev->addr_bus_width); + ret += of_property_read_u32(spi->dev.of_node, "per_rd_len", &spi_dev->per_rd_len); + ret += of_property_read_u32(spi->dev.of_node, "per_wr_len", &spi_dev->per_wr_len); + if (ret != 0) { + dev_err(&spi->dev, "dts config error.ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (spi->dev.platform_data == NULL) { + dev_err(&spi->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + spi_dev_device = spi->dev.platform_data; + spi_dev->name = spi_dev_device->spi_dev_name; + spi_dev->data_bus_width = spi_dev_device->data_bus_width; + spi_dev->addr_bus_width = spi_dev_device->addr_bus_width; + spi_dev->per_rd_len = spi_dev_device->per_rd_len; + spi_dev->per_wr_len = spi_dev_device->per_wr_len; + } + + if ((spi_dev->per_rd_len & (spi_dev->data_bus_width - 1)) + || (spi_dev->per_wr_len & (spi_dev->data_bus_width - 1))) { + dev_err(&spi->dev, "Invalid config per_rd_len [%u] per_wr_len [%u] data bus_width [%u], addr bus width [%u].\n", + spi_dev->per_rd_len, spi_dev->per_wr_len, spi_dev->data_bus_width, spi_dev->addr_bus_width); + return -ENXIO; + } + + misc = &spi_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = spi_dev->name; + misc->fops = &spi_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&spi->dev, "register %s faild.\n", misc->name); + return -ENXIO; + } + + if (misc->minor >= MAX_SPI_DEV_NUM) { + dev_err(&spi->dev, "minor number beyond the limit! is %d.\n", misc->minor); + misc_deregister(misc); + return -ENXIO; + } + spi_dev_arry[misc->minor] = spi_dev; + + dev_info(&spi->dev, "register %u data_bus_width %u addr_bus_witdh device %s with %u per_rd_len %u per_wr_len success.\n", + spi_dev->data_bus_width, spi_dev->addr_bus_width, spi_dev->name, spi_dev->per_rd_len, spi_dev->per_wr_len); + + return 0; +} + +static int spi_dev_remove(struct spi_device *spi) +{ + int i; + + for (i = 0; i < MAX_SPI_DEV_NUM; i++) { + if (spi_dev_arry[i] != NULL) { + misc_deregister(&spi_dev_arry[i]->misc); + spi_dev_arry[i] = NULL; + } + } + return 0; +} + +static const struct of_device_id spi_dev_of_match[] = { + { .compatible = "wb-spi-dev" }, + { }, +}; + +MODULE_DEVICE_TABLE(of, spi_dev_of_match); + +static struct spi_driver spi_dev_driver = { + .driver = { + .name = "wb-spi-dev", + .of_match_table = of_match_ptr(spi_dev_of_match), + }, + .probe = spi_dev_probe, + .remove = spi_dev_remove, +}; + +module_spi_driver(spi_dev_driver); + +MODULE_DESCRIPTION("spi dev driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h new file mode 100644 index 000000000000..6afc0145638d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h @@ -0,0 +1,16 @@ +#ifndef __WB_SPI_DEV_H__ +#define __WB_SPI_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define SPI_DEV_NAME_MAX_LEN (64) + +typedef struct spi_dev_device_s { + char spi_dev_name[SPI_DEV_NAME_MAX_LEN]; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; +} spi_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c new file mode 100644 index 000000000000..16408f067be1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c @@ -0,0 +1,477 @@ +/* + * SPI master driver using generic bitbanged GPIO + * + * Copyright (C) 2006,2008 David Brownell + * Copyright (C) 2017 Linus Walleij + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/* + * This bitbanging SPI master driver should help make systems usable + * when a native hardware SPI engine is not available, perhaps because + * its driver isn't yet working or because the I/O pins it requires + * are used for other purposes. + * + * platform_device->driver_data ... points to spi_gpio + * + * spi->controller_state ... reserved for bitbang framework code + * spi->controller_data ... holds chipselect GPIO + * + * spi->master->dev.driver_data ... points to spi_gpio->bitbang + */ + +struct spi_gpio { + struct spi_bitbang bitbang; + struct spi_gpio_platform_data pdata; + struct platform_device *pdev; + struct gpio_desc *sck; + struct gpio_desc *miso; + struct gpio_desc *mosi; + struct gpio_desc **cs_gpios; + bool has_cs; +}; + +/*----------------------------------------------------------------------*/ + +/* + * Because the overhead of going through four GPIO procedure calls + * per transferred bit can make performance a problem, this code + * is set up so that you can use it in either of two ways: + * + * - The slow generic way: set up platform_data to hold the GPIO + * numbers used for MISO/MOSI/SCK, and issue procedure calls for + * each of them. This driver can handle several such busses. + * + * - The quicker inlined way: only helps with platform GPIO code + * that inlines operations for constant GPIOs. This can give + * you tight (fast!) inner loops, but each such bus needs a + * new driver. You'll define a new C file, with Makefile and + * Kconfig support; the C code can be a total of six lines: + * + * #define DRIVER_NAME "myboard_spi2" + * #define SPI_MISO_GPIO 119 + * #define SPI_MOSI_GPIO 120 + * #define SPI_SCK_GPIO 121 + * #define SPI_N_CHIPSEL 4 + * #include "spi-gpio.c" + */ + +#ifndef DRIVER_NAME +#define DRIVER_NAME "wb_spi_gpio" + +#define GENERIC_BITBANG /* vs tight inlines */ + +#endif + +/*----------------------------------------------------------------------*/ + +static inline struct spi_gpio *__pure +spi_to_spi_gpio(const struct spi_device *spi) +{ + const struct spi_bitbang *bang; + struct spi_gpio *spi_gpio; + + bang = spi_master_get_devdata(spi->master); + spi_gpio = container_of(bang, struct spi_gpio, bitbang); + return spi_gpio; +} + +static inline struct spi_gpio_platform_data *__pure +spi_to_pdata(const struct spi_device *spi) +{ + return &spi_to_spi_gpio(spi)->pdata; +} + +/* These helpers are in turn called by the bitbang inlines */ +static inline void setsck(const struct spi_device *spi, int is_on) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + gpiod_set_value_cansleep(spi_gpio->sck, is_on); +} + +static inline void setmosi(const struct spi_device *spi, int is_on) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + gpiod_set_value_cansleep(spi_gpio->mosi, is_on); +} + +static inline int getmiso(const struct spi_device *spi) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + if (spi->mode & SPI_3WIRE) + return !!gpiod_get_value_cansleep(spi_gpio->mosi); + else + return !!gpiod_get_value_cansleep(spi_gpio->miso); +} + +/* + * NOTE: this clocks "as fast as we can". It "should" be a function of the + * requested device clock. Software overhead means we usually have trouble + * reaching even one Mbit/sec (except when we can inline bitops), so for now + * we'll just assume we never need additional per-bit slowdowns. + */ +#define spidelay(nsecs) do {} while (0) + +#include "spi-bitbang-txrx.h" + +/* + * These functions can leverage inline expansion of GPIO calls to shrink + * costs for a txrx bit, often by factors of around ten (by instruction + * count). That is particularly visible for larger word sizes, but helps + * even with default 8-bit words. + * + * REVISIT overheads calling these functions for each word also have + * significant performance costs. Having txrx_bufs() calls that inline + * the txrx_word() logic would help performance, e.g. on larger blocks + * used with flash storage or MMC/SD. There should also be ways to make + * GCC be less stupid about reloading registers inside the I/O loops, + * even without inlined GPIO calls; __attribute__((hot)) on GCC 4.3? + */ + +static u32 spi_gpio_txrx_word_mode0(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_txrx_word_mode1(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_txrx_word_mode2(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits); +} + +static u32 spi_gpio_txrx_word_mode3(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits); +} + +/* + * These functions do not call setmosi or getmiso if respective flag + * (SPI_MASTER_NO_RX or SPI_MASTER_NO_TX) is set, so they are safe to + * call when such pin is not present or defined in the controller. + * A separate set of callbacks is defined to get highest possible + * speed in the generic case (when both MISO and MOSI lines are + * available), as optimiser will remove the checks when argument is + * constant. + */ + +static u32 spi_gpio_spec_txrx_word_mode0(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_spec_txrx_word_mode1(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_spec_txrx_word_mode2(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits); +} + +static u32 spi_gpio_spec_txrx_word_mode3(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits); +} + +/*----------------------------------------------------------------------*/ + +static void spi_gpio_chipselect(struct spi_device *spi, int is_active) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + /* set initial clock line level */ + if (is_active) + gpiod_set_value_cansleep(spi_gpio->sck, spi->mode & SPI_CPOL); + + /* Drive chip select line, if we have one */ + if (spi_gpio->has_cs) { + struct gpio_desc *cs = spi_gpio->cs_gpios[spi->chip_select]; + + /* SPI chip selects are normally active-low */ + gpiod_set_value_cansleep(cs, (spi->mode & SPI_CS_HIGH) ? is_active : !is_active); + } +} + +static int spi_gpio_setup(struct spi_device *spi) +{ + struct gpio_desc *cs; + int status = 0; + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + /* + * The CS GPIOs have already been + * initialized from the descriptor lookup. + */ + cs = spi_gpio->cs_gpios[spi->chip_select]; + if (!spi->controller_state && cs) + status = gpiod_direction_output(cs, + !(spi->mode & SPI_CS_HIGH)); + + if (!status) + status = spi_bitbang_setup(spi); + + return status; +} + +static int spi_gpio_set_direction(struct spi_device *spi, bool output) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + if (output) + return gpiod_direction_output(spi_gpio->mosi, 1); + else + return gpiod_direction_input(spi_gpio->mosi); +} + +static void spi_gpio_cleanup(struct spi_device *spi) +{ + spi_bitbang_cleanup(spi); +} + +/* + * It can be convenient to use this driver with pins that have alternate + * functions associated with a "native" SPI controller if a driver for that + * controller is not available, or is missing important functionality. + * + * On platforms which can do so, configure MISO with a weak pullup unless + * there's an external pullup on that signal. That saves power by avoiding + * floating signals. (A weak pulldown would save power too, but many + * drivers expect to see all-ones data as the no slave "response".) + */ +static int spi_gpio_request(struct device *dev, + struct spi_gpio *spi_gpio, + unsigned int num_chipselects, + u16 *mflags) +{ + int i; + + spi_gpio->mosi = devm_gpiod_get_optional(dev, "mosi", GPIOD_OUT_LOW); + if (IS_ERR(spi_gpio->mosi)) + return PTR_ERR(spi_gpio->mosi); + if (!spi_gpio->mosi) + /* HW configuration without MOSI pin */ + *mflags |= SPI_MASTER_NO_TX; + + spi_gpio->miso = devm_gpiod_get_optional(dev, "miso", GPIOD_IN); + if (IS_ERR(spi_gpio->miso)) + return PTR_ERR(spi_gpio->miso); + /* + * No setting SPI_MASTER_NO_RX here - if there is only a MOSI + * pin connected the host can still do RX by changing the + * direction of the line. + */ + + spi_gpio->sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW); + if (IS_ERR(spi_gpio->sck)) + return PTR_ERR(spi_gpio->sck); + + for (i = 0; i < num_chipselects; i++) { + spi_gpio->cs_gpios[i] = devm_gpiod_get_index(dev, "cs", + i, GPIOD_OUT_HIGH); + if (IS_ERR(spi_gpio->cs_gpios[i])) + return PTR_ERR(spi_gpio->cs_gpios[i]); + } + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id spi_gpio_dt_ids[] = { + { .compatible = "wb-spi-gpio" }, + {} +}; +MODULE_DEVICE_TABLE(of, spi_gpio_dt_ids); + +static int spi_gpio_probe_dt(struct platform_device *pdev) +{ + int ret; + u32 tmp; + struct spi_gpio_platform_data *pdata; + struct device_node *np = pdev->dev.of_node; + const struct of_device_id *of_id = + of_match_device(spi_gpio_dt_ids, &pdev->dev); + + if (!of_id) + return 0; + + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + ret = of_property_read_u32(np, "num-chipselects", &tmp); + if (ret < 0) { + dev_err(&pdev->dev, "num-chipselects property not found\n"); + goto error_free; + } + + pdata->num_chipselect = tmp; + pdev->dev.platform_data = pdata; + + return 1; + +error_free: + devm_kfree(&pdev->dev, pdata); + return ret; +} +#else +static inline int spi_gpio_probe_dt(struct platform_device *pdev) +{ + return 0; +} +#endif + +static int spi_gpio_probe(struct platform_device *pdev) +{ + int status; + struct spi_master *master; + struct spi_gpio *spi_gpio; + struct spi_gpio_platform_data *pdata; + u16 master_flags = 0; + bool use_of = 0; + + status = spi_gpio_probe_dt(pdev); + if (status < 0) + return status; + if (status > 0) + use_of = 1; + + pdata = dev_get_platdata(&pdev->dev); +#ifdef GENERIC_BITBANG + if (!pdata || (!use_of && !pdata->num_chipselect)) + return -ENODEV; +#endif + + master = spi_alloc_master(&pdev->dev, sizeof(*spi_gpio)); + if (!master) + return -ENOMEM; + + spi_gpio = spi_master_get_devdata(master); + + spi_gpio->cs_gpios = devm_kcalloc(&pdev->dev, + pdata->num_chipselect, + sizeof(*spi_gpio->cs_gpios), + GFP_KERNEL); + if (!spi_gpio->cs_gpios) + return -ENOMEM; + + platform_set_drvdata(pdev, spi_gpio); + + /* Determine if we have chip selects connected */ + spi_gpio->has_cs = !!pdata->num_chipselect; + + spi_gpio->pdev = pdev; + if (pdata) + spi_gpio->pdata = *pdata; + + status = spi_gpio_request(&pdev->dev, spi_gpio, + pdata->num_chipselect, &master_flags); + if (status) + return status; + + master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); + master->mode_bits = SPI_3WIRE | SPI_CPHA | SPI_CPOL | SPI_CS_HIGH; + master->flags = master_flags; + master->bus_num = pdev->id; + /* The master needs to think there is a chipselect even if not connected */ + master->num_chipselect = spi_gpio->has_cs ? pdata->num_chipselect : 1; + master->setup = spi_gpio_setup; + master->cleanup = spi_gpio_cleanup; + + if (pdev->dev.of_node) { + master->dev.of_node = pdev->dev.of_node; + } + + spi_gpio->bitbang.master = master; + spi_gpio->bitbang.chipselect = spi_gpio_chipselect; + spi_gpio->bitbang.set_line_direction = spi_gpio_set_direction; + + if ((master_flags & SPI_MASTER_NO_TX) == 0) { + spi_gpio->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_txrx_word_mode0; + spi_gpio->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_txrx_word_mode1; + spi_gpio->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_txrx_word_mode2; + spi_gpio->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_txrx_word_mode3; + } else { + spi_gpio->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_spec_txrx_word_mode0; + spi_gpio->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_spec_txrx_word_mode1; + spi_gpio->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_spec_txrx_word_mode2; + spi_gpio->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_spec_txrx_word_mode3; + } + spi_gpio->bitbang.setup_transfer = spi_bitbang_setup_transfer; + + status = spi_bitbang_start(&spi_gpio->bitbang); + if (status) + spi_master_put(master); + + return status; +} + +static int spi_gpio_remove(struct platform_device *pdev) +{ + struct spi_gpio *spi_gpio; + struct spi_gpio_platform_data *pdata; + + spi_gpio = platform_get_drvdata(pdev); + pdata = dev_get_platdata(&pdev->dev); + + /* stop() unregisters child devices too */ + spi_bitbang_stop(&spi_gpio->bitbang); + + spi_master_put(spi_gpio->bitbang.master); + + return 0; +} + +MODULE_ALIAS("platform:" DRIVER_NAME); + +static struct platform_driver spi_gpio_driver = { + .driver = { + .name = DRIVER_NAME, + .of_match_table = of_match_ptr(spi_gpio_dt_ids), + }, + .probe = spi_gpio_probe, + .remove = spi_gpio_remove, +}; +module_platform_driver(spi_gpio_driver); + +MODULE_DESCRIPTION("SPI master driver using generic bitbanged GPIO "); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c new file mode 100644 index 000000000000..e70c97b1af9d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define DEFAULT_GPIO_SCK (67) +#define DEFAULT_GPIO_MISO (32) +#define DEFAULT_GPIO_MOSI (65) +#define DEFAULT_GPIO_CS (6) +#define DEFAULT_SPI_BUS (0) + +static int sck = DEFAULT_GPIO_SCK; +module_param(sck, int, S_IRUGO | S_IWUSR); + +static int miso = DEFAULT_GPIO_MISO; +module_param(miso, int, S_IRUGO | S_IWUSR); + +static int mosi = DEFAULT_GPIO_MOSI; +module_param(mosi, int, S_IRUGO | S_IWUSR); + +static int cs = DEFAULT_GPIO_CS; +module_param(cs, int, S_IRUGO | S_IWUSR); + +static int bus = DEFAULT_SPI_BUS; +module_param(bus, int, S_IRUGO | S_IWUSR); + +static int g_wb_spi_gpio_device_debug = 0; +static int g_wb_spi_gpio_device_error = 0; + +module_param(g_wb_spi_gpio_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_spi_gpio_device_error, int, S_IRUGO | S_IWUSR); + +static char gpiod_lookup_table_devid[64]; + +#define WB_SPI_GPIO_DEVICE_VERBOSE(fmt, args...) do { \ + if (g_wb_spi_gpio_device_debug) { \ + printk(KERN_INFO "[WB_SPI_GPIO_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_SPI_GPIO_DEVICE_ERROR(fmt, args...) do { \ + if (g_wb_spi_gpio_device_error) { \ + printk(KERN_ERR "[WB_SPI_GPIO_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct gpiod_lookup_table wb_spi_gpio_table = { + .table = { + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_SCK, + "sck", GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_MOSI, + "mosi", GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_MISO, + "miso", GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_CS, + "cs", GPIO_ACTIVE_HIGH), + { }, + }, +}; + +static struct spi_gpio_platform_data spi_pdata = { + .num_chipselect = 1, +}; + +static void spi_gpio_release(struct device *dev) +{ + return; +} + +static struct platform_device wb_spi_gpio_device = { + .name = "wb_spi_gpio", + .num_resources = 0, + .id = -1, + + .dev = { + .platform_data = &spi_pdata, + .release = spi_gpio_release, + } +}; + +static void wb_spi_gpio_table_devid_name_set(void) { + int size; + + size = sizeof(gpiod_lookup_table_devid); + wb_spi_gpio_device.id = bus; + + mem_clear(gpiod_lookup_table_devid, size); + switch (bus) { + case PLATFORM_DEVID_NONE: + snprintf(gpiod_lookup_table_devid, size, "%s", wb_spi_gpio_device.name); + break; + case PLATFORM_DEVID_AUTO: + snprintf(gpiod_lookup_table_devid, size, "%s.%d.auto", wb_spi_gpio_device.name, bus); + break; + default: + snprintf(gpiod_lookup_table_devid, size, "%s.%d", wb_spi_gpio_device.name, bus); + break; + } + + wb_spi_gpio_table.dev_id = gpiod_lookup_table_devid; + return ; +} +static int __init wb_spi_gpio_device_init(void) +{ + int err; + struct gpiod_lookup *p; + + WB_SPI_GPIO_DEVICE_VERBOSE("enter!\n"); + wb_spi_gpio_table.table[0].chip_hwnum = sck; + wb_spi_gpio_table.table[1].chip_hwnum = mosi; + wb_spi_gpio_table.table[2].chip_hwnum = miso; + wb_spi_gpio_table.table[3].chip_hwnum = cs; + wb_spi_gpio_table_devid_name_set(); + WB_SPI_GPIO_DEVICE_VERBOSE("spi gpi device table bus[%d] dev id[%s]\n", bus, wb_spi_gpio_table.dev_id); + for (p = &wb_spi_gpio_table.table[0]; p->key; p++) { + WB_SPI_GPIO_DEVICE_VERBOSE("con_id:%s gpio:%d\n", p->con_id, p->chip_hwnum); + } + + gpiod_add_lookup_table(&wb_spi_gpio_table); + err = platform_device_register(&wb_spi_gpio_device); + if (err < 0) { + printk(KERN_ERR "register spi gpio device fail(%d). \n", err); + gpiod_remove_lookup_table(&wb_spi_gpio_table); + return -1; + } + + return 0; +} + +static void __exit wb_spi_gpio_device_exit(void) +{ + WB_SPI_GPIO_DEVICE_VERBOSE("enter!\n"); + platform_device_unregister(&wb_spi_gpio_device); + gpiod_remove_lookup_table(&wb_spi_gpio_table); +} + +module_init(wb_spi_gpio_device_init); +module_exit(wb_spi_gpio_device_exit); +MODULE_DESCRIPTION("SPI GPIO Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c new file mode 100644 index 000000000000..4196601f717b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include + +/* The SPI Bus number that the device is mounted on can be specified manually when this module is loaded */ +#define DEFAULT_SPI_BUS_NUM (0) +#define DEFAULT_SPI_CS_NUM (0) +#define DEFAULT_SPI_HZ (100000) + +int g_wb_spi_nor_dev_debug = 0; +int g_wb_spi_nor_dev_error = 0; +int spi_bus_num = DEFAULT_SPI_BUS_NUM; + +module_param(g_wb_spi_nor_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_spi_nor_dev_error, int, S_IRUGO | S_IWUSR); +module_param(spi_bus_num, int, S_IRUGO | S_IWUSR); + +#define SPI_NOR_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_spi_nor_dev_debug) { \ + printk(KERN_INFO "[SPI_NOR_DEV][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_NOR_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_spi_nor_dev_error) { \ + printk(KERN_ERR "[SPI_NOR_DEV][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct spi_board_info spi_nor_device_info __initdata= { + .modalias = "mx25l6405d", + .bus_num = DEFAULT_SPI_BUS_NUM, + .chip_select = DEFAULT_SPI_CS_NUM, + .max_speed_hz = 10 * 1000 * 1000, +}; + +static struct spi_device *g_spi_device; + +static int __init wb_spi_nor_dev_init(void) +{ + struct spi_master *master; + + SPI_NOR_DEV_DEBUG_VERBOSE("Enter.\n"); + + spi_nor_device_info.bus_num = spi_bus_num; + master = spi_busnum_to_master(spi_nor_device_info.bus_num); /* Get the controller according to the SPI Bus number */ + if (!master) { + SPI_NOR_DEV_DEBUG_ERROR("get bus_num %u spi master failed.\n", + spi_nor_device_info.bus_num); + return -EINVAL; + } + + g_spi_device = spi_new_device(master, &spi_nor_device_info); + put_device(&master->dev); + if (!g_spi_device) { + SPI_NOR_DEV_DEBUG_ERROR("register spi new device failed.\n"); + return -EPERM; + } + + if (g_wb_spi_nor_dev_debug) { + dev_info(&g_spi_device->dev, "register %u bus_num spi nor device success\n", + spi_nor_device_info.bus_num); + } + + return 0; +} + +static void __exit wb_spi_nor_dev_exit(void) +{ + spi_unregister_device(g_spi_device); + + if (g_wb_spi_nor_dev_debug) { + dev_info(&g_spi_device->dev, "unregister spi nor device success\n"); + } + + return; +} + +module_init(wb_spi_nor_dev_init); +module_exit(wb_spi_nor_dev_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("create spi nor device"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c new file mode 100644 index 000000000000..a709427c5b73 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c @@ -0,0 +1,1025 @@ +/* + * wb_spi_ocores.c + * ko to create ocores spi adapter + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_spi_ocores.h" + +#define SPIOC_WAIT_SCH (5) +#define SPIOC_CONF (0x00) +#define SPIOC_LSBF BIT(0) /* 0:MSB 1:LSB */ +#define SPIOC_IDLE_LOW BIT(1) +#define SPIOC_INTREN BIT(2) /* 0:enable 1:disabel */ +#define SPIOC_DIV_MASK (0xf0) +#define SPIOC_MAX_DIV (0x0E) +#define SPIOC_DIV(div) (((div) & 0x0f) << 4) + +#define SPIOC_STS (0x01) +#define SPIOC_INTR_STS BIT(0) +#define SPIOC_BUSY_STS BIT(1) +#define SPIOC_RXNUM_SHIFT (4) +#define SPIOC_RXNUM_MASK (0xf << SPIOC_RXNUM_SHIFT) +/* Just for read */ +#define SPIOC_RXNUM(reg) (((reg) & SPIOC_RXNUM_MASK) >> SPIOC_RXNUM_SHIFT ) + +#define SPIOC_TXTOT_NUM (0x02) +#define SPIOC_TXNUM(reg) ((reg) & 0x0f) +#define SPIOC_TOTNUM(reg) (((reg) & 0x0f) << 4) + +#define SPIOC_TXCTL (0x03) +#define SPIOC_CSLV BIT(0) /* 0:Deassert SPICS 1:Laeve SPICS */ +#define SPIOC_TRSTART BIT(1) +#define SPIOC_CSID_SHIFT (5) +#define SPIOC_CSID_MASK (0x7 << SPIOC_CSID_SHIFT) +/* Just for write */ +#define SPIOC_CSID(id) (((id) << SPIOC_CSID_SHIFT) & SPIOC_CSID_MASK) + +/* Just single byte */ +#define SPIOC_RX(i) ((0x4) + i) +#define SPIOC_TX(i) ((0x4) + i) + +#define SPIOC_MAX_LEN ((unsigned int)8) +#define SPIOC_TXRX_MAX_LEN ((unsigned int)7) + +#define MODEBITS (SPI_CPHA |SPI_CPOL | SPI_LSB_FIRST |SPI_CS_HIGH) + +#define REG_IO_WIDTH_1 (1) +#define REG_IO_WIDTH_2 (2) +#define REG_IO_WIDTH_4 (4) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) + +int g_spi_oc_debug = 0; +int g_spi_oc_error = 0; + +module_param(g_spi_oc_debug, int, S_IRUGO | S_IWUSR); +module_param(g_spi_oc_error, int, S_IRUGO | S_IWUSR); + +#define SPI_OC_VERBOSE(fmt, args...) do { \ + if (g_spi_oc_debug) { \ + printk(KERN_INFO "[OC_SPI_BUS][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_OC_ERROR(fmt, args...) do { \ + if (g_spi_oc_error) { \ + printk(KERN_ERR "[OC_SPI_BUS][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct spioc { + /* bitbang has to be first */ + struct spi_bitbang bitbang; + int irq; + struct completion done; + unsigned int reamin_len; + unsigned int cur_pos; + unsigned int cur_len; + const u8 *txp; + u8 *rxp; + u8 chip_select; + void (*setreg)(struct spioc *spioc, int reg, u32 value); + u32 (*getreg)(struct spioc *spioc, int reg); + uint32_t bus_num; + const char *dev_name; + uint32_t reg_access_mode; + uint32_t base_addr; + uint32_t reg_shift; + uint32_t reg_io_width; + uint32_t num_chipselect; + uint32_t freq; + uint32_t big_endian; + struct device *dev; + int transfer_busy_flag; +}; + +extern int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); + +static int oc_spi_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + SPI_OC_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + SPI_OC_ERROR("kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int oc_spi_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + SPI_OC_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + SPI_OC_ERROR("kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int oc_spi_reg_write(struct spioc *spioc, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (spioc->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(spioc->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = oc_spi_file_write(spioc->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(spioc->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(spioc->dev_name, pos, val, size); + break; + default: + SPI_OC_ERROR("err func_mode, write failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int oc_spi_reg_read(struct spioc *spioc, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (spioc->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(spioc->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = oc_spi_file_read(spioc->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(spioc->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(spioc->dev_name, pos, val, size); + break; + default: + SPI_OC_ERROR("err func_mode, read failed.\n"); + return -EINVAL; + } + + return ret; +} + +static void oc_spi_setreg_8(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_1); + return; +} + +static void oc_spi_setreg_16(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + buf_tmp[1] = (value >> 8) & 0xff; + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_spi_setreg_32(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0xff); + buf_tmp[1] = (value >> 8) & 0xff; + buf_tmp[2] = (value >> 16) & 0xff; + buf_tmp[3] = (value >> 24) & 0xff; + + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static void oc_spi_setreg_16be(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 8) & 0xff; + buf_tmp[1] = (value & 0Xff); + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_spi_setreg_32be(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 24) & 0xff; + buf_tmp[1] = (value >> 16) & 0xff; + buf_tmp[2] = (value >> 8) & 0xff; + buf_tmp[3] = (value & 0xff); + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static inline u32 oc_spi_getreg_8(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 value, pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_1); + value = buf_tmp[0]; + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + return value; +} + +static inline u32 oc_spi_getreg_16(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_spi_getreg_32(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_spi_getreg_16be(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_2 -i - 1)); + } + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_spi_getreg_32be(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_4 -i - 1)); + } + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; + +} + +static inline void oc_spi_setreg(struct spioc *spioc, int reg, u32 value) +{ + spioc->setreg(spioc, reg, value); + return; +} + +static inline u32 oc_spi_getreg(struct spioc *spioc, int reg) +{ + return spioc->getreg(spioc, reg); +} + +static int spioc_get_clkdiv(struct spioc *spioc, u32 speed) +{ + u32 rate, div; + + rate = spioc->freq; + SPI_OC_VERBOSE("clk get rate:%u, speed:%u\n", rate, speed); + /* fs = fw/((DIV+2)*2) */ + + if (speed > (rate / 4)) { + div = 0; + SPI_OC_VERBOSE("spi device speed[%u] more than a quarter of clk rate[%u].\n", + speed, rate); + return div; + } + div = (rate/(2 * speed)) - 2; + if (div > SPIOC_MAX_DIV) { + SPI_OC_ERROR("Unsupport spi device speed, div:%u.\n", div); + return -1; + } + SPI_OC_VERBOSE("DIV is:0x%x\n", div); + return div; +} + +static inline int spioc_wait_trans(struct spioc *spioc, const unsigned long timeout) +{ + unsigned long j; + unsigned int sch_time; + u8 reg; + + j = jiffies + timeout; + sch_time = SPIOC_WAIT_SCH; + while (1) { + reg = oc_spi_getreg(spioc, SPIOC_STS); + if (!(reg & SPIOC_BUSY_STS)) { + SPI_OC_VERBOSE("wait ok!\n"); + break; + } + + if (time_after(jiffies, j)) { + return -ETIMEDOUT; + } + + usleep_range(sch_time, sch_time + 1); + } + + return 0; +} + +static void spioc_chipselect(struct spi_device *spi, int is_active) +{ + struct spioc *spioc; + u8 tx_conf; + int ret; + + spioc = spi_master_get_devdata(spi->master); + spioc->transfer_busy_flag = 0; + ret = spioc_wait_trans(spioc, msecs_to_jiffies(100)); + if (ret < 0) { + SPI_OC_ERROR("spi transfer is busy, ret=%d.\n", ret); + spioc->transfer_busy_flag = 1; + return; + } + spioc->chip_select = spi->chip_select; + SPI_OC_VERBOSE("spioc_chipselect:%u, value:%d.\n", spioc->chip_select, is_active); + tx_conf = 0; + tx_conf |= SPIOC_CSID(spioc->chip_select); + if (is_active) { + tx_conf |= SPIOC_CSLV; + } + + SPI_OC_VERBOSE("tx_config:[0x%x]\n", tx_conf); + oc_spi_setreg(spioc, SPIOC_TXCTL, tx_conf); + return; +} + +static void spioc_copy_tx(struct spioc *spioc) +{ + const u8 *src; + int i; + + if (!spioc->txp) { + SPI_OC_ERROR("spioc->txp is NULL.\n"); + return; + } + + src = (u8 *)spioc->txp + spioc->cur_pos; + SPI_OC_VERBOSE("current tx len:0x%x, tx pos:[0x%x]\n", spioc->cur_len, spioc->cur_pos); + + for (i = 0; i < spioc->cur_len; i++) { + SPI_OC_VERBOSE("write %d, val:[0x%x]\n", i, src[i]); + oc_spi_setreg(spioc, SPIOC_TX(i), src[i]); + } +} + +static void spioc_copy_rx(struct spioc *spioc) +{ + u8 *dest; + int i; + + if (!spioc->rxp) { + SPI_OC_ERROR("spioc->rxp is NULL.\n"); + return; + } + + dest = (u8 *)spioc->rxp + spioc->cur_pos; + SPI_OC_VERBOSE("current rx len:0x%x, rx pos:[0x%x]\n", spioc->cur_len, spioc->cur_pos); + + for (i = 0; i < spioc->cur_len; i++) { + dest[i] = oc_spi_getreg(spioc, SPIOC_RX(i)); + SPI_OC_VERBOSE("read %d, val:[0x%x]\n", i, dest[i]); + } +} + +static int spioc_setup_transfer(struct spi_device *spi, struct spi_transfer *transfer) +{ + struct spioc *spioc; + u8 ctrl; + u32 hz; + int div; + + spioc = spi_master_get_devdata(spi->master); + ctrl = 0; + + if (spi->mode & SPI_LSB_FIRST) { + ctrl |= SPIOC_LSBF; + } + + if (!(spi->mode & SPI_CPOL)) { + ctrl |= SPIOC_IDLE_LOW; + } + + if (spioc->irq < 0) { + + ctrl |= SPIOC_INTREN; + } + + if (transfer != NULL) { + hz = transfer->speed_hz; + + if (hz == 0) { + hz = spi->max_speed_hz; + } + } else { + hz = spi->max_speed_hz; + } + + if (hz == 0) { + SPI_OC_ERROR("Unsupport zero speed.\n"); + return -EINVAL; + } + + div = spioc_get_clkdiv(spioc, hz); + if (div < 0) { + SPI_OC_ERROR("get div error, div:%d.\n", div); + return -EINVAL; + } + ctrl |= SPIOC_DIV(div); + + SPI_OC_VERBOSE("ctrl:[0x%x].\n", ctrl); + + oc_spi_setreg(spioc, SPIOC_CONF, ctrl); + return 0; +} + +static int spioc_spi_setup(struct spi_device *spi) +{ + struct spioc *spioc; + + if (!(spi->mode & SPI_CPHA)) { + SPI_OC_ERROR("Unsupport spi device mde:0x%x, SPI_CPHA must be 1.\n", spi->mode); + return -EINVAL; + } + + spioc = spi_master_get_devdata(spi->master); + if (spi->chip_select >= spioc->num_chipselect) { + SPI_OC_ERROR("Spi device chipselect:%u, more than max chipselect:%u.\n", + spi->chip_select, spioc->num_chipselect); + return -EINVAL; + } + SPI_OC_VERBOSE("Support spi device mode:0x%x, chip_select:%u.\n", + spi->mode, spi->chip_select); + return 0; +} + +static int spioc_transfer_start(struct spioc *spioc) +{ + u8 tx_conf; + int ret; + + tx_conf = oc_spi_getreg(spioc, SPIOC_TXCTL); + tx_conf |= SPIOC_TRSTART; + + SPI_OC_VERBOSE("tx_config:[0x%x]\n", tx_conf); + oc_spi_setreg(spioc, SPIOC_TXCTL, tx_conf); + + ret = spioc_wait_trans(spioc, msecs_to_jiffies(100)); + return ret; +} + +static int spioc_tx_start_one(struct spioc *spioc) +{ + unsigned int txlen; + u8 txreg; + int ret; + + if (!spioc->reamin_len) { + SPI_OC_VERBOSE("spioc txlen:[0x0]\n"); + return 0; + } + + spioc->cur_len = spioc->reamin_len > SPIOC_MAX_LEN ? SPIOC_MAX_LEN : spioc->reamin_len; + + txlen = spioc->cur_len; + spioc->reamin_len -= txlen; + SPI_OC_VERBOSE("txlen:[0x%x], tx len remain:[0x%x]\n", txlen, spioc->reamin_len); + + spioc_copy_tx(spioc); + + /* when we only send, txlen == totlen */ + txreg = SPIOC_TXNUM(txlen) | SPIOC_TOTNUM(txlen); + SPI_OC_VERBOSE("txreg:[0x%x]\n", txreg); + oc_spi_setreg(spioc, SPIOC_TXTOT_NUM, txreg); + + ret = spioc_transfer_start(spioc); + if (ret) { + SPI_OC_ERROR("spioc tx rx poll wait for transfer timeout.\n"); + return ret; + } + + if (spioc->reamin_len) { + spioc->cur_pos += txlen; + SPI_OC_VERBOSE("cur_txpos:[0x%x]\n", spioc->cur_pos); + } + + return 0; +} + +static int spioc_rx_start_one(struct spioc *spioc) +{ + unsigned int rxlen; + u8 txtnum; + int ret; + + if (!spioc->reamin_len) { + SPI_OC_VERBOSE("spioc reamin_len:[0x0]\n"); + return 0; + } + + spioc->cur_len = spioc->reamin_len > SPIOC_MAX_LEN ? SPIOC_MAX_LEN : spioc->reamin_len; + + rxlen = spioc->cur_len; + spioc->reamin_len -= rxlen; + SPI_OC_VERBOSE("rxlen:[0x%x], rx len remain:[0x%x]\n", rxlen, spioc->reamin_len); + + /* when we only receive, rxnum=totnum. txnum=0 */ + txtnum = SPIOC_TOTNUM(rxlen); + SPI_OC_VERBOSE("tx total reg:0x%x\n", txtnum); + oc_spi_setreg(spioc, SPIOC_TXTOT_NUM, txtnum); + + ret = spioc_transfer_start(spioc); + if (ret) { + SPI_OC_ERROR("spioc tx rx poll wait for transfer timeout.\n"); + return ret; + } + + spioc_copy_rx(spioc); + + if (spioc->reamin_len) { + spioc->cur_pos += rxlen; + SPI_OC_VERBOSE("cur_rxpos:[0x%x]\n", spioc->cur_pos); + } + + return 0; +} + +static int spioc_tx_rx_start_one(struct spioc *spioc) +{ + unsigned int txlen, total_len; + u8 txreg; + int ret; + + if (!spioc->reamin_len) { + SPI_OC_VERBOSE("spioc reamin_len:[0x0]\n"); + return 0; + } + + spioc->cur_len = spioc->reamin_len > SPIOC_TXRX_MAX_LEN ? SPIOC_TXRX_MAX_LEN : spioc->reamin_len; + + txlen = spioc->cur_len; + spioc->reamin_len -= txlen; + SPI_OC_VERBOSE("tx len:[0x%x], tx len remain:[0x%x]\n", txlen, spioc->reamin_len); + + spioc_copy_tx(spioc); + + total_len = 2 * txlen; /* total_len=txlen + rxlen; rxlen=txlen */ + txreg = SPIOC_TXNUM(txlen) | SPIOC_TOTNUM(total_len); + SPI_OC_VERBOSE("txreg:[0x%x]\n", txreg); + oc_spi_setreg(spioc, SPIOC_TXTOT_NUM, txreg); + + ret = spioc_transfer_start(spioc); + if (ret) { + SPI_OC_ERROR("spioc tx rx poll wait for transfer timeout.\n"); + return ret; + } + + spioc_copy_rx(spioc); + if (spioc->reamin_len) { + spioc->cur_pos += txlen; + SPI_OC_VERBOSE("cur_txrx pos:[0x%x]\n", spioc->cur_pos); + } + return 0; +} + +static int spioc_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t) +{ + struct spioc *spioc; + int ret , len; + + if(!t->len || (!t->tx_buf && !t->rx_buf)) { + SPI_OC_ERROR("params error, tx_buf and rx_buf may both NULL, transfer len:0x%x.\n", + t->len); + return 0; + } + + spioc = spi_master_get_devdata(spi->master); + if (spioc->transfer_busy_flag) { + ret = -EBUSY; + goto err; + } + + spioc->txp = t->tx_buf; + spioc->rxp = t->rx_buf; + spioc->reamin_len = t->len; + spioc->cur_len = 0; + spioc->cur_pos = 0; + len = t->len; + ret = 0; + if (spioc->irq >= 0) { + /* use interrupt driven data transfer */ + if (t->tx_buf && t->rx_buf) { + spioc_tx_rx_start_one(spioc); + wait_for_completion(&spioc->done); + } else if (t->tx_buf) { + spioc_tx_start_one(spioc); + wait_for_completion(&spioc->done); + + } else { + spioc_rx_start_one(spioc); + wait_for_completion(&spioc->done); + } + } else { + if (t->tx_buf && t->rx_buf) { + SPI_OC_VERBOSE("start tx rx, len:0x%x\n", t->len); + while (spioc->reamin_len) { + ret = spioc_tx_rx_start_one(spioc); + if (ret) { + goto err; + } + } + } else if (t->tx_buf) { + SPI_OC_VERBOSE("start tx, txlen:0x%x\n", t->len); + while (spioc->reamin_len) { + ret = spioc_tx_start_one(spioc); + if (ret) { + goto err; + } + } + } else { + SPI_OC_VERBOSE("start rx, rxlen:0x%x\n", t->len); + while (spioc->reamin_len) { + ret = spioc_rx_start_one(spioc); + if (ret) { + goto err; + } + } + } + } + SPI_OC_VERBOSE("return num: 0x%x\n", len); + return len; +err: + return ret; +} + +static irqreturn_t spioc_spi_irq(int irq, void *dev) +{ + struct spioc *spioc; + + spioc = dev; + /* gooooohi, interrupt status bit judgment is not done */ + + if (spioc->txp && spioc->rxp) { + if (!spioc->reamin_len) { + complete(&spioc->done); + } else { + spioc_tx_rx_start_one(spioc); + } + } else if (spioc->txp) { + if (!spioc->reamin_len) { + complete(&spioc->done); + } else { + spioc_tx_start_one(spioc); + } + } else if (spioc->rxp){ + if (!spioc->reamin_len) { + complete(&spioc->done); + } else { + spioc_rx_start_one(spioc); + } + } + + return IRQ_HANDLED; +} + +static int ocores_spi_config_init(struct spioc *spioc) +{ + int ret = 0; + struct device *dev; + spi_ocores_device_t *spi_ocores_device; + + dev = spioc->dev; + if (dev->of_node) { + ret += of_property_read_string(dev->of_node, "dev_name", &spioc->dev_name); + ret += of_property_read_u32(dev->of_node, "dev_base", &spioc->base_addr); + ret += of_property_read_u32(dev->of_node, "reg_shift", &spioc->reg_shift); + ret += of_property_read_u32(dev->of_node, "reg_io_width", &spioc->reg_io_width); + ret += of_property_read_u32(dev->of_node, "clock-frequency", &spioc->freq); + ret += of_property_read_u32(dev->of_node, "reg_access_mode", &spioc->reg_access_mode); + ret += of_property_read_u32(dev->of_node, "num_chipselect", &spioc->num_chipselect); + + if (ret != 0) { + SPI_OC_ERROR("dts config error, ret:%d.\n", ret); + ret = -ENXIO; + return ret; + } + } else { + if (spioc->dev->platform_data == NULL) { + SPI_OC_ERROR("platform data config error.\n"); + ret = -ENXIO; + return ret; + } + spi_ocores_device = spioc->dev->platform_data; + spioc->bus_num = spi_ocores_device->bus_num; + spioc->dev_name = spi_ocores_device->dev_name; + spioc->big_endian = spi_ocores_device->big_endian; + spioc->base_addr = spi_ocores_device->dev_base; + spioc->reg_shift = spi_ocores_device->reg_shift; + spioc->reg_io_width = spi_ocores_device->reg_io_width; + spioc->freq = spi_ocores_device->clock_frequency; + spioc->reg_access_mode = spi_ocores_device->reg_access_mode; + spioc->num_chipselect = spi_ocores_device->num_chipselect; + } + + SPI_OC_VERBOSE("name:%s, base:0x%x, reg_shift:0x%x, io_width:0x%x, clock-frequency:0x%x.\n", + spioc->dev_name, spioc->base_addr, spioc->reg_shift, spioc->reg_io_width, spioc->freq); + SPI_OC_VERBOSE("reg access mode:%u, num_chipselect:%u.\n", + spioc->reg_access_mode, spioc->num_chipselect); + return ret; +} + +static int spioc_probe(struct platform_device *pdev) +{ + struct spi_master *master; + struct spioc *spioc; + int ret; + bool be; + + ret = -1; + master = spi_alloc_master(&pdev->dev, sizeof(struct spioc)); + if (!master) { + dev_err(&pdev->dev, "Failed to alloc spi master.\n"); + goto out; + } + + spioc = spi_master_get_devdata(master); + platform_set_drvdata(pdev, spioc); + + spioc->dev = &pdev->dev; + ret = ocores_spi_config_init(spioc); + if (ret != 0) { + dev_err(spioc->dev, "Failed to get ocores spi dts config.\n"); + goto free; + } + + if (spioc->dev->of_node) { + if (of_property_read_u32(spioc->dev->of_node, "big_endian", &spioc->big_endian)) { + + be = 0; + } else { + be = spioc->big_endian; + } + } else { + be = spioc->big_endian; + } + + if (spioc->reg_io_width == 0) { + spioc->reg_io_width = 1; /* Set to default value */ + } + + if (!spioc->setreg || !spioc->getreg) { + switch (spioc->reg_io_width) { + case REG_IO_WIDTH_1: + spioc->setreg = oc_spi_setreg_8; + spioc->getreg = oc_spi_getreg_8; + break; + + case REG_IO_WIDTH_2: + spioc->setreg = be ? oc_spi_setreg_16be : oc_spi_setreg_16; + spioc->getreg = be ? oc_spi_getreg_16be : oc_spi_getreg_16; + break; + + case REG_IO_WIDTH_4: + spioc->setreg = be ? oc_spi_setreg_32be : oc_spi_setreg_32; + spioc->getreg = be ? oc_spi_getreg_32be : oc_spi_getreg_32; + break; + + default: + dev_err(spioc->dev, "Unsupported I/O width (%d)\n", spioc->reg_io_width); + ret = -EINVAL; + goto free; + } + } + + /* master state */ + master->num_chipselect = spioc->num_chipselect; + master->mode_bits = MODEBITS; + master->setup = spioc_spi_setup; + if (spioc->dev->of_node) { + master->dev.of_node = pdev->dev.of_node; + } else { + master->bus_num = spioc->bus_num; + } + + /* setup the state for the bitbang driver */ + spioc->bitbang.master = master; + spioc->bitbang.setup_transfer = spioc_setup_transfer; + spioc->bitbang.chipselect = spioc_chipselect; + spioc->bitbang.txrx_bufs = spioc_spi_txrx_bufs; + + /* gooooohi need revision */ + spioc->irq = platform_get_irq(pdev, 0); + if (spioc->irq >= 0) { + SPI_OC_VERBOSE("spi oc use irq, irq number:%d.\n", spioc->irq); + init_completion(&spioc->done); + ret = devm_request_irq(&pdev->dev, spioc->irq, spioc_spi_irq, 0, + pdev->name, spioc); + if (ret) { + dev_err(spioc->dev, "Failed to request irq:%d.\n", spioc->irq); + goto free; + } + } + + ret = spi_bitbang_start(&spioc->bitbang); + if (ret) { + dev_err(spioc->dev, "Failed to start spi bitbang, ret:%d.\n", ret); + goto free; + } + dev_info(spioc->dev, "registered spi-%d for %s with base address:0x%x success.\n", + master->bus_num, spioc->dev_name, spioc->base_addr); + + return ret; +free: + spi_master_put(master); +out: + return ret; +} + +static int spioc_remove(struct platform_device *pdev) +{ + struct spioc *spioc; + struct spi_master *master; + + spioc = platform_get_drvdata(pdev); + master = spioc->bitbang.master; + spi_bitbang_stop(&spioc->bitbang); + platform_set_drvdata(pdev, NULL); + spi_master_put(master); + + return 0; +} + +static const struct of_device_id spioc_match[] = { + { .compatible = "wb-spi-oc", }, + {}, +}; +MODULE_DEVICE_TABLE(of, spioc_match); + +static struct platform_driver spioc_driver = { + .probe = spioc_probe, + .remove = spioc_remove, + .driver = { + .name = "wb-spioc", + .owner = THIS_MODULE, + .of_match_table = spioc_match, + }, +}; + +module_platform_driver(spioc_driver); + +MODULE_DESCRIPTION("spi open core adapter driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h new file mode 100644 index 000000000000..647ff0c5f9cf --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h @@ -0,0 +1,21 @@ +#ifndef __WB_SPI_OCORES_H__ +#define __WB_SPI_OCORES_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define SPI_OCORES_DEV_NAME_MAX_LEN (64) + +typedef struct spi_ocores_device_s { + uint32_t bus_num; + uint32_t big_endian; + char dev_name[SPI_OCORES_DEV_NAME_MAX_LEN]; + uint32_t reg_access_mode; + uint32_t dev_base; + uint32_t reg_shift; + uint32_t reg_io_width; + uint32_t clock_frequency; + uint32_t num_chipselect; + int device_flag; +} spi_ocores_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c new file mode 100644 index 000000000000..da2b582443b8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c @@ -0,0 +1,282 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct dfd_irq_s { + int gpio; + int irq_type; + struct uio_info dfd_irq_info; + spinlock_t lock; + struct attribute_group attr_group; +} dfd_irq_t; + +#define DRV_NAME "uio-irq" +#define DRV_VERSION "1.0" +#define ENABLE_VAL (1) +#define DISABLE_VAL (0) + +#define DEBUG_ERR_LEVEL (0x1) +#define DEBUG_WARN_LEVEL (0x2) +#define DEBUG_INFO_LEVEL (0x4) +#define DEBUG_VER_LEVEL (0x8) + +static int debug = 0; +module_param(debug, int, S_IRUGO | S_IWUSR); +#define DEBUG_ERROR(fmt, args...) \ + do { \ + if (debug & DEBUG_ERR_LEVEL) { \ + printk(KERN_ERR "[ERR][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +#define DEBUG_WARN(fmt, args...) \ + do { \ + if (debug & DEBUG_WARN_LEVEL) { \ + printk(KERN_WARNING "[WARN][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +#define DEBUG_INFO(fmt, args...) \ + do { \ + if (debug & DEBUG_INFO_LEVEL) { \ + printk(KERN_INFO "[INFO][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +#define DEBUG_VERBOSE(fmt, args...) \ + do { \ + if (debug & DEBUG_VER_LEVEL) { \ + printk(KERN_DEBUG "[VER][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +static irqreturn_t dfd_genirq_handler(int irq, struct uio_info *dev_info) +{ + disable_irq_nosync(irq); + DEBUG_VERBOSE("handler disable irq"); + return IRQ_HANDLED; +} + +static int dfd_genirq_irqcontrol(struct uio_info *dev_info, s32 irq_on) +{ + struct irq_data *irqdata; + + irqdata = irq_get_irq_data(dev_info->irq); + + if (irqd_irq_disabled(irqdata) == !irq_on) { + DEBUG_VERBOSE("irq already disable"); + return 0; + } + if (irq_on) { + DEBUG_VERBOSE("irqcontrol enable irq"); + enable_irq(dev_info->irq); + } else { + DEBUG_VERBOSE("irqcontrol disable irq"); + disable_irq(dev_info->irq); + } + + return 0; +} + +static ssize_t set_irq_enable(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + dfd_irq_t *dfd_irq; + struct uio_info *dev_info; + unsigned long flags; + int ret, val; + + dfd_irq = dev_get_drvdata(dev); + dev_info = &dfd_irq->dfd_irq_info; + + spin_lock_irqsave(&dfd_irq->lock, flags); + + sscanf(buf, "%d", &val); + DEBUG_VERBOSE("set val:%d.\n", val); + + if ((val != ENABLE_VAL) && (val != DISABLE_VAL)) { + DEBUG_ERROR("unsupport val:%d ", val); + ret = -EINVAL; + goto fail; + } + + if (val) { + DEBUG_VERBOSE("sysfs enable irq"); + enable_irq(dev_info->irq); + } else { + DEBUG_VERBOSE("sysfs disable irq"); + disable_irq(dev_info->irq); + } + + spin_unlock_irqrestore(&dfd_irq->lock, flags); + return count; + +fail: + spin_unlock_irqrestore(&dfd_irq->lock, flags); + return ret; +} + +static DEVICE_ATTR(irq_enable, S_IWUSR, NULL, set_irq_enable); + +static struct attribute *irq_attrs[] = { + &dev_attr_irq_enable.attr, + NULL, +}; + +static struct attribute_group irq_attr_group = { + .attrs = irq_attrs, +}; + +static int dfd_irq_probe(struct platform_device *pdev) +{ + u32 gpio, irq_type, pirq_line; + int ret, ret1, ret2; + struct uio_info *dfd_irq_info; + dfd_irq_t *dfd_irq; + + dfd_irq = kzalloc(sizeof(dfd_irq_t), GFP_KERNEL); + if (!dfd_irq) { + dev_err(&pdev->dev, "dfd_irq_t kzalloc failed.\n"); + return -ENOMEM; + } + + dfd_irq_info = &dfd_irq->dfd_irq_info; + dfd_irq_info->version = "1.0"; + dfd_irq_info->name = "uio-irq"; + + /* get pirq line for x86 */ + ret1 = of_property_read_u32(pdev->dev.of_node, "pirq-line", &pirq_line); + if (!ret1) { + DEBUG_VERBOSE("use pirq-line method, pirq-line:%u", pirq_line); + dfd_irq_info->irq = pirq_line; + } + + ret2 = of_property_read_u32(pdev->dev.of_node, "gpio", &gpio); + if (!ret2 && ret1) { + dfd_irq->gpio = gpio; + gpio_request(dfd_irq->gpio, "GPIOA"); + dfd_irq_info->irq = gpio_to_irq(dfd_irq->gpio); + DEBUG_VERBOSE("use gpio:%u, irq num:%ld", gpio, dfd_irq_info->irq); + } else if (ret2 && ret1){ + ret = -ENXIO; + dev_err(&pdev->dev, "no define irq num. ret2:%d, ret1:%d.\n", ret2, ret1); + goto free_mem; + } + + ret = of_property_read_u32(pdev->dev.of_node, "irq_type", &irq_type); + if (!ret && ret1) { + DEBUG_VERBOSE("use irq_type:%u", irq_type); + dfd_irq->irq_type = irq_type; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) + irq_set_irq_type(dfd_irq_info->irq, dfd_irq->irq_type); +#else + set_irq_type(dfd_irq_info->irq, dfd_irq->irq_type); +#endif + } else if (ret && ret1){ + ret = -ENXIO; + dev_err(&pdev->dev, "no define irq type. ret:%d, ret1:%d.\n", ret, ret1); + goto free_mem; + } + + dfd_irq_info->irq_flags = IRQF_SHARED; + dfd_irq_info->handler = dfd_genirq_handler; + dfd_irq_info->irqcontrol = dfd_genirq_irqcontrol; + + if(uio_register_device(&pdev->dev, dfd_irq_info)){ + ret = -ENODEV; + dev_err(&pdev->dev, "uio register failed.\n"); + goto free_mem; + } + + spin_lock_init(&dfd_irq->lock); + + dfd_irq->attr_group = irq_attr_group; + ret = sysfs_create_group(&pdev->dev.kobj, &dfd_irq->attr_group); + if (ret != 0) { + dev_err(&pdev->dev, "sysfs_create_group failed. ret:%d.\n", ret); + goto free_mem; + } + DEBUG_VERBOSE("sysfs create group success\n"); + + platform_set_drvdata(pdev, dfd_irq); + + return 0; + +free_mem: + kfree(dfd_irq); + + return ret; +} + +static int dfd_irq_remove(struct platform_device *pdev) +{ + dfd_irq_t *dfd_irq; + struct uio_info *dfd_irq_info; + + dfd_irq = platform_get_drvdata(pdev); + dfd_irq_info = &dfd_irq->dfd_irq_info; + + uio_unregister_device(dfd_irq_info); + kfree(dfd_irq); + + sysfs_remove_group(&pdev->dev.kobj, &dfd_irq->attr_group); + + return 0; +} + +static struct of_device_id dfd_irq_match[] = { + { + .compatible = "uio-irq", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, dfd_irq_match); + +static struct platform_driver dfd_irq_driver = { + .probe = dfd_irq_probe, + .remove = dfd_irq_remove, + .driver = { + .owner = THIS_MODULE, + .name = DRV_NAME, + .of_match_table = dfd_irq_match, + }, +}; + +static int __init dfd_irq_init(void) +{ + int ret; + + ret = platform_driver_register(&dfd_irq_driver); + if (ret != 0 ) { + return ret; + } + + return 0; +} + +static void __exit dfd_irq_exit(void) +{ + platform_driver_unregister(&dfd_irq_driver); +} + +module_init(dfd_irq_init); +module_exit(dfd_irq_exit); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c new file mode 100644 index 000000000000..8c02d981843a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c @@ -0,0 +1,1038 @@ +/* + * wb_wdt.c + * ko for watchdog function + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_wdt.h" + +#define GPIO_FEED_WDT_MODE (1) +#define LOGIC_FEED_WDT_MODE (2) + +#define SYMBOL_I2C_DEV_MODE (1) +#define SYMBOL_PCIE_DEV_MODE (2) +#define SYMBOL_IO_DEV_MODE (3) +#define FILE_MODE (4) + +#define ONE_BYTE (1) + +#define WDT_OFF (0) +#define WDT_ON (1) + +#define MS_TO_S (1000) +#define MS_TO_NS (1000 * 1000) + +#define MAX_REG_VAL (255) + +extern int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); + +int g_wb_wdt_debug = 0; +int g_wb_wdt_error = 0; + +module_param(g_wb_wdt_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_wdt_error, int, S_IRUGO | S_IWUSR); + +#define WDT_VERBOSE(fmt, args...) do { \ + if (g_wb_wdt_debug) { \ + printk(KERN_INFO "[WDT][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WDT_ERROR(fmt, args...) do { \ + if (g_wb_wdt_error) { \ + printk(KERN_ERR "[WDT][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +enum { + HW_ALGO_TOGGLE, + HW_ALGO_LEVEL, +}; + +enum { + WATCHDOG_DEVICE_TYPE = 0, + HRTIMER_TYPE, + THREAD_TYPE, +}; + +typedef struct wb_wdt_priv_s { + + struct task_struct *thread; + struct hrtimer hrtimer; + ktime_t m_kt; + const char *config_dev_name; + uint8_t config_mode; + uint8_t hw_algo; + uint8_t enable_val; + uint8_t disable_val; + uint8_t enable_mask; + uint8_t priv_func_mode; + uint8_t feed_wdt_type; + uint32_t enable_reg; + uint32_t timeout_cfg_reg; + uint32_t timeleft_cfg_reg; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t timer_accuracy; + gpio_wdt_info_t gpio_wdt; + logic_wdt_info_t logic_wdt; + struct device *dev; + const struct attribute_group *sysfs_group; + uint8_t sysfs_index; + struct mutex update_lock; + struct watchdog_device wdd; +}wb_wdt_priv_t; + +static int wdt_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + WDT_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + WDT_ERROR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int wdt_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + WDT_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + WDT_ERROR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int wb_wdt_read(uint8_t mode, const char *path, + uint32_t offset, uint8_t *buf, size_t count) +{ + int ret; + + switch (mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(path, offset, buf, count); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(path, offset, buf, count); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(path, offset, buf, count); + break; + case FILE_MODE: + ret = wdt_file_read(path, offset, buf, count); + break; + default: + WDT_ERROR("mode %u error, wdt func read failed.\n", mode); + return -EINVAL; + } + + WDT_VERBOSE("wdt func read mode:%u,dev_nam:%s, offset:0x%x, read_val:0x%x, size:%lu.\n", + mode, path, offset, *buf, count); + + return ret; +} + +static int wb_wdt_write(uint8_t mode, const char *path, + uint32_t offset, uint8_t *buf, size_t count) +{ + int ret; + + switch (mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(path, offset, buf, count); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(path, offset, buf, count); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(path, offset, buf, count); + break; + case FILE_MODE: + ret = wdt_file_write(path, offset, buf, count); + break; + default: + WDT_ERROR("mode %u error, wdt func write failed.\n", mode); + return -EINVAL; + } + + WDT_VERBOSE("wdt func write mode:%u, dev_nam:%s, offset:0x%x, write_val:0x%x, size:%lu.\n", + mode, path, offset, *buf, count); + + return ret; +} + +static int wb_wdt_enable_ctrl(wb_wdt_priv_t *priv, uint8_t flag) +{ + int ret; + uint8_t val; + uint8_t ctrl_val; + + switch (flag) { + case WDT_ON: + ctrl_val = priv->enable_val; + break; + case WDT_OFF: + ctrl_val = priv->disable_val; + break; + default: + WDT_ERROR("unsupport wdt enable ctrl:%u.\n", flag); + return -EINVAL; + } + + ret = wb_wdt_read(priv->priv_func_mode, priv->config_dev_name, + priv->enable_reg, &val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "read wdt control reg error.\n"); + return ret; + } + + val &= ~priv->enable_mask; + + val |= ctrl_val & priv->enable_mask; + + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->enable_reg, &val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "write wdt control reg error.\n"); + return ret; + } + + return 0; +} + +static void wdt_hwping(wb_wdt_priv_t *priv) +{ + gpio_wdt_info_t *gpio_wdt; + logic_wdt_info_t *logic_wdt; + uint8_t tmp_val; + int ret; + + if (priv->config_mode == GPIO_FEED_WDT_MODE) { + gpio_wdt = &priv->gpio_wdt; + switch (priv->hw_algo) { + case HW_ALGO_TOGGLE: + gpio_wdt = &priv->gpio_wdt; + gpio_wdt->state = !gpio_wdt->state; + gpio_set_value_cansleep(gpio_wdt->gpio, gpio_wdt->state); + WDT_VERBOSE("gpio toggle wdt work. val:%u\n", gpio_wdt->state); + break; + case HW_ALGO_LEVEL: + gpio_wdt = &priv->gpio_wdt; + /* Pulse */ + gpio_set_value_cansleep(gpio_wdt->gpio, !gpio_wdt->active_low); + udelay(1); + gpio_set_value_cansleep(gpio_wdt->gpio, gpio_wdt->active_low); + WDT_VERBOSE("gpio level wdt work.\n"); + break; + } + } else { + logic_wdt = &priv->logic_wdt; + switch (priv->hw_algo) { + case HW_ALGO_TOGGLE: + logic_wdt->active_val = !logic_wdt->active_val; + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &logic_wdt->active_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("logic toggle wdt write failed.ret = %d\n", ret); + } + WDT_VERBOSE("logic toggle wdt work.\n"); + break; + case HW_ALGO_LEVEL: + tmp_val = !logic_wdt->active_val; + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &tmp_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("logic level wdt write first failed.ret = %d\n", ret); + } + udelay(1); + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &logic_wdt->active_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("logic level wdt write second failed.ret = %d\n", ret); + } + WDT_VERBOSE("logic level wdt work.\n"); + break; + } + } + return; +} + +static enum hrtimer_restart hrtimer_hwping(struct hrtimer *timer) +{ + wb_wdt_priv_t *priv = container_of(timer, wb_wdt_priv_t, hrtimer); + + wdt_hwping(priv); + hrtimer_forward(timer, timer->base->get_time(), priv->m_kt); + return HRTIMER_RESTART; +} + +static int thread_timer_cfg(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t accuracy; + uint8_t set_time_val; + int ret; + + dev = priv->dev; + + ret = 0; + if (dev->of_node) { + ret += of_property_read_u32(dev->of_node, "feed_time", &priv->feed_time); + if (ret != 0) { + dev_err(dev, "thread Failed to priv dts.\n"); + return -ENXIO; + } + } else { + priv->feed_time = wb_wdt_device->feed_time; + } + WDT_VERBOSE("thread priv->feed_time: %u.\n", priv->feed_time); + + hw_margin = priv->hw_margin; + feed_time = priv->feed_time; + accuracy = priv->timer_accuracy; + + if ((feed_time > (hw_margin / 2)) || (feed_time == 0)) { + dev_err(dev, "thread timer feed_time[%d] should be less than half hw_margin or zero.\n", feed_time); + return -EINVAL; + } + + set_time_val = hw_margin / accuracy; + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + dev_err(dev, "set wdt thread timer reg error.\n"); + return ret; + } + return 0; +} + +static int wdt_thread_timer(void *data) +{ + wb_wdt_priv_t *priv = data; + + while (!kthread_should_stop()) { + schedule_timeout_uninterruptible(msecs_to_jiffies(priv->feed_time)); + wdt_hwping(priv); + } + return 0; +} + +static int thread_timer_create(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct task_struct *p; + int ret; + + ret = thread_timer_cfg(priv, wb_wdt_device); + if (ret < 0) { + dev_err(priv->dev, "set wdt thread timer failed.\n"); + return ret; + } + + p = kthread_create(wdt_thread_timer, (void *)priv, "%s", "wb_wdt"); + if (!IS_ERR(p)) { + WDT_VERBOSE("timer thread create success.\n"); + priv->thread = p; + wake_up_process(p); + } else { + dev_err(priv->dev, "timer thread create failed.\n"); + return -ENXIO; + } + + ret = wb_wdt_enable_ctrl(priv, WDT_ON); + if (ret < 0) { + dev_err(priv->dev, "thread enable wdt failed.\n"); + return -ENXIO; + } + + return 0; +} + +static int hrtimer_cfg(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + struct hrtimer *hrtimer; + uint8_t set_time_val; + uint8_t hrtimer_s; + uint32_t hrtimer_ns; + int ret; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t accuracy; + uint32_t max_timeout; + + dev = priv->dev; + + ret = 0; + if (dev->of_node) { + ret += of_property_read_u32(dev->of_node, "feed_time", &priv->feed_time); + if (ret != 0) { + dev_err(dev, "hrtimer Failed to priv dts.\n"); + return -ENXIO; + } + } else { + priv->feed_time = wb_wdt_device->feed_time; + } + WDT_VERBOSE("hrtimer priv->feed_time: %u.\n", priv->feed_time); + + hrtimer = &priv->hrtimer; + hw_margin = priv->hw_margin; + feed_time = priv->feed_time; + accuracy = priv->timer_accuracy; + max_timeout = accuracy * 255; + + if (hw_margin < accuracy || hw_margin > max_timeout) { + dev_err(dev, "hrtimer_hw_margin should be between %u and %u.\n", + accuracy, max_timeout); + return -EINVAL; + } + if ((feed_time > (hw_margin / 2)) || (feed_time == 0)) { + dev_err(dev, "feed_time[%d] should be less than half hw_margin or zeor.\n", feed_time); + return -EINVAL; + } + + hrtimer_s = feed_time / MS_TO_S; + hrtimer_ns = (feed_time % MS_TO_S) * MS_TO_NS; + set_time_val = hw_margin / accuracy; + + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + dev_err(dev, "set wdt time reg error.\n"); + return ret; + } + + priv->m_kt = ktime_set(hrtimer_s, hrtimer_ns); + hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer->function = hrtimer_hwping; + hrtimer_start(hrtimer, priv->m_kt, HRTIMER_MODE_REL); + + ret = wb_wdt_enable_ctrl(priv, WDT_ON); + if (ret < 0) { + dev_err(dev, "hrtimer enable wdt failed.\n"); + return -ENXIO; + } + + return 0; +} + +static int wb_wdt_ping(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + + wdt_hwping(priv); + return 0; +} + +static int wb_wdt_start(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + int ret; + + ret = wb_wdt_enable_ctrl(priv, WDT_ON); + if (ret < 0) { + WDT_ERROR("start wdt enable failed.\n"); + return -ENXIO; + } + set_bit(WDOG_HW_RUNNING, &wdd->status); + return 0; +} + +static int wb_wdt_stop(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + int ret; + + ret = wb_wdt_enable_ctrl(priv, WDT_OFF); + if (ret < 0) { + WDT_ERROR("stop wdt enable failed.\n"); + return -ENXIO; + } + clear_bit(WDOG_HW_RUNNING, &wdd->status); + return 0; +} + +static int wb_wdt_set_timeout(struct watchdog_device *wdd, unsigned int t) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + uint32_t timeout_ms; + uint32_t accuracy; + uint8_t set_time_val; + int ret; + + accuracy = priv->timer_accuracy; + timeout_ms = t * 1000; + if (timeout_ms > accuracy * 255) { + WDT_ERROR("set wdt timeout too larger error.timeout_ms:%u\n", timeout_ms); + return -EINVAL; + } + + set_time_val = timeout_ms / accuracy; + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("set wdt timeout reg error, set_time_val:%u ret:%d\n", set_time_val, ret); + return ret; + } + wdd->timeout = t; + + return 0; +} + +static unsigned int wb_wdt_get_timeleft(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + unsigned int time_left; + uint32_t accuracy; + uint8_t get_time_val; + int ret; + + accuracy = priv->timer_accuracy; + + ret = wb_wdt_read(priv->priv_func_mode, priv->config_dev_name, + priv->timeleft_cfg_reg, &get_time_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("get wdt timeout reg error.ret:%d\n", ret); + return ret; + } + time_left = get_time_val * accuracy / MS_TO_S; + + WDT_VERBOSE("get wdt timeleft %d get_time_val %d accuracy=%d\n", + time_left, get_time_val, accuracy); + return time_left; +} + +static const struct watchdog_info wb_wdt_ident = { + .options = WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT, + .firmware_version = 0, + .identity = "CPLD Watchdog", +}; + +static const struct watchdog_ops wb_wdt_ops = { + .owner = THIS_MODULE, + .start = wb_wdt_start, + .stop = wb_wdt_stop, + .ping = wb_wdt_ping, + .set_timeout = wb_wdt_set_timeout, + .get_timeleft = wb_wdt_get_timeleft, +}; + +static int watchdog_device_cfg(wb_wdt_priv_t *priv) +{ + int ret; + uint8_t set_time_val; + + ret = wb_wdt_enable_ctrl(priv, WDT_OFF); + if (ret < 0) { + dev_err(priv->dev, "probe disable wdt failed.\n"); + return -ENXIO; + } + + set_time_val = priv->hw_margin / priv->timer_accuracy; + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "set wdt time reg error.\n"); + return ret; + } + + watchdog_set_drvdata(&priv->wdd, priv); + + priv->wdd.info = &wb_wdt_ident; + priv->wdd.ops = &wb_wdt_ops; + priv->wdd.bootstatus = 0; + priv->wdd.timeout = priv->hw_margin / MS_TO_S; + priv->wdd.min_timeout = priv->timer_accuracy / MS_TO_S; + priv->wdd.max_timeout = priv->timer_accuracy * MAX_REG_VAL / MS_TO_S; + priv->wdd.parent = priv->dev; + + watchdog_stop_on_reboot(&priv->wdd); + + ret = devm_watchdog_register_device(priv->dev, &priv->wdd); + if (ret != 0) { + dev_err(priv->dev, "cannot register watchdog device (err=%d)\n", ret); + return -ENXIO; + } + + return 0; +} + +static int logic_wdt_init(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + logic_wdt_info_t *logic_wdt; + int ret; + + dev = priv->dev; + logic_wdt = &priv->logic_wdt; + + ret = 0; + if (dev->of_node) { + ret += of_property_read_string(dev->of_node, "feed_dev_name", &logic_wdt->feed_dev_name); + ret += of_property_read_u32(dev->of_node, "feed_reg", &logic_wdt->feed_reg); + ret += of_property_read_u8(dev->of_node, "active_val", &logic_wdt->active_val); + ret += of_property_read_u8(dev->of_node, "logic_func_mode", &logic_wdt->logic_func_mode); + if (ret != 0) { + dev_err(dev, "Failed to logic_wdt dts.\n"); + return -ENXIO; + } + } else { + logic_wdt->feed_dev_name = wb_wdt_device->wdt_config_mode.logic_wdt.feed_dev_name; + logic_wdt->feed_reg = wb_wdt_device->wdt_config_mode.logic_wdt.feed_reg; + logic_wdt->active_val = wb_wdt_device->wdt_config_mode.logic_wdt.active_val; + logic_wdt->logic_func_mode = wb_wdt_device->wdt_config_mode.logic_wdt.logic_func_mode; + } + + logic_wdt->state_val = logic_wdt->active_val; + + WDT_VERBOSE("feed_dev_name:%s, feed_reg:0x%x, active_val:%u, logic_func_mode:%u\n", + logic_wdt->feed_dev_name, logic_wdt->feed_reg, + logic_wdt->active_val, logic_wdt->logic_func_mode); + + return 0; +} + +static int gpio_wdt_init(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + gpio_wdt_info_t *gpio_wdt; + enum of_gpio_flags flags; + uint32_t f = 0; + int ret; + + dev = priv->dev; + gpio_wdt = &priv->gpio_wdt; + + if (dev->of_node) { + gpio_wdt->gpio = of_get_gpio_flags(dev->of_node, 0, &flags); + } else { + gpio_wdt->gpio = wb_wdt_device->wdt_config_mode.gpio_wdt.gpio; + flags = wb_wdt_device->wdt_config_mode.gpio_wdt.flags; + } + if (!gpio_is_valid(gpio_wdt->gpio)) { + dev_err(dev, "gpio is invalid.\n"); + return gpio_wdt->gpio; + } + + gpio_wdt->active_low = flags & OF_GPIO_ACTIVE_LOW; + + if(priv->hw_algo == HW_ALGO_TOGGLE) { + f = GPIOF_IN; + } else { + f = gpio_wdt->active_low ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; + } + + ret = devm_gpio_request_one(dev, gpio_wdt->gpio, f, + dev_name(dev)); + if (ret) { + dev_err(dev, "devm_gpio_request_one failed.\n"); + return ret; + } + + gpio_wdt->state = gpio_wdt->active_low; + gpio_direction_output(gpio_wdt->gpio, gpio_wdt->state); + + WDT_VERBOSE("active_low:%d\n", gpio_wdt->active_low); + return 0; +} + +static ssize_t set_wdt_sysfs_value(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + wb_wdt_priv_t *priv = dev_get_drvdata(dev); + int ret, val; + + val = 0; + sscanf(buf, "%d", &val); + WDT_VERBOSE("set wdt, val:%d.\n", val); + + if (val < 0 || val > 255) { + WDT_ERROR("set wdt val %d failed.\n", val); + return -EINVAL; + } + + mutex_lock(&priv->update_lock); + + ret = wb_wdt_enable_ctrl(priv, val); + if (ret < 0) { + WDT_ERROR("set wdt sysfs value:%u failed.\n", val); + goto fail; + } + + WDT_VERBOSE("set wdt sysfs value:%u successed.\n", val); + mutex_unlock(&priv->update_lock); + return count; + +fail: + mutex_unlock(&priv->update_lock); + return ret; +} + +static ssize_t show_wdt_sysfs_value(struct device *dev, + struct device_attribute *da, char *buf) +{ + wb_wdt_priv_t *priv = dev_get_drvdata(dev); + uint8_t val, status; + int ret; + + mutex_lock(&priv->update_lock); + + ret = wb_wdt_read(priv->priv_func_mode, priv->config_dev_name, + priv->enable_reg, &val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "read wdt enable reg val error.\n"); + goto fail; + } + + val &= priv->enable_mask; + if (val == priv->enable_val) { + status = WDT_ON; + } else if(val == priv->disable_val) { + status = WDT_OFF; + } else { + WDT_ERROR("enable reg read val not match set val, read val:%u, mask:%u, enable_val:%u, disable_val:%u", + val, priv->enable_mask, priv->enable_val, priv->disable_val); + ret = -EIO; + goto fail; + } + + WDT_VERBOSE("read_val:%u, mask:%u, enable_val:%u, disable_val:%u, status:%u", + val, priv->enable_mask, priv->enable_val, priv->disable_val, status); + + mutex_unlock(&priv->update_lock); + return sprintf(buf, "%u\n", status); + +fail: + mutex_unlock(&priv->update_lock); + return ret; +} + +static SENSOR_DEVICE_ATTR(wdt_status, S_IRUGO | S_IWUSR, show_wdt_sysfs_value, set_wdt_sysfs_value, 0); + +static struct attribute *wdt_sysfs_attrs[] = { + &sensor_dev_attr_wdt_status.dev_attr.attr, + NULL +}; + +static const struct attribute_group wdt_sysfs_group = { + .attrs = wdt_sysfs_attrs, +}; + +struct wdt_attr_match_group { + uint8_t index; + const struct attribute_group *attr_group_ptr; +}; + +static struct wdt_attr_match_group g_wdt_attr_match[] = { + {0, &wdt_sysfs_group}, +}; + +static const struct attribute_group *wdt_get_attr_group(uint32_t index) +{ + int i; + struct wdt_attr_match_group *group; + + for (i = 0; i < ARRAY_SIZE(g_wdt_attr_match); i++) { + group = &g_wdt_attr_match[i]; + if (index == group->index) { + WDT_VERBOSE("get wdt attr, index:%u.\n", index); + return group->attr_group_ptr; + } + } + + return NULL; +} + +static int wb_wdt_probe(struct platform_device *pdev) +{ + wb_wdt_priv_t *priv; + int ret; + const char *algo; + wb_wdt_device_t *wb_wdt_device; + + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + platform_set_drvdata(pdev, priv); + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "config_dev_name", &priv->config_dev_name); + ret += of_property_read_string(pdev->dev.of_node, "hw_algo", &algo); + ret += of_property_read_u8(pdev->dev.of_node, "config_mode", &priv->config_mode); + ret += of_property_read_u8(pdev->dev.of_node, "priv_func_mode", &priv->priv_func_mode); + ret += of_property_read_u8(pdev->dev.of_node, "enable_val", &priv->enable_val); + ret += of_property_read_u8(pdev->dev.of_node, "disable_val", &priv->disable_val); + ret += of_property_read_u8(pdev->dev.of_node, "enable_mask", &priv->enable_mask); + ret += of_property_read_u32(pdev->dev.of_node, "enable_reg", &priv->enable_reg); + ret += of_property_read_u32(pdev->dev.of_node, "timeout_cfg_reg", &priv->timeout_cfg_reg); + ret += of_property_read_u32(pdev->dev.of_node,"hw_margin_ms", &priv->hw_margin); + ret += of_property_read_u8(pdev->dev.of_node,"feed_wdt_type", &priv->feed_wdt_type); + ret += of_property_read_u32(pdev->dev.of_node,"timer_accuracy", &priv->timer_accuracy); + if (ret != 0) { + dev_err(&pdev->dev, "Failed to priv dts.\n"); + return -ENXIO; + } + + priv->sysfs_index = SYSFS_NO_CFG; + of_property_read_u8(pdev->dev.of_node,"sysfs_index", &priv->sysfs_index); + + priv->timeleft_cfg_reg = priv->timeout_cfg_reg; + of_property_read_u32(pdev->dev.of_node,"timeleft_cfg_reg", &priv->timeleft_cfg_reg); + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + wb_wdt_device = pdev->dev.platform_data; + priv->config_dev_name = wb_wdt_device->config_dev_name; + algo = wb_wdt_device->hw_algo; + priv->config_mode = wb_wdt_device->config_mode; + priv->priv_func_mode = wb_wdt_device->priv_func_mode; + priv->enable_val = wb_wdt_device->enable_val; + priv->disable_val = wb_wdt_device->disable_val; + priv->enable_mask = wb_wdt_device->enable_mask; + priv->enable_reg = wb_wdt_device->enable_reg; + priv->timeout_cfg_reg = wb_wdt_device->timeout_cfg_reg; + priv->hw_margin = wb_wdt_device->hw_margin; + priv->timer_accuracy = wb_wdt_device->timer_accuracy; + priv->feed_wdt_type = wb_wdt_device->feed_wdt_type; + priv->sysfs_index = wb_wdt_device->sysfs_index; + priv->timeleft_cfg_reg = wb_wdt_device->timeleft_cfg_reg; + } + + if (!strcmp(algo, "toggle")) { + priv->hw_algo = HW_ALGO_TOGGLE; + } else if (!strcmp(algo, "level")) { + priv->hw_algo = HW_ALGO_LEVEL; + } else { + dev_err(&pdev->dev, "hw_algo config error.must be toggle or level.\n"); + return -EINVAL; + } + + WDT_VERBOSE("config_dev_name:%s, config_mode:%u, priv_func_mode:%u, enable_reg:0x%x, timeout_cfg_reg:0x%x\n", + priv->config_dev_name, priv->config_mode, priv->priv_func_mode, priv->enable_reg, priv->timeout_cfg_reg); + WDT_VERBOSE("timeout_cfg_reg:0x%x, enable_val:%u, disable_val:%u, enable_mask:%u, hw_margin:%u, feed_wdt_type:%u\n", + priv->timeleft_cfg_reg, priv->enable_val, priv->disable_val, priv->enable_mask, priv->hw_margin, priv->feed_wdt_type); + + priv->dev = &pdev->dev; + if (priv->config_mode == GPIO_FEED_WDT_MODE) { + ret = gpio_wdt_init(priv, wb_wdt_device); + if (ret < 0) { + dev_err(&pdev->dev, "init gpio mode wdt failed.\n"); + return -ENXIO; + } + } else if (priv->config_mode == LOGIC_FEED_WDT_MODE) { + ret = logic_wdt_init(priv, wb_wdt_device); + if (ret < 0) { + dev_err(&pdev->dev, "init func mode wdt failed.\n"); + return -ENXIO; + } + } else { + dev_err(&pdev->dev, "unsupport %u config_mode, dts configure error.\n", + priv->config_mode); + return -ENXIO; + } + + switch (priv->feed_wdt_type) { + case WATCHDOG_DEVICE_TYPE: + ret = watchdog_device_cfg(priv); + break; + case HRTIMER_TYPE: + ret = hrtimer_cfg(priv, wb_wdt_device); + break; + case THREAD_TYPE: + ret = thread_timer_create(priv, wb_wdt_device); + break; + default: + dev_err(&pdev->dev, "timer type %u unsupport.\n", priv->feed_wdt_type); + return -EINVAL; + } + if (ret < 0) { + dev_err(&pdev->dev, "init timer feed_wdt_type %u failed.\n", priv->feed_wdt_type); + return -ENXIO; + } + + dev_info(&pdev->dev, "register %s mode, config_mode %u, func_mode %u, %u ms overtime wdt success\n", + algo, priv->config_mode, priv->priv_func_mode, priv->hw_margin); + + if (priv->sysfs_index != SYSFS_NO_CFG) { + + priv->sysfs_group = wdt_get_attr_group(priv->sysfs_index); + if (priv->sysfs_group) { + ret = sysfs_create_group(&pdev->dev.kobj, priv->sysfs_group); + if (ret != 0) { + dev_err(&pdev->dev, "sysfs_create_group failed. ret:%d.\n", ret); + return -ENOMEM; + } + dev_info(&pdev->dev, "sysfs create group success\n"); + } else { + dev_err(&pdev->dev, "failed to find %u index wdt, return NULL.\n", priv->sysfs_index); + return -ENOMEM; + } + + mutex_init(&priv->update_lock); + + dev_info(&pdev->dev, "register %u index wdt sysfs success." ,priv->sysfs_index); + } + + return 0; +} + +static void unregister_action(struct platform_device *pdev) +{ + wb_wdt_priv_t *priv = platform_get_drvdata(pdev); + gpio_wdt_info_t *gpio_wdt; + logic_wdt_info_t *logic_wdt; + int ret; + + ret = wb_wdt_enable_ctrl(priv, WDT_OFF); + if (ret < 0) { + dev_err(&pdev->dev, "remove disable wdt failed.\n"); + } + + if (priv->sysfs_index != SYSFS_NO_CFG) { + sysfs_remove_group(&pdev->dev.kobj, priv->sysfs_group); + } + + if (priv->feed_wdt_type == HRTIMER_TYPE) { + hrtimer_cancel(&priv->hrtimer); + } else if (priv->feed_wdt_type == THREAD_TYPE) { + kthread_stop(priv->thread); + priv->thread = NULL; + } else { + WDT_VERBOSE("wdd type, do nothing.\n"); + } + + if (priv->config_mode == GPIO_FEED_WDT_MODE) { + gpio_wdt = &priv->gpio_wdt; + gpio_set_value_cansleep(gpio_wdt->gpio, !gpio_wdt->active_low); + + if (priv->hw_algo == HW_ALGO_TOGGLE) { + gpio_direction_input(gpio_wdt->gpio); + } + } else { + logic_wdt = &priv->logic_wdt; + logic_wdt->state_val = !logic_wdt->state_val; + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &logic_wdt->state_val, ONE_BYTE); + if (ret < 0) { + dev_err(&pdev->dev, "set wdt control reg error.\n"); + } + } + + return; +} + +static int wb_wdt_remove(struct platform_device *pdev) +{ + WDT_VERBOSE("enter remove wdt.\n"); + unregister_action(pdev); + dev_info(&pdev->dev, "remove wdt finish.\n"); + + return 0; +} + +static void wb_wdt_shutdown(struct platform_device *pdev) +{ + WDT_VERBOSE("enter shutdown wdt.\n"); + unregister_action(pdev); + dev_info(&pdev->dev, "shutdown wdt finish.\n"); + + return; +} + +static const struct of_device_id wb_wdt_dt_ids[] = { + { .compatible = "wb_wdt", }, + { } +}; +MODULE_DEVICE_TABLE(of, wb_wdt_dt_ids); + +static struct platform_driver wb_wdt_driver = { + .driver = { + .name = "wb_wdt", + .of_match_table = wb_wdt_dt_ids, + }, + .probe = wb_wdt_probe, + .remove = wb_wdt_remove, + .shutdown = wb_wdt_shutdown, +}; + +#ifdef CONFIG_GPIO_WATCHDOG_ARCH_INITCALL +static int __init wb_wdt_init(void) +{ + return platform_driver_register(&wb_wdt_driver); +} +arch_initcall(wb_wdt_init); +#else +module_platform_driver(wb_wdt_driver); +#endif + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("watchdog driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h new file mode 100644 index 000000000000..10c30e13f94c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h @@ -0,0 +1,46 @@ +#ifndef __WB_WDT_H__ +#define __WB_WDT_H__ + +#include + +#define SYSFS_NO_CFG (0xff) + +typedef struct gpio_wdt_info_s { + int gpio; + enum of_gpio_flags flags; + bool active_low; + bool state; +}gpio_wdt_info_t; + +typedef struct logic_wdt_info_s { + const char *feed_dev_name; + uint8_t logic_func_mode; + uint32_t feed_reg; + uint8_t active_val; + uint8_t state_val; +}logic_wdt_info_t; + +typedef struct wb_wdt_device_s { + int device_flag; + const char *config_dev_name; + uint8_t config_mode; + const char *hw_algo; + uint8_t enable_val; + uint8_t disable_val; + uint8_t enable_mask; + uint8_t priv_func_mode; + uint8_t feed_wdt_type; + uint32_t enable_reg; + uint32_t timeout_cfg_reg; + uint32_t timeleft_cfg_reg; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t timer_accuracy; + union { + gpio_wdt_info_t gpio_wdt; + logic_wdt_info_t logic_wdt; + } wdt_config_mode; + uint8_t sysfs_index; +} wb_wdt_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c new file mode 100644 index 000000000000..edc12d34b6e2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c @@ -0,0 +1,574 @@ +/* + * xdpe132g5c_i2c_drv.c + * + * This module create sysfs to set AVS and create hwmon to get out power + * through xdpe132g5c I2C address. + * + * History + * [Version] [Date] [Description] + * * v1.0 2021-09-17 Initial version + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WB_I2C_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define WB_I2C_RETRY_TIME (10) +#define WB_XDPE_I2C_PAGE_ADDR (0xff) +#define WB_XDPE_I2C_VOUT_MODE (0x40) +#define WB_XDPE_I2C_VOUT_COMMAND (0x42) +#define WB_XDPE_I2C_VOUT_PAGE (0x06) +#define WB_XDPE_VOUT_MAX_THRESHOLD ((0xFFFF * 1000L * 1000L) / (256)) +#define WB_XDPE_VOUT_MIN_THRESHOLD (0) + +static int g_wb_xdpe_debug = 0; +static int g_wb_xdpe_error = 0; + +module_param(g_wb_xdpe_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_xdpe_error, int, S_IRUGO | S_IWUSR); + +#define WB_XDPE_VERBOSE(fmt, args...) do { \ + if (g_wb_xdpe_debug) { \ + printk(KERN_INFO "[WB_XDPE][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_XDPE_ERROR(fmt, args...) do { \ + if (g_wb_xdpe_error) { \ + printk(KERN_ERR "[WB_XDPE][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct xdpe_data { + struct i2c_client *client; + struct device *hwmon_dev; + struct mutex update_lock; + long vout_max; + long vout_min; +}; + +typedef struct xdpe_vout_data_s { + u8 vout_mode; + int vout_precision; +} xdpe_vout_data_t; + +static xdpe_vout_data_t g_xdpe_vout_group[] = { + {.vout_mode = 0x18, .vout_precision = 256}, + {.vout_mode = 0x17, .vout_precision = 512}, + {.vout_mode = 0x16, .vout_precision = 1024}, + {.vout_mode = 0x15, .vout_precision = 2048}, + {.vout_mode = 0x14, .vout_precision = 4096}, +}; + +static s32 wb_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_read_byte_data(client, command); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static s32 wb_i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command, u8 value) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_write_byte_data(client, command, value); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static s32 wb_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_read_word_data(client, command); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static s32 wb_i2c_smbus_write_word_data(const struct i2c_client *client, u8 command, + u16 value) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_write_word_data(client, command, value); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static long calc_power_linear11_data(int data) +{ + s16 exponent; + s32 mantissa; + long val; + + exponent = ((s16)data) >> 11; + mantissa = ((s16)((data & 0x7ff) << 5)) >> 5; + val = mantissa; + val = val * 1000L * 1000L; + + if (exponent >= 0) { + val <<= exponent; + } else { + val >>= -exponent; + } + return val; +} + +static int read_xdpe_power_value(const struct i2c_client *client, u8 page, u8 reg, long *value) +{ + int ret, data; + + ret = wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, page); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe page%u failed, ret: %d\n", client->adapter->nr, + client->addr, page, ret); + return ret; + } + data = wb_i2c_smbus_read_word_data(client, reg); + if (data < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe page%u reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, page, reg, data); + return data; + } + *value = calc_power_linear11_data(data); + WB_XDPE_VERBOSE("%d-%04x: page%u reg: 0x%x rd_data: 0x%x, decode linear11 value: %ld\n", + client->adapter->nr, client->addr, page, reg, data, *value); + return 0; +} + +static ssize_t xdpe_power_value_show(struct device *dev, struct device_attribute *da, + char *buf) +{ + int ret, ori_page; + u16 sensor_h, sensor_l; + u8 page, reg; + struct sensor_device_attribute *attr; + struct i2c_client *client; + struct xdpe_data *data; + long value1, value2; + + data = dev_get_drvdata(dev); + client = data->client; + attr = to_sensor_dev_attr(da); + sensor_h = ((attr->index) >> 16) & 0xffff; + sensor_l = (attr->index) & 0xffff; + + mutex_lock(&data->update_lock); + + ori_page = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_PAGE_ADDR); + if (ori_page < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe origin page failed, ret: %d\n", client->adapter->nr, + client->addr, ori_page); + mutex_unlock(&data->update_lock); + return ori_page; + } + value1 = 0; + value2 = 0; + + if (sensor_h) { + page = (sensor_h >> 8) & 0xff; + reg = sensor_h & 0xff; + ret = read_xdpe_power_value(client, page, reg, &value1); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe sensor high sensor page%u reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, page, reg, ret); + goto error; + } + WB_XDPE_VERBOSE("%d-%04x: read xdpe sensor high sensor page%u reg: 0x%x success, value: %ld\n", + client->adapter->nr, client->addr, page, reg, value1); + } + + page = (sensor_l >> 8) & 0xff; + reg = sensor_l & 0xff; + ret = read_xdpe_power_value(client, page, reg, &value2); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe sensor low sensor page%u reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, page, reg, ret); + goto error; + } + WB_XDPE_VERBOSE("%d-%04x: read xdpe sensor low sensor page%u reg: 0x%x success, value: %ld\n", + client->adapter->nr, client->addr, page, reg, value2); + + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return snprintf(buf, PAGE_SIZE, "%ld\n", value1 + value2); +error: + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return ret; +} + +static int xdpe_get_vout_precision(const struct i2c_client *client, int *vout_precision) +{ + int i, vout_mode, a_size; + + vout_mode = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_VOUT_MODE); + if (vout_mode < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe vout mode reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_MODE, vout_mode); + return vout_mode; + } + + a_size = ARRAY_SIZE(g_xdpe_vout_group); + for (i = 0; i < a_size; i++) { + if (g_xdpe_vout_group[i].vout_mode == vout_mode) { + *vout_precision = g_xdpe_vout_group[i].vout_precision; + WB_XDPE_VERBOSE("%d-%04x: match, vout mode: 0x%x, precision: %d\n", + client->adapter->nr, client->addr, vout_mode, *vout_precision); + break; + } + } + if (i == a_size) { + WB_XDPE_ERROR("%d-%04x: invalid vout mode: 0x%x\n",client->adapter->nr, client->addr, + vout_mode); + return -EINVAL; + } + return 0; +} + +static ssize_t xdpe_avs_vout_show(struct device *dev, struct device_attribute *da, char *buf) +{ + int ret, ori_page, vout_cmd, vout_precision; + struct i2c_client *client; + struct xdpe_data *data; + long vout; + + client = to_i2c_client(dev); + data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + ori_page = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_PAGE_ADDR); + if (ori_page < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe origin page failed, ret: %d\n", client->adapter->nr, + client->addr, ori_page); + mutex_unlock(&data->update_lock); + return ori_page; + } + + ret = wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, WB_XDPE_I2C_VOUT_PAGE); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe avs vout page%u failed, ret: %d\n", client->adapter->nr, + client->addr, WB_XDPE_I2C_VOUT_PAGE, ret); + goto error; + } + + ret = xdpe_get_vout_precision(client, &vout_precision); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: get xdpe avs vout precision failed, ret: %d\n", + client->adapter->nr, client->addr, ret); + goto error; + } + + vout_cmd = wb_i2c_smbus_read_word_data(client, WB_XDPE_I2C_VOUT_COMMAND); + if (vout_cmd < 0) { + ret = vout_cmd; + WB_XDPE_ERROR("%d-%04x: read xdpe vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_COMMAND, ret); + goto error; + } + + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + + vout = vout_cmd * 1000L * 1000L / vout_precision; + WB_XDPE_VERBOSE("%d-%04x: vout: %ld, vout_cmd: 0x%x, precision: %d\n", client->adapter->nr, + client->addr, vout, vout_cmd, vout_precision); + return snprintf(buf, PAGE_SIZE, "%ld\n", vout); +error: + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t xdpe_avs_vout_store(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + int ret, ori_page, vout_cmd, vout_cmd_set, vout_precision; + struct i2c_client *client; + struct xdpe_data *data; + long vout, vout_max, vout_min; + + client = to_i2c_client(dev); + ret = kstrtol(buf, 10, &vout); + if (ret) { + WB_XDPE_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + data = i2c_get_clientdata(client); + vout_max = data->vout_max; + vout_min = data->vout_min; + if ((vout > vout_max) || (vout < vout_min)) { + WB_XDPE_ERROR("%d-%04x: vout value: %ld, out of range [%ld, %ld] \n", client->adapter->nr, + client->addr, vout, vout_min, vout_max); + return -EINVAL; + } + + mutex_lock(&data->update_lock); + + ori_page = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_PAGE_ADDR); + if (ori_page < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe origin page failed, ret: %d\n", client->adapter->nr, + client->addr, ori_page); + mutex_unlock(&data->update_lock); + return ori_page; + } + + ret = wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, WB_XDPE_I2C_VOUT_PAGE); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe avs vout page%u failed, ret: %d\n", client->adapter->nr, + client->addr, WB_XDPE_I2C_VOUT_PAGE, ret); + goto error; + } + + ret = xdpe_get_vout_precision(client, &vout_precision); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: get xdpe avs vout precision failed, ret: %d\n", + client->adapter->nr, client->addr, ret); + goto error; + } + + vout_cmd_set = (vout * vout_precision) / (1000L * 1000L); + if (vout_cmd_set > 0xffff) { + WB_XDPE_ERROR("%d-%04x: invalid value, vout %ld, vout_precision: %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, vout, vout_precision, vout_cmd_set); + ret = -EINVAL; + goto error; + } + ret = wb_i2c_smbus_write_word_data(client, WB_XDPE_I2C_VOUT_COMMAND, vout_cmd_set); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe vout cmd reg: 0x%x, value: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_COMMAND, vout_cmd_set, ret); + goto error; + } + + vout_cmd = wb_i2c_smbus_read_word_data(client, WB_XDPE_I2C_VOUT_COMMAND); + if (vout_cmd < 0) { + ret = vout_cmd; + WB_XDPE_ERROR("%d-%04x: read xdpe vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_COMMAND, ret); + goto error; + } + if (vout_cmd != vout_cmd_set) { + ret = -EIO; + WB_XDPE_ERROR("%d-%04x: vout cmd value check error, vout cmd read: 0x%x, vout cmd set: 0x%x\n", + client->adapter->nr, client->addr, vout_cmd, vout_cmd_set); + goto error; + + } + + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + WB_XDPE_VERBOSE("%d-%04x: set vout cmd success, vout %ld, vout_precision: %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, vout, vout_precision, vout_cmd_set); + return count; +error: + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t xdpe_avs_vout_max_show(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client; + struct xdpe_data *data; + long vout_max; + + client = to_i2c_client(dev); + data = i2c_get_clientdata(client); + vout_max = data->vout_max; + return snprintf(buf, PAGE_SIZE, "%ld\n", vout_max); +} + +static ssize_t xdpe_avs_vout_max_store(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + int ret; + struct i2c_client *client; + struct xdpe_data *data; + long vout_max; + + client = to_i2c_client(dev); + ret = kstrtol(buf, 10, &vout_max); + if (ret) { + WB_XDPE_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + WB_XDPE_VERBOSE("%d-%04x: vout max threshold: %ld", client->adapter->nr, client->addr, + vout_max); + data = i2c_get_clientdata(client); + data->vout_max = vout_max; + return count; +} + +static ssize_t xdpe_avs_vout_min_show(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client; + struct xdpe_data *data; + long vout_min; + + client = to_i2c_client(dev); + data = i2c_get_clientdata(client); + vout_min = data->vout_min; + return snprintf(buf, PAGE_SIZE, "%ld\n", vout_min); +} + +static ssize_t xdpe_avs_vout_min_store(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + int ret; + struct i2c_client *client; + struct xdpe_data *data; + long vout_min; + + client = to_i2c_client(dev); + ret = kstrtol(buf, 10, &vout_min); + if (ret) { + WB_XDPE_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + WB_XDPE_VERBOSE("%d-%04x: vout min threshold: %ld", client->adapter->nr, client->addr, + vout_min); + data = i2c_get_clientdata(client); + data->vout_min = vout_min; + return count; +} + +/* xdpe hwmon */ +static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO ,xdpe_power_value_show, NULL, 0x072c); +static SENSOR_DEVICE_ATTR(power2_input, S_IRUGO ,xdpe_power_value_show, NULL, 0x0b2c); +static SENSOR_DEVICE_ATTR(power3_input, S_IRUGO ,xdpe_power_value_show, NULL, 0x072c0b2c); + +static struct attribute *xdpe_hwmon_attrs[] = { + &sensor_dev_attr_power1_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_power3_input.dev_attr.attr, + NULL +}; +ATTRIBUTE_GROUPS(xdpe_hwmon); + +/* xdpe sysfs */ +static SENSOR_DEVICE_ATTR(avs_vout, S_IRUGO | S_IWUSR, xdpe_avs_vout_show, xdpe_avs_vout_store, 0); +static SENSOR_DEVICE_ATTR(avs_vout_max, S_IRUGO | S_IWUSR, xdpe_avs_vout_max_show, xdpe_avs_vout_max_store, 0); +static SENSOR_DEVICE_ATTR(avs_vout_min, S_IRUGO | S_IWUSR, xdpe_avs_vout_min_show, xdpe_avs_vout_min_store, 0); + +static struct attribute *xdpe132g5c_sysfs_attrs[] = { + &sensor_dev_attr_avs_vout.dev_attr.attr, + &sensor_dev_attr_avs_vout_max.dev_attr.attr, + &sensor_dev_attr_avs_vout_min.dev_attr.attr, + NULL, +}; + +static const struct attribute_group xdpe132g5c_sysfs_attrs_group = { + .attrs = xdpe132g5c_sysfs_attrs, +}; + +static int xdpe132g5c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct xdpe_data *data; + int ret; + + WB_XDPE_VERBOSE("bus: %d, addr: 0x%02x do probe.\n", client->adapter->nr, client->addr); + data = devm_kzalloc(&client->dev, sizeof(struct xdpe_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + data->client = client; + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + ret = sysfs_create_group(&client->dev.kobj, &xdpe132g5c_sysfs_attrs_group); + if (ret != 0) { + dev_err(&client->dev, "Create xdpe132g5c sysfs failed, ret: %d\n", ret); + return ret; + } + data->hwmon_dev = hwmon_device_register_with_groups(&client->dev, client->name, data, + xdpe_hwmon_groups); + if (IS_ERR(data->hwmon_dev)) { + ret = PTR_ERR(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &xdpe132g5c_sysfs_attrs_group); + dev_err(&client->dev, "Failed to register xdpe hwmon device, ret: %d\n", ret); + return ret; + } + data->vout_max = WB_XDPE_VOUT_MAX_THRESHOLD; + data->vout_min = WB_XDPE_VOUT_MIN_THRESHOLD; + dev_info(&client->dev, "xdpe132g5c probe success\n"); + return 0; +} + +static int xdpe132g5c_remove(struct i2c_client *client) +{ + struct xdpe_data *data; + + WB_XDPE_VERBOSE("bus: %d, addr: 0x%02x do remove\n", client->adapter->nr, client->addr); + data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &xdpe132g5c_sysfs_attrs_group); + return 0; +} + +static const struct i2c_device_id xdpe132g5c_id[] = { + {"wb_xdpe132g5c", 0}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, xdpe132g5c_id); + +static const struct of_device_id __maybe_unused xdpe132g5c_of_match[] = { + {.compatible = "infineon,wb_xdpe132g5c"}, + {} +}; +MODULE_DEVICE_TABLE(of, xdpe132g5c_of_match); + +static struct i2c_driver wb_xdpe132g5c_driver = { + .driver = { + .name = "wb_xdpe132g5c", + .of_match_table = of_match_ptr(xdpe132g5c_of_match), + }, + .probe = xdpe132g5c_probe, + .remove = xdpe132g5c_remove, + .id_table = xdpe132g5c_id, +}; + +module_i2c_driver(wb_xdpe132g5c_driver); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("I2C driver for Infineon XDPE132 family"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py new file mode 100755 index 000000000000..838e64f6b417 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 + +try: + import os + import json + import logging + import sys + from sonic_py_common import device_info + from sonic_platform.platform import Platform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + +PLATFORM_COMPONENTS_FILE = "platform_components.json" +CHASSIS_KEY = "chassis" +COMPONENT_KEY = "component" +FIRMWARE_KEY = "firmware" +VERSION_KEY = "version" +chassis_component_map = {} +current_chassis_component_map = {} +current_chassis = Platform().get_chassis() + + +def parse_component_section(section, component): + if not isinstance(component, dict): + logging.error("dictionary is expected: key=%s", COMPONENT_KEY) + return False + + if not component: + return False + + missing_key = None + chassis_component_map[section] = {} + + for key1, value1 in component.items(): + if not isinstance(value1, dict): + logging.error("dictionary is expected: key=%s", key1) + return False + + if value1: + if len(value1) < 1 or len(value1) > 3: + logging.error("unexpected number of records: key=%s", key1) + return False + + if FIRMWARE_KEY not in value1: + missing_key = FIRMWARE_KEY + break + + for key2, value2 in value1.items(): + if not isinstance(value2, str): + logging.error("string is expected: key=%s", key2) + return False + + chassis_component_map[section][key1] = value1 + + if missing_key is not None: + logging.error("\"%s\" key hasn't been found", missing_key) + return False + + return True + + +def parse_chassis_section(chassis): + if not isinstance(chassis, dict): + logging.error("dictionary is expected: key=%s", CHASSIS_KEY) + return False + + if not chassis: + logging.error("dictionary is empty: key=%s", CHASSIS_KEY) + return False + + if len(chassis) != 1: + logging.error("unexpected number of records: key=%s", CHASSIS_KEY) + return False + + for key, value in chassis.items(): + if not isinstance(value, dict): + logging.error("dictionary is expected: key=%s", key) + return False + + if not value: + logging.error("dictionary is empty: key=%s", key) + return False + + if COMPONENT_KEY not in value: + logging.error("\"%s\" key hasn't been found", COMPONENT_KEY) + return False + + if len(value) != 1: + logging.error("unexpected number of records: key=%s", key) + return False + + return parse_component_section(key, value[COMPONENT_KEY]) + + return False + + +def get_platform_components_path(): + PLATFORM_COMPONENTS_PATH_TEMPLATE = "/usr/share/sonic/device/{}/{}" + PLATFORM_COMPONENTS_FILE_PATH = PLATFORM_COMPONENTS_PATH_TEMPLATE.format( + device_info.get_platform(), PLATFORM_COMPONENTS_FILE) + return PLATFORM_COMPONENTS_FILE_PATH + + +def parse_platform_components(): + platform_components_path = get_platform_components_path() + with open(platform_components_path) as platform_components: + data = json.load(platform_components) + + if not isinstance(data, dict): + logging.error("dictionary is expected: key=root") + return False + + if not data: + logging.error("dictionary is empty: key=root") + return False + + if CHASSIS_KEY not in data: + logging.error("\"%s\" key hasn't been found", CHASSIS_KEY) + return False + + return parse_chassis_section(data[CHASSIS_KEY]) + + +def get_current_chassis_component_map(): + chassis_name = current_chassis.get_name() + current_chassis_component_map[chassis_name] = {} + + component_list = current_chassis.get_all_components() + for component in component_list: + component_name = component.get_name() + current_chassis_component_map[chassis_name][component_name] = component + + return current_chassis_component_map + + +def get_upgrade_dict(): + upgrade_dict = {} + firmware_version_current = "" + firmware_version_available = "" + + if not parse_platform_components(): + logging.error("Reading platform_components.json i, ion exception") + sys.exit(1) + + if not get_current_chassis_component_map(): + logging.error("Reading firmware i, ion from the driver is abnormal") + sys.exit(1) + + chassis_name = current_chassis.get_name() + diff_keys = set(chassis_component_map.keys()) ^ set(current_chassis_component_map.keys()) + if diff_keys: + logging.error("%s names mismatch: keys=%s", chassis_name, str(list(diff_keys))) + return None + + for chassis_name, component_map in current_chassis_component_map.items(): + for component_name, component in component_map.items(): + firmware_version_current = component.get_firmware_version() + if component_name in chassis_component_map[chassis_name]: + firmware_version_available = chassis_component_map[chassis_name][component_name][VERSION_KEY] + else: + logging.warning("can't find %s in %s", component_name, PLATFORM_COMPONENTS_FILE) + break + + if not os.path.exists(chassis_component_map[chassis_name][component_name][FIRMWARE_KEY]): + logging.error("%s does not exist", chassis_component_map[chassis_name][component_name][FIRMWARE_KEY]) + break + + if firmware_version_available != firmware_version_current: + upgrade_dict[component_name] = chassis_component_map[chassis_name][component_name][FIRMWARE_KEY] + + return upgrade_dict + + +def auto_upgrade(): + upgrade_result_dict = {} + chassis_name = current_chassis.get_name() + + upgrade_dict = get_upgrade_dict() + if not upgrade_dict: + logging.info("No firmware found for automatic upgrade") + return None + + component_map = current_chassis_component_map[chassis_name] + for value, path in upgrade_dict.items(): + status = component_map[value].install_firmware(path) + if status: + upgrade_result_dict[value] = "success" + logging.info("%s Upgrade Success", value) + else: + upgrade_result_dict[value] = "failed" + logging.error("%s Upgrade Failed", value) + return upgrade_result_dict + + +if __name__ == '__main__': + auto_upgrade() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py index 25874ddb8219..a0a2ccaac938 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py @@ -1,18 +1,22 @@ #!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -import click +import sys +import os import time -import traceback -from ragileutil import wait_docker, STARTMODULE, AVSUTIL -from rgutil.logutil import Logger +import syslog +import glob +import click +from platform_config import MAC_DEFAULT_PARAM +from platform_util import getSdkReg, write_sysfs, get_value, get_format_value + + +AVSCTROL_DEBUG_FILE = "/etc/.avscontrol_debug_flag" -try: - from rest.rest import BMCMessage -except ImportError: - pass +AVSCTROLERROR = 1 +AVSCTROLDEBUG = 2 -CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) -logger = Logger("AVSCONTROL", syslog=True) +debuglevel = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} class AliasedGroup(click.Group): @@ -20,72 +24,180 @@ def get_command(self, ctx, cmd_name): rv = click.Group.get_command(self, ctx, cmd_name) if rv is not None: return rv - matches = [x for x in self.list_commands(ctx) if x.startswith(cmd_name)] + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] if not matches: return None - elif len(matches) == 1: + if len(matches) == 1: return click.Group.get_command(self, ctx, matches[0]) - ctx.fail("Too many matches: %s" % ", ".join(sorted(matches))) - - -def do_avs_ctrl(): - index = 0 - url = "/xyz/openbmc_project/hostchannel/attr/MacRov" - while True: - if ( - "avscontrol_restful" in STARTMODULE - and STARTMODULE["avscontrol_restful"] == 1 - ): - try: - # for alibmc rest.py has define get_macrov_value function - get_macrov_value = getattr(BMCMessage(), "get_macrov_value", None) - if callable(get_macrov_value): - macrov_value = int(get_macrov_value()) - else: - macrov_value = int(BMCMessage().getBmcValue(url)) - if macrov_value >= 0: - break - except Exception as e: - time.sleep(2) - continue + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def avscontrol_debug(s): + if AVSCTROLDEBUG & debuglevel: + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def avscontrol_error(s): + if AVSCTROLERROR & debuglevel: + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def avserror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def avsinfo(s): + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def debug_init(): + global debuglevel + if os.path.exists(AVSCTROL_DEBUG_FILE): + debuglevel = debuglevel | AVSCTROLDEBUG | AVSCTROLERROR + else: + debuglevel = debuglevel & ~(AVSCTROLDEBUG | AVSCTROLERROR) + + +def set_avs_value_sysfs(conf, dcdc_value): + msg = "" + formula = conf.get("formula", None) + loc = conf.get("loc") + locations = glob.glob(loc) + if len(locations) == 0: + msg = "avs sysfs loc: %s not found" % loc + avscontrol_error(msg) + return False, msg + sysfs_loc = locations[0] + avscontrol_debug("set_avs_value_sysfs, loc: %s, origin dcdc value: %s, formula: %s" % + (sysfs_loc, dcdc_value, formula)) + if formula is not None: + dcdc_value = get_format_value(formula % (dcdc_value)) + wr_val = str(dcdc_value) + avscontrol_debug("set_avs_value_sysfs, write val: %s" % wr_val) + ret, log = write_sysfs(sysfs_loc, wr_val) + if ret is False: + msg = "set_avs_value_sysfs failed, msg: %s" % log + avscontrol_error(msg) + return ret, msg + + +def set_avs_value(avs_conf, dcdc_value): + set_avs_way = avs_conf.get("set_avs", {}).get("gettype") + if set_avs_way != "sysfs": + msg = "unsupport set avs value type: %s" % set_avs_way + avscontrol_error(msg) + return False, msg + ret, msg = set_avs_value_sysfs(avs_conf["set_avs"], dcdc_value) + return ret, msg + + +def get_dcdc_value(avs_conf, rov_value): + msg = "" + mac_avs_param = avs_conf.get("mac_avs_param", {}) + if rov_value not in mac_avs_param.keys(): + if avs_conf["type"] == 0: + msg = "VID:0x%x out of range, voltage regulate stop" % rov_value + avsinfo(msg) + return False, msg + dcdc_value = mac_avs_param[avs_conf["default"]] + avsinfo("VID:0x%x out of range, use default VID:0x%x" % (rov_value, dcdc_value)) + else: + dcdc_value = mac_avs_param[rov_value] + return True, dcdc_value + + +def get_rov_value_cpld(avs_conf): + cpld_avs_config = avs_conf["cpld_avs"] + return get_value(cpld_avs_config) + + +def get_rov_value_sdk(avs_conf): + name = avs_conf["sdkreg"] + ret, status = getSdkReg(name) + if ret is False: + return False, status + status = int(status, 16) + # shift operation + if avs_conf["sdktype"] != 0: + status = (status >> avs_conf["macregloc"]) & avs_conf["mask"] + macavs = status + return True, macavs + + +def doAvsCtrol_single(avs_conf): + try: + avs_name = avs_conf.get("name") + rov_source = avs_conf["rov_source"] + if rov_source == 0: + ret, rov_value = get_rov_value_cpld(avs_conf) # get rov from cpld reg else: - if AVSUTIL.mac_adj(): - break + ret, rov_value = get_rov_value_sdk(avs_conf) # get rov from sdk reg + if ret is False: + msg = "%s get rov_value failed, msg: %s" % (avs_name, rov_value) + avscontrol_error(msg) + return False, msg + avscontrol_debug("%s rov_value: 0x%x" % (avs_name, rov_value)) + ret, dcdc_value = get_dcdc_value(avs_conf, rov_value) + if ret is False: + msg = "%s get output voltage value failed, msg: %s" % (avs_name, dcdc_value) + avscontrol_error(msg) + return False, msg + ret, msg = set_avs_value(avs_conf, dcdc_value) + return ret, msg + except Exception as e: + msg = "%s avscontrol raise exception, msg: %s" % (avs_name, str(e)) + avscontrol_error(msg) + return False, msg + + +def doAvsCtrol(avs_conf): + retry_time = avs_conf.get("retry", 10) + for i in range(retry_time): + debug_init() + ret, log = doAvsCtrol_single(avs_conf) + if ret is True: + return True, log + time.sleep(1) + return False, log - index += 1 - if index >= 10: - logger.error("%%DEV_MONITOR-AVS: MAC Voltage adjust failed.") - exit(-1) - logger.info("%%AVSCONTROL success") - exit(0) +def run(): + # wait 30s for device steady + time.sleep(30) + errcnt = 0 + msg = "" + for item in MAC_DEFAULT_PARAM: + status, log = doAvsCtrol(item) + if status is False: + errcnt += 1 + msg += log -def run(interval): - while True: - try: - if wait_docker(timeout=0) == True: - time.sleep(10) # w10s - do_avs_ctrl() - time.sleep(interval) - except Exception as e: - traceback.print_exc() - print(e) + if errcnt == 0: + avsinfo("%%AVSCONTROL success") + sys.exit(0) + avserror("%%DEV_MONITOR-AVS: MAC Voltage adjust failed.") + avserror("%%DEV_MONITOR-AVS: errmsg: %s" % msg) + sys.exit(1) @click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) def main(): - """device operator""" - pass + '''device operator''' @main.command() def start(): - """start AVS control""" - logger.info("%%AVSCONTROL start") - interval = 5 - run(interval) + '''start AVS control''' + avsinfo("%%AVSCONTROL start") + run() -##device_i2c operation -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py new file mode 100755 index 000000000000..e13377b80fe9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python3 +import sys +import os +import time +import syslog +import traceback +import click +from platform_config import DEV_MONITOR_PARAM +from platform_util import io_rd, wbi2cget + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +DEVMONITOR_DEBUG_FILE = "/etc/.devmonitor_debug_flag" + +debuglevel = 0 + + +def debug_init(): + global debuglevel + if os.path.exists(DEVMONITOR_DEBUG_FILE): + debuglevel = 1 + else: + debuglevel = 0 + + +def devwarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def devcriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def deverror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def devinfo(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def devdebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if debuglevel == 1: + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class DevMonitor(): + + def getpresentstatus(self, param): + try: + ret = {} + ret["status"] = '' + gettype = param.get('gettype') + presentbit = param.get('presentbit') + okval = param.get('okval') + if gettype == "io": + io_addr = param.get('io_addr') + val = io_rd(io_addr) + if val is None: + ret["status"] = "NOT OK" + return ret + retval = val + else: + bus = param.get('bus') + loc = param.get('loc') + offset = param.get('offset') + ind, val = wbi2cget(bus, loc, offset) + if ind is not True: + ret["status"] = "NOT OK" + return ret + retval = val + val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit + if val_t != okval: + ret["status"] = "ABSENT" + else: + ret["status"] = "PRESENT" + except Exception as e: + ret["status"] = "NOT OK" + deverror("getpresentstatus error") + deverror(str(e)) + return ret + + def removeDev(self, bus, loc): + cmd = "echo 0x%02x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath): + os.system(cmd) + + def addDev(self, name, bus, loc): + if name == "lm75": + time.sleep(0.1) + cmd = "echo %s 0x%02x > /sys/bus/i2c/devices/i2c-%d/new_device" % (name, loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath) is False: + os.system(cmd) + + def checkattr(self, bus, loc, attr): + try: + attrpath = "/sys/bus/i2c/devices/%d-%04x/%s" % (bus, loc, attr) + if os.path.exists(attrpath): + return True + except Exception as e: + deverror("checkattr error") + deverror(str(e)) + return False + + def monitor(self, ret): + totalerr = 0 + for item in ret: + try: + name = item.get('name') + itemattr = '%sattr' % name + val_t = getattr(DevMonitor, itemattr, None) + if val_t == 'OK': + continue + present = item.get('present', None) + devices = item.get('device') + err_t = 0 + for item_dev in devices: + item_devattr = '%s' % (item_dev['id']) + val_t = getattr(DevMonitor, item_devattr, None) + if val_t == 'OK': + continue + devname = item_dev.get('name') + bus = item_dev.get('bus') + loc = item_dev.get('loc') + attr = item_dev.get('attr') + if self.checkattr(bus, loc, attr) is False: + err_t -= 1 + setattr(DevMonitor, item_devattr, 'NOT OK') + if present is not None: + presentstatus = self.getpresentstatus(present) + devdebuglog("%s present status:%s" % (name, presentstatus.get('status'))) + if presentstatus.get('status') == 'PRESENT': + self.removeDev(bus, loc) + time.sleep(0.1) + self.addDev(devname, bus, loc) + else: + self.removeDev(bus, loc) + time.sleep(0.1) + self.addDev(devname, bus, loc) + else: + setattr(DevMonitor, item_devattr, 'OK') + val_t = getattr(DevMonitor, item_devattr, None) + devdebuglog("%s status %s" % (item_devattr, val_t)) + if err_t == 0: + setattr(DevMonitor, itemattr, 'OK') + else: + totalerr -= 1 + setattr(DevMonitor, itemattr, 'NOT OK') + val_t = getattr(DevMonitor, itemattr, None) + devdebuglog("%s status %s" % (itemattr, val_t)) + except Exception as e: + totalerr -= 1 + deverror("monitor error") + deverror(str(e)) + return totalerr + + def psusmonitor(self): + psus_conf = DEV_MONITOR_PARAM.get('psus') + if psus_conf is None: + return 0 + psusattr = 'psusattr' + val_t = getattr(DevMonitor, psusattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(psus_conf) + if ret == 0: + setattr(DevMonitor, psusattr, 'OK') + else: + setattr(DevMonitor, psusattr, 'NOT OK') + val_t = getattr(DevMonitor, psusattr, None) + devdebuglog("psusattr:value:%s" % (val_t)) + return ret + + def fansmonitor(self): + fans_conf = DEV_MONITOR_PARAM.get('fans') + if fans_conf is None: + return 0 + fansattr = 'fansattr' + val_t = getattr(DevMonitor, fansattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(fans_conf) + if ret == 0: + setattr(DevMonitor, fansattr, 'OK') + else: + setattr(DevMonitor, fansattr, 'NOT OK') + val_t = getattr(DevMonitor, fansattr, None) + devdebuglog("fansattr:value:%s" % (val_t)) + return ret + + def slotsmonitor(self): + slots_conf = DEV_MONITOR_PARAM.get('slots') + if slots_conf is None: + return 0 + slotsattr = 'slotsattr' + val_t = getattr(DevMonitor, slotsattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(slots_conf) + if ret == 0: + setattr(DevMonitor, slotsattr, 'OK') + else: + setattr(DevMonitor, slotsattr, 'NOT OK') + val_t = getattr(DevMonitor, slotsattr, None) + devdebuglog("slotsattr:value:%s" % (val_t)) + return ret + + def othersmonitor(self): + others_conf = DEV_MONITOR_PARAM.get('others') + if others_conf is None: + return 0 + othersattr = 'othersattr' + val_t = getattr(DevMonitor, othersattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(others_conf) + if ret == 0: + setattr(DevMonitor, othersattr, 'OK') + else: + setattr(DevMonitor, othersattr, 'NOT OK') + val_t = getattr(DevMonitor, othersattr, None) + devdebuglog("othersattr:value:%s" % (val_t)) + return ret + + +def doDevMonitor(devMonitor): + ret_t = 0 + ret_t += devMonitor.psusmonitor() + ret_t += devMonitor.fansmonitor() + ret_t += devMonitor.slotsmonitor() + ret_t += devMonitor.othersmonitor() + return ret_t + + +def run(interval, devMonitor): + # devMonitor.devattrinit() + while True: + try: + debug_init() + ret = doDevMonitor(devMonitor) + except Exception as e: + traceback.print_exc() + deverror(str(e)) + ret = -1 + if ret == 0: + time.sleep(5) + devinfo("dev_monitor finished!") + sys.exit(0) + time.sleep(interval) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''device operator''' + + +@main.command() +def start(): + '''start device monitor''' + devinfo("dev_monitor start") + devMonitor = DevMonitor() + interval = DEV_MONITOR_PARAM.get('polling_time', 10) + run(interval, devMonitor) + + +@main.command() +def stop(): + '''stop device monitor ''' + devinfo("stop") + + +# device_i2c operation +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py deleted file mode 100755 index a30dd7d86a41..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py +++ /dev/null @@ -1,327 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- - -import click -import os -import time -import subprocess -from ragileconfig import * -from ragileutil import rgpciwr, rgi2cset, io_wr -from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe - -CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) - -class AliasedGroup(click.Group): - def get_command(self, ctx, cmd_name): - rv = click.Group.get_command(self, ctx, cmd_name) - if rv is not None: - return rv - matches = [x for x in self.list_commands(ctx) - if x.startswith(cmd_name)] - if not matches: - return None - elif len(matches) == 1: - return click.Group.get_command(self, ctx, matches[0]) - ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) - -def log_os_system(cmd): - u'''execute shell command''' - status, output = getstatusoutput_noshell(cmd) - if status: - print(output) - return status, output - -def write_sysfs_value(reg_name, value): - u'''write sysfs file''' - mb_reg_file = "/sys/bus/i2c/devices/" + reg_name - if (not os.path.isfile(mb_reg_file)): - print(mb_reg_file, 'not found !') - return False - try: - with open(mb_reg_file, 'w') as fd: - fd.write(value) - except Exception as error: - return False - return True - -def check_driver(): - u'''whether there is driver start with rg''' - status, output = getstatusoutput_noshell_pipe(["lsmod"], ["grep", "rg"], ["wc", "-l"]) - #System execution error - if status: - return False - if output.isdigit() and int(output) > 0: - return True - else: - return False - -def get_pid(name): - ret = [] - for dirname in os.listdir('/proc'): - if dirname == 'curproc': - continue - try: - with open('/proc/{}/cmdline'.format(dirname), mode='r') as fd: - content = fd.read() - except Exception: - continue - if name in content: - ret.append(dirname) - return ret - -def start_avs_ctrl(): - cmd = ["avscontrol.py", "start"] - rets = get_pid("avscontrol.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def start_fan_ctrl(): - if STARTMODULE['fancontrol'] == 1: - cmd = ["fancontrol.py", "start"] - rets = get_pid("fancontrol.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def starthal_fanctrl(): - if STARTMODULE.get('hal_fanctrl',0) == 1: - cmd = ["hal_fanctrl.py", "start"] - rets = get_pid("hal_fanctrl.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def starthal_ledctrl(): - if STARTMODULE.get('hal_ledctrl',0) == 1: - cmd = ["hal_ledctrl.py", "start"] - rets = get_pid("hal_ledctrl.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def start_slot_monitor(): - if STARTMODULE.get('slot_monitor',0) == 1: - cmd = ["slot_monitor.py", "start"] - rets = get_pid("slot_monitor.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def stop_fan_ctrl(): - u'''disable fan timer service''' - if STARTMODULE['fancontrol'] == 1: - rets = get_pid("fancontrol.py") # - for ret in rets: - cmd = ["kill", ret] - subprocess.call(cmd) - return True - -def stophal_ledctrl(): - if STARTMODULE.get('hal_ledctrl',0) == 1: - rets = get_pid("hal_ledctrl.py") - for ret in rets: - cmd = ["kill", ret] - subprocess.call(cmd) - return True - -def stop_slot_monitor(): - u'''disable slot timer service''' - if STARTMODULE.get('slot_monitor',0) == 1: - rets = get_pid("slot_monitor.py") # - for ret in rets: - cmd = ["kill", ret] - subprocess.call(cmd) - return True - -def rm_dev(bus, loc): - devpath = "/sys/bus/i2c/devices/%d-%04x"%(bus, loc) - if os.path.exists(devpath): - with open("/sys/bus/i2c/devices/i2c-%d/delete_device" % bus, 'w') as f: - f.write('0x%02x\n' % loc) - -def add_dev(name, bus, loc): - if name == "lm75": - time.sleep(0.1) - pdevpath = "/sys/bus/i2c/devices/i2c-%d/" % (bus) - for i in range(1, 100):#wait for mother-bus generation,maximum wait time is 10s - if os.path.exists(pdevpath) is True: - break - time.sleep(0.1) - if i % 10 == 0: - click.echo("%%DEVICE_I2C-INIT: %s not found, wait 0.1 second ! i %d " % (pdevpath,i)) - - devpath = "/sys/bus/i2c/devices/%d-%04x"%(bus, loc) - if os.path.exists(devpath) is False: - with open("/sys/bus/i2c/devices/i2c-%d/new_device" % bus, 'w') as f: - f.write('%s 0x%02x\n' % (name, loc)) - -def removedevs(): - devs = GLOBALCONFIG["DEVS"] - for index in range(len(devs)-1, -1, -1 ): - rm_dev(devs[index]["bus"] , devs[index]["loc"]) - -def adddevs(): - devs = GLOBALCONFIG["DEVS"] - for dev in range(0, devs.__len__()): - add_dev(devs[dev]["name"], devs[dev]["bus"] , devs[dev]["loc"]) - -def checksignaldriver(name): - status, output = getstatusoutput_noshell_pipe(["lsmod"], ["grep", name], ["wc", "-l"]) - #System execution error - if status: - return False - if output.isdigit() and int(output) > 0: - return True - else: - return False - -def adddriver(name, delay): - cmd = ["modprobe", name] - if delay != 0: - time.sleep(delay) - if not checksignaldriver(name): - getstatusoutput_noshell(cmd) - -def removedriver(name, delay): - realname = name.lstrip().split(" ")[0]; - cmd = ["rmmod", "-f", realname] - if checksignaldriver(realname): - getstatusoutput_noshell(cmd) - -def removedrivers(): - u'''remove all drivers''' - if GLOBALCONFIG is None: - click.echo("%%DEVICE_I2C-INIT: load global config failed.") - return - drivers = GLOBALCONFIG.get("DRIVERLISTS", None) - if drivers is None: - click.echo("%%DEVICE_I2C-INIT: load driver list failed.") - return - for index in range(len(drivers)-1, -1, -1 ): - delay = 0 - name = "" - if type(drivers[index]) == dict and "delay" in drivers[index]: - name = drivers[index].get("name") - delay = drivers[index]["delay"] - else: - name = drivers[index] - removedriver(name, delay) - -def adddrivers(): - u'''add drivers''' - if GLOBALCONFIG is None: - click.echo("%%DEVICE_I2C-INIT: load global config failed.") - return - drivers = GLOBALCONFIG.get("DRIVERLISTS", None) - if drivers is None: - click.echo("%%DEVICE_I2C-INIT: load driver list failed.") - return - for index in range(0 ,len(drivers)): - delay = 0 - name = "" - if type(drivers[index]) == dict and "delay" in drivers[index]: - name = drivers[index].get("name") - delay = drivers[index]["delay"] - else: - name = drivers[index] - adddriver(name, delay) - -def otherinit(): - for index in GLOBALINITPARAM: - index_type = index.get("type", None) - if index_type == "io": - ret = io_wr(index.get("offset"), index.get("val")) - else: - ret, _ = rgi2cset( - index.get("bus"), - index.get("devaddr"), - index.get("offset"), - index.get("val") - ) - if not ret: - click.echo("%%DEVICE_I2C-INIT: init param %s failed." % index.get("name")) - - for index in GLOBALINITCOMMAND: - log_os_system(index) - -def unload_driver(): - u'''remove devices and drivers''' - stop_fan_ctrl() # disable fan-control service - removedevs() # remove other devices - removedrivers() # remove drivers - -def reload_driver(): - u'''reload devices and drivers''' - removedevs() # remove other devices - removedrivers() # remove drivers - time.sleep(1) - adddrivers() - adddevs() - - -def i2c_check(bus,retrytime = 6): - try: - i2cpath = "/sys/bus/i2c/devices/" + bus - while retrytime and not os.path.exists(i2cpath): - click.echo("%%DEVICE_I2C-HA: i2c bus abnormal, last bus %s is not exist." % i2cpath) - reload_driver() - retrytime -= 1 - time.sleep(1) - except Exception as e: - click.echo("%%DEVICE_I2C-HA: %s" % str(e)) - return - -def set_mac_leds(data): - '''write pci register''' - pcibus = MAC_LED_RESET.get("pcibus") - slot = MAC_LED_RESET.get("slot") - fn = MAC_LED_RESET.get("fn") - bar = MAC_LED_RESET.get("bar") - offset = MAC_LED_RESET.get("offset") - val = MAC_LED_RESET.get(data, None) - if val is None: - click.echo("%%DEVICE_I2C-INIT: set_mac_leds wrong input") - return - rgpciwr(pcibus, slot, fn, bar, offset, val) - -def load_driver(): - u'''load devices and drivers''' - adddrivers() - adddevs() - if STARTMODULE.get("i2ccheck",0) == 1: #i2c HA - busend = i2ccheck_params.get("busend") - retrytime = i2ccheck_params.get("retrytime") - i2c_check(busend,retrytime) - start_fan_ctrl() # enable fan - starthal_fanctrl() # enable fan control - starthal_ledctrl() # enable LED control - if STARTMODULE['avscontrol'] == 1: - start_avs_ctrl() # avs voltage-adjustment - start_slot_monitor() # slot insertion and removal initialization monitor - otherinit(); # other initialization, QSFP initialization - if STARTMODULE.get("macledreset", 0) == 1: - set_mac_leds("reset") - -@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) -def main(): - '''device operator''' - pass - - -@main.command() -def start(): - '''load device ''' - if check_driver(): - unload_driver() - load_driver() - -@main.command() -def stop(): - '''stop device ''' - unload_driver() - -@main.command() -def restart(): - '''restart device''' - unload_driver() - load_driver() - -if __name__ == '__main__': - u'''device_i2c operation''' - main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py deleted file mode 100755 index f93e06aa865e..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py +++ /dev/null @@ -1,994 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -import click -import os -import time -import traceback -import glob -import subprocess -from rgutil.logutil import Logger -from ragileutil import wait_docker - -from ragileconfig import ( - MONITOR_CONST, - FANCTROLDEBUG, - MONITOR_FANS_LED, - DEV_LEDS, - MONITOR_PSU_STATUS, - MONITOR_SYS_PSU_LED, - MONITOR_DEV_STATUS, - MONITOR_FAN_STATUS, - MONITOR_DEV_STATUS_DECODE, - MONITOR_SYS_FAN_LED, - MONITOR_SYS_LED, - fanloc, -) - -from ragileutil import ( - rgi2cget, - get_mac_temp_sysfs, - get_mac_temp, - write_sysfs_value, - get_sysfs_value, - strtoint, - rgi2cset, - io_rd, - rgsysset, -) - - -CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) - -DEBUG_COMMON = 0x01 -DEBUG_LEDCONTROL = 0x02 -DEBUG_FANCONTROL = 0x04 - -LOG_PREFIX = "FANCONTROL" -logger = Logger(LOG_PREFIX, syslog=True, dbg_mask=FANCTROLDEBUG) - - -class AliasedGroup(click.Group): - def get_command(self, ctx, cmd_name): - rv = click.Group.get_command(self, ctx, cmd_name) - if rv is not None: - return rv - matches = [x for x in self.list_commands(ctx) if x.startswith(cmd_name)] - if not matches: - return None - elif len(matches) == 1: - return click.Group.get_command(self, ctx, matches[0]) - ctx.fail("Too many matches: %s" % ", ".join(sorted(matches))) - - -class FanControl(object): - critnum = 0 - - def __init__(self): - self._normal_fans = 0 - self._normal_psus = 0 - self._intemp = -100.0 - self._mac_aver = -100.0 - self._mac_max = -100.0 - # previous temperature - self._pre_intemp = -100 - self._outtemp = -100 - self._boardtemp = -100 - self._cputemp = -1000 - - @property - def normal_fans(self): - return self._normal_fans - - @property - def normal_psus(self): - return self._normal_psus - - @property - def cputemp(self): - return self._cputemp - - @property - def intemp(self): - return self._intemp - - @property - def outtemp(self): - return self._outtemp - - @property - def boardtemp(self): - return self._boardtemp - - @property - def mac_aver(self): - return self._mac_aver - - @property - def preIntemp(self): - return self._pre_intemp - - @property - def mac_max(self): - return self._mac_max - - def sortCallback(self, element): - return element["id"] - - def gettemp(self, ret): - u"""get inlet, outlet, hot-point and cpu temperature""" - temp_conf = MONITOR_DEV_STATUS.get("temperature", None) - - if temp_conf is None: - logger.error("gettemp: config error") - return False - for item_temp in temp_conf: - try: - retval = "" - rval = None - name = item_temp.get("name") - location = item_temp.get("location") - if name == "cpu": - L = [] - for dirpath, dirnames, filenames in os.walk(location): - for file in filenames: - if file.endswith("input"): - L.append(os.path.join(dirpath, file)) - L = sorted(L, reverse=False) - for i in range(len(L)): - nameloc = "%s/temp%d_label" % (location, i + 1) - valloc = "%s/temp%d_input" % (location, i + 1) - with open(nameloc, "r") as fd1: - retval2 = fd1.read() - with open(valloc, "r") as fd2: - retval3 = fd2.read() - ret_t = {} - ret_t["name"] = retval2.strip() - ret_t["value"] = float(retval3) / 1000 - ret.append(ret_t) - logger.debug( - DEBUG_COMMON, - "gettemp %s : %f" % (ret_t["name"], ret_t["value"]), - ) - else: - locations = glob.glob(location) - with open(locations[0], "r") as fd1: - retval = fd1.read() - rval = float(retval) / 1000 - ret_t = {} - ret_t["name"] = name - ret_t["value"] = rval - ret.append(ret_t) - logger.debug( - DEBUG_COMMON, - "gettemp %s : %f" % (ret_t["name"], ret_t["value"]), - ) - except Exception as e: - logger.error("gettemp error:name:%s" % name) - logger.error(str(e)) - return True - - def checkslot(self, ret): - u"""get slot present status""" - slots_conf = MONITOR_DEV_STATUS.get("slots", None) - slotpresent = MONITOR_DEV_STATUS_DECODE.get("slotpresent", None) - - if slots_conf is None or slotpresent is None: - return False - for item_slot in slots_conf: - totalerr = 0 - try: - ret_t = {} - ret_t["id"] = item_slot.get("name") - ret_t["status"] = "" - gettype = item_slot.get("gettype") - presentbit = item_slot.get("presentbit") - if gettype == "io": - io_addr = item_slot.get("io_addr") - val = io_rd(io_addr) - if val is not None: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_slot.get("name"), "lpc read failed"), - ) - else: - bus = item_slot.get("bus") - loc = item_slot.get("loc") - offset = item_slot.get("offset") - ind, val = rgi2cget(bus, loc, offset) - if ind is True: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_slot.get("name"), "i2c read failed"), - ) - if totalerr < 0: - ret_t["status"] = "NOT OK" - ret.append(ret_t) - continue - val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit - logger.debug( - DEBUG_COMMON, - "%s present:%s" % (item_slot.get("name"), slotpresent.get(val_t)), - ) - if val_t != slotpresent.get("okval"): - ret_t["status"] = "ABSENT" - else: - ret_t["status"] = "PRESENT" - except Exception as e: - ret_t["status"] = "NOT OK" - totalerr -= 1 - logger.error("checkslot error") - logger.error(str(e)) - ret.append(ret_t) - return True - - def checkpsu(self, ret): - u"""get psu status present, output and warning""" - psus_conf = MONITOR_DEV_STATUS.get("psus", None) - psupresent = MONITOR_DEV_STATUS_DECODE.get("psupresent", None) - psuoutput = MONITOR_DEV_STATUS_DECODE.get("psuoutput", None) - psualert = MONITOR_DEV_STATUS_DECODE.get("psualert", None) - - if psus_conf is None or psupresent is None or psuoutput is None: - logger.error("checkpsu: config error") - return False - for item_psu in psus_conf: - totalerr = 0 - try: - ret_t = {} - ret_t["id"] = item_psu.get("name") - ret_t["status"] = "" - gettype = item_psu.get("gettype") - presentbit = item_psu.get("presentbit") - statusbit = item_psu.get("statusbit") - alertbit = item_psu.get("alertbit") - if gettype == "io": - io_addr = item_psu.get("io_addr") - val = io_rd(io_addr) - if val is not None: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_psu.get("name"), "lpc read failed"), - ) - else: - bus = item_psu.get("bus") - loc = item_psu.get("loc") - offset = item_psu.get("offset") - ind, val = rgi2cget(bus, loc, offset) - if ind is True: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_psu.get("name"), "i2c read failed"), - ) - if totalerr < 0: - ret_t["status"] = "NOT OK" - ret.append(ret_t) - continue - val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit - val_status = (int(retval, 16) & (1 << statusbit)) >> statusbit - val_alert = (int(retval, 16) & (1 << alertbit)) >> alertbit - logger.debug( - DEBUG_COMMON, - "%s present:%s output:%s alert:%s" - % ( - item_psu.get("name"), - psupresent.get(val_t), - psuoutput.get(val_status), - psualert.get(val_alert), - ), - ) - if ( - val_t != psupresent.get("okval") - or val_status != psuoutput.get("okval") - or val_alert != psualert.get("okval") - ): - totalerr -= 1 - except Exception as e: - totalerr -= 1 - logger.error("checkpsu error") - logger.error(str(e)) - if totalerr < 0: - ret_t["status"] = "NOT OK" - else: - ret_t["status"] = "OK" - ret.append(ret_t) - return True - - def checkfan(self, ret): - u"""get fan status present and roll""" - fans_conf = MONITOR_DEV_STATUS.get("fans", None) - fanpresent = MONITOR_DEV_STATUS_DECODE.get("fanpresent", None) - fanroll = MONITOR_DEV_STATUS_DECODE.get("fanroll", None) - - if fans_conf is None or fanpresent is None or fanroll is None: - logger.error("checkfan: config error") - return False - for item_fan in fans_conf: - totalerr = 0 - try: - ret_t = {} - ret_t["id"] = item_fan.get("name") - ret_t["status"] = "" - presentstatus = item_fan.get("presentstatus") - presentbus = presentstatus.get("bus") - presentloc = presentstatus.get("loc") - presentaddr = presentstatus.get("offset") - presentbit = presentstatus.get("bit") - ind, val = rgi2cget(presentbus, presentloc, presentaddr) - if ind is True: - val_t = (int(val, 16) & (1 << presentbit)) >> presentbit - logger.debug( - DEBUG_COMMON, - "checkfan:%s present status:%s" - % (item_fan.get("name"), fanpresent.get(val_t)), - ) - if val_t != fanpresent.get("okval"): - ret_t["status"] = "ABSENT" - ret.append(ret_t) - continue - else: - logger.error( - "checkfan: %s get present status error." % item_fan.get("name"), - ) - motors = item_fan.get("rollstatus") - for motor in motors: - statusbus = motor.get("bus", None) - statusloc = motor.get("loc", None) - statusaddr = motor.get("offset", None) - statusbit = motor.get("bit", None) - ind, val = rgi2cget(statusbus, statusloc, statusaddr) - if ind is True: - val_t = (int(val, 16) & (1 << statusbit)) >> statusbit - logger.debug( - DEBUG_COMMON, - "checkfan:%s roll status:%s" - % (motor.get("name"), fanroll.get(val_t)), - ) - if val_t != fanroll.get("okval"): - totalerr -= 1 - else: - totalerr -= 1 - logger.error("checkfan: %s " % item_fan.get("name")) - logger.error("get %s status error." % motor["name"]) - except Exception as e: - totalerr -= 1 - logger.error("checkfan error") - logger.error(str(e)) - if totalerr < 0: - ret_t["status"] = "NOT OK" - else: - ret_t["status"] = "OK" - ret.append(ret_t) - return True - - def get_curr_speed(self): - try: - loc = fanloc[0].get("location", "") - sped = get_sysfs_value(loc) - value = strtoint(sped) - return value - except Exception as e: - logger.error("%%policy: get current speedlevel error") - logger.error(str(e)) - return None - - # guarantee the speed is lowest when speed lower than lowest value after speed-adjustment - def check_curr_speed(self): - logger.debug( - DEBUG_FANCONTROL, - "%%policy: guarantee the lowest speed after speed-adjustment", - ) - value = self.get_curr_speed() - if value is None or value == 0: - raise Exception("%%policy: get_curr_speed None") - elif value < MONITOR_CONST.MIN_SPEED: - self.set_fan_speed(MONITOR_CONST.MIN_SPEED) - - def set_fan_speed(self, level): - if level >= MONITOR_CONST.MAX_SPEED: - level = MONITOR_CONST.MAX_SPEED - for item in fanloc: - try: - loc = item.get("location", "") - # write_sysfs_value(loc, "0x%02x" % level) - # pddf support dicimal number - write_sysfs_value(loc, "%d" % level) - except Exception as e: - logger.error(str(e)) - logger.error("%%policy: config fan runlevel error") - self.check_curr_speed() # guaranteed minimum - - def set_fan_max_speed(self): - try: - self.set_fan_speed(MONITOR_CONST.MAX_SPEED) - except Exception as e: - logger.error("%%policy:set_fan_max_speed failed") - logger.error(str(e)) - - def detect_fan_status(self): - """ - fan status check , max speed if fan error - """ - if self.normal_fans < MONITOR_CONST.FAN_TOTAL_NUM: - logger.warn( - "%%DEV_MONITOR-FAN: Normal fan number: %d" % (self.normal_fans), - ) - self.set_fan_max_speed() - return False - return True - - def set_fan_attr(self, val): - u"""set status of each fan""" - for item in val: - fanid = item.get("id") - fanattr = fanid + "status" - fanstatus = item.get("status") - setattr(FanControl, fanattr, fanstatus) - logger.debug( - DEBUG_COMMON, "fanattr:%s,fanstatus:%s" % (fanattr, fanstatus), - ) - - def fan_present_num(self, cur_fan_status): - fanoknum = 0 - for item in cur_fan_status: - if item["status"] == "OK": - fanoknum += 1 - self._normal_fans = fanoknum - logger.debug(DEBUG_COMMON, "normal_fans = %d" % self._normal_fans) - - def get_fan_status(self): - try: - cur_fan_status = [] - ret = self.checkfan(cur_fan_status) - if ret is True: - self.set_fan_attr(cur_fan_status) - self.fan_present_num(cur_fan_status) - logger.debug(DEBUG_COMMON, "%%policy:get_fan_status success") - return 0 - except AttributeError as e: - logger.error(str(e)) - except Exception as e: - logger.error(str(e)) - return -1 - - def normal_psu_num(self, curPsuStatus): - psuoknum = 0 - for item in curPsuStatus: - if item.get("status") == "OK": - psuoknum += 1 - self._normal_psus = psuoknum - logger.debug(DEBUG_COMMON, "normal_psus = %d" % self._normal_psus) - - def get_psu_status(self): - try: - curPsuStatus = [] - ret = self.checkpsu(curPsuStatus) - if ret is True: - self.normal_psu_num(curPsuStatus) - logger.debug(DEBUG_COMMON, "%%policy:get_psu_status success") - return 0 - except AttributeError as e: - logger.error(str(e)) - except Exception as e: - logger.error(str(e)) - return -1 - - def get_monitor_temp(self, temp): - for item in temp: - if item.get("name") == "lm75in": - self._intemp = item.get("value", self._intemp) - if item.get("name") == "lm75out": - self._outtemp = item.get("value", self._outtemp) - if item.get("name") == "lm75hot": - self._boardtemp = item.get("value", self._boardtemp) - if item.get("name") == "Physical id 0": - self._cputemp = item.get("value", self._cputemp) - logger.debug( - DEBUG_COMMON, - "intemp:%f, outtemp:%f, boadrtemp:%f, cputemp:%f" - % (self._intemp, self._outtemp, self._boardtemp, self._cputemp), - ) - - def get_temp_status(self): - try: - monitortemp = [] - ret = self.gettemp(monitortemp) - if ret is True: - self.get_monitor_temp(monitortemp) - logger.debug(DEBUG_COMMON, "%%policy:get_temp_status success") - return 0 - except AttributeError as e: - logger.error(str(e)) - except Exception as e: - logger.error(str(e)) - return -1 - - def get_mac_status_bcmcmd(self): - try: - if wait_docker(timeout=0) is True: - sta, ret = get_mac_temp() - if sta is True: - self._mac_aver = float(ret.get("average", self._mac_aver)) - self._mac_max = float(ret.get("maximum", self._mac_max)) - logger.debug( - DEBUG_COMMON, - "mac_aver:%f, mac_max:%f" % (self.mac_aver, self._mac_max), - ) - else: - logger.debug(DEBUG_COMMON, "%%policy:get_mac_status_bcmcmd failed") - else: - logger.debug(DEBUG_COMMON, "%%policy:get_mac_status_bcmcmd SDK not OK") - return 0 - except AttributeError as e: - logger.error(str(e)) - return -1 - - def get_mac_status_sysfs(self, conf): - try: - sta, ret = get_mac_temp_sysfs(conf) - if sta is True: - self._mac_aver = float(ret) / 1000 - self._mac_max = float(ret) / 1000 - logger.debug( - DEBUG_COMMON, - "mac_aver:%f, mac_max:%f" % (self.mac_aver, self._mac_max), - ) - elif conf.get("try_bcmcmd", 0) == 1: - logger.debug( - DEBUG_COMMON, "get sysfs mac temp failed.try to use bcmcmd", - ) - self.get_mac_status_bcmcmd() - else: - logger.debug(DEBUG_COMMON, "%%policy:get_mac_status_sysfs failed") - return 0 - except AttributeError as e: - logger.error(str(e)) - return -1 - - def get_mac_status(self): - try: - mactempconf = MONITOR_DEV_STATUS.get("mac_temp", None) - if mactempconf is not None: - self.get_mac_status_sysfs(mactempconf) - else: - self.get_mac_status_bcmcmd() - return 0 - except AttributeError as e: - logger.error(str(e)) - return -1 - - def set_slot_attr(self, val): - u"""set each slot present status attribute""" - for item in val: - slotid = item.get("id") - slotattr = slotid + "status" - slotstatus = item.get("status") - setattr(FanControl, slotattr, slotstatus) - logger.debug( - DEBUG_COMMON, "slotattr:%s,slotstatus:%s" % (slotattr, slotstatus), - ) - - def get_slot_status(self): - try: - curSlotStatus = [] - ret = self.checkslot(curSlotStatus) - if ret is True: - self.set_slot_attr(curSlotStatus) - logger.debug(DEBUG_COMMON, "%%policy:get_slot_status success") - except AttributeError as e: - logger.error(str(e)) - return 0 - - def fanctrol(self): # fan speed-adjustment - try: - if self.preIntemp <= -1000: - self.preIntemp = self.intemp - logger.debug( - DEBUG_FANCONTROL, - "%%policy:previous temperature[%.2f] , current temperature[%.2f]" - % (self.preIntemp, self.intemp), - ) - if self.intemp < MONITOR_CONST.TEMP_MIN: - logger.debug( - DEBUG_FANCONTROL, - "%%policy:inlet %.2f minimum temperature: %.2f" - % (self.intemp, MONITOR_CONST.TEMP_MIN), - ) - self.set_fan_speed(MONITOR_CONST.DEFAULT_SPEED) # default level - elif self.intemp >= MONITOR_CONST.TEMP_MIN and self.intemp > self.preIntemp: - logger.debug(DEBUG_FANCONTROL, "%%policy:increase temperature") - self.policy_speed(self.intemp) - elif ( - self.intemp >= MONITOR_CONST.TEMP_MIN - and (self.preIntemp - self.intemp) > MONITOR_CONST.MONITOR_FALL_TEMP - ): - logger.debug( - DEBUG_FANCONTROL, - "%%policy:temperature reduce over %d degree" - % MONITOR_CONST.MONITOR_FALL_TEMP, - ) - self.policy_speed(self.intemp) - else: - speed = ( - self.get_curr_speed() - ) # set according to current speed, prevent fan watch-dog - if speed is not None: - self.set_fan_speed(speed) - logger.debug(DEBUG_FANCONTROL, "%%policy:change nothing") - except Exception as e: - logger.error("%%policy: fancontrol error") - - def start_fan_ctrl(self): - """ - start speed-adjustment - """ - self.check_crit() - if ( - self.critnum == 0 - and self.check_warn() is False - and self.detect_fan_status() is True - ): - self.fanctrol() - self.check_dev_err() - logger.debug( - DEBUG_FANCONTROL, - "%%policy: speed after speed-adjustment is %0x" % (self.get_curr_speed()), - ) - - def policy_speed(self, temp): # fan speed-adjustment algorithm - logger.debug(DEBUG_FANCONTROL, "%%policy:fan speed-adjustment algorithm") - sped_level = MONITOR_CONST.DEFAULT_SPEED + MONITOR_CONST.K * ( - temp - MONITOR_CONST.TEMP_MIN - ) - self.set_fan_speed(sped_level) - self.preIntemp = self.intemp - - def board_moni_msg(self, ledcontrol=False): - ret_t = 0 - try: - ret_t += ( - self.get_fan_status() - ) # get fan status, get number of fan which status is OK - ret_t += ( - self.get_temp_status() - ) # get inlet, outlet, hot-point temperature, CPU temperature - ret_t += self.get_mac_status() # get MAC highest and average temperature - if ledcontrol == True: - ret_t += self.get_slot_status() # get slot present status - ret_t += self.get_psu_status() # get psu status - if ret_t == 0: - return True - except Exception as e: - logger.error(str(e)) - return False - - # device error algorithm Tmac-Tin≥50℃, or Tmac-Tin≤-50℃ - def check_dev_err(self): - try: - if (self.mac_aver - self.intemp) >= MONITOR_CONST.MAC_UP_TEMP or ( - self.mac_aver - self.intemp - ) <= MONITOR_CONST.MAC_LOWER_TEMP: - logger.debug( - DEBUG_FANCONTROL, "%%DEV_MONITOR-TEMP: MAC temp get failed.", - ) - value = self.get_curr_speed() - if MONITOR_CONST.MAC_ERROR_SPEED >= value: - self.set_fan_speed(MONITOR_CONST.MAC_ERROR_SPEED) - else: - self.set_fan_max_speed() - else: - pass - except Exception as e: - logger.error("%%policy:check_dev_err failed") - logger.error(str(e)) - - def check_temp_warn(self): - u"""check whether temperature above the normal alarm value""" - try: - if ( - self._mac_aver >= MONITOR_CONST.MAC_WARNING_THRESHOLD - or self._outtemp >= MONITOR_CONST.OUTTEMP_WARNING_THRESHOLD - or self._boardtemp >= MONITOR_CONST.BOARDTEMP_WARNING_THRESHOLD - or self._cputemp >= MONITOR_CONST.CPUTEMP_WARNING_THRESHOLD - or self._intemp >= MONITOR_CONST.INTEMP_WARNING_THRESHOLD - ): - logger.debug( - DEBUG_COMMON, - "check whether temperature above the normal alarm value", - ) - return True - except Exception as e: - logger.error("%%policy: check_temp_warn failed") - logger.error(str(e)) - return False - - def check_temp_crit(self): - u"""check whether temperature above the critical alarm value""" - try: - if self._mac_aver >= MONITOR_CONST.MAC_CRITICAL_THRESHOLD or ( - self._outtemp >= MONITOR_CONST.OUTTEMP_CRITICAL_THRESHOLD - and self._boardtemp >= MONITOR_CONST.BOARDTEMP_CRITICAL_THRESHOLD - and self._cputemp >= MONITOR_CONST.CPUTEMP_CRITICAL_THRESHOLD - and self._intemp >= MONITOR_CONST.INTEMP_CRITICAL_THRESHOLD - ): - logger.debug( - DEBUG_COMMON, "temperature above the critical alarm value", - ) - return True - except Exception as e: - logger.error("%%policy: check_temp_crit failed") - logger.error(str(e)) - return False - - def check_fan_status(self): - u"""check fan status""" - for item in MONITOR_FAN_STATUS: - maxoknum = item.get("maxOkNum") - minoknum = item.get("minOkNum") - status = item.get("status") - if self.normal_fans >= minoknum and self.normal_fans <= maxoknum: - logger.debug( - DEBUG_COMMON, - "check_fan_status:normal_fans:%d,status:%s" - % (self.normal_fans, status), - ) - return status - logger.debug( - DEBUG_COMMON, "check_fan_status Error:normal_fans:%d" % (self.normal_fans), - ) - return None - - def check_psu_status(self): - u"""check psu status""" - for item in MONITOR_PSU_STATUS: - maxoknum = item.get("maxOkNum") - minoknum = item.get("minOkNum") - status = item.get("status") - if self.normal_psus >= minoknum and self.normal_psus <= maxoknum: - logger.debug( - DEBUG_COMMON, - "check_psu_status:normal_psus:%d,status:%s" - % (self.normal_psus, status), - ) - return status - logger.debug( - DEBUG_COMMON, "check_psu_status Error:normal_psus:%d" % (self.normal_psus), - ) - return None - - def deal_sys_led_status(self): - u"""set up SYSLED according to temperature, fan and psu status""" - try: - fanstatus = self.check_fan_status() - psustatus = self.check_psu_status() - if ( - self.check_temp_crit() is True - or fanstatus == "red" - or psustatus == "red" - ): - status = "red" - elif ( - self.check_temp_warn() is True - or fanstatus == "yellow" - or psustatus == "yellow" - ): - status = "yellow" - else: - status = "green" - self.set_sys_leds(status) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:deal_sys_led_status success, status:%s," % status, - ) - except Exception as e: - logger.error(str(e)) - - def deal_sys_fan_led_status(self): - u"""light panel fan led according to status""" - try: - status = self.check_fan_status() - if status is not None: - self.set_sys_fan_leds(status) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:deal_sys_fan_led_status success, status:%s," % status, - ) - except Exception as e: - logger.error("%%ledcontrol:deal_sys_led_status error") - logger.error(str(e)) - - def deal_psu_led_status(self): - u"""set up PSU-LED according to psu status""" - try: - status = self.check_psu_status() - if status is not None: - self.set_sys_psu_leds(status) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:deal_psu_led_status success, status:%s," % status, - ) - except Exception as e: - logger.error("%%ledcontrol:deal_psu_led_status error") - logger.error(str(e)) - - def deal_fan_led_status(self): - u"""light fan led according to fan status""" - for item in MONITOR_FANS_LED: - try: - index = MONITOR_FANS_LED.index(item) + 1 - fanattr = "fan%dstatus" % index - val_t = getattr(FanControl, fanattr, None) - if val_t == "NOT OK": - rgi2cset(item["bus"], item["devno"], item["addr"], item["red"]) - elif val_t == "OK": - rgi2cset(item["bus"], item["devno"], item["addr"], item["green"]) - else: - pass - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:dealLocFanLed success.fanattr:%s, status:%s" - % (fanattr, val_t), - ) - except Exception as e: - logger.error("%%ledcontrol:deal_fan_led_status error") - logger.error(str(e)) - - def dealSlotLedStatus(self): - u"""light slot status led according to slot present status""" - slotLedList = DEV_LEDS.get("SLOTLED", []) - for item in slotLedList: - try: - index = slotLedList.index(item) + 1 - slotattr = "slot%dstatus" % index - val_t = getattr(FanControl, slotattr, None) - if val_t == "PRESENT": - rgi2cset(item["bus"], item["devno"], item["addr"], item["green"]) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:dealSlotLedStatus success.slotattr:%s, status:%s" - % (slotattr, val_t), - ) - except Exception as e: - logger.error("%%ledcontrol:dealSlotLedStatus error") - logger.error(str(e)) - - def setled(self, item, color): - if item.get("type", "i2c") == "sysfs": - rgsysset(item["cmdstr"], item.get(color)) - else: - mask = item.get("mask", 0xFF) - ind, val = rgi2cget(item["bus"], item["devno"], item["addr"]) - if ind is True: - setval = (int(val, 16) & ~mask) | item.get(color) - rgi2cset(item["bus"], item["devno"], item["addr"], setval) - else: - logger.error("led %s" % "i2c read failed") - - def set_sys_leds(self, color): - for item in MONITOR_SYS_LED: - self.setled(item, color) - - def set_sys_fan_leds(self, color): - for item in MONITOR_SYS_FAN_LED: - self.setled(item, color) - - def set_sys_psu_leds(self, color): - for item in MONITOR_SYS_PSU_LED: - self.setled(item, color) - - def check_warn(self): - try: - if self.check_temp_warn() is True: - logger.debug(DEBUG_FANCONTROL, "anti-shake start") - time.sleep(MONITOR_CONST.SHAKE_TIME) - logger.debug(DEBUG_FANCONTROL, "anti-shake end") - self.board_moni_msg() # re-read - if self.check_temp_warn() is True: - logger.warn("%%DEV_MONITOR-TEMP:The temperature of device is over warning value.") - self.set_fan_max_speed() # fan full speed - return True - except Exception as e: - logger.error("%%policy: check_warn failed") - logger.error(str(e)) - return False - - def check_crit(self): - try: - if self.check_temp_crit() is True: - logger.debug(DEBUG_FANCONTROL, "anti-shake start") - time.sleep(MONITOR_CONST.SHAKE_TIME) - logger.debug(DEBUG_FANCONTROL, "anti-shake end") - self.board_moni_msg() # re-read - if self.check_temp_crit() is True: - logger.crit( - "%%DEV_MONITOR-TEMP:The temperature of device is over critical value.", - ) - self.set_fan_max_speed() # fan full speed - self.critnum += 1 # anti-shake - if self.critnum >= MONITOR_CONST.CRITICAL_NUM: - subprocess.call(["reboot"]) - logger.debug(DEBUG_FANCONTROL, "crit times:%d" % self.critnum) - else: - self.critnum = 0 - else: - self.critnum = 0 - except Exception as e: - logger.error("%%policy: check_crit failed") - logger.error(str(e)) - - -def callback(): - pass - - -def do_fan_ctrl(fanctrl): - ret = fanctrl.board_moni_msg() - if ret is True: - logger.debug(DEBUG_FANCONTROL, "%%policy:start_fan_ctrl") - fanctrl.start_fan_ctrl() - else: - fanctrl.set_fan_max_speed() - logger.debug(DEBUG_FANCONTROL, "%%policy:board_moni_msg error") - - -def do_led_ctrl(fanctrl): - fanctrl.board_moni_msg(ledcontrol=True) # get status - fanctrl.deal_sys_led_status() # light system led - fanctrl.deal_sys_fan_led_status() # light panel fan led - fanctrl.deal_fan_led_status() # light fan led - fanctrl.deal_psu_led_status() # light psu led - fanctrl.dealSlotLedStatus() # light slot status led - logger.debug(DEBUG_LEDCONTROL, "%%ledcontrol:do_led_ctrl success") - - -def run(interval, fanctrl): - loop = 0 - # waitForDocker() - while True: - try: - if loop % MONITOR_CONST.MONITOR_INTERVAL == 0: # fan speed-adjustment - logger.debug(DEBUG_FANCONTROL, "%%policy:fanctrl") - do_fan_ctrl(fanctrl) - else: - logger.debug( - DEBUG_LEDCONTROL, "%%ledcontrol:start ledctrol" - ) # LED control - do_led_ctrl(fanctrl) - time.sleep(interval) - loop += interval - except Exception as e: - traceback.print_exc() - logger.error(str(e)) - - -@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) -def main(): - """device operator""" - pass - - -@main.command() -def start(): - """start fan control""" - logger.info("FAN CTRL START") - fanctrl = FanControl() - interval = MONITOR_CONST.MONITOR_INTERVAL / 30 - run(interval, fanctrl) - - -@main.command() -def stop(): - """stop fan control """ - logger.info("FAN CTRL STOP") - - -##device_i2c operation -if __name__ == "__main__": - main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py new file mode 100755 index 000000000000..29d18e7b2688 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +''' +generate board air flow according to fan and psu air flow +write resulet to AIRFLOW_RESULT_FILE, file format: +{ + "FAN1": { + "model":"M1HFAN I-F", + "airflow":"intake", + }, + "PSU1": { + "model":"CSU550AP-3-500", + "airflow":"intake", + }, + "board":"intake" +} +''' +import os +import syslog +import json +from platform_config import AIR_FLOW_CONF, AIRFLOW_RESULT_FILE +from platform_util import dev_file_read, byteTostr +from eepromutil.fru import ipmifru +from eepromutil.fantlv import fan_tlv + + +AIRFLOW_DEBUG_FILE = "/etc/.airflow_debug_flag" + +AIRFLOWERROR = 1 +AIRFLOWDEBUG = 2 + +debuglevel = 0 + + +def airflow_info(s): + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def airflow_error(s): + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def airflow_debug(s): + if AIRFLOWDEBUG & debuglevel: + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def airflow_debug_error(s): + if AIRFLOWERROR & debuglevel: + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def debug_init(): + global debuglevel + try: + with open(AIRFLOW_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +def get_model_fru(device, eeprom): + try: + fru = ipmifru() + fru.decodeBin(eeprom) + dev_name = device.get("name") + area = device.get("area") + field = device.get("field") + tmp_area = getattr(fru, area, None) + if tmp_area is None: + msg = "%s fru %s area config error" % (dev_name, area) + return False, msg + model = getattr(tmp_area, field, None) + if model is None: + msg = "%s get model error, area: %s, field: %s" % (dev_name, area, field) + return False, msg + airflow_debug("%s get model success, model: %s" % (dev_name, model)) + return True, model + except Exception as e: + return False, str(e) + + +def get_model_fantlv(device, eeprom): + try: + dev_name = device.get("name") + tlv = fan_tlv() + rets = tlv.decode(eeprom) + if len(rets) == 0: + msg = "%s decode fantlv eeprom info error" % dev_name + return False, msg + + field = device.get("field") + for fantlv_item in rets: + if fantlv_item.get("name") == field: + return True, fantlv_item["value"] + msg = "%s get model error, field: %s not found" % (dev_name, field) + return False, msg + except Exception as e: + return False, str(e) + + +def get_device_modele(device): + e2_type = device.get("e2_type") + dev_name = device.get("name") + support_e2_type = ("fru", "fantlv") + if e2_type not in support_e2_type: + msg = "%s unsupport e2_type: %s" % (dev_name, e2_type) + return False, msg + + e2_path = device.get("e2_path") + e2_size = device.get("e2_size", 256) + ret, binval_bytes = dev_file_read(e2_path, 0, e2_size) + if ret is False: + msg = "%s eeprom read error, eeprom path: %s, msg: %s" % (dev_name, e2_path, binval_bytes) + return False, msg + + binval = byteTostr(binval_bytes) + if e2_type == "fru": + return get_model_fru(device, binval) + return get_model_fantlv(device, binval) + + +def get_board_air_flow(fan_intake_num, fan_exhaust_num, psu_intake_num, psu_exhaust_num): + airflow_debug("fan_intake_num: %d, fan_exhaust_num: %d, psu_intake_num: %d, psu_exhaust_num: %d" % + (fan_intake_num, fan_exhaust_num, psu_intake_num, psu_exhaust_num)) + + if fan_intake_num == 0 and fan_exhaust_num == 0 and psu_intake_num == 0 and psu_exhaust_num == 0: + airflow_error("get all fans and psus air flow failed") + return "N/A" + + if fan_intake_num > fan_exhaust_num: + airflow_debug("fan intake number %d more than fan exhaust number %s, set board air flow: intake") + return "intake" + + if fan_intake_num < fan_exhaust_num: + airflow_debug("fan intake number less than fan exhaust number, set board air flow: exhaust") + return "exhaust" + + airflow_debug("fan intake number equal to exhaust number, check psu air flow") + + if psu_intake_num > psu_exhaust_num: + airflow_debug("psu intake number more than psu exhaust number, set board air flow: intake") + return "intake" + + if psu_intake_num < psu_exhaust_num: + airflow_debug("psu intake number less than psu exhaust number, set board air flow: exhaust") + return "exhaust" + + airflow_debug("fan and psu intake and exhaust number equal, return intake") + return "intake" + + +def generate_airflow(): + fan_intake_list = [] + fan_exhaust_list = [] + psu_intake_list = [] + psu_exhaust_list = [] + ret = {} + fans = AIR_FLOW_CONF.get("fans", []) + psus = AIR_FLOW_CONF.get("psus", []) + + for fan in fans: + dev_name = fan.get("name") + air_flow = "N/A" + status, model = get_device_modele(fan) + if status is False: + ret[dev_name] = {"model": "N/A", "airflow": "N/A"} + airflow_error(model) + continue + model = model.strip() + airflowconifg = AIR_FLOW_CONF[fan["decode"]] + for key, value in airflowconifg.items(): + if model in value: + air_flow = key + ret[dev_name] = {"model": model, "airflow": air_flow} + airflow_debug("%s model: %s, airflow: %s" % (dev_name, model, air_flow)) + if air_flow == "intake": + fan_intake_list.append(fan.get("name")) + elif air_flow == "exhaust": + fan_exhaust_list.append(fan.get("name")) + + airflow_debug("fan_intake_list: %s" % fan_intake_list) + airflow_debug("fan_exhaust_list: %s" % fan_exhaust_list) + + for psu in psus: + dev_name = psu.get("name") + air_flow = "N/A" + status, model = get_device_modele(psu) + if status is False: + ret[dev_name] = {"model": "N/A", "airflow": "N/A"} + airflow_error(model) + continue + model = model.strip() + airflowconifg = AIR_FLOW_CONF[psu["decode"]] + for key, value in airflowconifg.items(): + if model in value: + air_flow = key + ret[dev_name] = {"model": model, "airflow": air_flow} + airflow_debug("%s model: %s, airflow: %s" % (dev_name, model, air_flow)) + if air_flow == "intake": + psu_intake_list.append(psu.get("name")) + elif air_flow == "exhaust": + psu_exhaust_list.append(psu.get("name")) + + airflow_debug("psu_intake_list: %s" % psu_intake_list) + airflow_debug("psu_exhaust_list: %s" % psu_exhaust_list) + + fan_intake_num = len(fan_intake_list) + fan_exhaust_num = len(fan_exhaust_list) + psu_intake_num = len(psu_intake_list) + psu_exhaust_num = len(psu_exhaust_list) + + board_airflow = get_board_air_flow(fan_intake_num, fan_exhaust_num, psu_intake_num, psu_exhaust_num) + airflow_debug("board_airflow: %s" % board_airflow) + ret["board"] = board_airflow + ret_json = json.dumps(ret, ensure_ascii=False, indent=4) + + out_file_dir = os.path.dirname(AIRFLOW_RESULT_FILE) + if len(out_file_dir) != 0: + cmd = "mkdir -p %s" % out_file_dir + os.system(cmd) + os.system("sync") + with open(AIRFLOW_RESULT_FILE, "w") as fd: + fd.write(ret_json) + os.system("sync") + + +if __name__ == '__main__': + debug_init() + airflow_debug("enter main") + generate_airflow() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py new file mode 100755 index 000000000000..7722b111f944 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py @@ -0,0 +1,1135 @@ +#!/usr/bin/env python3 +import os +import subprocess +import time +import syslog +import traceback +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil +from algorithm.pid import pid +from algorithm.openloop import openloop +from algorithm.hysteresis import hysteresis + + +SWITCH_TEMP = "SWITCH_TEMP" +INLET_TEMP = "INLET_TEMP" +BOARD_TEMP = "BOARD_TEMP" +OUTLET_TEMP = "OUTLET_TEMP" +CPU_TEMP = "CPU_TEMP" + +FANCTROL_DEBUG_FILE = "/etc/.fancontrol_debug_flag" +# coordination with REBOOT_CAUSE_PARA +OTP_SWITCH_REBOOT_JUDGE_FILE = "/etc/.otp_reboot_flag" +OTP_OTHER_REBOOT_JUDGE_FILE = OTP_SWITCH_REBOOT_JUDGE_FILE + +FANCTROLERROR = 1 +FANCTROLDEBUG = 2 +FANAIRFLOWDEBUG = 4 + +debuglevel = 0 + +F2B_AIR_FLOW = "intake" +B2F_AIR_FLOW = "exhaust" +ONIE_E2_NAME = "ONIE_E2" + +TEMP_REBOOT_CRIT_SWITCH_FLAG = 1 +TEMP_REBOOT_CRIT_OTHER_FLAG = 2 + + +def fancontrol_debug(s): + if FANCTROLDEBUG & debuglevel: + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def fancontrol_error(s): + if FANCTROLERROR & debuglevel: + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def fanairflow_debug(s): + if FANAIRFLOWDEBUG & debuglevel: + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def fancontrol_warn(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_WARNING, s) + + +def fancontrol_crit(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_CRIT, s) + + +def fancontrol_alert(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_ALERT, s) + + +def fancontrol_emerg(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_EMERG, s) + + +def exec_os_cmd(cmd): + status, output = subprocess.getstatusoutput(cmd) + if status: + print(output) + return status, output + + +def debug_init(): + global debuglevel + try: + with open(FANCTROL_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +error_temp = -9999 # get temp error +invalid_temp = -10000 # get temp invalid +PRE_FAN_NOK_UNKNOWN = "UNKNOWN" + + +class DevFan(object): + + def __init__(self, name, hal_interface): + self.__name = name + self.origin_name = None + self.display_name = None + self.air_flow = None + self.air_flow_inconsistent = False + self.int_case = hal_interface + + @property + def name(self): + return self.__name + + def get_fan_rotor_number(self): + return self.int_case.get_fan_rotor_number(self.name) + + def get_fan_presence(self): + return self.int_case.get_fan_presence(self.name) + + def get_fan_rotor_status(self, rotor_name): + return self.int_case.get_fan_rotor_status(self.name, rotor_name) + + def get_fan_fru_info(self): + return self.int_case.get_fan_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def update_fru_info(self): + try: + dic = self.get_fan_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + fanairflow_debug("update %s fru info error, msg: %s" % (self.name, str(e))) + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + +class DevPsu(object): + + def __init__(self, name, hal_interface): + self.__name = name + self.origin_name = None + self.display_name = None + self.air_flow = None + self.air_flow_inconsistent = False + self.int_case = hal_interface + + @property + def name(self): + return self.__name + + def get_psu_fru_info(self): + return self.int_case.get_psu_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def update_fru_info(self): + try: + dic = self.get_psu_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + fanairflow_debug("update %s fru info error, msg: %s" % (self.name, str(e))) + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + +class fancontrol(object): + __int_case = None + + __pwm = 0x80 + + def __init__(self): + self.int_case = interface() + self.__config = baseutil.get_monitor_config() + self.__pid_config = self.__config["pid"] + self.__hyst_config = self.__config.get("hyst", {}) + self.__temps_threshold_config = self.__config["temps_threshold"] + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['temp'] = 0 + temp_threshold['fail_num'] = 0 + temp_threshold['warning_num'] = 0 # temp warning times + temp_threshold['critical_num'] = 0 # temp critical times + temp_threshold['emergency_num'] = 0 # temp emergency times + temp_threshold.setdefault('ignore_threshold', 0) # default temp threshold on + temp_threshold.setdefault('invalid', invalid_temp) + temp_threshold.setdefault('error', error_temp) + + self.__otp_reboot_judge_file_config = self.__config.get("otp_reboot_judge_file", None) + if self.__otp_reboot_judge_file_config is None: + self.__otp_switch_reboot_judge_file = OTP_SWITCH_REBOOT_JUDGE_FILE + self.__otp_other_reboot_judge_file = OTP_OTHER_REBOOT_JUDGE_FILE + else: + self.__otp_switch_reboot_judge_file = self.__otp_reboot_judge_file_config.get( + "otp_switch_reboot_judge_file", OTP_SWITCH_REBOOT_JUDGE_FILE) + self.__otp_other_reboot_judge_file = self.__otp_reboot_judge_file_config.get( + "otp_other_reboot_judge_file", OTP_OTHER_REBOOT_JUDGE_FILE) + + self.__fan_rotor_error_num = {} + self.__fan_present_status = {} # {"FAN1":0, "FAN2":1...} 1:present, 0:absent + self.__fan_rotate_status = {} # {"FAN1":0, "FAN2":1...} 1:OK, 0:NOT OK + self.__fan_repair_flag = {} # {"FAN1":0, "FAN2":1...} 1:repair, 0:give up + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + self.__fan_present_status[fan_name] = 1 # present + self.__fan_rotate_status[fan_name] = 1 # OK + self.__fan_repair_flag[fan_name] = 1 # repair + rotor_num = self.get_rotor_number(fan_name) + tmp_fan = {} + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + tmp_fan[rotor_name] = 0 # not error + self.__fan_rotor_error_num[fan_name] = tmp_fan + + self.__fancontrol_para = self.__config["fancontrol_para"] + self.__interval = self.__fancontrol_para.get("interval", 5) + self.__fan_status_interval = self.__fancontrol_para.get("fan_status_interval", 0) + self.__max_pwm = self.__fancontrol_para.get("max_pwm", 0xff) + self.__min_pwm = self.__fancontrol_para.get("min_pwm", 0x80) + self.__abnormal_pwm = self.__fancontrol_para.get("abnormal_pwm", 0xbb) + self.__warning_pwm = self.__fancontrol_para.get("warning_pwm", 0xff) + self.__temp_invalid_pid_pwm = self.__fancontrol_para.get("temp_invalid_pid_pwm", 0x80) + self.__temp_error_pid_pwm = self.__fancontrol_para.get("temp_error_pid_pwm", 0x80) + self.__temp_fail_num = self.__fancontrol_para.get("temp_fail_num", 3) + self.__check_temp_fail = self.__fancontrol_para.get("check_temp_fail", []) + self.__temp_warning_num = self.__fancontrol_para.get("temp_warning_num", 3) + self.__temp_critical_num = self.__fancontrol_para.get("temp_critical_num", 3) + self.__temp_emergency_num = self.__fancontrol_para.get("temp_emergency_num", 3) + self.__temp_warning_countdown = self.__fancontrol_para.get("temp_warning_countdown", 60) + self.__temp_critical_countdown = self.__fancontrol_para.get("temp_critical_countdown", 60) + self.__temp_emergency_countdown = self.__fancontrol_para.get("temp_emergency_countdown", 60) + self.__rotor_error_count = self.__fancontrol_para.get("rotor_error_count", 6) + self.__inlet_mac_diff = self.__fancontrol_para.get("inlet_mac_diff", 50) + self.__check_crit_reboot_flag = self.__fancontrol_para.get("check_crit_reboot_flag", 1) + self.__check_emerg_reboot_flag = self.__fancontrol_para.get("check_emerg_reboot_flag", 1) + self.__check_crit_reboot_num = self.__fancontrol_para.get("check_crit_reboot_num", 3) + self.__check_crit_sleep_time = self.__fancontrol_para.get("check_crit_sleep_time", 20) + self.__check_emerg_reboot_num = self.__fancontrol_para.get("check_emerg_reboot_num", 3) + self.__check_emerg_sleep_time = self.__fancontrol_para.get("check_emerg_sleep_time", 20) + self.__check_temp_emergency = self.__fancontrol_para.get("check_temp_emergency", 0) + self.__check_temp_critical = self.__fancontrol_para.get("check_temp_critical", 1) + self.__check_temp_warning = self.__fancontrol_para.get("check_temp_warning", 1) + self.__check_temp_emergency_reboot = self.__fancontrol_para.get("check_temp_emergency_reboot", []) + self.__psu_absent_fullspeed_num = self.__fancontrol_para.get("psu_absent_fullspeed_num", 1) + self.__fan_absent_fullspeed_num = self.__fancontrol_para.get("fan_absent_fullspeed_num", 1) + self.__rotor_error_fullspeed_num = self.__fancontrol_para.get("rotor_error_fullspeed_num", 1) + self.__psu_fan_control = self.__fancontrol_para.get("psu_fan_control", 1) # default control psu fan + self.__fan_plug_in_pwm = self.__fancontrol_para.get("fan_plug_in_pwm", 0x80) + self.__fan_plug_in_default_countdown = self.__fancontrol_para.get("fan_plug_in_default_countdown", 0) + self.__deal_fan_error_policy = self.__fancontrol_para.get("deal_fan_error", 0) + self.__deal_fan_error_conf = self.__fancontrol_para.get("deal_fan_error_conf", {}) + self.__deal_fan_error_default_countdown = self.__deal_fan_error_conf.get("countdown", 0) + + self.__warning_countdown = 0 # temp warning flag for normal fancontrol + self.__critical_countdown = 0 # temp critical flag for normal fancontrol + self.__emergency_countdown = 0 # temp emergency flag for normal fancontrol + self.__fan_plug_in_countdown = 0 # fan plug in flag for normal fancontrol + self.__deal_fan_error_countdown = 0 + self.__fan_absent_num = 0 + self.__fan_nok_num = 0 + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + self.openloop = openloop() + self.pid = pid() + self.hyst = hysteresis() + self.__pwm = self.__min_pwm + + self.__board_air_flow = "" + self.__fan_air_flow_monitor = self.__fancontrol_para.get("fan_air_flow_monitor", 0) + self.__psu_air_flow_monitor = self.__fancontrol_para.get("psu_air_flow_monitor", 0) + self.__air_flow_correct_fan_pwm = self.__fancontrol_para.get("air_flow_correct_fan_pwm", 0xff) + self.__air_flow_correct_psu_pwm = self.__fancontrol_para.get("air_flow_correct_psu_pwm", 0xff) + self.__air_flow_error_fan_pwm = self.__fancontrol_para.get("air_flow_error_fan_pwm", 0) + self.__air_flow_error_psu_pwm = self.__fancontrol_para.get("air_flow_error_psu_pwm", 0) + self.fan_air_flow_inconsistent_flag = False + self.psu_air_flow_inconsistent_flag = False + self.air_flow_inconsistent_flag = False + self.fan_obj_list = [] + self.psu_obj_list = [] + + @property + def na_ret(self): + return self.int_case.na_ret + + def get_onie_e2_obj(self, name): + return self.int_case.get_onie_e2_obj(name) + + @property + def board_air_flow(self): + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if self.__board_air_flow not in air_flow_tuple: + self.__board_air_flow = self.int_case.get_device_airflow(ONIE_E2_NAME) + fanairflow_debug("board_air_flow: %s" % self.__board_air_flow) + return self.__board_air_flow + + @property + def fan_air_flow_monitor(self): + return self.__fan_air_flow_monitor + + @property + def psu_air_flow_monitor(self): + return self.__psu_air_flow_monitor + + @property + def air_flow_correct_fan_pwm(self): + return self.__air_flow_correct_fan_pwm + + @property + def air_flow_correct_psu_pwm(self): + return self.__air_flow_correct_psu_pwm + + @property + def air_flow_error_fan_pwm(self): + return self.__air_flow_error_fan_pwm + + @property + def air_flow_error_psu_pwm(self): + return self.__air_flow_error_psu_pwm + + def get_para(self, t): + para = self.__pid_config.get(t) + return para + + def update_over_temp_threshold_num(self): + for temp_threshold in self.__temps_threshold_config.values(): + if temp_threshold['ignore_threshold']: + continue + emergency_threshold = temp_threshold.get('emergency', None) + critical_threshold = temp_threshold.get('critical', None) + warning_threshold = temp_threshold.get('warning', None) + fancontrol_debug("%s warning = %s, critical = %s, emergency = %s" % + (temp_threshold['name'], warning_threshold, critical_threshold, emergency_threshold)) + + if emergency_threshold is not None and temp_threshold['temp'] >= emergency_threshold: + temp_threshold['emergency_num'] += 1 + else: + temp_threshold['emergency_num'] = 0 + + if critical_threshold is not None and temp_threshold['temp'] >= critical_threshold: + temp_threshold['critical_num'] += 1 + else: + temp_threshold['critical_num'] = 0 + + if warning_threshold is not None and temp_threshold['temp'] >= warning_threshold: + temp_threshold['warning_num'] += 1 + else: + temp_threshold['warning_num'] = 0 + + fancontrol_debug("%s warning_num = %d, critical_num = %d, emergency_num = %d" % + (temp_threshold['name'], temp_threshold['warning_num'], temp_threshold['critical_num'], temp_threshold.get("emergency_num"))) + + def get_monitor_temp(self): + sensorlist = self.int_case.get_temp_info() + + for temp_threshold in self.__temps_threshold_config.values(): + sensor = sensorlist.get(temp_threshold['name']) + if sensor["Value"] is None or int(sensor["Value"]) == self.int_case.error_ret: + temp_threshold['fail_num'] += 1 + fancontrol_error("get %s failed, fail_num = %d" % (temp_threshold['name'], temp_threshold['fail_num'])) + else: + temp_threshold['fail_num'] = 0 + temp_threshold.setdefault('fix', 0) + temp_threshold['temp'] = sensor["Value"] + temp_threshold['fix'] + fancontrol_debug("%s = %d" % (temp_threshold['name'], temp_threshold['temp'])) + self.update_over_temp_threshold_num() + + def is_temp_warning(self): + warning_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + if temp_threshold['ignore_threshold']: + continue + if temp_threshold['warning_num'] >= self.__temp_warning_num: + warning_flag = True + fancontrol_warn("%%FANCONTROL-4-TEMP_HIGH: %s temperature %sC is larger than warning threshold %sC." % + (temp_threshold['name'], temp_threshold['temp'], temp_threshold.get('warning'))) + return warning_flag + + def checkTempWarning(self): + try: + if self.is_temp_warning(): + self.__warning_countdown = self.__temp_warning_countdown + fancontrol_debug("temp is over warning") + return True + if self.__warning_countdown > 0: + self.__warning_countdown -= 1 + return False + except Exception as e: + fancontrol_error("%%policy: checkTempWarning failed") + fancontrol_error(str(e)) + return False + + def checkTempWarningCountdown(self): + if self.__warning_countdown > 0: + return True + return False + + def is_temp_critical(self): + critical_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['critical_flag'] = False + if temp_threshold['ignore_threshold']: + continue + if temp_threshold['critical_num'] >= self.__temp_critical_num: + critical_flag = True + temp_threshold['critical_flag'] = True + fancontrol_crit("%%FANCONTROL-2-TEMP_HIGH: %s temperature %sC is larger than critical threshold %sC." % + (temp_threshold['name'], temp_threshold['temp'], temp_threshold.get('critical'))) + return critical_flag + + def checkTempCritical(self): + try: + if self.is_temp_critical(): + self.__critical_countdown = self.__temp_critical_countdown + fancontrol_debug("temp is over critical") + return True + if self.__critical_countdown > 0: + self.__critical_countdown -= 1 + return False + except Exception as e: + fancontrol_error("%%policy: checkTempCrit failed") + fancontrol_error(str(e)) + return False + + def is_temp_emergency(self): + emergency_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['emergency_flag'] = False + if temp_threshold['ignore_threshold']: + continue + if temp_threshold['emergency_num'] >= self.__temp_emergency_num: + emergency_flag = True + temp_threshold['emergency_flag'] = True + fancontrol_alert("%%FANCONTROL-1-TEMP_HIGH: %s temperature %sC is larger than emergency threshold %sC." % + (temp_threshold['name'], temp_threshold['temp'], temp_threshold.get('emergency'))) + return emergency_flag + + def checkTempEmergency(self): + try: + if self.is_temp_emergency(): + self.__emergency_countdown = self.__temp_emergency_countdown + fancontrol_debug("temp is over emergency") + return True + if self.__emergency_countdown > 0: + self.__emergency_countdown -= 1 + return False + except Exception as e: + fancontrol_error("%%policy: checkTempEmergency failed") + fancontrol_error(str(e)) + return False + + def checkTempCriticalCountdown(self): + if self.__critical_countdown > 0: + return True + return False + + def checkTempEmergencyCountdown(self): + if self.__emergency_countdown > 0: + return True + return False + + def checkTempRebootCrit(self): + try: + if self.is_temp_critical(): + temp_dict = dict(self.__temps_threshold_config) + tmp = temp_dict.get(SWITCH_TEMP) + if tmp['critical_flag'] is True: + fancontrol_debug("switch temp is over reboot critical") + return TEMP_REBOOT_CRIT_SWITCH_FLAG + del temp_dict[SWITCH_TEMP] + for temp_items in temp_dict.values(): + if temp_items['ignore_threshold']: + continue + if temp_items['critical_flag'] is False: + return 0 + + fancontrol_debug("other temp is over reboot critical") + return TEMP_REBOOT_CRIT_OTHER_FLAG + except Exception as e: + fancontrol_error("%%policy: checkTempRebootCrit failed") + fancontrol_error(str(e)) + return 0 + + def checkCritReboot(self): + try: + reboot_flag = self.checkTempRebootCrit() + if reboot_flag > 0: + self.set_all_fan_speed_pwm(self.__max_pwm) + for i in range(self.__check_crit_reboot_num): + time.sleep(self.__check_crit_sleep_time) + self.get_monitor_temp() + reboot_flag = self.checkTempRebootCrit() + if reboot_flag > 0: + fancontrol_emerg("%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot critical value lasts for %d seconds." % + (self.__check_crit_sleep_time * (i + 1))) + continue + fancontrol_debug("The temperature of device is not over reboot critical value.") + break + if reboot_flag > 0: + fancontrol_emerg( + "%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot critical value, system is going to reboot now.") + for temp_threshold in self.__temps_threshold_config.values(): + fancontrol_emerg( + "%%FANCONTROL-TEMP_EMERG: %s temperature: %sC." % + (temp_threshold['name'], temp_threshold['temp'])) + if reboot_flag == TEMP_REBOOT_CRIT_SWITCH_FLAG: + create_judge_file = "touch %s" % self.__otp_switch_reboot_judge_file + else: + create_judge_file = "touch %s" % self.__otp_other_reboot_judge_file + exec_os_cmd(create_judge_file) + exec_os_cmd("sync") + time.sleep(3) + os.system("/sbin/reboot") + except Exception as e: + fancontrol_error("%%policy: checkCritReboot failed") + fancontrol_error(str(e)) + + def checkTempRebootEmerg(self): + try: + if self.is_temp_emergency(): + temp_emerg_reboot_flag = False + for temp_list in self.__check_temp_emergency_reboot: + for temp in temp_list: + tmp = self.__temps_threshold_config.get(temp) + if tmp['emergency_flag'] is False: + fancontrol_debug("temp_list %s, temp: %s not emergency" % (temp_list, temp)) + temp_emerg_reboot_flag = False + break + temp_emerg_reboot_flag = True + if temp_emerg_reboot_flag is True: + fancontrol_debug("temp_list %s, all temp is over emergency reboot" % temp_list) + return True + except Exception as e: + fancontrol_error("%%policy: checkTempRebootEmerg failed") + fancontrol_error(str(e)) + return False + + def checkEmergReboot(self): + try: + reboot_flag = False + if self.checkTempRebootEmerg() is True: + self.set_all_fan_speed_pwm(self.__max_pwm) + for i in range(self.__check_emerg_reboot_num): + time.sleep(self.__check_emerg_sleep_time) + self.get_monitor_temp() + if self.checkTempRebootEmerg() is True: + fancontrol_emerg("%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot emergency value lasts for %d seconds." % + (self.__check_emerg_sleep_time * (i + 1))) + reboot_flag = True + continue + fancontrol_debug("The temperature of device is not over reboot emergency value.") + reboot_flag = False + break + if reboot_flag is True: + fancontrol_emerg( + "%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot emergency value, system is going to reboot now.") + for temp_threshold in self.__temps_threshold_config.values(): + fancontrol_emerg( + "%%FANCONTROL-0-TEMP_EMERG: %s temperature: %sC." % + (temp_threshold['name'], temp_threshold['temp'])) + create_judge_file = "touch %s" % OTP_SWITCH_REBOOT_JUDGE_FILE + exec_os_cmd(create_judge_file) + exec_os_cmd("sync") + time.sleep(3) + os.system("/sbin/reboot") + except Exception as e: + fancontrol_error("%%policy: checkEmergReboot failed") + fancontrol_error(str(e)) + + def get_fan_total_number(self): + return self.int_case.get_fan_total_number() + + def get_rotor_number(self, fan_name): + return self.int_case.get_fan_rotor_number(fan_name) + + def get_fan_presence(self, fan_name): + return self.int_case.get_fan_presence(fan_name) + + def get_fan_rotor_status(self, fan_name, rotor_name): + return self.int_case.get_fan_rotor_status(fan_name, rotor_name) + + def get_psu_total_number(self): + return self.int_case.get_psu_total_number() + + def get_psu_presence(self, psu_name): + return self.int_case.get_psu_presence(psu_name) + + def get_psu_input_output_status(self, psu_name): + return self.int_case.get_psu_input_output_status(psu_name) + + def checkFanPresence(self): + absent_num = 0 + + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + rotor_num = self.get_rotor_number(fan_name) + tmp_fan = self.__fan_rotor_error_num.get(fan_name) + status = self.get_fan_presence(fan_name) + if status is False: + absent_num = absent_num + 1 + self.__fan_present_status[fan_name] = 0 + fancontrol_debug("%s absent" % fan_name) + else: + if self.__fan_present_status[fan_name] == 0: # absent -> present + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + self.__fan_plug_in_countdown = self.__fan_plug_in_default_countdown + self.__fan_repair_flag[fan_name] = 1 + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + tmp_fan[rotor_name] = 0 + self.__fan_present_status[fan_name] = 1 + fancontrol_debug("%s presence" % fan_name) + return absent_num + + def checkFanRotorStatus(self): + err_num = 0 + self.__fan_nok_num = 0 + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + rotor_num = self.get_rotor_number(fan_name) + tmp_fan = self.__fan_rotor_error_num.get(fan_name) + fan_rotor_err_cnt = 0 + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + status = self.get_fan_rotor_status(fan_name, rotor_name) + if status is True: + tmp_fan[rotor_name] = 0 + fancontrol_debug("%s %s ok" % (fan_name, rotor_name)) + else: + tmp_fan[rotor_name] += 1 + if tmp_fan[rotor_name] >= self.__rotor_error_count: + err_num = err_num + 1 + fan_rotor_err_cnt += 1 + fancontrol_debug("%s %s error" % (fan_name, rotor_name)) + fancontrol_debug("%s %s error %d times" % (fan_name, rotor_name, tmp_fan[rotor_name])) + if fan_rotor_err_cnt == 0: + self.__fan_rotate_status[fan_name] = 1 # FAN is ok + else: + self.__fan_rotate_status[fan_name] = 0 # FAN is not ok + self.__fan_nok_num += 1 + fancontrol_debug("fan not ok number:%d." % self.__fan_nok_num) + return err_num + + def checkPsuPresence(self): + absent_num = 0 + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + status = self.get_psu_presence(psu_name) + if status is False: + absent_num = absent_num + 1 + fancontrol_debug("%s absent" % psu_name) + else: + fancontrol_debug("%s presence" % psu_name) + return absent_num + + def checkPsuStatus(self): + err_num = 0 + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + status = self.get_psu_input_output_status(psu_name) + if status is False: + err_num = err_num + 1 + fancontrol_debug("%s error" % psu_name) + else: + fancontrol_debug("%s ok" % psu_name) + return err_num + + def checkDevError(self): + pwm = self.__min_pwm + switchtemp = self.__temps_threshold_config.get(SWITCH_TEMP)['temp'] + inlettemp = self.__temps_threshold_config.get(INLET_TEMP)['temp'] + temp_diff = abs(switchtemp - inlettemp) + fancontrol_debug("|switchtemp - inlettemp| = %d" % temp_diff) + if temp_diff >= self.__inlet_mac_diff: + fancontrol_debug("temp_diff is over than inlet_mac_diff(%d)" % self.__inlet_mac_diff) + if self.__pwm > self.__abnormal_pwm: + pwm = self.__max_pwm + else: + pwm = self.__abnormal_pwm + return pwm + + def checktempfail(self): + pwm = self.__min_pwm + for temp in self.__check_temp_fail: + temp_name = temp.get("temp_name") + temp_fail_num = self.__temps_threshold_config.get(temp_name)['fail_num'] + if temp_fail_num >= self.__temp_fail_num: + pwm = self.__abnormal_pwm + fancontrol_debug("%s temp_fail_num = %d" % (temp_name, temp_fail_num)) + fancontrol_debug("self.__temp_fail_num = %d" % self.__temp_fail_num) + return pwm + + def abnormal_check(self): + pwm_list = [] + pwm_min = self.__min_pwm + pwm_list.append(pwm_min) + + if self.__check_temp_emergency == 1: + status = self.checkTempEmergency() + if status is True: + over_emerg_pwm = self.__max_pwm + pwm_list.append(over_emerg_pwm) + fancontrol_debug("over_emerg_pwm = 0x%x" % over_emerg_pwm) + # do reset check + if self.__check_emerg_reboot_flag == 1: + self.checkEmergReboot() + else: + if self.checkTempEmergencyCountdown() is True: # temp lower than emergency in 5 min + over_emerg_countdown_pwm = self.__max_pwm + pwm_list.append(over_emerg_countdown_pwm) + fancontrol_debug("TempEmergencyCountdown: %d, over_emerg_countdown_pwm = 0x%x" % + (self.__emergency_countdown, over_emerg_countdown_pwm)) + + if self.__check_temp_critical == 1: + status = self.checkTempCritical() + if status is True: + over_crit_pwm = self.__max_pwm + pwm_list.append(over_crit_pwm) + fancontrol_debug("over_crit_pwm = 0x%x" % over_crit_pwm) + # do reset check + if self.__check_crit_reboot_flag == 1: + self.checkCritReboot() + else: + if self.checkTempCriticalCountdown() is True: # temp lower than critical in 5 min + over_crit_countdown_pwm = self.__max_pwm + pwm_list.append(over_crit_countdown_pwm) + fancontrol_debug("TempCriticalCountdown: %d, over_crit_countdown_pwm = 0x%x" % + (self.__critical_countdown, over_crit_countdown_pwm)) + + if self.__check_temp_warning == 1: + status = self.checkTempWarning() + if status is True: + over_warn_pwm = self.__warning_pwm + pwm_list.append(over_warn_pwm) + fancontrol_debug("over_warn_pwm = 0x%x" % over_warn_pwm) + else: + if self.checkTempWarningCountdown() is True: # temp lower than warning in 5 min + over_warn_countdown_pwm = self.__warning_pwm + pwm_list.append(over_warn_countdown_pwm) + fancontrol_debug("TempWarningCountdown: %d, over_warn_countdown_pwm = 0x%x" % + (self.__warning_countdown, over_warn_countdown_pwm)) + + self.__fan_absent_num = self.checkFanPresence() + if self.__fan_absent_num >= self.__fan_absent_fullspeed_num: + fan_absent_pwm = self.__max_pwm + pwm_list.append(fan_absent_pwm) + fancontrol_debug("fan_absent_pwm = 0x%x" % fan_absent_pwm) + + rotor_err_num = self.checkFanRotorStatus() + if rotor_err_num >= self.__rotor_error_fullspeed_num: + rotor_err_pwm = self.__max_pwm + pwm_list.append(rotor_err_pwm) + fancontrol_debug("rotor_err_pwm = 0x%x" % rotor_err_pwm) + + psu_absent_num = self.checkPsuPresence() + if psu_absent_num >= self.__psu_absent_fullspeed_num: + psu_absent_pwm = self.__max_pwm + pwm_list.append(psu_absent_pwm) + fancontrol_debug("psu_absent_pwm = 0x%x" % psu_absent_pwm) + + dev_err_pwm = self.checkDevError() + pwm_list.append(dev_err_pwm) + fancontrol_debug("dev_err_pwm = 0x%x" % dev_err_pwm) + + temp_fail_pwm = self.checktempfail() + pwm_list.append(temp_fail_pwm) + fancontrol_debug("temp_fail_pwm = 0x%x" % temp_fail_pwm) + + pwm = max(pwm_list) + return pwm + + def get_error_fan(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + if self.__fan_rotate_status[fan_name] == 0: + return fan_name + return None + + def fan_error_update_pwm(self, fan_pwm_dict): + try: + fancontrol_debug("enter deal fan error policy") + ori_fan_pwm_dict = fan_pwm_dict.copy() + + err_fan_name = self.get_error_fan() + if err_fan_name is None: + fancontrol_debug("fan name is None, do nothing.") + return ori_fan_pwm_dict + + if self.__fan_repair_flag[err_fan_name] == 0: + fancontrol_debug("%s already repaired, do nothing." % err_fan_name) + return ori_fan_pwm_dict + + if self.__pre_fan_nok != err_fan_name: + fancontrol_debug( + "not ok fan change from %s to %s, update countdown." % + (self.__pre_fan_nok, err_fan_name)) + self.__deal_fan_error_countdown = self.__deal_fan_error_default_countdown + if self.__pre_fan_nok != PRE_FAN_NOK_UNKNOWN: + fancontrol_debug( + "%s repaire success, %s NOT OK, try to repaire." % + (self.__pre_fan_nok, err_fan_name)) + self.__fan_repair_flag[self.__pre_fan_nok] = 0 + self.__pre_fan_nok = err_fan_name + + if self.__deal_fan_error_countdown > 0: + self.__deal_fan_error_countdown -= 1 + fancontrol_debug("%s repaire, countdown %d." % (err_fan_name, self.__deal_fan_error_countdown)) + + if self.__deal_fan_error_countdown == 0: + self.__fan_repair_flag[err_fan_name] = 0 + fancontrol_debug("%s set repaire fail flag, use origin pwm." % err_fan_name) + return ori_fan_pwm_dict + + fan_err_pwm_conf_list = self.__deal_fan_error_conf[err_fan_name] + for item in fan_err_pwm_conf_list: + fan_pwm_dict[item["name"]] = item["pwm"] + fancontrol_debug("fan pwm update, fan pwm dict:%s" % fan_pwm_dict) + + return fan_pwm_dict + except Exception as e: + fancontrol_error("%%policy: deal_fan_error raise Exception:%s" % str(e)) + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + return ori_fan_pwm_dict + + def get_fan_pwm_dict(self, default_pwm): + fan_pwm_dict = {} + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_pwm_dict[fan_name] = default_pwm + if self.__deal_fan_error_policy: + if self.__fan_absent_num == 0 and self.__fan_nok_num == 1: + fan_pwm_dict = self.fan_error_update_pwm(fan_pwm_dict) + else: + if self.__pre_fan_nok != PRE_FAN_NOK_UNKNOWN and self.__fan_rotate_status[self.__pre_fan_nok] == 1: + fancontrol_debug("%s repaire success." % (self.__pre_fan_nok)) + self.__fan_repair_flag[self.__pre_fan_nok] = 0 + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + return fan_pwm_dict + + def get_psu_pwm_dict(self, default_pwm): + psu_pwm_dict = {} + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_pwm_dict[psu_name] = default_pwm + return psu_pwm_dict + + def check_board_air_flow(self): + board_air_flow = self.board_air_flow + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if board_air_flow not in air_flow_tuple: + fanairflow_debug("get board air flow error, value [%s]" % board_air_flow) + return False + fanairflow_debug("board air flow check ok: %s" % board_air_flow) + return True + + def check_fan_air_flow(self): + if self.fan_air_flow_monitor: + fanairflow_debug("open air flow monitor, check fan air flow") + ret = self.check_board_air_flow() + if ret is False: + fanairflow_debug("get board air flow error, set fan_air_flow_inconsistent_flag False") + self.fan_air_flow_inconsistent_flag = False + return + air_flow_inconsistent_flag_tmp = False + for fan_obj in self.fan_obj_list: + fan_obj.update_fru_info() + fanairflow_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow)) + if fan_obj.air_flow == self.na_ret: + fanairflow_debug("%s get air flow failed, set air_flow_inconsistent flag False" % fan_obj.name) + fan_obj.air_flow_inconsistent = False + continue + if fan_obj.air_flow != self.board_air_flow: + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], fan air flow [%s], board air flow [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + air_flow_inconsistent_flag_tmp = True + fan_obj.air_flow_inconsistent = True + else: + fanairflow_debug("%s air flow check ok, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + fan_obj.air_flow_inconsistent = False + self.fan_air_flow_inconsistent_flag = air_flow_inconsistent_flag_tmp + else: + fanairflow_debug("air flow monitor not open, set fan_air_flow_inconsistent_flag False") + self.fan_air_flow_inconsistent_flag = False + return + + def check_psu_air_flow(self): + if self.psu_air_flow_monitor: + fanairflow_debug("open air flow monitor, check psu air flow") + ret = self.check_board_air_flow() + if ret is False: + fanairflow_debug("get board air flow error, set psu_air_flow_inconsistent_flag False") + self.psu_air_flow_inconsistent_flag = False + return + air_flow_inconsistent_flag_tmp = False + for psu_obj in self.psu_obj_list: + psu_obj.update_fru_info() + fanairflow_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow)) + if psu_obj.air_flow == self.na_ret: + fanairflow_debug("%s get air flow failed, set air_flow_inconsistent flag False" % psu_obj.name) + psu_obj.air_flow_inconsistent = False + continue + if psu_obj.air_flow != self.board_air_flow: + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], psu air flow [%s], board air flow [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + air_flow_inconsistent_flag_tmp = True + psu_obj.air_flow_inconsistent = True + else: + fanairflow_debug("%s air flow check ok, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + psu_obj.air_flow_inconsistent = False + self.psu_air_flow_inconsistent_flag = air_flow_inconsistent_flag_tmp + else: + fanairflow_debug("air flow monitor not open, set psu_air_flow_inconsistent_flag False") + self.psu_air_flow_inconsistent_flag = False + return + + def do_fancontrol(self): + pwm_list = [] + pwm_min = self.__min_pwm + pwm_list.append(pwm_min) + + # first check air flow + self.check_fan_air_flow() + self.check_psu_air_flow() + if self.fan_air_flow_inconsistent_flag is True or self.psu_air_flow_inconsistent_flag is True: + self.air_flow_inconsistent_flag = True + else: + self.air_flow_inconsistent_flag = False + fanairflow_debug("check_air_flow, air_flow_inconsistent_flag: %s" % self.air_flow_inconsistent_flag) + # get_monitor_temp + self.get_monitor_temp() + fancontrol_debug("last_pwm = 0x%x" % self.__pwm) + # openloop + inlettemp = self.__temps_threshold_config.get(INLET_TEMP)['temp'] + linear_value = self.openloop.linear_cacl(inlettemp) + if linear_value is None: + linear_value = self.__min_pwm + pwm_list.append(linear_value) + fancontrol_debug("linear_value = 0x%x" % linear_value) + + curve_value = self.openloop.curve_cacl(inlettemp) + if curve_value is None: + curve_value = self.__min_pwm + pwm_list.append(curve_value) + fancontrol_debug("curve_value = 0x%x" % curve_value) + + # hyst + for hyst_index in self.__hyst_config.values(): + temp_name = hyst_index.get("name") + hyst_flag = hyst_index.get("flag", 0) + if hyst_flag == 0: + fancontrol_debug("%s hyst flag is 0, do nothing" % temp_name) + continue + tmp_temp = int(self.__temps_threshold_config.get(temp_name)['temp']) # make sure temp is int + hyst_value = self.hyst.cacl(temp_name, tmp_temp) + if hyst_value is None: + hyst_value = self.__min_pwm + pwm_list.append(hyst_value) + fancontrol_debug("%s hyst_value = 0x%x" % (temp_name, hyst_value)) + + # pid + for pid_index in self.__pid_config.values(): + temp_name = pid_index.get("name") + pid_flag = pid_index.get("flag", 0) + if pid_flag == 0: + fancontrol_debug("%s pid flag is 0, do nothing" % temp_name) + continue + tmp_temp = self.__temps_threshold_config.get(temp_name)['temp'] + if tmp_temp is not None: + tmp_temp = int(tmp_temp) # make sure temp is int + invalid_temp_val = self.__temps_threshold_config.get(temp_name)['invalid'] + error_temp_val = self.__temps_threshold_config.get(temp_name)['error'] + if tmp_temp == invalid_temp_val: # temp is invalid + temp = None + self.pid.cacl(self.__pwm, temp_name, temp) # temp invalid, PID need to record None + pid_value = self.__temp_invalid_pid_pwm + fancontrol_debug("%s is invalid, pid_value = 0x%x" % (temp_name, pid_value)) + fancontrol_debug("temp = %d, invalid_temp = %d" % (tmp_temp, invalid_temp_val)) + elif tmp_temp == error_temp_val: # temp is error + temp = None + self.pid.cacl(self.__pwm, temp_name, temp) # temp error, PID need to record None + pid_value = self.__temp_error_pid_pwm + fancontrol_debug("%s is error, pid_value = 0x%x" % (temp_name, pid_value)) + fancontrol_debug("temp = %d, error_temp = %d" % (tmp_temp, error_temp_val)) + else: + pid_value = self.pid.cacl(self.__pwm, temp_name, tmp_temp) + else: # temp get failed + pid_value = self.pid.cacl(self.__pwm, temp_name, tmp_temp) + if pid_value is None: + pid_value = self.__min_pwm + pwm_list.append(pid_value) + fancontrol_debug("%s pid_value = 0x%x" % (temp_name, pid_value)) + + # abnormal + abnormal_value = self.abnormal_check() + pwm_list.append(abnormal_value) + fancontrol_debug("abnormal_value = 0x%x" % abnormal_value) + + if self.__fan_plug_in_countdown > 0 and self.__fan_absent_num == 0: + fancontrol_debug("fan plug in countdown %d, set plug in pwm: 0x%x" % + (self.__fan_plug_in_countdown, self.__fan_plug_in_pwm)) + self.__pwm = self.__fan_plug_in_pwm + self.__fan_plug_in_countdown -= 1 + else: + self.__pwm = max(pwm_list) + fancontrol_debug("__pwm = 0x%x\n" % self.__pwm) + if self.air_flow_inconsistent_flag is True: + fanairflow_debug("air flow inconsistent, set all fan speed pwm") + self.set_all_fan_speed_pwm(self.__pwm) + else: + fanairflow_debug("air flow consistent, deal fan error policy") + fan_pwm_dict = self.get_fan_pwm_dict(self.__pwm) + psu_pwm_dict = self.get_psu_pwm_dict(self.__pwm) + self.set_fan_pwm_independent(fan_pwm_dict, psu_pwm_dict) + + def run(self): + start_time = time.time() + while True: + try: + debug_init() + if self.__fan_status_interval > 0 and self.__fan_status_interval < self.__interval: + delta_time = time.time() - start_time + if delta_time >= self.__interval or delta_time < 0: + self.do_fancontrol() + start_time = time.time() + else: + self.checkFanPresence() + time.sleep(self.__fan_status_interval) + else: + self.do_fancontrol() + time.sleep(self.__interval) + except Exception as e: + traceback.print_exc() + fancontrol_error(str(e)) + + def set_all_fan_speed_pwm(self, pwm): + fan_pwm_dict = {} + psu_pwm_dict = {} + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_pwm_dict[fan_name] = pwm + + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_pwm_dict[psu_name] = pwm + self.set_fan_pwm_independent(fan_pwm_dict, psu_pwm_dict) + + def set_fan_pwm_independent(self, fan_pwm_dict, psu_pwm_dict): + if self.air_flow_inconsistent_flag is True: + for psu_obj in self.psu_obj_list: + if psu_obj.air_flow_inconsistent is True: + psu_pwm_dict[psu_obj.name] = self.air_flow_error_psu_pwm + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s], set psu pwm: 0x%x" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow, self.air_flow_error_psu_pwm)) + else: + psu_pwm_dict[psu_obj.name] = self.air_flow_correct_psu_pwm + fanairflow_debug("%s air flow correct, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s], set psu pwm: 0x%x" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow, self.air_flow_correct_psu_pwm)) + + for fan_obj in self.fan_obj_list: + if fan_obj.air_flow_inconsistent is True: + fan_pwm_dict[fan_obj.name] = self.air_flow_error_fan_pwm + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s], set fan pwm: 0x%x" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow, self.air_flow_error_fan_pwm)) + else: + fan_pwm_dict[fan_obj.name] = self.air_flow_correct_fan_pwm + fanairflow_debug("%s air flow correct, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s], set fan pwm: 0x%x" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow, self.air_flow_correct_fan_pwm)) + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + self.fan_set_speed_pwm_by_name(fan_name, fan_pwm_dict[fan_name]) + if self.__psu_fan_control == 1: + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + self.psu_set_speed_pwm_by_name(psu_name, psu_pwm_dict[psu_name]) + + def fan_set_speed_pwm_by_name(self, fan_name, pwm): + duty = round(pwm * 100 / 255) + rotor_len = self.get_rotor_number(fan_name) + for i in range(rotor_len): + val = self.int_case.set_fan_speed_pwm(fan_name, i + 1, duty) + if val != 0: + fancontrol_error("%s rotor%d: %d" % (fan_name, i + 1, val)) + + def psu_set_speed_pwm_by_name(self, psu_name, pwm): + duty = round(pwm * 100 / 255) + status = self.int_case.set_psu_fan_speed_pwm(psu_name, int(duty)) + if status is not True: + fancontrol_error("set %s speed fail" % psu_name) + + def fan_obj_init(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_obj = DevFan(fan_name, self.int_case) + self.fan_obj_list.append(fan_obj) + fanairflow_debug("fan object initialize success") + + def psu_obj_init(self): + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_obj = DevPsu(psu_name, self.int_case) + self.psu_obj_list.append(psu_obj) + fanairflow_debug("psu object initialize success") + + +if __name__ == '__main__': + debug_init() + fancontrol_debug("enter main") + fan_control = fancontrol() + fan_control.fan_obj_init() + fan_control.psu_obj_init() + fan_control.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py new file mode 100755 index 000000000000..c21fd3c1f585 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py @@ -0,0 +1,830 @@ +#!/usr/bin/env python3 +import time +import syslog +import traceback +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil +try: + import abc +except ImportError as error: + raise ImportError(str(error) + " - required module not found") from error + +SWITCH_TEMP = "SWITCH_TEMP" +F2B_AIR_FLOW = "intake" +B2F_AIR_FLOW = "exhaust" +ONIE_E2_NAME = "ONIE_E2" + +# status +STATUS_PRESENT = "PRESENT" +STATUS_ABSENT = "ABSENT" +STATUS_OK = "OK" +STATUS_NOT_OK = "NOT OK" +STATUS_FAILED = "FAILED" +STATUS_UNKNOWN = "UNKNOWN" + +LEDCTROL_DEBUG_FILE = "/etc/.ledcontrol_debug_flag" + +LEDCTROLERROR = 1 +LEDCTROLDEBUG = 2 + +debuglevel = 0 +# led status defined +COLOR_GREEN = 1 +COLOR_AMBER = 2 +COLOR_RED = 3 +LED_STATUS_DICT = {COLOR_GREEN: "green", COLOR_AMBER: "amber", COLOR_RED: "red"} + + +def ledcontrol_debug(s): + if LEDCTROLDEBUG & debuglevel: + syslog.openlog("LEDCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def ledcontrol_error(s): + if LEDCTROLERROR & debuglevel: + syslog.openlog("LEDCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def air_flow_warn(s): + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_WARNING, s) + + +def air_flow_error(s): + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_ERR, s) + + +def air_flow_emerg(s): + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_EMERG, s) + + +def debug_init(): + global debuglevel + try: + with open(LEDCTROL_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +class DevBase(object): + __metaclass__ = abc.ABCMeta + + def __init__(self, name, air_flow_monitor): + self.__name = name + self.__air_flow_monitor = air_flow_monitor + self.present = STATUS_UNKNOWN + self.status = STATUS_UNKNOWN + self.status_summary = STATUS_UNKNOWN + self.origin_name = STATUS_UNKNOWN + self.display_name = STATUS_UNKNOWN + self.air_flow = STATUS_UNKNOWN + self.led_status = COLOR_GREEN + + @property + def name(self): + return self.__name + + @property + def air_flow_monitor(self): + return self.__air_flow_monitor + + @abc.abstractmethod + def get_present(self): + """ + Gets the present status of PSU/FAN + + Returns: + A string, e.g. 'PRESENT, ABSENT, FAILED' + """ + raise NotImplementedError + + @abc.abstractmethod + def get_status(self): + """ + Gets the status of PSU/FAN + + Returns: + A string, e.g. 'OK, NOT OK, FAILED' + """ + raise NotImplementedError + + @abc.abstractmethod + def update_dev_info(self): + """ + update status and fru info of PSU/FAN + + include present, status, status_summary, part_model_name, product_name, air_flow + """ + raise NotImplementedError + + @abc.abstractmethod + def set_module_led(self, color): + """ + set PSU/FAN module LED status + + Args: + color: A string representing the color with which to set the + PSU/FAN module LED status + + Returns: + bool: True if status LED state is set successfully, False if not + """ + raise NotImplementedError + + +class DevPsu(DevBase): + + def __init__(self, name, air_flow_monitor, hal_interface): + super(DevPsu, self).__init__(name, air_flow_monitor) + self.int_case = hal_interface + + def get_psu_presence(self): + return self.int_case.get_psu_presence(self.name) + + def get_psu_input_output_status(self): + return self.int_case.get_psu_input_output_status(self.name) + + def get_psu_fru_info(self): + return self.int_case.get_psu_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def get_present(self): + try: + status = self.get_psu_presence() + if status is True: + return STATUS_PRESENT + if status is False: + return STATUS_ABSENT + except Exception as e: + ledcontrol_error("get %s present status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def get_status(self): + try: + status = self.get_psu_input_output_status() + if status is True: + return STATUS_OK + if status is False: + return STATUS_NOT_OK + except Exception as e: + ledcontrol_error("get %s status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def update_dev_info(self): + try: + # update status + self.present = self.get_present() + if self.present != STATUS_PRESENT: + self.status = STATUS_UNKNOWN + self.status_summary = self.present + else: + self.status = self.get_status() + self.status_summary = self.status + # update fru info if need air flow monitor + if self.air_flow_monitor: + dic = self.get_psu_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + ledcontrol_error("update %s info error, msg: %s" % (self.name, str(e))) + self.present = STATUS_FAILED + self.status = STATUS_FAILED + self.status_summary = STATUS_FAILED + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + def set_module_led(self, color): + """ + set PSU module LED is not support, always return True + """ + return True + + +class DevFan(DevBase): + + def __init__(self, name, air_flow_monitor, hal_interface): + super(DevFan, self).__init__(name, air_flow_monitor) + self.int_case = hal_interface + + def get_fan_rotor_number(self): + return self.int_case.get_fan_rotor_number(self.name) + + def get_fan_presence(self): + return self.int_case.get_fan_presence(self.name) + + def get_fan_rotor_status(self, rotor_name): + return self.int_case.get_fan_rotor_status(self.name, rotor_name) + + def get_fan_fru_info(self): + return self.int_case.get_fan_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def get_present(self): + try: + status = self.get_fan_presence() + if status is True: + return STATUS_PRESENT + if status is False: + return STATUS_ABSENT + except Exception as e: + ledcontrol_error("get %s present status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def get_status(self): + try: + rotor_num = self.get_fan_rotor_number() + err_motor_num = 0 + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + roll_status = self.get_fan_rotor_status(rotor_name) + if roll_status is not True: + err_motor_num += 1 + ledcontrol_debug("%s %s error, status %s" % (self.name, rotor_name, roll_status)) + else: + ledcontrol_debug("%s %s ok" % (self.name, rotor_name)) + if err_motor_num > 0: + return STATUS_NOT_OK + return STATUS_OK + except Exception as e: + ledcontrol_error("get %s status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def update_dev_info(self): + try: + # update status + self.present = self.get_present() + if self.present != STATUS_PRESENT: + self.status = STATUS_UNKNOWN + self.status_summary = self.present + else: + self.status = self.get_status() + self.status_summary = self.status + # update fru info if need air flow monitor + if self.air_flow_monitor: + dic = self.get_fan_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + ledcontrol_error("update %s fru info error, msg: %s" % (self.name, str(e))) + self.present = STATUS_FAILED + self.status = STATUS_FAILED + self.status_summary = STATUS_FAILED + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + def set_module_led(self, color): + ret = self.int_case.set_fan_led(self.name, color) + if ret == 0: + return True + return False + + +class ledcontrol(object): + + def __init__(self): + self.fan_obj_list = [] + self.psu_obj_list = [] + self.board_psu_led_status = COLOR_GREEN + self.board_fan_led_status = COLOR_GREEN + self.__board_air_flow = "" + self.int_case = interface() + self.__config = baseutil.get_monitor_config() + self.__temps_threshold_config = self.__config["temps_threshold"] + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['temp'] = 0 + temp_threshold['fail_num'] = 0 + self.__ledcontrol_para = self.__config["ledcontrol_para"] + self.__interval = self.__ledcontrol_para.get("interval", 5) + self.__checkpsu = self.__ledcontrol_para.get("checkpsu", 0) + self.__checkfan = self.__ledcontrol_para.get("checkfan", 0) + self.__psu_amber_num = self.__ledcontrol_para.get("psu_amber_num") + self.__fan_amber_num = self.__ledcontrol_para.get("fan_amber_num") + self.__psu_air_flow_amber_num = self.__ledcontrol_para.get("psu_air_flow_amber_num", 0) + self.__fan_air_flow_amber_num = self.__ledcontrol_para.get("fan_air_flow_amber_num", 0) + self.__board_sys_led = self.__ledcontrol_para.get("board_sys_led", []) + self.__board_psu_led = self.__ledcontrol_para.get("board_psu_led", []) + self.__board_fan_led = self.__ledcontrol_para.get("board_fan_led", []) + self.__psu_air_flow_monitor = self.__ledcontrol_para.get("psu_air_flow_monitor", 0) + self.__fan_air_flow_monitor = self.__ledcontrol_para.get("fan_air_flow_monitor", 0) + self.__fan_mix_list = self.__ledcontrol_para.get("fan_mix_list", []) + + @property + def na_ret(self): + return self.int_case.na_ret + + @property + def checkpsu(self): + return self.__checkpsu + + @property + def checkfan(self): + return self.__checkfan + + @property + def psu_amber_num(self): + return self.__psu_amber_num + + @property + def fan_amber_num(self): + return self.__fan_amber_num + + @property + def psu_air_flow_amber_num(self): + return self.__psu_air_flow_amber_num + + @property + def fan_air_flow_amber_num(self): + return self.__fan_air_flow_amber_num + + @property + def psu_air_flow_monitor(self): + return self.__psu_air_flow_monitor + + @property + def fan_air_flow_monitor(self): + return self.__fan_air_flow_monitor + + @property + def board_sys_led(self): + return self.__board_sys_led + + @property + def board_psu_led(self): + return self.__board_psu_led + + @property + def board_fan_led(self): + return self.__board_fan_led + + @property + def fan_mix_list(self): + return self.__fan_mix_list + + @property + def interval(self): + return self.__interval + + def get_fan_total_number(self): + return self.int_case.get_fan_total_number() + + def get_psu_total_number(self): + return self.int_case.get_psu_total_number() + + def get_onie_e2_obj(self, name): + return self.int_case.get_onie_e2_obj(name) + + def set_led_color(self, led_name, color): + try: + ret = self.int_case.set_led_color(led_name, color) + except Exception as e: + ledcontrol_error("set %s led %s error, msg: %s" % (led_name, color, str(e))) + ret = False + return ret + + def set_sys_led(self, color): + for led in self.board_sys_led: + led_name = led.get("led_name") + ret = self.set_led_color(led_name, color) + if ret is True: + ledcontrol_debug("set %s success, color:%s," % (led_name, color)) + else: + ledcontrol_debug("set %s failed, color:%s," % (led_name, color)) + + def set_psu_led(self, color): + for led in self.board_psu_led: + led_name = led.get("led_name") + ret = self.set_led_color(led_name, color) + if ret is True: + ledcontrol_debug("set %s success, color:%s," % (led_name, color)) + else: + ledcontrol_debug("set %s failed, color:%s," % (led_name, color)) + + def set_fan_led(self, color): + for led in self.board_fan_led: + led_name = led.get("led_name") + ret = self.set_led_color(led_name, color) + if ret is True: + ledcontrol_debug("set %s success, color:%s," % (led_name, color)) + else: + ledcontrol_debug("set %s failed, color:%s," % (led_name, color)) + + def set_fan_module_led(self): + for fan_obj in self.fan_obj_list: + color = LED_STATUS_DICT.get(fan_obj.led_status) + ret = fan_obj.set_module_led(color) + if ret is True: + ledcontrol_debug("set %s module led success, color: %s," % (fan_obj.name, color)) + else: + ledcontrol_debug("set %s module led failed, color: %s," % (fan_obj.name, color)) + + @property + def board_air_flow(self): + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if self.__board_air_flow not in air_flow_tuple: + self.__board_air_flow = self.int_case.get_device_airflow(ONIE_E2_NAME) + ledcontrol_debug("board_air_flow: %s" % self.__board_air_flow) + return self.__board_air_flow + + def update_psu_info(self): + for psu_obj in self.psu_obj_list: + psu_obj.update_dev_info() + ledcontrol_debug("%s present: [%s], status: [%s] status_summary [%s]" % + (psu_obj.name, psu_obj.present, psu_obj.status, psu_obj.status_summary)) + if psu_obj.air_flow_monitor: + ledcontrol_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow)) + + def update_fan_info(self): + for fan_obj in self.fan_obj_list: + fan_obj.update_dev_info() + ledcontrol_debug("%s present: [%s], status: [%s] status_summary [%s]" % + (fan_obj.name, fan_obj.present, fan_obj.status, fan_obj.status_summary)) + if fan_obj.air_flow_monitor: + ledcontrol_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow)) + + def get_monitor_temp(self): + sensorlist = self.int_case.get_temp_info() + + for temp_threshold in self.__temps_threshold_config.values(): + sensor = sensorlist.get(temp_threshold['name']) + if sensor["Value"] is None: + temp_threshold['fail_num'] += 1 + ledcontrol_error("get %s failed, fail_num = %d" % (temp_threshold['name'], temp_threshold['fail_num'])) + else: + temp_threshold['fail_num'] = 0 + temp_threshold.setdefault('fix', 0) + temp_threshold['temp'] = sensor["Value"] + temp_threshold['fix'] + ledcontrol_debug("%s = %d" % (temp_threshold['name'], temp_threshold['temp'])) + ledcontrol_debug("warning = %d, critical = %d" % (temp_threshold['warning'], temp_threshold['critical'])) + + def is_temp_warning(self): + warning_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + if temp_threshold['temp'] >= temp_threshold['warning']: + warning_flag = True + ledcontrol_debug("%s is over warning" % temp_threshold['name']) + ledcontrol_debug( + "%s = %d, warning = %d" % + (temp_threshold['name'], + temp_threshold['temp'], + temp_threshold['warning'])) + return warning_flag + + def checkTempWarning(self): + try: + if self.is_temp_warning(): + ledcontrol_debug("temp is over warning") + return True + except Exception as e: + ledcontrol_error("%%policy: checkTempWarning failed") + ledcontrol_error(str(e)) + return False + + def is_temp_critical(self): + critical_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['critical_flag'] = False + if temp_threshold['temp'] >= temp_threshold['critical']: + critical_flag = True + temp_threshold['critical_flag'] = True + ledcontrol_debug("%s is over critical" % temp_threshold['name']) + ledcontrol_debug( + "%s = %d, critical = %d" % + (temp_threshold['name'], + temp_threshold['temp'], + temp_threshold['critical'])) + return critical_flag + + def checkTempCrit(self): + try: + if self.is_temp_critical(): + temp_dict = dict(self.__temps_threshold_config) + tmp = temp_dict.get(SWITCH_TEMP) + if tmp['critical_flag'] is True: + ledcontrol_debug("temp is over critical") + return True + + del temp_dict[SWITCH_TEMP] + for temp_items in temp_dict.values(): + if temp_items['critical_flag'] is False: + return False + + ledcontrol_debug("temp is over critical") + return True + except Exception as e: + ledcontrol_error("%%policy: checkTempCrit failed") + ledcontrol_error(str(e)) + return False + + def check_board_air_flow(self): + board_air_flow = self.board_air_flow + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if board_air_flow not in air_flow_tuple: + air_flow_error("%%AIR_FLOW_MONITOR-3-BOARD: Get board air flow failed, value: %s." % board_air_flow) + return False + ledcontrol_debug("board air flow check ok: %s" % board_air_flow) + return True + + def get_monitor_fan_status(self): + fanerrnum = 0 + for fan_obj in self.fan_obj_list: + status = fan_obj.status_summary + ledcontrol_debug("%s status: %s" % (fan_obj.name, status)) + if status != STATUS_OK: + fan_obj.led_status = COLOR_RED + fanerrnum += 1 + else: + fan_obj.led_status = COLOR_GREEN + ledcontrol_debug("fan error number: %d" % fanerrnum) + + if fanerrnum == 0: + fan_led_status = COLOR_GREEN + elif fanerrnum <= self.fan_amber_num: + fan_led_status = COLOR_AMBER + else: + fan_led_status = COLOR_RED + ledcontrol_debug("monitor fan status, set fan led: %s" % LED_STATUS_DICT.get(fan_led_status)) + return fan_led_status + + def get_monitor_psu_status(self): + psuerrnum = 0 + for psu_obj in self.psu_obj_list: + status = psu_obj.status_summary + ledcontrol_debug("%s status: %s" % (psu_obj.name, status)) + if status != STATUS_OK: + psu_obj.led_status = COLOR_RED + psuerrnum += 1 + else: + psu_obj.led_status = COLOR_GREEN + ledcontrol_debug("psu error number: %d" % psuerrnum) + + if psuerrnum == 0: + psu_led_status = COLOR_GREEN + elif psuerrnum <= self.psu_amber_num: + psu_led_status = COLOR_AMBER + else: + psu_led_status = COLOR_RED + ledcontrol_debug("monitor psu status, set psu led: %s" % LED_STATUS_DICT.get(psu_led_status)) + return psu_led_status + + def get_monitor_fan_air_flow(self): + if self.fan_air_flow_monitor == 0: + ledcontrol_debug("fan air flow monitor not open, default green") + return COLOR_GREEN + + ret = self.check_board_air_flow() + if ret is False: + ledcontrol_debug("check board air flow error, skip fan air flow monitor.") + return COLOR_GREEN + + fan_led_status_list = [] + fan_air_flow_ok_obj_list = [] + fan_air_flow_ok_set = set() + fan_module_led_list = [] + fan_air_flow_err_num = 0 + for fan_obj in self.fan_obj_list: + if fan_obj.present != STATUS_PRESENT: + fan_module_led_list.append(COLOR_GREEN) + continue + if fan_obj.air_flow == self.na_ret: + air_flow_warn("%%AIR_FLOW_MONITOR-4-FAN: %s get air flow failed, fan model: %s, air flow: %s." % + (fan_obj.name, fan_obj.display_name, fan_obj.air_flow)) + led_status = COLOR_AMBER + fan_module_led_list.append(led_status) + elif fan_obj.air_flow != self.board_air_flow: + air_flow_emerg("%%AIR_FLOW_MONITOR-0-FAN: %s air flow error, fan model: %s, fan air flow: %s, board air flow: %s." % + (fan_obj.name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + led_status = COLOR_RED + fan_air_flow_err_num += 1 + else: + fan_air_flow_ok_obj_list.append(fan_obj) + fan_air_flow_ok_set.add(fan_obj.origin_name) + ledcontrol_debug("%s air flow check ok, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + led_status = COLOR_GREEN + fan_module_led_list.append(led_status) + if led_status > fan_obj.led_status: + fan_obj.led_status = led_status + if len(fan_module_led_list) != 0: + fan_led_status = max(fan_module_led_list) + fan_led_status_list.append(fan_led_status) + # check fan mixing + if len(fan_air_flow_ok_set) > 1 and fan_air_flow_ok_set not in self.fan_mix_list: + for fan_obj in fan_air_flow_ok_obj_list: + air_flow_warn("%%AIR_FLOW_MONITOR-4-FAN: %s mixing, fan model: %s, air flow: %s." % + (fan_obj.name, fan_obj.origin_name, fan_obj.air_flow)) + fan_led_status = COLOR_AMBER + fan_led_status_list.append(fan_led_status) + # check fan air flow error number + if fan_air_flow_err_num == 0: + fan_led_status = COLOR_GREEN + elif fan_air_flow_err_num <= self.fan_air_flow_amber_num: + fan_led_status = COLOR_AMBER + else: + fan_led_status = COLOR_RED + fan_led_status_list.append(fan_led_status) + + fan_led_status = max(fan_led_status_list) + ledcontrol_debug("monitor fan air flow, set fan led: %s" % LED_STATUS_DICT.get(fan_led_status)) + return fan_led_status + + def get_monitor_psu_air_flow(self): + if self.psu_air_flow_monitor == 0: + ledcontrol_debug("psu air flow monitor not open, default green") + return COLOR_GREEN + + ret = self.check_board_air_flow() + if ret is False: + ledcontrol_debug("check board air flow error, skip psu air flow monitor.") + return COLOR_GREEN + + psu_led_status_list = [] + psu_module_led_list = [] + psu_air_flow_err_num = 0 + for psu_obj in self.psu_obj_list: + if psu_obj.present != STATUS_PRESENT: + psu_module_led_list.append(COLOR_GREEN) + continue + if psu_obj.air_flow == self.na_ret: + air_flow_warn("%%AIR_FLOW_MONITOR-4-PSU: %s get air flow failed, psu model: %s, air flow: %s." % + (psu_obj.name, psu_obj.display_name, psu_obj.air_flow)) + led_status = COLOR_AMBER + psu_module_led_list.append(led_status) + elif psu_obj.air_flow != self.board_air_flow: + air_flow_emerg("%%AIR_FLOW_MONITOR-0-PSU: %s air flow error, psu model: %s, psu air flow: %s, board air flow: %s." % + (psu_obj.name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + led_status = COLOR_RED + psu_air_flow_err_num += 1 + else: + ledcontrol_debug("%s psu air flow check ok, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + led_status = COLOR_GREEN + psu_module_led_list.append(led_status) + if led_status > psu_obj.led_status: + psu_obj.led_status = led_status + + if len(psu_module_led_list) != 0: + psu_led_status = max(psu_module_led_list) + psu_led_status_list.append(psu_led_status) + + # check fan air flow error number + if psu_air_flow_err_num == 0: + psu_led_status = COLOR_GREEN + elif psu_air_flow_err_num <= self.psu_air_flow_amber_num: + psu_led_status = COLOR_AMBER + else: + psu_led_status = COLOR_RED + psu_led_status_list.append(psu_led_status) + + psu_led_status = max(psu_led_status_list) + ledcontrol_debug("monitor psu air flow, set psu led: %s" % LED_STATUS_DICT.get(psu_led_status)) + return psu_led_status + + def get_temp_sys_led_status(self): + if self.checkTempCrit() is True: + sys_led_status = COLOR_RED + elif self.checkTempWarning() is True: + sys_led_status = COLOR_AMBER + else: + sys_led_status = COLOR_GREEN + ledcontrol_debug("monitor temperature, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status)) + return sys_led_status + + def get_sys_led_follow_fan_status(self): + + if self.checkfan: + sys_led_status = self.board_fan_led_status + ledcontrol_debug("sys led follow fan led, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status)) + else: + sys_led_status = COLOR_GREEN + ledcontrol_debug("sys led don't follow fan led, set default green") + return sys_led_status + + def get_sys_led_follow_psu_status(self): + if self.checkpsu: + sys_led_status = self.board_psu_led_status + ledcontrol_debug("sys led follow psu led, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status)) + else: + sys_led_status = COLOR_GREEN + ledcontrol_debug("sys led don't follow psu led, set default green") + return sys_led_status + + def dealSysLedStatus(self): + sys_led_status_list = [] + # get_monitor_temp + self.get_monitor_temp() + + # monitor temp get sys led status + sys_led_status = self.get_temp_sys_led_status() + sys_led_status_list.append(sys_led_status) + + # check sys led follow fan led status + sys_led_status = self.get_sys_led_follow_fan_status() + sys_led_status_list.append(sys_led_status) + + # check sys led follow psu led status + sys_led_status = self.get_sys_led_follow_psu_status() + sys_led_status_list.append(sys_led_status) + + sys_led_status = max(sys_led_status_list) + sys_led_color = LED_STATUS_DICT.get(sys_led_status) + + # set sys led + self.set_sys_led(sys_led_color) + + def dealFanLedStatus(self): + fan_led_status_list = [] + # update fan info + self.update_fan_info() + + # monitor fan status first + fan_led_status = self.get_monitor_fan_status() + fan_led_status_list.append(fan_led_status) + + # monitor fan air flow + fan_led_status = self.get_monitor_fan_air_flow() + fan_led_status_list.append(fan_led_status) + + self.board_fan_led_status = max(fan_led_status_list) + fan_led_color = LED_STATUS_DICT.get(self.board_fan_led_status) + + # set fan led + self.set_fan_led(fan_led_color) + # set fan module led + self.set_fan_module_led() + + def dealPsuLedStatus(self): + psu_led_status_list = [] + # update psu info + self.update_psu_info() + + # monitor psu status first + psu_led_status = self.get_monitor_psu_status() + psu_led_status_list.append(psu_led_status) + + # monitor psu air flow + psu_led_status = self.get_monitor_psu_air_flow() + psu_led_status_list.append(psu_led_status) + + self.board_psu_led_status = max(psu_led_status_list) + psu_led_color = LED_STATUS_DICT.get(self.board_psu_led_status) + + # set psu led + self.set_psu_led(psu_led_color) + + def do_ledcontrol(self): + self.dealPsuLedStatus() + self.dealFanLedStatus() + self.dealSysLedStatus() + + def fan_obj_init(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_obj = DevFan(fan_name, self.fan_air_flow_monitor, self.int_case) + self.fan_obj_list.append(fan_obj) + ledcontrol_debug("fan object initialize success") + + def psu_obj_init(self): + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_obj = DevPsu(psu_name, self.psu_air_flow_monitor, self.int_case) + self.psu_obj_list.append(psu_obj) + ledcontrol_debug("psu object initialize success") + + def run(self): + while True: + try: + debug_init() + self.do_ledcontrol() + time.sleep(self.interval) + except Exception as e: + traceback.print_exc() + ledcontrol_error(str(e)) + + +if __name__ == '__main__': + debug_init() + ledcontrol_debug("enter main") + led_control = ledcontrol() + led_control.fan_obj_init() + led_control.psu_obj_init() + led_control.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py new file mode 100755 index 000000000000..766152256810 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py @@ -0,0 +1,492 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import inspect +import sys +import json +import time +from plat_hal.interface import interface + + +class Command(): + def __init__(self, name, f): + self.name = name + self.f = f + self.paramcount = self.f.__code__.co_argcount + + def dofun(self, args): + fn = self.f.__call__ + fn(*args) + + +class Group(): + def __init__(self, name, f): + self.groups = [] + self.commands = [] + self.name = name + self.f = f + + def add_groups(self, command): + self.groups.append(command) + + def add_commands(self, commnad): + x = Command(commnad.__name__, commnad) + self.commands.append(x) + + def find_valuebyname(self, name): + for item in self.groups: + if name == item.name: + return item + for item in self.commands: + if name == item.name: + return item + return None + + def deal(self, args): + if len(args) <= 0: + return self.print_help() + funclevel = args[0] + val = self.find_valuebyname(funclevel) + if val is None: + return self.print_help() + if isinstance(val, Command): + if len(args) < (val.paramcount + 1): + return self.print_help() + inputargs = args[1: (1 + val.paramcount)] + return val.dofun(inputargs) + if isinstance(val, Group): + args = args[1:] + return val.deal(args) + return self.print_help() + + def get_max(self, arr): + lentmp = 0 + for ar in arr: + lentmp = len(ar) if (len(ar) > lentmp) else lentmp + return lentmp + + def print_help(self): + + namesize = [] + for item in self.groups: + namesize.append(item.name) + for item in self.commands: + namesize.append(item.name) + maxvalue = self.get_max(namesize) + + if len(self.groups) > 0: + print("Groups:") + for item in self.groups: + print(" %-*s %s" % (maxvalue, item.name, item.f.__doc__ or '')) + if len(self.commands) > 0: + print("Commands:") + for item in self.commands: + print(" %-*s %s" % (maxvalue, item.name, item.f.__doc__ or '')) + + +class clival(): + @staticmethod + def Fire(val=None): + group = Group("top", 'mainlevel') + clival.iterGroup(val, group) + # context = {} + # caller = inspect.stack()[1] + # caller_frame = caller[0] + # caller_globals = caller_frame.f_globals + # caller_locals = caller_frame.f_locals + # context.update(caller_globals) + # context.update(caller_locals) + args = sys.argv[1:] + group.deal(args) + + @staticmethod + def iterGroup(val, group): + for key, item in val.items(): + if item is None: # first level + if inspect.isfunction(key): + group.add_commands(key) + else: + group1 = Group(key.__name__, key) + clival.iterGroup(item, group1) + group.add_groups(group1) + + +def psu(): + r'''test psu ''' + + +def fan(): + r'''test fan ''' + + +def sensor(): + r'''test sensor ''' + + +def dcdc(): + r'''test dcdc ''' + + +def led(): + r'''test led ''' + + +def e2(): + r'''test onie eeprom ''' + + +def temps(): + r'''test temps sensor''' + +def cpu(): + r'''test cpu''' + + +int_case = interface() + + +def get_total_number(): + r'''psu get_total_number ''' + print("=================get_total_number======================") + print(int_case.get_psu_total_number()) + + +def get_presence(): + r'''psu get_presence ''' + print("=================get_presence======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(int_case.get_psu_presence(psu_item.name)) + + +def get_fru_info(): + r'''psu get_fru_info ''' + print("=================get_fru_info======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_fru_info(psu_item.name), ensure_ascii=False, indent=4)) + + +def get_status(): + r'''psu get_status ''' + print("=================get_status======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_status(psu_item.name), ensure_ascii=False, indent=4)) + + +def set_psu_fan_speed_pwm(realspeed): + r'''set_psu_fan_speed_pwm''' + print("=================set_psu_fan_speed_pwm======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(int_case.set_psu_fan_speed_pwm(psu_item.name, int(realspeed))) + + +def get_psu_fan_speed_pwm(): + r'''get_psu_fan_speed_pwm''' + print("=================get_psu_fan_speed_pwm======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_fan_speed_pwm(psu_item.name))) + + +def get_psu_power_status(): + r'''psu get_psu_power_status ''' + print("=================get_psu_power_status======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_power_status(psu_item.name), ensure_ascii=False, indent=4)) + + +def get_info_all(): + r'''psu get_info_all ''' + print("=================get_info_all======================") + print(json.dumps(int_case.get_psu_info_all(), ensure_ascii=False, indent=4)) + + +def fan_get_total_number(): + print("=================get_info_all======================") + print(json.dumps(int_case.get_fan_total_number(), ensure_ascii=False, indent=4)) + + +def fan_get_rotor_number(): + r'''fan_get_rotor_number''' + print("=================fan_get_rotor_number======================") + fans = int_case.get_fans() + for fan_item in fans: + print(fan_item.name, end=' ') + print(int_case.get_fan_rotor_number(fan_item.name)) + + +def fan_get_speed(): + r'''fan_get_speed''' + print("=================fan_get_speed======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + index = rotors.index(rotor) + print("%s rotor%d" % (fan_item.name, index + 1), end=' ') + print(int_case.get_fan_speed(fan_item.name, index + 1)) + + +def fan_get_speed_pwm(): + r'''fan_get_speed_pwm''' + print("=================fan_get_speed_pwm======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + index = rotors.index(rotor) + print("%s rotor%d" % (fan_item.name, index + 1), end=' ') + print(int_case.get_fan_speed_pwm(fan_item.name, index + 1)) + + +def fan_set_speed_pwm(pwm): + r'''fan_set_speed_pwm''' + print("=================fan_set_speed_pwm======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + index = rotors.index(rotor) + print("%s %s" % (fan_item.name, rotor.name), end=' ') + val = int_case.set_fan_speed_pwm(fan_item.name, index + 1, pwm) + print(val) + + +def fan_get_watchdog_status(): + r'''fan_get_watchdog_status''' + print("=================fan_get_watchdog_status======================") + print(int_case.get_fan_watchdog_status()) + + +def fan_enable_watchdog(): + r'''fan_enable_watchdog''' + print("=================fan_enable_watchdog======================") + print('enable', int_case.enable_fan_watchdog()) + + +def fan_disable_watchdog(): + r'''fan_disable_watchdog''' + print("=================fan_disable_watchdog======================") + print('disable', int_case.enable_fan_watchdog(enable=False)) + + +def fan_get_speed1(): + r'''fan_get_speed''' + print("=================fan_get_speed======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + print("%s %s" % (fan_item.name, rotor.name), end=' ') + print(int_case.get_fan_speed(fan_item.name, rotor.name)) + + +def fan_feed_watchdog(): + r'''fan_feed_watchdog''' + print("=================fan_feed_watchdog======================") + fan_get_speed() + print(int_case.feed_fan_watchdog()) + time.sleep(2) + fan_get_speed() + + +def fan_set_led(color): + r'''fan_set_led''' + print("=================fan_set_led======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(color, int_case.set_fan_led(fan_item.name, color)) + +def fan_get_led(): + r'''fan_get_led''' + print("=================fan_get_led======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(int_case.get_fan_led(fan_item.name)) + + +def fan_get_presence(): + r'''fan_get_presence''' + print("=================fan_get_presence======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(int_case.get_fan_presence(fan_item.name)) + + +def fan_get_fru_info(): + r'''fan_get_fru_info''' + print("=================fan_get_fru_info======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(json.dumps(int_case.get_fan_info(fan_item.name), ensure_ascii=False, indent=4)) + + +def fan_get_status(): + r'''fan_get_status''' + print("=================fan_get_status======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(json.dumps(int_case.get_fan_status(fan_item.name), ensure_ascii=False, indent=4)) + + +def fan_get_info_all(): + r'''fan_get_info_all''' + print("=================fan_get_info_all======================") + print(json.dumps(int_case.get_fan_info_all(), ensure_ascii=False, indent=4)) + + +def get_sensor_info(): + r'''get_sensor_info''' + print("=================get_sensor_info======================") + print(json.dumps(int_case.get_sensor_info(), ensure_ascii=False, indent=4)) + + +def get_dcdc_all_info(): + r'''get_dcdc_all_info''' + print("=================get_dcdc_all_info======================") + print(json.dumps(int_case.get_dcdc_all_info(), ensure_ascii=False, indent=4)) + + +def set_all_led_color(color): + r'''set_all_led_color color''' + print("=================set_all_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + print("%s" % led_item.name) + print(color, int_case.set_led_color(led_item.name, color)) + + +def get_all_led_color(): + r'''get_all_led_color''' + print("=================get_all_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + print("%s" % led_item.name) + print(int_case.get_led_color(led_item.name)) + + +def set_single_led_color(led_name, color): + r'''set_single_led_color led_name color''' + print("=================set_single_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + if led_name == led_item.name: + print("%s" % led_item.name) + print(color, int_case.set_led_color(led_item.name, color)) + + +def get_single_led_color(led_name): + r'''get_single_led_color''' + print("=================get_single_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + if led_name == led_item.name: + print("%s" % led_item.name) + print(int_case.get_led_color(led_item.name)) + + +def get_onie_e2_path(): + r'''get_onie_e2_path''' + print("=================get_onie_e2_path======================") + path = int_case.get_onie_e2_path("ONIE_E2") + print("%s" % path) + + +def get_device_airflow(): + r'''get_device_airflow''' + print("=================get_device_airflow======================") + airflow = int_case.get_device_airflow("ONIE_E2") + print("%s" % airflow) + + +def get_temps_sensor(): + r'''get_temps_sensor''' + print("=================get_temps_sensor======================") + temp_list = int_case.get_temps() + for temp in temp_list: + print("id: %s, name: %s, API name: %s, value: %s" % (temp.temp_id, temp.name, temp.api_name, temp.Value)) + +def get_cpu_reset_num(): + r'''get_cpu_reset_num''' + print("=================get_cpu_reset_num======================") + print(int_case.get_cpu_reset_num()) + +def get_cpu_reboot_cause(): + r'''get_cpu_reboot_cause''' + print("=================get_cpu_reboot_cause======================") + print(int_case.get_cpu_reboot_cause()) + + +def run_cli_man(): + clival.Fire( + { + psu: { + get_total_number: None, + get_presence: None, + get_fru_info: None, + set_psu_fan_speed_pwm: None, + get_psu_fan_speed_pwm: None, + get_status: None, + get_psu_power_status: None, + get_info_all: None + }, + fan: { + fan_get_total_number: None, + fan_get_rotor_number: None, + fan_get_speed: None, + fan_get_speed_pwm: None, + fan_set_speed_pwm: None, + fan_get_watchdog_status: None, + fan_enable_watchdog: None, + fan_disable_watchdog: None, + fan_feed_watchdog: None, + fan_set_led: None, + fan_get_led: None, + fan_get_presence: None, + fan_get_fru_info: None, + fan_get_status: None, + fan_get_info_all: None + }, + sensor: { + get_sensor_info: None + }, + dcdc: { + get_dcdc_all_info: None + }, + led: { + set_all_led_color: None, + set_single_led_color: None, + get_all_led_color: None, + get_single_led_color: None, + }, + e2: { + get_onie_e2_path: None, + get_device_airflow: None, + }, + temps: { + get_temps_sensor: None, + }, + cpu: { + get_cpu_reset_num: None, + get_cpu_reboot_cause: None, + } + } + ) + + +if __name__ == '__main__': + run_cli_man() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py new file mode 100755 index 000000000000..33d5bfba64e6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py @@ -0,0 +1,144 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +import os +import time +import syslog +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil +from platform_util import io_rd, wbi2cget + +INTELLIGENT_MONITOR_DEBUG_FILE = "/etc/.intelligent_monitor_debug" + +debuglevel = 0 + + +def monitor_syslog_debug(s): + if debuglevel: + syslog.openlog("INTELLIGENT_MONITOR_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def monitor_syslog(s): + syslog.openlog("INTELLIGENT_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def pmon_syslog_notice(s): + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_NOTICE, s) + + +class IntelligentMonitor(): + def __init__(self): + self.dcdc_dict = {} + self.int_case = interface() + self.__config = baseutil.get_monitor_config() + self.__intelligent_monitor_para = self.__config.get('intelligent_monitor_para', {}) + self.__interval = self.__intelligent_monitor_para.get('interval', 60) + self.__dcdc_whitelist = self.__config.get('dcdc_monitor_whitelist', {}) + self.__error_ret = self.int_case.error_ret + + @property + def error_ret(self): + return self.__error_ret + + @property + def interval(self): + return self.__interval + + def debug_init(self): + global debuglevel + if os.path.exists(INTELLIGENT_MONITOR_DEBUG_FILE): + debuglevel = 1 + else: + debuglevel = 0 + + def dcdc_whitelist_check(self, dcdc_name): + try: + check_item = self.__dcdc_whitelist.get(dcdc_name, {}) + if len(check_item) == 0: + return False + gettype = check_item.get("gettype", None) + checkbit = check_item.get("checkbit", None) + okval = check_item.get("okval", None) + if gettype is None or checkbit is None or okval is None: + monitor_syslog('%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s config error. gettype:%s, checkbit:%s, okval:%s' % + (dcdc_name, gettype, checkbit, okval)) + return False + if gettype == "io": + io_addr = check_item.get('io_addr', None) + val = io_rd(io_addr) + if val is not None: + retval = val + else: + monitor_syslog( + '%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s io_rd error. io_addr:%s' % + (dcdc_name, io_addr)) + return False + elif gettype == "i2c": + bus = check_item.get('bus', None) + addr = check_item.get('addr', None) + offset = check_item.get('offset', None) + ind, val = wbi2cget(bus, addr, offset) + if ind is True: + retval = val + else: + monitor_syslog('%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s i2cget error. bus:%s, addr:%s, offset:%s' % + (dcdc_name, bus, addr, offset)) + return False + else: + monitor_syslog('%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s gettype not support' % dcdc_name) + return False + + val_t = (int(retval, 16) & (1 << checkbit)) >> checkbit + if val_t != okval: + return False + return True + except Exception as e: + monitor_syslog('%%WHITELIST_CHECK: %s check error, msg: %s.' % (dcdc_name, str(e))) + return False + + def update_dcdc_status(self): + try: + self.dcdc_dict = self.int_case.get_dcdc_all_info() + for dcdc_name, item in self.dcdc_dict.items(): + ret = self.dcdc_whitelist_check(dcdc_name) + if ret is False: + if item['Value'] == self.error_ret: + monitor_syslog( + '%%INTELLIGENT_MONITOR-3-DCDC_SENSOR_FAILED: The value of %s read failed.' % + (dcdc_name)) + elif float(item['Value']) > float(item['Max']): + pmon_syslog_notice('%%PMON-5-VOLTAGE_HIGH: %s voltage %.3f%s is larger than max threshold %.3f%s.' % + (dcdc_name, float(item['Value']), item['Unit'], float(item['Max']), item['Unit'])) + elif float(item['Value']) < float(item['Min']): + pmon_syslog_notice('%%PMON-5-VOLTAGE_LOW: %s voltage %.3f%s is lower than min threshold %.3f%s.' % + (dcdc_name, float(item['Value']), item['Unit'], float(item['Min']), item['Unit'])) + else: + monitor_syslog_debug('%%INTELLIGENT_MONITOR-6-DCDC_SENSOR_OK: %s normal, value is %.3f%s.' % + (dcdc_name, item['Value'], item['Unit'])) + else: + monitor_syslog_debug( + '%%INTELLIGENT_MONITOR-6-DCDC_WHITELIST_CHECK: %s is in dcdc whitelist, not monitor voltage' % + dcdc_name) + continue + except Exception as e: + monitor_syslog('%%INTELLIGENT_MONITOR-3-EXCEPTION: update dcdc sensors status error, msg: %s.' % (str(e))) + + def doWork(self): + self.update_dcdc_status() + + def run(self): + while True: + try: + self.debug_init() + self.doWork() + time.sleep(self.interval) + except Exception as e: + monitor_syslog('%%INTELLIGENT_MONITOR-3-EXCEPTION: %s.' % (str(e))) + + +if __name__ == '__main__': + intelligent_monitor = IntelligentMonitor() + intelligent_monitor.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py new file mode 100755 index 000000000000..c84319f3b798 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py @@ -0,0 +1,284 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +import os +import time +import logging +from logging.handlers import RotatingFileHandler + +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil + + +DEBUG_FILE = "/etc/.monitor_fan_debug_flag" + +LOG_FILE = "/var/log/intelligent_monitor/monitor_fan_log" + +E2_NAME = "ONIE_E2" + + +def _init_logger(): + if not os.path.exists(LOG_FILE): + os.system("mkdir -p %s" % os.path.dirname(LOG_FILE)) + os.system("sync") + handler = RotatingFileHandler(filename=LOG_FILE, maxBytes=5 * 1024 * 1024, backupCount=1) + formatter = logging.Formatter("%(asctime)s %(levelname)s %(filename)s[%(funcName)s][%(lineno)s]: %(message)s") + handler.setFormatter(formatter) + logger = logging.getLogger(__name__) + logger.setLevel(logging.INFO) + logger.addHandler(handler) + return logger + + +class Fan(object): + + def __init__(self, name, hal_interface): + self.name = name + self.fan_dict = {} + self.int_case = hal_interface + self.update_time = 0 + self.pre_present = False + self.pre_status = True + self.plugin_cnt = 0 + self.plugout_cnt = 0 + self.status_normal_cnt = 0 + self.status_error_cnt = 0 + + def fan_dict_update(self): + local_time = time.time() + if not self.fan_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.fan_dict = self.int_case.get_fan_info(self.name) + + def get_model(self): + self.fan_dict_update() + return self.fan_dict["NAME"] + + def get_serial(self): + self.fan_dict_update() + return self.fan_dict["SN"] + + def get_presence(self): + return self.int_case.get_fan_presence(self.name) + + def get_rotor_speed(self, rotor_name): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor pwm + value = fan_dir[rotor_name]["Speed"] + max_speed = fan_dir[rotor_name]["SpeedMax"] + + if isinstance(value, str) or value is None: + return 0 + pwm = value * 100 / max_speed + if pwm > 100: + pwm = 100 + elif pwm < 0: + pwm = 0 + return int(pwm) + + def get_rotor_speed_tolerance(self, rotor_name): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + # The default tolerance value is fixed as 30% + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor tolerance + tolerance = fan_dir[rotor_name]["Tolerance"] + + if isinstance(tolerance, str) or tolerance is None: + return 30 + return tolerance + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + pwm = self.int_case.get_fan_speed_pwm(self.name, 0) + return int(pwm) + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + if not self.get_presence(): + return False + + rotor_num = self.int_case.get_fan_rotor_number(self.name) + for i in range(rotor_num): + rotor_name = "Rotor" + str(i + 1) + speed = self.get_rotor_speed(rotor_name) + tolerance = self.get_rotor_speed_tolerance(rotor_name) + target = self.get_target_speed() + if (speed - target) > target * tolerance / 100: + return False + if (target - speed) > target * tolerance / 100: + return False + + return True + + def get_direction(self): + """ + Retrieves the fan airflow direction + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + + Notes: + - Forward/Exhaust : Air flows from Port side to Fan side. + - Reverse/Intake : Air flows from Fan side to Port side. + """ + self.fan_dict_update() + return self.fan_dict["AirFlow"] + + +class MonitorFan(object): + + def __init__(self): + self.int_case = interface() + self.logger = _init_logger() + self.fan_obj_list = [] + self.__config = baseutil.get_monitor_config() + self.__monitor_fan_config = self.__config.get("monitor_fan_para", {}) + self.__present_interval = self.__monitor_fan_config.get("present_interval", 0.5) + self.__status_interval = self.__monitor_fan_config.get("status_interval", 5) + self.__present_check_cnt = self.__monitor_fan_config.get("present_check_cnt", 3) + self.__status_check_cnt = self.__monitor_fan_config.get("status_check_cnt", 3) + + def debug_init(self): + if os.path.exists(DEBUG_FILE): + self.logger.setLevel(logging.DEBUG) + else: + self.logger.setLevel(logging.INFO) + + def get_fan_total_number(self): + return self.int_case.get_fan_total_number() + + def get_device_airflow(self): + return self.int_case.get_device_airflow(E2_NAME) + + def fan_obj_init(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_obj = Fan(fan_name, self.int_case) + self.fan_obj_list.append(fan_obj) + self.logger.info("fan object initialize success") + + def fan_airflow_check(self, fan_obj): + fan_airflow = fan_obj.get_direction() + device_airflow = self.get_device_airflow() + if fan_airflow != device_airflow: + self.logger.error("%s airflow[%s] not match device airflow[%s]", fan_obj.name, fan_airflow, device_airflow) + else: + self.logger.debug("%s airflow[%s] match device airflow[%s]", fan_obj.name, fan_airflow, device_airflow) + + def fan_plug_in_out_check(self, fan_obj): + present = fan_obj.get_presence() + if present is True: + self.logger.debug("%s is present", fan_obj.name) + else: + self.logger.debug("%s is absent", fan_obj.name) + + if present != fan_obj.pre_present: + if present is True: + fan_obj.plugin_cnt += 1 + fan_obj.plugout_cnt = 0 + if fan_obj.plugin_cnt >= self.__present_check_cnt: + fan_obj.pre_present = True + self.logger.info("%s [serial:%s] is plugin", fan_obj.name, fan_obj.get_serial()) + self.fan_airflow_check(fan_obj) + else: + fan_obj.plugin_cnt = 0 + fan_obj.plugout_cnt += 1 + if fan_obj.plugout_cnt >= self.__present_check_cnt: + fan_obj.pre_present = False + self.logger.info("%s is plugout", fan_obj.name) + else: + fan_obj.plugin_cnt = 0 + fan_obj.plugout_cnt = 0 + self.logger.debug("%s present status is not change", fan_obj.name) + + def fan_status_check(self, fan_obj): + status = fan_obj.get_status() + if status is True: + self.logger.debug("%s is normal", fan_obj.name) + else: + self.logger.debug("%s is error", fan_obj.name) + + if status != fan_obj.pre_status: + if status is True: + fan_obj.status_normal_cnt += 1 + fan_obj.status_error_cnt = 0 + if fan_obj.status_normal_cnt >= self.__status_check_cnt: + fan_obj.pre_status = True + self.logger.info( + "%s [serial:%s] is form error change to normal", + fan_obj.name, + fan_obj.get_serial()) + else: + fan_obj.status_normal_cnt = 0 + fan_obj.status_error_cnt += 1 + if fan_obj.status_error_cnt >= self.__status_check_cnt: + fan_obj.pre_status = False + self.logger.info( + "%s [serial:%s] is form normal change to error", + fan_obj.name, + fan_obj.get_serial()) + else: + fan_obj.status_normal_cnt = 0 + fan_obj.status_error_cnt = 0 + self.logger.debug("%s status is not change", fan_obj.name) + + def checkFanPresence(self): + for fan_obj in self.fan_obj_list: + self.fan_plug_in_out_check(fan_obj) + + def checkFanStatus(self): + for fan_obj in self.fan_obj_list: + self.fan_status_check(fan_obj) + + def run(self): + start_time = time.time() + while True: + try: + self.debug_init() + delta_time = time.time() - start_time + if self.__present_interval <= self.__status_interval: + if delta_time >= self.__status_interval or delta_time < 0: + self.checkFanStatus() + start_time = time.time() + else: + self.checkFanPresence() + time.sleep(self.__present_interval) + else: + if delta_time >= self.__present_interval or delta_time < 0: + self.checkFanPresence() + start_time = time.time() + else: + self.checkFanStatus() + time.sleep(self.__status_interval) + except Exception as e: + self.logger.error('EXCEPTION: %s.', str(e)) + + +if __name__ == '__main__': + monitor_fan = MonitorFan() + monitor_fan.fan_obj_init() + monitor_fan.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py new file mode 100755 index 000000000000..4fe0beec44d5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py @@ -0,0 +1,178 @@ +#!/usr/bin/python3 + +__all__ = [ + "BLACKLIST_DRIVERS", + "DRIVERLISTS", + "DEVICE", + "STARTMODULE", + "MAC_LED_RESET", + "MAC_DEFAULT_PARAM", + "DEV_MONITOR_PARAM", + "SLOT_MONITOR_PARAM", + "MANUINFO_CONF", + "REBOOT_CTRL_PARAM", + "PMON_SYSLOG_STATUS", + "OPTOE", + "REBOOT_CAUSE_PARA", + "UPGRADE_SUMMARY", + "WARM_UPGRADE_PARAM", + "WARM_UPG_FLAG", + "WARM_UPGRADE_STARTED_FLAG", + "PLATFORM_E2_CONF", + "AIR_FLOW_CONF", + "AIRFLOW_RESULT_FILE", + "INIT_PARAM_PRE", + "INIT_COMMAND_PRE", + "INIT_PARAM", + "INIT_COMMAND", + "MONITOR_TEMP_MIN", + "MONITOR_K", + "MONITOR_MAC_IN", + "MONITOR_DEFAULT_SPEED", + "MONITOR_MAX_SPEED", + "MONITOR_MIN_SPEED", + "MONITOR_MAC_ERROR_SPEED", + "MONITOR_FAN_TOTAL_NUM", + "MONITOR_MAC_UP_TEMP", + "MONITOR_MAC_LOWER_TEMP", + "MONITOR_MAC_MAX_TEMP", + "MONITOR_FALL_TEMP", + "MONITOR_MAC_WARNING_THRESHOLD", + "MONITOR_OUTTEMP_WARNING_THRESHOLD", + "MONITOR_BOARDTEMP_WARNING_THRESHOLD", + "MONITOR_CPUTEMP_WARNING_THRESHOLD", + "MONITOR_INTEMP_WARNING_THRESHOLD", + "MONITOR_MAC_CRITICAL_THRESHOLD", + "MONITOR_OUTTEMP_CRITICAL_THRESHOLD", + "MONITOR_BOARDTEMP_CRITICAL_THRESHOLD", + "MONITOR_CPUTEMP_CRITICAL_THRESHOLD", + "MONITOR_INTEMP_CRITICAL_THRESHOLD", + "MONITOR_CRITICAL_NUM", + "MONITOR_SHAKE_TIME", + "MONITOR_INTERVAL", + "MONITOR_LED_INTERVAL", + "MONITOR_PID_FLAG", + "MONITOR_MAC_SOURCE_SYSFS", + "MONITOR_MAC_SOURCE_PATH", + "MONITOR_PID_MODULE", + "PSU_FAN_FOLLOW", + "MONITOR_SYS_LED", + "MONITOR_SYS_FAN_LED", + "MONITOR_FANS_LED", + "MONITOR_SYS_PSU_LED", + "MONITOR_FAN_STATUS", + "MONITOR_PSU_STATUS", + "MONITOR_DEV_STATUS", + "MONITOR_DEV_STATUS_DECODE", + "DEV_LEDS", + "fanloc" +] + +# driver blacklist parameter +BLACKLIST_DRIVERS = [] + +# driver list parameter +DRIVERLISTS = [] + +# device list parameter +DEVICE = [] + +# start module parameters +STARTMODULE = {} + +# mac led reset parameter +MAC_LED_RESET = {} + +# avscontrol parameter +MAC_DEFAULT_PARAM = [] + +# dev_monitor parameter +DEV_MONITOR_PARAM = {} + +# slot_monitor parameter +SLOT_MONITOR_PARAM = {} + +# platform_manufacturer parameter +MANUINFO_CONF = {} + +# reboot_ctrl parameter +REBOOT_CTRL_PARAM = {} + +# pmon_syslog parameter +PMON_SYSLOG_STATUS = {} + +# sfp optoe device parameter +OPTOE = [] + +# reboot_cause parameter +REBOOT_CAUSE_PARA = [] + +# upgrade parameter +UPGRADE_SUMMARY = {} + +# warm_uprade parameter +WARM_UPGRADE_PARAM = {} +WARM_UPG_FLAG = "/etc/sonic/.warm_upg_flag" +WARM_UPGRADE_STARTED_FLAG = "/etc/sonic/.doing_warm_upg" + +# platform_e2 parameter +PLATFORM_E2_CONF = {} + +# generate_airflow parameter +AIR_FLOW_CONF = {} +AIRFLOW_RESULT_FILE = "/etc/sonic/.airflow" + +# Initialization parameters +INIT_PARAM_PRE = [] +INIT_COMMAND_PRE = [] +INIT_PARAM = [] +INIT_COMMAND = [] + +################################ fancontrol parameter################################### +MONITOR_TEMP_MIN = 38 +MONITOR_K = 11 +MONITOR_MAC_IN = 35 +MONITOR_DEFAULT_SPEED = 0x60 +MONITOR_MAX_SPEED = 0xFF +MONITOR_MIN_SPEED = 0x60 +MONITOR_MAC_ERROR_SPEED = 0XBB +MONITOR_FAN_TOTAL_NUM = 4 +MONITOR_MAC_UP_TEMP = 50 +MONITOR_MAC_LOWER_TEMP = -50 +MONITOR_MAC_MAX_TEMP = 100 # + +MONITOR_FALL_TEMP = 4 +MONITOR_MAC_WARNING_THRESHOLD = 100 +MONITOR_OUTTEMP_WARNING_THRESHOLD = 85 +MONITOR_BOARDTEMP_WARNING_THRESHOLD = 85 +MONITOR_CPUTEMP_WARNING_THRESHOLD = 85 +MONITOR_INTEMP_WARNING_THRESHOLD = 70 + +MONITOR_MAC_CRITICAL_THRESHOLD = 105 +MONITOR_OUTTEMP_CRITICAL_THRESHOLD = 90 +MONITOR_BOARDTEMP_CRITICAL_THRESHOLD = 90 +MONITOR_CPUTEMP_CRITICAL_THRESHOLD = 100 +MONITOR_INTEMP_CRITICAL_THRESHOLD = 80 +MONITOR_CRITICAL_NUM = 3 +MONITOR_SHAKE_TIME = 20 +MONITOR_INTERVAL = 60 +MONITOR_LED_INTERVAL = 2 +MONITOR_PID_FLAG = 0 + +MONITOR_MAC_SOURCE_SYSFS = 0 +MONITOR_MAC_SOURCE_PATH = None + +MONITOR_PID_MODULE = {} + +PSU_FAN_FOLLOW = {} + +MONITOR_SYS_LED = [] +MONITOR_SYS_FAN_LED = [] +MONITOR_FANS_LED = [] +MONITOR_SYS_PSU_LED = [] +MONITOR_FAN_STATUS = [] +MONITOR_PSU_STATUS = [] +MONITOR_DEV_STATUS = {} +MONITOR_DEV_STATUS_DECODE = {} +DEV_LEDS = {} +fanloc = [] diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py new file mode 100755 index 000000000000..004a64c72233 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py @@ -0,0 +1,184 @@ +#!/usr/bin/python3 + +import sys +import os +from wbutil.baseutil import get_machine_info +from wbutil.baseutil import get_platform_info +from wbutil.baseutil import get_board_id + +__all__ = [ + "MAILBOX_DIR", + "PLATFORM_GLOBALCONFIG", + "GLOBALCONFIG", + "STARTMODULE", + "MAC_LED_RESET", + "MAC_DEFAULT_PARAM", + "DEV_MONITOR_PARAM", + "SLOT_MONITOR_PARAM", + "MANUINFO_CONF", + "REBOOT_CTRL_PARAM", + "PMON_SYSLOG_STATUS", + "REBOOT_CAUSE_PARA", + "UPGRADE_SUMMARY", + "WARM_UPGRADE_PARAM", + "WARM_UPG_FLAG", + "WARM_UPGRADE_STARTED_FLAG", + "PLATFORM_E2_CONF", + "AIR_FLOW_CONF", + "AIRFLOW_RESULT_FILE", + "GLOBALINITPARAM", + "GLOBALINITCOMMAND", + "GLOBALINITPARAM_PRE", + "GLOBALINITCOMMAND_PRE", + "MONITOR_CONST", + "PSU_FAN_FOLLOW", + "MONITOR_SYS_LED", + "MONITOR_FANS_LED", + "MONITOR_SYS_FAN_LED", + "MONITOR_SYS_PSU_LED", + "MONITOR_FAN_STATUS", + "MONITOR_PSU_STATUS", + "MONITOR_DEV_STATUS", + "MONITOR_DEV_STATUS_DECODE", + "DEV_LEDS", + "fanloc" +] + + +def getdeviceplatform(): + x = get_platform_info(get_machine_info()) + if x is not None: + filepath = "/usr/share/sonic/device/" + x + return filepath + return None + + +platform = get_platform_info(get_machine_info()) +board_id = get_board_id(get_machine_info()) +platformpath = getdeviceplatform() +MAILBOX_DIR = "/sys/bus/i2c/devices/" +grtd_productfile = (platform + "_config").replace("-", "_") +common_productfile = "platform_common" +platform_configfile = (platform + "_" + board_id + "_config").replace("-", "_") # platfrom + board_id +configfile_pre = "/usr/local/bin/" +sys.path.append(platformpath) +sys.path.append(configfile_pre) + +############################################################################################ +if os.path.exists(configfile_pre + platform_configfile + ".py"): + module_product = __import__(platform_configfile, globals(), locals(), [], 0) +elif os.path.exists(configfile_pre + grtd_productfile + ".py"): + module_product = __import__(grtd_productfile, globals(), locals(), [], 0) +elif os.path.exists(configfile_pre + common_productfile + ".py"): + module_product = __import__(common_productfile, globals(), locals(), [], 0) +else: + print("config file not exist") + sys.exit(-1) +############################################################################################ + +PLATFORM_GLOBALCONFIG = { + "DRIVERLISTS": module_product.DRIVERLISTS, + "OPTOE": module_product.OPTOE, + "DEVS": module_product.DEVICE, + "BLACKLIST_DRIVERS": module_product.BLACKLIST_DRIVERS +} +GLOBALCONFIG = PLATFORM_GLOBALCONFIG + +# start module parameters +STARTMODULE = module_product.STARTMODULE + +# mac led reset parameter +MAC_LED_RESET = module_product.MAC_LED_RESET + +# avscontrol parameter +MAC_DEFAULT_PARAM = module_product.MAC_DEFAULT_PARAM + +# dev_monitor parameter +DEV_MONITOR_PARAM = module_product.DEV_MONITOR_PARAM + +# slot_monitor parameter +SLOT_MONITOR_PARAM = module_product.SLOT_MONITOR_PARAM + +# platform_manufacturer parameter +MANUINFO_CONF = module_product.MANUINFO_CONF + +# reboot_ctrl parameter +REBOOT_CTRL_PARAM = module_product.REBOOT_CTRL_PARAM + +# pmon_syslog parameter +PMON_SYSLOG_STATUS = module_product.PMON_SYSLOG_STATUS + +# reboot_cause parameter +REBOOT_CAUSE_PARA = module_product.REBOOT_CAUSE_PARA + +# upgrade parameter +UPGRADE_SUMMARY = module_product.UPGRADE_SUMMARY + +# warm_uprade parameter +WARM_UPGRADE_PARAM = module_product.WARM_UPGRADE_PARAM +WARM_UPG_FLAG = module_product.WARM_UPG_FLAG +WARM_UPGRADE_STARTED_FLAG = module_product.WARM_UPGRADE_STARTED_FLAG + +# platform_e2 parameter +PLATFORM_E2_CONF = module_product.PLATFORM_E2_CONF + +# generate_airflow parameter +AIR_FLOW_CONF = module_product.AIR_FLOW_CONF +AIRFLOW_RESULT_FILE = module_product.AIRFLOW_RESULT_FILE + +# Initialization parameters +GLOBALINITPARAM = module_product.INIT_PARAM +GLOBALINITCOMMAND = module_product.INIT_COMMAND +GLOBALINITPARAM_PRE = module_product.INIT_PARAM_PRE +GLOBALINITCOMMAND_PRE = module_product.INIT_COMMAND_PRE + +################################ fancontrol parameter################################### + + +class MONITOR_CONST: + TEMP_MIN = module_product.MONITOR_TEMP_MIN + K = module_product.MONITOR_K + MAC_IN = module_product.MONITOR_MAC_IN + DEFAULT_SPEED = module_product.MONITOR_DEFAULT_SPEED + MAX_SPEED = module_product.MONITOR_MAX_SPEED + MIN_SPEED = module_product.MONITOR_MIN_SPEED + MAC_ERROR_SPEED = module_product.MONITOR_MAC_ERROR_SPEED + FAN_TOTAL_NUM = module_product.MONITOR_FAN_TOTAL_NUM + MAC_UP_TEMP = module_product.MONITOR_MAC_UP_TEMP + MAC_LOWER_TEMP = module_product.MONITOR_MAC_LOWER_TEMP + MAC_MAX_TEMP = module_product.MONITOR_MAC_MAX_TEMP + + MAC_WARNING_THRESHOLD = module_product.MONITOR_MAC_WARNING_THRESHOLD + OUTTEMP_WARNING_THRESHOLD = module_product.MONITOR_OUTTEMP_WARNING_THRESHOLD + BOARDTEMP_WARNING_THRESHOLD = module_product.MONITOR_BOARDTEMP_WARNING_THRESHOLD + CPUTEMP_WARNING_THRESHOLD = module_product.MONITOR_CPUTEMP_WARNING_THRESHOLD + INTEMP_WARNING_THRESHOLD = module_product.MONITOR_INTEMP_WARNING_THRESHOLD + + MAC_CRITICAL_THRESHOLD = module_product.MONITOR_MAC_CRITICAL_THRESHOLD + OUTTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_OUTTEMP_CRITICAL_THRESHOLD + BOARDTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_BOARDTEMP_CRITICAL_THRESHOLD + CPUTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_CPUTEMP_CRITICAL_THRESHOLD + INTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_INTEMP_CRITICAL_THRESHOLD + CRITICAL_NUM = module_product.MONITOR_CRITICAL_NUM + SHAKE_TIME = module_product.MONITOR_SHAKE_TIME + MONITOR_INTERVAL = module_product.MONITOR_INTERVAL + MONITOR_LED_INTERVAL = module_product.MONITOR_LED_INTERVAL + MONITOR_FALL_TEMP = module_product.MONITOR_FALL_TEMP + MONITOR_PID_FLAG = module_product.MONITOR_PID_FLAG + MONITOR_PID_MODULE = module_product.MONITOR_PID_MODULE + + MONITOR_MAC_SOURCE_SYSFS = module_product.MONITOR_MAC_SOURCE_SYSFS + MONITOR_MAC_SOURCE_PATH = module_product.MONITOR_MAC_SOURCE_PATH + + +PSU_FAN_FOLLOW = module_product.PSU_FAN_FOLLOW +MONITOR_SYS_LED = module_product.MONITOR_SYS_LED +MONITOR_FANS_LED = module_product.MONITOR_FANS_LED +MONITOR_SYS_FAN_LED = module_product.MONITOR_SYS_FAN_LED +MONITOR_SYS_PSU_LED = module_product.MONITOR_SYS_PSU_LED +MONITOR_FAN_STATUS = module_product.MONITOR_FAN_STATUS +MONITOR_PSU_STATUS = module_product.MONITOR_PSU_STATUS +MONITOR_DEV_STATUS = module_product.MONITOR_DEV_STATUS +MONITOR_DEV_STATUS_DECODE = module_product.MONITOR_DEV_STATUS_DECODE +DEV_LEDS = module_product.DEV_LEDS +fanloc = module_product.fanloc diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py new file mode 100755 index 000000000000..6d2c6de653d9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py @@ -0,0 +1,258 @@ +#!/usr/bin/env python3 +import os +import subprocess +import time +import click +from platform_config import GLOBALCONFIG, WARM_UPGRADE_STARTED_FLAG, WARM_UPG_FLAG + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def log_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + if status: + print(output) + return status, output + + +def platform_process_file_check(): + # WARM_UPGRADE_STARTED_FLAG is used as warm_upgrade.py process start flag + if os.path.exists(WARM_UPGRADE_STARTED_FLAG): + os.remove(WARM_UPGRADE_STARTED_FLAG) + + # WARM_UPG_FLAG is used as port related service judgment flag + if os.path.exists(WARM_UPG_FLAG): + os.remove(WARM_UPG_FLAG) + + +def startCommon_operation(): + platform_process_file_check() + + +def check_driver(): + status, output = log_os_system("lsmod | grep wb | wc -l") + if status: + return False + if output.isdigit() and int(output) > 0: + return True + return False + + +def removeDev(bus, loc): + cmd = "echo 0x%02x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath): + log_os_system(cmd) + + +def addDev(name, bus, loc): + if name == "lm75": + time.sleep(0.1) + pdevpath = "/sys/bus/i2c/devices/i2c-%d/" % (bus) + for i in range(1, 100): + if os.path.exists(pdevpath) is True: + break + time.sleep(0.1) + if i % 10 == 0: + click.echo("%%WB_PLATFORM_DRIVER-INIT: %s not found, wait 0.1 second ! i %d " % (pdevpath, i)) + + cmd = "echo %s 0x%02x > /sys/bus/i2c/devices/i2c-%d/new_device" % (name, loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath) is False: + os.system(cmd) + + +def removeOPTOE(startbus, endbus): + for bus in range(endbus, startbus - 1, -1): + removeDev(bus, 0x50) + + +def addOPTOE(name, startbus, endbus): + for bus in range(startbus, endbus + 1): + addDev(name, bus, 0x50) + + +def removeoptoes(): + optoes = GLOBALCONFIG["OPTOE"] + for index in range(len(optoes) - 1, -1, -1): + removeOPTOE(optoes[index]["startbus"], optoes[index]["endbus"]) + + +def addoptoes(): + optoes = GLOBALCONFIG["OPTOE"] + for optoe in optoes: + addOPTOE(optoe["name"], optoe["startbus"], optoe["endbus"]) + + +def removedevs(): + devs = GLOBALCONFIG["DEVS"] + for index in range(len(devs) - 1, -1, -1): + removeDev(devs[index]["bus"], devs[index]["loc"]) + + +def adddevs(): + devs = GLOBALCONFIG["DEVS"] + for dev in devs: + addDev(dev["name"], dev["bus"], dev["loc"]) + + +def checksignaldriver(name): + modisexistcmd = "lsmod | grep -w %s | wc -l" % name + status, output = log_os_system(modisexistcmd) + if status: + return False + if output.isdigit() and int(output) > 0: + return True + return False + + +def adddriver(name, delay): + cmd = "modprobe %s" % name + if delay != 0: + time.sleep(delay) + if checksignaldriver(name) is not True: + log_os_system(cmd) + + +def removedriver(name, delay, removeable=1): + realname = name.lstrip().split(" ")[0] + cmd = "rmmod -f %s" % realname + if checksignaldriver(realname) and removeable: + log_os_system(cmd) + if delay > 0: + time.sleep(delay) + + +def removedrivers(): + if GLOBALCONFIG is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load global config failed.") + return + drivers = GLOBALCONFIG.get("DRIVERLISTS", None) + if drivers is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load driver list failed.") + return + for index in range(len(drivers) - 1, -1, -1): + delay = 0 + name = "" + removeable = drivers[index].get("removable", 1) + if isinstance(drivers[index], dict) and "delay" in drivers[index]: + name = drivers[index].get("name") + delay = drivers[index]["delay"] + else: + name = drivers[index] + removedriver(name, delay, removeable) + + +def adddrivers(): + if GLOBALCONFIG is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load global config failed.") + return + drivers = GLOBALCONFIG.get("DRIVERLISTS", None) + if drivers is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load driver list failed.") + return + for driver in drivers: + delay = 0 + name = "" + if isinstance(driver, dict) and "delay" in driver: + name = driver.get("name") + delay = driver["delay"] + else: + name = driver + adddriver(name, delay) + + +def blacklist_driver_remove(): + if GLOBALCONFIG is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load global config failed.") + return + blacklist_drivers = GLOBALCONFIG.get("BLACKLIST_DRIVERS", []) + for driver in blacklist_drivers: + delay = 0 + name = "" + if isinstance(driver, dict) and "delay" in driver: + name = driver.get("name") + delay = driver["delay"] + else: + name = driver + removedriver(name, delay) + + +def unload_driver(): + removeoptoes() + removedevs() + removedrivers() + + +def reload_driver(): + removedevs() + removedrivers() + time.sleep(1) + adddrivers() + adddevs() + + +def i2c_check(bus, retrytime=6): + try: + i2cpath = "/sys/bus/i2c/devices/" + bus + while retrytime and not os.path.exists(i2cpath): + click.echo("%%WB_PLATFORM_DRIVER-HA: i2c bus abnormal, last bus %s is not exist." % i2cpath) + reload_driver() + retrytime -= 1 + time.sleep(1) + except Exception as e: + click.echo("%%WB_PLATFORM_DRIVER-HA: %s" % str(e)) + + +def load_driver(): + startCommon_operation() + adddrivers() + adddevs() + addoptoes() + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''device operator''' + + +@main.command() +def start(): + '''load drivers and device ''' + blacklist_driver_remove() + if check_driver(): + unload_driver() + load_driver() + + +@main.command() +def stop(): + '''stop drivers device ''' + unload_driver() + + +@main.command() +def restart(): + '''restart drivers and device''' + unload_driver() + load_driver() + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py new file mode 100755 index 000000000000..808d93216210 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py @@ -0,0 +1,434 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import click + +from eepromutil.fru import ipmifru +from eepromutil.fantlv import fan_tlv +import eepromutil.onietlv as ot +from platform_config import PLATFORM_E2_CONF +from platform_util import byteTostr, dev_file_read + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +class ExtraFunc(object): + @staticmethod + def decode_mac(encodedata): + if encodedata is None: + return None + ret = ":".join("%02x" % ord(data) for data in encodedata) + return ret.upper() + + @staticmethod + def decode_mac_number(encodedata): + if encodedata is None: + return None + return (ord(encodedata[0]) << 8) | (ord(encodedata[1]) & 0x00ff) + + @staticmethod + @staticmethod + def fru_decode_mac_number(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + area_info = getattr(ipmi_fru, area, None) + if area_info is not None: + raw_mac_number = getattr(area_info, field, None) + mac_number = decode_mac_number(raw_mac_number) + ipmi_fru.setValue(area, field, mac_number) + + @staticmethod + def fru_decode_mac(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + area_info = getattr(ipmi_fru, area, None) + if area_info is not None: + raw_mac = getattr(area_info, field, None) + decoded_mac = decode_mac(raw_mac) + ipmi_fru.setValue(area, field, decoded_mac) + + @staticmethod + def fru_decode_hw(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + area_info = getattr(ipmi_fru, area, None) + if area_info is not None: + raw_hw = getattr(area_info, field, None) + decode_hw = str(int(raw_hw, 16)) + ipmi_fru.setValue(area, field, decode_hw) + + +def set_onie_value(params): + onie = params.get("onie") + field = params.get("field") + config_value = params.get("config_value") + for index, onie_item in enumerate(onie): + if onie_item.get("name") == field: + if "value" in onie_item.keys(): + onie[index]["value"] = config_value + + +def onie_eeprom_decode(onie, e2_decode): + for e2_decode_item in e2_decode: + field = e2_decode_item.get("field") + decode_type = e2_decode_item.get("decode_type") + if decode_type == 'func': + params = { + "onie": onie, + "field": field + } + func_name = e2_decode_item.get("func_name") + if func_name is not None: + run_func(func_name, params) + elif decode_type == 'config': + config_value = e2_decode_item.get("config_value") + if config_value is not None: + params = { + "onie": onie, + "field": field, + "config_value": config_value + } + set_onie_value(params) + else: + print("unsupport decode type") + continue + + +def onie_eeprom_show(eeprom, e2_decode=None): + try: + onietlv = ot.onie_tlv() + rets = onietlv.decode(eeprom) + if e2_decode is not None: + onie_eeprom_decode(rets, e2_decode) + print("%-20s %-5s %-5s %-20s" % ("TLV name", "Code", "lens", "Value")) + for item in rets: + if item["code"] == 0xfd: + print("%-20s 0x%-02X %-5s" % (item["name"], item["code"], item["lens"])) + else: + print("%-20s 0x%-02X %-5s %-20s" % (item["name"], item["code"], item["lens"], item["value"])) + except Exception as e: + print(str(e)) + + +def set_fantlv_value(params): + fantlv_dict = params.get("fantlv") + field = params.get("field") + config_value = params.get("config_value") + for index, fantlv_item in enumerate(fantlv_dict): + if fantlv_item.get("name") == field: + if "value" in fantlv_item.keys(): + fantlv_dict[index]["value"] = config_value + + +def fantlv_eeprom_decode(fantlv_dict, e2_decode): + for e2_decode_item in e2_decode: + field = e2_decode_item.get("field") + decode_type = e2_decode_item.get("decode_type") + if decode_type == 'func': + params = { + "fantlv": fantlv_dict, + "field": field + } + func_name = e2_decode_item.get("func_name") + if func_name is not None: + run_func(func_name, params) + elif decode_type == 'config': + config_value = e2_decode_item.get("config_value") + if config_value is not None: + params = { + "fantlv": fantlv_dict, + "field": field, + "config_value": config_value + } + set_fantlv_value(params) + else: + print("unsupport decode type") + continue + + +def fantlv_eeprom_show(eeprom, e2_decode=None): + try: + tlv = fan_tlv() + rets = tlv.decode(eeprom) + if len(rets) == 0: + print("fan tlv eeprom info error.!") + return + if e2_decode is not None: + fantlv_eeprom_decode(rets, e2_decode) + print("%-15s %-5s %-5s %-20s" % ("TLV name", "Code", "lens", "Value")) + for item in rets: + print("%-15s 0x%-02X %-5s %-20s" % (item["name"], item["code"], item["lens"], item["value"])) + except Exception as e: + print(str(e)) + return + + +def run_func(funcname, params): + try: + func = getattr(ExtraFunc, funcname) + func(params) + except Exception as e: + print(str(e)) + +def set_fru_value(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + config_value = params.get("config_value") + ipmi_fru.setValue(area, field, config_value) + + +def fru_eeprom_decode(ipmi_fru, e2_decode): + for e2_decode_item in e2_decode: + area = e2_decode_item.get("area") + field = e2_decode_item.get("field") + decode_type = e2_decode_item.get("decode_type") + if decode_type == 'func': + params = { + "fru": ipmi_fru, + "area": area, + "field": field + } + func_name = e2_decode_item.get("func_name") + if func_name is not None: + run_func(func_name, params) + elif decode_type == 'config': + config_value = e2_decode_item.get("config_value") + if config_value is not None: + params = { + "fru": ipmi_fru, + "area": area, + "field": field, + "config_value": config_value + } + set_fru_value(params) + else: + print("unsupport decode type") + continue + + +def fru_eeprom_show(eeprom, e2_decode=None): + try: + ipmi_fru = ipmifru() + ipmi_fru.decodeBin(eeprom) + if e2_decode is not None: + fru_eeprom_decode(ipmi_fru, e2_decode) + print("=================board=================") + print(ipmi_fru.boardInfoArea) + print("=================product=================") + print(ipmi_fru.productInfoArea) + except Exception as e: + print(str(e)) + + +def eeprom_parase(eeprom_conf): + name = eeprom_conf.get("name") + e2_type = eeprom_conf.get("e2_type") + e2_path = eeprom_conf.get("e2_path") + e2_size = eeprom_conf.get("e2_size", 256) + e2_decode = eeprom_conf.get("e2_decode") + print("===================%s===================" % name) + ret, binval_bytes = dev_file_read(e2_path, 0, e2_size) + if ret is False: + print("eeprom read error, eeprom path: %s, msg: %s" % (e2_path, binval_bytes)) + return + binval = byteTostr(binval_bytes) + if e2_type == "onie_tlv": + onie_eeprom_show(binval, e2_decode) + elif e2_type == "fru": + fru_eeprom_show(binval, e2_decode) + elif e2_type == "fantlv": + fantlv_eeprom_show(binval, e2_decode) + else: + print("Unknow eeprom type: %s" % e2_type) + return + + +def get_fans_eeprom_info(param): + fan_eeprom_conf = PLATFORM_E2_CONF.get("fan", []) + fan_num = len(fan_eeprom_conf) + if fan_num == 0: + print("fan number is 0, can't get fan eeprom info") + return + if param == 'all': + for conf in fan_eeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + fan_index = int(param, 10) - 1 + if fan_index < 0 or fan_index >= fan_num: + print("param error, total fan number: %d, fan index: %d" % (fan_num, fan_index + 1)) + return + eeprom_parase(fan_eeprom_conf[fan_index]) + return + + +def get_psus_eeprom_info(param): + psu_eeprom_conf = PLATFORM_E2_CONF.get("psu", []) + psu_num = len(psu_eeprom_conf) + if psu_num == 0: + print("psu number is 0, can't get psu eeprom info") + return + if param == 'all': + for conf in psu_eeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + psu_index = int(param, 10) - 1 + if psu_index < 0 or psu_index >= psu_num: + print("param error, total psu number: %d, psu index: %d" % (psu_num, psu_index + 1)) + return + eeprom_parase(psu_eeprom_conf[psu_index]) + return + + +def get_slots_eeprom_info(param): + slot_eeprom_conf = PLATFORM_E2_CONF.get("slot", []) + slot_num = len(slot_eeprom_conf) + if slot_num == 0: + print("slot number is 0, can't get slot eeprom info") + return + if param == 'all': + for conf in slot_eeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + slot_index = int(param, 10) - 1 + if slot_index < 0 or slot_index >= slot_num: + print("param error, total slot number: %d, slot index: %d" % (slot_num, slot_index + 1)) + return + eeprom_parase(slot_eeprom_conf[slot_index]) + return + + +def get_syseeprom_info(param): + syseeprom_conf = PLATFORM_E2_CONF.get("syseeprom", []) + syseeprom_num = len(syseeprom_conf) + if syseeprom_num == 0: + print("syseeprom number is 0, can't get syseeprom info") + return + if param == 'all': + for conf in syseeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + syseeprom_index = int(param, 10) - 1 + if syseeprom_index < 0 or syseeprom_index >= syseeprom_num: + print("param error, total syseeprom number: %d, syseeprom index: %d" % (syseeprom_num, syseeprom_index + 1)) + return + eeprom_parase(syseeprom_conf[syseeprom_index]) + return + + +def decode_eeprom_info(e2_type, e2_path, e2_size): + if not e2_size.isdigit(): + print("param error, e2_size %s is not digital" % e2_size) + return + e2_size = int(e2_size, 10) + eeprom_conf = {} + eeprom_conf["name"] = e2_type + eeprom_conf["e2_type"] = e2_type + eeprom_conf["e2_path"] = e2_path + eeprom_conf["e2_size"] = e2_size + eeprom_parase(eeprom_conf) + return + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''platform eeprom display script''' + +# fan eeprom info display + + +@main.command() +@click.argument('fan_index', required=True) +def fan(fan_index): + '''fan_index(1, 2, 3...)/all''' + get_fans_eeprom_info(fan_index) + +# psu eeprom info display + + +@main.command() +@click.argument('psu_index', required=True) +def psu(psu_index): + '''psu_index(1, 2, 3...)/all''' + get_psus_eeprom_info(psu_index) + +# slot eeprom info display + + +@main.command() +@click.argument('slot_index', required=True) +def slot(slot_index): + '''slot_index(1, 2, 3...)/all''' + get_slots_eeprom_info(slot_index) + +# syseeprom info display + + +@main.command() +@click.argument('syseeprom_index', required=True) +def syseeprom(syseeprom_index): + '''syseeprom_index(1, 2, 3...)/all''' + get_syseeprom_info(syseeprom_index) + +# fru eeprom info decode + + +@main.command() +@click.argument('e2_path', required=True) +@click.argument('e2_size', required=False, default="256") +def fru(e2_path, e2_size): + '''e2_path''' + decode_eeprom_info("fru", e2_path, e2_size) + +# fantlv eeprom info decode + + +@main.command() +@click.argument('e2_path', required=True) +@click.argument('e2_size', required=False, default="256") +def fantlv(e2_path, e2_size): + '''e2_path''' + decode_eeprom_info("fantlv", e2_path, e2_size) + +# onie_tlv eeprom info decode + + +@main.command() +@click.argument('e2_path', required=True) +@click.argument('e2_size', required=False, default="256") +def onie_tlv(e2_path, e2_size): + '''e2_path''' + decode_eeprom_info("onie_tlv", e2_path, e2_size) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py new file mode 100755 index 000000000000..2143b9420cd3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +import os +import syslog +import importlib.machinery +from platform_util import getplatform_name, dev_file_read, dev_file_write, write_sysfs, read_sysfs + +__all__ = [ + "platform_reg_read", + "platform_reg_write", + "platform_set_optoe_type", + "platform_get_optoe_type", + "platform_sfp_read", + "platform_sfp_write", +] + +CPLD = 0 +FPGA = 1 +CPLD_PATH = "/dev/cpld%d" +FPGA_PATH = "/dev/fpga%d" + + +OPTOE_PATH = "/sys/bus/i2c/devices/%d-0050/" +OPTOE_DEV_CLASS = "dev_class" +OPTOE_EEPROM = "eeprom" + + +PLATFORM_INTF_DEBUG_FILE = "/etc/.platform_intf_debug_flag" + + +CONFIG_FILE_LIST = [ + "/usr/local/bin/", + "/usr/local/lib/python3/dist-packages/config/", + "/usr/local/lib/python3.7/dist-packages/config/", + "/usr/local/lib/python3.9/dist-packages/config/"] + + +def platform_intf_debug(s): + if os.path.exists(PLATFORM_INTF_DEBUG_FILE): + syslog.openlog("PLATFORM_INTF_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def platform_intf_error(s): + if os.path.exists(PLATFORM_INTF_DEBUG_FILE): + syslog.openlog("PLATFORM_INTF_ERROR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class IntfPlatform: + CONFIG_NAME = 'PLATFORM_INTF_OPTOE' + __port_optoe_dict = {} + + def __init__(self): + real_path = None + platform_name = (getplatform_name()).replace("-", "_") + for configfile_path in CONFIG_FILE_LIST: + configfile = configfile_path + platform_name + "_port_config.py" + if os.path.exists(configfile): + real_path = configfile + break + if real_path is None: + raise Exception("get port config error") + config = importlib.machinery.SourceFileLoader(self.CONFIG_NAME, real_path).load_module() + self.__port_optoe_dict = config.PLATFORM_INTF_OPTOE + + def get_dev_path(self, dev_type, dev_id): + if dev_type == CPLD: + path = CPLD_PATH % dev_id + elif dev_type == FPGA: + path = FPGA_PATH % dev_id + else: + msg = "dev_type error!" + return False, msg + platform_intf_debug("path:%s" % path) + return True, path + + def get_port_path(self, port): + port_num = self.__port_optoe_dict.get("port_num", 0) + optoe_start_bus = self.__port_optoe_dict.get("optoe_start_bus", 0) + if port_num <= 0 or optoe_start_bus <= 0: + msg = "PLATFORM_INTF_OPTOE config error!" + return False, msg + if port <= 0 or port > port_num: + msg = "port out of range !" + return False, msg + path = OPTOE_PATH % (port + optoe_start_bus - 1) + platform_intf_debug("path:%s" % path) + return True, path + + ########################################### + # reg_read - read logic device register + # @dev_type: 0: CPLD, 1: FPGA + # @dev_id: device ID, start from 0 + # @offset: register offset + # @size: read length + # return: + # @ret: True if read success, False if not + # @info: The read value list if read success, otherwise the detail error message + ########################################### + def reg_read(self, dev_type, dev_id, offset, size): + ret, path = self.get_dev_path(dev_type, dev_id) + if ret is False: + return False, path + ret, info = dev_file_read(path, offset, size) + return ret, info + + ########################################### + # platform_reg_write - write logic device register + # @dev_type: 0: CPLD, 1: FPGA + # @dev_id: device ID, start from 0 + # @offset: register offset + # @val_list: The write value list + # return: + # @ret: True if write success, False if not + # @info: The write value length if write success, otherwise the detail error message + ########################################### + def reg_write(self, dev_type, dev_id, offset, val_list): + ret, path = self.get_dev_path(dev_type, dev_id) + if ret is False: + return False, path + ret, info = dev_file_write(path, offset, val_list) + return ret, info + + ########################################### + # set_optoe_type - set port optoe type + # @port: port index start from 1 + # @optoe_type: optoe type, including the following values + # 1: OPTOE1 + # 2: OPTOE2 + # 3: OPTOE3 + # return: + # @ret: True if set optoe type success, False if not + # @info: None if set optoe type success, otherwise the detail error message + ########################################### + def set_optoe_type(self, port, optoe_type): + ret, path = self.get_port_path(port) + if ret is False: + return False, path + optoe_type_path = path + OPTOE_DEV_CLASS + ret, info = write_sysfs(optoe_type_path, "%d" % optoe_type) + if ret is False: + return False, info + return True, None + + ########################################### + # get_optoe_type - get port optoe type + # @port: port index start from 1 + # return: + # @ret: True if set optoe type success, False if not + # @info: Optoe type value if get optoe type success, otherwise the detail error message + # optoe type including the following values + # 1: OPTOE1 + # 2: OPTOE2 + # 3: OPTOE3 + ########################################### + def get_optoe_type(self, port): + ret, path = self.get_port_path(port) + if ret is False: + return False, path + optoe_type_path = path + OPTOE_DEV_CLASS + ret, info = read_sysfs(optoe_type_path) + if ret is False: + return False, info + return True, int(info) + + ########################################### + # sfp_read -read sfp eeprom + # @port_id: port index start from 1 + # @offset: sfp eeprom offset + # @size: read sfp eeprom length + # return: + # @ret: True if read success, False if not + # @info: The read value list if read success, otherwise the detail error message + ########################################### + def sfp_read(self, port_id, offset, size): + ret, path = self.get_port_path(port_id) + if ret is False: + return False, path + optoe_eeprom_path = path + OPTOE_EEPROM + ret, info = dev_file_read(optoe_eeprom_path, offset, size) + return ret, info + + ########################################### + # sfp_write -write sfp eeprom + # @port_id: port index start from 1 + # @offset: sfp eeprom offset + # @val_list: The write value list + # return: + # @ret: True if read success, False if not + # @info: The write value length if write success, otherwise the detail error message + ########################################### + def sfp_write(self, port_id, offset, val_list): + ret, path = self.get_port_path(port_id) + if ret is False: + return False, path + optoe_eeprom_path = path + OPTOE_EEPROM + ret, info = dev_file_write(optoe_eeprom_path, offset, val_list) + return ret, info + + +platform = IntfPlatform() + + +########################################### +# platform_reg_read - read logic device register +# @dev_type: 0: CPLD, 1: FPGA +# @dev_id: device ID, start from 0 +# @offset: register offset +# @size: read length +# return: +# @ret: True if read success, False if not +# @info: The read value list if read success, otherwise the detail error message +########################################### +def platform_reg_read(dev_type, dev_id, offset, size): + ret = False + info = None + + # params check + if (isinstance(dev_type, int) is False or isinstance(dev_id, int) is False or + isinstance(offset, int) is False or isinstance(size, int) is False): + info = "params type check fail in platform_reg_read" + return ret, info + if dev_id < 0 or offset < 0 or size <= 0: + info = "params value check fail in platform_reg_read" + return ret, info + support_dev_type = (CPLD, FPGA) + if dev_type not in support_dev_type: + info = "dev_type match erro, fail in platform_reg_read" + return ret, info + + # call the solve func + return platform.reg_read(dev_type, dev_id, offset, size) + + +########################################### +# platform_reg_write - write logic device register +# @dev_type: 0: CPLD, 1: FPGA +# @dev_id: device ID, start from 0 +# @offset: register offset +# @val_list: The write value list +# return: +# @ret: True if write success, False if not +# @info: The write value length if write success, otherwise the detail error message +########################################### +def platform_reg_write(dev_type, dev_id, offset, val_list): + ret = False + info = None + + # params check + if (isinstance(dev_type, int) is False or isinstance(dev_id, int) is False or + isinstance(offset, int) is False or isinstance(val_list, list) is False): + info = "params type check fail in platform_reg_write" + return ret, info + if dev_id < 0 or offset < 0 or len(val_list) <= 0: + info = "params value check fail in platform_reg_write" + return ret, info + support_dev_type = (CPLD, FPGA) + if dev_type not in support_dev_type: + info = "dev_type match erro, fail in platform_reg_write" + return ret, info + + # call the solve func + return platform.reg_write(dev_type, dev_id, offset, val_list) + + +########################################### +# platform_set_optoe_type - set port optoe type +# @port: port index start from 1 +# @optoe_type: optoe type, including the following values +# 1: OPTOE1 +# 2: OPTOE2 +# 3: OPTOE3 +# return: +# @ret: True if set optoe type success, False if not +# @info: None if set optoe type success, otherwise the detail error message +########################################### +def platform_set_optoe_type(port, optoe_type): + ret = False + info = None + + # params check + if isinstance(port, int) is False or isinstance(optoe_type, int) is False: + info = "params type check fail in platform_set_optoe_type" + return ret, info + if port < 0 or optoe_type < 1 or optoe_type > 3: + info = "params value check fail in platform_set_optoe_type" + return ret, info + + # call the solve func + return platform.set_optoe_type(port, optoe_type) + + +########################################### +# platform_get_optoe_type - get port optoe type +# @port: port index start from 1 +# return: +# @ret: True if set optoe type success, False if not +# @info: Optoe type value if get optoe type success, otherwise the detail error message +# optoe type including the following values +# 1: OPTOE1 +# 2: OPTOE2 +# 3: OPTOE3 +########################################### +def platform_get_optoe_type(port): + ret = False + info = None + + # params check + if isinstance(port, int) is False: + info = "params type check fail in platform_get_optoe_type" + return ret, info + if port < 0: + info = "params value check fail in platform_get_optoe_type" + return ret, info + + # call the solve func + return platform.get_optoe_type(port) + + +########################################### +# platform_sfp_read -read sfp eeprom +# @port_id: port index start from 1 +# @offset: sfp eeprom offset +# @size: read sfp eeprom length +# return: +# @ret: True if read success, False if not +# @info: The read value list if read success, otherwise the detail error message +########################################### +def platform_sfp_read(port_id, offset, size): + ret = False + info = None + + # params check + if isinstance(port_id, int) is False or isinstance(offset, int) is False or isinstance(size, int) is False: + info = "params type check fail in platform_sfp_read" + return ret, info + if port_id < 0 or offset < 0 or size <= 0: + info = "params value check fail in platform_sfp_read" + return ret, info + + # call the solve func + return platform.sfp_read(port_id, offset, size) + + +########################################### +# platform_sfp_write -write sfp eeprom +# @port_id: port index start from 1 +# @offset: sfp eeprom offset +# @val_list: The write value list +# return: +# @ret: True if read success, False if not +# @info: The write value length if write success, otherwise the detail error message +########################################### +def platform_sfp_write(port_id, offset, val_list): + ret = False + info = None + + # params check + if isinstance(port_id, int) is False or isinstance(offset, int) is False or isinstance(val_list, list) is False: + info = "params type check fail in platform_sfp_write" + return ret, info + if port_id < 0 or offset < 0 or len(val_list) <= 0: + info = "params value check fail in platform_sfp_write" + return ret, info + + # call the solve func + return platform.sfp_write(port_id, offset, val_list) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py new file mode 100755 index 000000000000..c9b72c99cca9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import sys +import os +import syslog +import click +from platform_util import exec_os_cmd + + +IPMITOOL_CMD = "ipmitool raw 0x32 0x04" # All products are the same command + +PLATFORM_IPMI_DEBUG_FILE = "/etc/.platform_ipmi_debug_flag" +UPGRADEDEBUG = 1 +debuglevel = 0 + + +def debug_init(): + global debuglevel + if os.path.exists(PLATFORM_IPMI_DEBUG_FILE): + debuglevel = debuglevel | UPGRADEDEBUG + else: + debuglevel = debuglevel & ~(UPGRADEDEBUG) + + +def ipmidebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if UPGRADEDEBUG & debuglevel: + syslog.openlog("PLATFORM_IPMI", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def ipmierror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("PLATFORM_IPMI", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +@click.command() +@click.argument('cmd', required=True) +def platform_ipmi_main(cmd): + '''Send command to BMC through ipmi''' + try: + # Convert string command to ASCII + user_cmd = "" + for ch in cmd: + user_cmd += " " + str(ord(ch)) + + final_cmd = IPMITOOL_CMD + user_cmd + ipmidebuglog("final cmd:%s" % final_cmd) + + # exec ipmitool cmd + status, output = exec_os_cmd(final_cmd) + if status: + ipmierror("exec ipmitool_cmd:%s user_cmd:%s failed" % (IPMITOOL_CMD, cmd)) + ipmierror("failed log: %s" % output) + return False, "exec final_cmd failed" + + # the data read by ipmitool is hex value, needs transformation + data_list = output.replace("\n", "").strip(' ').split(' ') + ipmidebuglog("data_list: %s" % data_list) + result = "" + for data in data_list: + result += chr(int(data, 16)) + + # 'result' string include ret and log, separated by , + result_list = result.split(',', 2) + if len(result_list) != 2: + log = "split failed. len(result) != 2. result:%s" % result + ipmierror(log) + return False, log + if int(result_list[0]) != 0: + ipmierror("finally analy ipmitool_cmd:%s user_cmd:%s exec failed" % (IPMITOOL_CMD, cmd)) + ipmierror("failed return log: %s" % result_list[1]) + print(result_list[1]) + return False, result_list[1] + + ipmidebuglog("finally exec ipmitool_cmd:%s user_cmd:%s success" % (IPMITOOL_CMD, cmd)) + print(result_list[1]) + return True, result_list[1] + + except Exception as e: + log = "An exception occurred, exception log:%s" % str(e) + ipmierror(log) + return False, log + + +if __name__ == '__main__': + debug_init() + ret, msg = platform_ipmi_main() + if ret is False: + sys.exit(1) + sys.exit(0) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py new file mode 100755 index 000000000000..1404692bc93b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py @@ -0,0 +1,591 @@ +#!/usr/bin/env python3 + +import re +import mmap +import fcntl +import subprocess +import shlex +import signal +import os +import time +import sys +from platform_config import MANUINFO_CONF +from monitor import status + + +INDENT = 4 + + +def printerr(vchar): + sys.stderr.write(vchar + '\n') + + +g_extra_cache = {} +g_meminfo_cache = {} +g_exphy_cache = {} + + +def exec_os_cmd(cmd, timeout = None): + status, output = subprocess.getstatusoutput(cmd) + return status, output + + +def exphyfwsplit(): + # improve performance + global g_exphy_cache + if g_exphy_cache: + return + cmd = "bcmcmd -t 1 \"phy control xe,ce fw_get\" |grep fw_version" + ret, output = exec_os_cmd(cmd) + if ret or len(output) == 0: + raise Exception("run cmd: {} error, status: {}, msg: {}".format(cmd, ret, output)) + exphyfwstr = output.strip() + portlist = exphyfwstr.split("\n") + for port in portlist: + phy_addr_str = get_regular_val(port, r"phy_addr\s*=\s*\w+", 0) + if phy_addr_str.startswith("ERR"): + continue + phy_addr_key = phy_addr_str.replace(" ", "") + if phy_addr_key in g_exphy_cache: + continue + + g_exphy_cache[phy_addr_key] = {} + + fw_version_str = get_regular_val(port, r"fw_version\s*=\s*\w+", 0) + if fw_version_str.startswith("ERR"): + del g_exphy_cache[phy_addr_key] + continue + + fw_version = fw_version_str.split("=")[1].strip() + g_exphy_cache[phy_addr_key]["fw_version"] = fw_version + + if "success" in port: + ret = "OK" + else: + ret = "Unexpected" + g_exphy_cache[phy_addr_key]["status"] = ret + return + + +def lshwmemorysplit(): + # improve performance + global g_meminfo_cache + if g_meminfo_cache: + return + cmd = "lshw -c memory" + ret, output = exec_os_cmd(cmd) + if ret or len(output) == 0: + raise Exception("run cmd: {} error, status: {}, msg: {}".format(cmd, ret, output)) + memstr = output.strip() + memlist = memstr.split("*-") + for item in memlist: + if item.strip().startswith("memory") and "System Memory" not in item: + continue + line_index = 0 + for line in item.splitlines(): + line_index += 1 + if line_index == 1: + memdict_key = line + g_meminfo_cache[memdict_key] = {} + else: + if ":" not in line: + continue + key = line.split(":", 1)[0].strip() + value = line.split(":", 1)[1].strip() + g_meminfo_cache[memdict_key][key] = value + if "empty" in item: + break + return + + +def run_extra_func(funcname): + # improve performance + if funcname in g_extra_cache: + return g_extra_cache.get(funcname) + func = getattr(status, funcname) + ret = [] + func(ret) + if ret: + g_extra_cache[funcname] = ret + return ret + + +def get_extra_value(funcname, itemid, key): + for item in run_extra_func(funcname): + if item.get("id") == itemid: + return item.get(key, "NA") + return "NA" + + +def io_wr(reg_addr, reg_data): + try: + regdata = 0 + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + if isinstance(reg_data, int): + regdata = reg_data + else: + regdata = int(reg_data, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + os.write(fd, regdata.to_bytes(1, 'little')) + return True + except ValueError as e: + print(e) + return False + except Exception as e: + print(e) + return False + finally: + os.close(fd) + + +def checksignaldriver(name): + modisexistcmd = "lsmod | grep -w %s | wc -l" % name + ret, output = exec_os_cmd(modisexistcmd) + if ret: + return False + if output.isdigit() and int(output) > 0: + return True + return False + + +def adddriver(name): + cmd = "modprobe %s" % name + if checksignaldriver(name) is not True: + ret, log = exec_os_cmd(cmd) + if ret != 0 or len(log) > 0: + return False + return True + return True + + +def removedriver(name): + cmd = "rmmod %s" % name + if checksignaldriver(name): + exec_os_cmd(cmd) + + +def add_5387_driver(): + errmsg = "" + spi_gpio = "wb_spi_gpio" + ret = adddriver(spi_gpio) + if ret is False: + errmsg = "modprobe wb_spi_gpio driver failed." + return False, errmsg + spi_5387_device = "wb_spi_93xx46 spi_bus_num=0" + ret = adddriver(spi_5387_device) + if ret is False: + errmsg = "modprobe wb_spi_93xx46 driver failed." + return ret, errmsg + return True, "" + + +def remove_5387_driver(): + spi_5387_device = "wb_spi_93xx46" + removedriver(spi_5387_device) + spi_gpio = "wb_spi_gpio" + removedriver(spi_gpio) + + +def deal_itmes(item_list): + for item in item_list: + dealtype = item.get("dealtype") + if dealtype == "shell": + cmd = item.get("cmd") + timeout = item.get("timeout", 10) + exec_os_cmd(cmd, timeout) + elif dealtype == "io_wr": + io_addr = item.get("io_addr") + wr_value = item.get("value") + io_wr(io_addr, wr_value) + + +def get_func_value(funcname, params): + func = getattr(ExtraFunc, funcname) + ret = func(params) + return ret + + +def read_pci_reg(pcibus, slot, fn, resource, offset): + '''read pci register''' + if offset % 4 != 0: + return "ERR offset: %d not 4 bytes align" + filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % (int(pcibus), int(slot), int(fn), int(resource)) + size = os.path.getsize(filename) + with open(filename, "r+") as file: + data = mmap.mmap(file.fileno(), size) + result = data[offset: offset + 4] + s = result[::-1] + val = 0 + for value in s: + val = val << 8 | value + data.close() + return "%08x" % val + + +def devfileread(path, offset, length, bit_width): + ret = "" + val_str = '' + val_list = [] + fd = -1 + if not os.path.exists(path): + return "%s not found !" % path + if length % bit_width != 0: + return "only support read by bit_width" + if length < bit_width: + return "len needs to greater than or equal to bit_width" + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, length) + for item in ret: + val_list.append(item) + + for i in range(0, length, bit_width): + val_str += " 0x" + for j in range(0, bit_width): + val_str += "%02x" % val_list[i + bit_width - j - 1] + except Exception as e: + return str(e) + finally: + if fd > 0: + os.close(fd) + return val_str + + +def read_reg(loc, offset, size): + with open(loc, 'rb') as file: + file.seek(offset) + return ' '.join(["%02x" % item for item in file.read(size)]) + + +def std_match(stdout, pattern): + if pattern is None: + return stdout.strip() + for line in stdout.splitlines(): + if re.match(pattern, line): + return line.strip() + raise EOFError("pattern: {} does not match anything in stdout {}".format( + pattern, stdout)) + + +def i2c_rd(bus, loc, offset): + ''' + read i2c with i2cget command + ''' + cmd = "i2cget -f -y {} {} {}".format(bus, loc, offset) + retrytime = 6 + for i in range(retrytime): + ret, stdout = subprocess.getstatusoutput(cmd) + if ret == 0: + return stdout + time.sleep(0.1) + raise RuntimeError("run cmd: {} error, status {}".format(cmd, ret)) + + +def i2c_rd_bytes(bus, loc, offset, size): + blist = [] + for i in range(size): + ret = i2c_rd(bus, loc, offset + i) + blist.append(ret) + + return blist + + +def get_pair_val(source, separator): + try: + value = source.split(separator, 1)[1] + except (ValueError, IndexError): + return "ERR separator: {} does not match in source: {}".format(separator, source) + return value.strip() + + +def get_regular_val(source, pattern, group): + try: + value = re.findall(pattern, source)[group] + except Exception: + return "ERR pattern: {} does not match in source: {} with group: {}".format(pattern, source, group) + return value.strip() + + +def find_match(file2read, pattern): + with open(file2read, 'r') as file: + for line in file: + if not re.match(pattern, line): + continue + return line.strip() + return "ERR pattern %s not match in %s" % (pattern, file2read) + + +def readaline(file2read): + with open(file2read, 'r') as file: + return file.readline() + + +def sort_key(e): + return e.arrt_index + + +class ExtraFunc(object): + @staticmethod + def get_bcm5387_version(params): + version = "" + try: + ret, msg = add_5387_driver() + if ret is False: + raise Exception(msg) + + before_deal_list = params.get("before", []) + deal_itmes(before_deal_list) + + ret, version = exec_os_cmd(params["get_version"]) + if ret != 0: + version = "ERR " + version + + after_deal_list = params.get("after", []) + deal_itmes(after_deal_list) + + except Exception as e: + version = "ERR %s" % (str(e)) + finally: + finally_deal_list = params.get("finally", []) + deal_itmes(finally_deal_list) + remove_5387_driver() + return version + + @staticmethod + def get_memory_value(params): + root_key = params.get("root_key") + sub_key = params.get("sub_key") + lshwmemorysplit() + return g_meminfo_cache.get(root_key, {}).get(sub_key, "NA") + + @staticmethod + def get_memory_bank_value(params): + lshwmemorysplit() + bank = params.get("bankid") + if g_meminfo_cache.get(bank, {}): + return True + return False + + @staticmethod + def get_exphy_fw(phyid): + exphyfwsplit() + if phyid not in g_exphy_cache: + return "ERR %s not found." % phyid + fw_version = g_exphy_cache.get(phyid).get("fw_version") + ret = g_exphy_cache.get(phyid).get("status") + msg = "%s %s" % (fw_version, ret) + return msg + +class CallbackSet: + def cpld_format(self, blist): + if isinstance(blist, str): + blist = blist.split() + elif not isinstance(blist, list) or len(blist) != 4: + raise ValueError("cpld format: wrong parameter: {}".format(blist)) + + return "{}{}{}{}".format(*blist).replace("0x", "") + + +class VersionHunter: + call = CallbackSet() + + def __init__(self, entires): + self.head = None + self.next = None + self.key = None + self.cmd = None + self.file = None + self.reg = None + self.i2c = None + self.extra = None + self.pattern = None + self.separator = None + self.parent = None + self.ignore = False + self.children = [] + self.level = 0 + self.callback = None + self.delspace = None + self.arrt_index = None + self.config = None + self.precheck = None + self.func = None + self.regular = None + self.group = 0 + self.pci = None + self.devfile = None + self.decode = None + self.timeout = 10 + self.__dict__.update(entires) + + def check_para(self): + if self.pattern is None: + return False + if self.cmd is None or self.file is None: + return False + return True + + def get_version(self): + ret = "NA" + try: + if self.cmd is not None: + ret, output = exec_os_cmd(self.cmd, self.timeout) + if ret or len(output) == 0: + raise RuntimeError("run cmd: {} error, status: {}, msg: {}".format(self.cmd, ret, output)) + ret = std_match(output, self.pattern) + elif self.file is not None: + ret = self.read_file() + elif self.reg is not None: + ret = read_reg(self.reg.get("loc"), self.reg.get("offset"), + self.reg.get("size")) + elif self.extra: + ret = get_extra_value(self.extra.get("funcname"), + self.extra.get("id"), + self.extra.get("key")) + elif self.i2c: + ret = i2c_rd_bytes(self.i2c.get("bus"), self.i2c.get("loc"), + self.i2c.get("offset"), + self.i2c.get("size")) + elif self.config: + ret = self.config + elif self.func: + ret = get_func_value(self.func.get("funcname"), + self.func.get("params")) + elif self.pci: + ret = read_pci_reg(self.pci.get("bus"), self.pci.get("slot"), + self.pci.get("fn"), self.pci.get("bar"), self.pci.get("offset")) + elif self.devfile: + ret = devfileread(self.devfile.get("loc"), self.devfile.get("offset"), + self.devfile.get("len"), self.devfile.get("bit_width")) + + except Exception as e: + # printerr(e.message) + return "ERR %s" % str(e) + return self.exe_callback(ret) + + def exe_callback(self, data): + try: + if self.callback: + method = getattr(self.call, self.callback) + return method(data) + except Exception: + return "ERR run callback method: {} error, data: {}".format(self.callback, data) + return data + + def read_file(self): + if self.pattern is not None: + return find_match(self.file, self.pattern) + return readaline(self.file) + + def hunt(self): + if self.ignore: + return + indent = self.level * INDENT * " " + + if self.precheck: + try: + ret = get_func_value(self.precheck.get("funcname"), self.precheck.get("params")) + if ret is not True: + return + except Exception as e: + err_msg = "ERR %s" % str(e) + format_str = "{}{:<{}}{}".format(indent, self.key + ':', + (30 - len(indent)), err_msg) + print(format_str) + return + # has children + if self.children: + self.children.sort(key=sort_key) + format_str = "{}{}:".format(indent, self.key) + print(format_str) + for child in self.children: + if not isinstance(child, VersionHunter): + continue + child.level = self.level + 1 + child.hunt() + else: + version = self.get_version() or "" + if not version.startswith("ERR"): + version = version.replace("\x00", "").strip() + if self.separator is not None: + version = get_pair_val(version, self.separator) + if self.delspace is not None: + version = version.replace(" ", "") + if self.regular is not None: + version = get_regular_val(version, self.regular, self.group) + if self.decode is not None: + tmp_version = self.decode.get(version) + if tmp_version is None: + version = "ERR decode %s failed" % version + else: + version = tmp_version + format_str = "{}{:<{}}{}".format(indent, self.key + ':', + (30 - len(indent)), version) + print(format_str) + + if self.next: + print("") + self.next.hunt() + + +pidfile = 0 + + +def ApplicationInstance(): + global pidfile + pidfile = open(os.path.realpath(__file__), "r") + try: + fcntl.flock(pidfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + return True + except Exception: + return False + + +def run(): + if os.geteuid() != 0: + print("Root privileges are required for this operation") + sys.exit(1) + + start_time = time.time() + while True: + ret = ApplicationInstance() + if ret is True: + break + if time.time() - start_time > 10: + printerr("manufacturer is running.") + sys.exit(1) + time.sleep(0.5) + + objmap = {} + + try: + target = {} + target.update(MANUINFO_CONF) + for objname, value in target.items(): + objmap[objname] = VersionHunter(value) + except Exception as e: + printerr(str(e)) + sys.exit(1) + + head = None + for objname, obj in objmap.items(): + if head is None and obj.head: + head = obj + if obj.parent: + objmap.get(obj.parent).children.append(obj) + if obj.next: + obj.next = objmap.get(obj.next) + + head.hunt() + + +if __name__ == "__main__": + run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py new file mode 100755 index 000000000000..75bc95975520 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +import os +import subprocess +import glob +import time +import click +from platform_config import STARTMODULE, MAC_LED_RESET, AIRFLOW_RESULT_FILE +from platform_config import GLOBALINITPARAM, GLOBALINITCOMMAND, GLOBALINITPARAM_PRE, GLOBALINITCOMMAND_PRE +from platform_util import wbpciwr + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def log_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + if status: + print(output) + return status, output + + +def write_sysfs_value(reg_name, value): + mb_reg_file = "/sys/bus/i2c/devices/" + reg_name + locations = glob.glob(mb_reg_file) + if len(locations) == 0: + print("%s not found" % mb_reg_file) + return False + sysfs_loc = locations[0] + try: + with open(sysfs_loc, 'w') as fd: + fd.write(value) + except Exception: + return False + return True + + +def getPid(name): + ret = [] + for dirname in os.listdir('/proc'): + if dirname == 'curproc': + continue + try: + with open('/proc/{}/cmdline'.format(dirname), mode='r') as fd: + content = fd.read() + except Exception: + continue + if name in content: + ret.append(dirname) + return ret + + +def startAvscontrol(): + if STARTMODULE.get('avscontrol', 0) == 1: + cmd = "nohup avscontrol.py start >/dev/null 2>&1 &" + rets = getPid("avscontrol.py") + if len(rets) == 0: + os.system(cmd) + + +def startFanctrol(): + if STARTMODULE.get('fancontrol', 0) == 1: + cmd = "nohup fancontrol.py start >/dev/null 2>&1 &" + rets = getPid("fancontrol.py") + if len(rets) == 0: + os.system(cmd) + + +def starthal_fanctrl(): + if STARTMODULE.get('hal_fanctrl', 0) == 1: + cmd = "nohup hal_fanctrl.py start >/dev/null 2>&1 &" + rets = getPid("hal_fanctrl.py") + if len(rets) == 0: + os.system(cmd) + + +def starthal_ledctrl(): + if STARTMODULE.get('hal_ledctrl', 0) == 1: + cmd = "nohup hal_ledctrl.py start >/dev/null 2>&1 &" + rets = getPid("hal_ledctrl.py") + if len(rets) == 0: + os.system(cmd) + + +def startDevmonitor(): + if STARTMODULE.get('dev_monitor', 0) == 1: + cmd = "nohup dev_monitor.py start >/dev/null 2>&1 &" + rets = getPid("dev_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startSlotmonitor(): + if STARTMODULE.get('slot_monitor', 0) == 1: + cmd = "nohup slot_monitor.py start >/dev/null 2>&1 &" + rets = getPid("slot_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startIntelligentmonitor(): + if STARTMODULE.get('intelligent_monitor', 0) == 1: + cmd = "nohup intelligent_monitor.py >/dev/null 2>&1 &" + rets = getPid("intelligent_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startSignalmonitor(): + if STARTMODULE.get('signal_monitor', 0) == 1: + cmd = "nohup signal_monitor.py start >/dev/null 2>&1 &" + rets = getPid("signal_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startSff_temp_polling(): + if STARTMODULE.get('sff_temp_polling', 0) == 1: + cmd = "nohup sfp_highest_temperatue.py >/dev/null 2>&1 &" + rets = getPid("sfp_highest_temperatue.py") + if len(rets) == 0: + os.system(cmd) + + +def startRebootCause(): + if STARTMODULE.get('reboot_cause', 0) == 1: + cmd = "nohup reboot_cause.py >/dev/null 2>&1 &" + rets = getPid("reboot_cause.py") + if len(rets) == 0: + os.system(cmd) + + +def startPMON_sys(): + if STARTMODULE.get('pmon_syslog', 0) == 1: + cmd = "nohup pmon_syslog.py >/dev/null 2>&1 &" + rets = getPid("pmon_syslog.py") + if len(rets) == 0: + os.system(cmd) + + +def startSff_polling(): + if STARTMODULE.get('sff_polling', 0) == 1: + cmd = "nohup sff_polling.py start > /dev/null 2>&1 &" + rets = getPid("sff_polling.py") + if len(rets) == 0: + os.system(cmd) + + +def generate_air_flow(): + cmd = "nohup generate_airflow.py > /dev/null 2>&1 &" + rets = getPid("generate_airflow.py") + if len(rets) == 0: + os.system(cmd) + time.sleep(1) + + +def startGenerate_air_flow(): + if STARTMODULE.get('generate_airflow', 0) == 1: + for i in range(10): + generate_air_flow() + if os.path.exists(AIRFLOW_RESULT_FILE): + click.echo("%%WB_PLATFORM_PROCESS: generate air flow success") + return + time.sleep(1) + click.echo("%%WB_PLATFORM_PROCESS: generate air flow,failed, %s not exits" % AIRFLOW_RESULT_FILE) + return + + +def start_tty_console(): + if STARTMODULE.get('tty_console', 0) == 1: + cmd = "nohup tty_console.py > /dev/null 2>&1 &" + rets = getPid("tty_console.py") + if len(rets) == 0: + os.system(cmd) + + +def stopAvscontrol(): + if STARTMODULE.get('avscontrol', 0) == 1: + rets = getPid("avscontrol.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopFanctrol(): + if STARTMODULE.get('fancontrol', 0) == 1: + rets = getPid("fancontrol.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stophal_fanctrl(): + if STARTMODULE.get('hal_fanctrl', 0) == 1: + rets = getPid("hal_fanctrl.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stophal_ledctrl(): + if STARTMODULE.get('hal_ledctrl', 0) == 1: + rets = getPid("hal_ledctrl.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopDevmonitor(): + if STARTMODULE.get('dev_monitor', 0) == 1: + rets = getPid("dev_monitor.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSlotmonitor(): + if STARTMODULE.get('slot_monitor', 0) == 1: + rets = getPid("slot_monitor.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopIntelligentmonitor(): + if STARTMODULE.get('intelligent_monitor', 0) == 1: + rets = getPid("intelligent_monitor.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSignalmonitor(): + if STARTMODULE.get('signal_monitor', 0) == 1: + rets = getPid("signal_monitor.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSff_temp_polling(): + if STARTMODULE.get('sff_temp_polling', 0) == 1: + rets = getPid("sfp_highest_temperatue.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopPMON_sys(): + if STARTMODULE.get('pmon_syslog', 0) == 1: + rets = getPid("pmon_syslog.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopRebootCause(): + if STARTMODULE.get('reboot_cause', 0) == 1: + rets = getPid("reboot_cause.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSff_polling(): + if STARTMODULE.get('sff_polling', 0) == 1: + rets = getPid("sff_polling.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopGenerate_air_flow(): + if STARTMODULE.get('generate_airflow', 0) == 1: + rets = getPid("generate_airflow.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stop_tty_console(): + if STARTMODULE.get('tty_console', 0) == 1: + rets = getPid("tty_console.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def otherinit(): + for index in GLOBALINITPARAM: + write_sysfs_value(index["loc"], index["value"]) + + for index in GLOBALINITCOMMAND: + log_os_system(index) + + +def otherinit_pre(): + for index in GLOBALINITPARAM_PRE: + write_sysfs_value(index["loc"], index["value"]) + + for index in GLOBALINITCOMMAND_PRE: + log_os_system(index) + + +def unload_apps(): + stopSff_polling() + stopPMON_sys() + stopSignalmonitor() + stopIntelligentmonitor() + stopSlotmonitor() + stopDevmonitor() + stopAvscontrol() + stophal_ledctrl() + stophal_fanctrl() + stopFanctrol() + stopSff_temp_polling() + stopRebootCause() + stop_tty_console() + stopGenerate_air_flow() + + +def MacLedSet(data): + '''write pci register''' + pcibus = MAC_LED_RESET.get("pcibus") + slot = MAC_LED_RESET.get("slot") + fn = MAC_LED_RESET.get("fn") + resource = MAC_LED_RESET.get("bar") + offset = MAC_LED_RESET.get("offset") + val = MAC_LED_RESET.get(data, None) + if val is None: + click.echo("%%WB_PLATFORM_PROCESS-INIT: MacLedSet wrong input") + return + wbpciwr(pcibus, slot, fn, resource, offset, val) + + +def load_apps(): + otherinit_pre() + startGenerate_air_flow() + start_tty_console() + startRebootCause() + startSff_temp_polling() + startFanctrol() + starthal_fanctrl() + starthal_ledctrl() + startAvscontrol() + startDevmonitor() + startSlotmonitor() + startIntelligentmonitor() + startSignalmonitor() + startPMON_sys() + startSff_polling() + otherinit() + if STARTMODULE.get("macledreset", 0) == 1: + MacLedSet("reset") + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''device operator''' + + +@main.command() +def start(): + '''load process ''' + load_apps() + + +@main.command() +def stop(): + '''stop process ''' + unload_apps() + + +@main.command() +def restart(): + '''restart process''' + unload_apps() + load_apps() + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py new file mode 100755 index 000000000000..1727242b74b9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py @@ -0,0 +1,253 @@ +#!/usr/bin/python3 + +import os +import sys +import importlib.machinery + + +def get_machine_info(): + if not os.path.isfile('/host/machine.conf'): + return None + machine_vars = {} + with open('/host/machine.conf') as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars + + +def get_platform_info(machine_info): + if machine_info is not None: + if 'onie_platform' in machine_info: + return machine_info['onie_platform'] + if 'aboot_platform' in machine_info: + return machine_info['aboot_platform'] + return None + + +PLATFORM_ROOT_PATH = '/usr/share/sonic/device' +PLATFORM_SPECIFIC_MODULE_NAME = 'monitor' +PLATFORM_SPECIFIC_CLASS_NAME = 'status' +platform_status_class = None +platform = None + + +def get_platform_name(): + global platform + platform = get_platform_info(get_machine_info()) + return platform + + +val = get_platform_name() +sys.path.append("/".join([PLATFORM_ROOT_PATH, platform])) + +# Loads platform specific sfputil module from source + + +def load_platform_monitor(): + global platform_status_class + platform_name = get_platform_info(get_machine_info()) + platform_path = "/".join([PLATFORM_ROOT_PATH, platform_name]) + try: + module_file = "/".join([platform_path, PLATFORM_SPECIFIC_MODULE_NAME + ".py"]) + module = importlib.machinery.SourceFileLoader(PLATFORM_SPECIFIC_MODULE_NAME, module_file).load_module() + except IOError: + return -1 + try: + platform_status_class = getattr(module, PLATFORM_SPECIFIC_CLASS_NAME) + except AttributeError: + return -2 + return 0 + + +def printerr(msg): + print("\033[0;31m%s\033[0m" % msg) + + +def print_console(msg): + print(msg) + + +val_t = load_platform_monitor() +if val_t != 0: + raise Exception("load monitor.py error") + + +def print_platform(): + platform_info = get_platform_name() + print_console(platform_info) + print_console("") + + +def print_cputemp_sensors(): + val_ret = get_call_value_by_function("getcputemp") + print_info_str = "" + toptile = "Onboard coretemp Sensors:" + formatstr = " {name:<20} : {temp} C (high = {max} C , crit = {crit} C )" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + print_info_str += formatstr.format(**item) + '\n' + print_console(print_info_str) + + +def print_boardtemp(): + val_ret = get_call_value_by_function("getTemp") + print_info_str = "" + toptile = "Onboard Temperature Sensors:" + errformat = " {id:<20} : {errmsg}" + formatstr = " {id:<20} : {temp1_input} C (high = {temp1_max} C, hyst = {temp1_max_hyst} C)" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def print_mactemp_sensors(): + val_ret = get_call_value_by_function("getmactemp") + print_info_str = "" + toptile = "Onboard MAC Temperature Sensors:" + errformat = " {id:<20} : {errmsg}" + formatstr = " {id:<20} : {temp_input} C" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def print_macpower_sensors(): + val_ret = get_call_value_by_function("getmacpower") + print_info_str = "" + toptile = "Onboard MAC Power Sensors:" + errformat = " {id:<20} : {errmsg}" + formatstr = " {id:<20} : {power_input} W" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def print_fan_sensor(): + val_ret = get_call_value_by_function("checkFan") + print_info_str = "" + toptile = "Onboard fan Sensors:" + errformat = " {id} : {errmsg}\n" # " {id:<20} : {errmsg}" + fan_signle_rotor_format = " {id} : \n" \ + " fan_type :{fan_type}\n" \ + " sn :{sn}\n" \ + " hw_version:{hw_version}\n" \ + " Speed :{Speed} RPM\n" \ + " status :{errmsg} \n" + fan_double_rotor_format = " {id} : \n" \ + " fan_type :{fan_type}\n" \ + " sn :{sn}\n" \ + " hw_version:{hw_version}\n" \ + " Speed :\n" \ + " speed_front :{rotor1_speed:<5} RPM\n" \ + " speed_rear :{rotor2_speed:<5} RPM\n" \ + " status :{errmsg} \n" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + if item.get('Speed', None) is None: + realformat = fan_double_rotor_format if item.get('errcode', 0) == 0 else errformat + else: + realformat = fan_signle_rotor_format if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + print_console(print_info_str) + + +def print_psu_sensor(): + val_ret = get_call_value_by_function("getPsu") + print_info_str = "" + toptile = "Onboard Power Supply Unit Sensors:" + errformat = " {id} : {errmsg}\n" # " {id:<20} : {errmsg}" + psuformat = " {id} : \n" \ + " type :{type1}\n" \ + " sn :{sn}\n" \ + " in_current :{in_current} A\n" \ + " in_voltage :{in_voltage} V\n" \ + " out_current:{out_current} A\n" \ + " out_voltage:{out_voltage} V\n" \ + " temp :{temp} C \n" \ + " fan_speed :{fan_speed} RPM\n" \ + " in_power :{in_power} W\n" \ + " out_power :{out_power} W\n" + + if len(val_ret) != 0: + print_info_str += toptile + '\r\n' + for item in val_ret: + realformat = psuformat if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + print_console(print_info_str) + + +def print_slot_sensor(): + val_ret = get_call_value_by_function("checkSlot") + print_info_str = "" + toptile = "Onboard slot Sensors:" + errformat = " {id} : {errmsg}\n" # " {id:<20} : {errmsg}" + psuformat = " {id} : \n" \ + " slot_type :{slot_type}\n" \ + " sn :{sn}\n" \ + " hw_version :{hw_version} \n" \ + " status :{errmsg}\n" + + if len(val_ret) != 0: + print_info_str += toptile + '\r\n' + for item in val_ret: + realformat = psuformat if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + print_console(print_info_str) + + +def print_boarddcdc(): + val_ret = get_call_value_by_function("getDcdc") + print_info_str = "" + toptile = "Onboard DCDC Sensors:" + errformat = " {id:<26} : {errmsg}" + formatstr = " {id:<26} : {dcdc_input:<6} {dcdc_unit:<1} (Min = {dcdc_min:<6} {dcdc_unit:<1}, Max = {dcdc_max:<6} {dcdc_unit:<1})" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def get_call_value_by_function(function_name): + valtemp = [] + if hasattr(platform_status_class, function_name): + test2_func = getattr(platform_status_class, function_name) + test2_func(valtemp) + return valtemp + + +def getsensors(): + print_platform() + print_cputemp_sensors() + print_boardtemp() + print_mactemp_sensors() + print_macpower_sensors() + print_fan_sensor() + print_psu_sensor() + print_slot_sensor() + print_boarddcdc() + + +if __name__ == "__main__": + getsensors() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py new file mode 100755 index 000000000000..da7119a9ce49 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- + +try: + import click + from platform_intf import platform_reg_read, platform_reg_write, platform_get_optoe_type + from platform_intf import platform_set_optoe_type, platform_sfp_read, platform_sfp_write +except ImportError as error: + raise ImportError('%s - required module not found' % str(error)) from error + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def print_reg(info, offset): + try: + size = len(info) + j = offset % 16 + tmp = j + offset -= j + print_buf = "\n " + + for i in range(16): + print_buf = print_buf + "%2x " % i + print(print_buf) + + print_buf = None + for i in range(size + j): + if i % 16 == 0: + print_buf = "" + print_buf = "0x%08x " % offset + offset = offset + 16 + if tmp: + print_buf = print_buf + " " + tmp = tmp - 1 + else: + print_buf = print_buf + "%02x " % info[i - j] + if (i + 1) % 16 == 0 or i == size + j - 1: + print(print_buf) + except Exception as e: + msg = str(e) + print("i = %d, j = %d," % (i, j)) + print(msg) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''platform_test main''' + + +@main.command() +@click.argument('dev_type', required=True) +@click.argument('dev_id', required=True) +@click.argument('offset', required=True) +@click.argument('size', required=True) +def reg_rd(dev_type, dev_id, offset, size): + '''read cpld/fpga reg''' + ret, info = platform_reg_read(int(dev_type), int(dev_id), int(offset), int(size)) + print(ret) + if ret is True: + print_reg(info, int(offset)) + else: + print(info) + + +@main.command() +@click.argument('dev_type', required=True) +@click.argument('dev_id', required=True) +@click.argument('offset', required=True) +@click.argument('value', required=True) +def reg_wr(dev_type, dev_id, offset, value): + '''write cpld/fpga reg''' + value_list = [] + value_list.append(int(value)) + ret, info = platform_reg_write(int(dev_type), int(dev_id), int(offset), value_list) + print(ret) + print(info) + + +@main.command() +@click.argument('port', required=True) +def get_optoe_type(port): + '''get optoe type''' + ret, info = platform_get_optoe_type(int(port)) + print(ret) + print(info) + + +@main.command() +@click.argument('port', required=True) +@click.argument('optoe_type', required=True) +def set_optoe_type(port, optoe_type): + '''set optoe type''' + ret, info = platform_set_optoe_type(int(port), int(optoe_type)) + print(ret) + print(info) + + +@main.command() +@click.argument('port_id', required=True) +@click.argument('offset', required=True) +@click.argument('size', required=True) +def sfp_rd(port_id, offset, size): + '''read sfp''' + ret, info = platform_sfp_read(int(port_id), int(offset), int(size)) + print(ret) + if ret is True: + print_reg(info, int(offset)) + else: + print(info) + + +@main.command() +@click.argument('port_id', required=True) +@click.argument('offset', required=True) +@click.argument('value', required=True) +def sfp_wr(port_id, offset, value): + '''write sfp''' + value_list = [] + value_list.append(int(value)) + ret, info = platform_sfp_write(int(port_id), int(offset), value_list) + print(ret) + print(info) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py new file mode 100755 index 000000000000..e7e6c8b1d6eb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py @@ -0,0 +1,845 @@ +#!/usr/bin/python3 + +import sys +import os +import re +import subprocess +import shlex +import time +import mmap +import glob +import logging.handlers +import shutil +import gzip +import ast + + +CONFIG_DB_PATH = "/etc/sonic/config_db.json" +MAILBOX_DIR = "/sys/bus/i2c/devices/" + + +__all__ = [ + "strtoint", + "byteTostr", + "getplatform_name", + "wbi2cget", + "wbi2cset", + "wbpcird", + "wbpciwr", + "wbi2cgetWord", + "wbi2csetWord", + "wbi2cset_pec", + "wbi2cset_wordpec", + "wbsysset", + "dev_file_read", + "dev_file_write", + "wb_os_system", + "io_rd", + "io_wr", + "exec_os_cmd", + "exec_os_cmd_log", + "write_sysfs", + "read_sysfs", + "get_sysfs_value", + "write_sysfs_value", + "get_value", + "set_value", + "getSdkReg", + "getMacTemp", + "getMacTemp_sysfs", + "get_format_value" +] + +class CodeVisitor(ast.NodeVisitor): + + def __init__(self): + self.value = None + + def get_value(self): + return self.value + + def get_op_value(self, node): + if isinstance(node, ast.Call): # node is func call + value = self.visit_Call(node) + elif isinstance(node, ast.BinOp): # node is BinOp + value = self.visit_BinOp(node) + elif isinstance(node, ast.UnaryOp): # node is UnaryOp + value = self.visit_UnaryOp(node) + elif isinstance(node, ast.Num): # node is Num Constant + value = node.n + elif isinstance(node, ast.Str): # node is Str Constant + value = node.s + else: + raise NotImplementedError("Unsupport operand type: %s" % type(node)) + return value + + def visit_UnaryOp(self, node): + ''' + node.op: operand type, only support ast.UAdd/ast.USub + node.operand: only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.UnaryOp + ''' + + operand_value = self.get_op_value(node.operand) + if isinstance(node.op, ast.UAdd): + self.value = operand_value + elif isinstance(node.op, ast.USub): + self.value = 0 - operand_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_BinOp(self, node): + ''' + node.left: left operand, only support ast.Call/ast.Constant(ast.Num)/ast.BinOp + node.op: operand type, only support ast.Add/ast.Sub/ast.Mult/ast.Div + node.right: right operan, only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + left_value = self.get_op_value(node.left) + right_value = self.get_op_value(node.right) + + if isinstance(node.op, ast.Add): + self.value = left_value + right_value + elif isinstance(node.op, ast.Sub): + self.value = left_value - right_value + elif isinstance(node.op, ast.Mult): + self.value = left_value * right_value + elif isinstance(node.op, ast.Div): + self.value = left_value / right_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_Call(self, node): + ''' + node.func.id: func name, only support 'float', 'int', 'str' + node.args: func args list,only support ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.Call + str/float only support one parameter, eg: float(XXX), str(xxx) + int support one or two parameters, eg: int(xxx) or int(xxx, 16) + xxx can be ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + calc_tuple = ("float", "int", "str") + + if node.func.id not in calc_tuple: + raise NotImplementedError("Unsupport function call type: %s" % node.func.id) + + args_val_list = [] + for item in node.args: + ret = self.get_op_value(item) + args_val_list.append(ret) + + if node.func.id == "str": + if len(args_val_list) != 1: + raise TypeError("str() takes 1 positional argument but %s were given" % len(args_val_list)) + value = str(args_val_list[0]) + self.value = value + return value + + if node.func.id == "float": + if len(args_val_list) != 1: + raise TypeError("float() takes 1 positional argument but %s were given" % len(args_val_list)) + value = float(args_val_list[0]) + self.value = value + return value + # int + if len(args_val_list) == 1: + value = int(args_val_list[0]) + self.value = value + return value + if len(args_val_list) == 2: + value = int(args_val_list[0], args_val_list[1]) + self.value = value + return value + raise TypeError("int() takes 1 or 2 arguments (%s given)" % len(args_val_list)) + +def inttostr(vl, length): + if not isinstance(vl, int): + raise Exception(" type error") + index = 0 + ret_t = "" + while index < length: + ret = 0xff & (vl >> index * 8) + ret_t += chr(ret) + index += 1 + return ret_t + + +def strtoint(str_tmp): + value = 0 + rest_v = str_tmp.replace("0X", "").replace("0x", "") + str_len = len(rest_v) + for index, val in enumerate(rest_v): + value |= int(val, 16) << ((str_len - index - 1) * 4) + return value + + +def inttobytes(val, length): + if not isinstance(val, int): + raise Exception("type error") + data_array = bytearray() + index = 0 + while index < length: + ret = 0xff & (val >> index * 8) + data_array.append(ret) + index += 1 + return data_array + + +def byteTostr(val): + strtmp = '' + for value in val: + strtmp += chr(value) + return strtmp + + +def typeTostr(val): + strtmp = '' + if isinstance(val, bytes): + strtmp = byteTostr(val) + return strtmp + + +def getonieplatform(path): + if not os.path.isfile(path): + return "" + machine_vars = {} + with open(path) as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars.get("onie_platform") + + +def getplatform_config_db(): + if not os.path.isfile(CONFIG_DB_PATH): + return "" + val = os.popen("sonic-cfggen -j %s -v DEVICE_METADATA.localhost.platform" % CONFIG_DB_PATH).read().strip() + if len(val) <= 0: + return "" + return val + + +def getplatform_name(): + if os.path.isfile('/host/machine.conf'): + return getonieplatform('/host/machine.conf') + if os.path.isfile('/usr/share/sonic/hwsku/machine.conf'): + return getonieplatform('/usr/share/sonic/hwsku/machine.conf') + return getplatform_config_db() + + +def wbi2cget(bus, devno, address, word=None): + if word is None: + command_line = "i2cget -f -y %d 0x%02x 0x%02x " % (bus, devno, address) + else: + command_line = "i2cget -f -y %d 0x%02x 0x%02x %s" % (bus, devno, address, word) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + time.sleep(0.1) + return False, ret_t + + +def wbi2cset(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbpcird(pcibus, slot, fn, resource, offset): + '''read pci register''' + if offset % 4 != 0: + return "ERR offset: %d not 4 bytes align" + filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % (int(pcibus), int(slot), int(fn), int(resource)) + with open(filename, "r+") as file: + size = os.path.getsize(filename) + data = mmap.mmap(file.fileno(), size) + result = data[offset: offset + 4] + s = result[::-1] + val = 0 + for value in s: + val = val << 8 | value + data.close() + return "0x%08x" % val + + +def wbpciwr(pcibus, slot, fn, resource, offset, data): + '''write pci register''' + ret = inttobytes(data, 4) + filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % (int(pcibus), int(slot), int(fn), int(resource)) + with open(filename, "r+") as file: + size = os.path.getsize(filename) + data = mmap.mmap(file.fileno(), size) + data[offset: offset + 4] = ret + result = data[offset: offset + 4] + s = result[::-1] + val = 0 + for value in s: + val = val << 8 | value + data.close() + + +def wbi2cgetWord(bus, devno, address): + command_line = "i2cget -f -y %d 0x%02x 0x%02x w" % (bus, devno, address) + retrytime = 3 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbi2csetWord(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%x w" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbi2cset_pec(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x bp" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbi2cset_wordpec(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x wp" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbsysset(location, value): + command_line = "echo 0x%02x > %s" % (value, location) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def dev_file_read(path, offset, read_len): + val_list = [] + msg = "" + ret = "" + fd = -1 + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, read_len) + for item in ret: + val_list.append(item) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + return True, val_list + + +def dev_file_write(path, offset, buf_list): + msg = "" + fd = -1 + + if not isinstance(buf_list, list) or len(buf_list) == 0: + msg = "buf:%s is not list type or is NONE !" % buf_list + return False, msg + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_WRONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.write(fd, bytes(buf_list)) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + + return True, ret + + +def wb_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + return status, output + + +def io_rd(reg_addr, read_len=1): + try: + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + val = os.read(fd, read_len) + return "".join(["%02x" % item for item in val]) + except ValueError: + return None + except Exception as e: + print(e) + return None + finally: + os.close(fd) + + +def io_wr(reg_addr, reg_data): + try: + regdata = 0 + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + if isinstance(reg_data, int): + regdata = reg_data + else: + regdata = int(reg_data, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + os.write(fd, regdata.to_bytes(1, 'little')) + return True + except ValueError as e: + print(e) + return False + except Exception as e: + print(e) + return False + finally: + os.close(fd) + + +def exec_os_cmd(cmd): + cmds = cmd.split('|') + procs = [] + for i, c in enumerate(cmds): + stdin = None if i == 0 else procs[i-1].stdout + p = subprocess.Popen(shlex.split(c), stdin=stdin, stdout=subprocess.PIPE, shell=False, stderr=subprocess.STDOUT) + procs.append(p) + for proc in procs: + proc.wait() + return procs[-1].returncode, typeTostr(procs[-1].communicate()[0]) + + +def exec_os_cmd_log(cmd): + proc = subprocess.Popen(shlex.split(cmd), stdin=subprocess.PIPE, shell=False, stderr=sys.stderr, close_fds=True, + stdout=sys.stdout, universal_newlines=True, bufsize=1) + proc.wait() + stdout = proc.communicate()[0] + stdout = typeTostr(stdout) + return proc.returncode, stdout + + +def write_sysfs(location, value): + try: + if not os.path.isfile(location): + return False, ("location[%s] not found !" % location) + with open(location, 'w') as fd1: + fd1.write(value) + except Exception as e: + return False, (str(e) + " location[%s]" % location) + return True, ("set location[%s] %s success !" % (location, value)) + + +def read_sysfs(location): + try: + locations = glob.glob(location) + with open(locations[0], 'rb') as fd1: + retval = fd1.read() + retval = typeTostr(retval) + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + except Exception as e: + return False, (str(e) + "location[%s]" % location) + return True, retval + + +def get_pmc_register(reg_name): + retval = 'ERR' + mb_reg_file = MAILBOX_DIR + reg_name + filepath = glob.glob(mb_reg_file) + if len(filepath) == 0: + return "%s %s notfound" % (retval, mb_reg_file) + mb_reg_file = filepath[0] + if not os.path.isfile(mb_reg_file): + return "%s %s notfound" % (retval, mb_reg_file) + try: + with open(mb_reg_file, 'r') as fd: + retval = fd.read() + except Exception as error: + retval = retval + str(error) + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + return retval + + +def get_sysfs_value(location): + pos_t = str(location) + name = get_pmc_register(pos_t) + return name + + +def write_sysfs_value(reg_name, value): + fileLoc = MAILBOX_DIR + reg_name + try: + if not os.path.isfile(fileLoc): + print(fileLoc, 'not found !') + return False + with open(fileLoc, 'w') as fd: + fd.write(value) + except Exception: + print("Unable to open " + fileLoc + "file !") + return False + return True + + +def get_value_once(config): + try: + way = config.get("gettype") + int_decode = config.get("int_decode", 16) + if way == 'sysfs': + loc = config.get("loc") + ret, val = read_sysfs(loc) + if ret is True: + return True, int(val, int_decode) + return False, ("sysfs read %s failed. log:%s" % (loc, val)) + if way == "i2c": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset", 0) + ret, val = wbi2cget(bus, addr, offset) + if ret is True: + return True, int(val, int_decode) + return False, ("i2c read failed. bus:%d , addr:0x%x, offset:0x%x" % (bus, addr, offset)) + if way == "io": + io_addr = config.get('io_addr') + val = io_rd(io_addr) + if len(val) != 0: + return True, int(val, int_decode) + return False, ("io_addr read 0x%x failed" % io_addr) + if way == "i2cword": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + ret, val = wbi2cgetWord(bus, addr, offset) + if ret is True: + return True, int(val, int_decode) + return False, ("i2cword read failed. bus:%d, addr:0x%x, offset:0x%x" % (bus, addr, offset)) + if way == "devfile": + path = config.get("path") + offset = config.get("offset") + read_len = config.get("read_len") + ret, val_list = dev_file_read(path, offset, read_len) + if ret is True: + return True, val_list + return False, ("devfile read failed. path:%s, offset:0x%x, read_len:%d" % (path, offset, read_len)) + if way == 'cmd': + cmd = config.get("cmd") + ret, val = exec_os_cmd(cmd) + if ret: + return False, ("cmd read exec %s failed, log: %s" % (cmd, val)) + return True, int(val, int_decode) + if way == 'file_exist': + judge_file = config.get('judge_file', None) + if os.path.exists(judge_file): + return True, True + return True, False + return False, "not support read type" + except Exception as e: + return False, ("get_value_once exception:%s happen" % str(e)) + + +def set_value_once(config): + try: + delay_time = config.get("delay", None) + if delay_time is not None: + time.sleep(delay_time) + + way = config.get("gettype") + if way == 'sysfs': + loc = config.get("loc") + value = config.get("value") + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + ret, read_value = read_sysfs(loc) + if ret is True: + read_value = int(read_value, base=16) + value = (read_value & mask) | value + else: + return False, ("sysfs read %s failed. log:%s" % (loc, read_value)) + ret, log = write_sysfs(loc, "0x%02x" % value) + if ret is not True: + return False, ("sysfs %s write 0x%x failed" % (loc, value)) + return True, ("sysfs write 0x%x success" % value) + if way == "i2c": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get("value") + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + ret, read_value = wbi2cget(bus, addr, offset) + if ret is True: + read_value = int(read_value, base=16) + value = (read_value & mask) | value + else: + return False, ("i2c read failed. bus:%d , addr:0x%x, offset:0x%x" % (bus, addr, offset)) + ret, log = wbi2cset(bus, addr, offset, value) + if ret is not True: + return False, ("i2c write bus:%d, addr:0x%x, offset:0x%x, value:0x%x failed" % + (bus, addr, offset, value)) + return True, ("i2c write bus:%d, addr:0x%x, offset:0x%x, value:0x%x success" % + (bus, addr, offset, value)) + if way == "io": + io_addr = config.get('io_addr') + value = config.get('value') + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + read_value = io_rd(io_addr) + if read_value is None: + return False, ("io_addr 0x%x read failed" % (io_addr)) + read_value = int(read_value, base=16) + value = (read_value & mask) | value + ret = io_wr(io_addr, value) + if ret is not True: + return False, ("io_addr 0x%x write 0x%x failed" % (io_addr, value)) + return True, ("io_addr 0x%x write 0x%x success" % (io_addr, value)) + if way == 'i2cword': + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get("value") + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + ret, read_value = wbi2cgetWord(bus, addr, offset) + if ret is True: + read_value = int(read_value, base=16) + value = (read_value & mask) | value + else: + return False, ("i2c read word failed. bus:%d , addr:0x%x, offset:0x%x" % (bus, addr, offset)) + ret, log = wbi2csetWord(bus, addr, offset, value) + if ret is not True: + return False, ("i2cword write bus:%d, addr:0x%x, offset:0x%x, value:0x%x failed" % + (bus, addr, offset, value)) + return True, ("i2cword write bus:%d, addr:0x%x, offset:0x%x, value:0x%x success" % + (bus, addr, offset, value)) + if way == "devfile": + path = config.get("path") + offset = config.get("offset") + buf_list = config.get("value") + ret, log = dev_file_write(path, offset, buf_list) + if ret is True: + return True, ("devfile write path:%s, offset:0x%x, buf_list:%s success." % (path, offset, buf_list)) + return False, ("devfile read path:%s, offset:0x%x, buf_list:%s failed.log:%s" % + (path, offset, buf_list, log)) + if way == 'cmd': + cmd = config.get("cmd") + ret, log = exec_os_cmd(cmd) + if ret: + return False, ("cmd write exec %s failed, log: %s" % (cmd, log)) + return True, ("cmd write exec %s success" % cmd) + if way == 'bit_wr': + mask = config.get("mask") + bit_val = config.get("value") + val_config = config.get("val_config") + ret, rd_value = get_value_once(val_config) + if ret is False: + return False, ("bit_wr read failed, log: %s" % rd_value) + wr_val = (rd_value & mask) | bit_val + val_config["value"] = wr_val + ret, log = set_value_once(val_config) + if ret is False: + return False, ("bit_wr failed, log: %s" % log) + return True, ("bit_wr success, log: %s" % log) + if way == 'creat_file': + file_name = config.get("file") + ret, log = exec_os_cmd("touch %s" % file_name) + if ret: + return False, ("creat file %s failed, log: %s" % (file_name, log)) + exec_os_cmd("sync") + return True, ("creat file %s success" % file_name) + if way == 'remove_file': + file_name = config.get("file") + ret, log = exec_os_cmd("rm -rf %s" % file_name) + if ret: + return False, ("remove file %s failed, log: %s" % (file_name, log)) + exec_os_cmd("sync") + return True, ("remove file %s success" % file_name) + return False, "not support write type" + except Exception as e: + return False, ("set_value_once exception:%s happen" % str(e)) + + +def get_value(config): + retrytime = 6 + for i in range(retrytime): + ret, val = get_value_once(config) + if ret is True: + return True, val + time.sleep(0.1) + return False, val + + +def set_value(config): + retrytime = 6 + ignore_result_flag = config.get("ignore_result", 0) + for i in range(retrytime): + ret, log = set_value_once(config) + if ret is True: + return True, log + if ignore_result_flag == 1: + return True, log + time.sleep(0.1) + return False, log + + +class CompressedRotatingFileHandler(logging.handlers.RotatingFileHandler): + def doRollover(self): + """ + Do a rollover, as described in __init__(). + """ + if self.stream: + self.stream.close() + self.stream = None + if self.backupCount > 0: + for i in range(self.backupCount - 1, 0, -1): + sfn = "%s.%d.gz" % (self.baseFilename, i) + dfn = "%s.%d.gz" % (self.baseFilename, i + 1) + if os.path.exists(sfn): + if os.path.exists(dfn): + os.remove(dfn) + os.rename(sfn, dfn) + dfn = self.baseFilename + ".1.gz" + if os.path.exists(dfn): + os.remove(dfn) + # These two lines below are the only new lines. I commented out the os.rename(self.baseFilename, dfn) and + # replaced it with these two lines. + with open(self.baseFilename, 'rb') as f_in, gzip.open(dfn, 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + self.mode = 'w' + self.stream = self._open() + + +def getSdkReg(reg): + try: + cmd = "bcmcmd -t 1 'getr %s ' < /dev/null" % reg + ret, result = wb_os_system(cmd) + result_t = result.strip().replace("\r", "").replace("\n", "") + if ret != 0 or "Error:" in result_t: + return False, result + patt = r"%s.(.*):(.*)>drivshell" % reg + rt = re.findall(patt, result_t, re.S) + test = re.findall("=(.*)", rt[0][0])[0] + except Exception: + return False, 'getsdk register error' + return True, test + + +def getMacTemp(): + result = {} + wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + ret, log = wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + if ret: + return False, result + logs = log.splitlines() + for line in logs: + if "average" in line: + b = re.findall(r'\d+.\d+', line) + result["average"] = b[0] + elif "maximum" in line: + b = re.findall(r'\d+.\d+', line) + result["maximum"] = b[0] + return True, result + + +def getMacTemp_sysfs(mactempconf): + temp = -1000000 + try: + temp_list = [] + mac_temp_loc = mactempconf.get("loc", []) + mac_temp_flag = mactempconf.get("flag", None) + if mac_temp_flag is not None: + gettype = mac_temp_flag.get('gettype') + okbit = mac_temp_flag.get('okbit') + okval = mac_temp_flag.get('okval') + if gettype == "io": + io_addr = mac_temp_flag.get('io_addr') + val = io_rd(io_addr) + if val is None: + raise Exception("get mac_flag by io failed.") + else: + bus = mac_temp_flag.get('bus') + loc = mac_temp_flag.get('loc') + offset = mac_temp_flag.get('offset') + ind, val = wbi2cget(bus, loc, offset) + if ind is not True: + raise Exception("get mac_flag by i2c failed.") + val_t = (int(val, 16) & (1 << okbit)) >> okbit + if val_t != okval: + raise Exception("mac_flag invalid, val_t:%d." % val_t) + for loc in mac_temp_loc: + temp_s = get_sysfs_value(loc) + if isinstance(temp_s, str) and temp_s.startswith("ERR"): + raise Exception("get mac temp error. loc:%s" % loc) + temp_t = int(temp_s) + if temp_t == -1000000: + raise Exception("mac temp invalid.loc:%s" % loc) + temp_list.append(temp_t) + temp_list.sort(reverse=True) + temp = temp_list[0] + except Exception: + return False, temp + return True, temp + +def get_format_value(format_str): + ast_obj = ast.parse(format_str, mode='eval') + visitor = CodeVisitor() + visitor.visit(ast_obj) + ret = visitor.get_value() + return ret + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py new file mode 100755 index 000000000000..8bdceef8c1b5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py @@ -0,0 +1,519 @@ +#!/usr/bin/python3 +# * onboard interval check +# * FAN trays +# * PSU +# * SFF +import time +import syslog +import traceback +import glob +from platform_config import PMON_SYSLOG_STATUS + +PMON_DEBUG_FILE = "/etc/.pmon_syslog_debug_flag" +debuglevel = 0 +PMONERROR = 1 +PMONDEBUG = 2 + + +def pmon_debug(s): + if PMONDEBUG & debuglevel: + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def pmon_error(s): + if PMONERROR & debuglevel: + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def dev_syslog(s): + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_NOTICE, s) + + +# status +STATUS_PRESENT = 'PRESENT' +STATUS_ABSENT = 'ABSENT' +STATUS_OK = 'OK' +STATUS_NOT_OK = 'NOT OK' +STATUS_FAILED = 'FAILED' + + +class checkBase(object): + def __init__(self, path, dev_name, display_name, obj_type, config): + self._peroid_syslog = None + self._peroid_failed_syslog = None # exception + self._preDevStatus = None + self._path = path + self._name = dev_name + self._display_name = display_name + self._type = obj_type + self._config = config + + def getCurstatus(self): + # get ok/not ok/absent status + status, log = self.getPresent() + if status == STATUS_PRESENT: + # check status + property_status, log = self.getStatus() + if property_status is not None: + status = property_status + return status, log + + def getPresent(self): + presentFilepath = self.getPath() + try: + # get ok/not ok/absent status + presentConfig = self._config["present"] + mask = presentConfig.get("mask", 0xff) + absent_val = presentConfig.get("ABSENT", None) + absent_val = absent_val & mask + with open(presentFilepath, "r") as fd: + retval = fd.read() + if int(retval) == absent_val: + return STATUS_ABSENT, None + return STATUS_PRESENT, None + except Exception as e: + return STATUS_FAILED, (str(e) + " location[%s]" % presentFilepath) + + def getStatus(self): + if "status" in self._config: + statusConfig = self._config["status"] + for itemConfig in statusConfig: + mask = itemConfig.get("mask", 0xff) + ok_val = itemConfig.get("okval", None) + ok_val = ok_val & mask + Filepath = itemConfig["path"] % self._name + try: + with open(Filepath, "r") as fd1: + retval = fd1.read() + if int(retval) != ok_val: + return STATUS_NOT_OK, None + except Exception as e: + return STATUS_FAILED, (str(e) + " location[%s]" % Filepath) + return STATUS_OK, None + return None, None + + def getPath(self): + return self._path + + def getName(self): + return self._name + + def getType(self): + return self._type + + def getDisplayName(self): + return self._display_name + + def getnochangedMsgFlag(self): + return self._config["nochangedmsgflag"] + + def getnochangedMsgTime(self): + return self._config["nochangedmsgtime"] + + def getnoprintFirstTimeFlag(self): + return self._config["noprintfirsttimeflag"] + + def checkStatus(self): + # syslog msg + dev_type = self.getType() + display_name = self.getDisplayName() + nochangedMsgTime = self.getnochangedMsgTime() + getnochangedMsgFlag = self.getnochangedMsgFlag() + noprintFirstTimeFlag = self.getnoprintFirstTimeFlag() + MSG_IN = '%%PMON-5-' + dev_type + '_PLUG_IN: %s is PRESENT.' + MSG_OUT = '%%PMON-5-' + dev_type + '_PLUG_OUT: %s is ABSENT.' + MSG_OK = '%%PMON-5-' + dev_type + '_OK: %s is OK.' + MSG_NOT_OK = '%%PMON-5-' + dev_type + '_FAILED: %s is NOT OK.' + MSG_ABSENT = '%%PMON-5-' + dev_type + '_ABSENT: %s is ABSENT.' + MSG_UNKNOWN = '%%PMON-5-' + dev_type + '_UNKNOWN: %s is UNKNOWN.%s' + MSG_RECOVER = '%%PMON-5-' + dev_type + '_OK: %s is OK. Recover from ' + dev_type + ' FAILED.' + + curStatus, log = self.getCurstatus() + pmon_debug("%s: current status %s" % (display_name, curStatus)) + pmon_debug("%s: pre status %s" % (display_name, self._preDevStatus)) + pmon_debug("%s: peroid_syslog %s" % (display_name, self._peroid_syslog)) + + if curStatus == STATUS_FAILED: + # get status failed + if self._peroid_failed_syslog is not None: + if getnochangedMsgFlag and time.time() - self._peroid_failed_syslog >= nochangedMsgTime: + # absent as before for some time, notice + dev_syslog(MSG_UNKNOWN % (display_name, log)) + self._peroid_failed_syslog = time.time() + else: # first time failed + dev_syslog(MSG_UNKNOWN % (display_name, log)) + self._peroid_failed_syslog = time.time() + return + self._peroid_failed_syslog = time.time() + + if self._preDevStatus is None: + # 1st time + if noprintFirstTimeFlag == 1: + self._peroid_syslog = time.time() + else: + if curStatus == STATUS_PRESENT: + # present + dev_syslog(MSG_IN % display_name) + elif curStatus == STATUS_OK: + # ok + dev_syslog(MSG_OK % display_name) + elif curStatus == STATUS_NOT_OK: + # not ok + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + else: + # absent + dev_syslog(MSG_ABSENT % display_name) + self._peroid_syslog = time.time() + else: + # from 2nd time... + if self._preDevStatus == curStatus: + # status not changed + if self._preDevStatus == STATUS_ABSENT: + if self._peroid_syslog is not None: + if getnochangedMsgFlag and time.time() - self._peroid_syslog >= nochangedMsgTime: + # absent as before for some time, notice + dev_syslog(MSG_ABSENT % display_name) + self._peroid_syslog = time.time() + elif self._preDevStatus == STATUS_NOT_OK: + if self._peroid_syslog is not None: + if getnochangedMsgFlag and time.time() - self._peroid_syslog >= nochangedMsgTime: + # not ok as before for some time, notice + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + else: + # status changed + if self._preDevStatus == STATUS_ABSENT: + if curStatus == STATUS_NOT_OK: + # absent -> not ok + dev_syslog(MSG_IN % display_name) + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + elif curStatus == STATUS_OK: + # absent -> ok + dev_syslog(MSG_IN % display_name) + dev_syslog(MSG_OK % display_name) + else: + # absent -> prsent + dev_syslog(MSG_IN % display_name) + + elif self._preDevStatus == STATUS_OK: + if curStatus == STATUS_NOT_OK: + # ok -> not ok + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + elif curStatus == STATUS_ABSENT: + # ok -> absent + dev_syslog(MSG_OUT % display_name) + self._peroid_syslog = time.time() + elif self._preDevStatus == STATUS_PRESENT: + # present -> absent + dev_syslog(MSG_OUT % display_name) + self._peroid_syslog = time.time() + else: # not ok + if curStatus == STATUS_OK: + # not ok -> ok + dev_syslog(MSG_RECOVER % display_name) + dev_syslog(MSG_OK % display_name) + else: + # not ok -> absent + dev_syslog(MSG_OUT % display_name) + self._peroid_syslog = time.time() + self._preDevStatus = curStatus + + +class checkSfp(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkSfp, self).__init__(path, dev_name, display_name, 'XCVR', config) + + def getPath(self): + super(checkSfp, self).getPath() + return self._path + + def getName(self): + super(checkSfp, self).getName() + return self._name + + def getType(self): + super(checkSfp, self).getType() + return self._type + + +class checkSlot(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkSlot, self).__init__(path, dev_name, display_name, 'SLOT', config) + + def getPath(self): + super(checkSlot, self).getPath() + return self._path + + def getName(self): + super(checkSlot, self).getName() + return self._name + + def getType(self): + super(checkSlot, self).getType() + return self._type + + +class checkPSU(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkPSU, self).__init__(path, dev_name, display_name, 'PSU', config) + + def getPath(self): + super(checkPSU, self).getPath() + return self._path + + def getName(self): + super(checkPSU, self).getName() + return self._name + + def getType(self): + super(checkPSU, self).getType() + return self._type + + +class checkFAN(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkFAN, self).__init__(path, dev_name, display_name, 'FAN', config) + + def getPath(self): + super(checkFAN, self).getPath() + return self._path + + def getName(self): + super(checkFAN, self).getName() + return self._name + + def getType(self): + super(checkFAN, self).getType() + return self._type + + +class platformSyslog(): + def __init__(self): + self.__sfp_checklist = [] + self.__fan_checklist = [] + self.__psu_checklist = [] + self.__slot_checklist = [] + self.__temp_checklist = [] + self.temps_peroid_syslog = {} + self.normal_status = 0 + self.warning_status = 1 + self.critical_status = 2 + self.poweron_flag = 0 + + self.pmon_syslog_config = PMON_SYSLOG_STATUS.copy() + self.__pollingtime = self.pmon_syslog_config.get('polling_time', 3) + + tmpconfig = self.pmon_syslog_config.get('sffs', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("sff location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + # explame:get eth1 from /sys_switch/transceiver/eth1/present + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkSfp(dev_path, dev_name, display_name, tmpconfig) + self.__sfp_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('fans', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("fan location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkFAN(dev_path, dev_name, display_name, tmpconfig) + self.__fan_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('psus', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("psu location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkPSU(dev_path, dev_name, display_name, tmpconfig) + self.__psu_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('slots', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("slot location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkSlot(dev_path, dev_name, display_name, tmpconfig) + self.__slot_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('temps', None) + if tmpconfig is not None: + self.__temp_checklist = tmpconfig.get('temps_list', []) + self.__temps_pollingseconds = tmpconfig.get('over_temps_polling_seconds', None) + + def checkTempStaus(self, temp_item): + temp_name = temp_item.get('name', None) + input_path = temp_item.get('input_path', None) + warning_temp = temp_item.get('warning', None) + critical_temp = temp_item.get('critical', None) + input_accuracy = temp_item.get('input_accuracy', None) + if temp_name is None or input_path is None or warning_temp is None or critical_temp is None: + dev_syslog('%%PMON-5-TEMP_NOTICE: get temperature config parament failed.') + return + try: + locations = glob.glob(input_path) + with open(locations[0], "r") as fd: + input_temp = fd.read() + input_temp = float(input_temp) / float(input_accuracy) + + if 'time' not in temp_item: + temp_item['time'] = time.time() + temp_item['status'] = self.normal_status + if float(input_temp) >= float(warning_temp): + if float(input_temp) >= float(critical_temp): + if time.time() - \ + temp_item['time'] >= self.__temps_pollingseconds or temp_item['status'] != self.critical_status: + dev_syslog('%%PMON-5-TEMP_HIGH: %s temperature %sC is larger than max critical threshold %sC.' + % (temp_name, input_temp, critical_temp)) + temp_item['status'] = self.critical_status + temp_item['time'] = time.time() + else: + if time.time() - \ + temp_item['time'] >= self.__temps_pollingseconds or temp_item['status'] != self.warning_status: + dev_syslog('%%PMON-5-TEMP_HIGH: %s temperature %sC is larger than max warning threshold %sC.' + % (temp_name, input_temp, warning_temp)) + temp_item['status'] = self.warning_status + temp_item['time'] = time.time() + else: + pmon_debug( + "%s temperature %sC is in range [%s, %s]" % + (temp_name, input_temp, warning_temp, critical_temp)) + temp_item['status'] = self.normal_status + temp_item['time'] = time.time() + except Exception as e: + dev_syslog('%%PMON-5-TEMP_NOTICE: Cannot get %s temperature. Exception log: %s' % (temp_name, str(e))) + return + + def sysfs_precondition_check(self, check_module, check_project): + try: + tmpconfig = self.pmon_syslog_config.get(check_module, None) + if tmpconfig is not None: + check_list = tmpconfig.get(check_project, []) + for check_item in check_list: + location = check_item.get("path", None) + ok_val = check_item.get("ok_val", None) + mask = check_item.get("mask", 0xff) + ok_val = ok_val & mask + locations = glob.glob(location) + for power_path in locations: + with open(power_path, "r") as fd: + retval = fd.read() + if int(retval) != ok_val: + return + self.poweron_flag = 1 + except Exception as e: + dev_syslog('%%PMON-5-TEMP_NOTICE: Cannot check power status. Exception log: %s' % str(e)) + return + + def updateSysDeviceStatus(self): + if self.poweron_flag == 1: + for dev in self.__sfp_checklist: + dev.checkStatus() + else: + self.sysfs_precondition_check('sffs', 'power') + + for dev in self.__fan_checklist: + dev.checkStatus() + for dev in self.__psu_checklist: + dev.checkStatus() + for dev in self.__slot_checklist: + dev.checkStatus() + for temp_item in self.__temp_checklist: + self.checkTempStaus(temp_item) + + def getPollingtime(self): + return self.__pollingtime + + def debug_init(self): + global debuglevel + try: + with open(PMON_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + def doWork(self): + try: + self.debug_init() + self.updateSysDeviceStatus() + except Exception as e: + MSG_EXCEPTION = '%%PMON-5-NOTICE: Exception happened! info:%s' % str(e) + pmon_error(MSG_EXCEPTION % traceback.format_exc()) + + +def run(): + platform = platformSyslog() + while True: + platform.doWork() + time.sleep(platform.getPollingtime()) + + +if __name__ == '__main__': + run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py deleted file mode 100755 index 0adad9d74659..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py +++ /dev/null @@ -1,1365 +0,0 @@ -# -*- coding: UTF-8 -*- -# ------------------------------------------------------------------------------- -# Name: Ragile python common module -# Purpose: called by other modules -# -# Author: support -# -# Created: 02/07/2018 -# Copyright: (c) rd 2018 -# ------------------------------------------------------------------------------- - -################################driver-load-adaption####################################################### -# need to export interface -################################################################################################### - -__all__ = [ - "fancontrol_loc", - "fancontrol_config_loc", - "GLOBALCONFIG", - "MONITOR_CONST", - "RAGILE_PART_NUMBER", - "RAGILE_LABEL_REVISION", - "RAGILE_ONIE_VERSION", - "RAGILE_MAC_SIZE", - "RAGILE_MANUF_NAME", - "RAGILE_MANUF_COUNTRY", - "RAGILE_VENDOR_NAME", - "RAGILE_DIAG_VERSION", - "RAGILE_SERVICE_TAG", - "DEV_LEDS", - "MEM_SLOTS", - "LOCAL_LED_CONTROL", - "FIRMWARE_TOOLS", - "STARTMODULE", - "i2ccheck_params", - "FANS_DEF", - "factest_module", - "MONITOR_TEMP_MIN", - "MONITOR_K", - "MONITOR_MAC_IN", - "MONITOR_DEFAULT_SPEED", - "MONITOR_MAX_SPEED", - "MONITOR_MIN_SPEED", - "MONITOR_MAC_ERROR_SPEED", - "MONITOR_FAN_TOTAL_NUM", - "MONITOR_MAC_UP_TEMP", - "MONITOR_MAC_LOWER_TEMP", - "MONITOR_MAC_MAX_TEMP", - "MONITOR_FALL_TEMP", - "MONITOR_MAC_WARNING_THRESHOLD", - "MONITOR_OUTTEMP_WARNING_THRESHOLD", - "MONITOR_BOARDTEMP_WARNING_THRESHOLD", - "MONITOR_CPUTEMP_WARNING_THRESHOLD", - "MONITOR_INTEMP_WARNING_THRESHOLD", - "MONITOR_MAC_CRITICAL_THRESHOLD", - "MONITOR_OUTTEMP_CRITICAL_THRESHOLD", - "MONITOR_BOARDTEMP_CRITICAL_THRESHOLD", - "MONITOR_CPUTEMP_CRITICAL_THRESHOLD", - "MONITOR_INTEMP_CRITICAL_THRESHOLD", - "MONITOR_CRITICAL_NUM", - "MONITOR_SHAKE_TIME", - "MONITOR_INTERVAL", - "MONITOR_MAC_SOURCE_SYSFS", - "MONITOR_MAC_SOURCE_PATH", - "MAC_AVS_PARAM", - "MAC_DEFAULT_PARAM", - "MONITOR_SYS_LED", - "MONITOR_SYS_FAN_LED", - "MONITOR_FANS_LED", - "MONITOR_SYS_PSU_LED", - "MONITOR_FAN_STATUS", - "MONITOR_PSU_STATUS", - "MONITOR_DEV_STATUS", - "MONITOR_DEV_STATUS_DECODE", - "DEV_MONITOR_PARAM", - "SLOT_MONITOR_PARAM", - "fanloc", - "PCA9548START", - "PCA9548BUSEND", - "RAGILE_CARDID", - "RAGILE_PRODUCTNAME", - "FAN_PROTECT", - "rg_eeprom", - "E2_LOC", - "E2_PROTECT", - "MAC_LED_RESET", - "INIT_PARAM", - "INIT_COMMAND", - "CPLDVERSIONS", - "DRIVERLISTS", - "DEVICE", - "E2TYPE", - "FRULISTS", - "fanlevel_6510", - "fanlevel_6520", - "fanlevel", - "TEMPIDCHANGE", - "FACTESTMODULE", - "item1", - "test_sys_reload_item", - "test_sys_item", - "test_temp_item", - "test_mem_item", - "test_hd_item", - "test_rtc_item", - "test_i2c_item", - "test_cpld_item", - "test_portframe_item", - "test_sysled_item", - "test_fan_item", - "test_power_item", - "test_usb_item", - "test_prbs_item", - "test_portbroadcast_item", - "test_debug_level", - "test_log_level", - "test_setmac", - "test_setrtc", - "log_level_critical", - "log_level_debug", - "log_level_error", - "log_level_info", - "log_level_notset", - "log_level_warning", - "test_e2_setmac_item", - "test_bmc_setmac_item", - "test_fan_setmac_item", - "alltest", - "looptest", - "diagtestall", - "menuList", - "TESTCASE", - "PCIe_DEV_LIST", - "PCIe_SPEED_ITEM", -] - -fancontrol_loc = "/usr/local/bin" -fancontrol_config_loc = "/usr/local/bin" - -GLOBALCONFIG = "GLOBALCONFIG" -MONITOR_CONST = "MONITOR_CONST" - -RAGILE_PART_NUMBER = "RJ000001" -RAGILE_LABEL_REVISION = "R01" -RAGILE_ONIE_VERSION = "2018.02" -RAGILE_MAC_SIZE = 3 -RAGILE_MANUF_NAME = "Ragile" -RAGILE_MANUF_COUNTRY = "CHN" -RAGILE_VENDOR_NAME = "Ragile" -RAGILE_DIAG_VERSION = "0.1.0.15" -RAGILE_SERVICE_TAG = "www.ragile.com" - -DEV_LEDS = {} -MEM_SLOTS = [] - -LOCAL_LED_CONTROL = {"CLOSE": {}, "OPEN": {}} - -FIRMWARE_TOOLS = {} -# start-up module -STARTMODULE = {"fancontrol": 1, "avscontrol": 1} - -i2ccheck_params = {"busend": "i2c-66", "retrytime": 6} - -################################################################################################### -##### fan board ID reference -################################################################################################### -FANS_DEF = { - 0x8100: "M6500-FAN-F", - 0x8101: "M6510-FAN-F", - 0x8102: "M6520-FAN-F", - 0x8103: "M6510-FAN-R", -} - -factest_module = { - "sysinfo_showfanmsg": 1, - "sysinfo_showPsumsg": 1, - "sysinfo_showrestfanmsg": 0, - "sysinfo_showrestpsumsg": 0, -} - -#################fan adjustment parameters ############################## -MONITOR_TEMP_MIN = 38 # temperature before speed-adjustment -MONITOR_K = 11 # adjustment algorithm -MONITOR_MAC_IN = 35 # temperature difference between mac and chip(backup) -MONITOR_DEFAULT_SPEED = 0x60 # default speed -MONITOR_MAX_SPEED = 0xFF # maximum speed -MONITOR_MIN_SPEED = 0x33 # minimum speed -MONITOR_MAC_ERROR_SPEED = 0xBB # MAC abnormal speed -MONITOR_FAN_TOTAL_NUM = 4 # 3+1 redundancy design, report to syslog if there is a error -MONITOR_MAC_UP_TEMP = 50 # MAC compared with inlet up -MONITOR_MAC_LOWER_TEMP = -50 # MAC compared with outlet down -MONITOR_MAC_MAX_TEMP = 100 # - -MONITOR_FALL_TEMP = 4 # adjustment reduced temperature -MONITOR_MAC_WARNING_THRESHOLD = 100 # 100 -MONITOR_OUTTEMP_WARNING_THRESHOLD = 85 -MONITOR_BOARDTEMP_WARNING_THRESHOLD = 85 -MONITOR_CPUTEMP_WARNING_THRESHOLD = 85 -MONITOR_INTEMP_WARNING_THRESHOLD = 70 # 70 - -MONITOR_MAC_CRITICAL_THRESHOLD = 105 # 105 -MONITOR_OUTTEMP_CRITICAL_THRESHOLD = 90 # 90 -MONITOR_BOARDTEMP_CRITICAL_THRESHOLD = 90 # 90 -MONITOR_CPUTEMP_CRITICAL_THRESHOLD = 100 # 100 -MONITOR_INTEMP_CRITICAL_THRESHOLD = 80 # 80 -MONITOR_CRITICAL_NUM = 3 # retry times -MONITOR_SHAKE_TIME = 20 # anti-shake times -MONITOR_INTERVAL = 60 - -# 1 get mac temperature from sysfs ,0 get mac temperature from bcmcmd -MONITOR_MAC_SOURCE_SYSFS = (0) -MONITOR_MAC_SOURCE_PATH = None # sysfs path - - -# default MAC AVS parameters -MAC_AVS_PARAM = { - 0x72: 0x0384, - 0x73: 0x037E, - 0x74: 0x0378, - 0x75: 0x0372, - 0x76: 0x036B, - 0x77: 0x0365, - 0x78: 0x035F, - 0x79: 0x0359, - 0x7A: 0x0352, - 0x7B: 0x034C, - 0x7C: 0x0346, - 0x7D: 0x0340, - 0x7E: 0x0339, - 0x7F: 0x0333, - 0x80: 0x032D, - 0x81: 0x0327, - 0x82: 0x0320, - 0x83: 0x031A, - 0x84: 0x0314, - 0x85: 0x030E, - 0x86: 0x0307, - 0x87: 0x0301, - 0x88: 0x02FB, - 0x89: 0x02F5, - 0x8A: 0x02EE, -} - -# default 6520 configuration -MAC_DEFAULT_PARAM = { - "type": 1, # type 1 represents default if out of range / 0 represents no voltage-adjustment if out of range - "default": 0x74, # should be used with type - "loopaddr": 0x00, # AVS loop address - "loop": 0x00, # AVS loop value - "open": 0x00, # diasble write-protection value - "close": 0x40, # enable write-protection value - "bus": 2, # AVSI2C bus address - "devno": 0x60, # AVS address - "addr": 0x21, # AVS voltage-adjustment address - "protectaddr": 0x10, # AVS write-protection address - "sdkreg": "DMU_PCU_OTP_CONFIG_8", # SDK register name - "sdktype": 1, # type 0 represents no shift operation / 1 represents shift operation - "macregloc": 24, # shift operation - "mask": 0xFF, # mask after shift -} - -MONITOR_SYS_LED = [ - {"bus": 2, "devno": 0x33, "addr": 0xB2, "yellow": 0x06, "red": 0x02, "green": 0x04}, - {"bus": 2, "devno": 0x32, "addr": 0x72, "yellow": 0x06, "red": 0x02, "green": 0x04}, -] - -MONITOR_SYS_FAN_LED = [ - {"bus": 2, "devno": 0x33, "addr": 0xB4, "yellow": 0x06, "red": 0x02, "green": 0x04}, -] - -MONITOR_FANS_LED = [ - {"bus": 2, "devno": 0x32, "addr": 0x23, "green": 0x09, "red": 0x0A}, - {"bus": 2, "devno": 0x32, "addr": 0x24, "green": 0x09, "red": 0x0A}, - {"bus": 2, "devno": 0x32, "addr": 0x25, "green": 0x09, "red": 0x0A}, - {"bus": 2, "devno": 0x32, "addr": 0x26, "green": 0x09, "red": 0x0A}, -] - - -MONITOR_SYS_PSU_LED = [ - {"bus": 2, "devno": 0x33, "addr": 0xB3, "yellow": 0x06, "red": 0x02, "green": 0x04}, -] - -MONITOR_FAN_STATUS = [ - {"status": "green", "minOkNum": 4, "maxOkNum": 4}, - {"status": "yellow", "minOkNum": 3, "maxOkNum": 3}, - {"status": "red", "minOkNum": 0, "maxOkNum": 2}, -] - -MONITOR_PSU_STATUS = [ - {"status": "green", "minOkNum": 2, "maxOkNum": 2}, - {"status": "yellow", "minOkNum": 1, "maxOkNum": 1}, - {"status": "red", "minOkNum": 0, "maxOkNum": 0}, -] - -MONITOR_DEV_STATUS = {} -MONITOR_DEV_STATUS_DECODE = {} -DEV_MONITOR_PARAM = {} -SLOT_MONITOR_PARAM = {} - - -fanloc = {"name": "fanset", "location": "0-0032/fan_speed_set"} -#####################MAC-Voltage-Adjustment-Parameters#################################### - - -####================================Adaption-Area================================ -#### RAGILE_COMMON common configuration head -#### “platform” specific configuration head -#### -PCA9548START = 11 -PCA9548BUSEND = 74 - -RAGILE_CARDID = 0x00004040 -RAGILE_PRODUCTNAME = "ragile_ra-b6510" - -FAN_PROTECT = {"bus": 0, "devno": 0x32, "addr": 0x19, "open": 0x00, "close": 0x0F} -rg_eeprom = "2-0057/eeprom" -E2_LOC = {"bus": 2, "devno": 0x57} -E2_PROTECT = {"bus": 2, "devno": 0x33, "addr": 0xB0, "open": 0, "close": 1} -MAC_LED_RESET = {"pcibus": 8, "slot": 0, "fn": 0, "bar": 0, "offset": 64, "reset": 0x98} - -INIT_PARAM = [ - {"loc": "1-0034/sfp_enable", "value": "01"}, - {"loc": "2-0035/sfp_enable2", "value": "ff"}, - {"loc": "2-0033/mac_led", "value": "ff"}, - {"loc": "1-0034/sfp_txdis1", "value": "00"}, - {"loc": "1-0034/sfp_txdis2", "value": "00"}, - {"loc": "1-0034/sfp_txdis3", "value": "00"}, - {"loc": "1-0036/sfp_txdis4", "value": "00"}, - {"loc": "1-0036/sfp_txdis5", "value": "00"}, - {"loc": "1-0036/sfp_txdis6", "value": "00"}, - {"loc": fanloc["location"], "value": "80"}, -] - -INIT_COMMAND = [] - -CPLDVERSIONS = [ - {"loc": "2-0033/cpld_version", "des": "MAC Board CPLDA"}, - {"loc": "2-0035/cpld_version", "des": "MAC Board CPLDB"}, - {"loc": "2-0037/cpld_version", "des": "CPU Board CPLD"}, -] - -## Driver List -## - -DRIVERLISTS = [] -DEVICE = [] -""" -DRIVERLISTS = [ - "i2c_dev", - "i2c_algo_bit", - "i2c_gpio", - "i2c_mux", - "i2c_mux_pca9641", - "i2c_mux_pca954x", # force_deselect_on_exit=1 - "eeprom", - "at24", - "ragile_platform", - "rg_cpld", - "rg_fan", - "rg_psu", - "csu550", - "rg_gpio_xeon", - #IPMIdriver - "ipmi_msghandler", - "ipmi_devintf", - "ipmi_si", -] - -DEVICE = [ - {"name":"pca9641","bus":0 ,"loc":0x10 }, - {"name":"pca9548","bus":2 ,"loc":0x70 }, - {"name":"lm75","bus": 2, "loc":0x48 }, - {"name":"lm75","bus": 2, "loc":0x49 }, - {"name":"lm75","bus": 2, "loc":0x4a }, - {"name":"24c02","bus":2 , "loc":0x57 }, - {"name":"rg_cpld","bus":2 ,"loc":0x33 }, - {"name":"rg_cpld","bus":2 ,"loc":0x35 }, - {"name":"rg_cpld","bus":2 ,"loc":0x37 }, - {"name":"pca9548","bus":1,"loc":0x70 }, - {"name":"pca9548","bus":1,"loc":0x71 }, - {"name":"pca9548","bus":1,"loc":0x72 }, - {"name":"pca9548","bus":1,"loc":0x73 }, - {"name":"pca9548","bus":1,"loc":0x74 }, - {"name":"pca9548","bus":1,"loc":0x75 }, - {"name":"pca9548","bus":1,"loc":0x76 }, - {"name":"pca9548","bus":1,"loc":0x77 }, - {"name":"rg_fan","bus":3,"loc":0x53 }, - {"name":"rg_fan","bus":4,"loc":0x53 }, - {"name":"rg_fan","bus":5,"loc":0x53 }, - #{"name":"rg_fan","bus":6,"loc":0x53 }, #specific fan - {"name":"rg_psu","bus":7 ,"loc":0x50 }, - {"name":"csu550","bus":7 ,"loc":0x58 }, - {"name":"rg_psu","bus":8 ,"loc":0x53 }, - {"name":"csu550","bus":8 ,"loc":0x5b }, -] -""" - -#####################FRU-Info-Adaption################################# -E2TYPE = { - "1": "tlveeprom", - "2": "x86cpueeprom", - "3": "bmceeprom", - "4": "cpueeprom", - "5": "maceeprom", - "6": "sloteeprom", - "7": "fanconnecteeprom", - "8": "M1HFANI-F", - "9": "M1HFANI-R", - "A": "M2HFANI-F", - "B": "M2HFANI-R", - "C": "psu", -} -FRULISTS = [] -################################Manufacturing-Test-Adaption-Area####################################################### -# need to export interface -fanlevel_6510 = { - "level": [51, 150, 255], - "low_speed": [500, 7500, 17000], - "high_speed": [11000, 22500, 28500], -} - -fanlevel_6520 = { - "level": [75, 150, 255], - "low_speed": [750, 4250, 6750], - "high_speed": [4500, 7500, 10000], -} - -fanlevel = fanlevel_6520 - -TEMPIDCHANGE = { - "lm75in": "inlet", - "lm75out": "outlet", - "lm75hot": "hot-point", - "inlet": "lm75in", - "outlet": "lm75out", - "hot-point": "lm75hot", -} - -# Manufacturing-Test module -FACTESTMODULE = {} - -##################################Manufacturing-Test-Menu -item1 = {"name": "Single Test", "deal": "test_signal", "childid": 1} -test_sys_reload_item = {"name": "reset-system", "deal": "test_sys_reload"} - -test_sys_item = {"name": "Product information test", "deal": "test_sysinfo"} -test_temp_item = {"name": "temperature test", "deal": "test_tempinfo"} -test_mem_item = {"name": "Memory test", "deal": "test_cpumemoryinfo"} -test_hd_item = {"name": "Hard disk test", "deal": "test_hard"} -test_rtc_item = {"name": "RTC test ", "deal": "test_rtc"} -test_i2c_item = {"name": "I2c test ", "deal": "test_i2c"} -test_cpld_item = {"name": "CPLD test", "deal": "test_cpld"} -test_portframe_item = { - "name": "Port transmit-receive frame test", - "deal": "test_portframe", -} -test_sysled_item = {"name": "System led test", "deal": "test_led"} -test_fan_item = {"name": "Fan status test", "deal": "test_fan"} -test_power_item = {"name": "PSU status test", "deal": "test_power"} -test_usb_item = {"name": "USB test", "deal": "test_usb"} -test_prbs_item = {"name": "PRBS test", "deal": "test_prbs"} -test_portbroadcast_item = {"name": "Port broadcast", "deal": "test_portbroadcast"} - -test_debug_level = {"name": "Change debug level", "deal": "test_setdebug"} -test_log_level = {"name": "Log output level", "deal": "test_loginfolevel"} -test_setmac = {"name": "setmac", "deal": "test_setmac"} -test_setrtc = {"name": "Set RTC", "deal": "test_set_rtc"} - -log_level_critical = {"name": "CRITICAL", "deal": "test_log_critical"} -log_level_debug = {"name": "DEBUG", "deal": "test_log_debug"} -log_level_error = {"name": "ERROR", "deal": "test_log_error"} -log_level_info = {"name": "INFO", "deal": "test_log_info"} -log_level_notset = {"name": "NOTSET", "deal": "test_log_notset"} -log_level_warning = {"name": "WARNING", "deal": "test_log_warning"} - - -test_e2_setmac_item = {"name": "E2SETMAC", "deal": "test_e2_setmac"} -test_bmc_setmac_item = {"name": "BMCSETMAC", "deal": "test_bmc_setmac"} -test_fan_setmac_item = {"name": "fan SETMAC", "deal": "test_fan_setmac"} - -alltest = [ - test_sys_item, - test_temp_item, - test_mem_item, - test_hd_item, - test_rtc_item, - test_i2c_item, - test_cpld_item, - test_portframe_item, - test_sysled_item, - test_fan_item, - test_power_item, - test_usb_item, - test_prbs_item, - test_portbroadcast_item, -] - -looptest = [ - test_sys_item, - test_temp_item, - test_mem_item, - test_hd_item, - test_rtc_item, - test_i2c_item, - test_cpld_item, - test_portframe_item, - test_fan_item, - test_power_item, - test_usb_item, - test_prbs_item, - test_portbroadcast_item, -] - -diagtestall = [] - -menuList = [ - { - "menuid": 0, - "value": [ - {"name": "Single test", "deal": "test_signal", "childid": 1}, - {"name": "All test", "deal": "test_all"}, - {"name": "Loop test", "deal": "test_loop"}, - # {"name":"Check loop-test result", "deal" :"test_loop_read"}, - # {"name":"Delete loop-test result", "deal" :"test_loop_delete"}, - # {"name":"Load configuration", "deal" :"test_config"}, - test_sys_reload_item, - {"name": "System Configuration", "deal": "test_sysconfig", "childid": 2}, - ], - }, - { - "menuid": 1, - "parentid": 0, - "value": [ - test_sys_item, - test_temp_item, - test_mem_item, - test_hd_item, - test_rtc_item, - test_i2c_item, - test_cpld_item, - test_portframe_item, - test_sysled_item, - test_fan_item, - test_power_item, - test_usb_item, - test_prbs_item, - test_portbroadcast_item, - ], - }, - { - "menuid": 2, - "parentid": 0, - "value": [test_debug_level, test_log_level, test_setmac, test_setrtc,], - }, - { - "menuid": 3, - "parentid": 2, - "value": [ - log_level_critical, - log_level_debug, - log_level_error, - log_level_info, - log_level_notset, - log_level_warning, - ], - }, - { - "menuid": 4, - "parentid": 2, - "value": [test_e2_setmac_item, test_bmc_setmac_item, test_fan_setmac_item,], - }, -] - - -TESTCASE = { - "CPLD": [ - { - "name": "CONNECT BOARD CPLD-A", - "cases": [ - {"name": "cpld32", "cmd": "grtd_test.py cpld_check 0 0x32 0xAA"}, - {"name": "cpld37", "cmd": "grtd_test.py cpld_check 2 0x37 0xAC"}, - ], - }, - { - "name": "MAC BOARD CPLD-A", - "cases": [ - {"name": "cpld33", "cmd": "grtd_test.py cpld_check 2 0x33 0xAB"}, - {"name": "cpld34", "cmd": "grtd_test.py cpld_check 1 0x34 0xAA"}, - ], - }, - { - "name": "MAC BOARD CPLD-B", - "cases": [ - {"name": "cpld36", "cmd": "grtd_test.py cpld_check 1 0x36 0xAA"}, - {"name": "cpld35", "cmd": "grtd_test.py cpld_check 2 0x35 0xAB"}, - ], - }, - ], - "TEMPERATURE": [ - { - "name": "-->temperature test", - "cases": [ - { - "name": "inlet", - "cmd": "grtd_test.py temp 2-0048/hwmon/hwmon1/temp1_input", - }, - { - "name": "outlet", - "cmd": "grtd_test.py temp 2-0049/hwmon/hwmon2/temp1_input", - }, - { - "name": "hot-point", - "cmd": "grtd_test.py temp 2-004a/hwmon/hwmon3/temp1_input", - }, - ], - } - ], - "MEMTORY": { - "cases": [ - {"name": "->memory test 1M", "cmd": "memtester 1M 1"}, - {"name": "->memory test 2M", "cmd": "memtester 2M 1"}, - {"name": "->memory test 8M", "cmd": "memtester 8M 1"}, - # {"name":"->memory test 16M","cmd":"memtester 16M 1"}, - # {"name":"->memory test 256M","cmd":"memtester 256M 1"}, - ] - }, - "SMARTCTLCMDS": { - "cases": [ - {"name": "->Check Hard Disk Info", "cmd": "smartctl -i /dev/sda"}, - {"name": "->Check Hard Disk Monitor Status", "cmd": "smartctl -H /dev/sda"}, - ] - }, - "LED": [ - { - "name": "Light Port Led test", - "cases": [ - { - "name": "-> Red Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_red,1-0034/sfp_led2_red,1-0034/sfp_led3_red,1-0034/sfp_led8_red,1-0036/sfp_led4_red,1-0036/sfp_led5_red,1-0036/sfp_led6_red,1-0036/sfp_led7_red 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - { - "name": "-> Red Led On", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_red,1-0034/sfp_led2_red,1-0034/sfp_led3_red,1-0034/sfp_led8_red,1-0036/sfp_led4_red,1-0036/sfp_led5_red,1-0036/sfp_led6_red,1-0036/sfp_led7_red 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff", - }, - { - "name": "-> Recovery Red Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_red,1-0034/sfp_led2_red,1-0034/sfp_led3_red,1-0034/sfp_led8_red,1-0036/sfp_led4_red,1-0036/sfp_led5_red,1-0036/sfp_led6_red,1-0036/sfp_led7_red 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - { - "name": "-> Yellow Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_yellow,1-0034/sfp_led2_yellow,1-0034/sfp_led3_yellow,1-0034/sfp_led8_yellow,1-0036/sfp_led4_yellow,1-0036/sfp_led5_yellow,1-0036/sfp_led6_yellow,1-0036/sfp_led7_yellow 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - { - "name": "-> Yellow Led On", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_yellow,1-0034/sfp_led2_yellow,1-0034/sfp_led3_yellow,1-0034/sfp_led8_yellow,1-0036/sfp_led4_yellow,1-0036/sfp_led5_yellow,1-0036/sfp_led6_yellow,1-0036/sfp_led7_yellow 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff", - }, - { - "name": "-> Recovery Yellow Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_yellow,1-0034/sfp_led2_yellow,1-0034/sfp_led3_yellow,1-0034/sfp_led8_yellow,1-0036/sfp_led4_yellow,1-0036/sfp_led5_yellow,1-0036/sfp_led6_yellow,1-0036/sfp_led7_yellow 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - ], - }, - { - "name": "fan 1 Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0b", - }, - { - "name": "-> Red Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0a", - }, - { - "name": "-> Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x09", - }, - { - "name": "-> Yellow Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x08", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0e", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0d", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0c", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x09", - }, - ], - }, - { - "name": "fan 2 Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0b", - }, - { - "name": "-> Red Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0a", - }, - { - "name": "-> Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x09", - }, - { - "name": "-> Yellow Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x08", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0e", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0d", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0c", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x09", - }, - ], - }, - { - "name": "fan 3 Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0b", - }, - { - "name": "-> Red Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0a", - }, - { - "name": "-> Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x09", - }, - { - "name": "-> Yellow Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x08", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0e", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0d", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0c", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x09", - }, - ], - }, - { - "name": "Front panel CPU Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x00", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x02", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x03", - }, - { - "name": "-> Green Led 1/4sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x11", - }, - { - "name": "-> Green Led 1/2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x21", - }, - { - "name": "-> Green Led 1sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x41", - }, - { - "name": "-> Green Led 2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x81", - }, - { - "name": "-> Red Led 1/4sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x12", - }, - { - "name": "-> Red Led 1/2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x22", - }, - { - "name": "-> Red Led 1sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x42", - }, - { - "name": "-> Red Led 2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x82", - }, - { - "name": "-> Yellow Led 1/4sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x13", - }, - { - "name": "-> Yellow Led 1/2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x23", - }, - { - "name": "-> Yellow Led 1sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x43", - }, - { - "name": "-> Yellow Led 2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x83", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x01", - }, - ], - }, - { - "name": "Front panel BMC Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x00", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x02", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x03", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x04", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x05", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x06", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x04", - }, - ], - }, - { - "name": "Front panel location Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_lct 0xff", - }, - { - "name": "-> LedOn", - "cmd": "grtd_test.py led loc 2-0035/broad_front_lct 0xfe", - }, - { - "name": "->Recovery LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_lct 0xff", - }, - ], - }, - { - "name": "Front panel pwr Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x00", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x02", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x03", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x04", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x05", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x06", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x04", - }, - ], - }, - { - "name": "Front panel fan Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x00", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x02", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x03", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x04", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x05", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x06", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x04", - }, - ], - }, - ], - "I2C": [ - ####type 1 represents value obtained compated with value - ####type 2 represents return True or False - { - "name": "I2C device test", - "cases": [ - { - "name": " PCA9641 test", - "cmd": "grtd_test.py dev_rd 0 10 0", - "deal_type": 2, - }, - { - "name": " cpld32 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld33 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld34 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld35 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld36 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld37 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " inlet LM75", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " outlet LM75", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " hot-point LM75", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " EEPROM", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " Port 1", - "cmd": "grtd_test.py dev_rd 11 0050 0", - "deal_type": 2, - }, - { - "name": " Port 2", - "cmd": "grtd_test.py dev_rd 12 0050 0", - "deal_type": 2, - }, - { - "name": " Port 3", - "cmd": "grtd_test.py dev_rd 13 0050 0", - "deal_type": 2, - }, - { - "name": " Port 4", - "cmd": "grtd_test.py dev_rd 14 0050 0", - "deal_type": 2, - }, - { - "name": " Port 5", - "cmd": "grtd_test.py dev_rd 15 0050 0", - "deal_type": 2, - }, - { - "name": " Port 6", - "cmd": "grtd_test.py dev_rd 16 0050 0", - "deal_type": 2, - }, - { - "name": " Port 7", - "cmd": "grtd_test.py dev_rd 17 0050 0", - "deal_type": 2, - }, - { - "name": " Port 8", - "cmd": "grtd_test.py dev_rd 18 0050 0", - "deal_type": 2, - }, - { - "name": " Port 9", - "cmd": "grtd_test.py dev_rd 19 0050 0", - "deal_type": 2, - }, - { - "name": " Port 10", - "cmd": "grtd_test.py dev_rd 20 0050 0", - "deal_type": 2, - }, - { - "name": " Port 11", - "cmd": "grtd_test.py dev_rd 21 0050 0", - "deal_type": 2, - }, - { - "name": " Port 12", - "cmd": "grtd_test.py dev_rd 22 0050 0", - "deal_type": 2, - }, - { - "name": " Port 13", - "cmd": "grtd_test.py dev_rd 23 0050 0", - "deal_type": 2, - }, - { - "name": " Port 14", - "cmd": "grtd_test.py dev_rd 24 0050 0", - "deal_type": 2, - }, - { - "name": " Port 15", - "cmd": "grtd_test.py dev_rd 25 0050 0", - "deal_type": 2, - }, - { - "name": " Port 16", - "cmd": "grtd_test.py dev_rd 26 0050 0", - "deal_type": 2, - }, - { - "name": " Port 17", - "cmd": "grtd_test.py dev_rd 27 0050 0", - "deal_type": 2, - }, - { - "name": " Port 18", - "cmd": "grtd_test.py dev_rd 28 0050 0", - "deal_type": 2, - }, - { - "name": " Port 19", - "cmd": "grtd_test.py dev_rd 29 0050 0", - "deal_type": 2, - }, - { - "name": " Port 20", - "cmd": "grtd_test.py dev_rd 30 0050 0", - "deal_type": 2, - }, - { - "name": " Port 21", - "cmd": "grtd_test.py dev_rd 31 0050 0", - "deal_type": 2, - }, - { - "name": " Port 22", - "cmd": "grtd_test.py dev_rd 32 0050 0", - "deal_type": 2, - }, - { - "name": " Port 23", - "cmd": "grtd_test.py dev_rd 33 0050 0", - "deal_type": 2, - }, - { - "name": " Port 24", - "cmd": "grtd_test.py dev_rd 34 0050 0", - "deal_type": 2, - }, - { - "name": " Port 25", - "cmd": "grtd_test.py dev_rd 35 0050 0", - "deal_type": 2, - }, - { - "name": " Port 26", - "cmd": "grtd_test.py dev_rd 36 0050 0", - "deal_type": 2, - }, - { - "name": " Port 27", - "cmd": "grtd_test.py dev_rd 37 0050 0", - "deal_type": 2, - }, - { - "name": " Port 28", - "cmd": "grtd_test.py dev_rd 38 0050 0", - "deal_type": 2, - }, - { - "name": " Port 29", - "cmd": "grtd_test.py dev_rd 39 0050 0", - "deal_type": 2, - }, - { - "name": " Port 30", - "cmd": "grtd_test.py dev_rd 40 0050 0", - "deal_type": 2, - }, - { - "name": " Port 31", - "cmd": "grtd_test.py dev_rd 41 0050 0", - "deal_type": 2, - }, - { - "name": " Port 32", - "cmd": "grtd_test.py dev_rd 42 0050 0", - "deal_type": 2, - }, - { - "name": " Port 33", - "cmd": "grtd_test.py dev_rd 43 0050 0", - "deal_type": 2, - }, - { - "name": " Port 34", - "cmd": "grtd_test.py dev_rd 44 0050 0", - "deal_type": 2, - }, - { - "name": " Port 35", - "cmd": "grtd_test.py dev_rd 45 0050 0", - "deal_type": 2, - }, - { - "name": " Port 36", - "cmd": "grtd_test.py dev_rd 46 0050 0", - "deal_type": 2, - }, - { - "name": " Port 37", - "cmd": "grtd_test.py dev_rd 47 0050 0", - "deal_type": 2, - }, - { - "name": " Port 38", - "cmd": "grtd_test.py dev_rd 48 0050 0", - "deal_type": 2, - }, - { - "name": " Port 39", - "cmd": "grtd_test.py dev_rd 49 0050 0", - "deal_type": 2, - }, - { - "name": " Port 40", - "cmd": "grtd_test.py dev_rd 50 0050 0", - "deal_type": 2, - }, - { - "name": " Port 41", - "cmd": "grtd_test.py dev_rd 51 0050 0", - "deal_type": 2, - }, - { - "name": " Port 42", - "cmd": "grtd_test.py dev_rd 52 0050 0", - "deal_type": 2, - }, - { - "name": " Port 43", - "cmd": "grtd_test.py dev_rd 53 0050 0", - "deal_type": 2, - }, - { - "name": " Port 44", - "cmd": "grtd_test.py dev_rd 54 0050 0", - "deal_type": 2, - }, - { - "name": " Port 45", - "cmd": "grtd_test.py dev_rd 55 0050 0", - "deal_type": 2, - }, - { - "name": " Port 46", - "cmd": "grtd_test.py dev_rd 56 0050 0", - "deal_type": 2, - }, - { - "name": " Port 47", - "cmd": "grtd_test.py dev_rd 57 0050 0", - "deal_type": 2, - }, - { - "name": " Port 48", - "cmd": "grtd_test.py dev_rd 58 0050 0", - "deal_type": 2, - }, - { - "name": " Port 49", - "cmd": "grtd_test.py dev_rd 59 0050 0", - "deal_type": 2, - }, - { - "name": " Port 50", - "cmd": "grtd_test.py dev_rd 60 0050 0", - "deal_type": 2, - }, - { - "name": " Port 51", - "cmd": "grtd_test.py dev_rd 61 0050 0", - "deal_type": 2, - }, - { - "name": " Port 52", - "cmd": "grtd_test.py dev_rd 62 0050 0", - "deal_type": 2, - }, - { - "name": " Port 53", - "cmd": "grtd_test.py dev_rd 63 0050 0", - "deal_type": 2, - }, - { - "name": " Port 54", - "cmd": "grtd_test.py dev_rd 64 0050 0", - "deal_type": 2, - }, - { - "name": " Port 55", - "cmd": "grtd_test.py dev_rd 65 0050 0", - "deal_type": 2, - }, - { - "name": " Port 56", - "cmd": "grtd_test.py dev_rd 66 0050 0", - "deal_type": 2, - }, - { - "name": " Port 57", - "cmd": "grtd_test.py dev_rd 67 0050 0", - "deal_type": 2, - }, - { - "name": " Port 58", - "cmd": "grtd_test.py dev_rd 68 0050 0", - "deal_type": 2, - }, - { - "name": " Port 59", - "cmd": "grtd_test.py dev_rd 69 0050 0", - "deal_type": 2, - }, - { - "name": " Port 60", - "cmd": "grtd_test.py dev_rd 70 0050 0", - "deal_type": 2, - }, - { - "name": " Port 61", - "cmd": "grtd_test.py dev_rd 71 0050 0", - "deal_type": 2, - }, - { - "name": " Port 62", - "cmd": "grtd_test.py dev_rd 72 0050 0", - "deal_type": 2, - }, - { - "name": " Port 63", - "cmd": "grtd_test.py dev_rd 73 0050 0", - "deal_type": 2, - }, - { - "name": " Port 64", - "cmd": "grtd_test.py dev_rd 74 0050 0", - "deal_type": 2, - }, - ], - }, - ], -} - -PCIe_DEV_LIST = [] -PCIe_SPEED_ITEM = [] - -################################Manufacturing-Test-Adaption-Area####################################################### diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py deleted file mode 100755 index 4a3a321d6e42..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: UTF-8 -*- -# ------------------------------------------------------------------------------- -# Name: ragileconfig.py -# Purpose: block the difference between various product/onie version for other module -# -# Author: rd -# -# Created: 02/07/2018 -# Copyright: (c) rd 2018 -# ------------------------------------------------------------------------------- -import sys -import os -from rgutil.baseutil import get_machine_info -from rgutil.baseutil import get_platform_info - -__all__ = [ - "getdeviceplatform", - "get_rjconfig_info", - "MONITOR_CONST", - "MAILBOX_DIR", - "DEVICE", - "GLOBALCONFIG", - "GLOBALINITPARAM", - "GLOBALINITCOMMAND", - "MAC_LED_RESET", - "STARTMODULE", - "fanloc", - "RAGILE_CARDID", - "RAGILE_PRODUCTNAME", - "RAGILE_PART_NUMBER", - "RAGILE_LABEL_REVISION", - "RAGILE_MAC_SIZE", - "RAGILE_MANUF_NAME", - "RAGILE_MANUF_COUNTRY", - "RAGILE_VENDOR_NAME", - "RAGILE_DIAG_VERSION", - "RAGILE_SERVICE_TAG", - "E2_PROTECT", - "E2_LOC", - "FAN_PROTECT", - "FANS_DEF", - "MONITOR_FANS_LED", - "MONITOR_SYS_FAN_LED", - "MONITOR_SYS_PSU_LED", - "MONITOR_FAN_STATUS", - "MONITOR_PSU_STATUS", - "MONITOR_DEV_STATUS", - "MONITOR_DEV_STATUS_DECODE", - "DEV_LEDS", - "MAC_AVS_PARAM", - "MAC_DEFAULT_PARAM", - "FRULISTS", - "rg_eeprom", - "i2ccheck_params", - "FANCTROLDEBUG", - "DEVMONITORDEBUG", -] - - -def getdeviceplatform(): - x = get_platform_info(get_machine_info()) - if x != None: - filepath = "/usr/share/sonic/device/" + x - return filepath - - -platform = get_platform_info(get_machine_info()) -platformpath = getdeviceplatform() -MAILBOX_DIR = "/sys/bus/i2c/devices/" -grtd_productfile = (platform + "_config").replace("-", "_") -common_productfile = "ragilecommon" -configfile_pre = "/usr/local/bin/" - -sys.path.append(platformpath) -sys.path.append(configfile_pre) - - -def get_rjconfig_info(attr_key): - rjconf_filename = platformpath + "/plugins" + "/rj.conf" - if not os.path.isfile(rjconf_filename): - return None - with open(rjconf_filename) as rjconf_file: - for line in rjconf_file: - tokens = line.split("=") - if len(tokens) < 2: - continue - if tokens[0] == attr_key: - return tokens[1].strip() - return None - - -#####BMC-Password### -OPENBMC_PASSWORD = get_rjconfig_info("OPENBMC_PASSWORD") -OPENBMC_PASSWORD = OPENBMC_PASSWORD if (OPENBMC_PASSWORD != None) else "0penBmc" - -############################################################################################ -## if there is no specific file, use common file -module_product = None -if os.path.exists(configfile_pre + grtd_productfile + ".py"): - module_product = __import__(grtd_productfile, globals(), locals(), [], 0) -elif os.path.exists(configfile_pre + common_productfile + ".py"): - module_product = __import__(common_productfile, globals(), locals(), [], 0) -else: - print("No Configuration existed, quit") - exit(-1) -############################################################################################ - -DEVICE = module_product.DEVICE - -##########Driver loading needs parameters -# get different product configuration -RAGILE_GLOBALCONFIG = { - "DRIVERLISTS": module_product.DRIVERLISTS, - "QSFP": { - "startbus": module_product.PCA9548START, - "endbus": module_product.PCA9548BUSEND, - }, - "DEVS": DEVICE, -} -GLOBALCONFIG = RAGILE_GLOBALCONFIG -GLOBALINITPARAM = module_product.INIT_PARAM -GLOBALINITCOMMAND = module_product.INIT_COMMAND - -fancontrol_loc = module_product.fancontrol_loc -fancontrol_config_loc = module_product.fancontrol_config_loc -MAC_LED_RESET = module_product.MAC_LED_RESET -###########Stat-up module parameters -STARTMODULE = module_product.STARTMODULE -FIRMWARE_TOOLS = module_product.FIRMWARE_TOOLS - - -##########Manufacturing-Test need parameters -FACTESTMODULE = module_product.FACTESTMODULE -TESTCASE = module_product.TESTCASE -menuList = module_product.menuList -alltest = module_product.alltest -diagtestall = module_product.diagtestall -looptest = module_product.looptest -fanloc = module_product.fanloc -fanlevel = module_product.fanlevel # fan adjustment level -TEMPIDCHANGE = module_product.TEMPIDCHANGE -CPLDVERSIONS = module_product.CPLDVERSIONS -RAGILE_CARDID = module_product.RAGILE_CARDID -RAGILE_PRODUCTNAME = module_product.RAGILE_PRODUCTNAME - -RAGILE_PART_NUMBER = module_product.RAGILE_PART_NUMBER -RAGILE_LABEL_REVISION = module_product.RAGILE_LABEL_REVISION -RAGILE_ONIE_VERSION = module_product.RAGILE_ONIE_VERSION -RAGILE_MAC_SIZE = module_product.RAGILE_MAC_SIZE -RAGILE_MANUF_NAME = module_product.RAGILE_MANUF_NAME -RAGILE_MANUF_COUNTRY = module_product.RAGILE_MANUF_COUNTRY -RAGILE_VENDOR_NAME = module_product.RAGILE_VENDOR_NAME -RAGILE_DIAG_VERSION = module_product.RAGILE_DIAG_VERSION -RAGILE_SERVICE_TAG = module_product.RAGILE_SERVICE_TAG - -E2_PROTECT = module_product.E2_PROTECT -E2_LOC = module_product.E2_LOC -FAN_PROTECT = module_product.FAN_PROTECT - -FANS_DEF = module_product.FANS_DEF -MONITOR_SYS_LED = module_product.MONITOR_SYS_LED -MONITOR_FANS_LED = module_product.MONITOR_FANS_LED -MONITOR_SYS_FAN_LED = module_product.MONITOR_SYS_FAN_LED -MONITOR_SYS_PSU_LED = module_product.MONITOR_SYS_PSU_LED -MONITOR_FAN_STATUS = module_product.MONITOR_FAN_STATUS -MONITOR_PSU_STATUS = module_product.MONITOR_PSU_STATUS -MONITOR_DEV_STATUS = module_product.MONITOR_DEV_STATUS -MONITOR_DEV_STATUS_DECODE = module_product.MONITOR_DEV_STATUS_DECODE -DEV_MONITOR_PARAM = module_product.DEV_MONITOR_PARAM -SLOT_MONITOR_PARAM = module_product.SLOT_MONITOR_PARAM - - -DEV_LEDS = module_product.DEV_LEDS -MEM_SLOTS = module_product.MEM_SLOTS - -MAC_AVS_PARAM = module_product.MAC_AVS_PARAM -MAC_DEFAULT_PARAM = module_product.MAC_DEFAULT_PARAM -E2TYPE = module_product.E2TYPE -FRULISTS = module_product.FRULISTS -rg_eeprom = "%d-%04x/eeprom" % (E2_LOC["bus"], E2_LOC["devno"]) -factest_module = module_product.factest_module - -LOCAL_LED_CONTROL = module_product.LOCAL_LED_CONTROL - -PCIe_DEV_LIST = module_product.PCIe_DEV_LIST -PCIe_SPEED_ITEM = module_product.PCIe_SPEED_ITEM -i2ccheck_params = module_product.i2ccheck_params - - -class MONITOR_CONST: - TEMP_MIN = module_product.MONITOR_TEMP_MIN - K = module_product.MONITOR_K - MAC_IN = module_product.MONITOR_MAC_IN - DEFAULT_SPEED = module_product.MONITOR_DEFAULT_SPEED - MAX_SPEED = module_product.MONITOR_MAX_SPEED - MIN_SPEED = module_product.MONITOR_MIN_SPEED - MAC_ERROR_SPEED = module_product.MONITOR_MAC_ERROR_SPEED - FAN_TOTAL_NUM = module_product.MONITOR_FAN_TOTAL_NUM - MAC_UP_TEMP = module_product.MONITOR_MAC_UP_TEMP - MAC_LOWER_TEMP = module_product.MONITOR_MAC_LOWER_TEMP - MAC_MAX_TEMP = module_product.MONITOR_MAC_MAX_TEMP - - MAC_WARNING_THRESHOLD = module_product.MONITOR_MAC_WARNING_THRESHOLD - OUTTEMP_WARNING_THRESHOLD = module_product.MONITOR_OUTTEMP_WARNING_THRESHOLD - BOARDTEMP_WARNING_THRESHOLD = module_product.MONITOR_BOARDTEMP_WARNING_THRESHOLD - CPUTEMP_WARNING_THRESHOLD = module_product.MONITOR_CPUTEMP_WARNING_THRESHOLD - INTEMP_WARNING_THRESHOLD = module_product.MONITOR_INTEMP_WARNING_THRESHOLD - - MAC_CRITICAL_THRESHOLD = module_product.MONITOR_MAC_CRITICAL_THRESHOLD - OUTTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_OUTTEMP_CRITICAL_THRESHOLD - BOARDTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_BOARDTEMP_CRITICAL_THRESHOLD - CPUTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_CPUTEMP_CRITICAL_THRESHOLD - INTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_INTEMP_CRITICAL_THRESHOLD - CRITICAL_NUM = module_product.MONITOR_CRITICAL_NUM - SHAKE_TIME = module_product.MONITOR_SHAKE_TIME - MONITOR_INTERVAL = module_product.MONITOR_INTERVAL - MONITOR_FALL_TEMP = module_product.MONITOR_FALL_TEMP - - MONITOR_MAC_SOURCE_SYSFS = module_product.MONITOR_MAC_SOURCE_SYSFS - MONITOR_MAC_SOURCE_PATH = module_product.MONITOR_MAC_SOURCE_PATH - - -FANCTROLDEBUG = 0 # 1 means enable -DEVMONITORDEBUG = 0 # 1 means enable diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py deleted file mode 100755 index 72ff74c2daa1..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py +++ /dev/null @@ -1,2099 +0,0 @@ -# -*- coding: UTF-8 -*- -# ------------------------------------------------------------------------- -# Name: ragileutil -# Purpose: common configuration and api -# -# Author: rd -# -# Created: 02/07/2018 -# Copyright: (c) rd 2018 -# ------------------------------------------------------------------------- -import sys -import os -import re -import syslog -import time -import binascii -import tty -import termios -import threading -import click -import mmap -from ragileconfig import ( - rg_eeprom, - FRULISTS, - MAC_DEFAULT_PARAM, - MAC_AVS_PARAM, - FANS_DEF, - FAN_PROTECT, - E2_LOC, - E2_PROTECT, - RAGILE_SERVICE_TAG, - RAGILE_DIAG_VERSION, - STARTMODULE, - RAGILE_CARDID, - RAGILE_PRODUCTNAME, - RAGILE_PART_NUMBER, - RAGILE_LABEL_REVISION, - RAGILE_MAC_SIZE, - RAGILE_MANUF_NAME, - RAGILE_MANUF_COUNTRY, - RAGILE_VENDOR_NAME, - MAILBOX_DIR, -) - -try: - from eepromutil.fru import ipmifru - from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe - -except Exception or SystemExit: - pass - -import logging.handlers -import shutil -import gzip -import glob - -__all__ = [ - "MENUID", - "MENUPARENT", - "MENUVALUE", - "CHILDID", - "MENUITEMNAME", - "MENUITEMDEAL", - "GOBACK", - "GOQUIT", - "file_name", - "CRITICAL", - "FATAL", - "ERROR", - "WARNING", - "WARN", - "INFO", - "DEBUG", - "NOTSET", - "levelNames", - "TLV_INFO_ID_STRING", - "TLV_INFO_VERSION", - "TLV_INFO_LENGTH", - "TLV_INFO_LENGTH_VALUE", - "TLV_CODE_PRODUCT_NAME", - "TLV_CODE_PART_NUMBER", - "TLV_CODE_SERIAL_NUMBER", - "TLV_CODE_MAC_BASE", - "TLV_CODE_MANUF_DATE", - "TLV_CODE_DEVICE_VERSION", - "TLV_CODE_LABEL_REVISION", - "TLV_CODE_PLATFORM_NAME", - "TLV_CODE_ONIE_VERSION", - "TLV_CODE_MAC_SIZE", - "TLV_CODE_MANUF_NAME", - "TLV_CODE_MANUF_COUNTRY", - "TLV_CODE_VENDOR_NAME", - "TLV_CODE_DIAG_VERSION", - "TLV_CODE_SERVICE_TAG", - "TLV_CODE_VENDOR_EXT", - "TLV_CODE_CRC_32", - "_TLV_DISPLAY_VENDOR_EXT", - "TLV_CODE_RJ_CARID", - "_TLV_INFO_HDR_LEN", - "SYSLOG_IDENTIFIER", - "log_info", - "log_debug", - "log_warning", - "log_error", - "CompressedRotatingFileHandler", - "SETMACException", - "checkinput", - "checkinputproduct", - "getInputSetmac", - "fan_tlv", - "AVSUTIL", - "I2CUTIL", - "BMC", - "getSdkReg", - "getfilevalue", - "get_sysfs_value", - "write_sysfs_value", - "RJPRINTERR", - "strtoint", - "inttostr", - "str_to_hex", - "hex_to_str", - "str_to_bin", - "bin_to_str", - "get_mac_temp", - "get_mac_temp_sysfs", - "restartDockerService", - "wait_dhcp", - "wait_sdk", - "wait_docker", - "getTLV_BODY", - "_crc32", - "printvalue", - "generate_value", - "getsyseeprombyId", - "fac_init_cardidcheck", - "isValidMac", - "util_setmac", - "getInputCheck", - "getrawch", - "upper_input", - "changeTypeValue", - "astrcmp", - "generate_ext", - "rgi2cget", - "rgi2cset", - "rgpcird", - "rgpciwr", - "rgsysset", - "rgi2cget_word", - "rgi2cset_word", - "fan_setmac", - "checkfansninput", - "checkfanhwinput", - "util_show_fanse2", - "get_fane2_sysfs", - "util_show_fane2", - "getPid", - "fac_fans_setmac_tlv", - "fac_fan_setmac_fru", - "fac_fans_setmac", - "fac_fan_setmac", - "writeToEEprom", - "get_local_eth0_mac", - "getonieversion", - "createbmcMac", - "fac_board_setmac", - "ipmi_set_mac", - "getInputValue", - "bmc_setmac", - "closeProtocol", - "checkSdkMem", - "getch", - "get_raw_input", - "getsysvalue", - "get_pmc_register", - "decoder", - "decode_eeprom", - "get_sys_eeprom", - "getCardId", - "getsysmeminfo", - "getsysmeminfo_detail", - "getDmiSysByType", - "gethwsys", - "getsysbios", - "searchDirByName", - "getUsbLocation", - "getusbinfo", - "get_cpu_info", - "get_version_config_info", - "io_rd", - "io_wr", -] - -MENUID = "menuid" -MENUPARENT = "parentid" -MENUVALUE = "value" -CHILDID = "childid" -MENUITEMNAME = "name" -MENUITEMDEAL = "deal" -GOBACK = "goBack" -GOQUIT = "quit" - -file_name = "/etc/init.d/opennsl-modules-3.16.0-5-amd64" -########################################################################## -# ERROR LOG LEVEL -########################################################################## -CRITICAL = 50 -FATAL = CRITICAL -ERROR = 40 -WARNING = 30 -WARN = WARNING -INFO = 20 -DEBUG = 10 -NOTSET = 0 - -levelNames = { - CRITICAL: "CRITICAL", - ERROR: "ERROR", - WARNING: "WARNING", - INFO: "INFO", - DEBUG: "DEBUG", - NOTSET: "NOTSET", - "CRITICAL": CRITICAL, - "ERROR": ERROR, - "WARN": WARNING, - "WARNING": WARNING, - "INFO": INFO, - "DEBUG": DEBUG, - "NOTSET": NOTSET, -} - -TLV_INFO_ID_STRING = "TlvInfo\x00" -TLV_INFO_VERSION = 0x01 -TLV_INFO_LENGTH = 0x00 -TLV_INFO_LENGTH_VALUE = 0xBA - -########################################################################## -# eeprom info -########################################################################## -TLV_CODE_PRODUCT_NAME = 0x21 -TLV_CODE_PART_NUMBER = 0x22 -TLV_CODE_SERIAL_NUMBER = 0x23 -TLV_CODE_MAC_BASE = 0x24 -TLV_CODE_MANUF_DATE = 0x25 -TLV_CODE_DEVICE_VERSION = 0x26 -TLV_CODE_LABEL_REVISION = 0x27 -TLV_CODE_PLATFORM_NAME = 0x28 -TLV_CODE_ONIE_VERSION = 0x29 -TLV_CODE_MAC_SIZE = 0x2A -TLV_CODE_MANUF_NAME = 0x2B -TLV_CODE_MANUF_COUNTRY = 0x2C -TLV_CODE_VENDOR_NAME = 0x2D -TLV_CODE_DIAG_VERSION = 0x2E -TLV_CODE_SERVICE_TAG = 0x2F -TLV_CODE_VENDOR_EXT = 0xFD -TLV_CODE_CRC_32 = 0xFE -_TLV_DISPLAY_VENDOR_EXT = 1 -TLV_CODE_RJ_CARID = 0x01 -_TLV_INFO_HDR_LEN = 11 - - -SYSLOG_IDENTIFIER = "UTILTOOL" - -# ========================== Syslog wrappers ========================== - - -def log_info(msg, also_print_to_console=False): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_INFO, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - - -def log_debug(msg, also_print_to_console=False): - try: - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_DEBUG, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - except Exception as e: - pass - - -def log_warning(msg, also_print_to_console=False): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_WARNING, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - - -def log_error(msg, also_print_to_console=False): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_ERR, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - - -class CompressedRotatingFileHandler(logging.handlers.RotatingFileHandler): - def doRollover(self): - """ - Do a rollover, as described in __init__(). - """ - if self.stream: - self.stream.close() - self.stream = None - if self.backupCount > 0: - for i in range(self.backupCount - 1, 0, -1): - sfn = "%s.%d.gz" % (self.baseFilename, i) - dfn = "%s.%d.gz" % (self.baseFilename, i + 1) - if os.path.exists(sfn): - if os.path.exists(dfn): - os.remove(dfn) - os.rename(sfn, dfn) - dfn = self.baseFilename + ".1.gz" - if os.path.exists(dfn): - os.remove(dfn) - # These two lines below are the only new lines. I commented out the os.rename(self.baseFilename, dfn) and - # replaced it with these two lines. - with open(self.baseFilename, "rb") as f_in, gzip.open(dfn, "wb") as f_out: - shutil.copyfileobj(f_in, f_out) - self.mode = "w" - self.stream = self._open() - - -class SETMACException(Exception): - def __init__(self, param="ERROR", errno="-1"): - err = "Setmac fail[%s]: %s" % (errno, param) - Exception.__init__(self, err) - self.param = param - self.errno = errno - - -def checkinput(b): - if b.isdigit() is False: - raise Exception("Ivalid Number") - if int(b) > 0xFF or int(b) < 0: - raise Exception("Out of area") - - -def checkinputproduct(b): - if b.isalnum() is False: - raise Exception("Invalid string") - - -def getInputSetmac(val): - bia = val.boardInfoArea - pia = val.productInfoArea - if bia is not None: - a = raw_input("[Board Card]Product Serial Number:") - if len(a) != 13: - raise Exception("Invalid Serial Number length") - checkinputproduct(a) - bia.boardSerialNumber = a - b = raw_input("[Board Card]Product Version:(from 1-255)") - checkinput(b) - b = "%0x" % int(b) - bia.boardextra1 = b.upper() - if pia is not None: - a = raw_input("[Product Area]Product Serial Number:") - if len(a) != 13: - raise Exception("Invalid Serial Number") - checkinputproduct(a) - pia.productSerialNumber = a - b = raw_input("[Product Area]Product Version:(from 1-255)") - checkinput(b) - b = "%0x" % int(b) - pia.productVersion = b.upper() - return val - - -class fan_tlv(object): - VERSION = 0x01 # E2PROM Version,start from 0x01 - FLAG = 0x7E # New E2PROM version flag is 0x7E - HW_VER = 0x01 # compose by master version and fixed version - TYPE = 0xF1 # hw type defination - TLV_LEN = 00 # data length (16bit) - _FAN_TLV_HDR_LEN = 6 - _FAN_TLV_CRC_LEN = 2 - - _FAN_TLV_TYPE_NAME = 0x02 - _FAN_TLV_TYPE_SN = 0x03 - _FAN_TLV_TYPE_HW_INFO = 0x05 - _FAN_TLV_TYPE_DEV_TYPE = 0x06 - - _fandecodetime = 0 - - @property - def dstatus(self): - return self._dstatus - - @property - def typename(self): - return self._typename - - @property - def typesn(self): - return self._typesn - - @property - def typehwinfo(self): - return self._typehwinfo - - @property - def typedevtype(self): - return self._typedevtype - - @property - def fanbus(self): - return self._fanbus - - @property - def fanloc(self): - return self._fanloc - - @property - def fandecodetime(self): - return self._fandecodetime - - def __init__(self): - self._typename = "" - self._typesn = "" - self._typehwinfo = "" - self._typedevtype = "" - self._dstatus = 0 - - def strtoarr(self, str): - s = [] - if str is not None: - for index in range(len(str)): - s.append(str[index]) - return s - - def generate_fan_value(self): - bin_buffer = [chr(0xFF)] * 256 - bin_buffer[0] = chr(self.VERSION) - bin_buffer[1] = chr(self.FLAG) - bin_buffer[2] = chr(self.HW_VER) - bin_buffer[3] = chr(self.TYPE) - - temp_t = "%08x" % self.typedevtype # handle devtype first - typedevtype_t = hex_to_str(temp_t) - total_len = ( - len(self.typename) - + len(self.typesn) - + len(self.typehwinfo) - + len(typedevtype_t) - + 8 - ) - - bin_buffer[4] = chr(total_len >> 8) - bin_buffer[5] = chr(total_len & 0x00FF) - - index_start = 6 - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_NAME) - bin_buffer[index_start + 1] = chr(len(self.typename)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(self.typename) - ] = self.strtoarr(self.typename) - index_start = index_start + 2 + len(self.typename) - - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_SN) - bin_buffer[index_start + 1] = chr(len(self.typesn)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(self.typesn) - ] = self.strtoarr(self.typesn) - index_start = index_start + 2 + len(self.typesn) - - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_HW_INFO) - bin_buffer[index_start + 1] = chr(len(self.typehwinfo)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(self.typehwinfo) - ] = self.strtoarr(self.typehwinfo) - index_start = index_start + 2 + len(self.typehwinfo) - - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_DEV_TYPE) - bin_buffer[index_start + 1] = chr(len(typedevtype_t)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(typedevtype_t) - ] = self.strtoarr(typedevtype_t) - index_start = index_start + 2 + len(typedevtype_t) - - crcs = fan_tlv.fancrc("".join(bin_buffer[0:index_start])) # check 2bytes - bin_buffer[index_start] = chr(crcs >> 8) - bin_buffer[index_start + 1] = chr(crcs & 0x00FF) - return bin_buffer - - def decode(self, e2): - ret = [] - self.VERSION = ord(e2[0]) - self.FLAG = ord(e2[1]) - self.HW_VER = ord(e2[2]) - self.TYPE = ord(e2[3]) - self.TLV_LEN = (ord(e2[4]) << 8) | ord(e2[5]) - - tlv_index = self._FAN_TLV_HDR_LEN - tlv_end = self._FAN_TLV_HDR_LEN + self.TLV_LEN - - # check checksum - if len(e2) < self._FAN_TLV_HDR_LEN + self.TLV_LEN + 2: - self._dstatus = -2 - return ret - sumcrc = fan_tlv.fancrc(e2[0 : self._FAN_TLV_HDR_LEN + self.TLV_LEN]) - readcrc = ord(e2[self._FAN_TLV_HDR_LEN + self.TLV_LEN]) << 8 | ord( - e2[self._FAN_TLV_HDR_LEN + self.TLV_LEN + 1] - ) - if sumcrc != readcrc: - self._dstatus = -1 - return ret - else: - self._dstatus = 0 - while (tlv_index + 2) < len(e2) and tlv_index < tlv_end: - s = self.decoder(e2[tlv_index : tlv_index + 2 + ord(e2[tlv_index + 1])]) - tlv_index += ord(e2[tlv_index + 1]) + 2 - ret.append(s) - - return ret - - @staticmethod - def fancrc(t): - sum = 0 - for index in range(len(t)): - sum += ord(t[index]) - return sum - - def decoder(self, t): - try: - name = "" - value = "" - if ord(t[0]) == self._FAN_TLV_TYPE_NAME: - name = "Product Name" - value = str(t[2 : 2 + ord(t[1])]) - self._typename = value - elif ord(t[0]) == self._FAN_TLV_TYPE_SN: - name = "serial Number" - value = str(t[2 : 2 + ord(t[1])]) - self._typesn = value - elif ord(t[0]) == self._FAN_TLV_TYPE_HW_INFO: - name = "hardware info" - value = str(t[2 : 2 + ord(t[1])]) - self._typehwinfo = value - elif ord(t[0]) == self._FAN_TLV_TYPE_DEV_TYPE: - name = "dev type" - value = str(t[2 : 2 + ord(t[1])]) - value = str_to_hex(value) - self._typedevtype = value - value = "0x08%x" % value - except Exception as e: - print(e) - return {"name": name, "code": ord(t[0]), "value": value} - - def __str__(self): - formatstr = ( - "VERSION : 0x%02x \n" - " FLAG : 0x%02x \n" - " HW_VER : 0x%02x \n" - " TYPE : 0x%02x \n" - "typename : %s \n" - "typesn : %s \n" - "typehwinfo : %s \n" - ) - return formatstr % ( - self.VERSION, - self.FLAG, - self.HW_VER, - self.TYPE, - self.typename, - self.typesn, - self.typehwinfo, - ) - - -class AVSUTIL: - @staticmethod - def mac_avs_chip(bus, devno, loc, open, close, loop, protectaddr, level, loopaddr): - # disable protection - rgi2cset(bus, devno, protectaddr, open) - rgi2cset(bus, devno, loopaddr, loop) - rgi2cset_word(bus, devno, loc, level) - ret, value = rgi2cget_word(bus, devno, loc) - if strtoint(value) == level: - ret = 0 - # enable protection - rgi2cset(bus, devno, protectaddr, close) - if ret == 0: - return True - return False - - @staticmethod - def macPressure_adj(macavs, avs_param, mac_def_param): - # check whether it within range - max_adj = max(avs_param.keys()) - min_adj = min(avs_param.keys()) - type = mac_def_param["type"] - level = 0 - if type == 0: - if macavs not in range(min_adj, max_adj + 1): - return False - else: - level = macavs - else: - if macavs not in range(min_adj, max_adj + 1): - level = mac_def_param["default"] - else: - level = macavs - ret = AVSUTIL.mac_avs_chip( - mac_def_param["bus"], - mac_def_param["devno"], - mac_def_param["addr"], - mac_def_param["open"], - mac_def_param["close"], - mac_def_param["loop"], - mac_def_param["protectaddr"], - avs_param[level], - mac_def_param["loopaddr"], - ) - return ret - - @staticmethod - def mac_adj(): - macavs = 0 - name = MAC_DEFAULT_PARAM["sdkreg"] - ret, status = getSdkReg(name) - if ret is False: - return False - status = strtoint(status) - # shift operation - if MAC_DEFAULT_PARAM["sdktype"] != 0: - status = (status >> MAC_DEFAULT_PARAM["macregloc"]) & MAC_DEFAULT_PARAM[ - "mask" - ] - macavs = status - ret = AVSUTIL.macPressure_adj(macavs, MAC_AVS_PARAM, MAC_DEFAULT_PARAM) - return ret - - -class I2CUTIL: - @staticmethod - def getvaluefromdevice(name): - ret = [] - for item in DEVICE: - if item["name"] == name: - ret.append(item) - return ret - - @staticmethod - def openFanE2Protect(): - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["open"], - ) - - @staticmethod - def closeFanE2Protect(): - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["close"], - ) - - @staticmethod - def writeToFanE2(bus, loc, rst_arr): - index = 0 - for item in rst_arr: - rgi2cset(bus, loc, index, ord(item)) - index += 1 - - @staticmethod - def writeToE2(bus, loc, rst_arr): - index = 0 - for item in rst_arr: - rgi2cset(bus, loc, index, ord(item)) - index += 1 - - @staticmethod - def getE2File(bus, loc): - return "/sys/bus/i2c/devices/%d-00%02x/eeprom" % (bus, loc) - - -class BMC: - _instance_lock = threading.Lock() - - def __init__(self): - pass - - def __new__(cls, *args, **kwargs): - if not hasattr(Singleton, "_instance"): - with Singleton._instance_lock: - if not hasattr(Singleton, "_instance"): - Singleton._instance = object.__new__(cls) - return Singleton._instance - - -# Internal interface - - -def getSdkReg(reg): - try: - cmd = ["bcmcmd", "-t", "1", 'getr '+str(reg)] - ret, result = getstatusoutput_noshell(cmd) - result_t = result.strip().replace("\r", "").replace("\n", "") - if ret != 0 or "Error:" in result_t: - return False, result - patt = r"%s.(.*):(.*)>drivshell" % reg - rt = re.findall(patt, result_t, re.S) - test = re.findall("=(.*)", rt[0][0])[0] - except Exception as e: - return False, "getsdk register error" - return True, test - - -def getfilevalue(location): - try: - with open(location, "r") as fd: - value = fd.read() - return True, value.strip() - except Exception as e: - return False, "error" - - -def get_sysfs_value(location): - pos_t = str(location) - name = get_pmc_register(pos_t) - return name - - -def write_sysfs_value(reg_name, value): - fileLoc = MAILBOX_DIR + reg_name - try: - if not os.path.isfile(fileLoc): - print(fileLoc, "not found !") - return False - with open(fileLoc, "w") as fd: - fd.write(value) - except Exception as error: - log_error("Unable to open " + fileLoc + "file !") - return False - return True - - -def RJPRINTERR(str): - print("\033[0;31m%s\033[0m" % str) - - -def strtoint(str): # convert Hex string to int such as "4040"/"0x4040"/"0X4040" = 16448 - value = 0 - rest_v = str.replace("0X", "").replace("0x", "") - for index in range(len(rest_v)): - print(rest_v[index]) - value |= int(rest_v[index], 16) << ((len(rest_v) - index - 1) * 4) - return value - - -def inttostr(vl, len): # convert int to string such as 0x3030 = 00 - if type(vl) != int: - raise Exception(" type error") - index = 0 - ret_t = "" - while index < len: - ret = 0xFF & (vl >> index * 8) - ret_t += chr(ret) - index += 1 - return ret_t - - -def str_to_hex(rest_v): - value = 0 - for index in range(len(rest_v)): - value |= ord(rest_v[index]) << ((len(rest_v) - index - 1) * 8) - return value - - -def hex_to_str(s): - len_t = len(s) - if len_t % 2 != 0: - return 0 - ret = "" - for t in range(0, int(len_t / 2)): - ret += chr(int(s[2 * t : 2 * t + 2], 16)) - return ret - - -def str_to_bin(s): - return " ".join([bin(ord(c)).replace("0b", "") for c in s]) - - -def bin_to_str(s): - return "".join([chr(i) for i in [int(b, 2) for b in s.split(" ")]]) - - -def get_mac_temp(): - result = {} - # wait_docker() - # exec twice, get the second result - getstatusoutput_noshell(["bcmcmd", "-t", "1", "show temp"]) - ret, log = getstatusoutput_noshell(["bcmcmd", "-t", "1", "show temp"]) - if ret: - return False, result - else: - # decode obtained info - logs = log.splitlines() - for line in logs: - if "average" in line: - b = re.findall(r"\d+.\d+", line) - result["average"] = b[0] - elif "maximum" in line: - b = re.findall(r"\d+.\d+", line) - result["maximum"] = b[0] - return True, result - - -def get_mac_temp_sysfs(mactempconf): - try: - temp = -1000000 - temp_list = [] - mac_temp_loc = mactempconf.get("loc", []) - mac_temp_flag = mactempconf.get("flag", None) - if mac_temp_flag is not None: # check mac temperature vaild flag - gettype = mac_temp_flag.get("gettype") - okbit = mac_temp_flag.get("okbit") - okval = mac_temp_flag.get("okval") - if gettype == "io": - io_addr = mac_temp_flag.get("io_addr") - val = io_rd(io_addr) - if val is None: - raise Exception("get mac_flag by io failed.") - else: - bus = mac_temp_flag.get("bus") - loc = mac_temp_flag.get("loc") - offset = mac_temp_flag.get("offset") - ind, val = rgi2cget(bus, loc, offset) - if ind is not True: - raise Exception("get mac_flag by i2c failed.") - val_t = (int(val, 16) & (1 << okbit)) >> okbit - if val_t != okval: - raise Exception("mac_flag invalid, val_t:%d." % val_t) - for loc in mac_temp_loc: - temp_s = get_sysfs_value(loc) - if isinstance(temp_s, str) and temp_s.startswith("ERR"): - raise Exception("get mac temp error. loc:%s" % loc) - temp_t = int(temp_s) - if temp_t == -1000000: - raise Exception("mac temp invalid.loc:%s" % loc) - temp_list.append(temp_t) - temp_list.sort(reverse=True) - temp = temp_list[0] - except Exception as e: - return False, temp - return True, temp - - -def restartDockerService(force=False): - container_name = [ - "database", - "snmp", - "syncd", - "swss", - "dhcp_relay", - "radv", - "teamd", - "pmon", - ] - ret, status = getstatusoutput_noshell(["docker", "ps"]) - if ret == 0: - for tmpname in container_name: - if tmpname not in status: - if force == True: - getstatusoutput_noshell(["docker", "restart", tmpname]) - else: - getstatusoutput_noshell(["systemctl", "restart", tmpname]) - - -def wait_dhcp(timeout): - time_cnt = 0 - while True: - try: - ret, status = getstatusoutput_noshell(["systemctl", "status", "dhcp_relay.service"]) - if (ret == 0 and "running" in status) or "SUCCESS" in status: - break - else: - sys.stdout.write(".") - sys.stdout.flush() - time_cnt = time_cnt + 1 - if time_cnt > timeout: - raise Exception("wait_dhcp timeout") - time.sleep(1) - except Exception as e: - return False - return True - - -def wait_sdk(sdk_fpath, timeout): - time_cnt = 0 - while True: - try: - if os.path.exists(sdk_fpath): - break - else: - sys.stdout.write(".") - sys.stdout.flush() - time_cnt = time_cnt + 1 - if time_cnt > timeout: - raise Exception("wait_sdk timeout") - time.sleep(1) - except Exception as e: - return False - return True - - -def wait_docker(need_restart=False, timeout=180): - sdkcheck_params = STARTMODULE.get("sdkcheck", {}) - if sdkcheck_params.get("checktype") == "file": # pass file check - sdk_fpath = sdkcheck_params.get("sdk_fpath") - return wait_sdk(sdk_fpath, timeout) - return wait_dhcp(timeout) - - -def getTLV_BODY(type, productname): - x = [] - temp_t = "" - if type == TLV_CODE_MAC_BASE: - arr = productname.split(":") - for tt in arr: - temp_t += chr(int(tt, 16)) - elif type == TLV_CODE_DEVICE_VERSION: - temp_t = chr(productname) - elif type == TLV_CODE_MAC_SIZE: - temp_t = chr(productname >> 8) + chr(productname & 0x00FF) - else: - temp_t = productname - x.append(chr(type)) - x.append(chr(len(temp_t))) - for i in temp_t: - x.append(i) - return x - - -def _crc32(v): - return "0x%08x" % ( - binascii.crc32(v) & 0xFFFFFFFF - ) # get 8 bytes of crc32 %x return hex - - -def printvalue(b): - index = 0 - for i in range(0, len(b)): - if index % 16 == 0: - print(" ") - print("%02x " % ord(b[i])) - index += 1 - print("\n") - - -def generate_value(_t): - ret = [] - for i in TLV_INFO_ID_STRING: - ret.append(i) - ret.append(chr(TLV_INFO_VERSION)) - ret.append(chr(TLV_INFO_LENGTH)) - ret.append(chr(TLV_INFO_LENGTH_VALUE)) - - total_len = 0 - for key in _t: - x = getTLV_BODY(key, _t[key]) - ret += x - total_len += len(x) - ret[10] = chr(total_len + 6) - - ret.append(chr(0xFE)) - ret.append(chr(0x04)) - s = _crc32("".join(ret)) - for t in range(0, 4): - ret.append(chr(int(s[2 * t + 2 : 2 * t + 4], 16))) - totallen = len(ret) - if totallen < 256: - for left_t in range(0, 256 - totallen): - ret.append(chr(0x00)) - return (ret, True) - - -def getsyseeprombyId(id): - ret = get_sys_eeprom() - for item in ret: - if item["code"] == id: - return item - return None - - -def fac_init_cardidcheck(): - rest = getsyseeprombyId(TLV_CODE_RJ_CARID) # check cardId same or not - if rest is None: - print("need to program write bin file") - return False - else: - rest_v = rest["value"] - value = strtoint(rest_v) - if value == RAGILE_CARDID: - log_debug("check card ID pass") - else: - log_debug("check card ID error") - return False - return True - - -def isValidMac(mac): - if re.match(r"^\s*([0-9a-fA-F]{2,2}:){5,5}[0-9a-fA-F]{2,2}\s*$", mac): - return True - return False - - -# Internet cardsetmac - - -def util_setmac(eth, mac): - rulefile = "/etc/udev/rules.d/70-persistent-net.rules" - if isValidMac(mac) is False: - return False, "MAC invaild" - cmd1 = ["ethtool", "-e", eth] - cmd2 = ["grep", "0x0010"] - cmd3 = ["awk", '{print \"0x\"$13$12$15$14}'] - ret, log = getstatusoutput_noshell_pipe(cmd1, cmd2, cmd3) - log_debug(log) - magic = "" - if ret == 0 and len(log): - magic = log - macs = mac.upper().split(":") - - # chage ETH0 to value after setmac - ifconfigcmd = ["ifconfig", "eth0", "hw", "ether", mac] - log_debug(ifconfigcmd) - ret, status = getstatusoutput_noshell(ifconfigcmd) - if ret: - raise SETMACException("software set Internet card MAC error") - index = 0 - for item in macs: - cmd = ["ethtool", "-E", eth, "magic", magic, "offset", str(offset), "value", "0x"+str(item)] - log_debug(cmd) - index += 1 - ret, log = getstatusoutput_noshell(cmd) - if ret != 0: - raise SETMACException("set hardware Internet card MAC error") - # get value after setting - cmd_t = ["ethtool", "-e", "eth0", "offset", "0", "length", "6"] - ret, log = getstatusoutput_noshell(cmd_t) - m = re.split(":", log)[-1].strip().upper() - mac_result = m.upper().split(" ") - - for ind, s in enumerate(macs): - if s != mac_result[ind]: - RJPRINTERR("MAC comparison error") - if os.path.exists(rulefile): - os.remove(rulefile) - print("MGMT MAC[%s]" % mac) - return True - - -def getInputCheck(tips): - str = raw_input(tips) - if ( - astrcmp(str, "y") - or astrcmp(str, "ye") - or astrcmp(str, "yes") - or astrcmp(str, "") - ): - return True - else: - return False - - -def getrawch(): - fd = sys.stdin.fileno() - old_settings = termios.tcgetattr(fd) - try: - tty.setraw(sys.stdin.fileno()) - ch = sys.stdin.read(1) - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - return ch - - -def upper_input(tips): - sys.stdout.write(tips) - sys.stdout.flush() - passwd = [] - while True: - ch = getrawch().upper() - if ch == "\r" or ch == "\n": - return "".join(passwd) - elif ch == "\b" or ord(ch) == 127: - if passwd: - del passwd[-1] - sys.stdout.write("\b \b") - else: - sys.stdout.write(ch) - passwd.append(ch) - - -def changeTypeValue(_value, type1, tips, example): - if type1 == TLV_CODE_PRODUCT_NAME: - while True: - print( - "please check (1)air from forward to backward/(2)air from backward to forward:" - ) - option = raw_input() - if option == "1": - _value[type1] = example + "-F-RJ" - print( - "check Product is air from forward to backward device,Product Name:%s" - % _value[type1] - ) - break - elif option == "2": - _value[type1] = example + "-R-RJ" - print( - "check Product is air from backward to forward device,Product Name:%s" - % _value[type1] - ) - break - else: - print("input incorrect, check please") - return True - print("Please input[%s]such as(%s):" % (tips, example)) - name = upper_input("") - if type1 == TLV_CODE_MAC_BASE: - if len(name) != 12: - raise SETMACException("MAC address length incorrect, check please") - release_mac = "" - for i in range(int(len(name) / 2)): - if i == 0: - release_mac += name[i * 2 : i * 2 + 2] - else: - release_mac += ":" + name[i * 2 : i * 2 + 2] - if isValidMac(release_mac) is True: - _value[type1] = release_mac - else: - raise SETMACException("MAC address invaild, check please") - elif type1 == TLV_CODE_DEVICE_VERSION: - if name.isdigit(): - _value[type1] = int(name) - else: - raise SETMACException("Version is not number, check please") - elif type1 == TLV_CODE_MAC_SIZE: - if name.isdigit(): - _value[type1] = int(name, 16) - else: - raise SETMACException("Version is not number, check please") - elif type1 == TLV_CODE_SERIAL_NUMBER: - if name.isalnum() is False: - raise SETMACException("Serial Number invaild string, check please") - elif len(name) != 13: - raise SETMACException("Serial Number length incorrect, check please") - else: - _value[type1] = name - elif type1 == TLV_CODE_VENDOR_EXT: - _value[type1] = name - else: - _value[type1] = name - return True - - -def astrcmp(str1, str2): - return str1.lower() == str2.lower() - - -def generate_ext(cardid): - s = "%08x" % cardid - ret = "" - for t in range(0, 4): - ret += chr(int(s[2 * t : 2 * t + 2], 16)) - ret = chr(0x01) + chr(len(ret)) + ret - return ret - - -def rgi2cget(bus, devno, address): - command_line = ["i2cget", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address] - retrytime = 6 - ret_t = "" - for i in range(retrytime): - ret, ret_t = getstatusoutput_noshell(command_line) - if ret == 0: - return True, ret_t - time.sleep(0.1) - return False, ret_t - - -def rgi2cset(bus, devno, address, byte): - command_line = ["i2cset", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address, "0x%02x"%byte] - retrytime = 6 - ret_t = "" - for i in range(retrytime): - ret, ret_t = getstatusoutput_noshell(command_line) - if ret == 0: - return True, ret_t - return False, ret_t - - -def rgpcird(pcibus, slot, fn, bar, offset): - """read pci register""" - if offset % 4 != 0: - return - filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % ( - int(pcibus), - int(slot), - int(fn), - int(bar), - ) - file = open(filename, "r+") - size = os.path.getsize(filename) - data = mmap.mmap(file.fileno(), size) - result = data[offset : offset + 4] - s = result[::-1] - val = 0 - for i in range(0, len(s)): - val = val << 8 | s[i] - return "0x%08x" % val - - -def rgpciwr(pcibus, slot, fn, bar, offset, data): - """write pci register""" - ret = inttostr(data, 4) - ret = str.encode(ret) - ret = ret.strip(b'\xc2') - filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % ( - int(pcibus), - int(slot), - int(fn), - int(bar), - ) - file = open(filename, "r+") - size = os.path.getsize(filename) - data = mmap.mmap(file.fileno(), size) - data[offset : offset + 4] = ret - result = data[offset : offset + 4] - s = result[::-1] - val = 0 - for i in range(0, len(s)): - val = val << 8 | s[i] - data.close() - - -def rgsysset(location, value): - retrytime = 6 - for i in range(retrytime): - try: - with open(location, 'w') as f: - f.write('0x%02x\n' % value) - except (IOError, FileNotFoundError) as e: - return False, str(e) - return True, '' - - -def rgi2cget_word(bus, devno, address): - command_line = ["i2cget", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address, 'w'] - retrytime = 3 - ret_t = "" - for i in range(retrytime): - ret, ret_t = getstatusoutput_noshell(command_line) - if ret == 0: - return True, ret_t - return False, ret_t - - -def rgi2cset_word(bus, devno, address, byte): - command_line = ["i2cset", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address, "0x%02x"%byte, 'w'] - getstatusoutput_noshell(command_line) - - -def fan_setmac(): - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["open"], - ) - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["close"], - ) - - -def checkfansninput(fan_sn, fansntemp): - if fan_sn in fansntemp: - RJPRINTERR("exist same Serial Number,please input again") - return False - if len(fan_sn) != 13: - RJPRINTERR("Serial Number length incorrect,please input again") - return False - return True - - -# check hw version -def checkfanhwinput(hw): - if len(hw) != 4: - RJPRINTERR("hardware version length incorrect, please input again") - return False - if hw.find(".") != 1: - RJPRINTERR("hardware version incorrect, please input again") - return False - return True - - -def util_show_fanse2(fans): - formatstr = "%-8s %-20s %-20s %-20s %-20s" - print(formatstr % ("id", "Name", "hardware version", "Serial Number", "Time")) - print( - formatstr - % ("------", "---------------", "---------------", "---------------", "----") - ) - for fan in fans: - # print fan.dstatus - if fan.dstatus < 0: - print("%-8s" % ("FAN%d" % (fans.index(fan) + 1))) - RJPRINTERR(" decode e2 error") - else: - print( - formatstr - % ( - "FAN%d" % (fans.index(fan) + 1), - fan.typename.replace(chr(0x00), ""), - fan.typehwinfo.replace(chr(0x00), ""), - fan.typesn.replace(chr(0x00), ""), - fan.fandecodetime, - ) - ) - - -def get_fane2_sysfs(bus, loc): - rg_fan_e2 = "%d-%04x/fan" % (bus, loc) - eeprom = get_sysfs_value(rg_fan_e2) - return eeprom - - -def util_show_fane2(): - ret = sorted(I2CUTIL.getvaluefromdevice("rg_fan")) - if len(ret) <= 0: - return None - fans = [] - for index in range(len(ret)): - t1 = int(round(time.time() * 1000)) - eeprom = get_fane2_sysfs(ret[index]["bus"], ret[index]["loc"]) - t2 = int(round(time.time() * 1000)) - fane2 = fan_tlv() - fane2.fandecodetime = t2 - t1 - fane2.decode(eeprom) - fans.append(fane2) - util_show_fanse2(fans) - - -def getPid(name): - ret = [] - for dirname in os.listdir("/proc"): - if dirname == "curproc": - continue - try: - with open("/proc/{}/cmdline".format(dirname), mode="rb") as fd: - content = fd.read() - except Exception: - continue - if name in content: - ret.append(dirname) - return ret - - -def fac_fans_setmac_tlv(ret): - if len(ret) <= 0: - return None - fans = [] - fansntemp = [] - for index in range(len(ret)): - item = ret[index] - log_debug(item) - eeprom = get_fane2_sysfs(item["bus"], item["loc"]) - fane2 = fan_tlv() - fane2.decode(eeprom) - fane2.fanbus = item["bus"] - fane2.fanloc = item["loc"] - log_debug("decode eeprom success") - - print("Fan[%d]-[%s]setmac" % ((index + 1), FANS_DEF[fane2.typedevtype])) - while True: - print("Please input[%s]:" % "Serial Number") - fan_sn = raw_input() - if checkfansninput(fan_sn, fansntemp) is False: - continue - fansntemp.append(fan_sn) - fan_sn = fan_sn + chr(0x00) - fane2.typesn = fan_sn + chr(0x00) - break - while True: - print("Please input[%s]:" % "hardware version") - hwinfo = raw_input() - if checkfanhwinput(hwinfo) is False: - continue - fan_hwinfo = hwinfo + chr(0x00) - fane2.typehwinfo = fan_hwinfo + chr(0x00) - break - log_debug(fane2.typedevtype) - fane2.typename = FANS_DEF[fane2.typedevtype] + chr(0x00) - fans.append(fane2) - print("\n") - print("\n*******************************\n") - - util_show_fanse2(fans) - if getInputCheck("check input correctly or not(Yes/No):") is True: - for fan in fans: - log_debug("ouput fan") - fac_fan_setmac(fan) - else: - print("setmac quit") - return False - - -def fac_fan_setmac_fru(ret): - fans = FRULISTS.get("fans") - - fanfrus = {} - newfrus = {} - - # getmsg - try: - for fan in fans: - print("===============%s ================getmessage" % fan.get("name")) - eeprom = getsysvalue(I2CUTIL.getE2File(fan.get("bus"), fan.get("loc"))) - fru = ipmifru() - fru.decodeBin(eeprom) - fanfrus[fan.get("name")] = fru - except Exception as e: - print(str(e)) - return False - - # setmsg - for fan in fans: - print("===============%s ================setmac" % fan.get("name")) - fruold = fanfrus.get(fan.get("name")) - newfru = getInputSetmac(fruold) - newfru.recalcute() - newfrus[fan.get("name")] = newfru - # writemsg - for fan in fans: - print("===============%s ================writeToE2" % fan.get("name")) - ret_t = newfrus.get(fan.get("name")) - I2CUTIL.openFanE2Protect() - I2CUTIL.writeToFanE2(fan.get("bus"), fan.get("loc"), ret_t.bindata) - I2CUTIL.closeFanE2Protect() - # check - try: - for fan in fans: - print("===============%s ================getmessage" % fan.get("name")) - eeprom = getsysvalue(I2CUTIL.getE2File(fan.get("bus"), fan.get("loc"))) - fru = ipmifru() - fru.decodeBin(eeprom) - except Exception as e: - print(str(e)) - return False - return True - - -def fac_fans_setmac(): - ret = I2CUTIL.getvaluefromdevice("rg_fan") - if ret is not None and len(ret) > 0: - return fac_fans_setmac_tlv(ret) - fans = FRULISTS.get("fans", None) - if fans is not None and len(fans) > 0: - return fac_fan_setmac_fru(ret) - return False - - -def fac_fan_setmac(item): - I2CUTIL.openFanE2Protect() - I2CUTIL.writeToFanE2(item.fanbus, item.fanloc, item.generate_fan_value()) - I2CUTIL.closeFanE2Protect() - - -def writeToEEprom(rst_arr): - dealtype = E2_PROTECT.get("gettype", None) - if dealtype is None: - rgi2cset( - E2_PROTECT["bus"], - E2_PROTECT["devno"], - E2_PROTECT["addr"], - E2_PROTECT["open"], - ) - elif dealtype == "io": - io_wr(E2_PROTECT["io_addr"], E2_PROTECT["open"]) - index = 0 - for item in rst_arr: - rgi2cset(E2_LOC["bus"], E2_LOC["devno"], index, ord(item)) - index += 1 - - if dealtype is None: - rgi2cset( - E2_PROTECT["bus"], - E2_PROTECT["devno"], - E2_PROTECT["addr"], - E2_PROTECT["close"], - ) - elif dealtype == "io": - io_wr(E2_PROTECT["io_addr"], E2_PROTECT["close"]) - # deal last drivers - subprocess.call(["rmmod", "at24"]) - subprocess.call(["modprobe", "at24"]) - subprocess.call(["rm", "-f", "/var/cache/sonic/decode-syseeprom/syseeprom_cache"]) - - -def get_local_eth0_mac(): - cmd1 = ["ifconfig", "eth0"] - cmd2 = ["grep", "HWaddr"] - print(getstatusoutput_noshell_pipe(cmd1, cmd2)) - - -def getonieversion(): - if not os.path.isfile("/host/machine.conf"): - return "" - machine_vars = {} - with open("/host/machine.conf") as machine_file: - for line in machine_file: - tokens = line.split("=") - if len(tokens) < 2: - continue - machine_vars[tokens[0]] = tokens[1].strip() - return machine_vars.get("onie_version") - - -def createbmcMac(cpumac, num=2): - bcmvalue = strtoint(cpumac[cpumac.rindex(":") + 1 : len(cpumac)]) + num - # bmcmac = - t = cpumac.split(":") - t[5] = "%02x" % bcmvalue - bmcmac = ":".join(t) - return bmcmac.upper() - - -def fac_board_setmac(): - _value = {} - # default value - _value[TLV_CODE_VENDOR_EXT] = generate_ext(RAGILE_CARDID) # generate id - _value[TLV_CODE_PRODUCT_NAME] = RAGILE_PRODUCTNAME - _value[TLV_CODE_PART_NUMBER] = RAGILE_PART_NUMBER - _value[TLV_CODE_LABEL_REVISION] = RAGILE_LABEL_REVISION - _value[TLV_CODE_PLATFORM_NAME] = platform - _value[TLV_CODE_ONIE_VERSION] = getonieversion() - _value[TLV_CODE_MAC_SIZE] = RAGILE_MAC_SIZE - _value[TLV_CODE_MANUF_NAME] = RAGILE_MANUF_NAME - _value[TLV_CODE_MANUF_COUNTRY] = RAGILE_MANUF_COUNTRY - _value[TLV_CODE_VENDOR_NAME] = RAGILE_VENDOR_NAME - _value[TLV_CODE_DIAG_VERSION] = RAGILE_DIAG_VERSION - _value[TLV_CODE_SERVICE_TAG] = RAGILE_SERVICE_TAG - try: - if 0x00004052 == RAGILE_CARDID: - _value[TLV_CODE_PRODUCT_NAME] = RAGILE_PRODUCTNAME + "-RJ" - elif 0x00004051 == RAGILE_CARDID or 0x00004050 == RAGILE_CARDID: - changeTypeValue( - _value, TLV_CODE_PRODUCT_NAME, "Product name", RAGILE_PRODUCTNAME - ) - - changeTypeValue( - _value, TLV_CODE_SERIAL_NUMBER, "SN", "0000000000000" - ) # add serial number - changeTypeValue( - _value, TLV_CODE_DEVICE_VERSION, "hardware version", "101" - ) # hardware version - changeTypeValue( - _value, TLV_CODE_MAC_BASE, "MAC address", "58696cfb2108" - ) # MAC address - _value[TLV_CODE_MANUF_DATE] = time.strftime( - "%m/%d/%Y %H:%M:%S", time.localtime() - ) # add setmac time - rst, ret = generate_value(_value) - if ( - util_setmac("eth0", _value[TLV_CODE_MAC_BASE]) is True - ): # set Internet cardIP - writeToEEprom(rst) # write to e2 - # set BMC MAC - if "bmcsetmac" in FACTESTMODULE and FACTESTMODULE["bmcsetmac"] == 1: - bmcmac = createbmcMac(_value[TLV_CODE_MAC_BASE]) - if ipmi_set_mac(bmcmac) is True: - print("BMC MAC[%s]" % bmcmac) - else: - print("SET BMC MAC FAILED") - return False - else: - return False - except SETMACException as e: - # print(e) - RJPRINTERR("\n\n%s\n\n" % e) - return False - except ValueError as e: - return False - return True - - -def ipmi_set_mac(mac): - macs = mac.split(":") - cmdinit = ["ipmitool", "raw", "0x0c", "0x01", "0x01", "0xc2", "0x00"] - cmdset = ["ipmitool", "raw", "0x0c", "0x01", "0x01", "0x05"] - for ind in range(len(macs)): - cmdset.append("0x%02x" % int(macs[ind], 16)) - getstatusoutput_noshell(cmdinit) - ret, status = getstatusoutput_noshell(cmdset) - if ret: - RJPRINTERR("\n\n%s\n\n" % status) - return False - return True - - -def getInputValue(title, tips): - print("Please input[%s]such as(%s):" % (title, tips)) - name = raw_input() - - return name - - -def bmc_setmac(): - tips = "BMC MAC" - print("Please input value you want to change[%s]:" % tips) - name = raw_input() - if len(name) != 12: - RJPRINTERR("\nMAC address invaild, try again\n") - return False - release_mac = "" - for i in range(int(len(name) / 2)): - if i == 0: - release_mac += name[i * 2 : i * 2 + 2] - else: - release_mac += ":" + name[i * 2 : i * 2 + 2] - if isValidMac(release_mac) is True: - if ipmi_set_mac(release_mac) is True: - return True - else: - RJPRINTERR("\nMAC address invaild, try again\n") - return False - - -def closeProtocol(): - # disable LLDP - log_info("disable LLDP") - sys.stdout.write(".") - sys.stdout.flush() - getstatusoutput_noshell(["systemctl", "stop", "lldp.service"]) - log_info("disable lldp service") - sys.stdout.write(".") - sys.stdout.flush() - getstatusoutput_noshell(["systemctl", "stop", "bgp.service"]) - log_info("disable bgp service") - sys.stdout.write(".") - sys.stdout.flush() - # ret, status = os_system('bcmcmd "port ce,xe stp=disable"') - - -# check SDK memory must be 256M - - -def checkSdkMem(): - ind = 0 - file_data = "" - with open(file_name, "r") as f: - for line in f: - if "dmasize=16M" in line: - line = line.replace("dmasize=16M", "dmasize=256M") - ind = -1 - file_data += line - if ind == 0: - return - with open(file_name, "w") as f: - f.write(file_data) - print("change SDK memory to 256, reboot required") - getstatusoutput_noshell(["sync"]) - getstatusoutput_noshell(["reboot"]) - - -########################################################################## -# receives a character setting -########################################################################## - - -def getch(msg): - ret = "" - fd = sys.stdin.fileno() - old_ttyinfo = termios.tcgetattr(fd) - new_ttyinfo = old_ttyinfo[:] - new_ttyinfo[3] &= ~termios.ICANON - new_ttyinfo[3] &= ~termios.ECHO - sys.stdout.write(msg) - sys.stdout.flush() - try: - termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo) - ret = os.read(fd, 1) - finally: - # print "try to setting" - termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo) - return ret - - -def get_raw_input(): - ret = "" - fd = sys.stdin.fileno() - old_ttyinfo = termios.tcgetattr(fd) - new_ttyinfo = old_ttyinfo[:] - new_ttyinfo[3] &= ~termios.ICANON - new_ttyinfo[3] &= ~termios.ECHO - try: - termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo) - ret = raw_input("") - except Exception as e: - print(e) - finally: - termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo) - return ret - - -def getsysvalue(location): - retval = None - mb_reg_file = location - if not os.path.isfile(mb_reg_file): - print(mb_reg_file, "not found !") - return retval - try: - if not os.path.isfile(mb_reg_file): - print(mb_reg_file, "not found !") - return retval - with open(mb_reg_file, "r") as fd: - retval = fd.read() - except Exception as error: - log_error("Unable to open " + mb_reg_file + "file !") - retval = retval.rstrip("\r\n") - retval = retval.lstrip(" ") - # log_debug(retval) - return retval - - -# get file value - - -def get_pmc_register(reg_name): - retval = "ERR" - mb_reg_file = MAILBOX_DIR + reg_name - filepath = glob.glob(mb_reg_file) - if len(filepath) == 0: - return "%s %s notfound" % (retval, mb_reg_file) - mb_reg_file = filepath[0] - if not os.path.isfile(mb_reg_file): - return "%s %s notfound" % (retval, mb_reg_file) - try: - with open(mb_reg_file, "r") as fd: - retval = fd.read() - except Exception as error: - pass - retval = retval.rstrip("\r\n") - retval = retval.lstrip(" ") - return retval - - -# decode EEPROM - - -def decoder(s, t): - if ord(t[0]) == TLV_CODE_PRODUCT_NAME: - name = "Product Name" - value = str(t[2 : 2 + ord(t[1])]) - elif ord(t[0]) == TLV_CODE_PART_NUMBER: - name = "Part Number" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_SERIAL_NUMBER: - name = "Serial Number" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_MAC_BASE: - name = "Base MAC Address" - value = ":".join([binascii.b2a_hex(T) for T in t[2:8]]).upper() - elif ord(t[0]) == TLV_CODE_MANUF_DATE: - name = "Manufacture Date" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_DEVICE_VERSION: - name = "Device Version" - value = str(ord(t[2])) - elif ord(t[0]) == TLV_CODE_LABEL_REVISION: - name = "Label Revision" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_PLATFORM_NAME: - name = "Platform Name" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_ONIE_VERSION: - name = "ONIE Version" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_MAC_SIZE: - name = "MAC Addresses" - value = str((ord(t[2]) << 8) | ord(t[3])) - elif ord(t[0]) == TLV_CODE_MANUF_NAME: - name = "Manufacturer" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_MANUF_COUNTRY: - name = "Manufacture Country" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_VENDOR_NAME: - name = "Vendor Name" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_DIAG_VERSION: - name = "Diag Version" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_SERVICE_TAG: - name = "Service Tag" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_VENDOR_EXT: - name = "Vendor Extension" - value = "" - if _TLV_DISPLAY_VENDOR_EXT: - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_CRC_32 and len(t) == 6: - name = "CRC-32" - value = "0x%08X" % ( - ((ord(t[2]) << 24) | (ord(t[3]) << 16) | (ord(t[4]) << 8) | ord(t[5])), - ) - elif ord(t[0]) == TLV_CODE_RJ_CARID: - name = "rj_cardid" - value = "" - for c in t[2 : 2 + ord(t[1])]: - value += "%02X" % (ord(c),) - else: - name = "Unknown" - value = "" - for c in t[2 : 2 + ord(t[1])]: - value += "0x%02X " % (ord(c),) - return {"name": name, "code": ord(t[0]), "value": value} - - -def decode_eeprom(e): - total_len = (ord(e[9]) << 8) | ord(e[10]) - tlv_index = _TLV_INFO_HDR_LEN - tlv_end = _TLV_INFO_HDR_LEN + total_len - ret = [] - while (tlv_index + 2) < len(e) and tlv_index < tlv_end: - rt = decoder(None, e[tlv_index : tlv_index + 2 + ord(e[tlv_index + 1])]) - ret.append(rt) - if ord(e[tlv_index]) == TLV_CODE_CRC_32: - break - tlv_index += ord(e[tlv_index + 1]) + 2 - for item in ret: - if item["code"] == TLV_CODE_VENDOR_EXT: - rt = decoder(None, item["value"][0 : 0 + 2 + ord(item["value"][0 + 1])]) - ret.append(rt) - return ret - - -def get_sys_eeprom(): - eeprom = get_sysfs_value(rg_eeprom) - return decode_eeprom(eeprom) - - -# get card ID -def getCardId(): - ret = get_sys_eeprom() - for item in ret: - if item["code"] == TLV_CODE_RJ_CARID: - return item.get("value", None) - return None - - -########################################### -# get memory slot and number via DMI command -########################################### -def getsysmeminfo(): - ret, log = getstatusoutput_noshell(["which", "dmidecode"]) - if ret != 0 or len(log) <= 0: - error = "cmd find dmidecode" - return False, error - cmd1 = [log] - cmd2 = ['grep', '-P', '-A5', "Memory\s+Device"] - cmd3 = ['grep', 'Size'] - cmd4 = ['grep', '-v', 'Range'] - # get total number first - result = [] - ret1, log1 = getstatusoutput_noshell_pipe(cmd1, cmd2, cmd3, cmd4) - if ret1 == 0 and len(log1): - log1 = log1.lstrip() - arr = log1.split("\n") - # total = len(arr) # total slot number - for i in range(len(arr)): - val = re.sub("\D", "", arr[i]) - if val == "": - val = arr[i].lstrip() - val = re.sub("Size:", "", val).lstrip() - # print val - result.append({"slot": i + 1, "size": val}) - return True, result - return False, "error" - - -########################################### -# get memory slot and number via DMI command -# return various arrays -########################################### -def getsysmeminfo_detail(): - ret, log = getstatusoutput_noshell(["which", "dmidecode"]) - if ret != 0 or len(log) <= 0: - error = "cmd find dmidecode" - return False, error - cmd1 = [log] - cmd2 = ['-t', '17'] - cmd3 = ['grep', '-A21', "Memory Device"] # 17 - cmd = ' '.join(cmd1) + ' '.join(cmd2) + ' '.join(cmd3) - # get total number - ret1, log1 = getstatusoutput_noshell_pipe(cmd1, cmd2, cmd3) - if ret1 != 0 or len(log1) <= 0: - return False, "command execution error[%s]" % cmd - result_t = log1.split("--") - mem_rets = [] - for item in result_t: - its = item.replace("\t", "").strip().split("\n") - ret = {} - for it in its: - if ":" in it: - key = it.split(":")[0].lstrip() - value = it.split(":")[1].lstrip() - ret[key] = value - mem_rets.append(ret) - return True, mem_rets - - -########################################### -# get BIOS info via DMI command -########################################### -def getDmiSysByType(type_t): - ret, log = getstatusoutput_noshell(["which", "dmidecode"]) - if ret != 0 or len(log) <= 0: - error = "cmd find dmidecode" - return False, error - cmd = [log] + ["-t", type_t] - # get total number - ret1, log1 = getstatusoutput_noshell(cmd) - if ret1 != 0 or len(log1) <= 0: - return False, "command execution error[%s]" % cmd - its = log1.replace("\t", "").strip().split("\n") - ret = {} - for it in its: - if ":" in it: - key = it.split(":")[0].lstrip() - value = it.split(":")[1].lstrip() - ret[key] = value - return True, ret - - -def gethwsys(): - return getDmiSysByType(1) - - -########################################### -# get BIOS info via DMI command - - -def getsysbios(): - return getDmiSysByType(0) - - -def searchDirByName(name, dir): - result = [] - try: - files = os.listdir(dir) - for file in files: - if name in file: - result.append(os.path.join(dir, file)) - except Exception as e: - pass - return result - - -def getUsbLocation(): - dir = "/sys/block/" - spect = "sd" - usbpath = "" - result = searchDirByName(spect, dir) - if len(result) <= 0: - return False - for item in result: - with open(os.path.join(item, "removable"), "r") as fd: - value = fd.read() - if value.strip() == "1": # U-Disk found - usbpath = item - break - if usbpath == "": # no U-Disk found - log_debug("no usb found") - return False, usbpath - return True, usbpath - - -# judge USB file -def getusbinfo(): - ret, path = getUsbLocation() - if ret is False: - return False, "not usb exists" - str = os.path.join(path, "size") - ret, value = getfilevalue(str) - if ret is True: - return ( - True, - { - "id": os.path.basename(path), - "size": float(value) * 512 / 1024 / 1024 / 1024, - }, - ) - else: - return False, "Err" - - -def get_cpu_info(): - cmd1 = ["cat", "/proc/cpuinfo"] - cmd2 = ["grep", "processor", "-A18"] # 17 - cmd = ' '.join(cmd1) + ' '.join(cmd2) - ret, log1 = getstatusoutput_noshell_pipe(cmd1, cmd2) - if ret != 0 or len(log1) <= 0: - return False, "command execution error[%s]" % cmd - result_t = log1.split("--") - mem_rets = [] - for item in result_t: - its = item.replace("\t", "").strip().split("\n") - ret = {} - for it in its: - if ":" in it: - key = it.split(":")[0].lstrip() - value = it.split(":")[1].lstrip() - ret[key] = value - mem_rets.append(ret) - return True, mem_rets - - -# read file -def get_version_config_info(attr_key, file_name=None): - if file_name is None: - version_conf_filename = "/root/version.json" - else: - version_conf_filename = file_name - if not os.path.isfile(version_conf_filename): - return None - with open(version_conf_filename) as rjconf_file: - for line in rjconf_file: - tokens = line.split("=") - if len(tokens) < 2: - continue - if tokens[0] == attr_key: - return tokens[1].strip() - return None - - -def io_rd(reg_addr, size=1): - path = "/dev/port" - ret = "" - fd = None - try: - reg_addr = int(reg_addr) - fd = os.open(path, os.O_RDWR|os.O_CREAT) - for i in range(size): - os.lseek(fd, reg_addr+i, os.SEEK_SET) - ret+="{:02x}".format(ord(os.read(fd, 1).decode('latin-1'))) - return ret - except Exception as e: - print(str(e)) - return None - finally: - if fd: os.close(fd) - - -def io_wr(reg_addr, reg_data): - u"""io write""" - fd = None - try: - regdata = 0 - regaddr = 0 - if type(reg_addr) == int: - regaddr = reg_addr - else: - regaddr = int(reg_addr, 16) - if type(reg_data) == int: - regdata = reg_data - else: - regdata = int(reg_data, 16) - devfile = "/dev/port" - fd = os.open(devfile, os.O_RDWR | os.O_CREAT) - os.lseek(fd, regaddr, os.SEEK_SET) - os.write(fd, regdata.to_bytes(2, 'little')) - return True - except ValueError as e: - print(e) - return False - except Exception as e: - print(e) - return False - finally: - if fd: os.close(fd) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py new file mode 100755 index 000000000000..2f125c5084c2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py @@ -0,0 +1,183 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- +import sys +import os +import time +import syslog +from platform_util import get_value, set_value, exec_os_cmd, wb_os_system +from platform_config import REBOOT_CAUSE_PARA + +REBOOT_CAUSE_DEBUG_FILE = "/etc/.reboot_cause_debug" +REBOOT_CAUSE_STARTED_FLAG = "/tmp/.reboot_cause_started_flag" + +debuglevel = 0 + + +def record_syslog_debug(s): + if debuglevel: + syslog.openlog("REBOOT_CAUSE_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def record_syslog(s): + syslog.openlog("REBOOT_CAUSE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +class RebootCause(): + def __init__(self): + self.reboot_cause_para = REBOOT_CAUSE_PARA.copy() + self.reboot_cause_list = self.reboot_cause_para.get('reboot_cause_list', None) + self.other_reboot_cause_record = self.reboot_cause_para.get('other_reboot_cause_record', None) + + def debug_init(self): + global debuglevel + if os.path.exists(REBOOT_CAUSE_DEBUG_FILE): + debuglevel = 1 + else: + debuglevel = 0 + + def monitor_point_check(self, item): + try: + gettype = item.get('gettype', None) + okval = item.get('okval', None) + compare_mode = item.get('compare_mode', "equal") + ret, value = get_value(item) + if ret is True: + if compare_mode == "equal": + if value == okval: + return True + elif compare_mode == "great": + if value > okval: + return True + elif compare_mode == "ignore": + return True + else: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: compare_mode %s not match error.' % (compare_mode)) + else: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: base point check type:%s not support.' % gettype) + except Exception as e: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: base point check error. msg: %s.' % (str(e))) + return False + + def reboot_cause_record(self, item_list): + RET = {"RETURN_KEY1": 0} + try: + for item in item_list: + record_type = item.get('record_type', None) + if record_type == 'file': + file_mode = item.get('mode', None) + file_log = item.get('log', None) + file_path = item.get('path', None) + file_max_size = item.get('file_max_size', 0) + + if file_path is None: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: record type is file, but path is none.') + continue + + if file_max_size > 0: + file_size = 0 + if os.path.exists(file_path): + file_size = os.path.getsize(file_path) // file_max_size + if file_size >= 1: + reocrd_cmd = "mv %s %s_bak" % (file_path, file_path) + status, output = exec_os_cmd(reocrd_cmd) + if status: + record_syslog( + '%%REBOOT_CAUSE-3-EXCEPTION: exec cmd %s failed, %s' % + (reocrd_cmd, output)) + + if file_mode == 'cover': + operate_cmd = ">" + elif file_mode == 'add': + operate_cmd = ">>" + else: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: file record mode:%s not support.' % file_mode) + continue + + create_dir = "mkdir -p %s" % os.path.dirname(file_path) + status, ret_t = wb_os_system(create_dir) + if status != 0: + RET["RETURN_KEY1"] = -1 + record_syslog( + '%%REBOOT_CAUSE-3-EXCEPTION: create %s failed, msg: %s' % + (os.path.dirname(file_path), ret_t)) + continue + + status, date = wb_os_system("date") + if status != 0 or len(date) == 0: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: get date failed.') + continue + + reocrd_cmd = "echo %s %s %s %s" % (file_log, date, operate_cmd, file_path) + status, ret_t = wb_os_system(reocrd_cmd) + if status != 0: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: get date failed, msg: %s' % ret_t) + continue + wb_os_system('sync') + else: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: record_type:%s not support.' % record_type) + continue + except Exception as e: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: reboot cause record error. msg: %s.' % (str(e))) + if RET["RETURN_KEY1"] == 0: + return True + return False + + def reboot_cause_check(self): + try: + reboot_cause_flag = False + if self.reboot_cause_list is None: + record_syslog_debug('%%REBOOT_CAUSE-6-DEBUG: reboot cause check config not found') + return + for item in self.reboot_cause_list: + name = item.get('name', None) + monitor_point = item.get('monitor_point', None) + record = item.get('record', None) + finish_operation_list = item.get('finish_operation', []) + if name is None or monitor_point is None or record is None: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: reboot cause check get config failed.name:%s, monitor_point:%s, record:%s' % + (name, monitor_point, record)) + return + ret = self.monitor_point_check(monitor_point) + if ret is True: + record_syslog_debug('%%REBOOT_CAUSE-6-DEBUG: %s reboot cause is happen' % name) + self.reboot_cause_record(record) + reboot_cause_flag = True + for finish_operation_item in finish_operation_list: + ret, log = set_value(finish_operation_item) + if ret is False: + log = "%%REBOOT_CAUSE-3-EXCEPTION: " + log + record_syslog(log) + + if reboot_cause_flag is False and self.other_reboot_cause_record is not None: + record_syslog_debug('%%REBOOT_CAUSE-6-DEBUG: other reboot cause is happen') + self.reboot_cause_record(self.other_reboot_cause_record) + except Exception as e: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: reboot cause check error. msg: %s.' % (str(e))) + return + + def run(self): + try: + self.debug_init() + if os.path.exists(REBOOT_CAUSE_STARTED_FLAG): + record_syslog_debug( + '%%REBOOT_CAUSE-6-DEBUG: Reboot cause has been started and will not be started again') + sys.exit(0) + self.reboot_cause_check() + wb_os_system("touch %s" % REBOOT_CAUSE_STARTED_FLAG) + wb_os_system("sync") + time.sleep(5) + sys.exit(0) + except Exception as e: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: %s.' % (str(e))) + + +if __name__ == '__main__': + reboot_cause = RebootCause() + reboot_cause.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py new file mode 100755 index 000000000000..17d3f5902b9d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import time +import syslog +import click +from platform_util import write_sysfs, wbi2cset, io_wr, wbi2csetWord +from platform_config import REBOOT_CTRL_PARAM + + +REBOOTCTLDEBUG = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def rebootctrlwarning(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def rebootctrlcritical(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def rebootctrlerror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def rebootctrldebug(s): + # s = s.decode('utf-8').encode('gb2312') + if REBOOTCTLDEBUG == 1: + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class RebootCtrl(): + def __init__(self): + self.config = REBOOT_CTRL_PARAM.copy() + + def set_value(self, config, val): + way = config.get("gettype") + if way == 'sysfs': + loc = config.get("loc") + value = config.get(val) + rebootctrldebug("sysfs type.loc:0x%x, value:0x%x" % (loc, value)) + return write_sysfs(loc, "0x%02x" % value) + if way == "i2c": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get(val) + rebootctrldebug("i2c type.bus:0x%x, addr:0x%x, offset:0x%x, value:0x%x" % (bus, addr, offset, value)) + return wbi2cset(bus, addr, offset, value) + if way == "io": + io_addr = config.get('io_addr') + value = config.get(val) + rebootctrldebug("io type.io_addr:0x%x, value:0x%x" % (io_addr, value)) + ret = io_wr(io_addr, value) + if ret is not True: + return False, ("write 0x%x failed" % io_addr) + return True, ("write 0x%x success" % io_addr) + if way == 'i2cword': + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get(val) + rebootctrldebug("i2cword type.bus:0x%x, addr:0x%x, offset:0x%x, value:0x%x" % (bus, addr, offset, value)) + return wbi2csetWord(bus, addr, offset, value) + return False, "unsupport way: %s" % way + + def reset_operate(self, config): + ret, log = self.set_value(config, "rst_val") + rst_delay = config.get("rst_delay", 0) + time.sleep(rst_delay) + return ret, log + + def unlock_reset_operate(self, config): + ret, log = self.set_value(config, "unlock_rst_val") + unlock_rst_delay = config.get("unlock_rst_delay", 0) + time.sleep(unlock_rst_delay) + return ret, log + + def do_rebootctrl(self, option): + if self.config is None: + rebootctrlerror("Reset failed, REBOOT_CTRL_PARAM cfg get failed.") + return + try: + name_conf = self.config.get(option, None) + if name_conf is None: + print("Reset %s not support" % option) + return + try: + click.confirm("Are you sure you want to reset " + option + "?", + default=False, abort=True, show_default=True) + except Exception as e: + print("Aborted, msg: %s" % str(e)) + return + print("Reset %s start" % option) + ret, log = self.reset_operate(name_conf) + if ret is False: + rebootctrlerror(log) + print("Reset %s failed" % option) + return + if "unlock_rst_val" in name_conf: + ret, log = self.unlock_reset_operate(name_conf) + if ret is False: + rebootctrlerror(log) + print("%s unlock reset failed" % option) + return + print("Reset %s success" % option) + except Exception: + rebootctrlerror("do_rebootctrl Exception error") + return + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''reboot_ctrl reset [option]''' + + +@main.command() +@click.argument('option', required=True) +def reset(option): + '''reset device''' + rebootctrldebug("reboot ctrl option %s" % option) + rebootctrl = RebootCtrl() + rebootctrl.do_rebootctrl(option) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/sensors b/platform/broadcom/sonic-platform-modules-ragile/common/script/sensors new file mode 100755 index 000000000000..a2c72b123a43 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/sensors @@ -0,0 +1,8 @@ +#!/bin/bash +#docker exec -i pmon sensors "$@" + + +#To probe sensors not part of lm-sensors +if [ -r /usr/local/bin/platform_sensors.py ]; then + python /usr/local/bin/platform_sensors.py +fi diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py new file mode 100755 index 000000000000..4dd98f3a36b3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py @@ -0,0 +1,148 @@ +#!/usr/bin/python3 +import os +import importlib.machinery +import time +import syslog +import subprocess +import fcntl + +sfp_temperature_file = "/tmp/highest_sff_temp" + +SFP_TEMP_DEBUG_FILE = "/etc/.sfp_temp_debug_flag" +SFP_TEMP_RECORD_DEBUG = 1 +SFP_TEMP_RECORD_ERROR = 2 +debuglevel = 0 + + +def sfp_temp_debug(s): + if SFP_TEMP_RECORD_DEBUG & debuglevel: + syslog.openlog("SFP_TEMP_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def sfp_temp_error(s): + if SFP_TEMP_RECORD_ERROR & debuglevel: + syslog.openlog("SFP_TEMP_ERROR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +pidfile = None + + +def file_rw_lock(): + global pidfile + pidfile = open(sfp_temperature_file, "r") + try: + fcntl.flock(pidfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + sfp_temp_debug("file lock success") + return True + except Exception: + if pidfile is not None: + pidfile.close() + pidfile = None + return False + + +def file_rw_unlock(): + try: + global pidfile + + if pidfile is not None: + fcntl.flock(pidfile, fcntl.LOCK_UN) + pidfile.close() + pidfile = None + sfp_temp_debug("file unlock success") + else: + sfp_temp_debug("pidfile is invalid, do nothing") + return True + except Exception as e: + sfp_temp_error("file unlock err, msg:%s" % (str(e))) + return False + + +def get_sfp_highest_temperature(): + highest_temperature = 0 + platform_sfputil = None + + sfputil_dir = "/usr/share/sonic/device/" + try: + if not os.path.exists(sfputil_dir): + sfputil_dir = "/usr/share/sonic/platform/" + sfputil_path = sfputil_dir + "/plugins/sfputil.py" + else: + cmd = "cat /host/machine.conf | grep onie_build_platform" + ret, output = subprocess.getstatusoutput(cmd) + if ret != 0: + sfp_temp_error("cmd: %s execution fail, output: %s" % (cmd, output)) + + onie_platform = output.split("=")[1] + sfputil_path = sfputil_dir + onie_platform + "/plugins/sfputil.py" + + module = importlib.machinery.SourceFileLoader("sfputil", sfputil_path).load_module() + platform_sfputil_class = getattr(module, "SfpUtil") + platform_sfputil = platform_sfputil_class() + + temperature = platform_sfputil.get_highest_temperature() + highest_temperature = int(temperature) * 1000 + except Exception as e: + sfp_temp_error("get sfp temperature error, msg:%s" % str(e)) + highest_temperature = -9999000 + + return highest_temperature + + +def write_sfp_highest_temperature(temperature): + + loop = 1000 + ret = False + try: + if os.path.exists(sfp_temperature_file) is False: + with open(sfp_temperature_file, 'w') as sfp_f: + pass + for i in range(0, loop): + ret = file_rw_lock() + if ret is True: + break + time.sleep(0.001) + + if ret is False: + sfp_temp_error("take file lock timeout") + return + + with open(sfp_temperature_file, 'w') as sfp_f: + sfp_f.write("%s\n" % str(temperature)) + + file_rw_unlock() + return + except Exception as e: + sfp_temp_error("write sfp temperature error, msg:%s" % str(e)) + file_rw_unlock() + return + + +def debug_init(): + global debuglevel + + try: + with open(SFP_TEMP_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +def main(): + while True: + debug_init() + temperature = 0 + try: + temperature = get_sfp_highest_temperature() + write_sfp_highest_temperature(temperature) + except Exception as e: + sfp_temp_error("get/write sfp temperature error, msg:%s" % str(e)) + write_sfp_highest_temperature(-9999000) + time.sleep(5) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py new file mode 100755 index 000000000000..b8b774c8b726 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import time +import syslog +import traceback +import operator +import click +from platform_config import SLOT_MONITOR_PARAM, MONITOR_DEV_STATUS_DECODE +from platform_util import io_rd, io_wr, wbi2cget, wbi2cset + + +SLOTMONITORDEBUG = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def slotwarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def slotcriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def sloterror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def slotinfo(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def slotdebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if SLOTMONITORDEBUG == 1: + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class SlotMonitor(): + def __init__(self): + self.preSlotStatus = [] + + def checkslot(self, ret): + slots_conf = SLOT_MONITOR_PARAM.get('slots', None) + slotpresent = MONITOR_DEV_STATUS_DECODE.get('slotpresent', None) + + if slots_conf is None or slotpresent is None: + return False + for item_slot in slots_conf: + totalerr = 0 + try: + ret_t = {} + ret_t["id"] = item_slot.get('name') + ret_t["status"] = "" + presentattr = item_slot.get('present') + gettype = presentattr.get('gettype') + presentbit = presentattr.get('presentbit') + if gettype == "io": + io_addr = presentattr.get('io_addr') + val = io_rd(io_addr) + if val is not None: + retval = val + else: + totalerr -= 1 + sloterror(" %s %s" % (item_slot.get('name'), "lpc read failed")) + else: + bus = presentattr.get('bus') + loc = presentattr.get('loc') + offset = presentattr.get('offset') + ind, val = wbi2cget(bus, loc, offset) + if ind is True: + retval = val + else: + totalerr -= 1 + sloterror(" %s %s" % (item_slot.get('name'), "i2c read failed")) + if totalerr < 0: + ret_t["status"] = "NOT OK" + ret.append(ret_t) + continue + val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit + slotdebuglog("%s present:%s" % (item_slot.get('name'), slotpresent.get(val_t))) + if val_t != slotpresent.get('okval'): + ret_t["status"] = "ABSENT" + else: + ret_t["status"] = "PRESENT" + except Exception as e: + ret_t["status"] = "NOT OK" + totalerr -= 1 + sloterror("checkslot error") + sloterror(str(e)) + ret.append(ret_t) + return True + + def dealslotplugin(self, name): + slotdebuglog("enter dealslotplugin %s" % name) + # wait for slot stable + time.sleep(5) + slots_conf = SLOT_MONITOR_PARAM.get('slots', None) + if slots_conf is None: + return False + for item_slot in slots_conf: + try: + slotdebuglog("name %s, item_slot.get('name') %s" % (name, item_slot.get('name'))) + if name == item_slot.get('name'): + actattr = item_slot.get('act') + for item_act in actattr: + gettype = item_act.get('gettype') + if gettype == "io": + io_addr = item_act.get('io_addr') + value = item_act.get('value') + mask = item_act.get('mask') + val = io_rd(io_addr) + if val is None: + sloterror(" %s %s" % (name, "lpc read failed")) + continue + set_val = (int(val, 16) & mask) | value + ret = io_wr(io_addr, set_val) + if ret is not True: + sloterror(" %s %s" % (name, "lpc write failed")) + continue + slotdebuglog("io set io_addr:0x%x value:0x%x success" % (io_addr, set_val)) + elif gettype == "i2c": + bus = item_act.get('bus') + loc = item_act.get('loc') + offset = item_act.get('offset') + value = item_act.get('value') + ret, log = wbi2cset(bus, loc, offset, value) + if ret is not True: + sloterror(" %s %s %s" % (name, "i2c write failed", log)) + continue + slotdebuglog( + "i2c set bus:%d loc:0x%x offset:0x%x value:0x%x success" % + (bus, loc, offset, value)) + else: + sloterror("gettype error") + break + except Exception as e: + sloterror("dealslotplugin failed") + sloterror(str(e)) + return False + return True + + def updateSlotStatus(self): + ''' + Only two status: PRESENT and ABSENT + ''' + curSlotStatus = [] + self.checkslot(curSlotStatus) + slotdebuglog('curSlotStatus: {}\n preSlotStatus: {}'.format(curSlotStatus, self.preSlotStatus)) + if operator.eq(self.preSlotStatus, curSlotStatus) is False: + if len(self.preSlotStatus) == 0: + # first time + for i, item in enumerate(curSlotStatus): + if item['status'] == 'PRESENT': + slotdebuglog('SLOT_PLUG_IN: %s' % (item['id'])) + elif item['status'] == 'ABSENT': + slotdebuglog('SLOT_ABSENT: %s' % (item['id'])) + else: + slotdebuglog('SLOT_FAILED: %s status %s not support yet' % (item['id'], item['status'])) + self.preSlotStatus.append(item) + else: + for i, item in enumerate(curSlotStatus): + if item['status'] == self.preSlotStatus[i]['status']: + continue + if item['status'] == 'PRESENT' and self.preSlotStatus[i]['status'] == 'ABSENT': + self.dealslotplugin(item['id']) + slotinfo('SLOT_PLUG_IN: %s' % (item['id'])) + elif item['status'] == 'ABSENT' and self.preSlotStatus[i]['status'] == 'PRESENT': + slotwarninglog('SLOT_PLUG_OUT: %s' % (item['id'])) + else: + slotwarninglog('SLOT_PLUG_OUT: %s status change from %s to %s not support' % + (item['id'], self.preSlotStatus[i]['status'], item['status'])) + self.preSlotStatus.remove(self.preSlotStatus[i]) + self.preSlotStatus.insert(i, item) + + def slotmonitor(self): + self.updateSlotStatus() + return 0 + + +def doSlotMonitor(slotMonitor): + slotMonitor.slotmonitor() + + +def run(interval, slotMonitor): + # slotMonitor.devattrinit() + while True: + try: + doSlotMonitor(slotMonitor) + except Exception as e: + traceback.print_exc() + sloterror(str(e)) + time.sleep(interval) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''slot monitor operator''' + + +@main.command() +def start(): + '''start slot monitor''' + slotinfo("slot_monitor start") + slotMonitor = SlotMonitor() + interval = SLOT_MONITOR_PARAM.get('polling_time', 1) + run(interval, slotMonitor) + + +@main.command() +def stop(): + '''stop slot monitor ''' + slotinfo("stop") + + +# device_i2c operation +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon b/platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon new file mode 100755 index 000000000000..4290b0a68725 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# +# ssdmon +# +# Command-line utility to check SSD health and parameters +# + +try: + import argparse + import os + import sys + + from sonic_py_common import device_info, logger +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + +DEFAULT_DEVICE = "/dev/sda" +SYSLOG_IDENTIFIER = "ssdmon" + +# Global logger instance +log = logger.Logger(SYSLOG_IDENTIFIER) + +def import_ssd_api(diskdev): + """ + Loads platform specific or generic ssd_mon module from source + Raises an ImportError exception if none of above available + + Returns: + Instance of the class with SSD API implementation (vendor or generic) + """ + + # try to load platform specific module + try: + platform_path, _ = device_info.get_paths_to_platform_and_hwsku_dirs() + platform_plugins_path = os.path.join(platform_path, "plugins") + sys.path.append(os.path.abspath(platform_plugins_path)) + from ssd_util import SsdUtil + except ImportError as e: + log.log_warning("Platform specific SsdMon module not found.") + + return SsdUtil(diskdev) + +def is_number(s): + try: + float(s) + return True + except ValueError: + return False + +# ==================== Entry point ==================== +def ssdmon(): + if os.geteuid() != 0: + print("Root privileges are required for this operation") + sys.exit(1) + + parser = argparse.ArgumentParser() + parser.add_argument("-d", "--device", help="Device name to show health info", default=DEFAULT_DEVICE) + parser.add_argument("-t", "--temperature", action="store_true", default=False, help="Show only temperature") + parser.add_argument("-j", "--health", action="store_true", default=False, help="Show only health") + + args = parser.parse_args() + + ssd = import_ssd_api(args.device) + + if args.temperature: + print(ssd.get_temperature()) + return + + if args.health: + print(ssd.get_health()) + return + + print("Device Model : {}".format(ssd.get_model())) + print("Firmware : {}".format(ssd.get_firmware())) + print("Serial : {}".format(ssd.get_serial())) + print("Health : {}{}".format(ssd.get_health(), "%" if is_number(ssd.get_health()) else "")) + print("Remain Life : {}{}".format(ssd.get_remaining_life(), "%" if is_number(ssd.get_remaining_life()) else "")) + print("Temperature : {}{}".format(ssd.get_temperature(), "C" if is_number(ssd.get_temperature()) else "")) + print("SATA Rate : {}".format(ssd.get_sata_rate())) + +if __name__ == '__main__': + ssdmon() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py new file mode 100755 index 000000000000..4fae02f5128e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py @@ -0,0 +1,91 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +import logging.handlers +import subprocess +import shlex +import time +import sys +import os +from platform_util import CompressedRotatingFileHandler, exec_os_cmd + +console_file = "/dev/ttyS1" +console_logfile = "/var/log/bmc-console.log" +MAX_LOG_BYTES = 20 * 1024 * 1024 +BACKUP_COUNT = 9 + +READ_SIZE = 1024 + +logger = logging.getLogger("cpu_monitor_bmc") +logger.setLevel(logging.DEBUG) +fh = CompressedRotatingFileHandler( + console_logfile, + mode='a', + maxBytes=MAX_LOG_BYTES, + backupCount=BACKUP_COUNT, + encoding=None, + delay=0) +fh.setLevel(logging.DEBUG) + +formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") +fh.setFormatter(formatter) +logger.addHandler(fh) + + +def tty_system_cmd(cmd, print_log=True): + if print_log: + logger.debug("command: %s", cmd) + status, output = exec_os_cmd(cmd) + logger.debug("command status %s", status) + logger.debug("command output:\n%s", output) + else: + status, output = exec_os_cmd(cmd) + return status, output + + +if __name__ == '__main__': + try_times = 0 + while try_times < 3: + try_times = try_times + 1 + ret, log = tty_system_cmd("stty -F /dev/ttyS1 | grep 115200", True) + if len(log) != 0 and "115200" in log: + break + tty_system_cmd("stty -F /dev/ttyS1 115200", True) + if try_times > 1: + logger.error("The %d time try to set SONiC /dev/ttyS1 115200", try_times) + + if not os.path.exists(console_file): + logger.error("device %s not exist", console_file) + sys.exit(1) + + nopen = 3 + while nopen > 0: + try: + console_fd = os.open(console_file, os.O_RDONLY) + break + except Exception as e: + logger.error(e) + logger.error("open %s failed", console_file) + nopen = nopen - 1 + time.sleep(1) + if nopen == 0: + sys.exit(1) + + try: + tmp_read = "" + while True: + dev_read = os.read(console_fd, READ_SIZE) + dev_read = str(dev_read, encoding='utf-8') + if len(dev_read) == 1 and dev_read == "\n": + continue + if dev_read[len(dev_read) - 1] == '\n': + tmp_read = tmp_read + dev_read[0:(len(dev_read) - 1)] + logger.info(tmp_read) + tmp_read = "" + else: + tmp_read = tmp_read + dev_read + + except Exception as e: + if console_fd is not None: + os.close(console_fd) + logger.error(e) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py new file mode 100755 index 000000000000..f56712e471b6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py @@ -0,0 +1,991 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import sys +import os +import time +import syslog +import signal +import click +from platform_util import get_value, set_value, exec_os_cmd, exec_os_cmd_log +from platform_config import UPGRADE_SUMMARY, WARM_UPGRADE_STARTED_FLAG +from warm_upgrade import WarmBasePlatform + + +############################# Error code defined ############################# +ERR_FW_CHECK_CPLD_UPGRADE = -601 # "Failed to check the device CPLD information" +ERR_FW_CHECK_FPGA_UPGRADE = -602 # "Failed to check the device FPGA information" +ERR_FW_MATCH_CPLD_UPGRADE = -603 # "Not found upgrade CPLD file." +ERR_FW_MATCH_FPGA_UPGRADE = -604 # "Not found upgrade FPGA file." +ERR_FW_SAMEVER_CPLD_UPGRADE = -605 # "The CPLD version in device is same" +ERR_FW_SAMEVER_FPGA_UPGRADE = -606 # "The FPGA version in device is same" +ERR_FW_DO_CPLD_UPGRADE = -607 # "Doing upgrade CPLD is failed." +ERR_FW_DO_FPGA_UPGRADE = -608 # "Doing upgrade FPGA is failed." +ERR_FW_UPGRADE = -609 # "Failed to upgrade firmware" +FIRMWARE_PROGRAM_EXEC_ERR = -610 # "Firmware program run error!" +ERR_FW_FILE_FOUND = -701 # "Failed to find upgrade file" +ERR_FW_HEAD_PARSE = -702 # "Failed to parse upgrade firmware head info" +ERR_FW_CONFIG_FOUND = -703 # "Failed to find config item" +ERR_FW_NOSUPPORT_HOT = -704 # "No support hot upgrade" +ERR_FW_CHECK_SIZE = -705 # "Failed to check file size" +ERR_FW_DEVICE_ACCESS = -706 # "Failed to access device" +ERR_FW_NO_FILE_SUCCESS = -707 # "No files were successfully upgraded" +ERR_FW_CARD_ABSENT = -708 # "The subcard not present" +ERR_FW_HEAD_CHECK = -709 # "Failed to check head info" +ERR_FW_FOOL_PROOF = -710 # "Failed to fool proof verification" +ERR_FW_RAISE_EXCEPTION = -711 # Code raise exception +ERR_FW_INVALID_PARAM = -712 # Invalid parameter +ERR_FW_UNZIP_FAILED = -713 # Unzip firmware failed + +FIRMWARE_SUCCESS = 0 +CHECK_OK = 0 + + +UPGRADE_DEBUG_FILE = "/etc/.upgrade_debug_flag" +UPGRADE_FILE_DIR = "/tmp/firmware/" + +UPGRADEDEBUG = 1 + +debuglevel = 0 + +COLD_UPGRADE = 1 +WARM_UPGRADE = 2 +TEST_UPGRADE = 3 +BMC_UPGRADE = 4 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def debug_init(): + global debuglevel + if os.path.exists(UPGRADE_DEBUG_FILE): + debuglevel = debuglevel | UPGRADEDEBUG + else: + debuglevel = debuglevel & ~(UPGRADEDEBUG) + + +def upgradewarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def upgradecriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def upgradeerror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def upgradedebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if UPGRADEDEBUG & debuglevel: + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def signal_init(): + signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore ctrl+c signal + signal.signal(signal.SIGTERM, signal.SIG_IGN) # ignore kill signal + signal.signal(signal.SIGTSTP, signal.SIG_IGN) # ignore ctrl+z signal + + +class BasePlatform(): + + def __init__(self): + self.upgrade_param = UPGRADE_SUMMARY.copy() + self.devtype = self.upgrade_param.get('devtype', None) + self.max_slot_num = self.upgrade_param.get("max_slot_num", 0) + self.head_info_config = {} + self.slot_config = {} + self.cold_chain_config = {} + self.subtype = None + self.chain = None + self.filetype = None + self.DEVTYPE = None + self.SUBTYPE = '0' + self.TYPE = None + self.CHAIN = None + self.CHIPNAME = None + self.VERSION = None + self.FILETYPE = None + self.CRC = None + self.SUBTYPE_LIST = None + + def save_and_set_value(self, cfg_list): + for config in cfg_list: + ret, val = get_value(config) + if ret: + config["save_value"] = val + else: + upgradeerror(val) + return False, "get save value fail" + + set_val = config.get("set_value", None) + if set_val is None: + log = "save_and_set_value lack of set_val config" + upgradeerror(log) + return log + + gettype = config.get("gettype", None) + set_cmd = config.get("set_cmd", None) + if gettype == "cmd": + if set_cmd is None: + log = "save_and_set_value lack of set_cmd config" + upgradeerror(log) + return False, log + config["cmd"] = set_cmd % set_val + upgradedebuglog("save_and_set_value modify set cmd to %s" % config["cmd"]) + else: + config["value"] = set_val + upgradedebuglog("save_and_set_value modify set val to %s" % config["value"]) + + ret, log = set_value(config) + if ret is False: + upgradeerror(log) + return False, log + return True, "save and set value success" + + def recover_save_value(self, cfg_list): + total_err = 0 + for config in cfg_list: + upgradedebuglog("config: %s, recover save value" % config) + val = config.get("save_value", None) + if val is None: + upgradeerror("recover_save_value lack of save_value config") + total_err -= 1 + continue + gettype = config.get("gettype", None) + set_cmd = config.get("set_cmd", None) + if gettype == "cmd": + config["cmd"] = set_cmd % val + upgradedebuglog("recover_save_value modify set cmd to %s" % config["cmd"]) + else: + config["value"] = val + upgradedebuglog("recover_save_value modify set val to %s" % config["value"]) + + ret, log = set_value(config) + if ret is False: + upgradeerror("recover save value write failed, log: %s" % log) + total_err -= 1 + else: + upgradedebuglog("recover save value success") + if total_err < 0: + return False, "recover save value failed" + return True, "recover save value success" + + def check_slot_present(self, slot_present_config): + presentbit = slot_present_config.get('presentbit') + ret, value = get_value(slot_present_config) + if ret is False: + return "NOT OK" + if isinstance(value, str): + val_t = int(value, 16) + else: + val_t = value + val_t = (val_t & (1 << presentbit)) >> presentbit + if val_t != slot_present_config.get('okval'): + status = "ABSENT" + else: + status = "PRESENT" + return status + + def linecard_present_check(self, slot_present_config): + present_status = self.check_slot_present(slot_present_config) + if present_status == "NOT OK": + return ERR_FW_DEVICE_ACCESS, "get slot present status failed." + if present_status == "ABSENT": + return ERR_FW_CARD_ABSENT, "slot absent" + return CHECK_OK, "slot present" + + def subprocess_warm_upgrade(self, config, file, main_type, sub_type, slot): + dev_name = config.get("name", None) + status, output = self.subprocess_firmware_upgrade(config, file, main_type, sub_type, slot) + if status is False: + upgradeerror("%s warm upgrade failed" % dev_name) + return False, output + command = "warm_upgrade.py %s 0x%x 0x%x %s %s %s" % (file, main_type, sub_type, slot, self.filetype, self.chain) + upgradedebuglog("warm upgrade cmd: %s" % command) + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(command) + else: + status, output = exec_os_cmd(command) + if status: + upgradeerror("%s warm upgrade failed" % dev_name) + return False, output + upgradedebuglog("%s warm upgrade success" % dev_name) + return True, "upgrade success" + + def do_fw_upg_init_cmd(self, dev_name, init_cmd_list): + # pre operation + try: + for init_cmd_config in init_cmd_list: + ret, log = set_value(init_cmd_config) + if ret is False: + upgradeerror("%s do init cmd: %s failed, msg: %s" % (dev_name, init_cmd_config, log)) + return False, log + msg = "%s firmware init cmd all set success" % dev_name + upgradedebuglog(msg) + return True, msg + except Exception as e: + return False, str(e) + + def do_fw_upg_finish_cmd(self, dev_name, finish_cmd_list): + # end operation + ret = 0 + for finish_cmd_config in finish_cmd_list: + ret_t, log = set_value(finish_cmd_config) + if ret_t is False: + upgradeerror("%s do finish cmd: %s failed, msg: %s" % (dev_name, finish_cmd_config, log)) + ret = -1 + if ret != 0: + msg = "%s firmware finish cmd exec failed" % dev_name + upgradeerror(msg) + return False, msg + msg = "%s firmware finish cmd all set success" % dev_name + upgradedebuglog(msg) + return True, msg + + def subprocess_firmware_upgrade(self, config, file, main_type, sub_type, slot): + dev_name = config.get("name", None) + init_cmd_list = config.get("init_cmd", []) + finish_cmd_list = config.get("finish_cmd", []) + try: + ret, log = self.do_fw_upg_init_cmd(dev_name, init_cmd_list) + if ret is False: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + time.sleep(0.5) # delay 0.5s after execute init_cmd + command = "firmware_upgrade %s 0x%x 0x%x %s" % (file, main_type, sub_type, slot) + upgradedebuglog("firmware upgrade cmd: %s" % command) + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(command) + else: + status, output = exec_os_cmd(command) + if status: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + upgradeerror("%s firmware upgrade failed, msg: %s" % (dev_name, output)) + return False, output + upgradedebuglog("%s firmware upgrade success" % dev_name) + ret, log = self.do_fw_upg_finish_cmd(dev_name, init_cmd_list) + if ret is False: + return False, log + return True, "upgrade success" + except Exception as e: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, str(e) + + def subprocess_test_upgrade(self, config, file, main_type, sub_type, slot): + dev_name = config.get("name", None) + init_cmd_list = config.get("init_cmd", []) + finish_cmd_list = config.get("finish_cmd", []) + try: + ret, log = self.do_fw_upg_init_cmd(dev_name, init_cmd_list) + if ret is False: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + time.sleep(0.5) # delay 0.5s after execute init_cmd + command = "firmware_upgrade test %s 0x%x 0x%x %s" % (file, main_type, sub_type, slot) + upgradedebuglog("firmware upgrade cmd: %s" % command) + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(command) + else: + status, output = exec_os_cmd(command) + if status: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + upgradeerror("%s test upgrade failed, msg: %s" % (dev_name, output)) + return False, output + upgradedebuglog("%s test upgrade success" % dev_name) + ret, log = self.do_fw_upg_finish_cmd(dev_name, init_cmd_list) + if ret is False: + return False, log + return True, "upgrade success" + except Exception as e: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, str(e) + + def subprocess_bmc_upgrade(self, config, file, chip_select, erase_type): + dev_name = config.get("name", None) + init_cmd_list = config.get("init_cmd", []) + finish_cmd_list = config.get("finish_cmd", []) + save_set_reg_list = config.get("save_set_reg", []) + try: + # save and set reg + ret, log = self.save_and_set_value(save_set_reg_list) + if ret is False: + upgradeerror(log) + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + upgradedebuglog("%s save and set cmd all set success" % dev_name) + time.sleep(0.5) # delay 0.5s after execute save and set reg + + # pre operation + ret, log = self.do_fw_upg_init_cmd(dev_name, init_cmd_list) + if ret is False: + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + + upgradedebuglog("%s bmc init cmd all set success" % dev_name) + time.sleep(0.5) # delay 0.5s after execute init_cmd + + command = "fw_upgrade upgrade %s %s %s" % (file, chip_select, erase_type) + upgradedebuglog("fw_upgrade upgrade cmd: %s" % command) + status, output = exec_os_cmd_log(command) + if status: + upgradeerror("%s bmc upgrade failed" % dev_name) + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, output + upgradedebuglog("%s bmc upgrade success" % dev_name) + + ret1, log1 = self.recover_save_value(save_set_reg_list) + if ret1 is False: + upgradeerror("bmc upgrade recover save value failed, msg: %s" % log1) + ret2, log2 = self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + if ret2 is False: + upgradeerror("bmc upgrade do finish command failed, msg: %s" % log2) + if ret1 is False or ret2 is False: + return False, "bmc upgrade do recover save value or finish command failed" + return True, "upgrade success" + + except Exception as e: + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, str(e) + + def file_head_param_check(self, head_info_config): + try: + self.DEVTYPE = head_info_config.get('DEVTYPE', None) + self.SUBTYPE = head_info_config.get('SUBTYPE', '0') + self.TYPE = head_info_config.get('TYPE', None) + self.CHAIN = head_info_config.get('CHAIN', None) + self.CHIPNAME = head_info_config.get('CHIPNAME', None) + self.VERSION = head_info_config.get('VERSION', None) + self.FILETYPE = head_info_config.get('FILETYPE', None) + self.CRC = head_info_config.get('CRC', None) + + if self.devtype != int(self.DEVTYPE, 16): + return ERR_FW_HEAD_CHECK, ("no support %s devtype" % self.DEVTYPE) + + if self.SUBTYPE is not None: + self.SUBTYPE_LIST = self.SUBTYPE.split(',') + self.SUBTYPE_LIST = [int(tmp_subtype, base=16) for tmp_subtype in self.SUBTYPE_LIST] + if len(self.SUBTYPE) != 0 and self.subtype not in self.SUBTYPE_LIST: + return ERR_FW_HEAD_CHECK, ("no support %s SUBTYPE" % self.SUBTYPE) + + if len(self.CHAIN) == 0 or len(self.FILETYPE) == 0: + return ERR_FW_HEAD_CHECK, ("CHAIN:%s, FILETYPE:%s get failed" % (self.CHAIN, self.FILETYPE)) + self.chain = int(self.CHAIN) + self.filetype = self.FILETYPE + upgradedebuglog("file head param: devtype:0x%x, subtype:0x%x, chain:%s, filetype:%s" + % (self.devtype, self.subtype, self.chain, self.filetype)) + return CHECK_OK, "SUCCESS" + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def parse_file_head(self, file): + try: + self.head_info_config = {} + with open(file, 'r', errors='ignore') as fd: + rdbuf = fd.read() + upgradedebuglog("start parse upgrade file head") + file_head_start = rdbuf.index('FILEHEADER(\n') # ponit to F + file_head_start += rdbuf[file_head_start:].index('\n') # ponit to \n + file_head_end = rdbuf.index(')\n') + header_buf = rdbuf[file_head_start + 1: file_head_end - 1] + upgradedebuglog("upgrade file head find FILEHEADER") + for line in header_buf.split('\n'): + head_list = line.split('=', 1) + head_key = head_list[0] + head_val = head_list[1] + self.head_info_config[head_key] = head_val + upgradedebuglog("file: %s head_info_config: %s" % (file, self.head_info_config)) + return CHECK_OK, "SUCCESS" + except Exception as e: + msg = "parse %s head failed, msg: %s" % (file, str(e)) + upgradeerror(msg) + return ERR_FW_RAISE_EXCEPTION, msg + + def get_file_size_k(self, file): + fsize = os.path.getsize(file) + fsize = fsize / float(1024) + return round(fsize, 2) + + def get_device_model(self, conf): + ret, val = get_value(conf) + if ret is False: + msg = "get device model failed, msg: %s" % val + return False, msg + decode_val = conf.get("decode") + if decode_val is None: + return True, val + for k, v in decode_val.items(): + if val == v: + return True, k + msg = "device model decode error, val: %s" % val + return False, msg + + def upgrade_fool_proofing(self, conf): + try: + status, dev_model = self.get_device_model(conf) + if status is False: + msg = "upgrade fool proofing get device model failed, msg: %s" % dev_model + upgradeerror(msg) + return False, msg + upgradedebuglog("get device model success, device model: %s" % dev_model) + if dev_model != self.VERSION: + msg = "upgrade fool proofing failed, device model: %s, upgrade file version: %s" % ( + dev_model, self.VERSION) + upgradedebuglog(msg) + return False, msg + msg = "upgrade fool proofing pass, device model: %s, upgrade file version: %s" % (dev_model, self.VERSION) + upgradedebuglog(msg) + return True, msg + except Exception as e: + upgradeerror(str(e)) + return False, str(e) + + def upgrading(self, config, file, devtype, subtype, slot, option_flag, erase_type=None): + dev_name = config.get("name", None) + if option_flag == COLD_UPGRADE: + status, output = self.subprocess_firmware_upgrade(config, file, devtype, subtype, slot) + elif option_flag == WARM_UPGRADE: + status, output = self.subprocess_warm_upgrade(config, file, devtype, subtype, slot) + elif option_flag == TEST_UPGRADE: + status, output = self.subprocess_test_upgrade(config, file, devtype, subtype, slot) + elif option_flag == BMC_UPGRADE: + status, output = self.subprocess_bmc_upgrade(config, file, slot, erase_type) + else: + log = "%s set error option flag" % dev_name + upgradeerror(log) + return False, log + + if status is False: + upgradeerror("%s upgrade failed" % dev_name) + return False, output + upgradedebuglog("%s upgrade success" % dev_name) + return True, "upgrade success" + + def initial_check(self, file, slot, upg_type): + try: + upgradedebuglog("BasePlatform initial_check, file: %s, slot: %s, upg_type: %s" % + (file, slot, upg_type)) + + upgradedebuglog("do file exist check...") + if not os.path.isfile(file): + msg = "%s not found" % file + upgradedebuglog(msg) + return ERR_FW_FILE_FOUND, msg + upgradedebuglog("file exist check ok") + + slot_name = "slot%d" % slot + slot_config = self.upgrade_param.get(slot_name, {}) + slot_present_config = slot_config.get("present", {}) + if len(slot_present_config) != 0: + upgradedebuglog("do %s present check..." % slot_name) + ret, log = self.linecard_present_check(slot_present_config) + if ret != CHECK_OK: + msg = "check %s present error, msg: %s" % (slot_name, log) + upgradedebuglog(msg) + return ret, msg + upgradedebuglog("%s present check ok" % slot_name) + + upgradedebuglog("do file head parse...") + self.subtype = slot_config.get("subtype", 0) + ret, log = self.parse_file_head(file) + if ret != CHECK_OK: + return ret, log + upgradedebuglog("file head parse success") + + upgradedebuglog("do file head check...") + ret, log = self.file_head_param_check(self.head_info_config) + if ret != CHECK_OK: + msg = "file: %s, head check failed, msg: %s" % (file, log) + upgradedebuglog(msg) + return ret, msg + upgradedebuglog("file head check ok") + + upgradedebuglog("get upgrade chain config...") + filetype_config = slot_config.get(self.filetype, {}) + if len(filetype_config) == 0: + msg = "file: %s filetype: %s no support" % (file, self.filetype) + upgradedebuglog(msg) + return ERR_FW_CONFIG_FOUND, msg + chain_num = "chain%s" % self.chain + chain_config = filetype_config.get(chain_num, {}) + if len(chain_config) == 0: + msg = "file: %s get %s config failed" % (file, chain_num) + upgradedebuglog(msg) + return ERR_FW_CONFIG_FOUND, msg + self.cold_chain_config = chain_config + upgradedebuglog("get %s filetype: %s %s config success" % (slot_name, self.filetype, chain_num)) + + fool_proofing = chain_config.get("fool_proofing") + if fool_proofing is not None: + upgradedebuglog("do fool proofing check...") + status, log = self.upgrade_fool_proofing(fool_proofing) + if status is False: + msg = "upgrade fool proofing check failed, msg: %s" % log + upgradedebuglog(msg) + return ERR_FW_FOOL_PROOF, msg + upgradedebuglog("do fool proofing check ok") + + if upg_type == WARM_UPGRADE: + upgradedebuglog("do support warm upgrade check...") + if chain_config.get("is_support_warm_upg", 0) != 1: + msg = "file: %s %s chain config not support warm upgrade" % (file, slot_name) + upgradedebuglog(msg) + return ERR_FW_NOSUPPORT_HOT, msg + upgradedebuglog("file: %s %s chain config support warm upgrade" % (file, slot_name)) + + filesizecheck = chain_config.get("filesizecheck", 0) + if filesizecheck != 0: + upgradedebuglog("do file size check...") + file_size = self.get_file_size_k(file) + if file_size > filesizecheck: + msg = "file: %s size: %s exceed %s" % (file, file_size, filesizecheck) + upgradedebuglog(msg) + return ERR_FW_CHECK_SIZE, msg + msg = "file: %s size: %s check ok" % (file, file_size) + upgradedebuglog(msg) + + msg = "file: %s slot: %s upgrade type: %s check ok" % (file, slot, upg_type) + upgradedebuglog(msg) + return CHECK_OK, msg + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def do_upgrade(self, file, slot, upg_type): + try: + ret, log = self.initial_check(file, slot, upg_type) + if ret != CHECK_OK: + return ret, log + + # start upgrading + upgradedebuglog("start upgrading") + ret, log = self.upgrading(self.cold_chain_config, file, self.devtype, self.subtype, slot, upg_type) + if ret is False: + upgradeerror("upgrade failed") + return ERR_FW_UPGRADE, log + upgradedebuglog("upgrade success") + return FIRMWARE_SUCCESS, "SUCCESS" + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def do_pre_check(self, conf): + ret, val = get_value(conf) + if ret is False: + msg = "pre check get value failed, msg: %s" % val + return False, msg + ok_val = conf.get("ok_val") + if val == ok_val: + msg = "pre check success, ok_val: %s, get value: %s" % (ok_val, val) + return True, msg + msg = "pre check failed, ok_val: %s, get value: %s" % (ok_val, val) + return False, msg + + def do_test(self, device, slot): + try: + # slot present check + slot_name = "slot%d" % slot + slot_config = self.upgrade_param.get(slot_name, {}) + slot_present_config = slot_config.get("present", {}) + if len(slot_present_config) != 0: + ret, log = self.linecard_present_check(slot_present_config) + if ret != CHECK_OK: + msg = "check %s present error, msg: %s" % (slot_name, log) + upgradedebuglog(msg) + return ret, msg + upgradedebuglog("%s present" % slot_name) + + # get list of devices to be tested + test_config = slot_config.get("TEST", {}) + if len(test_config) == 0: + return ERR_FW_CONFIG_FOUND, "test config no found" + device_list = test_config.get(device, []) + if len(device_list) == 0: + return ERR_FW_CONFIG_FOUND, ("logic device %s test config list not found" % device) + + # test_file existence check + for test_config in device_list: + chain_num = test_config.get("chain", None) + test_file = test_config.get("file", None) + display_name = test_config.get("display_name", None) + if chain_num is None or test_file is None or display_name is None: + log = "test_config:%s lack of config" % test_config + upgradeerror(log) + return ERR_FW_CONFIG_FOUND, log + if not os.path.isfile(test_file): + return ERR_FW_FILE_FOUND, ("%s not found" % test_file) + + # start testing + RET = 0 + pre_check_failed = 0 + pre_check_failed_summary = "" + failed_summary = "chain test failed.\ntest fail chain:" + success_summary = "test success chain:" + for test_config in device_list: + chain_num = test_config.get("chain", None) + test_file = test_config.get("file", None) + display_name = test_config.get("display_name", None) + pre_check_conf = test_config.get("pre_check", None) + if pre_check_conf is not None: + status, msg = self.do_pre_check(pre_check_conf) + if status is False: + pre_check_failed += 1 + log = "\nchain:%d, name:%s, pre check failed, msg: %s" % (chain_num, display_name, msg) + upgradedebuglog(log) + pre_check_failed_summary += log + continue + upgradedebuglog("chain:%d, name:%s, pre check ok, msg: %s" % (chain_num, display_name, msg)) + ret, log = self.do_upgrade(test_file, slot, TEST_UPGRADE) + if ret != FIRMWARE_SUCCESS: + RET = -1 + upgradeerror("chain:%d, name:%s test failed" % (chain_num, display_name)) + failed_summary += "\n chain:%d, name:%s;" % (chain_num, display_name) + else: + upgradedebuglog("chain:%d, name:%s test success" % (chain_num, display_name)) + success_summary += "\n chain:%d, name:%s;" % (chain_num, display_name) + if RET != 0: + return ERR_FW_UPGRADE, failed_summary + if pre_check_failed == len(device_list): + return ERR_FW_NO_FILE_SUCCESS, failed_summary + pre_check_failed_summary + return FIRMWARE_SUCCESS, success_summary + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def do_test_main(self, device, slot): + print("+================================+") + print("|Doing upgrade test, please wait.|") + ret, log = self.do_test(device, slot) + if ret == FIRMWARE_SUCCESS: + print("| test succeeded! |") + print("+================================+") + print(log) + sys.exit(0) + else: + print("| test failed! |") + print("+================================+") + print("FAILED REASON:") + print(log) + sys.exit(1) + + def do_bmc_upgrade_main(self, file, chip_select, erase_type): + bmc_upgrade_config = self.upgrade_param.get("BMC", {}) + ret, log = self.upgrading(bmc_upgrade_config, file, self.devtype, + self.subtype, chip_select, BMC_UPGRADE, erase_type) + if ret is True: + print("===========upgrade succeeded!============") + sys.exit(0) + else: + print("============upgrade failed!==============") + print("FAILED REASON:") + print("%s" % log) + sys.exit(1) + + +class FileUpg(object): + def __init__(self, config, file, devtype, subtype, slot, filetype, chain, upg_type): + self.config = config + self.file = file + self.devtype = devtype + self.subtype = subtype + self.slot = slot + self.filetype = filetype + self.chain = chain + self.upg_type = upg_type + + def __repr__(self): + return "file:%s slot:%d" % (self.file, self.slot) + + +class FwUpg(object): + def __init__(self): + self.upg_platform = BasePlatform() + self.warm_upg_platform = WarmBasePlatform() + self.max_slot_num = self.upg_platform.max_slot_num + self.file_list = [] + + def do_file_refresh(self, fw_upg_instance): + fw_upg_config = fw_upg_instance.config + fw_upg_file = fw_upg_instance.file + fw_upg_devtype = fw_upg_instance.devtype + fw_upg_subype = fw_upg_instance.subtype + fw_upg_slot = fw_upg_instance.slot + fw_upg_filetype = fw_upg_instance.filetype + fw_upg_chain = fw_upg_instance.chain + dev_name = fw_upg_config.get("name", None) + upgradedebuglog("%s start warm upgrade, file: %s, devtype:0x%x, subype: 0x%x, slot: %d, filetype: %s, chain: %d" % + (dev_name, fw_upg_file, fw_upg_devtype, fw_upg_subype, fw_upg_slot, fw_upg_filetype, fw_upg_chain)) + status, output = self.warm_upg_platform.do_warmupgrade(fw_upg_file, fw_upg_devtype, fw_upg_subype, fw_upg_slot, + fw_upg_filetype, fw_upg_chain) + if status is False: + upgradeerror("%s warm upgrade failed, msg: %s" % (dev_name, output)) + return False, output + upgradedebuglog("%s warm upgrade success" % dev_name) + return True, "upgrade success" + + def do_refresh(self): + try: + exec_os_cmd("touch %s" % WARM_UPGRADE_STARTED_FLAG) + exec_os_cmd("sync") + + # stop upper layer services access + ret, log = self.warm_upg_platform.stop_services_access() + if ret is False: + upgradeerror("stop upper layer services access failed") + upgradeerror(log) + return ERR_FW_UPGRADE, log + upgradedebuglog("stop upper layer services access success") + + for file_instance in self.file_list: + file_info = repr(file_instance) + ret, log = self.do_file_refresh(file_instance) + if ret is False: + msg = "%s refresh failed, ret:%s, \n log:%s." % (file_info, ret, log) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + upgradedebuglog("%s refresh success." % file_info) + msg = "all files refresh success." + return FIRMWARE_SUCCESS, msg + except Exception as e: + msg = "do warm upg exception happend. log:%s" % str(e) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + finally: + self.warm_upg_platform.start_services_access() + if os.path.isfile(WARM_UPGRADE_STARTED_FLAG): + exec_os_cmd("rm -rf %s" % WARM_UPGRADE_STARTED_FLAG) + exec_os_cmd("sync") + + def do_file_cold_upg(self, fw_upg_instance): + try: + upgradedebuglog("start cold upgrade") + fw_upg_config = fw_upg_instance.config + fw_upg_file = fw_upg_instance.file + fw_upg_devtype = fw_upg_instance.devtype + fw_upg_subype = fw_upg_instance.subtype + fw_upg_slot = fw_upg_instance.slot + ret, log = self.upg_platform.upgrading( + fw_upg_config, fw_upg_file, fw_upg_devtype, fw_upg_subype, fw_upg_slot, COLD_UPGRADE) + if ret is False: + upgradeerror("cold upgrade %s slot%d failed, log:%s" % (fw_upg_file, fw_upg_slot, log)) + return ERR_FW_UPGRADE, log + log = "cold upgrade %s slot%d success" % (fw_upg_file, fw_upg_slot) + upgradedebuglog(log) + return FIRMWARE_SUCCESS, log + except Exception as e: + msg = "do cold upg exception happend. log:%s" % str(e) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + + def do_file_init_check(self, file_path, slot, upg_type): + upgradedebuglog("do_file_init_check, file_path: %s, slot: %s, upg_type: %s" % (file_path, slot, upg_type)) + + if slot is None: # traverse all slots + for i in range(0, self.max_slot_num + 1): + ret, log = self.upg_platform.initial_check(file_path, i, upg_type) + if ret != CHECK_OK: + upgradedebuglog( + "file: %s, slot%d initial check not ok, ret: %d, msg: %s" % + (file_path, i, ret, log)) + accept_error = (ERR_FW_CARD_ABSENT, ERR_FW_HEAD_CHECK, ERR_FW_FOOL_PROOF) + if ret in accept_error: + msg = "file: %s, slot%d initial check ret: %d, acceptable error." % (file_path, i, ret) + upgradedebuglog(msg) + continue + return ret, log + file_instance = FileUpg(self.upg_platform.cold_chain_config, file_path, self.upg_platform.devtype, + self.upg_platform.subtype, i, self.upg_platform.filetype, self.upg_platform.chain, upg_type) + self.file_list.append(file_instance) + else: + slot = int(slot, 10) + ret, log = self.upg_platform.initial_check(file_path, slot, upg_type) + if ret != CHECK_OK: + msg = "file: %s, slot%d initial check not ok, ret: %d, msg: %s" % (file_path, slot, ret, log) + return ret, msg + file_instance = FileUpg(self.upg_platform.cold_chain_config, file_path, self.upg_platform.devtype, + self.upg_platform.subtype, slot, self.upg_platform.filetype, self.upg_platform.chain, upg_type) + self.file_list.append(file_instance) + msg = "file: %s all slots init check ok" % file_path + return CHECK_OK, msg + + def do_dir_init_check(self, path, slot, upg_type): + for root, dirs, names in os.walk(path): + # root: directory absolute path + # dirs: folder path collection under directory + # names: file path collection under directory + for filename in names: + # file_path is file absolute path + file_path = os.path.join(root, filename) + ret, log = self.do_file_init_check(file_path, slot, upg_type) + if ret != CHECK_OK: + return ret, log + msg = "all files in dir have been check ok" + upgradedebuglog(msg) + return CHECK_OK, msg + + def do_fw_upg(self, path, slot, upg_type): + match_zip_file_flag = False + try: + upgradedebuglog("do_fw_upg, path: %s, slot: %s, upg_type: %s" % (path, slot, upg_type)) + if slot is not None and not slot.isdigit(): + msg = "invalid slot param: %s" % slot + upgradeerror(msg) + return ERR_FW_INVALID_PARAM, msg + + upgradedebuglog("start init check") + if os.path.isfile(path) and path.endswith(".zip"): + upgradedebuglog("firmware upgrade via compressed package: %s" % path) + # remove origin firmware upgrade file + exec_os_cmd("rm -rf %s" % UPGRADE_FILE_DIR) + cmd = "unzip -o %s -d /tmp/" % path + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(cmd) + else: + status, output = exec_os_cmd(cmd) + if status: + msg = "unzip %s failed, log: %s" % (path, output) + upgradeerror(msg) + return ERR_FW_UNZIP_FAILED, msg + match_zip_file_flag = True + path = UPGRADE_FILE_DIR + + if os.path.isdir(path): + ret, msg = self.do_dir_init_check(path, slot, upg_type) + elif os.path.isfile(path): + ret, msg = self.do_file_init_check(path, slot, upg_type) + else: + ret = ERR_FW_FILE_FOUND + msg = "path: %s not found" % path + upgradeerror(msg) + + if ret != CHECK_OK: + return ret, msg + + # self.file_list is a collection of all check ok files + if len(self.file_list) == 0: + msg = "all file upgrade check not be satisfied." + upgradeerror(msg) + return ERR_FW_NO_FILE_SUCCESS, msg + + SUCCUSS_FILE_SUMMARY = "SUCCESS FILE: \n" + # file cold upgrade + upgradedebuglog("start all files cold upgrade") + for file_instance in self.file_list: + file_info = repr(file_instance) + ret, log = self.do_file_cold_upg(file_instance) + if ret != FIRMWARE_SUCCESS: + msg = "%s cold upgrade failed, ret:%d, \n log:\n%s." % (file_info, ret, log) + upgradeerror(msg) + return ret, msg + SUCCUSS_FILE_SUMMARY += "%s \n" % file_info + upgradedebuglog("%s cold upgrade success." % file_info) + + # file refresh upgrade + if upg_type == WARM_UPGRADE: + upgradedebuglog("start all files refresh upgrade") + ret, log = self.do_refresh() + if ret != FIRMWARE_SUCCESS: + return ret, log + + msg = "all file upgrade success" + upgradedebuglog(msg) + return FIRMWARE_SUCCESS, SUCCUSS_FILE_SUMMARY + except Exception as e: + msg = "do dir upgrade exception happend. log: %s" % str(e) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + finally: + if match_zip_file_flag is True: + exec_os_cmd("rm -rf %s" % UPGRADE_FILE_DIR) + + def fw_upg(self, path, slot, upg_type): + print("+================================+") + print("| Doing upgrade, please wait... |") + ret, log = self.do_fw_upg(path, slot, upg_type) + if ret == FIRMWARE_SUCCESS: + print("| upgrade succeeded! |") + print("+================================+") + print(log) + sys.exit(0) + else: + print("| upgrade failed! |") + print("+================================+") + print("FAILED REASON:") + print("%s" % log) + sys.exit(1) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''upgrade script''' + + +# cold upgrade +@main.command() +@click.argument('file_name', required=True) +@click.argument('slot_num', required=False, default=None) +def cold(file_name, slot_num): + '''cold upgrade''' + fwupg = FwUpg() + fwupg.fw_upg(file_name, slot_num, COLD_UPGRADE) + + +# warm upgrade +@main.command() +@click.argument('file_name', required=True) +@click.argument('slot_num', required=False, default=None) +def warm(file_name, slot_num): + '''warm upgrade''' + fwupg = FwUpg() + fwupg.fw_upg(file_name, slot_num, WARM_UPGRADE) + + +# test upgrade +@main.command() +@click.argument('device', required=True) +@click.argument('slot_num', required=True) +def test(device, slot_num): + '''upgrade test''' + platform = BasePlatform() + platform.do_test_main(device, int(slot_num)) + + +# BMC upgrade +@main.command() +@click.argument('file_name', required=True) +@click.argument('chip_select', required=False, default="2") +@click.argument('erase_type', required=False, default="full") +def bmc(file_name, chip_select, erase_type): + '''BMC upgrade''' + platform = BasePlatform() + platform.do_bmc_upgrade_main(file_name, chip_select, erase_type) + + +if __name__ == '__main__': + signal_init() + debug_init() + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py new file mode 100755 index 000000000000..69a310faa606 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py @@ -0,0 +1,514 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import sys +import os +import time +import syslog +import signal +import click +from platform_util import get_value, set_value, exec_os_cmd, exec_os_cmd_log +from platform_config import WARM_UPGRADE_PARAM + + +WARM_UPGRADE_DEBUG_FILE = "/etc/.warm_upgrade_debug_flag" + +WARMUPGRADEDEBUG = 1 + +debuglevel = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def debug_init(): + global debuglevel + if os.path.exists(WARM_UPGRADE_DEBUG_FILE): + debuglevel = debuglevel | WARMUPGRADEDEBUG + else: + debuglevel = debuglevel & ~(WARMUPGRADEDEBUG) + + +def warmupgradewarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def warmupgradecriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def warmupgradeerror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def warmupgradedebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if WARMUPGRADEDEBUG & debuglevel: + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def subprocess_warm_upgrade(file, main_type, sub_type, slot): + command = "firmware_upgrade %s 0x%x 0x%x %s" % (file, main_type, sub_type, slot) + warmupgradedebuglog("warm upgrade firmware cmd:%s" % command) + if os.path.exists(WARM_UPGRADE_DEBUG_FILE): + return exec_os_cmd_log(command) + return exec_os_cmd(command) + + +def signal_init(): + signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore ctrl+c signal + signal.signal(signal.SIGTERM, signal.SIG_IGN) # ignore kill signal + signal.signal(signal.SIGTSTP, signal.SIG_IGN) # ignore ctrl+z signal + + +class RefreshUpgradeBase(object): + + def __init__(self, config, slot_num, devtype, subtype): + self._config = config + self._slot_num = slot_num + self._devtype = devtype + self._subtype = subtype + self.device_name = self._config.get("name", None) + self.refresh_file = self._config.get("refresh_file", None) + self.init_cmd_list = self._config.get("init_cmd", []) + self.save_set_reg_list = self._config.get("save_set_reg", []) + self.rw_recover_reg_list = self._config.get("rw_recover_reg", []) + self.after_upgrade_delay = self._config.get("after_upgrade_delay", None) + self.after_upgrade_delay_timeout = self._config.get("after_upgrade_delay_timeout", None) + self.refresh_finish_flag_check_config = self._config.get("refresh_finish_flag_check", None) + self.access_check_reg_config = self._config.get("access_check_reg", {}) + self.time_delay = 0 + self.finish_cmd_list = self._config.get("finish_cmd", []) + + def get_config(self): + pass + + def get_slot_num(self): + pass + + def save_value(self, cfg_list): + for config in cfg_list: + ret, val = get_value(config) + if ret: + config["value"] = val + else: + warmupgradeerror(val) + return False, val + return True, "save value success" + + def save_and_set_value(self, cfg_list): + for config in cfg_list: + ret, val = get_value(config) + if ret: + config["save_value"] = val + else: + warmupgradeerror(val) + return False, "get save value fail" + set_val = config.get("set_value", None) + if set_val is not None: + config["value"] = set_val + else: + warmupgradeerror("save_and_set_value lack of set_val config") + return False, "set value is not config" + ret, log = set_value(config) + if ret is False: + warmupgradeerror(log) + return False, log + return True, "save value success" + + def recover_value(self, cfg_list): + fail_flag = 0 + for config in cfg_list: + ret, log = set_value(config) + if ret is False: + fail_flag = -1 + warmupgradeerror("recover_value set_value failed, log: %s" % log) + if fail_flag != 0: + warmupgradeerror("recover_value write failed") + return False, "recover write failed" + return True, "recover write success" + + def recover_save_value(self, cfg_list): + total_err = 0 + for config in cfg_list: + val = config.get("save_value", None) + if val is None: + warmupgradeerror("recover_save_value lack of save_value config") + total_err -= 1 + continue + config["value"] = val + ret, log = set_value(config) + if ret is False: + total_err -= 1 + warmupgradeerror("recover save value write failed, log: %s" % log) + else: + warmupgradedebuglog("recover save value success") + if total_err < 0: + return False, "recover save value failed" + return True, "recover save value success" + + def do_fw_upg_init_cmd(self, init_cmd_list): + # pre operation + try: + for init_cmd_config in init_cmd_list: + ret, log = set_value(init_cmd_config) + if ret is False: + warmupgradeerror("%s do init cmd: %s failed, msg: %s" % (self.device_name, init_cmd_config, log)) + return False, log + msg = "%s warm upgrade init cmd all set success" % self.device_name + warmupgradedebuglog(msg) + return True, msg + except Exception as e: + return False, str(e) + + def do_fw_upg_finish_cmd(self, finish_cmd_list): + # end operation + total_err = 0 + for finish_cmd_config in finish_cmd_list: + ret_t, log = set_value(finish_cmd_config) + if ret_t is False: + warmupgradeerror("%s do finish cmd: %s failed, msg: %s" % (self.device_name, finish_cmd_config, log)) + total_err -= 1 + if total_err < 0: + msg = "%s warm upgrade finish cmd exec failed" % self.device_name + warmupgradeerror(msg) + return False, msg + msg = "%s warm upgrade finish cmd all set success" % self.device_name + warmupgradedebuglog(msg) + return True, msg + + def access_test(self, config): + # polling execute command + polling_cmd_list = config.get("polling_cmd", []) + for polling_cmd_config in polling_cmd_list: + ret, log = set_value(polling_cmd_config) + if ret is False: + warmupgradeerror(log) + return False + polling_delay = config.get("polling_delay", None) + if polling_delay is not None: + time.sleep(polling_delay) + + # record check val + check_val = config.get("value", None) + # write value + ret, log = set_value(config) + if ret is False: + warmupgradeerror(log) + return False + # read value + ret, val = get_value(config) + if ret is False: + warmupgradeerror(val) + return False + + # compare write and read val + warmupgradedebuglog("check_val:%s" % check_val) + warmupgradedebuglog("get_value:%s" % val) + if val != check_val: + warmupgradeerror("check_val:%s != get_value:%s" % (check_val, val)) + return False + return True + + def check_value(self, config): + # record check val + check_val = config.get("value", None) + ret, val = get_value(config) + if ret is False: + warmupgradeerror(val) + return False + # compare write and read val + warmupgradedebuglog("check_val:%s" % check_val) + warmupgradedebuglog("get_value:%s" % val) + if val != check_val: + warmupgradeerror("check_val:%s != get_value:%s" % (check_val, val)) + return False + return True + + def refresh_file_upgrade(self): + try: + warmupgradedebuglog("start %s warm upgrading" % self.device_name) + + # save and set reg + ret, log = self.save_and_set_value(self.save_set_reg_list) + if ret is False: + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s save and set reg cmd all set success" % self.device_name) + time.sleep(0.5) # delay 0.5s after execute save and set reg + + # pre operation + ret, log = self.do_fw_upg_init_cmd(self.init_cmd_list) + if ret is False: + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + time.sleep(0.5) # delay 0.5s after execute init_cmd + + # save reg + ret, log = self.save_value(self.rw_recover_reg_list) + if ret is False: + warmupgradeerror("%s save reg failed" % self.device_name) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s all reg save success" % self.device_name) + + # upgrade refresh file + if self.refresh_file is not None: + status, output = subprocess_warm_upgrade( + self.refresh_file, self._devtype, self._subtype, self._slot_num) + if status: + log = "%s refresh file upg failed, msg: %s" % (self.device_name, output) + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s refresh file upg success" % self.device_name) + + # delay the preset time after the upgrade is complete + if self.after_upgrade_delay is not None: + time.sleep(self.after_upgrade_delay) + + # check something in the timeout period + if self.after_upgrade_delay_timeout is not None: + while self.time_delay < self.after_upgrade_delay_timeout: + + # check refresh finish flag + if self.refresh_finish_flag_check_config is not None: + ret = self.check_value(self.refresh_finish_flag_check_config) + if ret is False: + time.sleep(1) + self.time_delay = self.time_delay + 1 + warmupgradedebuglog("doing refresh_finish_flag_check, time_delay:%s" % self.time_delay) + continue + warmupgradedebuglog("%s upgrade_finish_flag_check success. self.time_delay:%d" + % (self.device_name, self.time_delay)) + + # doing logic device rw access test + ret = self.access_test(self.access_check_reg_config) + if ret: + warmupgradedebuglog( + "%s rw test success. self.time_delay:%d" % + (self.device_name, self.time_delay)) + break + time.sleep(1) + self.time_delay = self.time_delay + 1 + warmupgradedebuglog("doing access_test, self.time_delay:%s" % self.time_delay) + + if self.time_delay >= self.after_upgrade_delay_timeout: + log = "wait %s access test timeout" % self.device_name + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s access test success" % self.device_name) + + # recover reg + ret, log = self.recover_value(self.rw_recover_reg_list) + if ret is False: + warmupgradeerror("recover %s reg failed" % self.device_name) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("recover %s reg success" % self.device_name) + # finally + ret1, log1 = self.recover_save_value(self.save_set_reg_list) + if ret1 is False: + warmupgradeerror("bmc upgrade recover save value failed, msg: %s" % log1) + ret2, log2 = self.do_fw_upg_finish_cmd(self.finish_cmd_list) + if ret2 is False: + warmupgradeerror("bmc upgrade do finish command failed, msg: %s" % log2) + if ret1 is False or ret2 is False: + return False, "upgrading %s recover save value or finish command failed" % self.device_name + return True, "upgrading %s success" % self.device_name + + except Exception as e: + log = "refresh file upgrade Exception happend, error log : %s" % str(e) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + + +class RefreshUpgrade(RefreshUpgradeBase): + + def __init__(self, config, slot_num, devtype, subtype): + super(RefreshUpgrade, self).__init__(config, slot_num, devtype, subtype) + + def get_config(self): + super(RefreshUpgrade, self).get_config() + return self._config + + def get_slot_num(self): + super(RefreshUpgrade, self).get_slot_num() + return self._slot_num + + +class WarmBasePlatform(): + + def __init__(self): + signal_init() + debug_init() + self.warm_upgrade_param = WARM_UPGRADE_PARAM.copy() + self.stop_services_cmd_list = self.warm_upgrade_param.get("stop_services_cmd", []) + self.start_services_cmd_list = self.warm_upgrade_param.get("start_services_cmd", []) + self.__warm_upgrade_config_list = [] + + def execute_command_list(self, cmd_list): + for cmd_item in cmd_list: + warmupgradedebuglog("execute cmd: %s" % cmd_item) + status, output = exec_os_cmd(cmd_item) + if status: + log = "execute %s failed, msg: %s" % (cmd_item, output) + warmupgradeerror(log) + return False, log + return True, "execute success" + + def stop_services_access(self): + return self.execute_command_list(self.stop_services_cmd_list) + + def start_services_access(self): + return self.execute_command_list(self.start_services_cmd_list) + + def check_slot_present(self, slot_present_config): + totalerr = 0 + presentbit = slot_present_config.get('presentbit') + ret, value = get_value(slot_present_config) + if ret is False: + return "NOT OK" + if isinstance(value, str): + val_t = int(value, 16) + else: + val_t = value + val_t = (val_t & (1 << presentbit)) >> presentbit + if val_t != slot_present_config.get('okval'): + status = "ABSENT" + else: + status = "PRESENT" + return status + + def linecard_present_check(self, slot_name, slot_present_config): + present_status = self.check_slot_present(slot_present_config) + present_status_tuple = ("ABSENT", "NOT OK") + if present_status in present_status_tuple: + return False, ("%s not present, warm upgrade exit" % slot_name) + warmupgradedebuglog("%s present" % slot_name) + return True, ("%s present" % slot_name) + + def start_warmupgrade(self): + try: + # start refresh file upgrade process + for dev in self.__warm_upgrade_config_list: + ret, log = dev.refresh_file_upgrade() + if ret is False: + return ret, log + return True, "all success" + except Exception as e: + log = "Exception happend, error log : %s" % str(e) + return False, log + + def do_warmupgrade(self, file, main_type, sub_type, slot, file_type, chain): + try: + # upgrade file existence check + if not os.path.isfile(file): + return False, "%s not found" % file + + # get slot config + slot_name = "slot%d" % slot + slot_config = self.warm_upgrade_param.get(slot_name, {}) + if len(slot_config) == 0: + return False, ("%s config not found" % slot_name) + + # linecard present check + slot_present_config = slot_config.get("present", {}) + if len(slot_present_config) != 0: + ret, log = self.linecard_present_check(slot_name, slot_present_config) + if ret is False: + return False, log + + # match file_type and chain_num get chain_config + file_type_config = slot_config.get(file_type, {}) + chain_name = "chain%d" % chain + chain_list = file_type_config.get(chain_name, []) + self.__warm_upgrade_config_list = [] + for refresh_config in chain_list: + # refresh_file existence check + refresh_file_judge_flag = refresh_config.get("refresh_file_judge_flag", 0) + if refresh_file_judge_flag == 1: + refresh_file = refresh_config.get("refresh_file", None) + if not os.path.isfile(refresh_file): + log = "%s not found" % refresh_file + return False, log + # each refresh_config add as an instance of RefreshUpgrade Class + refresh_instance = RefreshUpgrade(refresh_config, slot, main_type, sub_type) + self.__warm_upgrade_config_list.append(refresh_instance) + + ret, log = self.start_warmupgrade() + if ret is False: + warmupgradeerror("doing warm upgrade failed") + warmupgradeerror(log) + return ret, log + + except Exception as e: + log = "Exception happend, error log : %s" % str(e) + return False, log + return True, "all success" + + def do_warm_upgrade(self, file, main_type, sub_type, slot, file_type, chain): + print("+================================+") + print("|Begin warm upgrade, please wait..|") + ret, log = self.do_warmupgrade(file, main_type, sub_type, slot, file_type, chain) + if ret: + print("| warm upgrade succeeded! |") + print("+================================+") + sys.exit(0) + else: + print("| warm upgrade failed! |") + print("+================================+") + print("FAILED REASON:") + print("%s" % log) + sys.exit(1) + + +@click.group(invoke_without_command=True, context_settings=CONTEXT_SETTINGS) +@click.argument('file', required=True) +@click.argument('main_type', required=True) +@click.argument('sub_type', required=True) +@click.argument('slot', required=True) +@click.argument('file_type', required=True) +@click.argument('chain', required=True) +def main(file, main_type, sub_type, slot, file_type, chain): + '''warm upgrade''' + signal_init() + debug_init() + platform = WarmBasePlatform() + platform.do_warm_upgrade(file, int(main_type, 16), int(sub_type, 16), int(slot), file_type, int(chain)) + + +# warm upgrade +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service b/platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service deleted file mode 100755 index 136034900aaf..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description= ragile Global Initialize I2c drivers. -After=pddf-platform-init.service -Before=pmon.service -DefaultDependencies=no - -[Service] -Type=oneshot -ExecStart=/usr/local/bin/device_i2c.py start -ExecStop=/usr/local/bin/device_i2c.py stop -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target - diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service new file mode 100644 index 000000000000..08a49d695c92 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service @@ -0,0 +1,15 @@ +[Unit] +Description= Global Initialize platform drivers. +After=local-fs.target +Before=pmon.service platform_process.service +#DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_driver.py start +ExecStop=/usr/local/bin/platform_driver.py stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service new file mode 100644 index 000000000000..1ef246156353 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service @@ -0,0 +1,16 @@ +[Unit] +Description= Global Load process. +After=platform_driver.service +Before=determine-reboot-cause.service +Requires=platform_driver.service +#DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_process.py start +ExecStop=/usr/local/bin/platform_process.py stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py new file mode 100644 index 000000000000..b70995a582fc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis", "sfp", "eeprom", "component", "thermal", "psu", "fan", "fan_drawer", "watchdog"] +from . import platform diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py new file mode 100644 index 000000000000..b0ddc8691f2e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py @@ -0,0 +1,530 @@ +#!/usr/bin/env python3 + +############################################################################# +# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + import time + import sys + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.sfp import Sfp + from sonic_platform.psu import Psu + # from sonic_platform.fan import Fan + from sonic_platform.fan_drawer import FanDrawer + from sonic_platform.thermal import Thermal + # from sonic_platform.watchdog import Watchdog + from sonic_platform.component import Component + from sonic_platform.eeprom import Eeprom + from sonic_platform.dcdc import Dcdc + from plat_hal.baseutil import baseutil + + from plat_hal.interface import interface + +except ImportError as error: + raise ImportError(str(error) + "- required module not found")from error + + +class Chassis(ChassisBase): + """ + Platform-specific Chassis class + """ + # List of Dcdc objects representing all dcdc + # available on the chassis + _dcdc_list = None + + STATUS_INSERTED = "1" + STATUS_REMOVED = "0" + STATUS_NORMAL = "0" + STATUS_ABNORMAL = "1" + sfp_present_dict = {} + fan_present_dict = {} + voltage_status_dict = {} + + def __init__(self): + ChassisBase.__init__(self) + self._dcdc_list = [] + self.int_case = interface() + # Initialize SFP list + + # sfp.py will read eeprom contents and retrive the eeprom data. + # It will also provide support sfp controls like reset and setting + # low power mode. + # We pass the eeprom path and sfp control path from chassis.py + # So that sfp.py implementation can be generic to all platforms + try: + self._sfp_list = [] + self.port_num = baseutil.get_config().get("sfps", None).get("port_num", 0) + self.port_start_index = baseutil.get_config().get("sfps", None).get("port_index_start", 0) + # fix problem with first index is 1, we add a fake sfp node + if self.port_start_index == 1: + self._sfp_list.append(Sfp(1)) + + # sfp id always start at 1 + for index in range(1, self.port_num + 1): + self._sfp_list.append(Sfp(index)) + + for i in range(self.port_start_index, self.port_start_index + self.port_num): + self.sfp_present_dict[i] = self.STATUS_REMOVED + + except Exception as err: + print("SFP init error: %s" % str(err)) + + try: + self._eeprom = Eeprom(self.int_case) + except Exception as err: + print("EEPROM INIT ERROR %s" % str(err)) + + # Initialize watchdog + # self._watchdog = Watchdog() + fantray_num = self.int_case.get_fan_total_number() + for index in range(fantray_num): + fandrawer = FanDrawer(self.int_case, index + 1) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + psu_num = self.int_case.get_psu_total_number() + for index in range(psu_num): + psuobj = Psu(self.int_case, index + 1) + self._psu_list.append(psuobj) + + thermal_num = self.int_case.get_temp_id_number() + for index in range(thermal_num): + thermalobj = Thermal(self.int_case, index + 1) + self._thermal_list.append(thermalobj) + + component_num = self.int_case.get_cpld_total_number() + for index in range(component_num): + componentobj = Component(self.int_case, index + 1) + self._component_list.append(componentobj) + + dcdc_num = self.int_case.get_dcdc_total_number() + for index in range(dcdc_num): + dcdcobj = Dcdc(self.int_case, index + 1) + self._dcdc_list.append(dcdcobj) + + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + name = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + name = sys_eeprom.modelstr(e) + if name is None: + return '' + return name + + def get_presence(self): + """ + Retrieves the presence of the chassis + Returns: + bool: True if chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the chassis + Returns: + string: Model/part number of chassis + """ + model = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + model = sys_eeprom.modelnumber(e) + if model is None: + return '' + return model + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + + Returns: + A string containing the hardware serial number for this chassis. + """ + serial_number = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + serial_number = sys_eeprom.serial_number_str(e) + if serial_number is None: + return '' + + return serial_number + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + device_version = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + device_version = sys_eeprom.deviceversion(e) + if device_version is None: + return '' + + return device_version + + def get_serial(self): + """ + Retrieves the serial number of the chassis (Service tag) + Returns: + string: Serial number of chassis + """ + return self.get_serial_number() + + def get_status(self): + """ + Retrieves the operational status of the chassis + Returns: + bool: A boolean value, True if chassis is operating properly + False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def initizalize_system_led(self): + return True + + def set_status_led(self, color): + return False + + def get_status_led(self): + """ + Gets the state of the system LED + + Returns: + A string, one of the valid LED color strings which could be vendor + specified. + """ + ret, color = self.int_case.get_led_color_by_type('SYS_LED') + if ret is True: + return color + return 'N/A' + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + base_mac = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + base_mac = sys_eeprom.base_mac_addr(e) + if base_mac is None: + return '' + + return base_mac.upper() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + Ex. { '0x21':'AG9064', '0x22':'V1.0', '0x23':'AG9064-0109867821', + '0x24':'001c0f000fcd0a', '0x25':'02/03/2018 16:22:00', + '0x26':'01', '0x27':'REV01', '0x28':'AG9064-C2358-16G'} + """ + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return {} + return sys_eeprom.system_eeprom_info() + + def get_thermal_manager(self): + """ + Retrieves thermal manager class on this chassis + :return: A class derived from ThermalManagerBase representing the + specified thermal manager. ThermalManagerBase is returned as default + """ + return False + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + reboot_cause_msg = self.int_case.get_cpu_reboot_cause() + if "Power Loss" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_POWER_LOSS + elif "Watchdog" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_WATCHDOG + elif "BMC reboot" in reboot_cause_msg or "BMC powerdown" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_HARDWARE_OTHER + elif "Thermal Overload: ASIC" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC + elif "Thermal Overload: Other" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_THERMAL_OVERLOAD_OTHER + elif "Other" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_NON_HARDWARE + else: + reboot_cause_type = self.REBOOT_CAUSE_NON_HARDWARE + return (reboot_cause_type, reboot_cause_msg) + + def get_module(self, index): + """ + Retrieves module represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the module to + retrieve + + Returns: + An object dervied from ModuleBase representing the specified + module + """ + module = None + + try: + if self.get_num_modules(): + module = self._module_list[index] + except IndexError: + sys.stderr.write("Module index {} out of range (0-{})\n".format( + index, len(self._module_list) - 1)) + + return module + + def get_fan_drawer(self, index): + """ + Retrieves fan drawers represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the fan drawer to + retrieve + + Returns: + An object dervied from FanDrawerBase representing the specified fan + drawer + """ + fan_drawer = None + + try: + if self.get_num_fan_drawers(): + fan_drawer = self._fan_drawer_list[index] + except IndexError: + sys.stderr.write("Fan drawer index {} out of range (0-{})\n".format( + index, len(self._fan_drawer_list) - 1)) + + return fan_drawer + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + + Returns: + (bool, dict): + - bool: True if call successful, False if not; + - dict: A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, where device_id is the device ID + for this device and device_event. + The known devices's device_id and device_event was defined as table below. + ----------------------------------------------------------------- + device | device_id | device_event | annotate + ----------------------------------------------------------------- + 'fan' '' '0' Fan removed + '1' Fan inserted + + 'sfp' '' '0' Sfp removed + '1' Sfp inserted + '2' I2C bus stuck + '3' Bad eeprom + '4' Unsupported cable + '5' High Temperature + '6' Bad cable + + 'voltage' '' '0' Vout normal + '1' Vout abnormal + -------------------------------------------------------------------- + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'}, + 'voltage':{'U20':'0', 'U21':'1'}} + Indicates that: + fan 0 has been removed, fan 2 has been inserted. + sfp 11 has been removed, sfp 12 has been inserted. + monitored voltage U20 became normal, voltage U21 became abnormal. + Note: For sfp, when event 3-6 happened, the module will not be avalaible, + XCVRD shall stop to read eeprom before SFP recovered from error status. + """ + + change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}} + + start_time = time.time() + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_change_event:Invalid timeout value: %s" % timeout) + return False, change_event_dict + + end_time = start_time + timeout + if start_time > end_time: + print("get_change_event:time wrap / invalid timeout value: %s" % timeout) + return False, change_event_dict # Time wrap or possibly incorrect timeout + try: + while timeout >= 0: + # check for sfp + sfp_change_dict = self.get_transceiver_change_event() + # check for fan + fan_change_dict = self.get_fan_change_event() + # check for voltage + voltage_change_dict = self.get_voltage_change_event() + + if sfp_change_dict or fan_change_dict or voltage_change_dict: + change_event_dict["sfp"] = sfp_change_dict + change_event_dict["fan"] = fan_change_dict + change_event_dict["voltage"] = voltage_change_dict + return True, change_event_dict + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_event_dict + except Exception as e: + print(e) + print("get_change_event: Should not reach here.") + return False, change_event_dict + + def get_transceiver_change_event(self): + current_sfp_present_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for i in range(self.port_start_index, self.port_start_index + self.port_num): + sfp = self._sfp_list[i] + if sfp.get_presence(): + current_sfp_present_dict[i] = self.STATUS_INSERTED + + else: + current_sfp_present_dict[i] = self.STATUS_REMOVED + + # Update reg value + if current_sfp_present_dict == self.sfp_present_dict: + return ret_dict + + for index, status in current_sfp_present_dict.items(): + if self.sfp_present_dict[index] != status: + ret_dict[index] = status + + self.sfp_present_dict = current_sfp_present_dict + + return ret_dict + + def get_fan_change_event(self): + current_fan_present_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index, fan in enumerate(self._fan_list): + if fan.get_presence() is True: + current_fan_present_dict[index] = self.STATUS_INSERTED + else: + current_fan_present_dict[index] = self.STATUS_REMOVED + + if len(self.fan_present_dict) == 0: # first time + self.fan_present_dict = current_fan_present_dict + return {} + + if current_fan_present_dict == self.fan_present_dict: + return {} + + # updated fan_present_dict + for index, status in current_fan_present_dict.items(): + if self.fan_present_dict[index] != status: + ret_dict[str(index)] = status + self.fan_present_dict = current_fan_present_dict + return ret_dict + + def get_voltage_change_event(self): + current_voltage_status_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index, dcdc in enumerate(self._dcdc_list): + name = dcdc.get_name() + value = dcdc.get_value() + high = dcdc.get_high_threshold() + low = dcdc.get_low_threshold() + if (value is None) or (value > high) or (value < low): + current_voltage_status_dict[name] = self.STATUS_ABNORMAL + else: + current_voltage_status_dict[name] = self.STATUS_NORMAL + + if len(self.voltage_status_dict) == 0: # first time + self.voltage_status_dict = current_voltage_status_dict + return {} + + if current_voltage_status_dict == self.voltage_status_dict: + return {} + + # updated voltage_status_dict + for name, status in current_voltage_status_dict.items(): + if self.voltage_status_dict[name] != status: + ret_dict[name] = status + self.voltage_status_dict = current_voltage_status_dict + return ret_dict + + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py new file mode 100644 index 000000000000..fa674a98a6bf --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import time + import subprocess + import os + from sonic_platform_base.component_base import ComponentBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +FIRMWARE_UPDATE_DIR = "/tmp/.firmwareupdate/" + +class Component(ComponentBase): + """Platform-specific Component class""" + + def __init__(self, interface_obj, index): + self.cpld_dict = {} + self.int_case = interface_obj + self.index = index + self.update_time = 0 + self.cpld_id = "CPLD" + str(index) + + def cpld_dict_update(self): + local_time = time.time() + if not self.cpld_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.cpld_dict = self.int_case.get_cpld_version_by_id(self.cpld_id) + + def get_slot(self): + self.cpld_dict_update() + return self.cpld_dict["Slot"] + + def get_warm_upgrade_flag(self): + self.cpld_dict_update() + return self.cpld_dict["Warm"] + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.cpld_dict_update() + return self.cpld_dict["Name"] + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.cpld_dict_update() + return self.cpld_dict["Desc"] + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Note: the firmware version will be read from HW + + Returns: + A string containing the firmware version of the component + """ + self.cpld_dict_update() + return self.cpld_dict["Version"] + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + + Note: the firmware version will be read from image + + Args: + image_path: A string, path to firmware image + + Returns: + A string containing the available firmware version of the component + """ + raise NotImplementedError + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + + Args: + image_path: A string, path to firmware image + + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return None + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + This API performs firmware installation only: this may/may not be the same as firmware update. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this must be done manually by user + + Note: in case immediate actions are required to complete the component firmware update + (e.g., reboot, power cycle, etc.) - will be done automatically by API and no return value provided + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + if not os.path.isfile(image_path): + print("ERROR: %s not found" % image_path) + return False + cmdstr = "upgrade.py cold %s %d" % (image_path, self.get_slot()) + status, output = subprocess.getstatusoutput(cmdstr) + if status == 0: + print("INFO: %s firmware install succeeded" % self.get_name()) + return True + print("%s install failed. status:%d, output:\n%s" % (self.get_name(), status, output)) + return False + + def update_firmware(self, image_path): + """ + Updates firmware of the component + + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + + Args: + image_path: A string, path to firmware image + + Raises: + RuntimeError: update failed + """ + if not os.path.isfile(image_path): + raise RuntimeError("ERROR: %s not found" % image_path) + + if self.get_warm_upgrade_flag() == 1: # use warm upgrade + cmdstr = "upgrade.py warm %s %d" % (image_path, self.get_slot()) + else: + cmdstr = "upgrade.py cold %s %d" % (image_path, self.get_slot()) + status, output = subprocess.getstatusoutput(cmdstr) + if status == 0: + if self.get_warm_upgrade_flag() != 1: # not support warm upgrade, need to cold reboot + print("INFO: %s firmware install succeeded" % self.get_name()) + print("INFO: please cold reboot to make the %s firmware up-to-date" % self.get_name()) + else: + print("INFO: %s firmware update succeeded" % self.get_name()) + print("INFO: %s firmware version up-to-date" % self.get_name()) + return None + raise RuntimeError(output) + + def auto_update_firmware(self, image_path, boot_type): + """ + Updates firmware of the component + + This API performs firmware update automatically based on boot_type: it assumes firmware installation + and/or creating a loading task during the reboot, if needed, in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically during the reboot. + The loading task will be created by API. + + Args: + image_path: A string, path to firmware image + boot_type: A string, reboot type following the upgrade + - none/fast/warm/cold + + Returns: + Output: A return code + return_code: An integer number, status of component firmware auto-update + - return code of a positive number indicates successful auto-update + - status_installed = 1 + - status_updated = 2 + - status_scheduled = 3 + - return_code of a negative number indicates failed auto-update + - status_err_boot_type = -1 + - status_err_image = -2 + - status_err_unknown = -3 + + Raises: + RuntimeError: auto-update failure cause + """ + if not os.path.isfile(image_path): + print("ERROR: %s not found" % image_path) + return -2 + + if not os.path.isdir(FIRMWARE_UPDATE_DIR): + os.mkdir(FIRMWARE_UPDATE_DIR) + + warm_upgrade_flag = self.get_warm_upgrade_flag() + file_name = os.path.basename(image_path) + file_path = os.path.join(FIRMWARE_UPDATE_DIR, file_name) + if os.path.exists(file_path): # firmware already update + if warm_upgrade_flag == 1: + print("INFO: %s firmware update succeeded, firmware version up-to-date" % self.get_name()) + return 2 + print("INFO: %s firmware install succeeded, please cold reboot to make it up-to-date" % self.get_name()) + return 1 + + if warm_upgrade_flag == 1: # use warm upgrade + cmdstr = "upgrade.py warm %s %d" % (image_path, self.get_slot()) + else: + cmdstr = "upgrade.py cold %s %d" % (image_path, self.get_slot()) + status, output = subprocess.getstatusoutput(cmdstr) + if status == 0: + os.mknod(file_path) + if warm_upgrade_flag == 1: + print("INFO: %s firmware update succeeded, firmware version up-to-date" % self.get_name()) + return 2 + print("INFO: %s firmware install succeeded, please cold reboot to make it up-to-date" % self.get_name()) + return 1 + print("%s update failed, status:%d, output:\n%s" % (self.get_name(), status, output)) + return -3 diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py new file mode 100644 index 000000000000..494d4aa610dc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Thermals' information which are available in the platform +# +######################################################################## +import time + + +class Dcdc(object): + + def __init__(self, interface_obj, index): + self.dcdc_dict = {} + self.int_case = interface_obj + self.index = index + self.update_time = 0 + self.dcdc_id = "DCDC" + str(index) + + def dcdc_dict_update(self): + local_time = time.time() + if not self.dcdc_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.dcdc_dict = self.int_case.get_dcdc_by_id(self.dcdc_id) + + def get_name(self): + """ + Retrieves the name of the sensor + + Returns: + string: The name of the sensor + """ + self.dcdc_dict_update() + return self.dcdc_dict["Name"] + + def get_value(self): + """ + Retrieves current value reading from sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Value"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["High"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Low"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Max"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Min"] + if value is None: + value = 0 + return round(float(value), 3) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py new file mode 100644 index 000000000000..05fcc3c25678 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +######################################################################## +# +# Module contains platform specific implementation of SONiC Platform +# Base API and provides the EEPROMs' information. +# +# The different EEPROMs available are as follows: +# - System EEPROM : Contains Serial number, Service tag, Base MA +# address, etc. in ONIE TlvInfo EEPROM format. +# - PSU EEPROM : Contains Serial number, Part number, Service Tag, +# PSU type, Revision. +# - Fan EEPROM : Contains Serial number, Part number, Service Tag, +# Fan type, Number of Fans in Fantray, Revision. +######################################################################## + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as error: + raise ImportError(str(error) + "- required module not found") from error + + +class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, interface_obj): + self.int_case = interface_obj + self.name = "ONIE_E2" + + eeprom_path = self.int_case.get_onie_e2_path(self.name) + if eeprom_path is None: + raise ValueError("get eeprom path failed") + + super().__init__(eeprom_path, 0, "", True) + + def modelnumber(self, e): + ''' + Returns the value field of the model(part) number TLV as a string + ''' + (is_valid, t) = self.get_tlv_field(e, self._TLV_CODE_PART_NUMBER) + if not is_valid: + return super().part_number_str(e) + + return t[2].decode("ascii") + + def deviceversion(self, e): + ''' + Returns the value field of the Device Version as a string + ''' + (is_valid, t) = self.get_tlv_field(e, self._TLV_CODE_DEVICE_VERSION) + if not is_valid: + return "N/A" + + return str(ord(t[2])) + + def system_eeprom_info(self): + ''' + Retrieves the full content of system EEPROM information for the chassis + + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + Ex. { '0x21':'AG9064', '0x22':'V1.0', '0x23':'AG9064-0109867821', + '0x24':'001c0f000fcd0a', '0x25':'02/03/2018 16:22:00', + '0x26':'01', '0x27':'REV01', '0x28':'AG9064-C2358-16G'} + ''' + sys_eeprom_dict = {} + e = self.read_eeprom() + if self._TLV_HDR_ENABLED: + if not self.is_valid_tlvinfo_header(e): + return {} + total_len = (e[9] << 8) | e[10] + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_len + else: + tlv_index = self.eeprom_start + tlv_end = self._TLV_INFO_MAX_LEN + + while (tlv_index + 2) < len(e) and tlv_index < tlv_end: + if not self.is_valid_tlv(e[tlv_index:]): + break + + tlv = e[tlv_index:tlv_index + 2 + e[tlv_index + 1]] + code = "0x%02X" % tlv[0] + name, value = self.decoder(None, tlv) + sys_eeprom_dict[code] = value + + if e[tlv_index] == self._TLV_CODE_QUANTA_CRC or \ + e[tlv_index] == self._TLV_CODE_CRC_32: + break + tlv_index += e[tlv_index + 1] + 2 + + return sys_eeprom_dict diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py new file mode 100644 index 000000000000..9499e721a0f9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py @@ -0,0 +1,308 @@ +#!/usr/bin/env python3 +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fans' information which are available in the platform. +# +######################################################################## + +try: + import time + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, interface_obj, fantray_index, fan_index, psu_fan=False, psu_index=0): + self.fan_dict = {} + self.int_case = interface_obj + self.fantray_index = fantray_index + self.fan_index = fan_index + self.psu_index = psu_index + self.is_psu_fan = psu_fan + self.update_time = 0 + if not self.is_psu_fan: + self.name = "FAN" + str(fantray_index) + else: + self.name = "PSU" + str(psu_index) + + def fan_dict_update(self): + local_time = time.time() + if not self.fan_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + if not self.is_psu_fan: + self.fan_dict = self.int_case.get_fan_info(self.name) + else: + self.fan_dict = self.int_case.get_psu_fru_info(self.name) + + def get_name(self): + """ + Retrieves the fan name + Returns: + string: The name of the device + """ + if not self.is_psu_fan: + return "Fantray{}_{}".format(self.fantray_index, self.fan_index) + return "PSU{}_FAN{}".format(self.psu_index, self.fan_index) + + def get_model(self): + """ + Retrieves the part number of the FAN + Returns: + string: Part number of FAN + """ + if not self.is_psu_fan: + self.fan_dict_update() + return self.fan_dict["NAME"] + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the FAN + Returns: + string: Serial number of FAN + """ + if not self.is_psu_fan: + self.fan_dict_update() + return self.fan_dict["SN"] + return 'N/A' + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if fan is present, False if not + """ + if not self.is_psu_fan: + return self.int_case.get_fan_presence(self.name) + return self.int_case.get_psu_presence(self.name) + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + if not self.get_presence(): + return False + + if not self.is_psu_fan: + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor pwm + rotor_name = "Rotor" + str(self.fan_index) + value = fan_dir[rotor_name]["Speed"] + min_speed = fan_dir[rotor_name]["SpeedMin"] + max_speed = fan_dir[rotor_name]["SpeedMax"] + tolerance = fan_dir[rotor_name]["Tolerance"] + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + value = psu_status_dict["FanSpeed"]["Value"] + min_speed = psu_status_dict["FanSpeed"]["Min"] + max_speed = psu_status_dict["FanSpeed"]["Max"] + tolerance = psu_status_dict["FanSpeed"]["Tolerance"] + + if isinstance(tolerance, str) or tolerance is None: + tolerance = 30 + + if isinstance(value, str) or value is None: + return False + + if value < min_speed: + return False + + speed = int(value * 100 / max_speed) + if speed > 100: + speed = 100 + elif speed < 0: + speed = 0 + target = self.get_target_speed() + + if (speed - target) > target * tolerance / 100: + return False + if (target - speed) > target * tolerance / 100: + return False + + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_direction(self): + """ + Retrieves the fan airflow direction + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + + Notes: + - Forward/Exhaust : Air flows from Port side to Fan side. + - Reverse/Intake : Air flows from Fan side to Port side. + """ + self.fan_dict_update() + air_flow = self.fan_dict["AirFlow"] + if air_flow is not None: + return air_flow + return self.FAN_DIRECTION_NOT_APPLICABLE + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + if not self.get_presence(): + return 0 + + if not self.is_psu_fan: + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor pwm + rotor_name = "Rotor" + str(self.fan_index) + value = fan_dir[rotor_name]["Speed"] + max_speed = fan_dir[rotor_name]["SpeedMax"] + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + value = psu_status_dict["FanSpeed"]["Value"] + max_speed = psu_status_dict["FanSpeed"]["Max"] + + if isinstance(value, str) or value is None: + return 0 + pwm = value * 100 / max_speed + if pwm > 100: + pwm = 100 + elif pwm < 0: + pwm = 0 + return int(pwm) + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + # The default tolerance value is fixed as 30% + if not self.is_psu_fan: + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor tolerance + rotor_name = "Rotor" + str(self.fan_index) + tolerance = fan_dir[rotor_name]["Tolerance"] + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + tolerance = psu_status_dict["FanSpeed"]["Tolerance"] + + if isinstance(tolerance, str) or tolerance is None: + return 30 + return tolerance + + def fan_set_speed_pwm(self, pwm): + status = self.int_case.set_fan_speed_pwm(self.name, self.fan_index, pwm) + if status == -1: + return False + return True + + def set_speed(self, speed): + """ + Set fan speed to expected value + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + bool: True if set success, False if fail. + """ + if not self.is_psu_fan: + return self.fan_set_speed_pwm(speed) + return self.int_case.set_psu_fan_speed_pwm(self.name, int(speed)) + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if set success, False if fail. + """ + # not supported + return False + + def get_status_led(self): + """ + Gets the state of the Fan status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + if self.is_psu_fan: + # No LED available for PSU Fan + return 'N/A' + + if not self.get_presence(): + return 'N/A' + + ret, color = self.int_case.get_fan_led(self.name) + if ret is True: + return color + return 'N/A' + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + if not self.is_psu_fan: + # get fan rotor pwm + pwm = int(self.int_case.get_fan_speed_pwm(self.name, self.fan_index)) + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + if psu_status_dict["InputStatus"] is False: + pwm = 0 + else: + pwm = self.get_speed() # target equal to real pwm, to avoid alarm + return int(pwm) + + def get_vendor(self): + """ + Retrieves the vendor name of the fan + + Returns: + string: Vendor name of fan + """ + if not self.is_psu_fan: + return "WB" + return 'N/A' + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + if not self.is_psu_fan: + self.fan_dict_update() + return self.fan_dict["HW"] + return 'N/A' diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..f0b039648158 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +# +# fan_drawer_base.py +# +# Abstract base class for implementing a platform-specific class with which +# to interact with a fan drawer module in SONiC +# + +try: + import time + from sonic_platform_base.fan_drawer_base import FanDrawerBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class FanDrawer(FanDrawerBase): + """ + Abstract base class for interfacing with a fan drawer + """ + # Device type definition. Note, this is a constant. + DEVICE_TYPE = "fan_drawer" + + def __init__(self, interface_obj, fantray_index): + FanDrawerBase.__init__(self) + self.fantray_dict = {} + self.fantray_update_time = 0 + self.fantray_index = fantray_index + self.int_case = interface_obj + self.fantrayname = "FAN" + str(fantray_index) + self.num_fans_per_fantray = self.int_case.get_fan_rotor_number(self.fantrayname) + for i in range(self.num_fans_per_fantray): + self._fan_list.append(Fan(interface_obj, fantray_index, i + 1)) + + def fantray_dict_update(self): + local_time = time.time() + # update data every 1 seconds + if not self.fantray_dict or (local_time - self.fantray_update_time) >= 1: + self.fantray_update_time = local_time + self.fantray_dict = self.int_case.get_fan_info(self.fantrayname) + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return "Fantray{}".format(self.fantray_index) + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if fan is present, False if not + """ + return self.int_case.get_fan_presence(self.fantrayname) + + def get_model(self): + """ + Retrieves the part number of the FAN + Returns: + string: Part number of FAN + """ + self.fantray_dict_update() + return self.fantray_dict["NAME"] + + def get_serial(self): + """ + Retrieves the serial number of the FAN + Returns: + string: Serial number of FAN + """ + self.fantray_dict_update() + return self.fantray_dict["SN"] + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + self.fantray_dict_update() + return self.fantray_dict["HW"] + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + for i in range(self.num_fans_per_fantray): + if self._fan_list[i].get_status() is False: + return False + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_num_fans(self): + """ + Retrieves the number of fans available on this fan drawer + Returns: + An integer, the number of fan modules available on this fan drawer + """ + return len(self._fan_list) + + def get_all_fans(self): + """ + Retrieves all fan modules available on this fan drawer + Returns: + A list of objects derived from FanBase representing all fan + modules available on this fan drawer + """ + return self._fan_list + + def set_status_led(self, color): + """ + Sets the state of the fan drawer status LED + Args: + color: A string representing the color with which to set the + fan drawer status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + # not supported + return False + + def get_status_led(self): + """ + Gets the state of the Fan status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + if not self.get_presence(): + return 'N/A' + + ret, color = self.int_case.get_fan_led(self.fantrayname) + if ret is True: + return color + return 'N/A' + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + + Returns: + A float, with value of the maximum consumable power of the + component. + """ + self.fantray_dict_update() + return self.fantray_dict["PowerMax"] diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py new file mode 100644 index 000000000000..8ea66f339e96 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +######################################################################## +# +# Module contains a platform specific implementation of SONiC Platform +# Base PCIe class +# +######################################################################## + +try: + from sonic_platform_base.sonic_pcie.pcie_common import PcieUtil +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Pcie(PcieUtil): + """Platform-specific Pcie class""" + + def __init__(self, platform_path): + PcieUtil.__init__(self, platform_path) diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/platform.py similarity index 50% rename from platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/platform.py rename to platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/platform.py index 6ff9446b951c..4d6fe03d93ac 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/platform.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/platform.py @@ -1,22 +1,24 @@ +#!/usr/bin/env python3 + ############################################################################# -# PDDF +# # Module contains an implementation of SONiC Platform Base API and # provides the platform information # ############################################################################# try: - from sonic_platform_pddf_base.pddf_platform import PddfPlatform + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis except ImportError as e: - raise ImportError(str(e) + "- required module not found") + raise ImportError(str(e) + "- required module not found") from e -class Platform(PddfPlatform): +class Platform(PlatformBase): """ - PDDF Platform-Specific Platform Class + Platform-specific class """ def __init__(self): - PddfPlatform.__init__(self) - - # Provide the functions/variables below for which implementation is to be overwritten + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py new file mode 100644 index 000000000000..a9f7e87d2027 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python3 +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs' information which are available in the platform +# +######################################################################## + + +try: + import time + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Psu(PsuBase): + """Platform-specific PSU class""" + + def __init__(self, interface_obj, index): + self.psu_dict = {} + self.psu_status_dict = {} + self.psu_power_dict = {} + self._fan_list = [] + self._thermal_list = [] + self.int_case = interface_obj + self.index = index + self.name = "PSU" + str(index) + + self.psu_dict_update_time = 0 + self.psu_status_dict_update_time = 0 + self.psu_power_dict_update_time = 0 + + self._fan_list.append(Fan(self.int_case, 1, 1, psu_fan=True, psu_index=index)) + + def psu_dict_update(self): + local_time = time.time() + if not self.psu_dict or (local_time - self.psu_dict_update_time) >= 1: # update data every 1 seconds + self.psu_dict_update_time = local_time + self.psu_dict = self.int_case.get_psu_fru_info(self.name) + + def psu_status_dict_update(self): + local_time = time.time() + if not self.psu_status_dict or ( + local_time - self.psu_status_dict_update_time) >= 1: # update data every 1 seconds + self.psu_status_dict_update_time = local_time + self.psu_status_dict = self.int_case.get_psu_status(self.name) + + def psu_power_dict_update(self): + local_time = time.time() + if not self.psu_power_dict or ( + local_time - self.psu_power_dict_update_time) >= 1: # update data every 1 seconds + self.psu_power_dict_update_time = local_time + self.psu_power_dict = self.int_case.get_psu_power_status(self.name) + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return "Psu{}".format(self.index) + + def get_presence(self): + """ + Retrieves the presence of the Power Supply Unit (PSU) + + Returns: + bool: True if PSU is present, False if not + """ + return self.int_case.get_psu_presence(self.name) + + def get_model(self): + """ + Retrieves the part number of the PSU + + Returns: + string: Part number of PSU + """ + self.psu_dict_update() + return self.psu_dict["DisplayName"] + + def get_serial(self): + """ + Retrieves the serial number of the PSU + + Returns: + string: Serial number of PSU + """ + self.psu_dict_update() + return self.psu_dict["SN"] + + def get_status(self): + """ + Retrieves the operational status of the PSU + + Returns: + bool: True if PSU is operating properly, False if not + """ + return self.int_case.get_psu_input_output_status(self.name) + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_voltage(self): + """ + Retrieves current PSU voltage output + + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Voltage"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + + Returns: + A float number, electric current in amperes, + e.g. 15.4 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Current"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Power"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + + Returns: + A boolean, True if PSU has stablized its output voltages and + passed all its internal self-tests, False if not. + """ + return self.int_case.get_psu_input_output_status(self.name) + + def get_status_led(self): + """ + Gets the state of the PSU status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + if not self.get_presence(): + return "N/A" + if self.int_case.get_psu_input_output_status(self.name): + return self.STATUS_LED_COLOR_GREEN + return self.STATUS_LED_COLOR_RED + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the + PSU status LED + Returns: + bool: True if status LED state is set successfully, False if + not + """ + # not supported + return False + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + self.psu_status_dict_update() + value = self.psu_status_dict["Temperature"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.psu_status_dict_update() + value = self.psu_status_dict["Temperature"]["Max"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Voltage"]["HighAlarm"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Voltage"]["LowAlarm"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_input_voltage(self): + """ + Get the input voltage of the PSU + + Returns: + A float number, the input voltage in volts, + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Inputs"]["Voltage"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_input_current(self): + """ + Get the input electric current of the PSU + + Returns: + A float number, the input current in amperes, e.g 220.3 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Inputs"]["Current"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_input_power(self): + """ + Get the input current energy of the PSU + + Returns: + A float number, the input power in watts, e.g. 302.6 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Inputs"]["Power"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + self.psu_dict_update() + return self.psu_dict["HW"] + + def get_vendor(self): + """ + Retrieves the vendor name of the psu + + Returns: + string: Vendor name of psu + """ + self.psu_dict_update() + return self.psu_dict["VENDOR"] + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return False + + def get_thermal(self, index): + """ + Retrieves thermal unit represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the thermal to + retrieve + + Returns: + An object dervied from ThermalBase representing the specified thermal + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/sfp.py similarity index 74% rename from platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp.py rename to platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/sfp.py index c1d4cb998a6e..4667d3efcd7c 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/sfp.py @@ -27,10 +27,10 @@ # } # } # } -# ver 2.0 - rg_plat: -# "presence_path": "/xx/rg_plat/xx[port_id]/present" +# ver 2.0 - wb_plat: +# "presence_path": "/xx/wb_plat/xx[port_id]/present" # "eeprom_path": "/sys/bus/i2c/devices/i2c-[bus]/[bus]-0050/eeprom" -# "reset_path": "/xx/rg_plat/xx[port_id]/reset" +# "reset_path": "/xx/wb_plat/xx[port_id]/reset" ############################################################################# import sys import time @@ -38,52 +38,21 @@ import traceback from abc import abstractmethod +configfile_pre = "/usr/local/bin/" +sys.path.append(configfile_pre) + try: - import os + from platform_intf import * from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase - from .sfp_config import * - -except ImportError as e: - raise ImportError (str(e) + "- required module not found") - -LOG_DEBUG_LEVEL = 1 -LOG_WARNING_LEVEL = 2 -LOG_ERROR_LEVEL = 3 - -CONFIG_DB_PATH = "/etc/sonic/config_db.json" - -def getonieplatform(path): - if not os.path.isfile(path): - return "" - machine_vars = {} - with open(path) as machine_file: - for line in machine_file: - tokens = line.split('=') - if len(tokens) < 2: - continue - machine_vars[tokens[0]] = tokens[1].strip() - return machine_vars.get("onie_platform") - -def getplatform_config_db(): - if not os.path.isfile(CONFIG_DB_PATH): - return "" - val = os.popen("sonic-cfggen -j %s -v DEVICE_METADATA.localhost.platform" % CONFIG_DB_PATH).read().strip() - if len(val) <= 0: - return "" - else: - return val - -def getplatform_name(): - if os.path.isfile('/host/machine.conf'): - return getonieplatform('/host/machine.conf') - elif os.path.isfile('/usr/share/sonic/hwsku/machine.conf'): - return getonieplatform('/usr/share/sonic/hwsku/machine.conf') - else: - return getplatform_config_db() - -def get_sfp_config(): - dev = getplatform_name() - return cust_sfp_cfg.get(dev, None) + from plat_hal.baseutil import baseutil + +except ImportError as error: + raise ImportError(str(error) + "- required module not found") from error + +LOG_DEBUG_LEVEL = 1 +LOG_WARNING_LEVEL = 2 +LOG_ERROR_LEVEL = 3 + class Sfp(SfpOptoeBase): @@ -92,10 +61,10 @@ class Sfp(SfpOptoeBase): OPTOE_DRV_TYPE3 = 3 # index must start at 1 - def __init__(self, index, a=None, b=None): + def __init__(self, index): SfpOptoeBase.__init__(self) self.sfp_type = None - sfp_config = get_sfp_config() + sfp_config = baseutil.get_config().get("sfps", None) self.log_level_config = sfp_config.get("log_level", LOG_WARNING_LEVEL) # Init instance of SfpCust ver = sfp_config.get("ver", None) @@ -127,9 +96,10 @@ def get_transceiver_info(self): try: if transceiver_info["vendor_rev"] is not None: transceiver_info["hardware_rev"] = transceiver_info["vendor_rev"] - return transceiver_info - except Exception as e: + except BaseException: print(traceback.format_exc()) + return None + return transceiver_info def reset(self): if self.get_presence() is False: @@ -161,7 +131,7 @@ def get_lpmode(self): self._sfplog(LOG_WARNING_LEVEL, 'SFP does not support lpmode') return False - #implement in future + # implement in future return False @@ -174,14 +144,12 @@ def set_lpmode(self, lpmode): if self.sfp_type == 'QSFP-DD': return SfpOptoeBase.set_lpmode(self, lpmode) - elif self.sfp_type == 'QSFP': + if self.sfp_type == 'QSFP': if lpmode: return self._xcvr_api.set_power_override(True, lpmode) - else: - return self._xcvr_api.set_power_override(False, lpmode) - else: - self._sfplog(LOG_WARNING_LEVEL, 'SFP does not support lpmode') - return False + return self._xcvr_api.set_power_override(False, lpmode) + self._sfplog(LOG_WARNING_LEVEL, 'SFP does not support lpmode') + return False def set_optoe_write_max(self, write_max): """ @@ -189,7 +157,6 @@ def set_optoe_write_max(self, write_max): so override it as NotImplemented """ self._sfplog(LOG_DEBUG_LEVEL, "set_optoe_write_max NotImplemented") - pass def refresh_xcvr_api(self): """ @@ -199,18 +166,17 @@ def refresh_xcvr_api(self): class_name = self._xcvr_api.__class__.__name__ optoe_type = None # set sfp_type - if (class_name == 'CmisApi'): + if 'CmisApi' in class_name: self.sfp_type = 'QSFP-DD' optoe_type = self.OPTOE_DRV_TYPE3 - elif (class_name == 'Sff8472Api'): + elif 'Sff8472Api' in class_name: self.sfp_type = 'SFP' optoe_type = self.OPTOE_DRV_TYPE2 - elif (class_name == 'Sff8636Api' or class_name == 'Sff8436Api'): + elif ('Sff8636Api' in class_name or 'Sff8436Api' in class_name): self.sfp_type = 'QSFP' optoe_type = self.OPTOE_DRV_TYPE1 - + # set optoe driver if optoe_type is not None: - # set optoe driver self._sfp_api.set_optoe_type(optoe_type) def _sfplog(self, log_level, msg): @@ -225,31 +191,22 @@ def _sfplog(self, log_level, msg): syslog.syslog(syslog.LOG_ERR, msg) syslog.closelog() - except Exception as e: + except BaseException: print(traceback.format_exc()) + class SfpCust(): def __init__(self, index): self.eeprom_path = None self._init_config(index) def _init_config(self, index): - sfp_config = get_sfp_config() + sfp_config = baseutil.get_config().get("sfps", None) self.log_level_config = sfp_config.get("log_level", LOG_WARNING_LEVEL) self._port_id = index self.eeprom_retry_times = sfp_config.get("eeprom_retry_times", 0) self.eeprom_retry_break_sec = sfp_config.get("eeprom_retry_break_sec", 0) - def combine_format_str(self, str, key): - count_format = str.count('%') - if count_format > 0: - args_k = [] - for i in range(count_format): - args_k.append(key) - return str % (tuple(args_k)) - else: - return str - def _get_eeprom_path(self): return self.eeprom_path or None @@ -266,18 +223,15 @@ def read_eeprom(self, offset, num_bytes): # temporary solution for a sonic202111 bug if len(result) < num_bytes: result = result[::-1].zfill(num_bytes)[::-1] - if result != None: + if result is not None: return bytearray(result) - else: - time.sleep(self.eeprom_retry_break_sec) - continue + time.sleep(self.eeprom_retry_break_sec) + continue - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) - return None - def write_eeprom(self, offset, num_bytes, write_buffer): try: for i in range(self.eeprom_retry_times): @@ -288,13 +242,12 @@ def write_eeprom(self, offset, num_bytes, write_buffer): break return ret - - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) - + return False @abstractmethod - def set_optoe_type(self, class_name): + def set_optoe_type(self, optoe_type): pass @abstractmethod @@ -331,15 +284,15 @@ def _sfplog(self, log_level, msg): syslog.syslog(syslog.LOG_ERR, msg) syslog.closelog() - except Exception as e: + except BaseException: print(traceback.format_exc()) + class SfpV1(SfpCust): def _init_config(self, index): super()._init_config(index) - sfp_config = get_sfp_config() - # init presence path + sfp_config = baseutil.get_config().get("sfps", None) self.presence_cpld = sfp_config.get("presence_cpld", None) self.presence_val_is_present = sfp_config.get("presence_val_is_present", 0) self._sfplog(LOG_DEBUG_LEVEL, "Done init presence path") @@ -356,16 +309,20 @@ def get_presence(self): try: dev_id, offset, offset_bit = self._get_sfp_cpld_info(self.presence_cpld) ret, info = platform_reg_read(0, dev_id, offset, 1) - return (info[0] & (1 << offset_bit) == self.presence_val_is_present) - except Exception as err: + if (ret is False + or info is None): + return False + return info[0] & (1 << offset_bit) == self.presence_val_is_present + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) + return False def read_eeprom(self, offset, num_bytes): try: for i in range(self.eeprom_retry_times): ret, info = platform_sfp_read(self._port_id, offset, num_bytes) if (ret is False - or info is None): + or info is None): time.sleep(self.eeprom_retry_break_sec) continue eeprom_raw = [] @@ -377,7 +334,7 @@ def read_eeprom(self, offset, num_bytes): if len(eeprom_raw) < num_bytes: eeprom_raw = eeprom_raw[::-1].zfill(num_bytes)[::-1] return bytearray(eeprom_raw) - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) return None @@ -391,18 +348,19 @@ def write_eeprom(self, offset, num_bytes, write_buffer): else: val_list.append(write_buffer) ret, info = platform_sfp_write(self._port_id, offset, val_list) - if ret is False: + if (ret is False + or info is None): time.sleep(self.eeprom_retry_break_sec) continue return True - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) return False def set_optoe_type(self, optoe_type): ret, info = platform_get_optoe_type(self._port_id) - if info != optoe_type: + if ret is True and info != optoe_type: try: ret, _ = platform_set_optoe_type(self._port_id, optoe_type) except Exception as err: @@ -432,7 +390,7 @@ def set_reset(self, reset): self._sfplog(LOG_ERROR_LEVEL, "platform_reg_write error!") return False - except Exception as err: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) return False @@ -454,45 +412,39 @@ def _get_sfp_cpld_info(self, cpld_config): return dev_id, offset, offset_bit + class SfpV2(SfpCust): def _init_config(self, index): super()._init_config(index) - sfp_config = get_sfp_config() - # init eeprom path + sfp_config = baseutil.get_config().get("sfps", None) eeprom_path_config = sfp_config.get("eeprom_path", None) eeprom_path_key = sfp_config.get("eeprom_path_key")[self._port_id - 1] - self.eeprom_path = self.combine_format_str(eeprom_path_config, eeprom_path_key) + self.eeprom_path = None if eeprom_path_config is None else eeprom_path_config % ( + eeprom_path_key, eeprom_path_key) self._sfplog(LOG_DEBUG_LEVEL, "Done init eeprom path: %s" % self.eeprom_path) # init presence path - presence_path_config = sfp_config.get("presence_path", None) - presence_path_key = sfp_config.get("presence_path_key")[self._port_id - 1] - self.presence_path = self.combine_format_str(presence_path_config, presence_path_key) + self.presence_path = None if sfp_config.get("presence_path", + None) is None else sfp_config.get("presence_path") % self._port_id self.presence_val_is_present = sfp_config.get("presence_val_is_present", 0) self._sfplog(LOG_DEBUG_LEVEL, "Done init presence path: %s" % self.presence_path) # init optoe driver path - optoe_driver_path_config = sfp_config.get("optoe_driver_path", None) + optoe_driver_path = sfp_config.get("optoe_driver_path", None) optoe_driver_key = sfp_config.get("optoe_driver_key")[self._port_id - 1] - self.dev_class_path = self.combine_format_str(optoe_driver_path_config, optoe_driver_key) + self.dev_class_path = None if optoe_driver_path is None else optoe_driver_path % ( + optoe_driver_key, optoe_driver_key) self._sfplog(LOG_DEBUG_LEVEL, "Done init optoe driver path: %s" % self.dev_class_path) - # init txdisable path - txdisable_path_config = sfp_config.get("txdisable_path", None) - if txdisable_path_config is not None: - txdisable_path_key = sfp_config.get("txdisable_path_key")[self._port_id - 1] - self.txdisable_path = self.combine_format_str(txdisable_path_config, txdisable_path_key) - self.txdisable_val_is_on = sfp_config.get("txdisable_val_is_on", 0) - self._sfplog(LOG_DEBUG_LEVEL, "Done init optoe driver path: %s" % self.dev_class_path) - # init reset path - reset_path_config = sfp_config.get("reset_path", None) - if reset_path_config is not None: - reset_path_key = sfp_config.get("reset_path_key")[self._port_id - 1] - self.reset_path = self.combine_format_str(reset_path_config, reset_path_key) - self.reset_val_is_on = sfp_config.get("reset_val_is_on", 0) - self._sfplog(LOG_DEBUG_LEVEL, "Done init reset path: %s" % self.reset_path) + self.reset_path = None if sfp_config.get( + "reset_path", + None) is None else sfp_config.get( + "reset_path", + None) % self._port_id + self.reset_val_is_reset = sfp_config.get("reset_val_is_reset", 0) + self._sfplog(LOG_DEBUG_LEVEL, "Done init reset path: %s" % self.reset_path) def get_presence(self): if self.presence_path is None: @@ -504,8 +456,9 @@ def get_presence(self): if sysfs_data != "": result = int(sysfs_data, 16) return result == self.presence_val_is_present - except Exception as err: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) + return False def set_reset(self, reset): return True @@ -515,11 +468,13 @@ def set_optoe_type(self, optoe_type): self._sfplog(LOG_ERROR_LEVEL, "dev_class_path is None!") return False try: - dc_file = open(self.dev_class_path, "r+") - dc_file_val = dc_file.read(1) - if int(dc_file_val) != optoe_type: - dc_str = "%s" % str(optoe_type) - dc_file.write(dc_str) - dc_file.close() - except Exception as err: + with open(self.dev_class_path, "r+") as dc_file: + dc_file_val = dc_file.read(1) + if int(dc_file_val) != optoe_type: + dc_str = "%s" % str(optoe_type) + dc_file.write(dc_str) + # dc_file.close() + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) + return False + return True diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py new file mode 100644 index 000000000000..4632de3bc1e4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Thermals' information which are available in the platform +# +######################################################################## + + +try: + import time + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Thermal(ThermalBase): + + def __init__(self, interface_obj, index): + self.temp_dict = {} + self.temperature_list = [] + self.int_case = interface_obj + self.index = index + self.update_time = 0 + self.temp_id = "TEMP" + str(index) + + def temp_dict_update(self): + local_time = time.time() + if not self.temp_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.temp_dict = self.int_case.get_monitor_temp_by_id(self.temp_id) + + def get_name(self): + """ + Retrieves the name of the thermal + + Returns: + string: The name of the thermal + """ + self.temp_dict_update() + return self.temp_dict["Api_name"] + + def get_presence(self): + """ + Retrieves the presence of the thermal + + Returns: + bool: True if thermal is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the Thermal + + Returns: + string: Model/part number of Thermal + """ + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the Thermal + + Returns: + string: Serial number of Thermal + """ + return "N/A" + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + return "N/A" + + def get_status(self): + """ + Retrieves the operational status of the thermal + + Returns: + A boolean value, True if thermal is operating properly, + False if not + """ + self.temp_dict_update() + if (self.temp_dict["Value"] >= self.temp_dict["High"]) or (self.temp_dict["Value"] <= self.temp_dict["Low"]): + return False + + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Value"] + if value is None or value == self.int_case.error_ret: + return "N/A" + if len(self.temperature_list) >= 1000: + del self.temperature_list[0] + self.temperature_list.append(float(value)) + return round(float(value), 1) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["High"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Low"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + + Returns: + A boolean, True if threshold is set successfully, False if not + """ + # not supported + return False + + def set_low_threshold(self, temperature): + """ + Sets the low threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + + Returns: + A boolean, True if threshold is set successfully, False if not + """ + # not supported + return False + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + + Returns: + A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Max"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Min"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def get_minimum_recorded(self): + """ + Retrieves the minimum recorded temperature of thermal + + Returns: + A float number, the minimum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if len(self.temperature_list) == 0: + return "N/A" + return round(float(min(self.temperature_list)), 1) + + def get_maximum_recorded(self): + """ + Retrieves the maximum recorded temperature of thermal + + Returns: + A float number, the maximum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if len(self.temperature_list) == 0: + return "N/A" + return round(float(max(self.temperature_list)), 1) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py new file mode 100644 index 000000000000..948337f47a9a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +import fcntl +import os +import array + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as error: + raise ImportError(str(error) + "- required module not found") from error + + +# ioctl constants +IO_WRITE = 0x40000000 +IO_READ = 0x80000000 +IO_READ_WRITE = 0xC0000000 +IO_SIZE_INT = 0x00040000 +IO_SIZE_40 = 0x00280000 +IO_TYPE_WATCHDOG = ord('W') << 8 + +WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG +WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG +WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG + +# Watchdog ioctl command +WDIOC_GETSUPPORT = 0 | WDR_40 +WDIOC_GETSTATUS = 1 | WDR_INT +WDIOC_GETBOOTSTATUS = 2 | WDR_INT +WDIOC_GETTEMP = 3 | WDR_INT +WDIOC_SETOPTIONS = 4 | WDR_INT +WDIOC_KEEPALIVE = 5 | WDR_INT +WDIOC_SETTIMEOUT = 6 | WDWR_INT +WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT +WDIOC_GETTIMELEFT = 10 | WDR_INT + +# Watchdog status constants +WDIOS_DISABLECARD = 0x0001 +WDIOS_ENABLECARD = 0x0002 + +WDT_COMMON_ERROR = -1 +WDT_IDENTITY = "CPLD Watchdog" +WDT_SYSFS_PATH = "/sys/class/watchdog/" + +DEFAULT_TIMEOUT = 180 + + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + def __init__(self): + self.watchdog, self.wdt_main_dev_name = self._get_wdt() + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name + self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name + self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name + # Set default value + self._disable() + self.armed = False + self.timeout = self._gettimeout() + + def _is_wd_main(self, dev): + """ + Checks watchdog identity + """ + identity = self._read_file( + "{}/{}/identity".format(WDT_SYSFS_PATH, dev)) + return identity == WDT_IDENTITY + + def _get_wdt(self): + """ + Retrieves watchdog device + """ + wdt_main_dev_list = [dev for dev in os.listdir( + "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] + if not wdt_main_dev_list: + return None + wdt_main_dev_name = wdt_main_dev_list[0] + watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name + + def _read_file(self, file_path): + """ + Read text file + """ + try: + with open(file_path, "r") as fd: + txt = fd.read() + except IOError: + return WDT_COMMON_ERROR + return txt.strip() + + def _enable(self): + """ + Turn on the watchdog timer + """ + req = array.array('h', [WDIOS_ENABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _disable(self): + """ + Turn off the watchdog timer + """ + req = array.array('h', [WDIOS_DISABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + req = array.array('I', [seconds]) + fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) + return int(req[0]) + + def _gettimeout(self): + """ + Get watchdog timeout + @return watchdog timeout + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) + + return int(req[0]) + + def _gettimeleft(self): + """ + Get time left before watchdog timer expires + @return time left in seconds + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) + + return int(req[0]) + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* available + value. + + Returns: + An integer specifying the *actual* number of seconds the watchdog + was armed with. On failure returns -1. + """ + ret = WDT_COMMON_ERROR + if seconds < 0: + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + if self.armed: + self._keepalive() + else: + self._settimeout(seconds) + self._enable() + self.armed = True + ret = self.timeout + except IOError: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + + Returns: + A boolean, True if watchdog is armed, False if not + """ + return self.armed + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds remaining on + the watchdog timer + + Returns: + An integer specifying the number of seconds remaining on thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + timeleft = WDT_COMMON_ERROR + + if self.armed: + try: + timeleft = self._gettimeleft() + except IOError: + pass + + return timeleft + + def __del__(self): + """ + Close watchdog + """ + os.close(self.watchdog) diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/compat b/platform/broadcom/sonic-platform-modules-ragile/debian/compat index 45a4fb75db86..f599e28b8ab0 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/compat +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/compat @@ -1 +1 @@ -8 +10 diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/control b/platform/broadcom/sonic-platform-modules-ragile/debian/control index 795c8219a61e..ae30aee8c0b5 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/control +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/control @@ -1,18 +1,18 @@ Source: sonic-ragile-platform-modules Section: main Priority: extra -Maintainer: support +Maintainer: support Standards-Version: 3.9.3 Package: platform-modules-ragile-ra-b6510-48v8c Architecture: amd64 Description: kernel modules for platform devices such as fan, led, sfp -Package: platform-modules-ragile-ra-b6910-64c +Package: platform-modules-ragile-ra-b6510-32c Architecture: amd64 Description: kernel modules for platform devices such as fan, led, sfp -Package: platform-modules-ragile-ra-b6510-32c +Package: platform-modules-ragile-ra-b6910-64c Architecture: amd64 Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/copyright b/platform/broadcom/sonic-platform-modules-ragile/debian/copyright index 1e4fc20a1672..676cdeec726b 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/copyright +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/copyright @@ -1,5 +1,4 @@ Copyright (C) 2016 Microsoft, Inc -Copyright (C) 2018 Ragile Network Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install index 568190dca044..a63d409ace41 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install @@ -1 +1 @@ -ra-b6510-48v8c/scripts/pddf_post_driver_install.sh /usr/local/bin +ra-b6510-48v8c/modules/sonic_platform-1.0-py3-none-any.whl /usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0 diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst index 0d9d6a34d2a5..a8132f4f65a9 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst @@ -7,11 +7,4 @@ if [ -e /boot/System.map-${kernel_version} ]; then depmod -a -F /boot/System.map-${kernel_version} ${kernel_version} || true fi -# enable platform-service -depmod -a -# systemctl enable platform-modules-ra-b6510-48v8c.service -# systemctl start platform-modules-ra-b6510-48v8c.service -systemctl enable pddf-platform-init.service -systemctl start pddf-platform-init.service - #DEBHELPER# diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk b/platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk deleted file mode 100755 index 6620b8762f86..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk +++ /dev/null @@ -1,8 +0,0 @@ -currentdir = $(shell pwd) - -MODULE_DIRS := ra-b6510-48v8c -MODULE_DIRS += ra-b6910-64c -MODULE_DIRS += ra-b6510-32c -MODULE_DIRS += ra-b6920-4s - -export MODULE_DIRS diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk b/platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk new file mode 100644 index 000000000000..912668c199b3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk @@ -0,0 +1,5 @@ +currentdir = $(shell pwd) + +MODULE_DIRS := ra-b6510-48v8c + +export MODULE_DIRS diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/rules b/platform/broadcom/sonic-platform-modules-ragile/debian/rules index 7e5aa13b2e04..0177d5072684 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/rules +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/rules @@ -6,33 +6,27 @@ KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) KBUILD_OUTPUT=$(KERNEL_SRC)/build -LIB_DIR = usr/lib/python3.7/dist-packages +LIB_DIR = usr/lib/python3/dist-packages CUSTOM_RULES_DIR := $(shell pwd)/debian -PLATFORM_PREFIX = "x86_64-ragile" -PLATFORM_VER = "r0" -BDIST_DIR = "dist" -BDIST_TARGET = "bdist_t" +export INSTALL_MOD_DIR top_srcdir KVERSION KERNEL_SRC CC KBUILD_OUTPUT CUSTOM_RULES_DIR -export INSTALL_MOD_DIR top_srcdir KVERSION KERNEL_SRC CC KBUILD_OUTPUT +include $(CUSTOM_RULES_DIR)/rule.mk -include $(CUSTOM_RULES_DIR)/rule-ragile.mk - -#all products need common +#all product need common COMPILE_DIRS = $(MODULE_DIRS) clean_dirs = $(MODULE_DIRS) clean_dirs += common -custom_clean_dirs := $(addprefix _clean_,$(clean_dirs) ) - +complie_clean_dirs := $(addprefix _clean_,$(clean_dirs) ) %: dh $@ -build: $(COMPILE_DIRS) +build: COMPILE_WHL @echo "build success" -$(custom_clean_dirs): +$(complie_clean_dirs): $(MAKE) -C $(patsubst _clean_%,%,$@) clean common_build : @@ -42,29 +36,32 @@ $(COMPILE_DIRS): common_build $(MAKE) -C $(MOD_SRC_DIR)/$@ dh_testdir dh_installdirs - # - # wheel pcakage - @cp -r \ - $(MOD_SRC_DIR)/common/lib/rgutil \ - $(MOD_SRC_DIR)/common/lib/eepromutil \ - $(MOD_SRC_DIR)/$@/; \ - cd $(MOD_SRC_DIR)/$@; \ - python3 setup.py bdist_wheel --bdist-dir $(BDIST_DIR) -d $(BDIST_TARGET); \ - mkdir -p build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER); \ - mkdir -p build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER)/pddf; \ - cp $(BDIST_TARGET)/*.whl build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER); \ - cp $(BDIST_TARGET)/*.whl build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER)/pddf/; \ - cd $(MOD_SRC_DIR); \ - rm -rf \ - $(MOD_SRC_DIR)/$@/rgutil \ - $(MOD_SRC_DIR)/$@/eepromutil \ - $(MOD_SRC_DIR)/$@/$(BDIST_TARGET) - - cp -r $(MOD_SRC_DIR)/common/build/* debian/platform-modules-ragile-$@/ - cp -r $(MOD_SRC_DIR)/$@/build/* debian/platform-modules-ragile-$@/ + cp -r $(MOD_SRC_DIR)/common/build/* debian/platform-modules-ragile-$@/; \ + cp -r $(MOD_SRC_DIR)/$@/build/* debian/platform-modules-ragile-$@/; \ + +COMPILE_WHL: $(COMPILE_DIRS) + @(for mod in $(MODULE_DIRS); do \ + cd $(MOD_SRC_DIR)/$${mod}; \ + cp -r $(MOD_SRC_DIR)/common/lib/plat_hal $(MOD_SRC_DIR)/$${mod}/; \ + cp -r $(MOD_SRC_DIR)/common/lib/wbutil $(MOD_SRC_DIR)/$${mod}/; \ + cp -r $(MOD_SRC_DIR)/common/lib/eepromutil $(MOD_SRC_DIR)/$${mod}/; \ + cp -r $(MOD_SRC_DIR)/common/sonic_platform $(MOD_SRC_DIR)/$${mod}/; \ + cp $(MOD_SRC_DIR)/common/script/hal_pltfm.py $(MOD_SRC_DIR)/$${mod}/hal_pltfm.py; \ + cp $(MOD_SRC_DIR)/common/script/platform_util.py $(MOD_SRC_DIR)/$${mod}/platform_util.py; \ + cp $(MOD_SRC_DIR)/common/script/platform_intf.py $(MOD_SRC_DIR)/$${mod}/platform_intf.py; \ + python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/plat_hal; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/wbutil; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/eepromutil; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/sonic_platform; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/hal_pltfm.py; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/platform_intf.py; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/platform_util.py; \ + cd $(MOD_SRC_DIR); \ + done) binary: binary-indep - @echo "======================================================" + @echo "=======================================================" binary-indep: # Resuming debhelper scripts @@ -87,7 +84,7 @@ override_dh_usrlocal: override_dh_pysupport: -clean: $(custom_clean_dirs) +clean: $(complie_clean_dirs) dh_testdir dh_testroot dh_clean diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE deleted file mode 100755 index d37122689f3e..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -Copyright (C) 2016 Microsoft, Inc -Copyright (C) 2018 Ragile Network Corporation -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS deleted file mode 100755 index ec8222405085..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS +++ /dev/null @@ -1,5 +0,0 @@ -# See the SONiC project governance document for more information - -Name = "support" -Email = "support@ragile.com" -Mailinglist = sonicproject@googlegroups.com diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile old mode 100755 new mode 100644 index bc2010b78e3f..1b84abef410a --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile @@ -5,13 +5,9 @@ EXTRA_CFLAGS+= -Wall SUB_BUILD_DIR = $(PWD)/build INSTALL_DIR = $(SUB_BUILD_DIR)/$(KERNEL_SRC)/$(INSTALL_MOD_DIR) INSTALL_SCRIPT_DIR = $(SUB_BUILD_DIR)/usr/local/bin -INSTALL_SERVICE_DIR = $(SUB_BUILD_DIR)/lib/systemd/system/ - -KBUILD_EXTRA_SYMBOLS += $(DIR_KERNEL_SRC)/Module.symvers -ifeq "5.10.0" "$(word 1, $(sort 5.10.0 $(KERNEL_VERSION)))" -KBUILD_EXTRA_SYMBOLS += $(PWD)/../../../pddf/i2c/Module.symvers.PDDF -endif -export KBUILD_EXTRA_SYMBOLS +INSTALL_LIB_DIR = $(SUB_BUILD_DIR)/usr/lib/python3/dist-packages +INSTALL_SYSFS_CFG_DIR = $(SUB_BUILD_DIR)/etc/plat_sysfs_cfg +INSTALL_UPGRADE_TEST_DIR = $(SUB_BUILD_DIR)/etc/.upgrade_test all: $(MAKE) -C $(KBUILD_OUTPUT) M=$(DIR_KERNEL_SRC) modules @@ -19,8 +15,12 @@ all: cp -r $(DIR_KERNEL_SRC)/*.ko $(INSTALL_DIR) @if [ ! -d ${INSTALL_SCRIPT_DIR} ]; then mkdir -p ${INSTALL_SCRIPT_DIR} ;fi cp -r $(PWD)/config/* $(INSTALL_SCRIPT_DIR) - @if [ ! -d ${INSTALL_SERVICE_DIR} ]; then mkdir -p ${INSTALL_SERVICE_DIR} ;fi - cp $(PWD)/systemd/*.service $(INSTALL_SERVICE_DIR) + @if [ ! -d ${INSTALL_LIB_DIR} ]; then mkdir -p ${INSTALL_LIB_DIR} ;fi + @if [ -d $(PWD)/hal-config/ ]; then cp -r $(PWD)/hal-config/* ${INSTALL_LIB_DIR} ;fi + @if [ ! -d ${INSTALL_SYSFS_CFG_DIR} ]; then mkdir -p ${INSTALL_SYSFS_CFG_DIR} ;fi + @if [ -d $(PWD)/plat_sysfs_cfg/ ]; then cp -r $(PWD)/plat_sysfs_cfg/* ${INSTALL_SYSFS_CFG_DIR} ;fi + @if [ ! -d ${INSTALL_UPGRADE_TEST_DIR} ]; then mkdir -p ${INSTALL_UPGRADE_TEST_DIR} ;fi + @if [ -d $(PWD)/.upgrade_test/ ]; then cp -r $(PWD)/.upgrade_test/* ${INSTALL_UPGRADE_TEST_DIR} ;fi clean: rm -f ${DIR_KERNEL_SRC}/*.o ${DIR_KERNEL_SRC}/*.ko ${DIR_KERNEL_SRC}/*.mod.c ${DIR_KERNEL_SRC}/.*.cmd rm -f ${DIR_KERNEL_SRC}/Module.markers ${DIR_KERNEL_SRC}/Module.symvers ${DIR_KERNEL_SRC}/modules.order diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md deleted file mode 100755 index 787636c4ad20..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md +++ /dev/null @@ -1 +0,0 @@ -Device drivers for support of ragile platform for the SONiC project diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py index 5fe30ea12848..66ca2ddb1922 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py @@ -1,484 +1,1110 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- -from ragilecommon import * -PCA9548START = -1 -PCA9548BUSEND = -2 +from platform_common import * +STARTMODULE = { + "hal_fanctrl": 1, + "hal_ledctrl": 1, + "avscontrol": 1, + "dev_monitor": 1, + "pmon_syslog": 1, + "tty_console": 1, + "macledreset": 1, + "sff_temp_polling": 1, + "generate_airflow": 1, + "reboot_cause": 1, +} + +MAC_LED_RESET = {"pcibus": 8, "slot": 0, "fn": 0, "bar": 0, "offset": 64, "reset": 0x98} + +MANUINFO_CONF = { + "bios": { + "key": "BIOS", + "head": True, + "next": "onie" + }, + "bios_vendor": { + "parent": "bios", + "key": "Vendor", + "cmd": "dmidecode -t 0 |grep Vendor", + "pattern": r".*Vendor", + "separator": ":", + "arrt_index": 1, + }, + "bios_version": { + "parent": "bios", + "key": "Version", + "cmd": "dmidecode -t 0 |grep Version", + "pattern": r".*Version", + "separator": ":", + "arrt_index": 2, + }, + "bios_date": { + "parent": "bios", + "key": "Release Date", + "cmd": "dmidecode -t 0 |grep Release", + "pattern": r".*Release Date", + "separator": ":", + "arrt_index": 3, + }, + "onie": { + "key": "ONIE", + "next": "cpu" + }, + "onie_date": { + "parent": "onie", + "key": "Build Date", + "file": "/host/machine.conf", + "pattern": r"^onie_build_date", + "separator": "=", + "arrt_index": 1, + }, + "onie_version": { + "parent": "onie", + "key": "Version", + "file": "/host/machine.conf", + "pattern": r"^onie_version", + "separator": "=", + "arrt_index": 2, + }, + + "cpu": { + "key": "CPU", + "next": "ssd" + }, + "cpu_vendor": { + "parent": "cpu", + "key": "Vendor", + "cmd": "dmidecode --type processor |grep Manufacturer", + "pattern": r".*Manufacturer", + "separator": ":", + "arrt_index": 1, + }, + "cpu_model": { + "parent": "cpu", + "key": "Device Model", + "cmd": "dmidecode --type processor | grep Version", + "pattern": r".*Version", + "separator": ":", + "arrt_index": 2, + }, + "cpu_core": { + "parent": "cpu", + "key": "Core Count", + "cmd": "dmidecode --type processor | grep \"Core Count\"", + "pattern": r".*Core Count", + "separator": ":", + "arrt_index": 3, + }, + "cpu_thread": { + "parent": "cpu", + "key": "Thread Count", + "cmd": "dmidecode --type processor | grep \"Thread Count\"", + "pattern": r".*Thread Count", + "separator": ":", + "arrt_index": 4, + }, + "ssd": { + "key": "SSD", + "next": "cpld" + }, + "ssd_model": { + "parent": "ssd", + "key": "Device Model", + "cmd": "smartctl -i /dev/sda |grep \"Device Model\"", + "pattern": r".*Device Model", + "separator": ":", + "arrt_index": 1, + }, + "ssd_fw": { + "parent": "ssd", + "key": "Firmware Version", + "cmd": "smartctl -i /dev/sda |grep \"Firmware Version\"", + "pattern": r".*Firmware Version", + "separator": ":", + "arrt_index": 2, + }, + "ssd_user_cap": { + "parent": "ssd", + "key": "User Capacity", + "cmd": "smartctl -i /dev/sda |grep \"User Capacity\"", + "pattern": r".*User Capacity", + "separator": ":", + "arrt_index": 3, + }, + + "cpld": { + "key": "CPLD", + "next": "psu" + }, + + "cpld1": { + "key": "CPLD1", + "parent": "cpld", + "arrt_index": 1, + }, + "cpld1_model": { + "key": "Device Model", + "parent": "cpld1", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld1_vender": { + "key": "Vendor", + "parent": "cpld1", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld1_desc": { + "key": "Description", + "parent": "cpld1", + "config": "CPU_CPLD", + "arrt_index": 3, + }, + "cpld1_version": { + "key": "Firmware Version", + "parent": "cpld1", + "reg": { + "loc": "/dev/port", + "offset": 0x700, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld2": { + "key": "CPLD2", + "parent": "cpld", + "arrt_index": 2, + }, + "cpld2_model": { + "key": "Device Model", + "parent": "cpld2", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld2_vender": { + "key": "Vendor", + "parent": "cpld2", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld2_desc": { + "key": "Description", + "parent": "cpld2", + "config": "CONNECT_CPLD", + "arrt_index": 3, + }, + "cpld2_version": { + "key": "Firmware Version", + "parent": "cpld2", + "reg": { + "loc": "/dev/port", + "offset": 0x900, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld3": { + "key": "CPLD3", + "parent": "cpld", + "arrt_index": 3, + }, + "cpld3_model": { + "key": "Device Model", + "parent": "cpld3", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld3_vender": { + "key": "Vendor", + "parent": "cpld3", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld3_desc": { + "key": "Description", + "parent": "cpld3", + "config": "CONNECT_CPLD-FAN", + "arrt_index": 3, + }, + "cpld3_version": { + "key": "Firmware Version", + "parent": "cpld3", + "i2c": { + "bus": "2", + "loc": "0x0d", + "offset": 0, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld4": { + "key": "CPLD4", + "parent": "cpld", + "arrt_index": 4, + }, + "cpld4_model": { + "key": "Device Model", + "parent": "cpld4", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld4_vender": { + "key": "Vendor", + "parent": "cpld4", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld4_desc": { + "key": "Description", + "parent": "cpld4", + "config": "MAC_CPLD1", + "arrt_index": 3, + }, + "cpld4_version": { + "key": "Firmware Version", + "parent": "cpld4", + "i2c": { + "bus": "8", + "loc": "0x30", + "offset": 0, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld5": { + "key": "CPLD5", + "parent": "cpld", + "arrt_index": 5, + }, + "cpld5_model": { + "key": "Device Model", + "parent": "cpld5", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld5_vender": { + "key": "Vendor", + "parent": "cpld5", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld5_desc": { + "key": "Description", + "parent": "cpld5", + "config": "MAC_CPLD2", + "arrt_index": 3, + }, + "cpld5_version": { + "key": "Firmware Version", + "parent": "cpld5", + "i2c": { + "bus": "8", + "loc": "0x31", + "offset": 0, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "psu": { + "key": "PSU", + "next": "fan" + }, + + "psu1": { + "parent": "psu", + "key": "PSU1", + "arrt_index": 1, + }, + "psu1_hw_version": { + "key": "Hardware Version", + "parent": "psu1", + "extra": { + "funcname": "getPsu", + "id": "psu1", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "psu1_fw_version": { + "key": "Firmware Version", + "parent": "psu1", + "config": "NA", + "arrt_index": 2, + }, + + "psu2": { + "parent": "psu", + "key": "PSU2", + "arrt_index": 2, + }, + "psu2_hw_version": { + "key": "Hardware Version", + "parent": "psu2", + "extra": { + "funcname": "getPsu", + "id": "psu2", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "psu2_fw_version": { + "key": "Firmware Version", + "parent": "psu2", + "config": "NA", + "arrt_index": 2, + }, + + "fan": { + "key": "FAN", + "next": "i210" + }, + + "fan1": { + "key": "FAN1", + "parent": "fan", + "arrt_index": 1, + }, + "fan1_hw_version": { + "key": "Hardware Version", + "parent": "fan1", + "extra": { + "funcname": "checkFan", + "id": "fan1", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan1_fw_version": { + "key": "Firmware Version", + "parent": "fan1", + "config": "NA", + "arrt_index": 2, + }, + + "fan2": { + "key": "FAN2", + "parent": "fan", + "arrt_index": 2, + }, + "fan2_hw_version": { + "key": "Hardware Version", + "parent": "fan2", + "extra": { + "funcname": "checkFan", + "id": "fan2", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan2_fw_version": { + "key": "Firmware Version", + "parent": "fan2", + "config": "NA", + "arrt_index": 2, + }, -RAGILE_CARDID = 0x0000404a -RAGILE_PRODUCTNAME = "RA-B6510-48V8C" + "fan3": { + "key": "FAN3", + "parent": "fan", + "arrt_index": 3, + }, + "fan3_hw_version": { + "key": "Hardware Version", + "parent": "fan3", + "extra": { + "funcname": "checkFan", + "id": "fan3", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan3_fw_version": { + "key": "Firmware Version", + "parent": "fan3", + "config": "NA", + "arrt_index": 2, + }, + + "fan4": { + "key": "FAN4", + "parent": "fan", + "arrt_index": 4, + }, + "fan4_hw_version": { + "key": "Hardware Version", + "parent": "fan4", + "extra": { + "funcname": "checkFan", + "id": "fan4", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan4_fw_version": { + "key": "Firmware Version", + "parent": "fan4", + "config": "NA", + "arrt_index": 2, + }, + + "i210": { + "key": "NIC", + "next": "fpga" + }, + "i210_model": { + "parent": "i210", + "config": "NA", + "key": "Device Model", + "arrt_index": 1, + }, + "i210_vendor": { + "parent": "i210", + "config": "INTEL", + "key": "Vendor", + "arrt_index": 2, + }, + "i210_version": { + "parent": "i210", + "cmd": "ethtool -i eth0", + "pattern": r"firmware-version", + "separator": ":", + "key": "Firmware Version", + "arrt_index": 3, + }, -STARTMODULE = { - "fancontrol":1, - "avscontrol":1, - "dev_monitor":1 + "fpga": { + "key": "FPGA", + "next": "asic" + }, + "fpga_model": { + "parent": "fpga", + "config": "XC7A15T-2FGG484C", + "key": "Device Model", + "arrt_index": 1, + }, + "fpga_vendor": { + "parent": "fpga", + "config": "XILINX", + "key": "Vendor", + "arrt_index": 2, + }, + "fpga_desc": { + "parent": "fpga", + "config": "NA", + "key": "Description", + "arrt_index": 3, + }, + "fpga_hw_version": { + "parent": "fpga", + "config": "NA", + "key": "Hardware Version", + "arrt_index": 4, + }, + "fpga_fw_version": { + "parent": "fpga", + "pci": { + "bus": 8, + "slot": 0, + "fn": 0, + "bar": 0, + "offset": 0 + }, + "key": "Firmware Version", + "arrt_index": 5, + }, + "fpga_date": { + "parent": "fpga", + "pci": { + "bus": 8, + "slot": 0, + "fn": 0, + "bar": 0, + "offset": 4 + }, + "key": "Build Date", + "arrt_index": 6, + }, + "asic": { + "key": "ASIC", + }, + "sdk_model": { + "parent": "asic", + "cmd": "bcmcmd -t 1 att", + "pattern": r"^Attach", + "regular": r"(?<=\()[^)]*(?=\))", + "key": "Device Model", + "arrt_index": 1, + }, + "sdk_version": { + "parent": "asic", + "cmd": "bcmcmd -t 1 version | grep Release", + "pattern": r".*Release", + "separator": ":", + "key": "SDK Version", + "arrt_index": 2, + }, + "pci_version": { + "parent": "asic", + "cmd": "bcmcmd -t 1 \"pciephy fw version\" |grep \"PCIe FW version\"", + "pattern": r".*PCIe FW version", + "separator": ":", + "key": "PCIe Firmware Version", + "arrt_index": 3, + }, } -i2ccheck_params = {"busend":"i2c-66","retrytime":6} +PMON_SYSLOG_STATUS = { + "polling_time": 3, + "sffs": { + "present": {"path": ["/sys/wb_plat/sff/*/present"], "ABSENT": 0}, + "nochangedmsgflag": 0, + "nochangedmsgtime": 60, + "noprintfirsttimeflag": 1, + "alias": { + "sff1": "Ethernet1", + "sff2": "Ethernet2", + "sff3": "Ethernet3", + "sff4": "Ethernet4", + "sff5": "Ethernet5", + "sff6": "Ethernet6", + "sff7": "Ethernet7", + "sff8": "Ethernet8", + "sff9": "Ethernet9", + "sff10": "Ethernet10", + "sff11": "Ethernet11", + "sff12": "Ethernet12", + "sff13": "Ethernet13", + "sff14": "Ethernet14", + "sff15": "Ethernet15", + "sff16": "Ethernet16", + "sff17": "Ethernet17", + "sff18": "Ethernet18", + "sff19": "Ethernet19", + "sff20": "Ethernet20", + "sff21": "Ethernet21", + "sff22": "Ethernet22", + "sff23": "Ethernet23", + "sff24": "Ethernet24", + "sff25": "Ethernet25", + "sff26": "Ethernet26", + "sff27": "Ethernet27", + "sff28": "Ethernet28", + "sff29": "Ethernet29", + "sff30": "Ethernet30", + "sff31": "Ethernet31", + "sff32": "Ethernet32", + "sff33": "Ethernet33", + "sff34": "Ethernet34", + "sff35": "Ethernet35", + "sff36": "Ethernet36", + "sff37": "Ethernet37", + "sff38": "Ethernet38", + "sff39": "Ethernet39", + "sff40": "Ethernet40", + "sff41": "Ethernet41", + "sff42": "Ethernet42", + "sff43": "Ethernet43", + "sff44": "Ethernet44", + "sff45": "Ethernet45", + "sff46": "Ethernet46", + "sff47": "Ethernet47", + "sff48": "Ethernet48", + "sff49": "Ethernet49", + "sff50": "Ethernet50", + "sff51": "Ethernet51", + "sff52": "Ethernet52", + "sff53": "Ethernet53", + "sff54": "Ethernet54", + "sff55": "Ethernet55", + "sff56": "Ethernet56", + } + }, + "fans": { + "present": {"path": ["/sys/wb_plat/fan/*/present"], "ABSENT": 0}, + "status": [ + {"path": "/sys/wb_plat/fan/%s/motor0/status", 'okval': 1}, + {"path": "/sys/wb_plat/fan/%s/motor1/status", 'okval': 1}, + ], + "nochangedmsgflag": 1, + "nochangedmsgtime": 60, + "noprintfirsttimeflag": 0, + "alias": { + "fan1": "FAN1", + "fan2": "FAN2", + "fan3": "FAN3", + "fan4": "FAN4" + } + }, + "psus": { + "present": {"path": ["/sys/wb_plat/psu/*/present"], "ABSENT": 0}, + "status": [ + {"path": "/sys/wb_plat/psu/%s/output", "okval": 1}, + {"path": "/sys/wb_plat/psu/%s/alert", "okval": 0}, + ], + "nochangedmsgflag": 1, + "nochangedmsgtime": 60, + "noprintfirsttimeflag": 0, + "alias": { + "psu1": "PSU1", + "psu2": "PSU2" + } + } +} + +##################### MAC Voltage adjust#################################### +MAC_DEFAULT_PARAM = [ + { + "name": "mac_core", # AVS name + "type": 1, # 1: used default value, if rov value not in range. 0: do nothing, if rov value not in range + "default": 0x74, # default value, if rov value not in range + "sdkreg": "TOP_AVS_SEL_REG", # SDK register name + "sdktype": 0, # 0: No shift operation required, 1: shift operation required + "macregloc": 24, # Shift right 24 bits + "mask": 0xff, # Use with macregloc + "rov_source": 1, # 0:get rov value from cpld, 1: get rov value from SDK + "cpld_avs": {"bus": 6, "loc": 0x0d, "offset": 0xc3, "gettype": "i2c"}, + "set_avs": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/avs0_vout", + "gettype": "sysfs", "formula": "int((%f)*1000000)" + }, + "mac_avs_param": { + 0x08: 0.888, + 0x72: 0.900, + 0x73: 0.894, + 0x74: 0.888, + 0x75: 0.882, + 0x76: 0.875, + 0x77: 0.869, + 0x78: 0.863, + 0x79: 0.857, + 0x7a: 0.850, + 0x7b: 0.844, + 0x7c: 0.838, + 0x7d: 0.832, + 0x7e: 0.825, + 0x7f: 0.819, + 0x80: 0.813, + 0x81: 0.807, + 0x82: 0.800, + 0x83: 0.794, + 0x84: 0.788, + 0x85: 0.782, + 0x86: 0.775, + 0x87: 0.769, + 0x88: 0.763, + 0x89: 0.757, + 0x8A: 0.750 + } + } +] + +BLACKLIST_DRIVERS = [ + {"name": "i2c_i801", "delay": 0}, +] + +DRIVERLISTS = [ + {"name": "wb_i2c_i801", "delay": 0}, + {"name": "wb_gpio_d1500", "delay": 0}, + {"name": "i2c_dev", "delay": 0}, + {"name": "wb_i2c_algo_bit", "delay": 0}, + {"name": "wb_i2c_gpio", "delay": 0}, + {"name": "i2c_mux", "delay": 0}, + {"name": "wb_gpio_device", "delay": 0}, + {"name": "wb_i2c_gpio_device gpio_sda=17 gpio_scl=1 gpio_udelay=2", "delay": 0}, + {"name": "platform_common dfd_my_type=0x404a", "delay": 0}, + {"name": "wb_lpc_drv", "delay": 0}, + {"name": "wb_lpc_drv_device", "delay": 0}, + {"name": "wb_io_dev", "delay": 0}, + {"name": "wb_io_dev_device", "delay": 0}, + {"name": "wb_fpga_pcie", "delay": 0}, + {"name": "wb_pcie_dev", "delay": 0}, + {"name": "wb_pcie_dev_device", "delay": 0}, + {"name": "wb_i2c_dev", "delay": 0}, + {"name": "wb_i2c_ocores", "delay": 0}, + {"name": "wb_i2c_ocores_device", "delay": 0}, + {"name": "wb_i2c_mux_pca9641", "delay": 0}, + {"name": "wb_i2c_mux_pca954x", "delay": 0}, + {"name": "wb_i2c_mux_pca954x_device", "delay": 0}, + {"name": "wb_i2c_dev_device", "delay": 0}, + {"name": "wb_lm75", "delay": 0}, + {"name": "wb_optoe", "delay": 0}, + {"name": "wb_at24", "delay": 0}, + {"name": "wb_mac_bsc", "delay": 0}, + {"name": "wb_pmbus_core", "delay": 0}, + {"name": "wb_isl68137", "delay": 0}, + {"name": "wb_csu550", "delay": 0}, + {"name": "wb_ina3221", "delay": 0}, + {"name": "wb_tps53622", "delay": 0}, + {"name": "firmware_driver_cpld", "delay": 0}, + {"name": "firmware_driver_ispvme", "delay": 0}, + {"name": "firmware_driver_sysfs", "delay": 0}, + {"name": "wb_firmware_upgrade_device", "delay": 0}, + {"name": "plat_dfd", "delay": 0}, + {"name": "plat_switch", "delay": 0}, + {"name": "plat_fan", "delay": 0}, + {"name": "plat_psu", "delay": 0}, + {"name": "plat_sff", "delay": 0}, +] + +DEVICE = [ + {"name": "wb_24c02", "bus": 0, "loc": 0x56}, + {"name": "wb_mac_bsc_td3", "bus": 3, "loc": 0x44}, + # fan + {"name": "wb_24c02", "bus": 16, "loc": 0x50}, + {"name": "wb_24c02", "bus": 17, "loc": 0x50}, + {"name": "wb_24c02", "bus": 18, "loc": 0x50}, + {"name": "wb_24c02", "bus": 19, "loc": 0x50}, + # psu + {"name": "wb_24c02", "bus": 24, "loc": 0x50}, + {"name": "wb_dps550", "bus": 24, "loc": 0x58}, + {"name": "wb_24c02", "bus": 25, "loc": 0x50}, + {"name": "wb_dps550", "bus": 25, "loc": 0x58}, + # temp + {"name": "wb_lm75", "bus": 3, "loc": 0x48}, + {"name": "wb_lm75", "bus": 3, "loc": 0x49}, + {"name": "wb_lm75", "bus": 3, "loc": 0x4a}, + {"name": "wb_lm75", "bus": 3, "loc": 0x4b}, + {"name": "wb_lm75", "bus": 3, "loc": 0x4c}, + # dcdc + {"name": "wb_ina3221", "bus": 7, "loc": 0x40}, + {"name": "wb_ina3221", "bus": 7, "loc": 0x41}, + {"name": "wb_ina3221", "bus": 7, "loc": 0x42}, + {"name": "wb_ina3221", "bus": 7, "loc": 0x43}, + {"name": "wb_tps53622", "bus": 7, "loc": 0x60}, + {"name": "wb_tps53622", "bus": 7, "loc": 0x6c}, + {"name": "wb_isl68127", "bus": 7, "loc": 0x64}, +] + +OPTOE = [ + {"name": "wb_optoe2", "startbus": 32, "endbus": 79}, + {"name": "wb_optoe1", "startbus": 80, "endbus": 87}, +] DEV_MONITOR_PARAM = { "polling_time": 10, "psus": [ { "name": "psu1", - "present": { - "gettype": "i2c", - "bus": 2, - "loc": 0x37, - "offset": 0x51, - "presentbit": 0, - "okval": 0, - }, + "present": {"gettype": "i2c", "bus": 6, "loc": 0x0d, "offset": 0x51, "presentbit": 0, "okval": 0}, "device": [ - { - "id": "psu1pmbus", - "name": "dps550", - "bus": 7, - "loc": 0x58, - "attr": "hwmon", - }, + {"id": "psu1pmbus", "name": "wb_dps550", "bus": 24, "loc": 0x58, "attr": "hwmon"}, + {"id": "psu1frue2", "name": "wb_24c02", "bus": 24, "loc": 0x50, "attr": "eeprom"}, ], }, { "name": "psu2", - "present": { - "gettype": "i2c", - "bus": 2, - "loc": 0x37, - "offset": 0x51, - "presentbit": 4, - "okval": 0, - }, + "present": {"gettype": "i2c", "bus": 6, "loc": 0x0d, "offset": 0x51, "presentbit": 4, "okval": 0}, "device": [ - { - "id": "psu2pmbus", - "name": "dps550", - "bus": 8, - "loc": 0x5B, - "attr": "hwmon", - }, + {"id": "psu2pmbus", "name": "wb_dps550", "bus": 25, "loc": 0x58, "attr": "hwmon"}, + {"id": "psu2frue2", "name": "wb_24c02", "bus": 25, "loc": 0x50, "attr": "eeprom"}, ], }, ], + "fans": [ + { + "name": "fan1", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 0, "okval": 0}, + "device": [ + {"id": "fan1frue2", "name": "24c02", "bus": 16, "loc": 0x50, "attr": "eeprom"}, + ], + }, + { + "name": "fan2", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 1, "okval": 0}, + "device": [ + {"id": "fan2frue2", "name": "24c02", "bus": 17, "loc": 0x50, "attr": "eeprom"}, + ], + }, + { + "name": "fan3", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 2, "okval": 0}, + "device": [ + {"id": "fan3frue2", "name": "24c02", "bus": 18, "loc": 0x50, "attr": "eeprom"}, + ], + }, + { + "name": "fan4", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 3, "okval": 0}, + "device": [ + {"id": "fan4frue2", "name": "24c02", "bus": 19, "loc": 0x50, "attr": "eeprom"}, + ], + }, + ], + "others": [ + { + "name": "eeprom", + "device": [ + {"id": "eeprom_1", "name": "wb_24c02", "bus": 0, "loc": 0x56, "attr": "eeprom"}, + ], + }, + { + "name": "lm75", + "device": [ + {"id": "lm75_1", "name": "wb_lm75", "bus": 3, "loc": 0x48, "attr": "hwmon"}, + {"id": "lm75_2", "name": "wb_lm75", "bus": 3, "loc": 0x49, "attr": "hwmon"}, + {"id": "lm75_3", "name": "wb_lm75", "bus": 3, "loc": 0x4a, "attr": "hwmon"}, + {"id": "lm75_4", "name": "wb_lm75", "bus": 3, "loc": 0x4b, "attr": "hwmon"}, + {"id": "lm75_5", "name": "wb_lm75", "bus": 3, "loc": 0x4c, "attr": "hwmon"}, + ], + }, + { + "name": "mac_bsc", + "device": [ + {"id": "mac_bsc_1", "name": "wb_mac_bsc_td3", "bus": 3, "loc": 0x44, "attr": "hwmon"}, + ], + }, + { + "name": "ina3221", + "device": [ + {"id": "ina3221_1", "name": "wb_ina3221", "bus": 7, "loc": 0x40, "attr": "hwmon"}, + {"id": "ina3221_2", "name": "wb_ina3221", "bus": 7, "loc": 0x41, "attr": "hwmon"}, + {"id": "ina3221_3", "name": "wb_ina3221", "bus": 7, "loc": 0x42, "attr": "hwmon"}, + {"id": "ina3221_4", "name": "wb_ina3221", "bus": 7, "loc": 0x43, "attr": "hwmon"}, + ], + }, + { + "name": "tps53622", + "device": [ + {"id": "tps53622_1", "name": "wb_tps53622", "bus": 7, "loc": 0x60, "attr": "hwmon"}, + {"id": "tps53622_2", "name": "wb_tps53622", "bus": 7, "loc": 0x6c, "attr": "hwmon"}, + ], + }, + { + "name": "isl68127", + "device": [ + {"id": "isl68127_1", "name": "wb_isl68127", "bus": 7, "loc": 0x64, "attr": "hwmon"}, + ], + } + ], } -fanlevel = { - "tips":["LOW","MEDIUM","HIGH"], - "level":[51,150,255], - "low_speed":[500,7500,17000], - "high_speed":[11000,22500,28500] -} - -# fit with pddf -fanloc = [ - { - "name": "FAN1/FAN2/FAN3/FAN4", - "location": "2-0066/fan1_pwm", - "childfans": [ - {"name": "FAN1", "location": "2-0066/fan1_input"}, - {"name": "FAN2", "location": "2-0066/fan2_input"}, - {"name": "FAN3", "location": "2-0066/fan3_input"}, - {"name": "FAN4", "location": "2-0066/fan4_input"}, - ], - }, +INIT_PARAM_PRE = [ + {"loc": "7-0064/hwmon/hwmon*/avs0_vout_max", "value": "900000"}, + {"loc": "7-0064/hwmon/hwmon*/avs0_vout_min", "value": "750000"}, ] - - - -MONITOR_TEMP_MIN = 38 -MONITOR_K = 11 -MONITOR_MAC_IN = 35 -MONITOR_DEFAULT_SPEED = 0x60 -MONITOR_MAX_SPEED = 0xFF -MONITOR_MIN_SPEED = 0x33 -MONITOR_MAC_ERROR_SPEED = 0XBB -MONITOR_FAN_TOTAL_NUM = 4 -MONITOR_MAC_UP_TEMP = 50 -MONITOR_MAC_LOWER_TEMP = -50 -MONITOR_MAC_MAX_TEMP = 100 - -MONITOR_FALL_TEMP = 4 -MONITOR_MAC_WARNING_THRESHOLD = 100 -MONITOR_OUTTEMP_WARNING_THRESHOLD = 85 -MONITOR_BOARDTEMP_WARNING_THRESHOLD = 85 -MONITOR_CPUTEMP_WARNING_THRESHOLD = 85 -MONITOR_INTEMP_WARNING_THRESHOLD = 70 - -MONITOR_MAC_CRITICAL_THRESHOLD = 105 -MONITOR_OUTTEMP_CRITICAL_THRESHOLD = 90 -MONITOR_BOARDTEMP_CRITICAL_THRESHOLD = 90 -MONITOR_CPUTEMP_CRITICAL_THRESHOLD = 100 -MONITOR_INTEMP_CRITICAL_THRESHOLD = 80 -MONITOR_CRITICAL_NUM = 3 -MONITOR_SHAKE_TIME = 20 -MONITOR_INTERVAL = 60 - -MONITOR_SYS_LED = [ - {"bus":2,"devno":0x33, "addr":0xb2, "yellow":0x03, "red":0x02,"green":0x01}, - {"bus":2,"devno":0x37, "addr":0xb2, "yellow":0x03, "red":0x02,"green":0x01}] - -MONITOR_SYS_FAN_LED =[ - {"bus":2,"devno":0x33, "addr":0xb4, "yellow":0x06, "red":0x02,"green":0x04}, - ] -MONITOR_FANS_LED = [ - {"bus":2,"devno":0x32, "addr":0x23, "green":0x09, "red":0x0a}, - {"bus":2,"devno":0x32, "addr":0x24, "green":0x09, "red":0x0a}, - {"bus":2,"devno":0x32, "addr":0x25, "green":0x09, "red":0x0a}, - {"bus":2,"devno":0x32, "addr":0x26, "green":0x09, "red":0x0a}] - - -CPLDVERSIONS = [ - {"bus":2, "devno":0x33, "name":"MAC BOARD CPLD-A"}, - {"bus":2, "devno":0x35, "name":"MAC BOARD CPLD-B"}, - {"bus":2, "devno":0x37, "name":"CONNECT BOARD CPLD-A"}, - {"bus":0, "devno":0x0d, "name":"CPU BOARD CPLD"}, +INIT_COMMAND_PRE = [ + "i2cset -y -f 6 0x0d 0x91 0x48", + "i2cset -y -f 6 0x0d 0x92 0x01", # MAC_PWR_EN + "i2cset -y -f 6 0x0d 0x94 0x01", # SFF_PWR_EN + "i2cset -y -f 6 0x0d 0xbf 0x01", # enbale tty_console monitor ] -MONITOR_SYS_PSU_LED =[ - {"bus":2,"devno":0x33, "addr":0xb3, "yellow":0x06, "red":0x02,"green":0x04}, - ] - -MONITOR_FAN_STATUS = [ - {'status':'green' , 'minOkNum':4,'maxOkNum':4}, - {'status':'yellow', 'minOkNum':3,'maxOkNum':3}, - {'status':'red' , 'minOkNum':0,'maxOkNum':2}, - ] - -MONITOR_PSU_STATUS = [ - {'status':'green' , 'minOkNum':2,'maxOkNum':2}, - {'status':'yellow', 'minOkNum':1,'maxOkNum':1}, - {'status':'red' , 'minOkNum':0,'maxOkNum':0}, - ] +INIT_PARAM = [] +INIT_COMMAND = [ + "i2cset -y -f 8 0x30 0x60 0x00", # enable txdis[1~8] + "i2cset -y -f 8 0x30 0x61 0x00", # enable txdis[9~16] + "i2cset -y -f 8 0x30 0x62 0x00", # enable txdis[17~24] + "i2cset -y -f 8 0x31 0x60 0x00", # enable txdis[24~32] + "i2cset -y -f 8 0x31 0x61 0x00", # enable txdis[33~40] + "i2cset -y -f 8 0x31 0x62 0x00", # enable txdis[41~48] +] -MONITOR_DEV_STATUS = { - "temperature": [ - {"name":"lm75in", "location":"/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_input"}, - {"name":"lm75out", "location":"/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_input"}, - {"name":"lm75hot", "location":"/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_input"}, - {"name":"cpu", "location":"/sys/class/hwmon/hwmon0"}, - ], - "fans": [ - { - "name":"fan1", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':0}, - "rollstatus": [ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':0}, - ] - }, - { - "name":"fan2", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':1}, - "rollstatus":[ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':1}, - ] - }, +REBOOT_CAUSE_PARA = { + "reboot_cause_list": [ { - "name":"fan3", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':2}, - "rollstatus":[ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':2}, + "name": "otp_switch_reboot", + "monitor_point": {"gettype": "file_exist", "judge_file": "/etc/.otp_switch_reboot_flag", "okval": True}, + "record": [ + {"record_type": "file", "mode": "cover", "log": "Thermal Overload: ASIC, ", + "path": "/etc/sonic/.reboot/.previous-reboot-cause.txt"}, + {"record_type": "file", "mode": "add", "log": "Thermal Overload: ASIC, ", + "path": "/etc/sonic/.reboot/.history-reboot-cause.txt", "file_max_size": 1 * 1024 * 1024} + ], + "finish_operation": [ + {"gettype": "cmd", "cmd": "rm -rf /etc/.otp_switch_reboot_flag"}, ] }, { - "name":"fan4", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':3}, - "rollstatus":[ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':3}, + "name": "otp_other_reboot", + "monitor_point": {"gettype": "file_exist", "judge_file": "/etc/.otp_other_reboot_flag", "okval": True}, + "record": [ + {"record_type": "file", "mode": "cover", "log": "Thermal Overload: Other, ", + "path": "/etc/sonic/.reboot/.previous-reboot-cause.txt"}, + {"record_type": "file", "mode": "add", "log": "Thermal Overload: Other, ", + "path": "/etc/sonic/.reboot/.history-reboot-cause.txt", "file_max_size": 1 * 1024 * 1024} + ], + "finish_operation": [ + {"gettype": "cmd", "cmd": "rm -rf /etc/.otp_other_reboot_flag"}, ] }, ], - "psus": [ - {"name":"psu1", "bus":2, "loc":0x37, "offset":0x51, "gettype":"i2c", 'presentbit': 0, 'statusbit':1,'alertbit':2}, - {"name":"psu2", "bus":2, "loc":0x37, "offset":0x51, "gettype":"i2c", 'presentbit': 4, 'statusbit':5,'alertbit':6}, - ], - "mac_temp" : { - "flag" : {"bus":2, "loc":0x33, "offset":0xd4, "gettype":"i2c", 'okbit': 0, 'okval':1}, - "loc" : [ - "2-0035/mac_temp_input", - ], - "try_bcmcmd" : 0, - }, + "other_reboot_cause_record": [ + {"record_type": "file", "mode": "cover", "log": "Other, ", "path": "/etc/sonic/.reboot/.previous-reboot-cause.txt"}, + {"record_type": "file", "mode": "add", "log": "Other, ", "path": "/etc/sonic/.reboot/.history-reboot-cause.txt"} + ], } -MONITOR_DEV_STATUS_DECODE = { - 'fanpresent': {0:'PRESENT', 1:'ABSENT', 'okval':0}, - 'fanroll' : {0:'STALL' , 1:'ROLL', 'okval':1}, - 'psupresent': {0:'PRESENT', 1:'ABSENT', 'okval':0}, - 'psuoutput' : {0:'FAULT' , 1:'NORMAL', 'okval':1}, - 'psualert' : {0:'FAULT' , 1:'NORMAL', 'okval':1}, -} -################################################################### - - - -MAC_AVS_PARAM ={ - 0x72:0x0384, - 0x73:0x037e, - 0x74:0x0378, - 0x75:0x0372, - 0x76:0x036b, - 0x77:0x0365, - 0x78:0x035f, - 0x79:0x0359, - 0x7a:0x0352, - 0x7b:0x034c, - 0x7c:0x0346, - 0x7d:0x0340, - 0x7e:0x0339, - 0x7f:0x0333, - 0x80:0x032d, - 0x81:0x0327, - 0x82:0x0320, - 0x83:0x031a, - 0x84:0x0314, - 0x85:0x030e, - 0x86:0x0307, - 0x87:0x0301, - 0x88:0x02fb, - 0x89:0x02f5, - 0x8A:0x02ee -} +UPGRADE_SUMMARY = { + "devtype": 0x404a, -MAC_DEFAULT_PARAM = { - "type": 1, - "default":0x74, - "loopaddr":0x00, - "loop":0x00, - "open":0x00, - "close":0x40, - "bus":2, - "devno":0x60, - "addr":0x21, - "protectaddr":0x10, - "sdkreg":"TOP_AVS_SEL_REG", - "sdkcmd": "scdcmd", - "sdkcmdargs": ["-t", 5], - "sdktype": 0, - "macregloc":24 , - "mask": 0xff -} + "slot0": { + "subtype": 0, + "VME": { + "chain1": { + "name": "VME_CPLD", + "is_support_warm_upg": 0, + }, + }, + "SPI-LOGIC-DEV": { + "chain3": { + "name": "FPGA", + "is_support_warm_upg": 0, + }, + }, + "MTD": { + "chain2": { + "name": "BIOS", + "is_support_warm_upg": 0, + "filesizecheck": 10240, # bios check file size, Unit: K + "init_cmd": [ + {"io_addr": 0x722, "value": 0x02, "gettype": "io"}, + {"cmd": "modprobe mtd", "gettype": "cmd"}, + {"cmd": "modprobe spi_nor", "gettype": "cmd"}, + {"cmd": "modprobe ofpart", "gettype": "cmd"}, + {"cmd": "modprobe intel_spi writeable=1", "gettype": "cmd"}, + {"cmd": "modprobe intel_spi_platform writeable=1", "gettype": "cmd"}, + ], + "finish_cmd": [ + {"cmd": "rmmod intel_spi_platform", "gettype": "cmd"}, + {"cmd": "rmmod intel_spi", "gettype": "cmd"}, + {"cmd": "rmmod ofpart", "gettype": "cmd"}, + {"cmd": "rmmod spi_nor", "gettype": "cmd"}, + {"cmd": "rmmod mtd", "gettype": "cmd"}, + ], + }, + }, -DEVICE = [] -DRIVERLISTS = [] + "TEST": { + "cpld": [ + {"chain": 1, "file": "/etc/.upgrade_test/cpld_test_header.vme", "display_name": "CPLD"}, + ], + "fpga": [ + { + "chain": 3, + "file": "/etc/.upgrade_test/fpga_test_header.bin", + "display_name": "FPGA", + }, + ], + }, + }, -""" -## -DRIVERLISTS = [ - {"name":"i2c_dev", "delay":0}, - {"name":"i2c_algo_bit","delay":0}, - {"name":"i2c_gpio", "delay":0}, - {"name":"i2c_mux", "delay":0}, - {"name":"i2c_mux_pca9641", "delay":0}, - {"name":"i2c_mux_pca954x force_create_bus=1", "delay":0},# force_deselect_on_exit=1 - {"name":"lm75", "delay":0}, - {"name":"optoe", "delay":0}, - {"name":"at24", "delay":0}, - {"name":"rg_sff", "delay":0}, - {"name":"ragile_b6510_platform", "delay":0}, - {"name":"ragile_platform", "delay":0}, - {"name":"rg_avs", "delay":0}, - {"name":"rg_cpld", "delay":0}, - {"name":"rg_fan", "delay":0}, - {"name":"rg_psu", "delay":0}, - {"name":"pmbus_core", "delay":0}, - {"name":"csu550", "delay":0}, - {"name":"rg_gpio_xeon", "delay":0}, - {"name":"firmware_driver", "delay":0}, - {"name":"firmware_bin", "delay":0}, - {"name":"ragile_b6510_sfputil", "delay":0}, - {"name":"ragile_common dfd_my_type=0x404a", "delay":0}, - {"name":"lpc_dbg", "delay":0}, -] + "BMC": { + "name": "BMC", + "init_cmd": [ + ], + "finish_cmd": [], + }, +} -DEVICE = [ - {"name":"pca9641","bus":0 ,"loc":0x10 }, - {"name":"pca9548","bus":2 ,"loc":0x70 }, - {"name":"lm75","bus": 2, "loc":0x48 }, - {"name":"lm75","bus": 2, "loc":0x49 }, - {"name":"lm75","bus": 2, "loc":0x4a }, - {"name":"24c02","bus":2 , "loc":0x57 }, - {"name":"rg_cpld","bus":0 ,"loc":0x32 }, - {"name":"rg_cpld","bus":1 ,"loc":0x34 }, - {"name":"rg_cpld","bus":1 ,"loc":0x36 }, - {"name":"rg_cpld","bus":2 ,"loc":0x33 }, - {"name":"rg_cpld","bus":2 ,"loc":0x35 }, - {"name":"rg_cpld","bus":2 ,"loc":0x37 }, - {"name":"rg_avs","bus": 2 ,"loc":0x60 }, - {"name":"pca9548","bus":1,"loc":0x70 }, - {"name":"pca9548","bus":1,"loc":0x71 }, - {"name":"pca9548","bus":1,"loc":0x72 }, - {"name":"pca9548","bus":1,"loc":0x73 }, - {"name":"pca9548","bus":1,"loc":0x74 }, - {"name":"pca9548","bus":1,"loc":0x75 }, - {"name":"pca9548","bus":1,"loc":0x76 }, - {"name":"rg_fan","bus":3,"loc":0x53 }, - {"name":"rg_fan","bus":4,"loc":0x53 }, - {"name":"rg_fan","bus":5,"loc":0x53 }, - {"name":"rg_fan","bus":6,"loc":0x53 }, - {"name":"rg_psu","bus":7 ,"loc":0x50 }, - {"name":"dps550","bus":7 ,"loc":0x58 }, - {"name":"rg_psu","bus":8 ,"loc":0x53 }, - {"name":"dps550","bus":8 ,"loc":0x5b }, - {"name": "optoe2", "bus": 11, "loc": 0x50}, - {"name": "optoe2", "bus": 12, "loc": 0x50}, - {"name": "optoe2", "bus": 13, "loc": 0x50}, - {"name": "optoe2", "bus": 14, "loc": 0x50}, - {"name": "optoe2", "bus": 15, "loc": 0x50}, - {"name": "optoe2", "bus": 16, "loc": 0x50}, - {"name": "optoe2", "bus": 17, "loc": 0x50}, - {"name": "optoe2", "bus": 18, "loc": 0x50}, - {"name": "optoe2", "bus": 19, "loc": 0x50}, - {"name": "optoe2", "bus": 20, "loc": 0x50}, - {"name": "optoe2", "bus": 21, "loc": 0x50}, - {"name": "optoe2", "bus": 22, "loc": 0x50}, - {"name": "optoe2", "bus": 23, "loc": 0x50}, - {"name": "optoe2", "bus": 24, "loc": 0x50}, - {"name": "optoe2", "bus": 25, "loc": 0x50}, - {"name": "optoe2", "bus": 26, "loc": 0x50}, - {"name": "optoe2", "bus": 27, "loc": 0x50}, - {"name": "optoe2", "bus": 28, "loc": 0x50}, - {"name": "optoe2", "bus": 29, "loc": 0x50}, - {"name": "optoe2", "bus": 30, "loc": 0x50}, - {"name": "optoe2", "bus": 31, "loc": 0x50}, - {"name": "optoe2", "bus": 32, "loc": 0x50}, - {"name": "optoe2", "bus": 33, "loc": 0x50}, - {"name": "optoe2", "bus": 34, "loc": 0x50}, - {"name": "optoe2", "bus": 35, "loc": 0x50}, - {"name": "optoe2", "bus": 36, "loc": 0x50}, - {"name": "optoe2", "bus": 37, "loc": 0x50}, - {"name": "optoe2", "bus": 38, "loc": 0x50}, - {"name": "optoe2", "bus": 39, "loc": 0x50}, - {"name": "optoe2", "bus": 40, "loc": 0x50}, - {"name": "optoe2", "bus": 41, "loc": 0x50}, - {"name": "optoe2", "bus": 42, "loc": 0x50}, - {"name": "optoe2", "bus": 43, "loc": 0x50}, - {"name": "optoe2", "bus": 44, "loc": 0x50}, - {"name": "optoe2", "bus": 45, "loc": 0x50}, - {"name": "optoe2", "bus": 46, "loc": 0x50}, - {"name": "optoe2", "bus": 47, "loc": 0x50}, - {"name": "optoe2", "bus": 48, "loc": 0x50}, - {"name": "optoe2", "bus": 49, "loc": 0x50}, - {"name": "optoe2", "bus": 50, "loc": 0x50}, - {"name": "optoe2", "bus": 51, "loc": 0x50}, - {"name": "optoe2", "bus": 52, "loc": 0x50}, - {"name": "optoe2", "bus": 53, "loc": 0x50}, - {"name": "optoe2", "bus": 54, "loc": 0x50}, - {"name": "optoe2", "bus": 55, "loc": 0x50}, - {"name": "optoe2", "bus": 56, "loc": 0x50}, - {"name": "optoe2", "bus": 57, "loc": 0x50}, - {"name": "optoe2", "bus": 58, "loc": 0x50}, - {"name": "optoe1", "bus": 59, "loc": 0x50}, - {"name": "optoe1", "bus": 60, "loc": 0x50}, - {"name": "optoe1", "bus": 61, "loc": 0x50}, - {"name": "optoe1", "bus": 62, "loc": 0x50}, - {"name": "optoe1", "bus": 63, "loc": 0x50}, - {"name": "optoe1", "bus": 64, "loc": 0x50}, - {"name": "optoe1", "bus": 65, "loc": 0x50}, - {"name": "optoe1", "bus": 66, "loc": 0x50}, -] -INIT_PARAM = [ - {"loc":"1-0034/sfp_enable","value": "01"}, - {"loc":"2-0035/sfp_enable2","value":"ff"}, - {"loc":"2-0033/mac_led", "value":"ff"}, - {"loc":"1-0034/sfp_txdis1","value":"00"}, - {"loc":"1-0034/sfp_txdis2","value":"00"}, - {"loc":"1-0034/sfp_txdis3","value":"00"}, - {"loc":"1-0036/sfp_txdis4","value":"00"}, - {"loc":"1-0036/sfp_txdis5","value":"00"}, - {"loc":"1-0036/sfp_txdis6","value":"00"}, - {"loc":fanloc[0]["location"], "value":"80"}, - {"loc":"2-0033/sfp_led1_yellow","value":"ad"}, - {"loc":"2-0035/sfp_led2_yellow","value":"ad"}, -] -""" +PLATFORM_E2_CONF = { + "fan": [ + { + "name": "fan1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/16-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" + }, + ], + }, + { + "name": "fan2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/17-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" + }, + ], + }, + { + "name": "fan3", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/18-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" + }, + ], + }, + { + "name": "fan4", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/19-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" + }, + ], + }, + ], + "psu": [ + {"name": "psu1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/24-0050/eeprom"}, + {"name": "psu2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/25-0050/eeprom"}, + ], + "syseeprom": [ + {"name": "syseeprom", "e2_type": "onie_tlv", "e2_path": "/sys/bus/i2c/devices/0-0056/eeprom"}, + ], +} -INIT_PARAM = [ - { - "name": "sfp_enable", - "bus": 1, - "devaddr": 0x34, - "offset": 0xa1, - "val": 0x01, - }, - { - "name": "sfp_eanble2", - "bus": 2, - "devaddr": 0x35, - "offset": 0xa0, - "val": 0xff, - }, - { - "name": "mac_led", - "bus": 2, - "devaddr": 0x33, - "offset": 0xa0, - "val": 0xff, - }, - { - "name": "sfp_txdis1", - "bus": 1, - "devaddr": 0x34, - "offset": 0x60, - "val": 0x00, - }, - { - "name": "sfp_txdis2", - "bus": 1, - "devaddr": 0x34, - "offset": 0x61, - "val": 0x00, +AIR_FLOW_CONF = { + "psu_fan_airflow": { + "intake": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "exhaust": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] }, - { - "name": "sfp_txdis3", - "bus": 1, - "devaddr": 0x34, - "offset": 0x62, - "val": 0x00, - }, - { - "name": "sfp_txdis4", - "bus": 1, - "devaddr": 0x36, - "offset": 0x60, - "val": 0x00, - }, - { - "name": "sfp_txdis5", - "bus": 1, - "devaddr": 0x36, - "offset": 0x61, - "val": 0x00, - }, - { - "name": "sfp_txdis6", - "bus": 1, - "devaddr": 0x36, - "offset": 0x62, - "val": 0x00, - }, - { - "name": "sfp_led1_yellow", - "bus": 2, - "devaddr": 0x33, - "offset": 0xad, - "val": 0xad, - }, - { - "name": "sfp_led2_yellow", - "bus": 2, - "devaddr": 0x35, - "offset": 0xad, - "val": 0xad, - }, - { - "name": "fan_speed_set", - "bus": 0, - "devaddr": 0x32, - "offset": 0x15, - "val": 0x80, + + "fanairflow": { + "intake": ['M1HFAN I-F'], + "exhaust": ['M1HFAN I-R'] }, -] + + "fans": [ + { + "name": "FAN1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/16-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" + }, + { + "name": "FAN2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/17-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" + }, + { + "name": "FAN3", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/18-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" + }, + { + "name": "FAN4", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/19-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" + } + ], + + "psus": [ + { + "name": "PSU1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/24-0050/eeprom", + "area": "productInfoArea", "field": "productPartModelName", "decode": "psu_fan_airflow" + }, + { + "name": "PSU2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/25-0050/eeprom", + "area": "productInfoArea", "field": "productPartModelName", "decode": "psu_fan_airflow" + } + ] +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py new file mode 100644 index 000000000000..26f92a77a020 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py @@ -0,0 +1,7 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +PLATFORM_INTF_OPTOE = { + "port_num": 56, + "optoe_start_bus": 32, +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py new file mode 100644 index 000000000000..ba1a8dea0b51 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py @@ -0,0 +1,1234 @@ +#!/usr/bin/python3 + +psu_fan_airflow = { + "intake": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "exhaust": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +fanairflow = { + "intake": ['M1HFAN I-F'], + "exhaust": ['M1HFAN I-R'], +} + +psu_display_name = { + "PA550II-F": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "PA550II-R": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +psutypedecode = { + 0x00: 'N/A', + 0x01: 'AC', + 0x02: 'DC', +} + + +class Unit: + Temperature = "C" + Voltage = "V" + Current = "A" + Power = "W" + Speed = "RPM" + + +PSU_NOT_PRESENT_PWM = 100 + + +class threshold: + PSU_TEMP_MIN = -20 * 1000 + PSU_TEMP_MAX = 60 * 1000 + + PSU_FAN_SPEED_MIN = 2000 + PSU_FAN_SPEED_MAX = 18000 + + PSU_OUTPUT_VOLTAGE_MIN = 11 * 1000 + PSU_OUTPUT_VOLTAGE_MAX = 14 * 1000 + + PSU_AC_INPUT_VOLTAGE_MIN = 200 * 1000 + PSU_AC_INPUT_VOLTAGE_MAX = 240 * 1000 + + PSU_DC_INPUT_VOLTAGE_MIN = 190 * 1000 + PSU_DC_INPUT_VOLTAGE_MAX = 290 * 1000 + + ERR_VALUE = -9999999 + + PSU_OUTPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_OUTPUT_POWER_MAX = 560 * 1000 * 1000 + + PSU_INPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_INPUT_POWER_MAX = 625 * 1000 * 1000 + + PSU_OUTPUT_CURRENT_MIN = 1 * 1000 + PSU_OUTPUT_CURRENT_MAX = 45 * 1000 + + PSU_INPUT_CURRENT_MIN = 0 * 1000 + PSU_INPUT_CURRENT_MAX = 7 * 1000 + + FRONT_FAN_SPEED_MAX = 24000 + REAR_FAN_SPEED_MAX = 22500 + FAN_SPEED_MIN = 5000 + + +class Description: + CPLD = "Used for managing IO modules, SFP+ modules and system LEDs" + BIOS = "Performs initialization of hardware components during booting" + FPGA = "Platform management controller for on-board temperature monitoring, in-chassis power" + + +devices = { + "onie_e2": [ + { + "name": "ONIE_E2", + "e2loc": {"loc": "/sys/bus/i2c/devices/0-0056/eeprom", "way": "sysfs"}, + "airflow": "intake" + }, + ], + "psus": [ + { + "e2loc": {"loc": "/sys/bus/i2c/devices/24-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 24, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU1", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 24, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + }, + { + "e2loc": {"loc": "/sys/bus/i2c/devices/25-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 25, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU2", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 25, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + } + ], + "temps": [ + { + "name": "SWITCH_TEMP", + "temp_id": "TEMP1", + "api_name": "ASIC_TEMP", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0044/hwmon/hwmon*/temp99_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 105000, + "Max": 110000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "CPU_TEMP", + "temp_id": "TEMP2", + "Temperature": { + "value": {"loc": "/sys/bus/platform/devices/coretemp.0/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -15000, + "Low": 0, + "High": 100000, + "Max": 102000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "INLET_TEMP", + "temp_id": "TEMP3", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0048/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "fix_value": { + "fix_type": "config", + "addend": -3, + } + }, + { + "name": "OUTLET_TEMP", + "temp_id": "TEMP4", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004c/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "BOARD_TEMP", + "temp_id": "TEMP5", + "api_name": "MAC_OUT_TEMP", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004a/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "MAC_IN_TEMP", + "temp_id": "TEMP6", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0049/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU1_TEMP", + "temp_id": "TEMP7", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU2_TEMP", + "temp_id": "TEMP8", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "SFF_TEMP", + "Temperature": { + "value": {"loc": "/tmp/highest_sff_temp", "way": "sysfs", "flock_path": "/tmp/highest_sff_temp"}, + "Min": -30000, + "Low": 0, + "High": 90000, + "Max": 100000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "invalid": -10000, + "error": -9999, + } + ], + "leds": [ + { + "name": "FRONT_SYS_LED", + "led_type": "SYS_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x72, "way": "i2c"}, + "led_attrs": { + "off": 0x00, "red_flash": 0x01, "red": 0x02, + "green_flash": 0x03, "green": 0x04, "amber_flash": 0x05, + "amber": 0x06, "mask": 0x07 + }, + }, + { + "name": "FRONT_PSU_LED", + "led_type": "PSU_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x73, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + { + "name": "FRONT_FAN_LED", + "led_type": "FAN_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x74, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + ], + "fans": [ + { + "name": "FAN1", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-16/16-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3b, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN2", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-17/17-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3c, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN3", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-18/18-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan3/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3d, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + { + "name": "FAN4", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-19/19-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan4/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3e, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + ], + "cplds": [ + { + "name": "CPU_CPLD", + "cpld_id": "CPLD1", + "VersionFile": {"loc": "/dev/cpld0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for system power", + "slot": 0, + "warm": 0, + + }, + { + "name": "CONNECT_CPLD", + "cpld_id": "CPLD2", + "VersionFile": {"loc": "/dev/cpld1", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "warm": 0, + }, + { + "name": "CONNECT_CPLD-FAN", + "cpld_id": "CPLD3", + "VersionFile": {"loc": "/dev/cpld2", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for fan modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD1", + "cpld_id": "CPLD4", + "VersionFile": {"loc": "/dev/cpld3", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD2", + "cpld_id": "CPLD5", + "VersionFile": {"loc": "/dev/cpld4", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "FPGA", + "cpld_id": "CPLD6", + "VersionFile": {"loc": "/dev/fpga0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "format": "little_endian", + "warm": 0, + }, + { + "name": "BIOS", + "cpld_id": "CPLD7", + "VersionFile": {"cmd": "dmidecode -s bios-version", "way": "cmd"}, + "desc": "Performs initialization of hardware components during booting", + "slot": 0, + "type": "str", + "warm": 0, + }, + ], + "dcdc": [ + { + "name": "Switch_ZSFP1_3v3_C", + "dcdc_id": "DCDC1", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_C", + "dcdc_id": "DCDC2", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_C", + "dcdc_id": "DCDC3", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ZSFP1_3v3_V", + "dcdc_id": "DCDC4", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_V", + "dcdc_id": "DCDC5", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_V", + "dcdc_id": "DCDC6", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_C", + "dcdc_id": "DCDC7", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_C", + "dcdc_id": "DCDC8", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_C", + "dcdc_id": "DCDC9", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_V", + "dcdc_id": "DCDC10", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_V", + "dcdc_id": "DCDC11", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_V", + "dcdc_id": "DCDC12", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_C", + "dcdc_id": "DCDC13", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_C", + "dcdc_id": "DCDC14", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2800, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_C", + "dcdc_id": "DCDC15", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4500, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_V", + "dcdc_id": "DCDC16", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_V", + "dcdc_id": "DCDC17", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_V", + "dcdc_id": "DCDC18", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_C", + "dcdc_id": "DCDC19", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4686, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_C", + "dcdc_id": "DCDC20", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_C", + "dcdc_id": "DCDC21", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_V", + "dcdc_id": "DCDC22", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_V", + "dcdc_id": "DCDC23", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_V", + "dcdc_id": "DCDC24", + "Min": 1360, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2040, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_C", + "dcdc_id": "DCDC25", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 47300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_C", + "dcdc_id": "DCDC26", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 15400, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_V", + "dcdc_id": "DCDC27", + "Min": 1456, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2184, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_V", + "dcdc_id": "DCDC28", + "Min": 840, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1260, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_C", + "dcdc_id": "DCDC29", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 220000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_C", + "dcdc_id": "DCDC30", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 18000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_V", + "dcdc_id": "DCDC31", + "Min": 600, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_V", + "dcdc_id": "DCDC32", + "Min": 640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_C", + "dcdc_id": "DCDC33", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 9900, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_C", + "dcdc_id": "DCDC34", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_V", + "dcdc_id": "DCDC35", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_V", + "dcdc_id": "DCDC36", + "Min": 1784, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2676, + "format": "float(float(%s)/1000)", + }, + ], + "cpu": [ + { + "name": "cpu", + "reboot_cause_path": "/etc/sonic/.reboot/.previous-reboot-cause.txt" + } + ], + "sfps": { + "ver": '1.0', + "port_index_start": 1, + "port_num": 56, + "log_level": 2, + "eeprom_retry_times": 5, + "eeprom_retry_break_sec": 0.2, + "presence_cpld": { + "dev_id": { + 3: { + "offset": { + 0x30: "1-8", + 0x31: "9-16", + 0x32: "17-24", + }, + }, + 4: { + "offset": { + 0x30: "25-32", + 0x31: "33-40", + 0x32: "41-48", + 0x33: "49-56", + }, + }, + }, + }, + "presence_val_is_present": 0, + "eeprom_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/eeprom", + "eeprom_path_key": list(range(32, 88)), + "optoe_driver_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/dev_class", + "optoe_driver_key": list(range(32, 88)), + "txdis_cpld": { + "dev_id": { + 3: { + "offset": { + 0x60: "1-8", + 0x61: "9-16", + 0x62: "17-24", + }, + }, + 4: { + "offset": { + 0x60: "25-32", + 0x61: "33-40", + 0x62: "41-48", + }, + }, + }, + }, + "txdisable_val_is_on": 0, + "reset_cpld": { + "dev_id": { + 4: { + "offset": { + 0xb9: "49-56", + }, + }, + }, + }, + "reset_val_is_reset": 0, + } +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py new file mode 100644 index 000000000000..0b5d750dd449 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py @@ -0,0 +1,1232 @@ +#!/usr/bin/python3 + +psu_fan_airflow = { + "intake": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "exhaust": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +fanairflow = { + "intake": ['M1HFAN I-F'], + "exhaust": ['M1HFAN I-R'], +} + +psu_display_name = { + "PA550II-F": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "PA550II-R": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +psutypedecode = { + 0x00: 'N/A', + 0x01: 'AC', + 0x02: 'DC', +} + + +class Unit: + Temperature = "C" + Voltage = "V" + Current = "A" + Power = "W" + Speed = "RPM" + + +PSU_NOT_PRESENT_PWM = 100 + + +class threshold: + PSU_TEMP_MIN = -20 * 1000 + PSU_TEMP_MAX = 60 * 1000 + + PSU_FAN_SPEED_MIN = 2000 + PSU_FAN_SPEED_MAX = 18000 + + PSU_OUTPUT_VOLTAGE_MIN = 11 * 1000 + PSU_OUTPUT_VOLTAGE_MAX = 14 * 1000 + + PSU_AC_INPUT_VOLTAGE_MIN = 200 * 1000 + PSU_AC_INPUT_VOLTAGE_MAX = 240 * 1000 + + PSU_DC_INPUT_VOLTAGE_MIN = 190 * 1000 + PSU_DC_INPUT_VOLTAGE_MAX = 290 * 1000 + + ERR_VALUE = -9999999 + + PSU_OUTPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_OUTPUT_POWER_MAX = 560 * 1000 * 1000 + + PSU_INPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_INPUT_POWER_MAX = 625 * 1000 * 1000 + + PSU_OUTPUT_CURRENT_MIN = 1 * 1000 + PSU_OUTPUT_CURRENT_MAX = 45 * 1000 + + PSU_INPUT_CURRENT_MIN = 0 * 1000 + PSU_INPUT_CURRENT_MAX = 7 * 1000 + + FRONT_FAN_SPEED_MAX = 24000 + REAR_FAN_SPEED_MAX = 22500 + FAN_SPEED_MIN = 5000 + + +class Description: + CPLD = "Used for managing IO modules, SFP+ modules and system LEDs" + BIOS = "Performs initialization of hardware components during booting" + FPGA = "Platform management controller for on-board temperature monitoring, in-chassis power" + + +devices = { + "onie_e2": [ + { + "name": "ONIE_E2", + "e2loc": {"loc": "/sys/bus/i2c/devices/0-0056/eeprom", "way": "sysfs"}, + "airflow": "exhaust" + }, + ], + "psus": [ + { + "e2loc": {"loc": "/sys/bus/i2c/devices/24-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 24, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU1", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 24, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + }, + { + "e2loc": {"loc": "/sys/bus/i2c/devices/25-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 25, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU2", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 25, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + } + ], + "temps": [ + { + "name": "SWITCH_TEMP", + "temp_id": "TEMP1", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0044/hwmon/hwmon*/temp99_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 105000, + "Max": 110000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "CPU_TEMP", + "temp_id": "TEMP2", + "Temperature": { + "value": {"loc": "/sys/bus/platform/devices/coretemp.0/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -15000, + "Low": 0, + "High": 100000, + "Max": 102000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "INLET_TEMP", + "temp_id": "TEMP3", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004c/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "fix_value": { + "fix_type": "config", + "addend": -3, + } + }, + { + "name": "OUTLET_TEMP", + "temp_id": "TEMP4", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0048/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "BOARD_TEMP", + "temp_id": "TEMP5", + "api_name": "MAC_OUT_TEMP", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0049/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "MAC_IN_TEMP", + "temp_id": "TEMP6", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004a/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU1_TEMP", + "temp_id": "TEMP7", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU2_TEMP", + "temp_id": "TEMP8", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "SFF_TEMP", + "Temperature": { + "value": {"loc": "/tmp/highest_sff_temp", "way": "sysfs", "flock_path": "/tmp/highest_sff_temp"}, + "Min": -30000, + "Low": 0, + "High": 90000, + "Max": 100000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "invalid": -10000, + "error": -9999, + } + ], + "leds": [ + { + "name": "FRONT_SYS_LED", + "led_type": "SYS_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x72, "way": "i2c"}, + "led_attrs": { + "off": 0x00, "red_flash": 0x01, "red": 0x02, + "green_flash": 0x03, "green": 0x04, "amber_flash": 0x05, + "amber": 0x06, "mask": 0x07 + }, + }, + { + "name": "FRONT_PSU_LED", + "led_type": "PSU_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x73, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + { + "name": "FRONT_FAN_LED", + "led_type": "FAN_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x74, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + ], + "fans": [ + { + "name": "FAN1", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-16/16-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3b, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN2", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-17/17-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3c, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN3", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-18/18-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan3/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3d, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + { + "name": "FAN4", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-19/19-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan4/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3e, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + ], + "cplds": [ + { + "name": "CPU_CPLD", + "cpld_id": "CPLD1", + "VersionFile": {"loc": "/dev/cpld0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for system power", + "slot": 0, + "warm": 0, + }, + { + "name": "CONNECT_CPLD", + "cpld_id": "CPLD2", + "VersionFile": {"loc": "/dev/cpld1", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "warm": 0, + }, + { + "name": "CONNECT_CPLD-FAN", + "cpld_id": "CPLD3", + "VersionFile": {"loc": "/dev/cpld2", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for fan modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD1", + "cpld_id": "CPLD4", + "VersionFile": {"loc": "/dev/cpld3", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD2", + "cpld_id": "CPLD5", + "VersionFile": {"loc": "/dev/cpld4", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "FPGA", + "cpld_id": "CPLD6", + "VersionFile": {"loc": "/dev/fpga0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "format": "little_endian", + "warm": 0, + }, + { + "name": "BIOS", + "cpld_id": "CPLD7", + "VersionFile": {"cmd": "dmidecode -s bios-version", "way": "cmd"}, + "desc": "Performs initialization of hardware components during booting", + "slot": 0, + "type": "str", + "warm": 0, + }, + ], + "dcdc": [ + { + "name": "Switch_ZSFP1_3v3_C", + "dcdc_id": "DCDC1", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_C", + "dcdc_id": "DCDC2", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_C", + "dcdc_id": "DCDC3", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ZSFP1_3v3_V", + "dcdc_id": "DCDC4", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_V", + "dcdc_id": "DCDC5", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_V", + "dcdc_id": "DCDC6", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_C", + "dcdc_id": "DCDC7", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_C", + "dcdc_id": "DCDC8", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_C", + "dcdc_id": "DCDC9", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_V", + "dcdc_id": "DCDC10", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_V", + "dcdc_id": "DCDC11", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_V", + "dcdc_id": "DCDC12", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_C", + "dcdc_id": "DCDC13", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_C", + "dcdc_id": "DCDC14", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2800, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_C", + "dcdc_id": "DCDC15", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4500, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_V", + "dcdc_id": "DCDC16", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_V", + "dcdc_id": "DCDC17", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_V", + "dcdc_id": "DCDC18", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_C", + "dcdc_id": "DCDC19", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4686, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_C", + "dcdc_id": "DCDC20", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_C", + "dcdc_id": "DCDC21", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_V", + "dcdc_id": "DCDC22", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_V", + "dcdc_id": "DCDC23", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_V", + "dcdc_id": "DCDC24", + "Min": 1360, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2040, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_C", + "dcdc_id": "DCDC25", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 47300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_C", + "dcdc_id": "DCDC26", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 15400, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_V", + "dcdc_id": "DCDC27", + "Min": 1456, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2184, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_V", + "dcdc_id": "DCDC28", + "Min": 840, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1260, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_C", + "dcdc_id": "DCDC29", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 220000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_C", + "dcdc_id": "DCDC30", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 18000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_V", + "dcdc_id": "DCDC31", + "Min": 600, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_V", + "dcdc_id": "DCDC32", + "Min": 640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_C", + "dcdc_id": "DCDC33", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 9900, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_C", + "dcdc_id": "DCDC34", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_V", + "dcdc_id": "DCDC35", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_V", + "dcdc_id": "DCDC36", + "Min": 1784, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2676, + "format": "float(float(%s)/1000)", + }, + ], + "cpu": [ + { + "name": "cpu", + "reboot_cause_path": "/etc/sonic/.reboot/.previous-reboot-cause.txt" + } + ], + "sfps": { + "ver": '1.0', + "port_index_start": 1, + "port_num": 56, + "log_level": 2, + "eeprom_retry_times": 5, + "eeprom_retry_break_sec": 0.2, + "presence_cpld": { + "dev_id": { + 3: { + "offset": { + 0x30: "1-8", + 0x31: "9-16", + 0x32: "17-24", + }, + }, + 4: { + "offset": { + 0x30: "25-32", + 0x31: "33-40", + 0x32: "41-48", + 0x33: "49-56", + }, + }, + }, + }, + "presence_val_is_present": 0, + "eeprom_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/eeprom", + "eeprom_path_key": list(range(32, 88)), + "optoe_driver_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/dev_class", + "optoe_driver_key": list(range(32, 88)), + "txdis_cpld": { + "dev_id": { + 3: { + "offset": { + 0x60: "1-8", + 0x61: "9-16", + 0x62: "17-24", + }, + }, + 4: { + "offset": { + 0x60: "25-32", + 0x61: "33-40", + 0x62: "41-48", + }, + }, + }, + }, + "txdisable_val_is_on": 0, + "reset_cpld": { + "dev_id": { + 4: { + "offset": { + 0xb9: "49-56", + }, + }, + }, + }, + "reset_val_is_reset": 0, + } +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py new file mode 100644 index 000000000000..aab279a21da2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py @@ -0,0 +1,206 @@ +# coding:utf-8 + + +monitor = { + "openloop": { + "linear": { + "name": "linear", + "flag": 0, + "pwm_min": 0x80, + "pwm_max": 0xff, + "K": 11, + "tin_min": 38, + }, + "curve": { + "name": "curve", + "flag": 0, + "pwm_min": 0x5a, + "pwm_max": 0xff, + "a": 0.086, + "b": 0.318, + "c": 28, + "tin_min": 25, + }, + }, + + "pid": { + "CPU_TEMP": { + "name": "CPU_TEMP", + "flag": 1, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 3, + "Ki": 0.5, + "Kd": 0.5, + "target": 89, + "value": [None, None, None], + }, + "SWITCH_TEMP": { + "name": "SWITCH_TEMP", + "flag": 1, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 3, + "Ki": 0.4, + "Kd": 0.4, + "target": 82, + "value": [None, None, None], + }, + "OUTLET_TEMP": { + "name": "OUTLET_TEMP", + "flag": 0, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 2, + "Ki": 0.4, + "Kd": 0.3, + "target": 65, + "value": [None, None, None], + }, + "BOARD_TEMP": { + "name": "BOARD_TEMP", + "flag": 0, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 2, + "Ki": 0.4, + "Kd": 0.3, + "target": 65, + "value": [None, None, None], + }, + "SFF_TEMP": { + "name": "SFF_TEMP", + "flag": 1, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 0.1, + "Ki": 0.4, + "Kd": 0, + "target": 60, + "value": [None, None, None], + }, + }, + + "hyst": { + "INLET_TEMP": { + "name": "INLET_TEMP", + "flag": 1, + "type": "duty", + "hyst_min": 50, # duty + "hyst_max": 100, # duty + "last_hyst_value": 50, # duty + "temp_min": 23, + "temp_max": 40, + "value": [None, None], + "rising": { + 23: 50, + 24: 50, + 25: 50, + 26: 53, + 27: 56, + 28: 59, + 29: 62, + 30: 65, + 31: 68, + 32: 71, + 33: 74, + 34: 77, + 35: 80, + 36: 84, + 37: 88, + 38: 92, + 39: 96, + 40: 100, + }, + "descending": { + 23: 50, + 24: 53, + 25: 56, + 26: 59, + 27: 62, + 28: 65, + 29: 68, + 30: 71, + 31: 74, + 32: 77, + 33: 80, + 34: 84, + 35: 88, + 36: 92, + 37: 96, + 38: 100, + 39: 100, + 40: 100, + }, + } + }, + + "temps_threshold": { + "SWITCH_TEMP": {"name": "SWITCH_TEMP", "warning": 100, "critical": 105}, + "INLET_TEMP": {"name": "INLET_TEMP", "warning": 40, "critical": 50}, + "BOARD_TEMP": {"name": "BOARD_TEMP", "warning": 70, "critical": 80}, + "OUTLET_TEMP": {"name": "OUTLET_TEMP", "warning": 70, "critical": 80}, + "CPU_TEMP": {"name": "CPU_TEMP", "warning": 100, "critical": 102}, + "SFF_TEMP": {"name": "SFF_TEMP", "warning": 999, "critical": 1000, "ignore_threshold": 1, "invalid": -10000, "error": -9999}, + }, + + "fancontrol_para": { + "interval": 5, + "fan_air_flow_monitor": 1, + "psu_air_flow_monitor": 1, + "max_pwm": 0xff, + "min_pwm": 0x80, + "abnormal_pwm": 0xff, + "warning_pwm": 0xff, + "temp_invalid_pid_pwm": 0x80, + "temp_error_pid_pwm": 0x80, + "temp_fail_num": 3, + "check_temp_fail": [ + {"temp_name": "INLET_TEMP"}, + {"temp_name": "SWITCH_TEMP"}, + {"temp_name": "CPU_TEMP"}, + ], + "temp_warning_num": 3, # temp over warning 3 times continuously + "temp_critical_num": 3, # temp over critical 3 times continuously + "temp_warning_countdown": 60, # 5 min warning speed after not warning + "temp_critical_countdown": 60, # 5 min full speed after not critical + "rotor_error_count": 6, # fan rotor error 6 times continuously + "inlet_mac_diff": 999, + "check_crit_reboot_flag": 1, + "check_crit_reboot_num": 3, + "check_crit_sleep_time": 20, + "psu_absent_fullspeed_num": 0xFF, + "fan_absent_fullspeed_num": 1, + "rotor_error_fullspeed_num": 1, + }, + + "ledcontrol_para": { + "interval": 5, + "checkpsu": 0, # 0: sys led don't follow psu led + "checkfan": 0, # 0: sys led don't follow fan led + "psu_amber_num": 1, + "fan_amber_num": 1, + "board_sys_led": [ + {"led_name": "FRONT_SYS_LED"}, + ], + "board_psu_led": [ + {"led_name": "FRONT_PSU_LED"}, + ], + "board_fan_led": [ + {"led_name": "FRONT_FAN_LED"}, + ], + "psu_air_flow_monitor": 1, + "fan_air_flow_monitor": 1, + "psu_air_flow_amber_num": 1, + "fan_air_flow_amber_num": 1, + }, + "otp_reboot_judge_file": { + "otp_switch_reboot_judge_file": "/etc/.otp_switch_reboot_flag", + "otp_other_reboot_judge_file": "/etc/.otp_other_reboot_flag", + }, +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile index f10216ec4d5a..e59ffd7ee67d 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile @@ -1 +1,15 @@ -obj-m := rg_cpld.o +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +MODULES_DIR = $(abspath $(MAKEFILE_FILE_PATH)/../../../../common/modules) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../../../common/app/firmware_upgrade/firmware_driver/include) + +EXTRA_CFLAGS+= -I$(MODULES_DIR) +EXTRA_CFLAGS+= -I$(MODULES_DIR)/linux-5.10 +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) + +obj-m := wb_pcie_dev_device.o +obj-m += wb_i2c_mux_pca954x_device.o +obj-m += wb_i2c_ocores_device.o +obj-m += wb_lpc_drv_device.o +obj-m += wb_i2c_dev_device.o +obj-m += wb_io_dev_device.o +obj-m += wb_firmware_upgrade_device.o diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c deleted file mode 100755 index 885a727be683..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c +++ /dev/null @@ -1,602 +0,0 @@ -/* - * rg_cpld.c - A driver for cpld - * - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* debug level */ -typedef enum { - DBG_START, - DBG_VERBOSE, - DBG_KEY, - DBG_WARN, - DBG_ERROR, - DBG_END, -} dbg_level_t; - -static int debuglevel = 0; -module_param(debuglevel, int, S_IRUGO); - -#define DBG_DEBUG(fmt, arg...) do { \ - if ( debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ - printk(KERN_INFO "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ - } else if ( debuglevel >= DBG_ERROR ) { \ - printk(KERN_ERR "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ - } else { } \ -} while (0) - -#define DBG_ERROR(fmt, arg...) do { \ - if ( debuglevel > DBG_START) { \ - printk(KERN_ERR "[ERROR]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ - } \ -} while (0) - -static const unsigned short rg_i2c_cpld[] = { 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, I2C_CLIENT_END }; - -#define CPLD_SIZE 256 -#define CPLD_I2C_RETRY_TIMES 3 -#define READ_TEMP_FAIL 1000000 - -struct cpld_data { - struct i2c_client *client; - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 data[CPLD_SIZE]; /* Register value */ -}; - -static s32 cpld_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < CPLD_I2C_RETRY_TIMES; try++) { - if ((ret = i2c_smbus_read_byte_data(client, command) ) >= 0 ) - break; - } - return ret; -} - -static s32 cpld_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, - u8 command, u8 length, u8 *values) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < CPLD_I2C_RETRY_TIMES; try++) { - if ((ret = i2c_smbus_read_i2c_block_data(client, command, length, values) ) >= 0 ) - break; - } - return ret; -} - -static ssize_t show_fan_rpm_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct cpld_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - int index = to_sensor_dev_attr_2(da)->index; - uint8_t size; - s32 status; - s32 ret_t; - - ret_t = 0; - status = -1; - size = 0; - mutex_lock(&data->update_lock); - status = cpld_i2c_smbus_read_byte_data(client, index); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - data->data[0] = status; - status = cpld_i2c_smbus_read_byte_data(client, index + 1); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - data->data[1] = status; - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index, data->data[0]); - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index + 1, data->data[1]); - ret_t = (data->data[1] << 8) + data->data[0] ; - if (ret_t == 0 ) { - size = snprintf(buf, CPLD_SIZE, "%d\n", ret_t); - } else if (ret_t == 0xffff) { - size = snprintf(buf, CPLD_SIZE, "%d\n", 0); - } else { - size = snprintf(buf, CPLD_SIZE, "%d\n", 15000000 / ret_t); - } - mutex_unlock(&data->update_lock); - return size; -} - -static ssize_t set_cpld_sysfs_value(struct device *dev, struct device_attribute *da, const char *buf, size_t -count) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct cpld_data *data = i2c_get_clientdata(client); - unsigned long val; - int err; - - err = kstrtoul(buf, 16, &val); - if (err) - return err; - if ((val < 0) || (val > 0xff)) { - DBG_ERROR("please enter 0x00 ~ 0xff\n"); - return -1; - } - mutex_lock(&data->update_lock); - data->data[0] = (u8)val; - DBG_DEBUG("pos: 0x%02x count = %ld, data = 0x%02x\n", attr->index, count, data->data[0]); - i2c_smbus_write_byte_data(client, attr->index, data->data[0]); - mutex_unlock(&data->update_lock); - - return count; -} - -static ssize_t show_cpld_version(struct device *dev, struct device_attribute *da, char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct cpld_data *data = i2c_get_clientdata(client); - s32 status; - - status = -1; - mutex_lock(&data->update_lock); - status = cpld_i2c_smbus_read_i2c_block_data(client, 0, 4, data->data); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - mutex_unlock(&data->update_lock); - return sprintf(buf, "%02x %02x %02x %02x \n", data->data[0], data->data[1], data->data[2], - data->data[3]); -} - -static ssize_t show_cpld_sysfs_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct cpld_data *data = i2c_get_clientdata(client); - s32 status; - - status = -1; - mutex_lock(&data->update_lock); - status = cpld_i2c_smbus_read_byte_data(client, attr->index); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - data->data[0] = status; - DBG_DEBUG("cpld reg pos:0x%x value:0x%02x\n", attr->index, data->data[0]); - mutex_unlock(&data->update_lock); - return sprintf(buf, "%02x\n", data->data[0]); -} - -static ssize_t show_mac_temp_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct cpld_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - int index = to_sensor_dev_attr_2(da)->index; - int tmp_value, value; - s32 status; - - status = -1; - mutex_lock(&data->update_lock); - - status = cpld_i2c_smbus_read_byte_data(client, index); - if (status < 0) { - mutex_unlock(&data->update_lock); - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - data->data[0] = status; - status = cpld_i2c_smbus_read_byte_data(client, index + 1); - if (status < 0) { - mutex_unlock(&data->update_lock); - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - data->data[1] = status; - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index, data->data[0]); - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index + 1, data->data[1]); - mutex_unlock(&data->update_lock); - - tmp_value = (data->data[1] << 8) + data->data[0]; - if (tmp_value == 0) { - DBG_ERROR("invalid cpld value : %d.\n", tmp_value); - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - - DBG_DEBUG("tmp_value = 0x%x\n", tmp_value); - value = 434100 - (12500000 / (tmp_value * 100 - 1) *535); - if ((value / 1000 < -70) || (value / 1000 > 200)) { - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - - return snprintf(buf, CPLD_SIZE, "%d\n", value); - -} - -/* common */ -static SENSOR_DEVICE_ATTR(cpld_version, S_IRUGO | S_IWUSR, show_cpld_version, NULL, 0); - -/*0x37 hwmon*/ -static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x1B); -static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x1D); -static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x1F); -static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x21); - -/* 0x32 */ -static SENSOR_DEVICE_ATTR(fan_speed_set, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x15); -static SENSOR_DEVICE_ATTR(fan0_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x23); -static SENSOR_DEVICE_ATTR(fan1_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x24); -static SENSOR_DEVICE_ATTR(fan2_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x25); -static SENSOR_DEVICE_ATTR(fan3_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x26); - -/* 0x37 */ -static SENSOR_DEVICE_ATTR(fan_present, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, NULL, 0x30); -static SENSOR_DEVICE_ATTR(fan_status, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, NULL, 0x31); -static SENSOR_DEVICE_ATTR(psu_status, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, NULL, 0x51); -static SENSOR_DEVICE_ATTR(broad_back_lct, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x2a); -static SENSOR_DEVICE_ATTR(broad_back_sys, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb2); - -/* 0x33 */ -static SENSOR_DEVICE_ATTR(mac_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa0); -static SENSOR_DEVICE_ATTR(broad_front_lct, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x2a); -static SENSOR_DEVICE_ATTR(broad_front_bmc, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb1); -static SENSOR_DEVICE_ATTR(broad_front_cpu, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb2); -static SENSOR_DEVICE_ATTR(broad_front_pwr, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb3); -static SENSOR_DEVICE_ATTR(broad_front_fan, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb4); -static SENSOR_DEVICE_ATTR(sfp_led1_yellow, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xad); -static SENSOR_DEVICE_ATTR(mac_temp_flag, S_IRUGO, show_cpld_sysfs_value, NULL, 0xd4); - -/* 0x34 */ -static SENSOR_DEVICE_ATTR(sfp_presence1, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, NULL, 0x30); -static SENSOR_DEVICE_ATTR(sfp_presence2, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, NULL, 0x31); -static SENSOR_DEVICE_ATTR(sfp_presence3, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, NULL, 0x32); - -static SENSOR_DEVICE_ATTR(sfp_enable, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa1); -static SENSOR_DEVICE_ATTR(sfp_led1, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa2); -static SENSOR_DEVICE_ATTR(sfp_led2, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa3); -static SENSOR_DEVICE_ATTR(sfp_led3, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa4); -static SENSOR_DEVICE_ATTR(sfp_led_flash1, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa5); -static SENSOR_DEVICE_ATTR(sfp_led_flash2, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa6); -static SENSOR_DEVICE_ATTR(sfp_led_flash3, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa7); -static SENSOR_DEVICE_ATTR(sfp_txdis1, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x60); -static SENSOR_DEVICE_ATTR(sfp_txdis2, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x61); -static SENSOR_DEVICE_ATTR(sfp_txdis3, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x62); - -static SENSOR_DEVICE_ATTR(port_speed1, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc0); -static SENSOR_DEVICE_ATTR(port_speed2, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc1); -static SENSOR_DEVICE_ATTR(port_speed3, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc2); -static SENSOR_DEVICE_ATTR(port_speed4, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc3); -static SENSOR_DEVICE_ATTR(port_speed5, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc4); -static SENSOR_DEVICE_ATTR(port_speed6, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc5); - -/* 0x35 */ -static SENSOR_DEVICE_ATTR(sfp_enable2, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa0); -static SENSOR_DEVICE_ATTR(sfp_led2_yellow, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xad); -static SENSOR_DEVICE_ATTR(mac_temp_input, S_IRUGO, show_mac_temp_value, NULL, 0xca); - -/* 0x36 */ -static SENSOR_DEVICE_ATTR(sfp_presence4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x30); -static SENSOR_DEVICE_ATTR(sfp_presence5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x31); -static SENSOR_DEVICE_ATTR(sfp_presence6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x32); -static SENSOR_DEVICE_ATTR(sfp_presence7, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x33); -static SENSOR_DEVICE_ATTR(sfp_led4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa2); -static SENSOR_DEVICE_ATTR(sfp_led5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa3); -static SENSOR_DEVICE_ATTR(sfp_led6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa4); -static SENSOR_DEVICE_ATTR(sfp_led7, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa5); -static SENSOR_DEVICE_ATTR(sfp_led_flash4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa6); -static SENSOR_DEVICE_ATTR(sfp_led_flash5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa7); -static SENSOR_DEVICE_ATTR(sfp_led_flash6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa8); -static SENSOR_DEVICE_ATTR(sfp_led_flash7, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa9); - -static SENSOR_DEVICE_ATTR(sfp_txdis4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0x60); -static SENSOR_DEVICE_ATTR(sfp_txdis5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0x61); -static SENSOR_DEVICE_ATTR(sfp_txdis6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0x62); - -static SENSOR_DEVICE_ATTR(port_speed7, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc0); -static SENSOR_DEVICE_ATTR(port_speed8, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc1); -static SENSOR_DEVICE_ATTR(port_speed9, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc2); -static SENSOR_DEVICE_ATTR(port_speed10, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc3); -static SENSOR_DEVICE_ATTR(port_speed11, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc4); -static SENSOR_DEVICE_ATTR(port_speed12, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc5); -static SENSOR_DEVICE_ATTR(port_speed13, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc6); -static SENSOR_DEVICE_ATTR(port_speed14, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc7); - -static struct attribute *cpld32_sysfs_attrs[] = { - &sensor_dev_attr_fan_speed_set.dev_attr.attr, - &sensor_dev_attr_fan0_led.dev_attr.attr, - &sensor_dev_attr_fan1_led.dev_attr.attr, - &sensor_dev_attr_fan2_led.dev_attr.attr, - &sensor_dev_attr_fan3_led.dev_attr.attr, - NULL -}; - -static struct attribute *cpld37_sysfs_attrs[] = { - &sensor_dev_attr_fan_present.dev_attr.attr, - &sensor_dev_attr_fan_status.dev_attr.attr, - &sensor_dev_attr_psu_status.dev_attr.attr, - &sensor_dev_attr_broad_back_lct.dev_attr.attr, - &sensor_dev_attr_broad_back_sys.dev_attr.attr, - &sensor_dev_attr_cpld_version.dev_attr.attr, - NULL -}; - -static struct attribute *cpld33_sysfs_attrs[] = { - &sensor_dev_attr_mac_led.dev_attr.attr, - &sensor_dev_attr_broad_front_lct.dev_attr.attr, - &sensor_dev_attr_broad_front_bmc.dev_attr.attr, - &sensor_dev_attr_broad_front_cpu.dev_attr.attr, - &sensor_dev_attr_broad_front_pwr.dev_attr.attr, - &sensor_dev_attr_broad_front_fan.dev_attr.attr, - &sensor_dev_attr_sfp_led1_yellow.dev_attr.attr, - &sensor_dev_attr_mac_temp_flag.dev_attr.attr, - &sensor_dev_attr_cpld_version.dev_attr.attr, - NULL -}; - -static struct attribute *cpld34_sysfs_attrs[] = { - &sensor_dev_attr_sfp_presence1.dev_attr.attr, - &sensor_dev_attr_sfp_presence2.dev_attr.attr, - &sensor_dev_attr_sfp_presence3.dev_attr.attr, - &sensor_dev_attr_sfp_enable.dev_attr.attr, - &sensor_dev_attr_sfp_led1.dev_attr.attr, - &sensor_dev_attr_sfp_led2.dev_attr.attr, - &sensor_dev_attr_sfp_led3.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash1.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash2.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash3.dev_attr.attr, - &sensor_dev_attr_sfp_txdis1.dev_attr.attr, - &sensor_dev_attr_sfp_txdis2.dev_attr.attr, - &sensor_dev_attr_sfp_txdis3.dev_attr.attr, - &sensor_dev_attr_port_speed1.dev_attr.attr, - &sensor_dev_attr_port_speed2.dev_attr.attr, - &sensor_dev_attr_port_speed3.dev_attr.attr, - &sensor_dev_attr_port_speed4.dev_attr.attr, - &sensor_dev_attr_port_speed5.dev_attr.attr, - &sensor_dev_attr_port_speed6.dev_attr.attr, - NULL -}; - -static struct attribute *cpld36_sysfs_attrs[] = { - &sensor_dev_attr_sfp_presence4.dev_attr.attr, - &sensor_dev_attr_sfp_presence5.dev_attr.attr, - &sensor_dev_attr_sfp_presence6.dev_attr.attr, - &sensor_dev_attr_sfp_presence7.dev_attr.attr, - &sensor_dev_attr_sfp_led4.dev_attr.attr, - &sensor_dev_attr_sfp_led5.dev_attr.attr, - &sensor_dev_attr_sfp_led6.dev_attr.attr, - &sensor_dev_attr_sfp_led7.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash4.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash5.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash6.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash7.dev_attr.attr, - &sensor_dev_attr_sfp_txdis4.dev_attr.attr, - &sensor_dev_attr_sfp_txdis5.dev_attr.attr, - &sensor_dev_attr_sfp_txdis6.dev_attr.attr, - &sensor_dev_attr_port_speed7.dev_attr.attr, - &sensor_dev_attr_port_speed8.dev_attr.attr, - &sensor_dev_attr_port_speed9.dev_attr.attr, - &sensor_dev_attr_port_speed10.dev_attr.attr, - &sensor_dev_attr_port_speed11.dev_attr.attr, - &sensor_dev_attr_port_speed12.dev_attr.attr, - &sensor_dev_attr_port_speed13.dev_attr.attr, - &sensor_dev_attr_port_speed14.dev_attr.attr, - NULL -}; - -static struct attribute *cpld35_sysfs_attrs[] = { - &sensor_dev_attr_sfp_enable2.dev_attr.attr, - &sensor_dev_attr_broad_front_lct.dev_attr.attr, - &sensor_dev_attr_broad_front_bmc.dev_attr.attr, - &sensor_dev_attr_broad_front_cpu.dev_attr.attr, - &sensor_dev_attr_broad_front_pwr.dev_attr.attr, - &sensor_dev_attr_broad_front_fan.dev_attr.attr, - &sensor_dev_attr_sfp_led2_yellow.dev_attr.attr, - &sensor_dev_attr_mac_temp_input.dev_attr.attr, - &sensor_dev_attr_cpld_version.dev_attr.attr, - NULL -}; - -static const struct attribute_group cpld32_sysfs_group = { - .attrs = cpld32_sysfs_attrs, -}; - -static const struct attribute_group cpld37_sysfs_group = { - .attrs = cpld37_sysfs_attrs, -}; - -static const struct attribute_group cpld33_sysfs_group = { - .attrs = cpld33_sysfs_attrs, -}; - -static const struct attribute_group cpld34_sysfs_group = { - .attrs = cpld34_sysfs_attrs, -}; - -static const struct attribute_group cpld36_sysfs_group = { - .attrs = cpld36_sysfs_attrs, -}; - -static const struct attribute_group cpld35_sysfs_group = { - .attrs = cpld35_sysfs_attrs, -}; - -static struct attribute *cpld_hwmon_attrs[] = { - &sensor_dev_attr_fan1_input.dev_attr.attr, - &sensor_dev_attr_fan2_input.dev_attr.attr, - &sensor_dev_attr_fan3_input.dev_attr.attr, - &sensor_dev_attr_fan4_input.dev_attr.attr, - NULL -}; -ATTRIBUTE_GROUPS(cpld_hwmon); - -struct cpld_attr_match_group { - int bus_nr; /* I2C BUS */ - unsigned short addr; /* slave addr*/ - const struct attribute_group *attr_group_ptr; - const struct attribute_group *attr_hwmon_ptr; -}; - -static struct cpld_attr_match_group g_cpld_attr_match[] = { - {0, 0x32, &cpld32_sysfs_group, NULL}, - {2, 0x37, &cpld37_sysfs_group, (struct attribute_group *)cpld_hwmon_groups}, - {2, 0x33, &cpld33_sysfs_group, NULL}, - {1, 0x34, &cpld34_sysfs_group, NULL}, - {1, 0x36, &cpld36_sysfs_group, NULL}, - {2, 0x35, &cpld35_sysfs_group, NULL}, -}; - -static const struct attribute_group *cpld_get_attr_group(struct i2c_client *client, int is_hwmon) -{ - int i; - struct cpld_attr_match_group *group; - - for (i = 0; i < ARRAY_SIZE(g_cpld_attr_match); i++) { - group = &g_cpld_attr_match[i]; - DBG_DEBUG("is_hwmon %d i %d client(nr:%d,addr:0x%x), group(nr:%d,addr:0x0%x).\n", is_hwmon, - i, client->adapter->nr, client->addr, group->bus_nr, group->addr); - if ((client->addr == group->addr) && (client->adapter->nr == group->bus_nr)) { - DBG_DEBUG("is_hwmon %d i %d nr %d addr %d .\n", is_hwmon, i, client->adapter->nr, client->addr); - return (is_hwmon) ? (group->attr_hwmon_ptr) : (group->attr_group_ptr); - } - } - - DBG_DEBUG("is_hwmon %d nr %d addr %d dismatch, return NULL.\n", is_hwmon, client->adapter->nr, client->addr); - return NULL; -} - -static int cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct cpld_data *data; - int status; - const struct attribute_group *sysfs_group, *hwmon_group; - - status = -1; - DBG_DEBUG("=========cpld_probe(addr:0x%x, nr:%d)===========\n", client->addr, client->adapter->nr); - data = devm_kzalloc(&client->dev, sizeof(struct cpld_data), GFP_KERNEL); - if (!data) { - return -ENOMEM; - } - - data->client = client; - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - sysfs_group = NULL; - sysfs_group = cpld_get_attr_group(client, 0); - if (sysfs_group) { - status = sysfs_create_group(&client->dev.kobj, sysfs_group); - DBG_DEBUG("=========(addr:0x%x, nr:%d) sysfs_create_group status %d===========\n", client->addr, client->adapter->nr, status); - if (status != 0) { - DBG_ERROR("sysfs_create_group status %d.\n", status); - goto error; - } - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no sysfs_create_group \n", client->addr, client->adapter->nr); - } - - hwmon_group = NULL; - hwmon_group = cpld_get_attr_group(client, 1); - if (hwmon_group) { - data->hwmon_dev = hwmon_device_register_with_groups(&client->dev, client->name, data, (const struct attribute_group **)hwmon_group); - if (IS_ERR(data->hwmon_dev)) { - sysfs_remove_group(&client->dev.kobj, (const struct attribute_group *)sysfs_group); - DBG_ERROR("hwmon_device_register_with_groups failed ret %ld.\n", PTR_ERR(data->hwmon_dev)); - return PTR_ERR(data->hwmon_dev); - } - DBG_DEBUG("=========(addr:0x%x, nr:%d) hwmon_device_register_with_groups success===========\n", client->addr, client->adapter->nr); - if (status != 0) { - DBG_ERROR("sysfs_create_group status %d.\n", status); - goto error; - } - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no hwmon_device_register_with_groups \n", client->addr, client->adapter->nr); - } - -error: - return status; - -} - -static int cpld_remove(struct i2c_client *client) -{ - struct cpld_data *data = i2c_get_clientdata(client); - const struct attribute_group *sysfs_group, *hwmon_group; - - DBG_DEBUG("=========cpld_remove(addr:0x%x, nr:%d)===========\n", client->addr, client->adapter->nr); - - sysfs_group = NULL; - sysfs_group = cpld_get_attr_group(client, 0); - if (sysfs_group) { - DBG_DEBUG("=========(addr:0x%x, nr:%d) do sysfs_remove_group \n", client->addr, client->adapter->nr); - sysfs_remove_group(&client->dev.kobj, (const struct attribute_group *)sysfs_group); - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no sysfs_remove_group \n", client->addr, client->adapter->nr); - } - - hwmon_group = NULL; - hwmon_group = cpld_get_attr_group(client, 1); - if (hwmon_group) { - DBG_DEBUG("=========(addr:0x%x, nr:%d) do hwmon_device_unregister \n", client->addr, client->adapter->nr); - hwmon_device_unregister(data->hwmon_dev); - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no hwmon_device_unregister \n", client->addr, client->adapter->nr); - } - - return 0; -} - - -static const struct i2c_device_id cpld_id[] = { - { "rg_cpld", 0 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, cpld_id); - -static struct i2c_driver rg_cpld_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "rg_cpld", - }, - .probe = cpld_probe, - .remove = cpld_remove, - .id_table = cpld_id, -}; - -module_i2c_driver(rg_cpld_driver); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile CPLD driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c new file mode 100644 index 000000000000..5fcaa8da1963 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c @@ -0,0 +1,178 @@ +/* + * wb_firmware_upgrade.c + * Original Author: support 2021-03-17 + * + * ko for firmware device + * History + * [Version] [Author] [Date] [Description] + * v1.0 support 2021-05-07 Initial version + */ +#include +#include +#include +#include +#include +#include + +static int g_wb_firmware_upgrade_debug = 0; +static int g_wb_firmware_upgrade_error = 0; + +module_param(g_wb_firmware_upgrade_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_firmware_upgrade_error, int, S_IRUGO | S_IWUSR); + +#define WB_FIRMWARE_UPGRADE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_firmware_upgrade_debug) { \ + printk(KERN_INFO "[WB_FIRMWARE_UPGRADE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_FIRMWARE_UPGRADE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_firmware_upgrade_error) { \ + printk(KERN_ERR "[WB_FIRMWARE_UPGRADE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/* cpld */ +static firmware_upgrade_device_t firmware_upgrade_device_data0 = { + .type = "JTAG", + .upg_type.jtag = { + .tdi = 67, + .tck = 65, + .tms = 6, + .tdo = 32, + }, + .en_gpio[0] = 50, + .en_level[0] = 1, + .en_gpio[1] = 48, + .en_level[1] = 1, + .chain = 1, + .chip_index = 1, + + .en_gpio_num = 2, + .en_logic_num = 0, +}; + +/* fpga */ +static firmware_upgrade_device_t firmware_upgrade_device_data1 = { + .type = "SPI_LOGIC", + .chain = 3, + .chip_index = 1, + .upg_type.sysfs = { + .dev_name = "/dev/fpga0", + .ctrl_base = 0xa00, + .flash_base = 0x1A0000, + .test_base = 0x7F0000, + .test_size = 0x10000, + }, + .en_gpio_num = 0, + .en_logic_num = 0, +}; + +static firmware_upgrade_device_t firmware_upgrade_device_data2 = { + .type = "SPI_LOGIC", + .chain = 4, + .chip_index = 1, + .upg_type.sysfs = { + .dev_name = "/dev/fpga0", + .ctrl_base = 0xa00, + .flash_base = 0x0, + .test_base = 0x7F0000, + .test_size = 0x10000, + }, + .en_gpio_num = 0, + .en_logic_num = 0, +}; + +/* bios */ +static firmware_upgrade_device_t firmware_upgrade_device_data3 = { + .type = "MTD_DEV", + .chain = 2, + .chip_index = 1, + .upg_type.sysfs = { + .mtd_name = "BIOS", + .flash_base = 0x800000, + }, + + .en_gpio_num = 0, + .en_logic_num = 0, +}; + +static void firmware_device_release(struct device *dev) +{ + return; +} + +static struct platform_device firmware_upgrade_device[] = { + { + .name = "firmware_cpld_ispvme", + .id = 1, + .dev = { + .platform_data = &firmware_upgrade_device_data0, + .release = firmware_device_release, + }, + }, + { + .name = "firmware_sysfs", + .id = 2, + .dev = { + .platform_data = &firmware_upgrade_device_data1, + .release = firmware_device_release, + }, + }, + { + .name = "firmware_sysfs", + .id = 3, + .dev = { + .platform_data = &firmware_upgrade_device_data2, + .release = firmware_device_release, + }, + }, + { + .name = "firmware_sysfs", + .id = 4, + .dev = { + .platform_data = &firmware_upgrade_device_data3, + .release = firmware_device_release, + }, + }, + }; + + static int __init firmware_upgrade_device_init(void) + { + int i; + int ret = 0; + firmware_upgrade_device_t *firmware_upgrade_device_data; + + WB_FIRMWARE_UPGRADE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(firmware_upgrade_device); i++) { + firmware_upgrade_device_data = firmware_upgrade_device[i].dev.platform_data; + ret = platform_device_register(&firmware_upgrade_device[i]); + if (ret < 0) { + firmware_upgrade_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "firmware_upgrade_device id%d register failed!\n", i + 1); + } else { + firmware_upgrade_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; + } + + static void __exit firmware_upgrade_device_exit(void) + { + int i; + firmware_upgrade_device_t *firmware_upgrade_device_data; + + WB_FIRMWARE_UPGRADE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(firmware_upgrade_device) - 1; i >= 0; i--) { + firmware_upgrade_device_data = firmware_upgrade_device[i].dev.platform_data; + if (firmware_upgrade_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&firmware_upgrade_device[i]); + } + } + } + + module_init(firmware_upgrade_device_init); + module_exit(firmware_upgrade_device_exit); + MODULE_DESCRIPTION("FIRMWARE UPGRADE Devices"); + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c new file mode 100644 index 000000000000..865e7afea44c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include + +#include + +static int g_wb_i2c_dev_device_debug = 0; +static int g_wb_i2c_dev_device_error = 0; + +module_param(g_wb_i2c_dev_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_dev_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_DEV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_dev_device_debug) { \ + printk(KERN_INFO "[WB_I2C_DEV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_DEV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_i2c_dev_device_error) { \ + printk(KERN_ERR "[WB_I2C_DEV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static i2c_dev_device_t i2c_dev_device_data0 = { + .i2c_bus = 2, + .i2c_addr = 0x0d, + .i2c_name = "cpld2", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +static i2c_dev_device_t i2c_dev_device_data1 = { + .i2c_bus = 8, + .i2c_addr = 0x30, + .i2c_name = "cpld3", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +static i2c_dev_device_t i2c_dev_device_data2 = { + .i2c_bus = 8, + .i2c_addr = 0x31, + .i2c_name = "cpld4", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +static i2c_dev_device_t i2c_dev_device_data3 = { + .i2c_bus = 6, + .i2c_addr = 0x0d, + .i2c_name = "cpld5", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +struct i2c_board_info i2c_dev_device_info[] = { + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data0, + }, + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data1, + }, + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data2, + }, + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data3, + }, +}; + +static int __init wb_i2c_dev_device_init(void) +{ + int i; + struct i2c_adapter *adap; + struct i2c_client *client; + i2c_dev_device_t *i2c_dev_device_data; + + WB_I2C_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(i2c_dev_device_info); i++) { + i2c_dev_device_data = i2c_dev_device_info[i].platform_data; + i2c_dev_device_info[i].addr = i2c_dev_device_data->i2c_addr; + adap = i2c_get_adapter(i2c_dev_device_data->i2c_bus); + if (adap == NULL) { + i2c_dev_device_data->client = NULL; + printk(KERN_ERR "get i2c bus %d adapter fail.\n", i2c_dev_device_data->i2c_bus); + continue; + } + client = i2c_new_client_device(adap, &i2c_dev_device_info[i]); + if (!client) { + i2c_dev_device_data->client = NULL; + printk(KERN_ERR "Failed to register i2c dev device %d at bus %d!\n", + i2c_dev_device_data->i2c_addr, i2c_dev_device_data->i2c_bus); + } else { + i2c_dev_device_data->client = client; + } + i2c_put_adapter(adap); + } + return 0; +} + +static void __exit wb_i2c_dev_device_exit(void) +{ + int i; + i2c_dev_device_t *i2c_dev_device_data; + + WB_I2C_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(i2c_dev_device_info) - 1; i >= 0; i--) { + i2c_dev_device_data = i2c_dev_device_info[i].platform_data; + if (i2c_dev_device_data->client) { + i2c_unregister_device(i2c_dev_device_data->client); + i2c_dev_device_data->client = NULL; + } + } +} + +module_init(wb_i2c_dev_device_init); +module_exit(wb_i2c_dev_device_exit); +MODULE_DESCRIPTION("I2C DEV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c new file mode 100644 index 000000000000..f12a71013451 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c @@ -0,0 +1,296 @@ +#include +#include +#include +#include +#include +#include + +#include + +static int g_wb_i2c_mux_pca954x_device_debug = 0; +static int g_wb_i2c_mux_pca954x_device_error = 0; + +module_param(g_wb_i2c_mux_pca954x_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_mux_pca954x_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_MUX_PCA954X_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_mux_pca954x_device_debug) { \ + printk(KERN_INFO "[WB_I2C_MUX_PCA954X_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_MUX_PCA954X_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_i2c_mux_pca954x_device_error) { \ + printk(KERN_ERR "[WB_I2C_MUX_PCA954X_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data0 = { + .i2c_bus = 2, + .i2c_addr = 0x77, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 16, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/cpld5", + .file_attr.offset = 0x60, + .file_attr.mask = 0x02, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x02, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data1 = { + .i2c_bus = 4, + .i2c_addr = 0x77, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 24, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/cpld5", + .file_attr.offset = 0x60, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data2 = { + .i2c_bus = 12, + .i2c_addr = 0x70, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 32, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data3 = { + .i2c_bus = 12, + .i2c_addr = 0x71, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 40, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data4 = { + .i2c_bus = 12, + .i2c_addr = 0x72, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 48, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data5 = { + .i2c_bus = 12, + .i2c_addr = 0x73, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 56, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data6 = { + .i2c_bus = 13, + .i2c_addr = 0x70, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 64, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data7 = { + .i2c_bus = 13, + .i2c_addr = 0x71, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 72, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data8 = { + .i2c_bus = 13, + .i2c_addr = 0x72, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 80, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +struct i2c_board_info i2c_mux_pca954x_device_info[] = { + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data0, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data1, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data2, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data3, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data4, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data5, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data6, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data7, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data8, + }, +}; + +static int __init wb_i2c_mux_pca954x_device_init(void) +{ + int i; + struct i2c_adapter *adap; + struct i2c_client *client; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device_data; + + WB_I2C_MUX_PCA954X_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(i2c_mux_pca954x_device_info); i++) { + i2c_mux_pca954x_device_data = i2c_mux_pca954x_device_info[i].platform_data; + i2c_mux_pca954x_device_info[i].addr = i2c_mux_pca954x_device_data->i2c_addr; + adap = i2c_get_adapter(i2c_mux_pca954x_device_data->i2c_bus); + if (adap == NULL) { + i2c_mux_pca954x_device_data->client = NULL; + printk(KERN_ERR "get i2c bus %d adapter fail.\n", i2c_mux_pca954x_device_data->i2c_bus); + continue; + } + client = i2c_new_client_device(adap, &i2c_mux_pca954x_device_info[i]); + if (!client) { + i2c_mux_pca954x_device_data->client = NULL; + printk(KERN_ERR "Failed to register pca954x device %d at bus %d!\n", + i2c_mux_pca954x_device_data->i2c_addr, i2c_mux_pca954x_device_data->i2c_bus); + } else { + i2c_mux_pca954x_device_data->client = client; + } + i2c_put_adapter(adap); + } + return 0; +} + +static void __exit wb_i2c_mux_pca954x_device_exit(void) +{ + int i; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device_data; + + WB_I2C_MUX_PCA954X_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(i2c_mux_pca954x_device_info) - 1; i >= 0; i--) { + i2c_mux_pca954x_device_data = i2c_mux_pca954x_device_info[i].platform_data; + if (i2c_mux_pca954x_device_data->client) { + i2c_unregister_device(i2c_mux_pca954x_device_data->client); + i2c_mux_pca954x_device_data->client = NULL; + } + } +} + +module_init(wb_i2c_mux_pca954x_device_init); +module_exit(wb_i2c_mux_pca954x_device_exit); +MODULE_DESCRIPTION("I2C MUX PCA954X Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c new file mode 100644 index 000000000000..ff7ba9d26fbc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c @@ -0,0 +1,423 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_i2c_ocores_device_debug = 0; +static int g_wb_i2c_ocores_device_error = 0; + +module_param(g_wb_i2c_ocores_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_ocores_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_OCORE_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_ocores_device_debug) { \ + printk(KERN_INFO "[WB_I2C_OCORE_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_OCORE_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_i2c_ocores_device_error) { \ + printk(KERN_ERR "[WB_I2C_OCORE_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static i2c_ocores_device_t i2c_ocores_device_data0 = { + .adap_nr = 2, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0800, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 0, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data1 = { + .adap_nr = 3, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0820, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 1, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data2 = { + .adap_nr = 4, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0840, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 2, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data3 = { + .adap_nr = 5, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0860, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 3, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data4 = { + .adap_nr = 6, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0880, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 4, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data5 = { + .adap_nr = 7, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x08a0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 5, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data6 = { + .adap_nr = 8, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x08c0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 6, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data7 = { + .adap_nr = 9, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x08e0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 7, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data8 = { + .adap_nr = 10, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0900, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 8, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data9 = { + .adap_nr = 11, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0920, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 9, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data10 = { + .adap_nr = 12, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0940, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 10, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data11 = { + .adap_nr = 13, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0960, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 11, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data12 = { + .adap_nr = 14, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0980, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 12, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data13 = { + .adap_nr = 15, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x09a0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 13, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static void wb_i2c_ocores_device_release(struct device *dev) +{ + return; +} + +static struct platform_device i2c_ocores_device[] = { + { + .name = "wb-ocores-i2c", + .id = 1, + .dev = { + .platform_data = &i2c_ocores_device_data0, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 2, + .dev = { + .platform_data = &i2c_ocores_device_data1, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 3, + .dev = { + .platform_data = &i2c_ocores_device_data2, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 4, + .dev = { + .platform_data = &i2c_ocores_device_data3, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 5, + .dev = { + .platform_data = &i2c_ocores_device_data4, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 6, + .dev = { + .platform_data = &i2c_ocores_device_data5, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 7, + .dev = { + .platform_data = &i2c_ocores_device_data6, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 8, + .dev = { + .platform_data = &i2c_ocores_device_data7, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 9, + .dev = { + .platform_data = &i2c_ocores_device_data8, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 10, + .dev = { + .platform_data = &i2c_ocores_device_data9, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 11, + .dev = { + .platform_data = &i2c_ocores_device_data10, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 12, + .dev = { + .platform_data = &i2c_ocores_device_data11, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 13, + .dev = { + .platform_data = &i2c_ocores_device_data12, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 14, + .dev = { + .platform_data = &i2c_ocores_device_data13, + .release = wb_i2c_ocores_device_release, + }, + }, +}; + +static int __init wb_i2c_ocores_device_init(void) +{ + int i; + int ret = 0; + i2c_ocores_device_t *i2c_ocores_device_data; + + WB_I2C_OCORE_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(i2c_ocores_device); i++) { + i2c_ocores_device_data = i2c_ocores_device[i].dev.platform_data; + ret = platform_device_register(&i2c_ocores_device[i]); + if (ret < 0) { + i2c_ocores_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-ocores-i2c.%d register failed!\n", i + 1); + } else { + i2c_ocores_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_i2c_ocores_device_exit(void) +{ + int i; + i2c_ocores_device_t *i2c_ocores_device_data; + + WB_I2C_OCORE_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(i2c_ocores_device) - 1; i >= 0; i--) { + i2c_ocores_device_data = i2c_ocores_device[i].dev.platform_data; + if (i2c_ocores_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&i2c_ocores_device[i]); + } + } +} + +module_init(wb_i2c_ocores_device_init); +module_exit(wb_i2c_ocores_device_exit); +MODULE_DESCRIPTION("I2C OCORES Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c new file mode 100644 index 000000000000..cc84938fff0e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_io_dev_device_debug = 0; +static int g_wb_io_dev_device_error = 0; + +module_param(g_wb_io_dev_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_io_dev_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_IO_DEV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_io_dev_device_debug) { \ + printk(KERN_INFO "[WB_IO_DEV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_IO_DEV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_io_dev_device_error) { \ + printk(KERN_ERR "[WB_IO_DEV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static io_dev_device_t io_dev_device_data0 = { + .io_dev_name = "cpld0", + .io_base = 0x700, + .io_len = 0x100, + .indirect_addr = 0, +}; + +static io_dev_device_t io_dev_device_data1 = { + .io_dev_name = "cpld1", + .io_base = 0x900, + .io_len = 0x100, + .indirect_addr = 0, +}; + +static void wb_io_dev_device_release(struct device *dev) +{ + return; +} + +static struct platform_device io_dev_device[] = { + { + .name = "wb-io-dev", + .id = 1, + .dev = { + .platform_data = &io_dev_device_data0, + .release = wb_io_dev_device_release, + }, + }, + { + .name = "wb-io-dev", + .id = 2, + .dev = { + .platform_data = &io_dev_device_data1, + .release = wb_io_dev_device_release, + }, + }, +}; + +static int __init wb_io_dev_device_init(void) +{ + int i; + int ret = 0; + io_dev_device_t *io_dev_device_data; + + WB_IO_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(io_dev_device); i++) { + io_dev_device_data = io_dev_device[i].dev.platform_data; + ret = platform_device_register(&io_dev_device[i]); + if (ret < 0) { + io_dev_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-io-dev.%d register failed!\n", i + 1); + } else { + io_dev_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_io_dev_device_exit(void) +{ + int i; + io_dev_device_t *io_dev_device_data; + + WB_IO_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(io_dev_device) - 1; i >= 0; i--) { + io_dev_device_data = io_dev_device[i].dev.platform_data; + if (io_dev_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&io_dev_device[i]); + } + } +} + +module_init(wb_io_dev_device_init); +module_exit(wb_io_dev_device_exit); +MODULE_DESCRIPTION("IO DEV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c new file mode 100644 index 000000000000..9b6b61a51735 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_lpc_drv_device_debug = 0; +static int g_wb_lpc_drv_device_error = 0; + +module_param(g_wb_lpc_drv_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_lpc_drv_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_LPC_DRV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_lpc_drv_device_debug) { \ + printk(KERN_INFO "[WB_LPC_DRV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_LPC_DRV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_lpc_drv_device_error) { \ + printk(KERN_ERR "[WB_LPC_DRV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static lpc_drv_device_t lpc_drv_device_data_0 = { + .lpc_io_name = "wb_lpc", + .pci_domain = 0x0000, + .pci_bus = 0x00, + .pci_slot = 0x1f, + .pci_fn = 0, + .lpc_io_base = 0x700, + .lpc_io_size = 0x100, + .lpc_gen_dec = 0x84, +}; + +static lpc_drv_device_t lpc_drv_device_data_1 = { + .lpc_io_name = "wb_lpc", + .pci_domain = 0x0000, + .pci_bus = 0x00, + .pci_slot = 0x1f, + .pci_fn = 0, + .lpc_io_base = 0x900, + .lpc_io_size = 0x100, + .lpc_gen_dec = 0x88, +}; + +static lpc_drv_device_t lpc_drv_device_data_2 = { + .lpc_io_name = "wb_lpc", + .pci_domain = 0x0000, + .pci_bus = 0x00, + .pci_slot = 0x1f, + .pci_fn = 0, + .lpc_io_base = 0xb00, + .lpc_io_size = 0x100, + .lpc_gen_dec = 0x90, +}; + +static void wb_lpc_drv_device_release(struct device *dev) +{ + return; +} + +static struct platform_device lpc_drv_device[] = { + { + .name = "wb-lpc", + .id = 1, + .dev = { + .platform_data = &lpc_drv_device_data_0, + .release = wb_lpc_drv_device_release, + }, + }, + { + .name = "wb-lpc", + .id = 2, + .dev = { + .platform_data = &lpc_drv_device_data_1, + .release = wb_lpc_drv_device_release, + }, + }, + { + .name = "wb-lpc", + .id = 3, + .dev = { + .platform_data = &lpc_drv_device_data_2, + .release = wb_lpc_drv_device_release, + }, + }, +}; + +static int __init wb_lpc_drv_device_init(void) +{ + int i; + int ret = 0; + lpc_drv_device_t *lpc_drv_device_data; + + WB_LPC_DRV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(lpc_drv_device); i++) { + lpc_drv_device_data = lpc_drv_device[i].dev.platform_data; + ret = platform_device_register(&lpc_drv_device[i]); + if (ret < 0) { + lpc_drv_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-lpc.%d register failed!\n", i + 1); + } else { + lpc_drv_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_lpc_drv_device_exit(void) +{ + int i; + lpc_drv_device_t *lpc_drv_device_data; + + WB_LPC_DRV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(lpc_drv_device) - 1; i >= 0; i--) { + lpc_drv_device_data = lpc_drv_device[i].dev.platform_data; + if (lpc_drv_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&lpc_drv_device[i]); + } + } +} + +module_init(wb_lpc_drv_device_init); +module_exit(wb_lpc_drv_device_exit); +MODULE_DESCRIPTION("LPC DRV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c new file mode 100644 index 000000000000..f79b29770d29 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_pcie_dev_device_debug = 0; +static int g_wb_pcie_dev_device_error = 0; + +module_param(g_wb_pcie_dev_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_pcie_dev_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_PCIE_DEV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_pcie_dev_device_debug) { \ + printk(KERN_INFO "[WB_PCIE_DEV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_PCIE_DEV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_pcie_dev_device_error) { \ + printk(KERN_ERR "[WB_PCIE_DEV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static pci_dev_device_t pcie_dev_device_data0 = { + .pci_dev_name = "fpga0", + .pci_domain = 0x0000, + .pci_bus = 0x08, + .pci_slot = 0x00, + .pci_fn = 0, + .pci_bar = 0, + .bus_width = 4, + .upg_ctrl_base = 0xa00, + .upg_flash_base = 0x1a0000, +}; + +static void wb_pcie_dev_device_release(struct device *dev) +{ + return; +} + +static struct platform_device pcie_dev_device[] = { + { + .name = "wb-pci-dev", + .id = 1, + .dev = { + .platform_data = &pcie_dev_device_data0, + .release = wb_pcie_dev_device_release, + }, + }, +}; + +static int __init wb_pcie_dev_device_init(void) +{ + int i; + int ret = 0; + pci_dev_device_t *pcie_dev_device_data; + + WB_PCIE_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(pcie_dev_device); i++) { + pcie_dev_device_data = pcie_dev_device[i].dev.platform_data; + ret = platform_device_register(&pcie_dev_device[i]); + if (ret < 0) { + pcie_dev_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-pci-dev.%d register failed!\n", i + 1); + } else { + pcie_dev_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_pcie_dev_device_exit(void) +{ + int i; + pci_dev_device_t *pcie_dev_device_data; + + WB_PCIE_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(pcie_dev_device) - 1; i >= 0; i--) { + pcie_dev_device_data = pcie_dev_device[i].dev.platform_data; + if (pcie_dev_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&pcie_dev_device[i]); + } + } +} + +module_init(wb_pcie_dev_device_init); +module_exit(wb_pcie_dev_device_exit); +MODULE_DESCRIPTION("PCIE DEV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg new file mode 100644 index 000000000000..98d1da1750c3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg @@ -0,0 +1,41 @@ +# configuration item: I2C address of CPLD +# format: cpld_i2c_dev.bus_[cpld_slot]_[cpld_id] cpld_i2c_dev.addr_[cpld_slot]_[cpld_id] +# cpld_slot: Main card: 0, linear card: start from 1 +# cpld_id: start from 0 +# bus: I2C bus number of CPLD +# addr: I2C address of CPLD +cpld_i2c_dev.bus_0_2=2 +cpld_i2c_dev.addr_0_2=0x0d +cpld_i2c_dev.bus_0_3=8 +cpld_i2c_dev.addr_0_3=0x30 +cpld_i2c_dev.bus_0_4=8 +cpld_i2c_dev.addr_0_4=0x31 +cpld_i2c_dev.bus_0_5=6 +cpld_i2c_dev.addr_0_5=0x0d + + +# configuration item: LPC address of CPLD +# format: cpld_lpc_addr_[cpld_slot]_[cpld_id] +# cpld_slot: Main card: 0, linear card: start from 1 +# cpld_id: start from 0 +cpld_lpc_dev_0_0=0x700 +cpld_lpc_dev_0_1=0x900 + + +# configuration item: CPLD access method, lpc or i2c +# format: mode_cpld_[cpld_slot][cpld_slot]=lpc/i2c +# cpld_slot: Main card: 0, linear card: start from 1 +# cpld_id: start from 0 +mode_cpld_0_0=lpc +mode_cpld_0_1=lpc +mode_cpld_0_2=i2c +mode_cpld_0_3=i2c +mode_cpld_0_4=i2c +mode_cpld_0_5=i2c + + +# configuration item: the number of CPLD +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: CPLD main_dev is 4 +# minor_dev: CPLD minor_dev not exist +dev_num_4_0=6 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg new file mode 100644 index 000000000000..2350b74eb8bc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg @@ -0,0 +1,304 @@ +# configuration item: the number of fans +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: fan main_dev is 1 +# minor_dev: fan minor_dev not exist(0) +dev_num_1_0=4 + + +# configuration item: the number of rotors +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: rotor main_dev is 1 +# minor_dev: rotor minor_dev is 5 +dev_num_1_5=2 + + +# configuration item: fan presence status +# format: dev_present_status_[main_dev_id][fan_index] +# main_dev_id: fan main_dev_id is 1 +# fan_index: start from 1 +dev_present_status.mode_1_1=config +dev_present_status.src_1_1=cpld +dev_present_status.frmt_1_1=bit +dev_present_status.pola_1_1=negative +dev_present_status.addr_1_1=0x00020030 +dev_present_status.len_1_1=1 +dev_present_status.bit_offset_1_1=0 + +dev_present_status.mode_1_2=config +dev_present_status.src_1_2=cpld +dev_present_status.frmt_1_2=bit +dev_present_status.pola_1_2=negative +dev_present_status.addr_1_2=0x00020030 +dev_present_status.len_1_2=1 +dev_present_status.bit_offset_1_2=1 + +dev_present_status.mode_1_3=config +dev_present_status.src_1_3=cpld +dev_present_status.frmt_1_3=bit +dev_present_status.pola_1_3=negative +dev_present_status.addr_1_3=0x00020030 +dev_present_status.len_1_3=1 +dev_present_status.bit_offset_1_3=2 + +dev_present_status.mode_1_4=config +dev_present_status.src_1_4=cpld +dev_present_status.frmt_1_4=bit +dev_present_status.pola_1_4=negative +dev_present_status.addr_1_4=0x00020030 +dev_present_status.len_1_4=1 +dev_present_status.bit_offset_1_4=3 + + +# configuration item: fan rotor status +# format: fan_roll_status_[fan_id]_[motor_id] +# fan_id: start from 1 +# motor_id: start from 0 +fan_roll_status.mode_1_0=config +fan_roll_status.int_cons_1_0= +fan_roll_status.src_1_0=cpld +fan_roll_status.frmt_1_0=bit +fan_roll_status.pola_1_0=positive +fan_roll_status.fpath_1_0= +fan_roll_status.addr_1_0=0x00020031 +fan_roll_status.len_1_0=1 +fan_roll_status.bit_offset_1_0=0 + +fan_roll_status.mode_1_1=config +fan_roll_status.int_cons_1_1= +fan_roll_status.src_1_1=cpld +fan_roll_status.frmt_1_1=bit +fan_roll_status.pola_1_1=positive +fan_roll_status.fpath_1_1= +fan_roll_status.addr_1_1=0x00020034 +fan_roll_status.len_1_1=1 +fan_roll_status.bit_offset_1_1=0 + +fan_roll_status.mode_2_0=config +fan_roll_status.int_cons_2_0= +fan_roll_status.src_2_0=cpld +fan_roll_status.frmt_2_0=bit +fan_roll_status.pola_2_0=positive +fan_roll_status.fpath_2_0= +fan_roll_status.addr_2_0=0x00020031 +fan_roll_status.len_2_0=1 +fan_roll_status.bit_offset_2_0=1 + +fan_roll_status.mode_2_1=config +fan_roll_status.int_cons_2_1= +fan_roll_status.src_2_1=cpld +fan_roll_status.frmt_2_1=bit +fan_roll_status.pola_2_1=positive +fan_roll_status.fpath_2_1= +fan_roll_status.addr_2_1=0x00020034 +fan_roll_status.len_2_1=1 +fan_roll_status.bit_offset_2_1=1 + +fan_roll_status.mode_3_0=config +fan_roll_status.int_cons_3_0= +fan_roll_status.src_3_0=cpld +fan_roll_status.frmt_3_0=bit +fan_roll_status.pola_3_0=positive +fan_roll_status.fpath_3_0= +fan_roll_status.addr_3_0=0x00020031 +fan_roll_status.len_3_0=1 +fan_roll_status.bit_offset_3_0=2 + +fan_roll_status.mode_3_1=config +fan_roll_status.int_cons_3_1= +fan_roll_status.src_3_1=cpld +fan_roll_status.frmt_3_1=bit +fan_roll_status.pola_3_1=positive +fan_roll_status.fpath_3_1= +fan_roll_status.addr_3_1=0x00020034 +fan_roll_status.len_3_1=1 +fan_roll_status.bit_offset_3_1=2 + +fan_roll_status.mode_4_0=config +fan_roll_status.int_cons_4_0= +fan_roll_status.src_4_0=cpld +fan_roll_status.frmt_4_0=bit +fan_roll_status.pola_4_0=positive +fan_roll_status.fpath_4_0= +fan_roll_status.addr_4_0=0x00020031 +fan_roll_status.len_4_0=1 +fan_roll_status.bit_offset_4_0=3 + +fan_roll_status.mode_4_1=config +fan_roll_status.int_cons_4_1= +fan_roll_status.src_4_1=cpld +fan_roll_status.frmt_4_1=bit +fan_roll_status.pola_4_1=positive +fan_roll_status.fpath_4_1= +fan_roll_status.addr_4_1=0x00020034 +fan_roll_status.len_4_1=1 +fan_roll_status.bit_offset_4_1=3 + + +# configuration item: fan speed +# format: fan_speed_[fan_id]_[motor_id] +# fan_id: start from 1 +# motor_id: start from 0 +fan_speed.mode_1_0=config +fan_speed.int_cons_1_0= +fan_speed.src_1_0=cpld +fan_speed.frmt_1_0=num_bytes +fan_speed.pola_1_0=negative +fan_speed.fpath_1_0= +fan_speed.addr_1_0=0x0002001b +fan_speed.len_1_0=2 +fan_speed.bit_offset_1_0= + +fan_speed.mode_1_1=config +fan_speed.int_cons_1_1= +fan_speed.src_1_1=cpld +fan_speed.frmt_1_1=num_bytes +fan_speed.pola_1_1=negative +fan_speed.fpath_1_1= +fan_speed.addr_1_1=0x00020025 +fan_speed.len_1_1=2 +fan_speed.bit_offset_1_1= + +fan_speed.mode_2_0=config +fan_speed.int_cons_2_0= +fan_speed.src_2_0=cpld +fan_speed.frmt_2_0=num_bytes +fan_speed.pola_2_0=negative +fan_speed.fpath_2_0= +fan_speed.addr_2_0=0x0002001d +fan_speed.len_2_0=2 +fan_speed.bit_offset_2_0= + +fan_speed.mode_2_1=config +fan_speed.int_cons_2_1= +fan_speed.src_2_1=cpld +fan_speed.frmt_2_1=num_bytes +fan_speed.pola_2_1=negative +fan_speed.fpath_2_1= +fan_speed.addr_2_1=0x00020027 +fan_speed.len_2_1=2 +fan_speed.bit_offset_2_1= + +fan_speed.mode_3_0=config +fan_speed.int_cons_3_0= +fan_speed.src_3_0=cpld +fan_speed.frmt_3_0=num_bytes +fan_speed.pola_3_0=negative +fan_speed.fpath_3_0= +fan_speed.addr_3_0=0x0002001f +fan_speed.len_3_0=2 +fan_speed.bit_offset_3_0= + +fan_speed.mode_3_1=config +fan_speed.int_cons_3_1= +fan_speed.src_3_1=cpld +fan_speed.frmt_3_1=num_bytes +fan_speed.pola_3_1=negative +fan_speed.fpath_3_1= +fan_speed.addr_3_1=0x00020029 +fan_speed.len_3_1=2 +fan_speed.bit_offset_3_1= + +fan_speed.mode_4_0=config +fan_speed.int_cons_4_0= +fan_speed.src_4_0=cpld +fan_speed.frmt_4_0=num_bytes +fan_speed.pola_4_0=negative +fan_speed.fpath_4_0= +fan_speed.addr_4_0=0x00020021 +fan_speed.len_4_0=2 +fan_speed.bit_offset_4_0= + +fan_speed.mode_4_1=config +fan_speed.int_cons_4_1= +fan_speed.src_4_1=cpld +fan_speed.frmt_4_1=num_bytes +fan_speed.pola_4_1=negative +fan_speed.fpath_4_1= +fan_speed.addr_4_1=0x0002002b +fan_speed.len_4_1=2 +fan_speed.bit_offset_4_1= + + +# configuration item: fan pwm +# format: fan_ratio_[fan_id]_[motor_id] +# fan_id: start from 1 +# motor_id: start from 0 +fan_ratio.mode_1_0=config +fan_ratio.int_cons_1_0= +fan_ratio.src_1_0=cpld +fan_ratio.frmt_1_0=byte +fan_ratio.pola_1_0= +fan_ratio.fpath_1_0= +fan_ratio.addr_1_0=0x00020014 +fan_ratio.len_1_0=1 +fan_ratio.bit_offset_1_0= + +fan_ratio.mode_1_1=config +fan_ratio.int_cons_1_1= +fan_ratio.src_1_1=cpld +fan_ratio.frmt_1_1=byte +fan_ratio.pola_1_1= +fan_ratio.fpath_1_1= +fan_ratio.addr_1_1=0x00020014 +fan_ratio.len_1_1=1 +fan_ratio.bit_offset_1_1= + +fan_ratio.mode_2_0=config +fan_ratio.int_cons_2_0= +fan_ratio.src_2_0=cpld +fan_ratio.frmt_2_0=byte +fan_ratio.pola_2_0= +fan_ratio.fpath_2_0= +fan_ratio.addr_2_0=0x00020015 +fan_ratio.len_2_0=1 +fan_ratio.bit_offset_2_0= + +fan_ratio.mode_2_1=config +fan_ratio.int_cons_2_1= +fan_ratio.src_2_1=cpld +fan_ratio.frmt_2_1=byte +fan_ratio.pola_2_1= +fan_ratio.fpath_2_1= +fan_ratio.addr_2_1=0x00020015 +fan_ratio.len_2_1=1 +fan_ratio.bit_offset_2_1= + +fan_ratio.mode_3_0=config +fan_ratio.int_cons_3_0= +fan_ratio.src_3_0=cpld +fan_ratio.frmt_3_0=byte +fan_ratio.pola_3_0= +fan_ratio.fpath_3_0= +fan_ratio.addr_3_0=0x00020016 +fan_ratio.len_3_0=1 +fan_ratio.bit_offset_3_0= + +fan_ratio.mode_3_1=config +fan_ratio.int_cons_3_1= +fan_ratio.src_3_1=cpld +fan_ratio.frmt_3_1=byte +fan_ratio.pola_3_1= +fan_ratio.fpath_3_1= +fan_ratio.addr_3_1=0x00020016 +fan_ratio.len_3_1=1 +fan_ratio.bit_offset_3_1= + +fan_ratio.mode_4_0=config +fan_ratio.int_cons_4_0= +fan_ratio.src_4_0=cpld +fan_ratio.frmt_4_0=byte +fan_ratio.pola_4_0= +fan_ratio.fpath_4_0= +fan_ratio.addr_4_0=0x00020017 +fan_ratio.len_4_0=1 +fan_ratio.bit_offset_4_0= + +fan_ratio.mode_4_1=config +fan_ratio.int_cons_4_1= +fan_ratio.src_4_1=cpld +fan_ratio.frmt_4_1=byte +fan_ratio.pola_4_1= +fan_ratio.fpath_4_1= +fan_ratio.addr_4_1=0x00020017 +fan_ratio.len_4_1=1 +fan_ratio.bit_offset_4_1= diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg new file mode 100644 index 000000000000..082ef20fe97f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg @@ -0,0 +1,64 @@ +# configuration item: the number of psus +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: psu main_dev is 2 +# minor_dev: psu minor_dev not exist(0) +dev_num_2_0=2 + + +# configuration item: psu status +# format: psu_status_[psu_index]_[status_id] +# psu_index: start from 1 +# status_id: 0: presence 1: output 2: alert +# psu1 presence status +psu_status.mode_1_0=config +psu_status.src_1_0=cpld +psu_status.frmt_1_0=bit +psu_status.pola_1_0=negative +psu_status.addr_1_0=0x00050051 +psu_status.len_1_0=1 +psu_status.bit_offset_1_0=0 + +# psu1 output status +psu_status.mode_1_1=config +psu_status.src_1_1=cpld +psu_status.frmt_1_1=bit +psu_status.pola_1_1=positive +psu_status.addr_1_1=0x00050051 +psu_status.len_1_1=1 +psu_status.bit_offset_1_1=1 + +# psu1 alert status +psu_status.mode_1_2=config +psu_status.src_1_2=cpld +psu_status.frmt_1_2=bit +psu_status.pola_1_2=negative +psu_status.addr_1_2=0x00050051 +psu_status.len_1_2=1 +psu_status.bit_offset_1_2=2 + +# psu2 presence status +psu_status.mode_2_0=config +psu_status.src_2_0=cpld +psu_status.frmt_2_0=bit +psu_status.pola_2_0=negative +psu_status.addr_2_0=0x00050051 +psu_status.len_2_0=1 +psu_status.bit_offset_2_0=4 + +# psu2 output status +psu_status.mode_2_1=config +psu_status.src_2_1=cpld +psu_status.frmt_2_1=bit +psu_status.pola_2_1=positive +psu_status.addr_2_1=0x00050051 +psu_status.len_2_1=1 +psu_status.bit_offset_2_1=5 + +# psu2 alert status +psu_status.mode_2_2=config +psu_status.src_2_2=cpld +psu_status.frmt_2_2=bit +psu_status.pola_2_2=negative +psu_status.addr_2_2=0x00050051 +psu_status.len_2_2=1 +psu_status.bit_offset_2_2=6 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg new file mode 100644 index 000000000000..7f57dfd93c5b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg @@ -0,0 +1,521 @@ +# configuration item: the number of sffs +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: sff main_dev is 3 +# minor_dev: sff minor_dev not exist(0) +dev_num_3_0=56 + +# configuration item: The directory name of sff sysfs +# format: sff_dir_name_[sff_index] +# sff_index: start from 1 +sff_dir_name_1 =sff1 +sff_dir_name_2 =sff2 +sff_dir_name_3 =sff3 +sff_dir_name_4 =sff4 +sff_dir_name_5 =sff5 +sff_dir_name_6 =sff6 +sff_dir_name_7 =sff7 +sff_dir_name_8 =sff8 +sff_dir_name_9 =sff9 +sff_dir_name_10 =sff10 +sff_dir_name_11 =sff11 +sff_dir_name_12 =sff12 +sff_dir_name_13 =sff13 +sff_dir_name_14 =sff14 +sff_dir_name_15 =sff15 +sff_dir_name_16 =sff16 +sff_dir_name_17 =sff17 +sff_dir_name_18 =sff18 +sff_dir_name_19 =sff19 +sff_dir_name_20 =sff20 +sff_dir_name_21 =sff21 +sff_dir_name_22 =sff22 +sff_dir_name_23 =sff23 +sff_dir_name_24 =sff24 +sff_dir_name_25 =sff25 +sff_dir_name_26 =sff26 +sff_dir_name_27 =sff27 +sff_dir_name_28 =sff28 +sff_dir_name_29 =sff29 +sff_dir_name_30 =sff30 +sff_dir_name_31 =sff31 +sff_dir_name_32 =sff32 +sff_dir_name_33 =sff33 +sff_dir_name_34 =sff34 +sff_dir_name_35 =sff35 +sff_dir_name_36 =sff36 +sff_dir_name_37 =sff37 +sff_dir_name_38 =sff38 +sff_dir_name_39 =sff39 +sff_dir_name_40 =sff40 +sff_dir_name_41 =sff41 +sff_dir_name_42 =sff42 +sff_dir_name_43 =sff43 +sff_dir_name_44 =sff44 +sff_dir_name_45 =sff45 +sff_dir_name_46 =sff46 +sff_dir_name_47 =sff47 +sff_dir_name_48 =sff48 +sff_dir_name_49 =sff49 +sff_dir_name_50 =sff50 +sff_dir_name_51 =sff51 +sff_dir_name_52 =sff52 +sff_dir_name_53 =sff53 +sff_dir_name_54 =sff54 +sff_dir_name_55 =sff55 +sff_dir_name_56 =sff56 + + +# configuration item: sff cpld register status +# format: sff_cpld_reg_[sff_index]_[cpld_reg] +# sff_index: start from 1 +# cpld_reg: 1: power_on, 2: tx_fault, 3: tx_dis, 4:pre_n, 5:rx_los +# 6: reset, 7: lpmode, 8: module_present, 9: interrupt + +# sff cpld presence status +sff_cpld_reg.mode_1_8=config +sff_cpld_reg.src_1_8=cpld +sff_cpld_reg.frmt_1_8=bit +sff_cpld_reg.pola_1_8=negative +sff_cpld_reg.addr_1_8=0x00030030 +sff_cpld_reg.len_1_8=1 +sff_cpld_reg.bit_offset_1_8=0 + +sff_cpld_reg.mode_2_8=config +sff_cpld_reg.src_2_8=cpld +sff_cpld_reg.frmt_2_8=bit +sff_cpld_reg.pola_2_8=negative +sff_cpld_reg.addr_2_8=0x00030030 +sff_cpld_reg.len_2_8=1 +sff_cpld_reg.bit_offset_2_8=1 + +sff_cpld_reg.mode_3_8=config +sff_cpld_reg.src_3_8=cpld +sff_cpld_reg.frmt_3_8=bit +sff_cpld_reg.pola_3_8=negative +sff_cpld_reg.addr_3_8=0x00030030 +sff_cpld_reg.len_3_8=1 +sff_cpld_reg.bit_offset_3_8=2 + +sff_cpld_reg.mode_4_8=config +sff_cpld_reg.src_4_8=cpld +sff_cpld_reg.frmt_4_8=bit +sff_cpld_reg.pola_4_8=negative +sff_cpld_reg.addr_4_8=0x00030030 +sff_cpld_reg.len_4_8=1 +sff_cpld_reg.bit_offset_4_8=3 + +sff_cpld_reg.mode_5_8=config +sff_cpld_reg.src_5_8=cpld +sff_cpld_reg.frmt_5_8=bit +sff_cpld_reg.pola_5_8=negative +sff_cpld_reg.addr_5_8=0x00030030 +sff_cpld_reg.len_5_8=1 +sff_cpld_reg.bit_offset_5_8=4 + +sff_cpld_reg.mode_6_8=config +sff_cpld_reg.src_6_8=cpld +sff_cpld_reg.frmt_6_8=bit +sff_cpld_reg.pola_6_8=negative +sff_cpld_reg.addr_6_8=0x00030030 +sff_cpld_reg.len_6_8=1 +sff_cpld_reg.bit_offset_6_8=5 + +sff_cpld_reg.mode_7_8=config +sff_cpld_reg.src_7_8=cpld +sff_cpld_reg.frmt_7_8=bit +sff_cpld_reg.pola_7_8=negative +sff_cpld_reg.addr_7_8=0x00030030 +sff_cpld_reg.len_7_8=1 +sff_cpld_reg.bit_offset_7_8=6 + +sff_cpld_reg.mode_8_8=config +sff_cpld_reg.src_8_8=cpld +sff_cpld_reg.frmt_8_8=bit +sff_cpld_reg.pola_8_8=negative +sff_cpld_reg.addr_8_8=0x00030030 +sff_cpld_reg.len_8_8=1 +sff_cpld_reg.bit_offset_8_8=7 + +sff_cpld_reg.mode_9_8=config +sff_cpld_reg.src_9_8=cpld +sff_cpld_reg.frmt_9_8=bit +sff_cpld_reg.pola_9_8=negative +sff_cpld_reg.addr_9_8=0x00030031 +sff_cpld_reg.len_9_8=1 +sff_cpld_reg.bit_offset_9_8=0 + +sff_cpld_reg.mode_10_8=config +sff_cpld_reg.src_10_8=cpld +sff_cpld_reg.frmt_10_8=bit +sff_cpld_reg.pola_10_8=negative +sff_cpld_reg.addr_10_8=0x00030031 +sff_cpld_reg.len_10_8=1 +sff_cpld_reg.bit_offset_10_8=1 + +sff_cpld_reg.mode_11_8=config +sff_cpld_reg.src_11_8=cpld +sff_cpld_reg.frmt_11_8=bit +sff_cpld_reg.pola_11_8=negative +sff_cpld_reg.addr_11_8=0x00030031 +sff_cpld_reg.len_11_8=1 +sff_cpld_reg.bit_offset_11_8=2 + +sff_cpld_reg.mode_12_8=config +sff_cpld_reg.src_12_8=cpld +sff_cpld_reg.frmt_12_8=bit +sff_cpld_reg.pola_12_8=negative +sff_cpld_reg.addr_12_8=0x00030031 +sff_cpld_reg.len_12_8=1 +sff_cpld_reg.bit_offset_12_8=3 + +sff_cpld_reg.mode_13_8=config +sff_cpld_reg.src_13_8=cpld +sff_cpld_reg.frmt_13_8=bit +sff_cpld_reg.pola_13_8=negative +sff_cpld_reg.addr_13_8=0x00030031 +sff_cpld_reg.len_13_8=1 +sff_cpld_reg.bit_offset_13_8=4 + +sff_cpld_reg.mode_14_8=config +sff_cpld_reg.src_14_8=cpld +sff_cpld_reg.frmt_14_8=bit +sff_cpld_reg.pola_14_8=negative +sff_cpld_reg.addr_14_8=0x00030031 +sff_cpld_reg.len_14_8=1 +sff_cpld_reg.bit_offset_14_8=5 + +sff_cpld_reg.mode_15_8=config +sff_cpld_reg.src_15_8=cpld +sff_cpld_reg.frmt_15_8=bit +sff_cpld_reg.pola_15_8=negative +sff_cpld_reg.addr_15_8=0x00030031 +sff_cpld_reg.len_15_8=1 +sff_cpld_reg.bit_offset_15_8=6 + +sff_cpld_reg.mode_16_8=config +sff_cpld_reg.src_16_8=cpld +sff_cpld_reg.frmt_16_8=bit +sff_cpld_reg.pola_16_8=negative +sff_cpld_reg.addr_16_8=0x00030031 +sff_cpld_reg.len_16_8=1 +sff_cpld_reg.bit_offset_16_8=7 + +sff_cpld_reg.mode_17_8=config +sff_cpld_reg.src_17_8=cpld +sff_cpld_reg.frmt_17_8=bit +sff_cpld_reg.pola_17_8=negative +sff_cpld_reg.addr_17_8=0x00030032 +sff_cpld_reg.len_17_8=1 +sff_cpld_reg.bit_offset_17_8=0 + +sff_cpld_reg.mode_18_8=config +sff_cpld_reg.src_18_8=cpld +sff_cpld_reg.frmt_18_8=bit +sff_cpld_reg.pola_18_8=negative +sff_cpld_reg.addr_18_8=0x00030032 +sff_cpld_reg.len_18_8=1 +sff_cpld_reg.bit_offset_18_8=1 + +sff_cpld_reg.mode_19_8=config +sff_cpld_reg.src_19_8=cpld +sff_cpld_reg.frmt_19_8=bit +sff_cpld_reg.pola_19_8=negative +sff_cpld_reg.addr_19_8=0x00030032 +sff_cpld_reg.len_19_8=1 +sff_cpld_reg.bit_offset_19_8=2 + +sff_cpld_reg.mode_20_8=config +sff_cpld_reg.src_20_8=cpld +sff_cpld_reg.frmt_20_8=bit +sff_cpld_reg.pola_20_8=negative +sff_cpld_reg.addr_20_8=0x00030032 +sff_cpld_reg.len_20_8=1 +sff_cpld_reg.bit_offset_20_8=3 + +sff_cpld_reg.mode_21_8=config +sff_cpld_reg.src_21_8=cpld +sff_cpld_reg.frmt_21_8=bit +sff_cpld_reg.pola_21_8=negative +sff_cpld_reg.addr_21_8=0x00030032 +sff_cpld_reg.len_21_8=1 +sff_cpld_reg.bit_offset_21_8=4 + +sff_cpld_reg.mode_22_8=config +sff_cpld_reg.src_22_8=cpld +sff_cpld_reg.frmt_22_8=bit +sff_cpld_reg.pola_22_8=negative +sff_cpld_reg.addr_22_8=0x00030032 +sff_cpld_reg.len_22_8=1 +sff_cpld_reg.bit_offset_22_8=5 + +sff_cpld_reg.mode_23_8=config +sff_cpld_reg.src_23_8=cpld +sff_cpld_reg.frmt_23_8=bit +sff_cpld_reg.pola_23_8=negative +sff_cpld_reg.addr_23_8=0x00030032 +sff_cpld_reg.len_23_8=1 +sff_cpld_reg.bit_offset_23_8=6 + +sff_cpld_reg.mode_24_8=config +sff_cpld_reg.src_24_8=cpld +sff_cpld_reg.frmt_24_8=bit +sff_cpld_reg.pola_24_8=negative +sff_cpld_reg.addr_24_8=0x00030032 +sff_cpld_reg.len_24_8=1 +sff_cpld_reg.bit_offset_24_8=7 + +sff_cpld_reg.mode_25_8=config +sff_cpld_reg.src_25_8=cpld +sff_cpld_reg.frmt_25_8=bit +sff_cpld_reg.pola_25_8=negative +sff_cpld_reg.addr_25_8=0x00040030 +sff_cpld_reg.len_25_8=1 +sff_cpld_reg.bit_offset_25_8=0 + +sff_cpld_reg.mode_26_8=config +sff_cpld_reg.src_26_8=cpld +sff_cpld_reg.frmt_26_8=bit +sff_cpld_reg.pola_26_8=negative +sff_cpld_reg.addr_26_8=0x00040030 +sff_cpld_reg.len_26_8=1 +sff_cpld_reg.bit_offset_26_8=1 + +sff_cpld_reg.mode_27_8=config +sff_cpld_reg.src_27_8=cpld +sff_cpld_reg.frmt_27_8=bit +sff_cpld_reg.pola_27_8=negative +sff_cpld_reg.addr_27_8=0x00040030 +sff_cpld_reg.len_27_8=1 +sff_cpld_reg.bit_offset_27_8=2 + +sff_cpld_reg.mode_28_8=config +sff_cpld_reg.src_28_8=cpld +sff_cpld_reg.frmt_28_8=bit +sff_cpld_reg.pola_28_8=negative +sff_cpld_reg.addr_28_8=0x00040030 +sff_cpld_reg.len_28_8=1 +sff_cpld_reg.bit_offset_28_8=3 + +sff_cpld_reg.mode_29_8=config +sff_cpld_reg.src_29_8=cpld +sff_cpld_reg.frmt_29_8=bit +sff_cpld_reg.pola_29_8=negative +sff_cpld_reg.addr_29_8=0x00040030 +sff_cpld_reg.len_29_8=1 +sff_cpld_reg.bit_offset_29_8=4 + +sff_cpld_reg.mode_30_8=config +sff_cpld_reg.src_30_8=cpld +sff_cpld_reg.frmt_30_8=bit +sff_cpld_reg.pola_30_8=negative +sff_cpld_reg.addr_30_8=0x00040030 +sff_cpld_reg.len_30_8=1 +sff_cpld_reg.bit_offset_30_8=5 + +sff_cpld_reg.mode_31_8=config +sff_cpld_reg.src_31_8=cpld +sff_cpld_reg.frmt_31_8=bit +sff_cpld_reg.pola_31_8=negative +sff_cpld_reg.addr_31_8=0x00040030 +sff_cpld_reg.len_31_8=1 +sff_cpld_reg.bit_offset_31_8=6 + +sff_cpld_reg.mode_32_8=config +sff_cpld_reg.src_32_8=cpld +sff_cpld_reg.frmt_32_8=bit +sff_cpld_reg.pola_32_8=negative +sff_cpld_reg.addr_32_8=0x00040030 +sff_cpld_reg.len_32_8=1 +sff_cpld_reg.bit_offset_32_8=7 + +sff_cpld_reg.mode_33_8=config +sff_cpld_reg.src_33_8=cpld +sff_cpld_reg.frmt_33_8=bit +sff_cpld_reg.pola_33_8=negative +sff_cpld_reg.addr_33_8=0x00040031 +sff_cpld_reg.len_33_8=1 +sff_cpld_reg.bit_offset_33_8=0 + +sff_cpld_reg.mode_34_8=config +sff_cpld_reg.src_34_8=cpld +sff_cpld_reg.frmt_34_8=bit +sff_cpld_reg.pola_34_8=negative +sff_cpld_reg.addr_34_8=0x00040031 +sff_cpld_reg.len_34_8=1 +sff_cpld_reg.bit_offset_34_8=1 + +sff_cpld_reg.mode_35_8=config +sff_cpld_reg.src_35_8=cpld +sff_cpld_reg.frmt_35_8=bit +sff_cpld_reg.pola_35_8=negative +sff_cpld_reg.addr_35_8=0x00040031 +sff_cpld_reg.len_35_8=1 +sff_cpld_reg.bit_offset_35_8=2 + +sff_cpld_reg.mode_36_8=config +sff_cpld_reg.src_36_8=cpld +sff_cpld_reg.frmt_36_8=bit +sff_cpld_reg.pola_36_8=negative +sff_cpld_reg.addr_36_8=0x00040031 +sff_cpld_reg.len_36_8=1 +sff_cpld_reg.bit_offset_36_8=3 + +sff_cpld_reg.mode_37_8=config +sff_cpld_reg.src_37_8=cpld +sff_cpld_reg.frmt_37_8=bit +sff_cpld_reg.pola_37_8=negative +sff_cpld_reg.addr_37_8=0x00040031 +sff_cpld_reg.len_37_8=1 +sff_cpld_reg.bit_offset_37_8=4 + +sff_cpld_reg.mode_38_8=config +sff_cpld_reg.src_38_8=cpld +sff_cpld_reg.frmt_38_8=bit +sff_cpld_reg.pola_38_8=negative +sff_cpld_reg.addr_38_8=0x00040031 +sff_cpld_reg.len_38_8=1 +sff_cpld_reg.bit_offset_38_8=5 + +sff_cpld_reg.mode_39_8=config +sff_cpld_reg.src_39_8=cpld +sff_cpld_reg.frmt_39_8=bit +sff_cpld_reg.pola_39_8=negative +sff_cpld_reg.addr_39_8=0x00040031 +sff_cpld_reg.len_39_8=1 +sff_cpld_reg.bit_offset_39_8=6 + +sff_cpld_reg.mode_40_8=config +sff_cpld_reg.src_40_8=cpld +sff_cpld_reg.frmt_40_8=bit +sff_cpld_reg.pola_40_8=negative +sff_cpld_reg.addr_40_8=0x00040031 +sff_cpld_reg.len_40_8=1 +sff_cpld_reg.bit_offset_40_8=7 + +sff_cpld_reg.mode_41_8=config +sff_cpld_reg.src_41_8=cpld +sff_cpld_reg.frmt_41_8=bit +sff_cpld_reg.pola_41_8=negative +sff_cpld_reg.addr_41_8=0x00040032 +sff_cpld_reg.len_41_8=1 +sff_cpld_reg.bit_offset_41_8=0 + +sff_cpld_reg.mode_42_8=config +sff_cpld_reg.src_42_8=cpld +sff_cpld_reg.frmt_42_8=bit +sff_cpld_reg.pola_42_8=negative +sff_cpld_reg.addr_42_8=0x00040032 +sff_cpld_reg.len_42_8=1 +sff_cpld_reg.bit_offset_42_8=1 + +sff_cpld_reg.mode_43_8=config +sff_cpld_reg.src_43_8=cpld +sff_cpld_reg.frmt_43_8=bit +sff_cpld_reg.pola_43_8=negative +sff_cpld_reg.addr_43_8=0x00040032 +sff_cpld_reg.len_43_8=1 +sff_cpld_reg.bit_offset_43_8=2 + +sff_cpld_reg.mode_44_8=config +sff_cpld_reg.src_44_8=cpld +sff_cpld_reg.frmt_44_8=bit +sff_cpld_reg.pola_44_8=negative +sff_cpld_reg.addr_44_8=0x00040032 +sff_cpld_reg.len_44_8=1 +sff_cpld_reg.bit_offset_44_8=3 + +sff_cpld_reg.mode_45_8=config +sff_cpld_reg.src_45_8=cpld +sff_cpld_reg.frmt_45_8=bit +sff_cpld_reg.pola_45_8=negative +sff_cpld_reg.addr_45_8=0x00040032 +sff_cpld_reg.len_45_8=1 +sff_cpld_reg.bit_offset_45_8=4 + +sff_cpld_reg.mode_46_8=config +sff_cpld_reg.src_46_8=cpld +sff_cpld_reg.frmt_46_8=bit +sff_cpld_reg.pola_46_8=negative +sff_cpld_reg.addr_46_8=0x00040032 +sff_cpld_reg.len_46_8=1 +sff_cpld_reg.bit_offset_46_8=5 + +sff_cpld_reg.mode_47_8=config +sff_cpld_reg.src_47_8=cpld +sff_cpld_reg.frmt_47_8=bit +sff_cpld_reg.pola_47_8=negative +sff_cpld_reg.addr_47_8=0x00040032 +sff_cpld_reg.len_47_8=1 +sff_cpld_reg.bit_offset_47_8=6 + +sff_cpld_reg.mode_48_8=config +sff_cpld_reg.src_48_8=cpld +sff_cpld_reg.frmt_48_8=bit +sff_cpld_reg.pola_48_8=negative +sff_cpld_reg.addr_48_8=0x00040032 +sff_cpld_reg.len_48_8=1 +sff_cpld_reg.bit_offset_48_8=7 + +sff_cpld_reg.mode_49_8=config +sff_cpld_reg.src_49_8=cpld +sff_cpld_reg.frmt_49_8=bit +sff_cpld_reg.pola_49_8=negative +sff_cpld_reg.addr_49_8=0x00040033 +sff_cpld_reg.len_49_8=1 +sff_cpld_reg.bit_offset_49_8=0 + +sff_cpld_reg.mode_50_8=config +sff_cpld_reg.src_50_8=cpld +sff_cpld_reg.frmt_50_8=bit +sff_cpld_reg.pola_50_8=negative +sff_cpld_reg.addr_50_8=0x00040033 +sff_cpld_reg.len_50_8=1 +sff_cpld_reg.bit_offset_50_8=1 + +sff_cpld_reg.mode_51_8=config +sff_cpld_reg.src_51_8=cpld +sff_cpld_reg.frmt_51_8=bit +sff_cpld_reg.pola_51_8=negative +sff_cpld_reg.addr_51_8=0x00040033 +sff_cpld_reg.len_51_8=1 +sff_cpld_reg.bit_offset_51_8=2 + +sff_cpld_reg.mode_52_8=config +sff_cpld_reg.src_52_8=cpld +sff_cpld_reg.frmt_52_8=bit +sff_cpld_reg.pola_52_8=negative +sff_cpld_reg.addr_52_8=0x00040033 +sff_cpld_reg.len_52_8=1 +sff_cpld_reg.bit_offset_52_8=3 + +sff_cpld_reg.mode_53_8=config +sff_cpld_reg.src_53_8=cpld +sff_cpld_reg.frmt_53_8=bit +sff_cpld_reg.pola_53_8=negative +sff_cpld_reg.addr_53_8=0x00040033 +sff_cpld_reg.len_53_8=1 +sff_cpld_reg.bit_offset_53_8=4 + +sff_cpld_reg.mode_54_8=config +sff_cpld_reg.src_54_8=cpld +sff_cpld_reg.frmt_54_8=bit +sff_cpld_reg.pola_54_8=negative +sff_cpld_reg.addr_54_8=0x00040033 +sff_cpld_reg.len_54_8=1 +sff_cpld_reg.bit_offset_54_8=5 + +sff_cpld_reg.mode_55_8=config +sff_cpld_reg.src_55_8=cpld +sff_cpld_reg.frmt_55_8=bit +sff_cpld_reg.pola_55_8=negative +sff_cpld_reg.addr_55_8=0x00040033 +sff_cpld_reg.len_55_8=1 +sff_cpld_reg.bit_offset_55_8=6 + +sff_cpld_reg.mode_56_8=config +sff_cpld_reg.src_56_8=cpld +sff_cpld_reg.frmt_56_8=bit +sff_cpld_reg.pola_56_8=negative +sff_cpld_reg.addr_56_8=0x00040033 +sff_cpld_reg.len_56_8=1 +sff_cpld_reg.bit_offset_56_8=7 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name new file mode 100644 index 000000000000..5f49420441a5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name @@ -0,0 +1,4 @@ +WB_PLAT_CPLD +WB_PLAT_FAN +WB_PLAT_PSU +WB_PLAT_SFF diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh deleted file mode 100755 index badbce25589d..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -count=10 -while [ $count -gt 0 ] -do - lsmod | grep 9641 >/dev/null 2>&1 - if [ $? -eq 0 ] - then - break - fi - count=$(( count - 1 )) - sleep 1 -done - -if [ $count -eq 0 ] -then - # mod not loaded - exit 1 -fi - -if [ ! -d "/sys/bus/i2c/devices/i2c-2" ] -then - echo pca9541 0x10 > /sys/bus/i2c/devices/i2c-0/new_device - if [ $? -ne 0 ] - then - exit $? - fi -fi - -exit 0 - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py index f36055fb4e6d..6c3916921abb 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py @@ -3,18 +3,25 @@ setup( name='sonic-platform', version='1.0', - description='SONiC platform API implementation on RAGILE Platforms', + description='SONiC platform API implementation', license='Apache 2.0', author='SONiC Team', - author_email='support@ragile.com', + author_email='support', url='', - maintainer='RAGILE SUPPORT TEAM', + maintainer='support', maintainer_email='', packages=[ 'sonic_platform', - 'rgutil', + 'plat_hal', + 'wbutil', 'eepromutil', - 'sonic_pcie', + 'hal-config', + 'config', + ], + py_modules=[ + 'hal_pltfm', + 'platform_util', + 'platform_intf', ], classifiers=[ 'Development Status :: 3 - Alpha', @@ -30,4 +37,3 @@ ], keywords='sonic SONiC platform PLATFORM', ) - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py deleted file mode 100644 index 73e2a89c8d74..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ["pcie_common"] \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py deleted file mode 100644 index 12f1cc8ed7b9..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py +++ /dev/null @@ -1,107 +0,0 @@ -# pcie_common.py -# Common PCIE check interfaces for SONIC -# - -import os -import yaml -import subprocess -import re -import sys -from copy import deepcopy -try: - from .pcie import PcieBase -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class PcieUtil(PcieBase): - """Platform-specific PCIEutil class""" - # got the config file path - def __init__(self, path): - self.config_path = path - - # load the config file - def load_config_file(self): - config_file = self.config_path + "/" + "pcie.yaml" - try: - with open(config_file) as conf_file: - self.confInfo = yaml.load(conf_file) - except IOError as e: - print("Error: {}".format(str(e))) - print("Not found config file, please add a config file manually, or generate it by running [pcieutil pcie_generate]") - sys.exit() - - # load current PCIe device - def get_pcie_device(self): - pciDict = {} - pciList = [] - p1 = "^(\w+):(\w+)\.(\w)\s(.*)\s*\(*.*\)*" - p2 = "^.*:.*:.*:(\w+)\s*\(*.*\)*" - command1 = ["sudo", "lspci"] - command2 = ["sudo", "lspci", "-n"] - # run command 1 - proc1 = subprocess.Popen(command1, universal_newlines=True, stdout=subprocess.PIPE) - output1 = proc1.stdout.readlines() - proc1.communicate() - # run command 2 - proc2 = subprocess.Popen(command2, universal_newlines=True, stdout=subprocess.PIPE) - output2 = proc2.stdout.readlines() - proc2.communicate() - - if proc1.returncode > 0: - for line1 in output1: - print(line1.strip()) - return - elif proc2.returncode > 0: - for line2 in output2: - print(line2.strip()) - return - else: - for (line1, line2) in zip(output1, output2): - pciDict.clear() - match1 = re.search(p1, line1.strip()) - match2 = re.search(p2, line2.strip()) - if match1 and match2: - Bus = match1.group(1) - Dev = match1.group(2) - Fn = match1.group(3) - Name = match1.group(4) - Id = match2.group(1) - pciDict["name"] = Name - pciDict["bus"] = Bus - pciDict["dev"] = Dev - pciDict["fn"] = Fn - pciDict["id"] = Id - pciList.append(pciDict) - pciDict = deepcopy(pciDict) - else: - print("CAN NOT MATCH PCIe DEVICE") - return pciList - - # check the sysfs tree for each PCIe device - def check_pcie_sysfs(self, domain=0, bus=0, device=0, func=0): - dev_path = os.path.join('/sys/bus/pci/devices', '%04x:%02x:%02x.%d' % (domain, bus, device, func)) - if os.path.exists(dev_path): - return True - return False - - # check the current PCIe device with config file and return the result - def get_pcie_check(self): - self.load_config_file() - for item_conf in self.confInfo: - bus_conf = item_conf["bus"] - dev_conf = item_conf["dev"] - fn_conf = item_conf["fn"] - if self.check_pcie_sysfs(bus=int(bus_conf, base=16), device=int(dev_conf, base=16), func=int(fn_conf, base=16)): - item_conf["result"] = "Passed" - else: - item_conf["result"] = "Failed" - return self.confInfo - - # generate the config file with current pci device - def dump_conf_yaml(self): - curInfo = self.get_pcie_device() - with open(self.config_path + "/" + "pcie.yaml", "w") as conf_file: - yaml.dump(curInfo, conf_file, default_flow_style=False) - return - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py deleted file mode 100644 index 593867d31c9d..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# All the derived classes for PDDF -__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] -from . import platform - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py deleted file mode 100644 index f179b279cc13..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py +++ /dev/null @@ -1,134 +0,0 @@ -############################################################################# -# PDDF -# Module contains an implementation of SONiC Chassis API -# -############################################################################# - -try: - import time - from sonic_platform_pddf_base.pddf_chassis import PddfChassis - from .component import Component - from sonic_platform.sfp import * - from .sfp_config import * -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -class Chassis(PddfChassis): - """ - PDDF Platform-specific Chassis class - """ - - STATUS_INSERTED = "1" - STATUS_REMOVED = "0" - sfp_present_dict = {} - - def __init__(self, pddf_data=None, pddf_plugin_data=None): - PddfChassis.__init__(self, pddf_data, pddf_plugin_data) - for i in range(0,3): - self._component_list.append(Component(i)) - - try: - self._sfp_list = [] - sfp_config = get_sfp_config() - self.port_start_index = sfp_config.get("port_index_start", 0) - self.port_num = sfp_config.get("port_num", 0) - # fix problem with first index is 1, we add a fake sfp node - if self.port_start_index == 1: - self._sfp_list.append(Sfp(1)) - - # sfp id always start at 1 - for index in range(1, self.port_num + 1): - self._sfp_list.append(Sfp(index)) - - for i in range(self.port_start_index, self.port_start_index + self.port_num): - self.sfp_present_dict[i] = self.STATUS_REMOVED - - except Exception as err: - print("SFP init error: %s" % str(err)) - - def get_revision(self): - val = ord(self._eeprom.revision_str()) - test = "{}".format(val) - return test - - def get_reboot_cause(self): - """ - Retrieves the cause of the previous reboot - Returns: - A tuple (string, string) where the first element is a string - containing the cause of the previous reboot. This string must be - one of the predefined strings in this class. If the first string - is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used - to pass a description of the reboot cause. - """ - - return (self.REBOOT_CAUSE_NON_HARDWARE, None) - - def get_change_event(self, timeout=0): - change_event_dict = {"sfp": {}} - - start_time = time.time() - forever = False - - if timeout == 0: - forever = True - elif timeout > 0: - timeout = timeout / float(1000) # Convert to secs - else: - print("get_change_event:Invalid timeout value", timeout) - return False, change_event_dict - - end_time = start_time + timeout - if start_time > end_time: - print( - "get_change_event:" "time wrap / invalid timeout value", - timeout, - ) - return False, change_event_dict # Time wrap or possibly incorrect timeout - try: - while timeout >= 0: - # check for sfp - sfp_change_dict = self.get_transceiver_change_event() - if sfp_change_dict : - change_event_dict["sfp"] = sfp_change_dict - return True, change_event_dict - if forever: - time.sleep(1) - else: - timeout = end_time - time.time() - if timeout >= 1: - time.sleep(1) # We poll at 1 second granularity - else: - if timeout > 0: - time.sleep(timeout) - return True, change_event_dict - except Exception as e: - print(e) - print("get_change_event: Should not reach here.") - return False, change_event_dict - - def get_transceiver_change_event(self): - cur_sfp_present_dict = {} - ret_dict = {} - - # Check for OIR events and return ret_dict - for i in range(self.port_start_index, self.port_start_index + self.port_num): - sfp = self._sfp_list[i] - if sfp.get_presence(): - cur_sfp_present_dict[i] = self.STATUS_INSERTED - - else: - cur_sfp_present_dict[i] = self.STATUS_REMOVED - - # Update reg value - if cur_sfp_present_dict == self.sfp_present_dict: - return ret_dict - - for index, status in cur_sfp_present_dict.items(): - if self.sfp_present_dict[index] != status: - ret_dict[index] = status - - self.sfp_present_dict = cur_sfp_present_dict - - return ret_dict - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py deleted file mode 100644 index e1bef19c24d7..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py +++ /dev/null @@ -1,44 +0,0 @@ -import os -import yaml -import subprocess -from sonic_py_common import device_info - - -class Common: - - DEVICE_PATH = '/usr/share/sonic/device/' - PMON_PLATFORM_PATH = '/usr/share/sonic/platform/' - CONFIG_DIR = 'sonic_platform_config' - - HOST_CHK_CMD = ["docker"] - - def __init__(self): - (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() - - def is_host(self): - return subprocess.call(self.HOST_CHK_CMD) == 0 - - def load_json_file(self, path): - """ - Retrieves the json object from json file path - - Returns: - A json object - """ - with open(path, 'r') as f: - json_data = yaml.safe_load(f) - - return json_data - - def get_config_path(self, config_name): - """ - Retrieves the path to platform api config directory - - Args: - config_name: A string containing the name of config file. - - Returns: - A string containing the path to json file - """ - return os.path.join(self.DEVICE_PATH, self.platform, self.CONFIG_DIR, config_name) if self.is_host() else os.path.join(self.PMON_PLATFORM_PATH, self.CONFIG_DIR, config_name) - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py deleted file mode 100644 index 0fd19ccf99b5..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py +++ /dev/null @@ -1,110 +0,0 @@ -######################################################################## -# Ragile RA-B6510-48v8c -# -# Module contains an implementation of SONiC Platform Base API and -# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in -# the platform -# -######################################################################## - -try: - from sonic_platform_base.component_base import ComponentBase - from sonic_py_common.general import getstatusoutput_noshell - import sonic_platform.hwaccess as hwaccess -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -def get_cpld_version(bus, i2caddr): - return '{}{}{}{}'.format(hwaccess.i2c_get(bus, i2caddr, 1), - hwaccess.i2c_get(bus, i2caddr, 2), - hwaccess.i2c_get(bus, i2caddr, 3), - hwaccess.i2c_get(bus, i2caddr, 0) - ) - -def get_cpu_cpld_version(): - return get_cpld_version(0, 0x0d) - -def get_cpld1_version(): - return get_cpld_version(2, 0x33) - -def get_cpld2_version(): - return get_cpld_version(2, 0x35) - -COMPONENT_LIST= [ - ['CPU CPLD', - 'cpu board', - get_cpu_cpld_version - ], - - ['MAC1 CPLD', - 'mac1 board', - get_cpld1_version - ], - - ['MAC2 CPLD', - 'mac2 board', - get_cpld2_version - ] - ] - - - -class Component(ComponentBase): - """ Ragile Platform-specific Component class""" - - def __init__(self, component_index=0): - ComponentBase.__init__(self) - self.index = component_index - - def get_name(self): - """ - Retrieves the name of the component - - Returns: - A string containing the name of the component - """ - return COMPONENT_LIST[self.index][0] - - def get_description(self): - """ - Retrieves the description of the component - - Returns: - A string containing the description of the component - """ - return COMPONENT_LIST[self.index][1] - - def get_firmware_version(self): - """ - Retrieves the firmware version of the component - - Returns: - A string containing the firmware version of the component - """ - return COMPONENT_LIST[self.index][2]() - - def install_firmware(self, image_path): - """ - Installs firmware to the component - - Args: - image_path: A string, path to firmware image - - Returns: - A boolean, True if install was successful, False if not - """ - try: - successtips = "CPLD Upgrade succeeded!" - status, output = getstatusoutput_noshell(["which", "firmware_upgrade"]) - if status or len(output) <= 0: - logger.error("no upgrade tool.") - return False - cmdstr = [output, image_path, "cpld", str(self.slot), "cpld"] - ret, log = getstatusoutput_noshell(cmdstr) - if ret == 0 and successtips in log: - return True - logger.error("upgrade failed. ret:%d, log:\n%s" % (ret, log)) - except Exception as e: - logger.error(str(e)) - return False - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py deleted file mode 100644 index 162f01680ad0..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py +++ /dev/null @@ -1,558 +0,0 @@ -# -*- coding: utf-8 -*- - -PSU_FAN_AIRFLOW = { - "CSU550AP-3-300": "F2B", - "AS-40FAN-01-F-RJ": "F2B", - "CSU550AP-3-500": "F2B", - "DPS-550AB-39 A": "F2B", - "DPS-1300AB-6 S": "F2B", - "FSP1200-20ERM": "F2B", - "CSU800AP-3-300": "F2B", - "CSU550AP-3-501": "B2F", - "DPS-550AB-40 A": "B2F", -} - -FAN_AIRFLOW = { - "AS-80FAN-01-F-RJ": "F2B", - "AS-40FAN-01-F-RJ": "F2B", - "AS-80FAN-01-R-RJ": "B2F", - "AS-40FAN-01-R-RJ": "B2F", -} - -psutypedecode = { - 0x00: "N/A", - 0x01: "AC", - 0x02: "DC", -} - - -class Unit: - Temperature = "C" - Voltage = "V" - Current = "A" - Power = "W" - Speed = "RPM" - - -class Threshold: - PSU_TEMP_MIN = -10 * 1000 - PSU_TEMP_MAX = 60 * 1000 - - PSU_FAN_SPEED_MIN = 2000 - PSU_FAN_SPEED_MAX = 28000 - - PSU_OUTPUT_VOLTAGE_MIN = 11 * 1000 - PSU_OUTPUT_VOLTAGE_MAX = 14 * 1000 - - PSU_AC_INPUT_VOLTAGE_MIN = 200 * 1000 - PSU_AC_INPUT_VOLTAGE_MAX = 240 * 1000 - - PSU_DC_INPUT_VOLTAGE_MIN = 190 * 1000 - PSU_DC_INPUT_VOLTAGE_MAX = 290 * 1000 - - ERR_VALUE = -9999999 - - PSU_OUTPUT_POWER_MIN = 10 * 1000 - PSU_OUTPUT_POWER_MAX = 1300 * 1000 - - PSU_INPUT_POWER_MIN = 10 * 1000 - PSU_INPUT_POWER_MAX = 1444 * 1000 - - PSU_OUTPUT_CURRENT_MIN = 2 * 1000 - PSU_OUTPUT_CURRENT_MAX = 107 * 1000 - - PSU_INPUT_CURRENT_MIN = 0.2 * 1000 - PSU_INPUT_CURRENT_MAX = 7 * 1000 - - FAN_SPEED_MAX = 23000 - FAN_SPEED_MIN = 500 - - -class DecodeFormat: - TEXT = 0 - DECIMAL = 1 - ONE_BIT_HEX = 2 - HUNDREDTH = 3 - THOUSANDTH = 4 - MILLIONTH = 5 - AND = 6 - JOIN = 7 - - -class DecodeMethod: - SYSFS = 0 - I2C = 1 - I2C_WORD = 2 - DEVMEM = 3 - SDK = 4 - - -class Description: - CPLD = "Used for managing IO modules, SFP+ modules and system LEDs" - BIOS = "Performs initialization of hardware components during booting" - FPGA = "Platform management controller for on-board temperature monitoring, in-chassis power, Fan and LED control" - - -FAN_LED_COLORS = { - "green": 0b1001, - "red": 0b1010, - "amber": 0b0011, -} - - -DEVICE_CONF = { - "eeprom": {"bus": 2, "loc": "0057"}, - "components": [ - { - "name": "CPLD1 (MAC Board A)", - "firmware_version": { - "bus": 2, - "addr": 0x33, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 0, - }, - { - "name": "CPLD2 (MAC Board B)", - "firmware_version": { - "bus": 2, - "addr": 0x35, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 0, - }, - { - "name": "CPLD3 (CONNECT Board A)", - "firmware_version": { - "bus": 2, - "addr": 0x37, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 0, - }, - { - "name": "CPLD4 (CPU Board)", - "firmware_version": { - "bus": 0, - "addr": 0x0D, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 1, - }, - ], - "thermals": [ - { - "name": "INLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": None, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "OUTLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": None, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "BOARD TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": None, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "PHYSICAL ID 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp2_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 1", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp3_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 2", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp4_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 3", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp5_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - ], - "fans": [ - { - "name": "fan1", - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 0, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 0, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/3-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/3-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan0_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan1_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - { - "name": "fan2", - "e2loc": {"bus": 4, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/4-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/4-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan1_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan2_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - { - "name": "fan3", - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 2, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 2, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/5-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/5-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan2_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan3_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - { - "name": "fan4", - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 3, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 3, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/6-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/6-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan3_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan4_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - ], - "psus": [ - { - "name": "psu1", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 0, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "sn": {"loc": "/sys/bus/i2c/devices/7-0050/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/7-0050/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/7-0050/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_fault", - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_input" - }, - "speed_max": Threshold.PSU_FAN_SPEED_MAX, - } - ], - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power1_input", - "format": DecodeFormat.MILLIONTH, - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power2_input", - "format": DecodeFormat.MILLIONTH, - }, - }, - { - "name": "psu2", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 4, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 5, - }, - "sn": {"loc": "/sys/bus/i2c/devices/8-0053/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/8-0053/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/8-0053/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_fault", - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 5, - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_input" - }, - "speed_max": Threshold.PSU_FAN_SPEED_MAX, - } - ], - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power1_input", - "format": DecodeFormat.MILLIONTH, - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power2_input", - "format": DecodeFormat.MILLIONTH, - }, - }, - ], -} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py deleted file mode 100644 index c25d711354f5..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py +++ /dev/null @@ -1,12 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class Eeprom(PddfEeprom): - - def __init__(self, pddf_data=None, pddf_plugin_data=None): - PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py deleted file mode 100644 index 47b5a9629c46..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py +++ /dev/null @@ -1,36 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_fan import PddfFan -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class Fan(PddfFan): - """PDDF Platform-Specific Fan class""" - - def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): - # idx is 0-based - PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) - - # Provide the functions/variables below for which implementation is to be overwritten - # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' - def get_direction(self): - """ - Retrieves the direction of fan - - Returns: - A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST - depending on fan direction - """ - return self.FAN_DIRECTION_EXHAUST - - def get_speed_rpm(self): - if self.is_psu_fan: - return super().get_speed_rpm() - else: - divisor = 15000000 - mask_low = 0xff - ret = super().get_speed_rpm() - # revert ret - ret = (ret >> 8) + ((ret & mask_low) << 8) - return int(divisor/ret) - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py deleted file mode 100644 index d03fd656f4d7..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - - -try: - from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class FanDrawer(PddfFanDrawer): - """PDDF Platform-Specific Fan-Drawer class""" - - def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): - # idx is 0-based - PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py deleted file mode 100755 index c604d9c61164..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py +++ /dev/null @@ -1,47 +0,0 @@ -# Helper functions to access hardware - -import os -import struct -import mmap -import subprocess - -# Read PCI device - -def pci_mem_read(mm, offset): - mm.seek(offset) - read_data_stream = mm.read(4) - return struct.unpack('I',read_data_stream)[0] - -def pci_get_value(resource, offset): - with open(resource, 'r+b') as fd: - mm = mmap.mmap(fd.fileno(), 0) - val = pci_mem_read(mm, offset) - mm.close() - return val - -def pci_mem_write(memmap, offset, data): - """ Write PCI device """ - memmap.seek(offset) - memmap.write(struct.pack('I', data)) - -def pci_set_value(resource, val, offset): - """ Set a value to PCI device """ - with open(resource, 'w+b') as filed: - memmap = None - try: - memmap = mmap.mmap(filed.fileno(), 0) - pci_mem_write(memmap, offset, val) - except EnvironmentError: - pass - if memmap is not None: - memmap.close() - -# Read I2C device - -def i2c_get(bus, i2caddr, ofs): - try: - valx = int(subprocess.check_output(['/usr/sbin/i2cget','-f', '-y', str(bus), str(i2caddr), str(ofs)]), 16) - return "{:02x}".format(valx) - except (FileNotFoundError, subprocess.CalledProcessError): - return -1 - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py deleted file mode 100644 index 5969781bf9a9..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -import logging - - -def _init_logger(): - formatter = logging.Formatter( - "%(asctime)s %(levelname)s %(filename)s[%(funcName)s][%(lineno)s]: %(message)s" - ) - handler = logging.FileHandler("/var/log/syslog") - handler.setFormatter(formatter) - - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - logger.addHandler(handler) - return logger - - -logger = _init_logger() diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py deleted file mode 100644 index 5a66997d33d0..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py +++ /dev/null @@ -1,43 +0,0 @@ -# -# pcie_base.py -# -# Abstract base class for implementing platform-specific -# PCIE functionality for SONiC -# - -try: - import abc - from sonic_pcie import PcieUtil -except ImportError as e: - raise ImportError (str(e) + " - required module not found") - -class PcieBase(object): - def __init__(self, path): - """ - Constructor - Args: - pcieutil file and config file path - """ - self.pcie_util = PcieUtil(path) - - - @abc.abstractmethod - def get_pcie_device(self): - """ - get current device pcie info - - Returns: - A list including pcie device info - """ - return self.pcie_util.get_pcie_device() - - - @abc.abstractmethod - def get_pcie_check(self): - """ - Check Pcie device with config file - Returns: - A list including pcie device and test result info - """ - return self.pcie_util.get_pcie_check() - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py deleted file mode 100644 index 71eacf763ff1..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py +++ /dev/null @@ -1,104 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_psu import PddfPsu - from sonic_py_common.general import getstatusoutput_noshell - import time -except ImportError as e: - raise ImportError (str(e) + "- required module not found") - - -class Psu(PddfPsu): - """PDDF Platform-Specific PSU class""" - - PLATFORM_PSU_CAPACITY = 1200 - - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten - def get_maximum_supplied_power(self): - """ - Retrieves the maximum supplied power by PSU (or PSU capacity) - Returns: - A float number, the maximum power output in Watts. - e.g. 1200.1 - """ - return float(self.PLATFORM_PSU_CAPACITY) - - def get_type(self): - """ - Gets the type of the PSU - Returns: - A string, the type of PSU (AC/DC) - """ - return "DC" - - def runcmd(self, cmd): - time_retry = 6 - result_msg = "" - time_delay = 0.01 - while time_retry: - try: - val, result_msg = getstatusoutput_noshell(cmd.split(" ")) - if val is False: - time_retry -=1 - time.sleep(time_delay) - continue - else: - return val, result_msg - except Exception as e: - time_retry -= 1 - result_msg = str(e) - time.sleep(time_delay) - - return False, result_msg - - def get_voltage(self): - """ - Retrieves current PSU voltage output - - Returns: - A float number, the output voltage in volts, - e.g. 12.1 - """ - - v_out = 0 - label_t = "psu_v_out" - device = "PSU{}".format(self.psu_index) - #print(device) - pddf_obj_data = self.pddf_obj.data - - if device in pddf_obj_data.keys(): - pmbusloc = pddf_obj_data[device]['i2c']['interface'] - - for val in pmbusloc: - dev_name = val['dev'] - pmbus_loc = pddf_obj_data[dev_name] - i2cloc = pmbus_loc['i2c']['attr_list'] - parentbus = pmbus_loc['i2c']['topo_info'] - - for item_t in i2cloc: - if item_t['attr_name'] == label_t: - parentbus_id = int(parentbus['parent_bus'], 16) - vout_mode_cmd = "i2cget -f -y {} {} 0x20 bp".format(parentbus_id, parentbus['dev_addr']) - ret_t, val_voutmode = self.runcmd(vout_mode_cmd) - if ret_t is False: - return 0.0 - v_out_cmd = "i2cget -f -y {} {} {} wp".format(parentbus_id, parentbus['dev_addr'], item_t['attr_offset']) - ret_t, val_p_out = self.runcmd(v_out_cmd) - if ret_t is False: - return 0.0 - val_voutmode_t = int(val_voutmode, 16) - val_p_out_t = int(val_p_out, 16) * 1000 - - import ctypes - val_voutmode_t_t = ctypes.c_int8(val_voutmode_t << 3).value >>3 - - if (val_voutmode_t_t) < 0: - val_p_out_t_f = val_p_out_t>> (-val_voutmode_t_t) - else: - val_p_out_t_f = val_p_out_t << val_voutmode_t_t - - return float(val_p_out_t_f)/1000 - - return float(v_out)/1000 - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py deleted file mode 100644 index bff2bd41ea55..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py +++ /dev/null @@ -1,245 +0,0 @@ -# -*- coding: utf-8 -*- -from glob import glob -from plat_hal.osutil import osutil - -try: - from sonic_platform.config import DecodeFormat, DecodeMethod - - DECODE_FORMAT = DecodeFormat - DECODE_METHOD = DecodeMethod -except ImportError: - raise ImportError(str(e) + "- required module not found") - -ERR_CODE = "ERR" - - -class Reg(object): - """ - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c"} - "value": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/hwmon*/temp1_input", - "way": "sysfs", - - "InputsStatus": { - "bus": 8, - "addr": 0x5B, - "offset": 0x79, - "way": "i2cword", - "mask": 0x0200, - }, - """ - - def __new__(cls, *args): - if args[0] is None or not isinstance(args[0], dict): - return None - return super(Reg, cls).__new__(cls) - - def __init__(self, data): - - self.loc = None - self.way = DECODE_METHOD.SYSFS - self.addr = None - self.bus = None - self.offset = None - self.size = 1 - self.bit = None - self.mask = None - self.digit = None - self.sdk_type = None - self.sep = None - self.format = DECODE_FORMAT.TEXT - self.__dict__.update(data) - - def _read_reg_val(self): - ret = None - try: - if self.way == DECODE_METHOD.SYSFS: - ret = self.get_sysfs() - elif self.way == DECODE_METHOD.I2C: - ret = self.get_i2c() - elif self.way == DECODE_METHOD.I2C_WORD: - ret = self.get_i2cword() - elif self.way == DECODE_METHOD.DEVMEM: - ret = self.get_devmem() - elif self.way == DECODE_METHOD.SDK: - # TODO - pass - else: - pass - except Exception as e: - raise e - - return ret - - def _write_reg_val(self, val): - try: - if self.way == DECODE_METHOD.SYSFS: - return self._write_sysfs(val) - except Exception as e: - raise e - - return False - - def _write_sysfs(self, val): - try: - with open(glob(self.loc)[0], "w") as f: - f.write(val) - f.flush() - return True - except Exception as e: - raise e - - def _format_val(self, val): - try: - if isinstance(val, str): - val = val.strip() - if self.format == DECODE_FORMAT.THOUSANDTH: - return float("%.1f" % (float(val) / 1000)) - elif self.format == DECODE_FORMAT.HUNDREDTH: - return float("%.1f" % (float(val) / 100)) - elif self.format == DECODE_FORMAT.ONE_BIT_HEX: - return (int(val, 16) & (1 << self.bit)) >> self.bit - elif self.format == DECODE_FORMAT.DECIMAL: - return int(val, 10) - elif self.format == DECODE_FORMAT.MILLIONTH: - return float("%.1f" % (float(val) / 1000 / 1000)) - elif self.format == DECODE_FORMAT.AND: - return (int(val, 16)) & self.mask - elif isinstance(val, list): - if self.format == DECODE_FORMAT.JOIN: - return self.sep.join(val) - except Exception as e: - raise e - else: - return val - - def decode(self): - """ - get value by config way - way i2c/sysfs/lpc - """ - if self.way is None: - raise ValueError("cannot found way to deal") - - ret = self._read_reg_val() - - ret = self._format_val(ret) - return ret - - def encode(self, val): - if self.way is None: - raise ValueError("cannot found way to deal") - - return self._write_reg_val(val) - - def get_sdk(self): - # TODO - pass - - def get_sysfs(self): - if self.loc is None: - raise ValueError("Not Enough Attr: loc: {}".format(self.loc)) - - ret, val = osutil.readsysfs(self.loc) - - if not ret: - raise IOError(val) - - return val - - def get_devmem(self): - if self.addr is None or self.digit is None or self.mask is None: - raise ValueError( - "Not Enough Attr: addr: {}, digit: {}, mask: {}".format( - self.addr, self.digit, self.mask - ) - ) - - ret, val = osutil.getdevmem(self.addr, self.digit, self.mask) - - if not ret: - raise IOError(val) - - return val - - def get_i2cword(self): - if self.bus is None or self.addr is None or self.offset is None: - raise ValueError( - "Not Enough Attr: bus: {}, addr: {}, offset: {}".format( - self.bus, self.addr, self.offset - ) - ) - - ret, val = osutil.geti2cword(self.bus, self.addr, self.offset) - - if not ret: - raise IOError(val) - - return val - - def get_i2c(self): - if ( - self.bus is None - or self.addr is None - or self.offset is None - or self.size is None - ): - raise ValueError( - "Not Enough Attr: bus: {}, addr: {}, offset: {}".format( - self.bus, self.addr, self.offset - ) - ) - - value = [] - for i in range(self.size): - ofs = self.offset + i - ret, val = osutil.rji2cget(self.bus, self.addr, ofs) - - if not ret: - raise IOError(val) - else: - value.append(repr(chr(val)).translate(None, r"\\x").replace("'", "")) - - return value - - def set_i2cword(self, bus, addr, offset, byte): - return self.seti2cword(bus, addr, offset, byte) - - def seti2cword(self, bus, addr, offset, byte): - return osutil.seti2cword(bus, addr, offset, byte) - - def set_i2c(self, bus, addr, offset, byte): - return self.seti2c(bus, addr, offset, byte) - - def seti2c(self, bus, addr, offset, byte): - ret, val = osutil.rji2cset(bus, addr, offset, byte) - return ret, val - - def getbcmtemp(self): - try: - sta, ret = osutil.getmactemp() - if sta == True: - mac_aver = float(ret.get("average", self.__error_ret)) - #mac_max = float(ret.get("maximum", self.__error_ret)) - mac_aver = mac_aver * 1000 - #mac_max = mac_max * 1000 - else: - return False, ret - except AttributeError as e: - return False, str(e) - return True, mac_aver - - def getbcmreg(self, reg): - ret, val = osutil.getsdkreg(reg) - return ret, val - - def logger_debug(self, msg): - baseutil.logger_debug(msg) - - def command(self, cmd): - ret, output = osutil.command(cmd) - return ret, output - - def set_val(self, val): - # TODO - pass diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py deleted file mode 100644 index 3e5bcc5b9b9a..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -try: - from sonic_platform.regutil import Reg - from sonic_platform.logger import logger -except ImportError: - raise ImportError(str(e) + "- required module not found") - -class Rotor: - def __init__(self, config): - if config is not None and isinstance(config, dict): - self.__reg_speed_getter = Reg(config.get("speed_getter")) - self.__reg_speed_setter = Reg(config.get("speed_setter")) - self.__speed_max = config.get("speed_max") - else: - raise ValueError("init rotor Error: {}".format(config)) - - def get_speed(self): - try: - return int(self.__reg_speed_getter.decode()) - except Exception as e: - logger.error(str(e)) - - return 0 - - def set_speed(self, speed): - try: - return self.__reg_speed_setter.encode(speed) - except Exception as e: - logger.error(str(e)) - - return False - - def get_speed_percentage(self): - try: - speed = self.get_speed() - return (100 * speed) / self.__speed_max - except Exception as e: - logger.error(str(e)) - - return 0 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py deleted file mode 100644 index d468912fdda3..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py +++ /dev/null @@ -1,23 +0,0 @@ -cust_sfp_cfg = { - 'x86_64-ragile_ra-b6510-48v8c-r0': { - "ver": '2.1', - "port_index_start": 0, - "port_num": 56, - "log_level": 2, - "eeprom_retry_times": 5, - "eeprom_retry_break_sec": 0.2, - "presence_path": "/sys/bus/i2c/devices/%d-0053/xcvr_present", - "presence_path_key": list(range(11, 67)), - "presence_val_is_present": 1, - "eeprom_path": "/sys/bus/i2c/devices/%d-0050/eeprom", - "eeprom_path_key": list(range(11, 67)), - "optoe_driver_path": "/sys/bus/i2c/devices/%d-0050/dev_class", - "optoe_driver_key": list(range(11, 67)), - "txdisable_path": "/sys/bus/i2c/devices/%d-0053/xcvr_txdisable", - "txdisable_path_key": list(range(11, 59)) + [0] * 8, - "txdisable_val_is_on": 0, - "reset_path": "/sys/bus/i2c/devices/%d-0053/xcvr_reset", - "reset_path_key": [0]* 48 + list(range(59, 67)), - "reset_val_is_on": 0, - }, -} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py deleted file mode 100644 index f2a73e5f5db8..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py +++ /dev/null @@ -1,14 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_thermal import PddfThermal -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - - -class Thermal(PddfThermal): - """PDDF Platform-Specific Thermal class""" - - def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py deleted file mode 100644 index 37788c2c821e..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py +++ /dev/null @@ -1,21 +0,0 @@ -############################################################################# -# -# Module contains an implementation of platform specific watchdog API's -# -############################################################################# - -try: - from sonic_platform_pddf_base.pddf_watchdog import PddfWatchdog -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -class Watchdog(PddfWatchdog): - """ - PDDF Platform-specific Chassis class - """ - - def __init__(self): - PddfWatchdog.__init__(self) - self.timeout= 180 - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service deleted file mode 120000 index 0fd9f25b6c5e..000000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service +++ /dev/null @@ -1 +0,0 @@ -../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 82c92126e6bc..cb99b99fd3d9 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -168,6 +168,7 @@ ifp_inports_support_enable port_flex_enable pdma_descriptor_prefetch_enable pktdma_poll_mode_channel_bitmap +warmboot_knet_shutdown_mode num_queues_pci num_queues_uc0 num_queues_uc1 @@ -333,3 +334,8 @@ cmic_dma_abort_in_cold_boot hybrid_pfc_deadlock_enable sai_pfc_dlr_init_capability appl_param_nof_ports_per_modid +sai_fdb_entry_l2_discard_src_enable +svi_my_station_optimization +sai_nbr_bcast_ifp_optimized +sai_pfc_defaults_disable +sai_optimized_mmu From f1a4fbb1ad0119aced3ac5ffa50ae9f83fb36136 Mon Sep 17 00:00:00 2001 From: Vivek Date: Fri, 4 Aug 2023 13:00:54 -0700 Subject: [PATCH 097/145] [FeatureD] Add featured systemd files in host-services and update submodule (#15815) ### Why I did it - Hostcfgd is handling a lot of tasks and Feature table is by itself an important and big task which can benefit from separation into a new daemon - Currently, Hostcfgd handles feature table first before other tables an thus other taska such as Aaa, Ntp are delayed. With the split, they can run in paralell - After the recent config-reload enhancements, Hostcfgd uses a multi-threading approach to listen to PortInitDone. BY splitting the daemon into two, we can avoid having a separate thread by using SubscriberStateTable and Select,. #### Note: Depends on host-services PR : https://github.com/sonic-net/sonic-host-services/pull/71 Once the host-services is merged, updating the submodule along with this PR should fix the CI problem #### How I did it Refactor the feature related tasks from hostcfgd into a seperate daemon. #### How to verify it UT's and Tested on DUT ``` admin@r-tigris-22:~$ show logging -f | grep featured Jun 28 22:13:33.870021 r-tigris-22 INFO featured: ConfigDB connect success Jun 28 22:14:05.638063 r-tigris-22 INFO featured: Updating feature 'radv' systemd config file related to auto-restart ... Jun 28 22:14:06.169184 r-tigris-22 INFO featured: Feature radv is enabled and started Jun 28 22:14:06.172343 r-tigris-22 INFO featured: Updating feature 'sflow' systemd config file related to auto-restart ... Jun 28 22:14:06.844322 r-tigris-22 INFO featured: Feature sflow is stopped and disabled Jun 28 22:14:06.846761 r-tigris-22 INFO featured: Updating feature 'snmp' systemd config file related to auto-restart ... Jun 28 22:14:07.129090 r-tigris-22 INFO featured: Feature is snmp delayed for port init Jun 28 22:14:07.132052 r-tigris-22 INFO featured: Updating feature 'swss' systemd config file related to auto-restart ... Jun 28 22:14:08.368948 r-tigris-22 INFO featured: Feature swss is enabled and started Jun 28 22:14:08.369240 r-tigris-22 INFO featured: Updating feature 'syncd' systemd config file related to auto-restart ... Jun 28 22:14:08.718357 r-tigris-22 INFO featured: Feature syncd is enabled and started Jun 28 22:14:08.721496 r-tigris-22 INFO featured: Updating feature 'teamd' systemd config file related to auto-restart ... Jun 28 22:14:09.042495 r-tigris-22 INFO featured: Feature teamd is enabled and started Jun 28 22:14:09.045441 r-tigris-22 INFO featured: Updating feature 'telemetry' systemd config file related to auto-restart ... Jun 28 22:14:09.359831 r-tigris-22 INFO featured: Feature is telemetry delayed for port init Jun 28 22:14:30.740499 r-tigris-22 INFO featured: Updating delayed features after port initialization Jun 28 22:14:33.914178 r-tigris-22 INFO featured: Feature lldp is enabled and started Jun 28 22:14:35.536264 r-tigris-22 INFO featured: Feature mgmt-framework is enabled and started Jun 28 22:14:38.098571 r-tigris-22 INFO featured: Feature snmp is enabled and started Jun 28 22:14:39.555727 r-tigris-22 INFO featured: Feature telemetry is enabled and started Jun 28 22:13:33.977011 r-tigris-22 INFO hostcfgd: ConfigDB connect success Jun 28 22:13:33.993878 r-tigris-22 INFO hostcfgd: Waiting for systemctl to finish initialization Jun 28 22:13:34.274818 r-tigris-22 INFO hostcfgd: systemctl has finished initialization -- proceeding ... Jun 28 22:13:34.391623 r-tigris-22 INFO hostcfgd: file size check pass: /etc/pam.d/sshd size is (2139) bytes Jun 28 22:13:34.427273 r-tigris-22 INFO hostcfgd: file size check pass: /etc/pam.d/login size is (4132) bytes Jun 28 22:13:34.433390 r-tigris-22 INFO hostcfgd: file size check pass: /etc/nsswitch.conf size is (494) bytes Jun 28 22:13:34.455110 r-tigris-22 INFO hostcfgd: file size check pass: /etc/nsswitch.conf size is (494) bytes Jun 28 22:13:34.478882 r-tigris-22 INFO hostcfgd: Found audisp-tacplus PID: 442 Jun 28 22:13:34.482365 r-tigris-22 INFO hostcfgd: cmd - ['service', 'aaastatsd', 'stop'] Jun 28 22:13:36.108569 r-tigris-22 INFO hostcfgd: NtpCfg load ... Jun 28 22:13:36.108699 r-tigris-22 INFO hostcfgd: ntp server update key 0 Jun 28 22:13:36.108763 r-tigris-22 INFO hostcfgd: ntp server update, restarting ntp-config, ntp servers configured set() Jun 28 22:14:06.691693 r-tigris-22 INFO hostcfgd: KdumpCfg init ... Jun 28 22:14:06.691771 r-tigris-22 DEBUG hostcfgd: passw_policies_update - key: POLICIES Jun 28 22:14:06.691832 r-tigris-22 DEBUG hostcfgd: passw_policies_update - data: {'digits_class': 'true', 'expiration': '180', 'expiration_warning': '15', 'history_cnt': '10', 'len_min': '8', 'lower_class': 'true', 'reject_user_passw_match': 'true', 'special_class': 'true', 'state': 'disabled', 'upper_class': 'true'} Jun 28 22:14:06.691891 r-tigris-22 DEBUG hostcfgd: modify_conf_file: passw_policies - {'digits_class': True, 'expiration': '180', 'expiration_warning': '15', 'history_cnt': '10', 'len_min': '8', 'lower_class': True, 'reject_user_passw_match': True, 'special_class': True, 'state': 'disabled', 'upper_class': True} Jun 28 22:14:06.701982 r-tigris-22 DEBUG hostcfgd: Initial hostname: r-tigris-22 Jun 28 22:14:06.702075 r-tigris-22 DEBUG hostcfgd: Initial mgmt interface conf: {('eth0', '10.210.24.108/22'): {'gwaddr': '10.210.24.1'}} Jun 28 22:14:06.702115 r-tigris-22 DEBUG hostcfgd: Initial mgmt VRF state: Jun 28 22:14:06.702177 r-tigris-22 INFO hostcfgd: RSyslogCfg: Initial config: {'config': {'GLOBAL': {'rate_limit_burst': '0', 'rate_limit_interval': '0'}}, 'servers': {}} Jun 28 22:14:06.709455 r-tigris-22 INFO hostcfgd[39326]: Failed to restart resolv-config.service: Unit resolv-config.service not found. Jun 28 22:14:06.709560 r-tigris-22 ERR hostcfgd: ['systemctl', 'restart', 'resolv-config'] - failed: return code - 5, output:#012None admin@r-tigris-22:~$ Connection to r-tigris-22 closed by remote host. ``` --- src/sonic-host-services | 2 +- src/sonic-host-services-data/debian/rules | 1 + .../debian/sonic-host-services-data.featured.service | 10 ++++++++++ .../debian/sonic-host-services-data.featured.timer | 12 ++++++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/sonic-host-services-data/debian/sonic-host-services-data.featured.service create mode 100644 src/sonic-host-services-data/debian/sonic-host-services-data.featured.timer diff --git a/src/sonic-host-services b/src/sonic-host-services index 11a44d515d5a..6767bc7b6d45 160000 --- a/src/sonic-host-services +++ b/src/sonic-host-services @@ -1 +1 @@ -Subproject commit 11a44d515d5a05c6df975f12e494085c548fd4f3 +Subproject commit 6767bc7b6d45979660a653e7b837501e00d05cde diff --git a/src/sonic-host-services-data/debian/rules b/src/sonic-host-services-data/debian/rules index 22c7450193e8..47d26ccbc12f 100755 --- a/src/sonic-host-services-data/debian/rules +++ b/src/sonic-host-services-data/debian/rules @@ -15,6 +15,7 @@ build: override_dh_installsystemd: dh_installsystemd --no-start --name=caclmgrd dh_installsystemd --no-start --name=hostcfgd + dh_installsystemd --no-start --name=featured dh_installsystemd --no-start --name=aaastatsd dh_installsystemd --no-start --name=procdockerstatsd dh_installsystemd --no-start --name=determine-reboot-cause diff --git a/src/sonic-host-services-data/debian/sonic-host-services-data.featured.service b/src/sonic-host-services-data/debian/sonic-host-services-data.featured.service new file mode 100644 index 000000000000..0913e9458cc2 --- /dev/null +++ b/src/sonic-host-services-data/debian/sonic-host-services-data.featured.service @@ -0,0 +1,10 @@ +[Unit] +Description=Feature configuration daemon +Requires=updategraph.service +After=updategraph.service +BindsTo=sonic.target +After=sonic.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/featured diff --git a/src/sonic-host-services-data/debian/sonic-host-services-data.featured.timer b/src/sonic-host-services-data/debian/sonic-host-services-data.featured.timer new file mode 100644 index 000000000000..12fbbe10f257 --- /dev/null +++ b/src/sonic-host-services-data/debian/sonic-host-services-data.featured.timer @@ -0,0 +1,12 @@ +[Unit] +Description=Delays feature daemon until SONiC has started +PartOf=featured.service + +[Timer] +OnUnitActiveSec=0 sec +OnBootSec=1min 30 sec +Unit=featured.service + +[Install] +WantedBy=timers.target sonic.target + From 97a091abd2db8e531574f31274648aa0709ce5d7 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sat, 5 Aug 2023 04:24:38 +0800 Subject: [PATCH 098/145] [Mellanox] Use Debian reboot in Nvidia platform reboot when it is invoked from kdump capture boot (#15701) #### Why I did it When a kernel crash occurs, the system will reboot to the kdump capture kernel if kdump is enabled (`config kdump enable`). In the kdump capture boot, it only stores the crash information, and then reboot the system to a normal boot. In this boot, no SONiC service is started but it invokes `reboot` which is actually the SONiC reboot that depends on SONiC services. There is a logic to skip all SONiC stuff and invoke platform reboot in SONiC reboot to avoid issues. However, on Nvidia platforms, the platform reboot still depends on SONiC services, which can cause issues. So, the Debian reboot is called directly in platform reboot if it is invoked from the kdump capture boot. #### How I did it Manual test --- .../x86_64-mlnx_msn2700-r0/platform_reboot | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot index b2188fde6f5d..9b68790498a1 100755 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot @@ -21,13 +21,24 @@ function ParseArguments() { } function SafePwrCycle() { - sync ; sync - umount -fa > /dev/null 2&>1 + sync; sync + umount -fa > /dev/null 2>&1 echo 1 > $SYSFS_PWR_CYCLE } ParseArguments "$@" +# Reboot immediately if the kdump capture kernel is running +VMCORE_FILE=/proc/vmcore +if [ -s $VMCORE_FILE ]; then + sync; sync + umount -fa > /dev/null 2>&1 + + # Run Debian reboot because the platform reboot isn't available + /sbin/reboot +fi + + ${FW_UPGRADE_SCRIPT} --upgrade --verbose EXIT_CODE="$?" if [[ "${EXIT_CODE}" != "${EXIT_SUCCESS}" ]]; then From f41aad922620b4a5fc81b8d2e8903a77084a4fcc Mon Sep 17 00:00:00 2001 From: vdahiya12 <67608553+vdahiya12@users.noreply.github.com> Date: Fri, 4 Aug 2023 14:53:49 -0700 Subject: [PATCH 099/145] [minigraph] remove number of lanes check for changing speed from 400G to 100G and set speed setting before lane reconfiguration (#15721) 8111 800G interface, split to 2x400G (each has 4 lanes) fails to change interface speed from 400G to 100G during deploy mg. In minigraph.xml, the interface speed configuration is good, but fails to generate the right value to config_db.json. In order to support this SKU the speed transitioning should support both 4 lanes and 8 lanes in the port_config.ini. Why I did it before this change for a 400G to 100G transition, in all cases except when lanes are 8, we would continue and the line ports.setdefault(port_name, {})['speed'] = port_speed_png[port_name] would not be executed, hence the default speed will never be set for a case and config_db will not be updated, where speed is transitioning from 400G to 100G or 40G, but lanes are not equal to 8. In order for those cases to pass where lanes are not specifically 8, we need the change Work item tracking 24242657 Signed-off-by: vaibhav-dahiya --- src/sonic-config-engine/minigraph.py | 4 +- .../tests/sample-cisco-8111-100-minigraph.xml | 2389 +++++++++++++++++ .../tests/sample-cisco-8111-port-config.ini | 57 + src/sonic-config-engine/tests/test_cfggen.py | 16 + 4 files changed, 2465 insertions(+), 1 deletion(-) create mode 100755 src/sonic-config-engine/tests/sample-cisco-8111-100-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample-cisco-8111-port-config.ini diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 8f9ec5bbef82..276e9e2d177c 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1778,6 +1778,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw port_default_speed = port_speeds_default.get(port_name, None) port_png_speed = port_speed_png[port_name] + # set Port Speed before lane update + ports.setdefault(port_name, {})['speed'] = port_png_speed + # when the port speed is changes from 400g to 100g/40g # update the port lanes, use the first 4 lanes of the 400G port to support 100G/40G port if port_default_speed == '400000' and (port_png_speed == '100000' or port_png_speed == '40000'): @@ -1788,7 +1791,6 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw updated_lanes = ",".join(port_lanes[:4]) ports[port_name]['lanes'] = updated_lanes - ports.setdefault(port_name, {})['speed'] = port_speed_png[port_name] for port_name, port in list(ports.items()): # get port alias from port_config.ini diff --git a/src/sonic-config-engine/tests/sample-cisco-8111-100-minigraph.xml b/src/sonic-config-engine/tests/sample-cisco-8111-100-minigraph.xml new file mode 100755 index 000000000000..bf51944cc6c6 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-cisco-8111-100-minigraph.xml @@ -0,0 +1,2389 @@ + + + + + + false + Device-8111-01 + 10.0.0.32 + ARISTA01T0 + 10.0.0.33 + 1 + 10 + 3 + + + Device-8111-01 + FC00::41 + ARISTA01T0 + FC00::42 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 10 + 3 + + + Device-8111-01 + FC00::1 + ARISTA01T2 + FC00::2 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.34 + ARISTA02T0 + 10.0.0.35 + 1 + 10 + 3 + + + Device-8111-01 + FC00::45 + ARISTA02T0 + FC00::46 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.36 + ARISTA03T0 + 10.0.0.37 + 1 + 10 + 3 + + + Device-8111-01 + FC00::49 + ARISTA03T0 + FC00::4A + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 10 + 3 + + + Device-8111-01 + FC00::5 + ARISTA03T2 + FC00::6 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.38 + ARISTA04T0 + 10.0.0.39 + 1 + 10 + 3 + + + Device-8111-01 + FC00::4D + ARISTA04T0 + FC00::4E + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.40 + ARISTA05T0 + 10.0.0.41 + 1 + 10 + 3 + + + Device-8111-01 + FC00::51 + ARISTA05T0 + FC00::52 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 10 + 3 + + + Device-8111-01 + FC00::9 + ARISTA05T2 + FC00::A + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.42 + ARISTA06T0 + 10.0.0.43 + 1 + 10 + 3 + + + Device-8111-01 + FC00::55 + ARISTA06T0 + FC00::56 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.44 + ARISTA07T0 + 10.0.0.45 + 1 + 10 + 3 + + + Device-8111-01 + FC00::59 + ARISTA07T0 + FC00::5A + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 10 + 3 + + + Device-8111-01 + FC00::D + ARISTA07T2 + FC00::E + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.46 + ARISTA08T0 + 10.0.0.47 + 1 + 10 + 3 + + + Device-8111-01 + FC00::5D + ARISTA08T0 + FC00::5E + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.48 + ARISTA09T0 + 10.0.0.49 + 1 + 10 + 3 + + + Device-8111-01 + FC00::61 + ARISTA09T0 + FC00::62 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.50 + ARISTA10T0 + 10.0.0.51 + 1 + 10 + 3 + + + Device-8111-01 + FC00::65 + ARISTA10T0 + FC00::66 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.52 + ARISTA11T0 + 10.0.0.53 + 1 + 10 + 3 + + + Device-8111-01 + FC00::69 + ARISTA11T0 + FC00::6A + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.54 + ARISTA12T0 + 10.0.0.55 + 1 + 10 + 3 + + + Device-8111-01 + FC00::6D + ARISTA12T0 + FC00::6E + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.56 + ARISTA13T0 + 10.0.0.57 + 1 + 10 + 3 + + + Device-8111-01 + FC00::71 + ARISTA13T0 + FC00::72 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.58 + ARISTA14T0 + 10.0.0.59 + 1 + 10 + 3 + + + Device-8111-01 + FC00::75 + ARISTA14T0 + FC00::76 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.60 + ARISTA15T0 + 10.0.0.61 + 1 + 10 + 3 + + + Device-8111-01 + FC00::79 + ARISTA15T0 + FC00::7A + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.62 + ARISTA16T0 + 10.0.0.63 + 1 + 10 + 3 + + + Device-8111-01 + FC00::7D + ARISTA16T0 + FC00::7E + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.64 + ARISTA17T0 + 10.0.0.65 + 1 + 10 + 3 + + + Device-8111-01 + FC00::81 + ARISTA17T0 + FC00::82 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.66 + ARISTA18T0 + 10.0.0.67 + 1 + 10 + 3 + + + Device-8111-01 + FC00::85 + ARISTA18T0 + FC00::86 + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.68 + ARISTA19T0 + 10.0.0.69 + 1 + 10 + 3 + + + Device-8111-01 + FC00::89 + ARISTA19T0 + FC00::8A + 1 + 10 + 3 + + + false + Device-8111-01 + 10.0.0.70 + ARISTA20T0 + 10.0.0.71 + 1 + 10 + 3 + + + Device-8111-01 + FC00::8D + ARISTA20T0 + FC00::8E + 1 + 10 + 3 + + + + + 65100 + Device-8111-01 + + +

10.0.0.33
+ + + + + +
10.0.0.1
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.37
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
10.0.0.65
+ + + +
+ +
10.0.0.67
+ + + +
+ +
10.0.0.69
+ + + +
+ +
10.0.0.71
+ + + +
+ + + + + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 64009 + ARISTA09T0 + + + + 64010 + ARISTA10T0 + + + + 64011 + ARISTA11T0 + + + + 64012 + ARISTA12T0 + + + + 64013 + ARISTA13T0 + + + + 64014 + ARISTA14T0 + + + + 64015 + ARISTA15T0 + + + + 64016 + ARISTA16T0 + + + + 64017 + ARISTA17T0 + + + + 64018 + ARISTA18T0 + + + + 64019 + ARISTA19T0 + + + + 64020 + ARISTA20T0 + + + + + + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 1.1.1.1/23 + + 1.1.1.1/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + Device-8111-01 + + + PortChannel101 + etp0a + + + + PortChannel102 + etp12;etp13 + + + + PortChannel103 + etp0b + + + + PortChannel104 + etp2a + + + + PortChannel105 + etp14;etp15 + + + + PortChannel106 + etp2b + + + + PortChannel107 + etp8a + + + + PortChannel108 + etp16;etp17 + + + + PortChannel109 + etp8b + + + + PortChannel1010 + etp10a + + + + PortChannel1011 + etp18;etp19 + + + + PortChannel1012 + etp10b + + + + PortChannel1013 + etp21a + + + + PortChannel1014 + etp22b + + + + PortChannel1015 + etp25a + + + + PortChannel1016 + etp25b + + + + PortChannel1017 + etp26b + + + + PortChannel1018 + etp27a + + + + PortChannel1019 + etp27b + + + + PortChannel1020 + etp29a + + + + PortChannel1021 + etp30a + + + + PortChannel1022 + etp30b + + + + PortChannel1023 + etp31a + + + + PortChannel1024 + etp31b + + + + + + + + + PortChannel101 + 10.0.0.32/31 + + + + PortChannel101 + FC00::41/126 + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + PortChannel103 + 10.0.0.34/31 + + + + PortChannel103 + FC00::45/126 + + + + PortChannel104 + 10.0.0.36/31 + + + + PortChannel104 + FC00::49/126 + + + + PortChannel105 + 10.0.0.4/31 + + + + PortChannel105 + FC00::5/126 + + + + PortChannel106 + 10.0.0.38/31 + + + + PortChannel106 + FC00::4D/126 + + + + PortChannel107 + 10.0.0.40/31 + + + + PortChannel107 + FC00::51/126 + + + + PortChannel108 + 10.0.0.8/31 + + + + PortChannel108 + FC00::9/126 + + + + PortChannel109 + 10.0.0.42/31 + + + + PortChannel109 + FC00::55/126 + + + + PortChannel1010 + 10.0.0.44/31 + + + + PortChannel1010 + FC00::59/126 + + + + PortChannel1011 + 10.0.0.12/31 + + + + PortChannel1011 + FC00::D/126 + + + + PortChannel1012 + 10.0.0.46/31 + + + + PortChannel1012 + FC00::5D/126 + + + + PortChannel1013 + 10.0.0.48/31 + + + + PortChannel1013 + FC00::61/126 + + + + PortChannel1014 + 10.0.0.50/31 + + + + PortChannel1014 + FC00::65/126 + + + + PortChannel1015 + 10.0.0.52/31 + + + + PortChannel1015 + FC00::69/126 + + + + PortChannel1016 + 10.0.0.54/31 + + + + PortChannel1016 + FC00::6D/126 + + + + PortChannel1017 + 10.0.0.56/31 + + + + PortChannel1017 + FC00::71/126 + + + + PortChannel1018 + 10.0.0.58/31 + + + + PortChannel1018 + FC00::75/126 + + + + PortChannel1019 + 10.0.0.60/31 + + + + PortChannel1019 + FC00::79/126 + + + + PortChannel1020 + 10.0.0.62/31 + + + + PortChannel1020 + FC00::7D/126 + + + + PortChannel1021 + 10.0.0.64/31 + + + + PortChannel1021 + FC00::81/126 + + + + PortChannel1022 + 10.0.0.66/31 + + + + PortChannel1022 + FC00::85/126 + + + + PortChannel1023 + 10.0.0.68/31 + + + + PortChannel1023 + FC00::89/126 + + + + PortChannel1024 + 10.0.0.70/31 + + + + PortChannel1024 + FC00::8D/126 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + VTY_LINE + ssh-only + SSH + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + PortChannel101;PortChannel102;PortChannel103;PortChannel104;PortChannel105;PortChannel106;PortChannel107;PortChannel108;PortChannel109;PortChannel1010;PortChannel1011;PortChannel1012;PortChannel1013;PortChannel1014;PortChannel1015;PortChannel1016;PortChannel1017;PortChannel1018;PortChannel1019;PortChannel1020;PortChannel1021;PortChannel1022;PortChannel1023;PortChannel1024 + DataAcl + DataPlane + + + + + + + + + + DeviceInterfaceLink + ARISTA01T0 + Ethernet1 + Device-8111-01 + etp0a + 100000 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet1 + Device-8111-01 + etp12 + 100000 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet2 + Device-8111-01 + etp13 + 100000 + + + DeviceInterfaceLink + ARISTA02T0 + Ethernet1 + Device-8111-01 + etp0b + 100000 + + + DeviceInterfaceLink + ARISTA03T0 + Ethernet1 + Device-8111-01 + etp2a + 100000 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet1 + Device-8111-01 + etp14 + 100000 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet2 + Device-8111-01 + etp15 + 100000 + + + DeviceInterfaceLink + ARISTA04T0 + Ethernet1 + Device-8111-01 + etp2b + 100000 + + + DeviceInterfaceLink + ARISTA05T0 + Ethernet1 + Device-8111-01 + etp8a + 100000 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet1 + Device-8111-01 + etp16 + 100000 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet2 + Device-8111-01 + etp17 + 100000 + + + DeviceInterfaceLink + ARISTA06T0 + Ethernet1 + Device-8111-01 + etp8b + 100000 + + + DeviceInterfaceLink + ARISTA07T0 + Ethernet1 + Device-8111-01 + etp10a + 100000 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet1 + Device-8111-01 + etp18 + 100000 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet2 + Device-8111-01 + etp19 + 100000 + + + DeviceInterfaceLink + ARISTA08T0 + Ethernet1 + Device-8111-01 + etp10b + 100000 + + + DeviceInterfaceLink + ARISTA09T0 + Ethernet1 + Device-8111-01 + etp21a + 100000 + + + DeviceInterfaceLink + ARISTA10T0 + Ethernet1 + Device-8111-01 + etp22b + 100000 + + + DeviceInterfaceLink + ARISTA11T0 + Ethernet1 + Device-8111-01 + etp25a + 100000 + + + DeviceInterfaceLink + ARISTA12T0 + Ethernet1 + Device-8111-01 + etp25b + 100000 + + + DeviceInterfaceLink + ARISTA13T0 + Ethernet1 + Device-8111-01 + etp26b + 100000 + + + DeviceInterfaceLink + ARISTA14T0 + Ethernet1 + Device-8111-01 + etp27a + 100000 + + + DeviceInterfaceLink + ARISTA15T0 + Ethernet1 + Device-8111-01 + etp27b + 100000 + + + DeviceInterfaceLink + ARISTA16T0 + Ethernet1 + Device-8111-01 + etp29a + 100000 + + + DeviceInterfaceLink + ARISTA17T0 + Ethernet1 + Device-8111-01 + etp30a + 100000 + + + DeviceInterfaceLink + ARISTA18T0 + Ethernet1 + Device-8111-01 + etp30b + 100000 + + + DeviceInterfaceLink + ARISTA19T0 + Ethernet1 + Device-8111-01 + etp31a + 100000 + + + DeviceInterfaceLink + ARISTA20T0 + Ethernet1 + Device-8111-01 + etp31b + 100000 + + + + + Device-8111-01 + Cisco-8111-O64 + + 1.1.1.1 + + + + ARISTA16T0 + + 172.16.134.203 + + Arista-VM + + + ARISTA11T0 + + 172.16.134.198 + + Arista-VM + + + ARISTA10T0 + + 172.16.134.197 + + Arista-VM + + + ARISTA17T0 + + 172.16.134.204 + + Arista-VM + + + ARISTA09T0 + + 172.16.134.196 + + Arista-VM + + + ARISTA20T0 + + 172.16.134.207 + + Arista-VM + + + ARISTA08T0 + + 172.16.134.191 + + Arista-VM + + + ARISTA07T0 + + 172.16.134.190 + + Arista-VM + + + ARISTA07T2 + + 172.16.134.195 + + Arista-VM + + + ARISTA01T2 + + 172.16.134.192 + + Arista-VM + + + ARISTA01T0 + + 172.16.134.184 + + Arista-VM + + + ARISTA05T2 + + 172.16.134.194 + + Arista-VM + + + ARISTA05T0 + + 172.16.134.188 + + Arista-VM + + + ARISTA02T0 + + 172.16.134.185 + + Arista-VM + + + ARISTA03T0 + + 172.16.134.186 + + Arista-VM + + + ARISTA03T2 + + 172.16.134.193 + + Arista-VM + + + ARISTA04T0 + + 172.16.134.187 + + Arista-VM + + + ARISTA18T0 + + 172.16.134.205 + + Arista-VM + + + ARISTA15T0 + + 172.16.134.202 + + Arista-VM + + + ARISTA19T0 + + 172.16.134.206 + + Arista-VM + + + ARISTA14T0 + + 172.16.134.201 + + Arista-VM + + + ARISTA12T0 + + 172.16.134.199 + + Arista-VM + + + ARISTA13T0 + + 172.16.134.200 + + Arista-VM + + + ARISTA06T0 + + 172.16.134.189 + + Arista-VM + + + + + + true + + + DeviceInterface + + true + true + 1 + etp0a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp0b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp1a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp1b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp2a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp2b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp3a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp3b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp4a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp4b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp5a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp5b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp6a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp6b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp7a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp7b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp8a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp8b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp9a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp9b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp10a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp10b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp11a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp11b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp12 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp13 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp14 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp15 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp16 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp17 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp18 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp19 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp20a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp20b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp21a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp21b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp22a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp22b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp23a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp23b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp24a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp24b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp25a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp25b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp26a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp26b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp27a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp27b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp28a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp28b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp29a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp29b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp30a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp30b + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp31a + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp31b + + false + 0 + 0 + 100000 + + + true + 0 + Cisco-8111-O64 + + + + + + + Device-8111-01 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 10.3.145.14;10.3.145.15 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.64.246.0/23;10.3.146.0/23;10.64.5.5;10.201.148.32/28 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + Device-8111-01 + Cisco-8111-O64 + diff --git a/src/sonic-config-engine/tests/sample-cisco-8111-port-config.ini b/src/sonic-config-engine/tests/sample-cisco-8111-port-config.ini new file mode 100644 index 000000000000..02def0a7809c --- /dev/null +++ b/src/sonic-config-engine/tests/sample-cisco-8111-port-config.ini @@ -0,0 +1,57 @@ +# name lanes alias index speed +Ethernet0 2304,2305,2306,2307 etp0a 0 100000 +Ethernet4 2308,2309,2310,2311 etp0b 0 100000 +Ethernet8 2320,2321,2322,2323 etp1a 1 100000 +Ethernet12 2324,2325,2326,2327 etp1b 1 100000 +Ethernet16 2312,2313,2314,2315 etp2a 2 100000 +Ethernet20 2316,2317,2318,2319 etp2b 2 100000 +Ethernet24 2056,2057,2058,2059 etp3a 3 100000 +Ethernet28 2060,2061,2062,2063 etp3b 3 100000 +Ethernet32 1792,1793,1794,1795 etp4a 4 100000 +Ethernet36 1796,1797,1798,1799 etp4b 4 100000 +Ethernet40 2048,2049,2050,2051 etp5a 5 100000 +Ethernet44 2052,2053,2054,2055 etp5b 5 100000 +Ethernet48 2560,2561,2562,2563 etp6a 6 100000 +Ethernet52 2564,2565,2566,2567 etp6b 6 100000 +Ethernet56 2824,2825,2826,2827 etp7a 7 100000 +Ethernet60 2828,2829,2830,2831 etp7b 7 100000 +Ethernet64 2832,2833,2834,2835 etp8a 8 100000 +Ethernet68 2836,2837,2838,2839 etp8b 8 100000 +Ethernet72 2816,2817,2818,2819 etp9a 9 100000 +Ethernet76 2820,2821,2822,2823 etp9b 9 100000 +Ethernet80 2568,2569,2570,2571 etp10a 10 100000 +Ethernet84 2572,2573,2574,2575 etp10b 10 100000 +Ethernet88 2576,2577,2578,2579 etp11a 11 100000 +Ethernet92 2580,2581,2582,2583 etp11b 11 100000 +Ethernet96 1536,1537,1538,1539 etp12 12 400000 +Ethernet104 1800,1801,1802,1803 etp13 13 400000 +Ethernet112 1552,1553,1554,1555 etp14 14 400000 +Ethernet120 1544,1545,1546,1547 etp15 15 400000 +Ethernet128 1296,1297,1298,1299 etp16 16 400000 +Ethernet136 1288,1289,1290,1291 etp17 17 400000 +Ethernet144 1280,1281,1282,1283 etp18 18 400000 +Ethernet152 1032,1033,1034,1035 etp19 19 400000 +Ethernet160 264,265,266,267 etp20a 20 100000 +Ethernet164 268,269,270,271 etp20b 20 100000 +Ethernet168 272,273,274,275 etp21a 21 100000 +Ethernet172 276,277,278,279 etp21b 21 100000 +Ethernet176 16,17,18,19 etp22a 22 100000 +Ethernet180 20,21,22,23 etp22b 22 100000 +Ethernet184 0,1,2,3 etp23a 23 100000 +Ethernet188 4,5,6,7 etp23b 23 100000 +Ethernet192 256,257,258,259 etp24a 24 100000 +Ethernet196 260,261,262,263 etp24b 24 100000 +Ethernet200 8,9,10,11 etp25a 25 100000 +Ethernet204 12,13,14,15 etp25b 25 100000 +Ethernet208 1024,1025,1026,1027 etp26a 26 100000 +Ethernet212 1028,1029,1030,1031 etp26b 26 100000 +Ethernet216 768,769,770,771 etp27a 27 100000 +Ethernet220 772,773,774,775 etp27b 27 100000 +Ethernet224 524,525,526,527 etp28a 28 100000 +Ethernet228 520,521,522,523 etp28b 28 100000 +Ethernet232 776,777,778,779 etp29a 29 100000 +Ethernet236 780,781,782,783 etp29b 29 100000 +Ethernet240 516,517,518,519 etp30a 30 100000 +Ethernet244 512,513,514,515 etp30b 30 100000 +Ethernet248 528,529,530,531 etp31a 31 100000 +Ethernet252 532,533,534,535 etp31b 31 100000 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index ef44979558b9..77c95c496795 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -44,6 +44,8 @@ def setUp(self): self.sample_cisco_port_config_400g = os.path.join(self.test_dir, 'sample-cisco-8101-t1-port-config.ini') self.sample_cisco_100_graph = os.path.join(self.test_dir, 'sample-cisco-8101-t1-100-minigraph.xml') self.sample_cisco_400_graph = os.path.join(self.test_dir, 'sample-cisco-8101-t1-400-minigraph.xml') + self.sample_cisco_8111_port_config = os.path.join(self.test_dir, 'sample-cisco-8111-port-config.ini') + self.sample_cisco_8111_graph = os.path.join(self.test_dir, 'sample-cisco-8111-100-minigraph.xml') # To ensure that mock config_db data is used for unit-test cases os.environ["CFGGEN_UNIT_TESTING"] = "2" @@ -1130,3 +1132,17 @@ def test_minigraph_cisco_400G_to_400G_speed(self): "{'Ethernet0': {'lanes': '2304,2305,2306,2307', 'alias': 'etp0a', 'index': '0', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA01T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet4': {'lanes': '2308,2309,2310,2311', 'alias': 'etp0b', 'index': '0', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA02T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet8': {'lanes': '2320,2321,2322,2323', 'alias': 'etp1a', 'index': '1', 'speed': '100000', 'fec': 'rs', 'description': 'etp1a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet12': {'lanes': '2324,2325,2326,2327', 'alias': 'etp1b', 'index': '1', 'speed': '100000', 'fec': 'rs', 'description': 'etp1b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet16': {'lanes': '2312,2313,2314,2315', 'alias': 'etp2a', 'index': '2', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA03T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet20': {'lanes': '2316,2317,2318,2319', 'alias': 'etp2b', 'index': '2', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA04T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet24': {'lanes': '2056,2057,2058,2059', 'alias': 'etp3a', 'index': '3', 'speed': '100000', 'fec': 'rs', 'description': 'etp3a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet28': {'lanes': '2060,2061,2062,2063', 'alias': 'etp3b', 'index': '3', 'speed': '100000', 'fec': 'rs', 'description': 'etp3b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet32': {'lanes': '1792,1793,1794,1795', 'alias': 'etp4a', 'index': '4', 'speed': '100000', 'fec': 'rs', 'description': 'etp4a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet36': {'lanes': '1796,1797,1798,1799', 'alias': 'etp4b', 'index': '4', 'speed': '100000', 'fec': 'rs', 'description': 'etp4b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet40': {'lanes': '2048,2049,2050,2051', 'alias': 'etp5a', 'index': '5', 'speed': '100000', 'fec': 'rs', 'description': 'etp5a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet44': {'lanes': '2052,2053,2054,2055', 'alias': 'etp5b', 'index': '5', 'speed': '100000', 'fec': 'rs', 'description': 'etp5b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet48': {'lanes': '2560,2561,2562,2563', 'alias': 'etp6a', 'index': '6', 'speed': '100000', 'fec': 'rs', 'description': 'etp6a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet52': {'lanes': '2564,2565,2566,2567', 'alias': 'etp6b', 'index': '6', 'speed': '100000', 'fec': 'rs', 'description': 'etp6b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet56': {'lanes': '2824,2825,2826,2827', 'alias': 'etp7a', 'index': '7', 'speed': '100000', 'fec': 'rs', 'description': 'etp7a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet60': {'lanes': '2828,2829,2830,2831', 'alias': 'etp7b', 'index': '7', 'speed': '100000', 'fec': 'rs', 'description': 'etp7b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet64': {'lanes': '2832,2833,2834,2835', 'alias': 'etp8a', 'index': '8', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA05T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet68': {'lanes': '2836,2837,2838,2839', 'alias': 'etp8b', 'index': '8', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA06T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet72': {'lanes': '2816,2817,2818,2819', 'alias': 'etp9a', 'index': '9', 'speed': '100000', 'fec': 'rs', 'description': 'etp9a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet76': {'lanes': '2820,2821,2822,2823', 'alias': 'etp9b', 'index': '9', 'speed': '100000', 'fec': 'rs', 'description': 'etp9b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet80': {'lanes': '2568,2569,2570,2571', 'alias': 'etp10a', 'index': '10', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA07T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet84': {'lanes': '2572,2573,2574,2575', 'alias': 'etp10b', 'index': '10', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA08T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet88': {'lanes': '2576,2577,2578,2579', 'alias': 'etp11a', 'index': '11', 'speed': '100000', 'fec': 'rs', 'description': 'etp11a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet92': {'lanes': '2580,2581,2582,2583', 'alias': 'etp11b', 'index': '11', 'speed': '100000', 'fec': 'rs', 'description': 'etp11b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet96': {'lanes': '1536,1537,1538,1539,1540,1541,1542,1543', 'alias': 'etp12', 'index': '12', 'speed': '400000', 'description': 'ARISTA01T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet104': {'lanes': '1800,1801,1802,1803,1804,1805,1806,1807', 'alias': 'etp13', 'index': '13', 'speed': '400000', 'description': 'ARISTA01T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet112': {'lanes': '1552,1553,1554,1555,1556,1557,1558,1559', 'alias': 'etp14', 'index': '14', 'speed': '400000', 'description': 'ARISTA03T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet120': {'lanes': '1544,1545,1546,1547,1548,1549,1550,1551', 'alias': 'etp15', 'index': '15', 'speed': '400000', 'description': 'ARISTA03T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet128': {'lanes': '1296,1297,1298,1299,1300,1301,1302,1303', 'alias': 'etp16', 'index': '16', 'speed': '400000', 'description': 'ARISTA05T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet136': {'lanes': '1288,1289,1290,1291,1292,1293,1294,1295', 'alias': 'etp17', 'index': '17', 'speed': '400000', 'description': 'ARISTA05T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet144': {'lanes': '1280,1281,1282,1283,1284,1285,1286,1287', 'alias': 'etp18', 'index': '18', 'speed': '400000', 'description': 'ARISTA07T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet152': {'lanes': '1032,1033,1034,1035,1036,1037,1038,1039', 'alias': 'etp19', 'index': '19', 'speed': '400000', 'description': 'ARISTA07T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet160': {'lanes': '264,265,266,267', 'alias': 'etp20a', 'index': '20', 'speed': '100000', 'fec': 'rs', 'description': 'etp20a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet164': {'lanes': '268,269,270,271', 'alias': 'etp20b', 'index': '20', 'speed': '100000', 'fec': 'rs', 'description': 'etp20b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet168': {'lanes': '272,273,274,275', 'alias': 'etp21a', 'index': '21', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA09T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet172': {'lanes': '276,277,278,279', 'alias': 'etp21b', 'index': '21', 'speed': '100000', 'fec': 'rs', 'description': 'etp21b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet176': {'lanes': '16,17,18,19', 'alias': 'etp22a', 'index': '22', 'speed': '100000', 'fec': 'rs', 'description': 'etp22a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet180': {'lanes': '20,21,22,23', 'alias': 'etp22b', 'index': '22', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA10T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet184': {'lanes': '0,1,2,3', 'alias': 'etp23a', 'index': '23', 'speed': '100000', 'fec': 'rs', 'description': 'etp23a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet188': {'lanes': '4,5,6,7', 'alias': 'etp23b', 'index': '23', 'speed': '100000', 'fec': 'rs', 'description': 'etp23b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet192': {'lanes': '256,257,258,259', 'alias': 'etp24a', 'index': '24', 'speed': '100000', 'fec': 'rs', 'description': 'etp24a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet196': {'lanes': '260,261,262,263', 'alias': 'etp24b', 'index': '24', 'speed': '100000', 'fec': 'rs', 'description': 'etp24b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet200': {'lanes': '8,9,10,11', 'alias': 'etp25a', 'index': '25', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA11T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet204': {'lanes': '12,13,14,15', 'alias': 'etp25b', 'index': '25', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA12T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet208': {'lanes': '1024,1025,1026,1027', 'alias': 'etp26a', 'index': '26', 'speed': '100000', 'fec': 'rs', 'description': 'etp26a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet212': {'lanes': '1028,1029,1030,1031', 'alias': 'etp26b', 'index': '26', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA13T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet216': {'lanes': '768,769,770,771', 'alias': 'etp27a', 'index': '27', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA14T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet220': {'lanes': '772,773,774,775', 'alias': 'etp27b', 'index': '27', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA15T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet224': {'lanes': '524,525,526,527', 'alias': 'etp28a', 'index': '28', 'speed': '100000', 'fec': 'rs', 'description': 'etp28a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet228': {'lanes': '520,521,522,523', 'alias': 'etp28b', 'index': '28', 'speed': '100000', 'fec': 'rs', 'description': 'etp28b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet232': {'lanes': '776,777,778,779', 'alias': 'etp29a', 'index': '29', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA16T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet236': {'lanes': '780,781,782,783', 'alias': 'etp29b', 'index': '29', 'speed': '100000', 'fec': 'rs', 'description': 'etp29b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet240': {'lanes': '516,517,518,519', 'alias': 'etp30a', 'index': '30', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA17T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet244': {'lanes': '512,513,514,515', 'alias': 'etp30b', 'index': '30', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA18T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet248': {'lanes': '528,529,530,531', 'alias': 'etp31a', 'index': '31', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA19T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet252': {'lanes': '532,533,534,535', 'alias': 'etp31b', 'index': '31', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA20T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}}" ) ) + + + def test_minigraph_cisco_400g_to_100G_speed_no_lane_change(self): + argument = ["-m", self.sample_cisco_8111_graph, "-p", self.sample_cisco_8111_port_config, "-v", "PORT"] + self.assertTrue(self.yang.validate(argument)) + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + utils.to_dict( + "{'Ethernet0': {'lanes': '2304,2305,2306,2307', 'alias': 'etp0a', 'index': '0', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA01T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet4': {'lanes': '2308,2309,2310,2311', 'alias': 'etp0b', 'index': '0', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA02T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet8': {'lanes': '2320,2321,2322,2323', 'alias': 'etp1a', 'index': '1', 'speed': '100000', 'fec': 'rs', 'description': 'etp1a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet12': {'lanes': '2324,2325,2326,2327', 'alias': 'etp1b', 'index': '1', 'speed': '100000', 'fec': 'rs', 'description': 'etp1b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet16': {'lanes': '2312,2313,2314,2315', 'alias': 'etp2a', 'index': '2', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA03T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet20': {'lanes': '2316,2317,2318,2319', 'alias': 'etp2b', 'index': '2', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA04T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet24': {'lanes': '2056,2057,2058,2059', 'alias': 'etp3a', 'index': '3', 'speed': '100000', 'fec': 'rs', 'description': 'etp3a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet28': {'lanes': '2060,2061,2062,2063', 'alias': 'etp3b', 'index': '3', 'speed': '100000', 'fec': 'rs', 'description': 'etp3b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet32': {'lanes': '1792,1793,1794,1795', 'alias': 'etp4a', 'index': '4', 'speed': '100000', 'fec': 'rs', 'description': 'etp4a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet36': {'lanes': '1796,1797,1798,1799', 'alias': 'etp4b', 'index': '4', 'speed': '100000', 'fec': 'rs', 'description': 'etp4b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet40': {'lanes': '2048,2049,2050,2051', 'alias': 'etp5a', 'index': '5', 'speed': '100000', 'fec': 'rs', 'description': 'etp5a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet44': {'lanes': '2052,2053,2054,2055', 'alias': 'etp5b', 'index': '5', 'speed': '100000', 'fec': 'rs', 'description': 'etp5b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet48': {'lanes': '2560,2561,2562,2563', 'alias': 'etp6a', 'index': '6', 'speed': '100000', 'fec': 'rs', 'description': 'etp6a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet52': {'lanes': '2564,2565,2566,2567', 'alias': 'etp6b', 'index': '6', 'speed': '100000', 'fec': 'rs', 'description': 'etp6b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet56': {'lanes': '2824,2825,2826,2827', 'alias': 'etp7a', 'index': '7', 'speed': '100000', 'fec': 'rs', 'description': 'etp7a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet60': {'lanes': '2828,2829,2830,2831', 'alias': 'etp7b', 'index': '7', 'speed': '100000', 'fec': 'rs', 'description': 'etp7b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet64': {'lanes': '2832,2833,2834,2835', 'alias': 'etp8a', 'index': '8', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA05T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet68': {'lanes': '2836,2837,2838,2839', 'alias': 'etp8b', 'index': '8', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA06T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet72': {'lanes': '2816,2817,2818,2819', 'alias': 'etp9a', 'index': '9', 'speed': '100000', 'fec': 'rs', 'description': 'etp9a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet76': {'lanes': '2820,2821,2822,2823', 'alias': 'etp9b', 'index': '9', 'speed': '100000', 'fec': 'rs', 'description': 'etp9b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet80': {'lanes': '2568,2569,2570,2571', 'alias': 'etp10a', 'index': '10', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA07T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet84': {'lanes': '2572,2573,2574,2575', 'alias': 'etp10b', 'index': '10', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA08T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet88': {'lanes': '2576,2577,2578,2579', 'alias': 'etp11a', 'index': '11', 'speed': '100000', 'fec': 'rs', 'description': 'etp11a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet92': {'lanes': '2580,2581,2582,2583', 'alias': 'etp11b', 'index': '11', 'speed': '100000', 'fec': 'rs', 'description': 'etp11b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet96': {'lanes': '1536,1537,1538,1539', 'alias': 'etp12', 'index': '12', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA01T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet104': {'lanes': '1800,1801,1802,1803', 'alias': 'etp13', 'index': '13', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA01T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet112': {'lanes': '1552,1553,1554,1555', 'alias': 'etp14', 'index': '14', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA03T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet120': {'lanes': '1544,1545,1546,1547', 'alias': 'etp15', 'index': '15', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA03T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet128': {'lanes': '1296,1297,1298,1299', 'alias': 'etp16', 'index': '16', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA05T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet136': {'lanes': '1288,1289,1290,1291', 'alias': 'etp17', 'index': '17', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA05T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet144': {'lanes': '1280,1281,1282,1283', 'alias': 'etp18', 'index': '18', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA07T2:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet152': {'lanes': '1032,1033,1034,1035', 'alias': 'etp19', 'index': '19', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA07T2:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet160': {'lanes': '264,265,266,267', 'alias': 'etp20a', 'index': '20', 'speed': '100000', 'fec': 'rs', 'description': 'etp20a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet164': {'lanes': '268,269,270,271', 'alias': 'etp20b', 'index': '20', 'speed': '100000', 'fec': 'rs', 'description': 'etp20b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet168': {'lanes': '272,273,274,275', 'alias': 'etp21a', 'index': '21', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA09T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet172': {'lanes': '276,277,278,279', 'alias': 'etp21b', 'index': '21', 'speed': '100000', 'fec': 'rs', 'description': 'etp21b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet176': {'lanes': '16,17,18,19', 'alias': 'etp22a', 'index': '22', 'speed': '100000', 'fec': 'rs', 'description': 'etp22a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet180': {'lanes': '20,21,22,23', 'alias': 'etp22b', 'index': '22', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA10T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet184': {'lanes': '0,1,2,3', 'alias': 'etp23a', 'index': '23', 'speed': '100000', 'fec': 'rs', 'description': 'etp23a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet188': {'lanes': '4,5,6,7', 'alias': 'etp23b', 'index': '23', 'speed': '100000', 'fec': 'rs', 'description': 'etp23b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet192': {'lanes': '256,257,258,259', 'alias': 'etp24a', 'index': '24', 'speed': '100000', 'fec': 'rs', 'description': 'etp24a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet196': {'lanes': '260,261,262,263', 'alias': 'etp24b', 'index': '24', 'speed': '100000', 'fec': 'rs', 'description': 'etp24b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet200': {'lanes': '8,9,10,11', 'alias': 'etp25a', 'index': '25', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA11T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet204': {'lanes': '12,13,14,15', 'alias': 'etp25b', 'index': '25', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA12T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet208': {'lanes': '1024,1025,1026,1027', 'alias': 'etp26a', 'index': '26', 'speed': '100000', 'fec': 'rs', 'description': 'etp26a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet212': {'lanes': '1028,1029,1030,1031', 'alias': 'etp26b', 'index': '26', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA13T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet216': {'lanes': '768,769,770,771', 'alias': 'etp27a', 'index': '27', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA14T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet220': {'lanes': '772,773,774,775', 'alias': 'etp27b', 'index': '27', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA15T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet224': {'lanes': '524,525,526,527', 'alias': 'etp28a', 'index': '28', 'speed': '100000', 'fec': 'rs', 'description': 'etp28a', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet228': {'lanes': '520,521,522,523', 'alias': 'etp28b', 'index': '28', 'speed': '100000', 'fec': 'rs', 'description': 'etp28b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet232': {'lanes': '776,777,778,779', 'alias': 'etp29a', 'index': '29', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA16T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet236': {'lanes': '780,781,782,783', 'alias': 'etp29b', 'index': '29', 'speed': '100000', 'fec': 'rs', 'description': 'etp29b', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}, 'Ethernet240': {'lanes': '516,517,518,519', 'alias': 'etp30a', 'index': '30', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA17T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet244': {'lanes': '512,513,514,515', 'alias': 'etp30b', 'index': '30', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA18T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet248': {'lanes': '528,529,530,531', 'alias': 'etp31a', 'index': '31', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA19T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, 'Ethernet252': {'lanes': '532,533,534,535', 'alias': 'etp31b', 'index': '31', 'speed': '100000', 'fec': 'rs', 'description': 'ARISTA20T0:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}}" + ) + ) + + From e127701660f279a34322d9764c6641c024a2e1e9 Mon Sep 17 00:00:00 2001 From: Vaibhav Hemant Dixit Date: Fri, 4 Aug 2023 16:00:26 -0700 Subject: [PATCH 100/145] Fix CONFIG_DB_INITIALIZED flag check logic and set/reset flag for warmboot (#15685) * Fix CONFIG_DB_INITIALIZED flag check logic and set/reset flag for warm-reboot * Fix db-cli usage * Handle same image warm-reboot and generalize handling of INIT flag * Cover boot from ONIE case: set config init flag when minigraph, config_db are missing * Handle case: first boot of SONiC * Check for config init flag * Simplify logic, and do not call db_migrator for same image reboot --- files/build_templates/docker_image_ctl.j2 | 27 +++++++------------ files/image_config/config-setup/config-setup | 4 ++- .../warmboot-finalizer/finalize-warmboot.sh | 2 +- files/scripts/swss.sh | 2 +- files/scripts/syncd_common.sh | 2 +- 5 files changed, 15 insertions(+), 22 deletions(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index a8529f987389..924f0283bad6 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -235,6 +235,7 @@ function postStartAction() ($(docker exec -i database$DEV sonic-db-cli PING | grep -c PONG) -gt 0) ]]; do sleep 1; done + if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast" || "$BOOT_TYPE" == "fast") && -f $WARM_DIR/dump.rdb ]]; then # retain the dump file from last boot for debugging purposes mv $WARM_DIR/dump.rdb $WARM_DIR/dump.rdb.old @@ -248,28 +249,18 @@ function postStartAction() $SONIC_CFGGEN -j /etc/sonic/config_db$DEV.json --write-to-db fi fi - - if [[ "$BOOT_TYPE" == "fast" ]]; then - # set the key to expire in 3 minutes - $SONIC_DB_CLI STATE_DB SET "FAST_REBOOT|system" "1" "EX" "180" - fi - - $SONIC_DB_CLI CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1" fi - if [ -e /tmp/pending_config_migration ]; then + if [ -e /tmp/pending_config_migration ] || [ -e /tmp/pending_config_initialization ]; then # this is first boot to a new image, config-setup execution is pending. - # For fast/cold reboot case, DB contains nothing at this point - # Call db_migrator after config-setup loads the config (from old config or minigraph) - echo "Delaying db_migrator until config migration is over" + # for warmboot case, DB is loaded but migration is still pending + # For firstbboot/fast/cold reboot case, DB contains nothing at this point + # unset CONFIG_DB_INITIALIZED to indicate pending config load and migration + # This flag will be set to "1" after DB migration/initialization is completed as part of config-setup + $SONIC_DB_CLI CONFIG_DB SET "CONFIG_DB_INITIALIZED" "0" else - # this is not a first time boot to a new image. Datbase container starts w/ old pre-existing config - if [[ -x /usr/local/bin/db_migrator.py ]]; then - # Migrate the DB to the latest schema version if needed - if [ -z "$DEV" ]; then - /usr/local/bin/db_migrator.py -o migrate - fi - fi + # set CONFIG_DB_INITIALIZED to indicate end of config load and migration + $SONIC_DB_CLI CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1" fi # Add redis UDS to the redis group and give read/write access to the group REDIS_SOCK="/var/run/redis${DEV}/redis.sock" diff --git a/files/image_config/config-setup/config-setup b/files/image_config/config-setup/config-setup index b23d84cf2607..3369b0ec86e7 100755 --- a/files/image_config/config-setup/config-setup +++ b/files/image_config/config-setup/config-setup @@ -295,6 +295,7 @@ do_config_initialization() fi rm -f /tmp/pending_config_initialization + sonic-db-cli CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1" } # Restore config-setup post migration hooks from a backup copy @@ -344,13 +345,14 @@ check_all_config_db_present() } # DB schema is subject to change between two images -# Perform DB schema migration after loading backup config from previous image +# Perform DB schema migration after loading backup config/minigraph from previous image do_db_migration() { if [[ -x /usr/local/bin/db_migrator.py ]]; then # Migrate the DB to the latest schema version if needed /usr/local/bin/db_migrator.py -o migrate fi + sonic-db-cli CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1" } # Perform configuration migration from backup copy. diff --git a/files/image_config/warmboot-finalizer/finalize-warmboot.sh b/files/image_config/warmboot-finalizer/finalize-warmboot.sh index 783f3881816b..b01832a6c7b8 100755 --- a/files/image_config/warmboot-finalizer/finalize-warmboot.sh +++ b/files/image_config/warmboot-finalizer/finalize-warmboot.sh @@ -74,7 +74,7 @@ function wait_for_database_service() done # Wait for configDB initialization - until [[ $(sonic-db-cli CONFIG_DB GET "CONFIG_DB_INITIALIZED") ]]; + until [[ $(sonic-db-cli CONFIG_DB GET "CONFIG_DB_INITIALIZED") -eq 1 ]]; do sleep 1; done diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 0e37fe1376cd..86c2bae2ddb8 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -87,7 +87,7 @@ function wait_for_database_service() done # Wait for configDB initialization - until [[ $($SONIC_DB_CLI CONFIG_DB GET "CONFIG_DB_INITIALIZED") ]]; + until [[ $($SONIC_DB_CLI CONFIG_DB GET "CONFIG_DB_INITIALIZED") -eq 1 ]]; do sleep 1; done } diff --git a/files/scripts/syncd_common.sh b/files/scripts/syncd_common.sh index a850e31b207d..826cdd731ba6 100755 --- a/files/scripts/syncd_common.sh +++ b/files/scripts/syncd_common.sh @@ -66,7 +66,7 @@ function wait_for_database_service() done # Wait for configDB initialization - until [[ $($SONIC_DB_CLI CONFIG_DB GET "CONFIG_DB_INITIALIZED") ]]; + until [[ $($SONIC_DB_CLI CONFIG_DB GET "CONFIG_DB_INITIALIZED") -eq 1 ]]; do sleep 1; done } From 14c8ce282f3b14afd2378c5974b9739ecf3560e5 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 5 Aug 2023 14:32:40 +0800 Subject: [PATCH 101/145] [submodule] Update submodule sonic-host-services to the latest HEAD automatically (#15992) #### Why I did it src/sonic-host-services ``` * 6767bc7 - (HEAD -> master, origin/master, origin/HEAD) [FeatureD] Move the Feature related config from Hostcfgd into a new daemon (#71) (6 days ago) [Vivek] ``` #### How I did it #### How to verify it #### Description for the changelog From 96fa5136906560d69a1c8e29d61229f00c299613 Mon Sep 17 00:00:00 2001 From: andywongarista <78833093+andywongarista@users.noreply.github.com> Date: Sat, 5 Aug 2023 07:11:45 -0700 Subject: [PATCH 102/145] [Arista] Add support for DCS-7060DX5-32 (#14793) * Add asic support for blackhawkth4dd * Add bfd feature to BlackhawkTh4Dd * Add platform data for blackhawkth4 * Add Qos settings for Blackhawk-TH4 * Add pg and queue settings for Blackhawk-TH4 * Add buffers_defaults_t0.j2 * Add blackhawkth4 to boot0 * Update 7060dx5 config.bcm * Fix build error --------- Co-authored-by: Boyang Yu Co-authored-by: David Meggy --- .../Arista-7060DX5-32/BALANCED | 1 + .../Arista-7060DX5-32/buffers.json.j2 | 2 + .../Arista-7060DX5-32/buffers_defaults_t0.j2 | 1 + .../Arista-7060DX5-32/buffers_defaults_t1.j2 | 1 + .../Arista-7060DX5-32/hwsku.json | 104 ++ .../Arista-7060DX5-32/pg_profile_lookup.ini | 1 + .../Arista-7060DX5-32/port_config.ini | 34 + .../Arista-7060DX5-32/qos.json.j2 | 1 + .../Arista-7060DX5-32/sai.profile | 1 + .../th4-a7060dx5-32.config.bcm | 1643 +++++++++++++++++ .../x86_64-arista_7060dx5_32/default_sku | 1 + .../x86_64-arista_7060dx5_32/platform.json | 933 ++++++++++ .../x86_64-arista_7060dx5_32/platform_asic | 1 + .../platform_components.json | 12 + .../platform_env.conf | 2 + .../x86_64-arista_7060dx5_32/platform_reboot | 1 + .../arista/x86_64-arista_7060dx5_32/plugins | 1 + .../pmon_daemon_control.json | 1 + .../x86_64-arista_7060dx5_32/sensors.conf | 36 + .../system_health_monitoring_config.json | 1 + .../thermal_policy.json | 1 + .../th4/gen/BALANCED/buffers_defaults_t0.j2 | 46 + .../th4/gen/BALANCED/buffers_defaults_t1.j2 | 46 + .../th4/gen/BALANCED/pg_profile_lookup.ini | 17 + files/Aboot/boot0.j2 | 3 + 25 files changed, 2891 insertions(+) create mode 120000 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/BALANCED create mode 100644 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers.json.j2 create mode 120000 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t0.j2 create mode 120000 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t1.j2 create mode 100644 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/hwsku.json create mode 120000 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/pg_profile_lookup.ini create mode 100644 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/port_config.ini create mode 100644 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/qos.json.j2 create mode 100644 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/sai.profile create mode 100644 device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/th4-a7060dx5-32.config.bcm create mode 100644 device/arista/x86_64-arista_7060dx5_32/default_sku create mode 100644 device/arista/x86_64-arista_7060dx5_32/platform.json create mode 100644 device/arista/x86_64-arista_7060dx5_32/platform_asic create mode 100644 device/arista/x86_64-arista_7060dx5_32/platform_components.json create mode 100644 device/arista/x86_64-arista_7060dx5_32/platform_env.conf create mode 120000 device/arista/x86_64-arista_7060dx5_32/platform_reboot create mode 120000 device/arista/x86_64-arista_7060dx5_32/plugins create mode 120000 device/arista/x86_64-arista_7060dx5_32/pmon_daemon_control.json create mode 100644 device/arista/x86_64-arista_7060dx5_32/sensors.conf create mode 120000 device/arista/x86_64-arista_7060dx5_32/system_health_monitoring_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_32/thermal_policy.json create mode 100644 device/common/profiles/th4/gen/BALANCED/buffers_defaults_t0.j2 create mode 100644 device/common/profiles/th4/gen/BALANCED/buffers_defaults_t1.j2 create mode 100644 device/common/profiles/th4/gen/BALANCED/pg_profile_lookup.ini diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/BALANCED b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/BALANCED new file mode 120000 index 000000000000..2c9506a909fb --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th4/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers.json.j2 b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers.json.j2 new file mode 100644 index 000000000000..0b1cb2c541b6 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't1' %} +{%- include 'buffers_config.j2' %} diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t1.j2 new file mode 120000 index 000000000000..c25cc95d6d57 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/hwsku.json b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/hwsku.json new file mode 100644 index 000000000000..46936732aa5e --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/hwsku.json @@ -0,0 +1,104 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet8": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet16": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet24": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet32": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet40": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet48": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet56": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet64": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet72": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet80": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet88": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet96": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet104": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet112": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet120": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet128": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet136": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet144": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet152": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet160": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet168": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet176": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet184": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet192": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet200": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet208": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet216": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet224": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet232": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet240": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet248": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]" + }, + "Ethernet256": { + "default_brkout_mode": "1x10G", + "fec": "none" + } + } +} diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/port_config.ini b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/port_config.ini new file mode 100644 index 000000000000..9e4a4a6e91c5 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/port_config.ini @@ -0,0 +1,34 @@ +# name lanes alias index speed fec +Ethernet0 1,2,3,4,5,6,7,8 Ethernet1/1 1 400000 rs +Ethernet8 9,10,11,12,13,14,15,16 Ethernet2/1 2 400000 rs +Ethernet16 17,18,19,20,21,22,23,24 Ethernet3/1 3 400000 rs +Ethernet24 25,26,27,28,29,30,31,32 Ethernet4/1 4 400000 rs +Ethernet32 33,34,35,36,37,38,39,40 Ethernet5/1 5 400000 rs +Ethernet40 41,42,43,44,45,46,47,48 Ethernet6/1 6 400000 rs +Ethernet48 49,50,51,52,53,54,55,56 Ethernet7/1 7 400000 rs +Ethernet56 57,58,59,60,61,62,63,64 Ethernet8/1 8 400000 rs +Ethernet64 65,66,67,68,69,70,71,72 Ethernet9/1 9 400000 rs +Ethernet72 73,74,75,76,77,78,79,80 Ethernet10/1 10 400000 rs +Ethernet80 81,82,83,84,85,86,87,88 Ethernet11/1 11 400000 rs +Ethernet88 89,90,91,92,93,94,95,96 Ethernet12/1 12 400000 rs +Ethernet96 97,98,99,100,101,102,103,104 Ethernet13/1 13 400000 rs +Ethernet104 105,106,107,108,109,110,111,112 Ethernet14/1 14 400000 rs +Ethernet112 113,114,115,116,117,118,119,120 Ethernet15/1 15 400000 rs +Ethernet120 121,122,123,124,125,126,127,128 Ethernet16/1 16 400000 rs +Ethernet128 385,386,387,388,389,390,391,392 Ethernet17/1 17 400000 rs +Ethernet136 393,394,395,396,397,398,399,400 Ethernet18/1 18 400000 rs +Ethernet144 401,402,403,404,405,406,407,408 Ethernet19/1 19 400000 rs +Ethernet152 409,410,411,412,413,414,415,416 Ethernet20/1 20 400000 rs +Ethernet160 417,418,419,420,421,422,423,424 Ethernet21/1 21 400000 rs +Ethernet168 425,426,427,428,429,430,431,432 Ethernet22/1 22 400000 rs +Ethernet176 433,434,435,436,437,438,439,440 Ethernet23/1 23 400000 rs +Ethernet184 441,442,443,444,445,446,447,448 Ethernet24/1 24 400000 rs +Ethernet192 449,450,451,452,453,454,455,456 Ethernet25/1 25 400000 rs +Ethernet200 457,458,459,460,461,462,463,464 Ethernet26/1 26 400000 rs +Ethernet208 465,466,467,468,469,470,471,472 Ethernet27/1 27 400000 rs +Ethernet216 473,474,475,476,477,478,479,480 Ethernet28/1 28 400000 rs +Ethernet224 481,482,483,484,485,486,487,488 Ethernet29/1 29 400000 rs +Ethernet232 489,490,491,492,493,494,495,496 Ethernet30/1 30 400000 rs +Ethernet240 497,498,499,500,501,502,503,504 Ethernet31/1 31 400000 rs +Ethernet248 505,506,507,508,509,510,511,512 Ethernet32/1 32 400000 rs +Ethernet256 513 Ethernet33 33 10000 none diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/qos.json.j2 b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/sai.profile b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/sai.profile new file mode 100644 index 000000000000..ee4438ef3910 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th4-a7060dx5-32.config.bcm diff --git a/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/th4-a7060dx5-32.config.bcm b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/th4-a7060dx5-32.config.bcm new file mode 100644 index 000000000000..f61168ea5d94 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/Arista-7060DX5-32/th4-a7060dx5-32.config.bcm @@ -0,0 +1,1643 @@ +# $Copyright: Broadcom Ltd.$ +# +# BCM56990 64x400g port configuration. +# +# configuration yaml file +# device: +# : +# : +# ? +# : +# : +# ... +# : +# : +# : +# : +# ... +# : +# + +--- +bcm_device: + 0: + global: + pktio_mode: 1 + vlan_flooding_l2mc_num_reserved: 0 + ipv6_lpm_128b_enable: 1 + shared_block_mask_section: uc_bc + skip_protocol_default_entries: 1 + # LTSW uses value 1 for ALPM combined mode + l3_alpm_template: 1 + l3_alpm_hit_skip: 1 + sai_feat_tail_timestamp : 1 + sai_field_group_auto_prioritize: 1 + #l3_intf_vlan_split_egress for MTU at L3IF + l3_intf_vlan_split_egress : 1 + + # vxlan + l3_alpm_template: 1 + riot_overlay_l3_egress_mem_size: 16384 + riot_overlay_l3_intf_mem_size: 4096 + l3_ecmp_member_first_lkup_mem_size: 12288 + bcm_tunnel_term_compatible_mode: 1 + shared_l2_tunnel: 1 + sai_tunnel_support: 10 + sai_tunnel_underlay_route_mode: 2 + sai_tunnel_ecmp_sharing_mode: 0 # change to 2 if SAI_NEXT_HOP_GROUP_ATTR_LEVEL_1 used + + # bfd + bfd_enable: 1 + bfd_sha1_keys: 5 + bfd_num_sessions: 2048 + bfd_simple_password_keys: 5 + num_queues_pci: 47 + num_queues_uc0: 1 + bfd_feature_enable: 1 + bfd_use_endpoint_id_as_discriminator: 1 + bfd_tx_raw_ingress_enable: 1 + sai_eapp_config_file: "/usr/share/sonic/device/x86_64-broadcom_common/eapps/eapp_config.json" +--- +device: + 0: + PC_SERDES_CONFIG: + PKG_SWAP_BYPASS: 1 + + PC_PM_CORE: + ? + PC_PM_ID: 1 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x67235401 + TX_LANE_MAP: 0x2731465 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 2 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x31752064 + TX_LANE_MAP: 0x76025314 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 3 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x67241503 + TX_LANE_MAP: 0x13650274 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x01 + ? + PC_PM_ID: 4 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x46025713 + TX_LANE_MAP: 0x31650274 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 5 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x62713054 + TX_LANE_MAP: 0x21703465 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0xd8 + ? + PC_PM_ID: 6 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x13460257 + TX_LANE_MAP: 0x64137502 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 7 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43512670 + TX_LANE_MAP: 0x2571364 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 8 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x14270356 + TX_LANE_MAP: 0x64237501 + RX_POLARITY_FLIP: 0xfb + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 9 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76140235 + TX_LANE_MAP: 0x74036521 + RX_POLARITY_FLIP: 0xc1 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 10 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x47125603 + TX_LANE_MAP: 0x30451276 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 11 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76041235 + TX_LANE_MAP: 0x74036512 + RX_POLARITY_FLIP: 0x40 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 12 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x27145603 + TX_LANE_MAP: 0x21450376 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 13 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x2735146 + TX_LANE_MAP: 0x3657421 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0xc8 + ? + PC_PM_ID: 14 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x47306521 + TX_LANE_MAP: 0x12643075 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0x33 + ? + PC_PM_ID: 15 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x20157436 + TX_LANE_MAP: 0x56237104 + RX_POLARITY_FLIP: 0x08 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 16 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x14270356 + TX_LANE_MAP: 0x76325014 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 49 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x56704312 + TX_LANE_MAP: 0x32641570 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 50 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x21564073 + TX_LANE_MAP: 0x50314762 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 51 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x36715402 + TX_LANE_MAP: 0x32641075 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 52 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x51462073 + TX_LANE_MAP: 0x5127634 + RX_POLARITY_FLIP: 0x69 + TX_POLARITY_FLIP: 0x08 + ? + PC_PM_ID: 53 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73204651 + TX_LANE_MAP: 0x32640175 + RX_POLARITY_FLIP: 0x69 + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 54 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x5134627 + TX_LANE_MAP: 0x60137254 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 55 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x57420163 + TX_LANE_MAP: 0x32651074 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 56 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x5134627 + TX_LANE_MAP: 0x10524376 + RX_POLARITY_FLIP: 0x05 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 57 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73520146 + TX_LANE_MAP: 0x31650274 + RX_POLARITY_FLIP: 0x3d + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 58 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x16072354 + TX_LANE_MAP: 0x51634270 + RX_POLARITY_FLIP: 0x01 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 59 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x72530164 + TX_LANE_MAP: 0x32506147 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 60 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x4371256 + TX_LANE_MAP: 0x21673054 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0xcc + ? + PC_PM_ID: 61 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x67241503 + TX_LANE_MAP: 0x12730465 + RX_POLARITY_FLIP: 0x20 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 62 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73625140 + TX_LANE_MAP: 0x12640573 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 63 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x23674015 + TX_LANE_MAP: 0x57206143 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 64 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x57314260 + TX_LANE_MAP: 0x1735264 + RX_POLARITY_FLIP: 0x10 + TX_POLARITY_FLIP: 0x00 +... +--- +device: + 0: + PC_PORT_PHYS_MAP: + ? + # CPU port + PORT_ID: 0 + : + PC_PHYS_PORT_ID: 0 + ? + PORT_ID: 1 + : + PC_PHYS_PORT_ID: 1 + ? + PORT_ID: 2 + : + PC_PHYS_PORT_ID: 5 + ? + PORT_ID: 3 + : + PC_PHYS_PORT_ID: 9 + ? + PORT_ID: 4 + : + PC_PHYS_PORT_ID: 13 + ? + PORT_ID: 17 + : + PC_PHYS_PORT_ID: 17 + ? + PORT_ID: 18 + : + PC_PHYS_PORT_ID: 21 + ? + PORT_ID: 19 + : + PC_PHYS_PORT_ID: 25 + ? + PORT_ID: 20 + : + PC_PHYS_PORT_ID: 29 + ? + PORT_ID: 34 + : + PC_PHYS_PORT_ID: 33 + ? + PORT_ID: 35 + : + PC_PHYS_PORT_ID: 37 + ? + PORT_ID: 36 + : + PC_PHYS_PORT_ID: 41 + ? + PORT_ID: 37 + : + PC_PHYS_PORT_ID: 45 + ? + PORT_ID: 51 + : + PC_PHYS_PORT_ID: 49 + ? + PORT_ID: 52 + : + PC_PHYS_PORT_ID: 53 + ? + PORT_ID: 53 + : + PC_PHYS_PORT_ID: 57 + ? + PORT_ID: 54 + : + PC_PHYS_PORT_ID: 61 + ? + PORT_ID: 204 + : + PC_PHYS_PORT_ID: 193 + ? + PORT_ID: 205 + : + PC_PHYS_PORT_ID: 197 + ? + PORT_ID: 206 + : + PC_PHYS_PORT_ID: 201 + ? + PORT_ID: 207 + : + PC_PHYS_PORT_ID: 205 + ? + PORT_ID: 221 + : + PC_PHYS_PORT_ID: 209 + ? + PORT_ID: 222 + : + PC_PHYS_PORT_ID: 213 + ? + PORT_ID: 223 + : + PC_PHYS_PORT_ID: 217 + ? + PORT_ID: 224 + : + PC_PHYS_PORT_ID: 221 + ? + PORT_ID: 238 + : + PC_PHYS_PORT_ID: 225 + ? + PORT_ID: 239 + : + PC_PHYS_PORT_ID: 229 + ? + PORT_ID: 240 + : + PC_PHYS_PORT_ID: 233 + ? + PORT_ID: 241 + : + PC_PHYS_PORT_ID: 237 + ? + PORT_ID: 255 + : + PC_PHYS_PORT_ID: 241 + ? + PORT_ID: 256 + : + PC_PHYS_PORT_ID: 245 + ? + PORT_ID: 257 + : + PC_PHYS_PORT_ID: 249 + ? + PORT_ID: 258 + : + PC_PHYS_PORT_ID: 253 + ? + PORT_ID: 50 + : + PC_PHYS_PORT_ID: 258 +... +--- +device: + 0: + PC_PORT: + ? + PORT_ID: 0 + : + &port_mode_10g + ENABLE: 1 + SPEED: 10000 + NUM_LANES: 1 + ? + PORT_ID: [[50, 50]] + : + ENABLE: 0 + MAX_FRAME_SIZE: 9416 + SPEED: 10000 + NUM_LANES: 1 + ? + PORT_ID: [[1, 4], + [17, 20], + [34, 37], + [51, 54], + [204, 207], + [221, 224], + [238, 241], + [255, 258]] + : + ENABLE: 0 + SPEED: 400000 + NUM_LANES: 8 + FEC_MODE: PC_FEC_RS544_2XN + MAX_FRAME_SIZE: 9416 +... +--- +device: + 0: + # Per pipe flex counter configuration + CTR_EFLEX_CONFIG: + CTR_ING_EFLEX_OPERMODE_PIPEUNIQUE: 0 + CTR_EGR_EFLEX_OPERMODE_PIPEUNIQUE: 0 + + # Per pipe flex state configuration + #FLEX_STATE_CONFIG: + # FLEX_STATE_ING_OPERMODE_PIPEUNIQUE: 0 + # FLEX_STATE_EGR_OPERMODE_PIPEUNIQUE: 1 + + # Lossy vs Lossless mode + TM_THD_CONFIG: + THRESHOLD_MODE: LOSSLESS + + # IFP mode + FP_CONFIG: + FP_ING_OPERMODE: GLOBAL_PIPE_AWARE +... +--- +device: + 0: + TM_THD_CONFIG: + SKIP_BUFFER_RESERVATION: 1 + THRESHOLD_MODE: LOSSY_AND_LOSSLESS + + TM_SCHEDULER_CONFIG: + NUM_MC_Q: NUM_MC_Q_2 +... +--- +device: + 0: + TM_ING_THD_PORT_PRI_GRP: + ? + PORT_ID: [[0,67], [204,219], [221,253],[255,271]] + TM_PRI_GRP_ID: [[0,7]] + : + MIN_GUARANTEE_CELLS: 0 + DYNAMIC_SHARED_LIMITS: 0 + SHARED_LIMIT_CELLS_STATIC: 0 + HEADROOM_LIMIT_CELLS: 0 + + TM_ING_THD_PORT_SERVICE_POOL: + ? + PORT_ID: [[0,67], [204,219], [221,253],[255,271]] + TM_ING_SERVICE_POOL_ID: [[0,3]] + : + MIN_GUARANTEE_CELLS: 0 + SHARED_LIMIT_CELLS: 0 + + TM_ING_THD_HEADROOM_POOL: + ? + BUFFER_POOL: 0 + TM_HEADROOM_POOL_ID: [[0,3]] + : + LIMIT_CELLS: 0 + + TM_THD_UC_Q: + ? + PORT_ID: [[1,67], [204,219], [221,253],[255,271]] + TM_UC_Q_ID: [[0,11]] + : + MIN_GUARANTEE_CELLS: 0 + SHARED_LIMITS: 1 + DYNAMIC_SHARED_LIMITS: 0 + SHARED_LIMIT_CELLS_STATIC: 0 + + TM_THD_MC_Q: + ? + PORT_ID: 0 + TM_MC_Q_ID: [[0,47]] + : + MIN_GUARANTEE_CELLS: 0 + ? + PORT_ID: [[1,67], [204,219], [221,253],[255,271]] + TM_MC_Q_ID: [[0,5]] + : + MIN_GUARANTEE_CELLS: 0 + SHARED_LIMITS: 1 + DYNAMIC_SHARED_LIMITS: 0 + SHARED_LIMIT_CELLS_STATIC: 0 + + TM_THD_Q_GRP: + ? + PORT_ID: [[0,67], [204,219], [221,253],[255,271]] + : + UC_Q_GRP_MIN_GUARANTEE_CELLS: 0 + MC_Q_GRP_MIN_GUARANTEE_CELLS: 0 +... +--- +device: + 0: + TM_ING_PORT: + ? + PORT_ID: [[0,67], [204,219], [221,253],[255,271]] + : + PAUSE: 0 + + TM_ING_PORT_PRI_GRP: + ? + PORT_ID: [[0,67], [204,219], [221,253],[255,271]] + TM_PRI_GRP_ID: [[0,7]] + : + PFC: 0 + LOSSLESS: 0 + ING_MIN_MODE: USE_PRI_GRP_MIN + + TM_PORT_UC_Q_TO_SERVICE_POOL: + ? + PORT_ID: [[1,67], [204,219], [221,253],[255,271]] + TM_UC_Q_ID: [[0,11]] + : + USE_QGROUP_MIN: 0 + + TM_PORT_MC_Q_TO_SERVICE_POOL: + ? + PORT_ID: 0 + TM_MC_Q_ID: [[0,47]] + : + USE_QGROUP_MIN: 0 + ? + PORT_ID: [[1,67], [204,219], [221,253],[255,271]] + TM_MC_Q_ID: [[0,5]] + : + USE_QGROUP_MIN: 0 +... +--- +device: + 0: + TM_ING_THD_HEADROOM_POOL: + ? + BUFFER_POOL: 0 + TM_HEADROOM_POOL_ID: [[0,3]] + : + LIMIT_CELLS: 0 + + TM_ING_THD_SERVICE_POOL: + ? + BUFFER_POOL: 0 + TM_ING_SERVICE_POOL_ID: [[0,3]] + : + SHARED_LIMIT_CELLS: 0 + SHARED_RESUME_OFFSET_CELLS: 0 + COLOR_SPECIFIC_LIMITS: 0 + + TM_EGR_THD_SERVICE_POOL: + ? + BUFFER_POOL: 0 + TM_EGR_SERVICE_POOL_ID: [[0,3]] + : + SHARED_LIMIT_CELLS: 0 + SHARED_RESUME_LIMIT_CELLS: 0 + COLOR_SPECIFIC_LIMITS: 0 + YELLOW_SHARED_LIMIT_CELLS: 0 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 0 + RED_SHARED_LIMIT_CELLS: 0 + RED_SHARED_RESUME_LIMIT_CELLS: 0 + + TM_THD_MC_EGR_SERVICE_POOL: + ? + BUFFER_POOL: 0 + TM_EGR_SERVICE_POOL_ID: [[0,3]] + : + SHARED_LIMIT_CELLS: 0 + SHARED_RESUME_LIMIT_CELLS: 0 + COLOR_SPECIFIC_LIMITS: 0 + YELLOW_SHARED_LIMIT_CELLS: 0 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 0 + RED_SHARED_LIMIT_CELLS: 0 + RED_SHARED_RESUME_LIMIT_CELLS: 0 +... + +### Mapping +--- +device: + 0: + TM_ING_UC_ING_PRI_MAP: + ? + # Profile 1 + TM_ING_UC_ING_PRI_MAP_ID: 1 + ING_PRI: [0, 1, 2, 5, 6, [8,15]] + : + TM_PRI_GRP_ID: 0 + ? + TM_ING_UC_ING_PRI_MAP_ID: 1 + ING_PRI: 3 + : + TM_PRI_GRP_ID: 3 + ? + TM_ING_UC_ING_PRI_MAP_ID: 1 + ING_PRI: 4 + : + TM_PRI_GRP_ID: 4 + ? + TM_ING_UC_ING_PRI_MAP_ID: 1 + ING_PRI: 7 + : + TM_PRI_GRP_ID: 7 + ? + # Profile 2 + TM_ING_UC_ING_PRI_MAP_ID: 1 + ING_PRI: [0, 1, 5, [8,15]] + : + TM_PRI_GRP_ID: 0 + ? + TM_ING_UC_ING_PRI_MAP_ID: 2 + ING_PRI: 2 + : + TM_PRI_GRP_ID: 2 + ? + TM_ING_UC_ING_PRI_MAP_ID: 2 + ING_PRI: 3 + : + TM_PRI_GRP_ID: 3 + ? + TM_ING_UC_ING_PRI_MAP_ID: 2 + ING_PRI: 4 + : + TM_PRI_GRP_ID: 4 + ? + TM_ING_UC_ING_PRI_MAP_ID: 2 + ING_PRI: 6 + : + TM_PRI_GRP_ID: 6 + ? + TM_ING_UC_ING_PRI_MAP_ID: 2 + ING_PRI: 7 + : + TM_PRI_GRP_ID: 7 + ? + # Profile 3 + TM_ING_UC_ING_PRI_MAP_ID: 3 + ING_PRI: [[0,15]] + : + TM_PRI_GRP_ID: 7 + + TM_ING_NONUC_ING_PRI_MAP: + ? + # Profile 1 + TM_ING_NONUC_ING_PRI_MAP_ID: 1 + ING_PRI: [0, 1, 2, 5, 6, [8,15]] + : + TM_PRI_GRP_ID: 0 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 1 + ING_PRI: 3 + : + TM_PRI_GRP_ID: 3 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 1 + ING_PRI: 4 + : + TM_PRI_GRP_ID: 4 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 1 + ING_PRI: 7 + : + TM_PRI_GRP_ID: 7 + ? + # Profile 2 + TM_ING_NONUC_ING_PRI_MAP_ID: 1 + ING_PRI: [0, 1, 5, [8,15]] + : + TM_PRI_GRP_ID: 0 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 2 + ING_PRI: 2 + : + TM_PRI_GRP_ID: 2 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 2 + ING_PRI: 3 + : + TM_PRI_GRP_ID: 3 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 2 + ING_PRI: 4 + : + TM_PRI_GRP_ID: 4 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 2 + ING_PRI: 6 + : + TM_PRI_GRP_ID: 6 + ? + TM_ING_NONUC_ING_PRI_MAP_ID: 2 + ING_PRI: 7 + : + TM_PRI_GRP_ID: 7 + ? + # Profile 3 + TM_ING_NONUC_ING_PRI_MAP_ID: 3 + ING_PRI: [[0,15]] + : + TM_PRI_GRP_ID: 7 + + TM_PRI_GRP_POOL_MAP: + ? + TM_PRI_GRP_POOL_MAP_ID: 1 + TM_PRI_GRP_ID: [[0,6]] + : + TM_ING_SERVICE_POOL_ID: 0 + TM_HEADROOM_POOL_ID: 0 + ? + TM_PRI_GRP_POOL_MAP_ID: 1 + TM_PRI_GRP_ID: 7 + : + TM_ING_SERVICE_POOL_ID: 1 + TM_HEADROOM_POOL_ID: 1 + + TM_ING_PORT: + ? + PORT_ID: [0] + : + ING_PRI_MAP_ID: 3 + PRI_GRP_MAP_ID: 1 + ? + PORT_ID: [[1,4], [204,207]] + : + ING_PRI_MAP_ID: 1 + PRI_GRP_MAP_ID: 1 + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + ING_PRI_MAP_ID: 2 + PRI_GRP_MAP_ID: 1 + ? + PORT_ID: [50] + : + ING_PRI_MAP_ID: 1 + PRI_GRP_MAP_ID: 1 + ? + PORT_ID: [33, 67, 237, 271] + : + ING_PRI_MAP_ID: 1 + PRI_GRP_MAP_ID: 1 + + TM_PORT_UC_Q_TO_SERVICE_POOL: + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_UC_Q_ID: [[0,6], [8,9]] + : + TM_EGR_SERVICE_POOL_ID: 0 + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_UC_Q_ID: 7 + : + TM_EGR_SERVICE_POOL_ID: 1 + + TM_PORT_MC_Q_TO_SERVICE_POOL: + ? + PORT_ID: [0] + TM_MC_Q_ID: [[0,47]] + : + TM_EGR_SERVICE_POOL_ID: 1 + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_MC_Q_ID: [[0,1]] + : + TM_EGR_SERVICE_POOL_ID: 0 +... + +### Scheduler +--- +device: + 0: + TM_SCHEDULER_PROFILE: + ? + TM_SCHEDULER_PROFILE_ID: 1 + TM_SCHEDULER_NODE_ID: [0, 1] + : + NUM_UC_Q: 1 + NUM_MC_Q: 1 + FLOW_CTRL_UC: 0 + ? + TM_SCHEDULER_PROFILE_ID: 1 + TM_SCHEDULER_NODE_ID: [2, 5, 6, 7, 8, 9] + : + NUM_UC_Q: 1 + NUM_MC_Q: 0 + FLOW_CTRL_UC: 0 + ? + TM_SCHEDULER_PROFILE_ID: 1 + TM_SCHEDULER_NODE_ID: [3, 4] + : + NUM_UC_Q: 1 + NUM_MC_Q: 0 + FLOW_CTRL_UC: 1 + ? + TM_SCHEDULER_PROFILE_ID: 1 + TM_SCHEDULER_NODE_ID: [10, 11] + : + NUM_UC_Q: 0 + NUM_MC_Q: 0 + FLOW_CTRL_UC: 0 + + TM_SCHEDULER_PROFILE: + ? + TM_SCHEDULER_PROFILE_ID: 2 + TM_SCHEDULER_NODE_ID: [0, 1] + : + NUM_UC_Q: 1 + NUM_MC_Q: 1 + FLOW_CTRL_UC: 0 + ? + TM_SCHEDULER_PROFILE_ID: 2 + TM_SCHEDULER_NODE_ID: [5, 7, 8, 9] + : + NUM_UC_Q: 1 + NUM_MC_Q: 0 + FLOW_CTRL_UC: 0 + ? + TM_SCHEDULER_PROFILE_ID: 2 + TM_SCHEDULER_NODE_ID: [2, 3, 4, 6] + : + NUM_UC_Q: 1 + NUM_MC_Q: 0 + FLOW_CTRL_UC: 1 + ? + TM_SCHEDULER_PROFILE_ID: 2 + TM_SCHEDULER_NODE_ID: [10, 11] + : + NUM_UC_Q: 0 + NUM_MC_Q: 0 + FLOW_CTRL_UC: 0 +... +--- +device: + 0: + TM_SCHEDULER_PORT_PROFILE: + ? + PORT_ID: [[1,4], [204,207]] + : + TM_SCHEDULER_PROFILE_ID: 1 + WRR: 0 + TM_SCHEDULER_PORT_PROFILE: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + TM_SCHEDULER_PROFILE_ID: 2 + WRR: 0 +... + +### Pools +### hard code service pool size for TH4 per architecture requirement. +--- +device: + 0: + TM_ING_THD_HEADROOM_POOL: + ? + BUFFER_POOL: 0 + TM_HEADROOM_POOL_ID: 0 + : + LIMIT_CELLS: 45696 + + TM_ING_THD_SERVICE_POOL: + ? + BUFFER_POOL: 0 + TM_ING_SERVICE_POOL_ID: 0 + : + SHARED_LIMIT_CELLS: 173222 + SHARED_RESUME_OFFSET_CELLS: 74 + COLOR_SPECIFIC_LIMITS: 0 + ? + BUFFER_POOL: 0 + TM_ING_SERVICE_POOL_ID: 1 + : + SHARED_LIMIT_CELLS: 605 + SHARED_RESUME_OFFSET_CELLS: 74 + COLOR_SPECIFIC_LIMITS: 0 + + TM_EGR_THD_SERVICE_POOL: + ? + BUFFER_POOL: 0 + TM_EGR_SERVICE_POOL_ID: 0 + : + SHARED_LIMIT_CELLS: 173222 + SHARED_RESUME_LIMIT_CELLS: 21643 + COLOR_SPECIFIC_LIMITS: 1 + YELLOW_SHARED_LIMIT_CELLS: 16240 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 16230 + RED_SHARED_LIMIT_CELLS: 13533 + RED_SHARED_RESUME_LIMIT_CELLS: 13523 + ? + BUFFER_POOL: 0 + TM_EGR_SERVICE_POOL_ID: 1 + : + SHARED_LIMIT_CELLS: 605 + SHARED_RESUME_LIMIT_CELLS: 73 + COLOR_SPECIFIC_LIMITS: 1 + YELLOW_SHARED_LIMIT_CELLS: 57 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 55 + RED_SHARED_LIMIT_CELLS: 48 + RED_SHARED_RESUME_LIMIT_CELLS: 46 + + TM_THD_MC_EGR_SERVICE_POOL: + ? + BUFFER_POOL: 0 + TM_EGR_SERVICE_POOL_ID: 0 + : + SHARED_LIMIT_CELLS: 15779 + SHARED_RESUME_LIMIT_CELLS: 1962 + COLOR_SPECIFIC_LIMITS: 1 + YELLOW_SHARED_LIMIT_CELLS: 1480 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 1470 + RED_SHARED_LIMIT_CELLS: 1233 + RED_SHARED_RESUME_LIMIT_CELLS: 1223 + ? + BUFFER_POOL: 0 + TM_EGR_SERVICE_POOL_ID: 1 + : + SHARED_LIMIT_CELLS: 605 + SHARED_RESUME_LIMIT_CELLS: 73 + COLOR_SPECIFIC_LIMITS: 1 + YELLOW_SHARED_LIMIT_CELLS: 57 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 55 + RED_SHARED_LIMIT_CELLS: 46 + RED_SHARED_RESUME_LIMIT_CELLS: 46 +... + +### Thresholds +###################################### +--- +device: + 0: + TM_ING_THD_PORT_PRI_GRP: + ? + PORT_ID: [[0,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_PRI_GRP_ID: [0, 1, 5, 7] + : + SHARED_LIMIT_CELLS_STATIC: 227317 + MIN_GUARANTEE_CELLS: 0 + DYNAMIC_SHARED_LIMITS: 0 + RESUME_OFFSET_CELLS: 0 + RESUME_FLOOR_CELLS: 0 + HEADROOM_LIMIT_AUTO: 0 + HEADROOM_LIMIT_CELLS: 0 + ? + PORT_ID: [[1,4], [204,207]] + TM_PRI_GRP_ID: [2, 3, 4, 6] + : + MIN_GUARANTEE_CELLS: 18 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1_4 + RESUME_OFFSET_CELLS: 18 + RESUME_FLOOR_CELLS: 0 + HEADROOM_LIMIT_AUTO: 0 + HEADROOM_LIMIT_CELLS: 2874 + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + TM_PRI_GRP_ID: [2, 3, 4, 6] + : + MIN_GUARANTEE_CELLS: 18 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1_4 + RESUME_OFFSET_CELLS: 18 + RESUME_FLOOR_CELLS: 0 + HEADROOM_LIMIT_AUTO: 0 + HEADROOM_LIMIT_CELLS: 675 + ? + PORT_ID: [50] + TM_PRI_GRP_ID: [2, 3, 4, 6] + : + MIN_GUARANTEE_CELLS: 0 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1_4 + RESUME_OFFSET_CELLS: 0 + RESUME_FLOOR_CELLS: 0 + HEADROOM_LIMIT_AUTO: 0 + ? + PORT_ID: [33, 67, 237, 271] + TM_PRI_GRP_ID: [2, 3, 4, 6] + : + MIN_GUARANTEE_CELLS: 0 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1_4 + RESUME_OFFSET_CELLS: 0 + RESUME_FLOOR_CELLS: 0 + HEADROOM_LIMIT_AUTO: 0 + ? + PORT_ID: [0] + TM_PRI_GRP_ID: [2, 3, 4, 6] + : + MIN_GUARANTEE_CELLS: 0 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1_4 + RESUME_OFFSET_CELLS: 0 + RESUME_FLOOR_CELLS: 0 + HEADROOM_LIMIT_AUTO: 0 + + TM_ING_THD_PORT_SERVICE_POOL: + ? + PORT_ID: [[0,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_ING_SERVICE_POOL_ID: [0, 1] + : + MIN_GUARANTEE_CELLS: 0 + SHARED_LIMIT_CELLS: 227317 + RESUME_LIMIT_CELLS: 227317 + + TM_THD_UC_Q: + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_UC_Q_ID: [0, 1, 5, 7, 8, 9] + : + SHARED_LIMITS: 1 + COLOR_SPECIFIC_LIMITS: 1 + RED_LIMIT_DYNAMIC: PERCENTAGE_675 + YELLOW_LIMIT_DYNAMIC: PERCENTAGE_750 + COLOR_SPECIFIC_DYNAMIC_LIMITS: 1 + MIN_GUARANTEE_CELLS: 7 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1 + RESUME_OFFSET_CELLS: 2 + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_UC_Q_ID: [2, 3, 4, 6] + : + SHARED_LIMITS: 0 + COLOR_SPECIFIC_LIMITS: 0 + COLOR_SPECIFIC_DYNAMIC_LIMITS: 0 + MIN_GUARANTEE_CELLS: 0 + DYNAMIC_SHARED_LIMITS: 0 + SHARED_LIMIT_CELLS_STATIC: 227317 + RESUME_OFFSET_CELLS: 2 + + TM_THD_MC_Q: + ? + PORT_ID: [0] + TM_MC_Q_ID: [0, 1, 2, 3] + : + MIN_GUARANTEE_CELLS: 37 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_2 + COLOR_SPECIFIC_LIMITS: 1 + COLOR_SPECIFIC_DYNAMIC_LIMITS: 1 + YELLOW_LIMIT_DYNAMIC: PERCENTAGE_750 + RED_LIMIT_DYNAMIC: PERCENTAGE_675 + RESUME_OFFSET_CELLS: 2 + ? + PORT_ID: [0] + TM_MC_Q_ID: [4, 5, 6, 7, 8, 9] + : + MIN_GUARANTEE_CELLS: 7 + SHARED_LIMITS: 1 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1_4 + COLOR_SPECIFIC_LIMITS: 1 + COLOR_SPECIFIC_DYNAMIC_LIMITS: 1 + YELLOW_LIMIT_DYNAMIC: PERCENTAGE_750 + RED_LIMIT_DYNAMIC: PERCENTAGE_675 + RESUME_OFFSET_CELLS: 2 + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_MC_Q_ID: [0, 1] + : + SHARED_LIMITS: 1 + DYNAMIC_SHARED_LIMITS: 1 + SHARED_LIMIT_DYNAMIC: ALPHA_1 + COLOR_SPECIFIC_LIMITS: 1 + COLOR_SPECIFIC_DYNAMIC_LIMITS: 1 + YELLOW_LIMIT_DYNAMIC: PERCENTAGE_750 + RED_LIMIT_DYNAMIC: PERCENTAGE_675 + RESUME_OFFSET_CELLS: 2 + + TM_EGR_THD_UC_PORT_SERVICE_POOL: + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_EGR_SERVICE_POOL_ID: 0 + : + SHARED_LIMIT_CELLS: 173222 + SHARED_RESUME_LIMIT_CELLS: 21651 + COLOR_SPECIFIC_LIMITS: 1 + YELLOW_SHARED_LIMIT_CELLS: 16239 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 16237 + RED_SHARED_LIMIT_CELLS: 13532 + RED_SHARED_RESUME_LIMIT_CELLS: 13530 + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_EGR_SERVICE_POOL_ID: 1 + : + SHARED_LIMIT_CELLS: 605 + SHARED_RESUME_LIMIT_CELLS: 73 + COLOR_SPECIFIC_LIMITS: 1 + YELLOW_SHARED_LIMIT_CELLS: 56 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 54 + RED_SHARED_LIMIT_CELLS: 47 + RED_SHARED_RESUME_LIMIT_CELLS: 45 + + TM_EGR_THD_MC_PORT_SERVICE_POOL: + ? + PORT_ID: [[0,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_EGR_SERVICE_POOL_ID: 0 + : + COLOR_SPECIFIC_LIMITS: 1 + RED_SHARED_LIMIT_CELLS: 1232 + YELLOW_SHARED_LIMIT_CELLS: 1479 + SHARED_LIMIT_CELLS: 15779 + RED_SHARED_RESUME_LIMIT_CELLS: 1230 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 1477 + SHARED_RESUME_LIMIT_CELLS: 1970 + ? + PORT_ID: [[0,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + TM_EGR_SERVICE_POOL_ID: 1 + : + COLOR_SPECIFIC_LIMITS: 1 + RED_SHARED_LIMIT_CELLS: 47 + YELLOW_SHARED_LIMIT_CELLS: 56 + SHARED_LIMIT_CELLS: 605 + RED_SHARED_RESUME_LIMIT_CELLS: 45 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 54 + SHARED_RESUME_LIMIT_CELLS: 73 + + +... +### THDR Limits +--- +device: + 0: + TM_THD_REPL_SERVICE_POOL: + COLOR_SPECIFIC_LIMITS: 1 + SHARED_LIMIT_CELLS: 2961 + SHARED_RESUME_LIMIT_CELLS: 2947 + YELLOW_SHARED_LIMIT_CELLS: 2220 + YELLOW_SHARED_RESUME_LIMIT_CELLS: 2206 + RED_SHARED_LIMIT_CELLS: 1850 + RED_SHARED_RESUME_LIMIT_CELLS: 1836 + + TM_THD_REPL_Q: + ? + REPL_Q_NUM: [0,8] + : + COLOR_SPECIFIC_LIMITS: 1 + COLOR_SPECIFIC_DYNAMIC_LIMITS: 1 + SHARED_LIMITS: 1 + DYNAMIC_SHARED_LIMITS: 1 + RESUME_OFFSET_CELLS: 14 + SHARED_LIMIT_DYNAMIC: ALPHA_1 + YELLOW_LIMIT_DYNAMIC: PERCENTAGE_750 + RED_LIMIT_DYNAMIC: PERCENTAGE_675 + RESUME_OFFSET_YELLOW_CELLS: 14 + RESUME_OFFSET_RED_CELLS: 14 + + TM_THD_REPL_Q: + ? + REPL_Q_NUM: [0,5] + : + MIN_GUARANTEE_CELLS: 0 + ? + REPL_Q_NUM: [6,8] + : + MIN_GUARANTEE_CELLS: 37 + +... +### Mirror-on-drop +--- +device: + 0: + TM_MIRROR_ON_DROP_CONTROL: + RESERVED_LIMIT_CELLS: 2580 + + TM_MIRROR_ON_DROP_PROFILE: + ? + TM_MIRROR_ON_DROP_PROFILE_ID: 0 + : + PERCENTAGE_0_25: 65535 + PERCENTAGE_25_50: 65535 + PERCENTAGE_50_75: 65535 + PERCENTAGE_75_100: 65535 + + TM_MIRROR_ON_DROP_DESTINATION: + ? + TM_MIRROR_ON_DROP_DESTINATION_ID: 0 + : + TM_MC_Q_ID: 1 + PORT_ID: 1 +... + +### OBM +--- +device: + 0: + TM_OBM_PORT_PKT_PARSE: + ? + PORT_ID: [[1,4], [204,207]] + : + DSCP_MAP: 1 + HEADER_TYPE: OBM_HEADER_TYPE_ETHERNET + DEFAULT_PKT_PRI: 0 + + TM_OBM_PORT_PKT_PARSE: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + DSCP_MAP: 1 + HEADER_TYPE: OBM_HEADER_TYPE_ETHERNET + DEFAULT_PKT_PRI: 0 + + TM_OBM_PORT_PKT_PRI_TC_MAP: + ? + PORT_ID: [[1,4], [204,207]] + PKT_PRI_TYPE: PKT_PRI_TYPE_DSCP + PKT_PRI: [3, 4] + : + TRAFFIC_CLASS: OBM_TC_LOSSLESS0 + + TM_OBM_PORT_PKT_PRI_TC_MAP: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + PKT_PRI_TYPE: PKT_PRI_TYPE_DSCP + PKT_PRI: [2, 3, 4, 6] + : + TRAFFIC_CLASS: OBM_TC_LOSSLESS0 + + TM_OBM_THD_PORT: + ? + PORT_ID: [[1,4], [204,207]] + : + THD_AUTO: 0 + LOSSY_LOW_MAX_BYTES: 37376 + LOSSLESS0_MAX_BYTES: 235264 + MAX_BYTES: 235264 + + TM_OBM_THD_PORT: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + THD_AUTO: 0 + LOSSY_LOW_MAX_BYTES: 37376 + LOSSLESS0_MAX_BYTES: 235264 + MAX_BYTES: 235264 + + TM_OBM_THD_PORT_FLOW_CTRL: + ? + PORT_ID: [[1,4], [204,207]] + : + THD_AUTO: 0 + LOSSLESS0_XOFF_BYTES: 5184 + LOSSLESS0_XON_BYTES: 4672 + XOFF_BYTES: 5184 + XON_BYTES: 4672 + + TM_OBM_THD_PORT_FLOW_CTRL: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + THD_AUTO: 0 + LOSSLESS0_XOFF_BYTES: 5184 + LOSSLESS0_XON_BYTES: 4672 + XOFF_BYTES: 5184 + XON_BYTES: 4672 + + TM_OBM_PORT_FLOW_CTRL: + ? + PORT_ID: [[1,4], [204,207]] + : + FLOW_CTRL: 1 + FLOW_CTRL_TYPE: PFC + LOSSLESS0_FLOW_CTRL: 1 + + TM_OBM_PORT_FLOW_CTRL: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + FLOW_CTRL: 1 + FLOW_CTRL_TYPE: PFC + LOSSLESS0_FLOW_CTRL: 1 +... + +### PFC +--- +device: + 0: + PC_MAC_CONTROL: + ? + PORT_ID: [[1,4], [17,20], [33,37], [50,54], 67, [204,207], [221,224], [237,241], [255,258], 271] + : + PAUSE_TX: 0 + PAUSE_RX: 0 + + TM_PFC_EGR: + ? + PORT_ID: [[1,4], [204,207]] + : + TM_PFC_PRI_PROFILE_ID: 1 + + TM_PFC_EGR: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + TM_PFC_PRI_PROFILE_ID: 2 +... +--- +device: + 0: + TM_PFC_PRI_TO_PRI_GRP_MAP: + ? + TM_PFC_PRI_TO_PRI_GRP_MAP_ID: 1 + PFC_PRI: 3 + : + TM_PRI_GRP_ID: 3 + + TM_PFC_PRI_TO_PRI_GRP_MAP: + ? + TM_PFC_PRI_TO_PRI_GRP_MAP_ID: 1 + PFC_PRI: 4 + : + TM_PRI_GRP_ID: 4 + + TM_PFC_PRI_TO_PRI_GRP_MAP: + ? + TM_PFC_PRI_TO_PRI_GRP_MAP_ID: 2 + PFC_PRI: 2 + : + TM_PRI_GRP_ID: 2 + + TM_PFC_PRI_TO_PRI_GRP_MAP: + ? + TM_PFC_PRI_TO_PRI_GRP_MAP_ID: 2 + PFC_PRI: 3 + : + TM_PRI_GRP_ID: 3 + + TM_PFC_PRI_TO_PRI_GRP_MAP: + ? + TM_PFC_PRI_TO_PRI_GRP_MAP_ID: 2 + PFC_PRI: 4 + : + TM_PRI_GRP_ID: 4 + + TM_PFC_PRI_TO_PRI_GRP_MAP: + ? + TM_PFC_PRI_TO_PRI_GRP_MAP_ID: 2 + PFC_PRI: 6 + : + TM_PRI_GRP_ID: 6 + + TM_PFC_PRI_PROFILE: + ? + TM_PFC_PRI_PROFILE_ID: 1 + PFC_PRI: 3 + : + PFC: 1 + COS_LIST: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0] + + TM_PFC_PRI_PROFILE: + ? + TM_PFC_PRI_PROFILE_ID: 1 + PFC_PRI: 4 + : + PFC: 1 + COS_LIST: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0] + + TM_PFC_PRI_PROFILE: + ? + TM_PFC_PRI_PROFILE_ID: 2 + PFC_PRI: 2 + : + PFC: 1 + COS_LIST: [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] + + TM_PFC_PRI_PROFILE: + ? + TM_PFC_PRI_PROFILE_ID: 2 + PFC_PRI: 3 + : + PFC: 1 + COS_LIST: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0] + + TM_PFC_PRI_PROFILE: + ? + TM_PFC_PRI_PROFILE_ID: 2 + PFC_PRI: 4 + : + PFC: 1 + COS_LIST: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0] + + TM_PFC_PRI_PROFILE: + ? + TM_PFC_PRI_PROFILE_ID: 2 + PFC_PRI: 6 + : + PFC: 1 + COS_LIST: [0, 0, 0, 0, 0, 0, 1, 0, 0, 0] + + TM_ING_PORT_PRI_GRP: + ? + PORT_ID: [[1,4], [204,207]] + TM_PRI_GRP_ID: [3, 4] + : + PFC: 1 + LOSSLESS: 1 + + TM_ING_PORT_PRI_GRP: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + TM_PRI_GRP_ID: [2, 3, 4, 6] + : + PFC: 1 + LOSSLESS: 1 + + PC_PFC: + ? + PORT_ID: [[1,4], [204,207]] + : + ENABLE_RX: 1 + ENABLE_TX: 1 + + PC_PFC: + ? + PORT_ID: [[17,20], [34,37], [51,54], [221,224], [238,241], [255,258]] + : + ENABLE_RX: 1 + ENABLE_TX: 1 +... diff --git a/device/arista/x86_64-arista_7060dx5_32/default_sku b/device/arista/x86_64-arista_7060dx5_32/default_sku new file mode 100644 index 000000000000..6636cf97eedb --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/default_sku @@ -0,0 +1 @@ +Arista-7060DX5-32 t1 diff --git a/device/arista/x86_64-arista_7060dx5_32/platform.json b/device/arista/x86_64-arista_7060dx5_32/platform.json new file mode 100644 index 000000000000..e98355e15ada --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/platform.json @@ -0,0 +1,933 @@ +{ + "chassis": { + "name": "DCS-7060DX5-32", + "components": [ + { + "name": "Aboot()" + }, + { + "name": "Scd(addr=0000:00:18.7)" + }, + { + "name": "Scd(addr=0000:01:00.0)" + }, + { + "name": "LorikeetSysCpld(addr=13-0023)" + } + ], + "fans": [], + "fan_drawers": [ + { + "name": "slot1", + "fans": [ + { + "name": "fan1" + }, + { + "name": "fan2" + } + ] + }, + { + "name": "slot2", + "fans": [ + { + "name": "fan3" + }, + { + "name": "fan4" + } + ] + }, + { + "name": "slot3", + "fans": [ + { + "name": "fan5" + }, + { + "name": "fan6" + } + ] + } + ], + "psus": [ + { + "name": "psu1", + "fans": [ + { + "name": "psu1/1", + "speed": { + "controllable": false + } + } + ] + }, + { + "name": "psu2", + "fans": [ + { + "name": "psu2/1", + "speed": { + "controllable": false + } + } + ] + } + ], + "thermals": [ + { + "name": "Cpu temp sensor", + "controllable": false + }, + { + "name": "CPU board temp sensor", + "controllable": false + }, + { + "name": "Back-panel temp sensor", + "controllable": false + }, + { + "name": "Center Rear", + "controllable": false + }, + { + "name": "Switch board right sensor", + "controllable": false + }, + { + "name": "Switch board left sensor", + "controllable": false + }, + { + "name": "Front-panel temp sensor", + "controllable": false + }, + { + "name": "Switch chip diode 1 sensor", + "controllable": false + }, + { + "name": "Switch chip diode 2 sensor", + "controllable": false + } + ], + "sfps": [ + { + "name": "osfp1" + }, + { + "name": "osfp2" + }, + { + "name": "osfp3" + }, + { + "name": "osfp4" + }, + { + "name": "osfp5" + }, + { + "name": "osfp6" + }, + { + "name": "osfp7" + }, + { + "name": "osfp8" + }, + { + "name": "osfp9" + }, + { + "name": "osfp10" + }, + { + "name": "osfp11" + }, + { + "name": "osfp12" + }, + { + "name": "osfp13" + }, + { + "name": "osfp14" + }, + { + "name": "osfp15" + }, + { + "name": "osfp16" + }, + { + "name": "osfp17" + }, + { + "name": "osfp18" + }, + { + "name": "osfp19" + }, + { + "name": "osfp20" + }, + { + "name": "osfp21" + }, + { + "name": "osfp22" + }, + { + "name": "osfp23" + }, + { + "name": "osfp24" + }, + { + "name": "osfp25" + }, + { + "name": "osfp26" + }, + { + "name": "osfp27" + }, + { + "name": "osfp28" + }, + { + "name": "osfp29" + }, + { + "name": "osfp30" + }, + { + "name": "osfp31" + }, + { + "name": "osfp32" + }, + { + "name": "sfp33" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "1,1,1,1,1,1,1,1", + "lanes": "1,2,3,4,5,6,7,8", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet1/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet1/1", + "Ethernet1/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet1/1", + "Ethernet1/3", + "Ethernet1/5", + "Ethernet1/7" + ], + "1x100G(4)": [ + "Ethernet1/1" + ] + } + }, + "Ethernet8": { + "index": "2,2,2,2,2,2,2,2", + "lanes": "9,10,11,12,13,14,15,16", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet2/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet2/1", + "Ethernet2/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet2/1", + "Ethernet2/3", + "Ethernet2/5", + "Ethernet2/7" + ], + "1x100G(4)": [ + "Ethernet2/1" + ] + } + }, + "Ethernet16": { + "index": "3,3,3,3,3,3,3,3", + "lanes": "17,18,19,20,21,22,23,24", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet3/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet3/1", + "Ethernet3/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet3/1", + "Ethernet3/3", + "Ethernet3/5", + "Ethernet3/7" + ], + "1x100G(4)": [ + "Ethernet3/1" + ] + } + }, + "Ethernet24": { + "index": "4,4,4,4,4,4,4,4", + "lanes": "25,26,27,28,29,30,31,32", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet4/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet4/1", + "Ethernet4/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet4/1", + "Ethernet4/3", + "Ethernet4/5", + "Ethernet4/7" + ], + "1x100G(4)": [ + "Ethernet4/1" + ] + } + }, + "Ethernet32": { + "index": "5,5,5,5,5,5,5,5", + "lanes": "33,34,35,36,37,38,39,40", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet5/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet5/1", + "Ethernet5/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet5/1", + "Ethernet5/3", + "Ethernet5/5", + "Ethernet5/7" + ], + "1x100G(4)": [ + "Ethernet5/1" + ] + } + }, + "Ethernet40": { + "index": "6,6,6,6,6,6,6,6", + "lanes": "41,42,43,44,45,46,47,48", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet6/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet6/1", + "Ethernet6/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet6/1", + "Ethernet6/3", + "Ethernet6/5", + "Ethernet6/7" + ], + "1x100G(4)": [ + "Ethernet6/1" + ] + } + }, + "Ethernet48": { + "index": "7,7,7,7,7,7,7,7", + "lanes": "49,50,51,52,53,54,55,56", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet7/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet7/1", + "Ethernet7/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet7/1", + "Ethernet7/3", + "Ethernet7/5", + "Ethernet7/7" + ], + "1x100G(4)": [ + "Ethernet7/1" + ] + } + }, + "Ethernet56": { + "index": "8,8,8,8,8,8,8,8", + "lanes": "57,58,59,60,61,62,63,64", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet8/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet8/1", + "Ethernet8/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet8/1", + "Ethernet8/3", + "Ethernet8/5", + "Ethernet8/7" + ], + "1x100G(4)": [ + "Ethernet8/1" + ] + } + }, + "Ethernet64": { + "index": "9,9,9,9,9,9,9,9", + "lanes": "65,66,67,68,69,70,71,72", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet9/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet9/1", + "Ethernet9/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet9/1", + "Ethernet9/3", + "Ethernet9/5", + "Ethernet9/7" + ], + "1x100G(4)": [ + "Ethernet9/1" + ] + } + }, + "Ethernet72": { + "index": "10,10,10,10,10,10,10,10", + "lanes": "73,74,75,76,77,78,79,80", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet10/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet10/1", + "Ethernet10/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet10/1", + "Ethernet10/3", + "Ethernet10/5", + "Ethernet10/7" + ], + "1x100G(4)": [ + "Ethernet10/1" + ] + } + }, + "Ethernet80": { + "index": "11,11,11,11,11,11,11,11", + "lanes": "81,82,83,84,85,86,87,88", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet11/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet11/1", + "Ethernet11/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet11/1", + "Ethernet11/3", + "Ethernet11/5", + "Ethernet11/7" + ], + "1x100G(4)": [ + "Ethernet11/1" + ] + } + }, + "Ethernet88": { + "index": "12,12,12,12,12,12,12,12", + "lanes": "89,90,91,92,93,94,95,96", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet12/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet12/1", + "Ethernet12/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet12/1", + "Ethernet12/3", + "Ethernet12/5", + "Ethernet12/7" + ], + "1x100G(4)": [ + "Ethernet12/1" + ] + } + }, + "Ethernet96": { + "index": "13,13,13,13,13,13,13,13", + "lanes": "97,98,99,100,101,102,103,104", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet13/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet13/1", + "Ethernet13/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet13/1", + "Ethernet13/3", + "Ethernet13/5", + "Ethernet13/7" + ], + "1x100G(4)": [ + "Ethernet13/1" + ] + } + }, + "Ethernet104": { + "index": "14,14,14,14,14,14,14,14", + "lanes": "105,106,107,108,109,110,111,112", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet14/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet14/1", + "Ethernet14/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet14/1", + "Ethernet14/3", + "Ethernet14/5", + "Ethernet14/7" + ], + "1x100G(4)": [ + "Ethernet14/1" + ] + } + }, + "Ethernet112": { + "index": "15,15,15,15,15,15,15,15", + "lanes": "113,114,115,116,117,118,119,120", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet15/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet15/1", + "Ethernet15/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet15/1", + "Ethernet15/3", + "Ethernet15/5", + "Ethernet15/7" + ], + "1x100G(4)": [ + "Ethernet15/1" + ] + } + }, + "Ethernet120": { + "index": "16,16,16,16,16,16,16,16", + "lanes": "121,122,123,124,125,126,127,128", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet16/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet16/1", + "Ethernet16/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet16/1", + "Ethernet16/3", + "Ethernet16/5", + "Ethernet16/7" + ], + "1x100G(4)": [ + "Ethernet16/1" + ] + } + }, + "Ethernet128": { + "index": "17,17,17,17,17,17,17,17", + "lanes": "385,386,387,388,389,390,391,392", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet17/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet17/1", + "Ethernet17/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet17/1", + "Ethernet17/3", + "Ethernet17/5", + "Ethernet17/7" + ], + "1x100G(4)": [ + "Ethernet17/1" + ] + } + }, + "Ethernet136": { + "index": "18,18,18,18,18,18,18,18", + "lanes": "393,394,395,396,397,398,399,400", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet18/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet18/1", + "Ethernet18/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet18/1", + "Ethernet18/3", + "Ethernet18/5", + "Ethernet18/7" + ], + "1x100G(4)": [ + "Ethernet18/1" + ] + } + }, + "Ethernet144": { + "index": "19,19,19,19,19,19,19,19", + "lanes": "401,402,403,404,405,406,407,408", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet19/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet19/1", + "Ethernet19/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet19/1", + "Ethernet19/3", + "Ethernet19/5", + "Ethernet19/7" + ], + "1x100G(4)": [ + "Ethernet19/1" + ] + } + }, + "Ethernet152": { + "index": "20,20,20,20,20,20,20,20", + "lanes": "409,410,411,412,413,414,415,416", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet20/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet20/1", + "Ethernet20/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet20/1", + "Ethernet20/3", + "Ethernet20/5", + "Ethernet20/7" + ], + "1x100G(4)": [ + "Ethernet20/1" + ] + } + }, + "Ethernet160": { + "index": "21,21,21,21,21,21,21,21", + "lanes": "417,418,419,420,421,422,423,424", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet21/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet21/1", + "Ethernet21/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet21/1", + "Ethernet21/3", + "Ethernet21/5", + "Ethernet21/7" + ], + "1x100G(4)": [ + "Ethernet21/1" + ] + } + }, + "Ethernet168": { + "index": "22,22,22,22,22,22,22,22", + "lanes": "425,426,427,428,429,430,431,432", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet22/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet22/1", + "Ethernet22/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet22/1", + "Ethernet22/3", + "Ethernet22/5", + "Ethernet22/7" + ], + "1x100G(4)": [ + "Ethernet22/1" + ] + } + }, + "Ethernet176": { + "index": "23,23,23,23,23,23,23,23", + "lanes": "433,434,435,436,437,438,439,440", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet23/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet23/1", + "Ethernet23/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet23/1", + "Ethernet23/3", + "Ethernet23/5", + "Ethernet23/7" + ], + "1x100G(4)": [ + "Ethernet23/1" + ] + } + }, + "Ethernet184": { + "index": "24,24,24,24,24,24,24,24", + "lanes": "441,442,443,444,445,446,447,448", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet24/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet24/1", + "Ethernet24/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet24/1", + "Ethernet24/3", + "Ethernet24/5", + "Ethernet24/7" + ], + "1x100G(4)": [ + "Ethernet24/1" + ] + } + }, + "Ethernet192": { + "index": "25,25,25,25,25,25,25,25", + "lanes": "449,450,451,452,453,454,455,456", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet25/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet25/1", + "Ethernet25/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet25/1", + "Ethernet25/3", + "Ethernet25/5", + "Ethernet25/7" + ], + "1x100G(4)": [ + "Ethernet25/1" + ] + } + }, + "Ethernet200": { + "index": "26,26,26,26,26,26,26,26", + "lanes": "457,458,459,460,461,462,463,464", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet26/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet26/1", + "Ethernet26/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet26/1", + "Ethernet26/3", + "Ethernet26/5", + "Ethernet26/7" + ], + "1x100G(4)": [ + "Ethernet26/1" + ] + } + }, + "Ethernet208": { + "index": "27,27,27,27,27,27,27,27", + "lanes": "465,466,467,468,469,470,471,472", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet27/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet27/1", + "Ethernet27/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet27/1", + "Ethernet27/3", + "Ethernet27/5", + "Ethernet27/7" + ], + "1x100G(4)": [ + "Ethernet27/1" + ] + } + }, + "Ethernet216": { + "index": "28,28,28,28,28,28,28,28", + "lanes": "473,474,475,476,477,478,479,480", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet28/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet28/1", + "Ethernet28/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet28/1", + "Ethernet28/3", + "Ethernet28/5", + "Ethernet28/7" + ], + "1x100G(4)": [ + "Ethernet28/1" + ] + } + }, + "Ethernet224": { + "index": "29,29,29,29,29,29,29,29", + "lanes": "481,482,483,484,485,486,487,488", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet29/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet29/1", + "Ethernet29/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet29/1", + "Ethernet29/3", + "Ethernet29/5", + "Ethernet29/7" + ], + "1x100G(4)": [ + "Ethernet29/1" + ] + } + }, + "Ethernet232": { + "index": "30,30,30,30,30,30,30,30", + "lanes": "489,490,491,492,493,494,495,496", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet30/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet30/1", + "Ethernet30/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet30/1", + "Ethernet30/3", + "Ethernet30/5", + "Ethernet30/7" + ], + "1x100G(4)": [ + "Ethernet30/1" + ] + } + }, + "Ethernet240": { + "index": "31,31,31,31,31,31,31,31", + "lanes": "497,498,499,500,501,502,503,504", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet31/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet31/1", + "Ethernet31/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet31/1", + "Ethernet31/3", + "Ethernet31/5", + "Ethernet31/7" + ], + "1x100G(4)": [ + "Ethernet31/1" + ] + } + }, + "Ethernet248": { + "index": "32,32,32,32,32,32,32,32", + "lanes": "505,506,507,508,509,510,511,512", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet32/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet32/1", + "Ethernet32/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet32/1", + "Ethernet32/3", + "Ethernet32/5", + "Ethernet32/7" + ], + "1x100G(4)": [ + "Ethernet32/1" + ] + } + }, + "Ethernet256": { + "index": "33", + "lanes": "513", + "breakout_modes": { + "1x10G": [ + "Ethernet33" + ] + } + } + } +} diff --git a/device/arista/x86_64-arista_7060dx5_32/platform_asic b/device/arista/x86_64-arista_7060dx5_32/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/arista/x86_64-arista_7060dx5_32/platform_components.json b/device/arista/x86_64-arista_7060dx5_32/platform_components.json new file mode 100644 index 000000000000..26c3bafc31a8 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/platform_components.json @@ -0,0 +1,12 @@ +{ + "chassis": { + "DCS-7060DX5-32": { + "component": { + "Aboot()": {}, + "Scd(addr=0000:00:18.7)": {}, + "Scd(addr=0000:01:00.0)": {}, + "LorikeetSysCpld(addr=13-0023)": {} + } + } + } +} diff --git a/device/arista/x86_64-arista_7060dx5_32/platform_env.conf b/device/arista/x86_64-arista_7060dx5_32/platform_env.conf new file mode 100644 index 000000000000..dd7cf4fe01c5 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/platform_env.conf @@ -0,0 +1,2 @@ +SYNCD_SHM_SIZE=512m +is_ltsw_chip=1 diff --git a/device/arista/x86_64-arista_7060dx5_32/platform_reboot b/device/arista/x86_64-arista_7060dx5_32/platform_reboot new file mode 120000 index 000000000000..7f94a49e38b0 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/platform_reboot @@ -0,0 +1 @@ +../x86_64-arista_common/platform_reboot \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/plugins b/device/arista/x86_64-arista_7060dx5_32/plugins new file mode 120000 index 000000000000..5fbbf98a6284 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/plugins @@ -0,0 +1 @@ +../x86_64-arista_common/plugins/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/pmon_daemon_control.json b/device/arista/x86_64-arista_7060dx5_32/pmon_daemon_control.json new file mode 120000 index 000000000000..51d5ab7b0059 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/pmon_daemon_control.json @@ -0,0 +1 @@ +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/sensors.conf b/device/arista/x86_64-arista_7060dx5_32/sensors.conf new file mode 100644 index 000000000000..ba4e8045c5f7 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/sensors.conf @@ -0,0 +1,36 @@ +# libsensors configuration file for DCS-7060DX4-32 +# ------------------------------------------------# + +bus "i2c-9" "SCD 0000:00:18.7 SMBus master 0 bus 0" +bus "i2c-29" "SCD 0000:01:00.0 SMBus master 1 bus 0" +bus "i2c-32" "SCD 0000:01:00.0 SMBus master 1 bus 3" +bus "i2c-33" "SCD 0000:01:00.0 SMBus master 1 bus 4" + +chip "max6658-i2c-9-4c" + label temp1 "CPU board temp sensor" + label temp2 "Back-panel temp sensor" + +chip "max6581-i2c-29-4d" + label temp1 "Center Rear" + label temp2 "Switch board right sensor" + label temp3 "Switch board left sensor" + label temp4 "Front-panel temp sensor" + label temp5 "Switch chip diode 1 sensor" + label temp6 "Switch chip diode 2 sensor" + ignore temp7 + ignore temp8 + +chip "pmbus-i2c-32-58" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 exhaust temp sensor" + ignore fan2 + ignore fan3 + +chip "pmbus-i2c-33-58" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 exhaust temp sensor" + ignore fan2 + ignore fan3 + diff --git a/device/arista/x86_64-arista_7060dx5_32/system_health_monitoring_config.json b/device/arista/x86_64-arista_7060dx5_32/system_health_monitoring_config.json new file mode 120000 index 000000000000..1185f771fa8e --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/system_health_monitoring_config.json @@ -0,0 +1 @@ +../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_32/thermal_policy.json b/device/arista/x86_64-arista_7060dx5_32/thermal_policy.json new file mode 120000 index 000000000000..0991dc7f3638 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_32/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/common/profiles/th4/gen/BALANCED/buffers_defaults_t0.j2 b/device/common/profiles/th4/gen/BALANCED/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..2bd54b00be50 --- /dev/null +++ b/device/common/profiles/th4/gen/BALANCED/buffers_defaults_t0.j2 @@ -0,0 +1,46 @@ +{%- set default_cable = '5m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,256,8) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "37333333", + "type": "ingress", + "mode": "dynamic", + "xoff": "24000000" + }, + "egress_lossy_pool": { + "size": "34000000", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "56000000", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"56000000" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th4/gen/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th4/gen/BALANCED/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..2bd54b00be50 --- /dev/null +++ b/device/common/profiles/th4/gen/BALANCED/buffers_defaults_t1.j2 @@ -0,0 +1,46 @@ +{%- set default_cable = '5m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,256,8) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "37333333", + "type": "ingress", + "mode": "dynamic", + "xoff": "24000000" + }, + "egress_lossy_pool": { + "size": "34000000", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "56000000", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"56000000" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th4/gen/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th4/gen/BALANCED/pg_profile_lookup.ini new file mode 100644 index 000000000000..673df369a9bb --- /dev/null +++ b/device/common/profiles/th4/gen/BALANCED/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 90272 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 53248 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 96096 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index c35302e126e3..898eb0bcdde3 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -554,6 +554,9 @@ write_platform_specific_cmdline() { if [ "$sid" = "BlackhawkT4DD" ]; then aboot_machine=arista_7050dx4_32s fi + if [ "$sid" = "BlackhawkTH4DD" ] || [ "$sid" = "BlackhawkTh4Dd" ]; then + aboot_machine=arista_7060dx5_32 + fi if [ "$sid" = "Smartsville" ]; then aboot_machine=arista_7280cr3_32p4 fi From 642350c524e4b4f08b6bf94a2fde9c77d08eff7d Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sun, 6 Aug 2023 16:32:34 +0800 Subject: [PATCH 103/145] [submodule] Update submodule sonic-swss-common to the latest HEAD automatically (#16031) #### Why I did it src/sonic-swss-common ``` * be425ed - (HEAD -> master, origin/master, origin/HEAD) [redisCommand]: Not store the error return code of redisFormat (#809) (2 days ago) [Ze Gan] * 5966d8b - Fix binary serializer can't deserialize protopuf buffer content issue (#810) (3 days ago) [Hua Liu] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 7ff768a72e6f..be425ede57b4 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 7ff768a72e6fbfc02ac1052b00e49690fc9d4f1b +Subproject commit be425ede57b4412c51b240f285d80a10c40fa077 From 9fba98ce6da2b5fe98df0ef4bc61568e589aaa0a Mon Sep 17 00:00:00 2001 From: Vadym Hlushko <62022266+vadymhlushko-mlnx@users.noreply.github.com> Date: Mon, 7 Aug 2023 08:30:33 +0300 Subject: [PATCH 104/145] [syncd.sh] Clear semaphore before updating firmware (#15818) Why I did it The hw resources should be released before updating firmware. How I did it Added logic to release hw resources in syncd.sh script Signed-off-by: Vadym Hlushko --- files/scripts/syncd.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index 8aacfe8f6c1a..827be1463f6a 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -2,6 +2,18 @@ . /usr/local/bin/syncd_common.sh +declare -r UNKN_MST="unknown" + +function GetMstDevice() { + local _MST_DEVICE="$(ls /dev/mst/*_pci_cr0 2>&1)" + + if [[ ! -c "${_MST_DEVICE}" ]]; then + echo "${UNKN_MST}" + else + echo "${_MST_DEVICE}" + fi +} + function startplatform() { # platform specific tasks @@ -23,6 +35,12 @@ function startplatform() { debug "Starting Firmware update procedure" /usr/bin/mst start --with_i2cdev + + local -r _MST_DEVICE="$(GetMstDevice)" + if [[ "${_MST_DEVICE}" != "${UNKN_MST}" ]]; then + /usr/bin/flint -d $_MST_DEVICE --clear_semaphore + fi + /usr/bin/mlnx-fw-upgrade.sh /etc/init.d/sxdkernel restart debug "Firmware update procedure ended" From c6d1dae7414d09b6a97b0703d9c63bd7ef0a5323 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Sun, 6 Aug 2023 22:36:33 -0700 Subject: [PATCH 105/145] Fix the Loopback0 IPv6 address of LC's in chassis not reachable from (#16026) What I did: Fix the Loopback0 IPv6 address of LC's in chassis not reachable from peer devices. Why I did: For Ipv6 Loopback0 address we only advertise /64 subnet to the peer devices. However, in case of chassis each LC will have it own /128 address of that /64 subnet . Since this /128 address does not get advertised peer devices can-not ping/reach the LC's loopback0. How I fix: Advertise /128 Loopback0 Ipv6 address only between i-BGP peers. This way even though /64 is advertised to e-BGP peer devices when packet reaches any of LC's it can reach the appropriate LC's. How I verify: Manual verification UT added for same. Signed-off-by: Abhishek Dosi --- dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 | 3 +++ .../data/sonic-cfggen/bgpd.main.conf.j2/packet_chassis.conf | 1 + .../tests/data/sonic-cfggen/bgpd.main.conf.j2/voq_chassis.conf | 1 + 3 files changed, 5 insertions(+) diff --git a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 index 1e564579e30f..793ab055c215 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 @@ -104,6 +104,9 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/128 {% else %} network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/64 +{% if DEVICE_METADATA['localhost']['switch_type'] == 'voq' or DEVICE_METADATA['localhost']['switch_type'] == 'chassis-packet' %} + network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/128 route-map HIDE_INTERNAL +{% endif %} {% endif %} exit-address-family {% endif %} diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/packet_chassis.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/packet_chassis.conf index 0f7f227e0e2c..6b2e1f257948 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/packet_chassis.conf +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/packet_chassis.conf @@ -47,6 +47,7 @@ router bgp 55555 ! address-family ipv6 network fc00::1/64 + network fc00::1/128 route-map HIDE_INTERNAL exit-address-family ! network 10.10.10.1/24 diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/voq_chassis.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/voq_chassis.conf index ef28d67c1c9d..efd45eda1ea9 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/voq_chassis.conf +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/voq_chassis.conf @@ -48,6 +48,7 @@ router bgp 55555 ! address-family ipv6 network fc00::1/64 + network fc00::1/128 route-map HIDE_INTERNAL exit-address-family address-family ipv6 network fc00::2/128 route-map HIDE_INTERNAL From 7bdd0d8011b9bb9323920818aeeb87dca792694b Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 7 Aug 2023 09:45:13 -0700 Subject: [PATCH 106/145] [frr]: FRR 8.5.1 integration changes (#15965) Why I did it Upgrading FRR 8.5.1 to include latest fixes. New patches that were added: Patch FRR Pull request Issue fixed 0012-zebra-Rename-vrf_lookup_by_tableid-to-zebra_vrf_look.patch FRRouting/frr#13396 #14866 0013-zebra-Move-protodown_r_bit-to-a-better-spot.patch FRRouting/frr#13396 #14866 0014-zebra-Remove-unused-dplane_intf_delete.patch FRRouting/frr#13396 #14866 0015-zebra-Remove-unused-add-variable.patch FRRouting/frr#13396 #14866 0016-zebra-Remove-duplicate-function-for-netlink-interfac.patch FRRouting/frr#13396 #14866 0017-zebra-Add-code-to-get-set-interface-to-pass-up-from-.patch FRRouting/frr#13396 #14866 0018-zebra-Use-zebra-dplane-for-RTM-link-and-addr.patch FRRouting/frr#13396 #14866 0019-zebra-Abstract-dplane_ctx_route_init-to-init-route-w.patch FRRouting/frr#13757 FRRouting/frr#13754 00020-zebra-Fix-crash-when-dplane_fpm_nl-fails-to-process-.patch FRRouting/frr#13757 FRRouting/frr#13754 Removed patches: Patch Upstream FRR commit that is present in 8.5.1 0001-Add-support-of-bgp-tcp-DSCP-value.patch FRRouting/frr@425bd64 0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch FRRouting/frr@2f71996 0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch FRRouting/frr@8e89adc 0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch FRRouting/frr@d2aeac3 , FRRouting/frr@49efc80, FRRouting/frr@ff6db10 0013-zebra-fix-dplane-fpm-nl-to-allow-for-fast-configuration.patch FRRouting/frr@551fa8c 0014-bgpd-Allow-network-XXX-to-work-with-bgp-suppress-fib.patch FRRouting/frr@4801fc4 0015-zebra-Return-statements-do-not-use-paranthesis.patch FRRouting/frr@871a16c 0016-zebra-Add-zrouter.asic_notification_nexthop_control.patch FRRouting/frr@06525c4 0017-zebra-Re-arrange-fpm_read-to-reduce-code-duplication.patch FRRouting/frr@7d83e13 0018-zebra-Add-dplane_ctx_get-set_flags.patch FRRouting/frr@10388e9 0019-zebra-Rearrange-dplane_ctx_route_init.patch FRRouting/frr@f935122 0020-zebra-Add-ctx-to-netlink-message-parsing.patch FRRouting/frr@45f0a10 0021-zebra-Read-from-the-dplane_fpm_nl-a-route-update.patch FRRouting/frr@a0e1173 0022-zebra-Fix-code-because-missing-backport.patch FRRouting/frr@07fd1f7 0024-zebra-continue-fpm-read-when-we-decide-a-netlink-message-is-not-needed.patch FRRouting/frr@c0275ab 0025-zebra-Send-nht-resolved-entry-up-to-concerned-protoc.patch FRRouting/frr@8ce0e51 0027-bgpd-Ensure-FRR-has-enough-data-to-read-in-peek_for_as4_capability-and-bgp_open_option_parse.patch FRRouting/frr@3e46b43 0028-bgpd-Ensure-that-bgp-open-message-stream-has-enough-data-to-read.patch FRRouting/frr@766eec1 Realigned patches: Old Patch New patch 0002-Reduce-severity-of-Vty-connected-from-message.patch 0001-Reduce-severity-of-Vty-connected-from-message.patch 0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch 0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch 0005-nexthops-compare-vrf-only-if-ip-type.patch 0003-nexthops-compare-vrf-only-if-ip-type.patch 0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch 0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch 0007-Add-support-of-bgp-l3vni-evpn.patch 0005-Add-support-of-bgp-l3vni-evpn.patch 0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch 0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch 0009-ignore-route-from-default-table.patch 0007-ignore-route-from-default-table.patch 0009-ignore-route-from-default-table.patch 0007-ignore-route-from-default-table.patch 0023-Use-vrf_id-for-vrf-not-tabled_id.patch 0008-Use-vrf_id-for-vrf-not-tabled_id.patch 0026-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch 0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch 0029-bgpd-Change-log-level-for-graceful-restart-events.patch 0010-bgpd-Change-log-level-for-graceful-restart-events.patch 0030-zebra-Static-routes-async-notification-do-not-need-t.patch 0011-zebra-Static-routes-async-notification-do-not-need-t.patch How I did it Upgrade FRR submodule. Align the patches. Integrate new patches to fix issues. How to verify it Run sonic-mgmt regression to verify --- .gitmodules | 2 +- rules/frr.mk | 6 +- src/sonic-frr/frr | 2 +- ...01-Add-support-of-bgp-tcp-DSCP-value.patch | 141 -- ...erity-of-Vty-connected-from-message.patch} | 17 +- ...EXT_HOP-to-be-0.0.0.0-due-to-allevia.patch | 25 + ...exthops-compare-vrf-only-if-ip-type.patch} | 19 +- ...EXT_HOP-to-be-0.0.0.0-due-to-allevia.patch | 27 - ...r-log-outchannel-to-var-log-frr.log.patch} | 27 +- ... 0005-Add-support-of-bgp-l3vni-evpn.patch} | 52 +- ...et-for-bgp-ipv6-link-local-neighbors.patch | 28 + ...007-ignore-route-from-default-table.patch} | 21 +- ...et-for-bgp-ipv6-link-local-neighbors.patch | 29 - ...08-Use-vrf_id-for-vrf-not-tabled_id.patch} | 20 +- ...ess-fib-pending-works-with-network-.patch} | 45 +- ...og-level-for-graceful-restart-events.patch | 116 + ...the-netlink-DUMP-command-is-interrup.patch | 45 - ...pability-is-always-turned-on-for-int.patch | 36 - ...tes-async-notification-do-not-need-t.patch | 99 + ...e-cannot-accidently-write-into-stack.patch | 108 - ..._lookup_by_tableid-to-zebra_vrf_look.patch | 147 ++ ...ove-protodown_r_bit-to-a-better-spot.patch | 181 ++ ...m-nl-to-allow-for-fast-configuration.patch | 62 - ...rk-XXX-to-work-with-bgp-suppress-fib.patch | 190 -- ...bra-Remove-unused-dplane_intf_delete.patch | 48 + ...015-zebra-Remove-unused-add-variable.patch | 53 + ...rn-statements-do-not-use-paranthesis.patch | 27 - ...er.asic_notification_nexthop_control.patch | 205 -- ...licate-function-for-netlink-interfac.patch | 301 +++ ...o-get-set-interface-to-pass-up-from-.patch | 809 +++++++ ...-fpm_read-to-reduce-code-duplication.patch | 56 - ...8-zebra-Add-dplane_ctx_get-set_flags.patch | 78 - ...e-zebra-dplane-for-RTM-link-and-addr.patch | 2154 +++++++++++++++++ ...plane_ctx_route_init-to-init-route-w.patch | 74 + ...ebra-Rearrange-dplane_ctx_route_init.patch | 135 -- ...a-Add-ctx-to-netlink-message-parsing.patch | 155 -- ...when-dplane_fpm_nl-fails-to-process-.patch | 50 + ...rom-the-dplane_fpm_nl-a-route-update.patch | 289 --- ...ra-Fix-code-because-missing-backport.patch | 100 - ...cide-a-netlink-message-is-not-needed.patch | 31 - ...esolved-entry-up-to-concerned-protoc.patch | 49 - ...capability-and-bgp_open_option_parse.patch | 130 - ...ssage-stream-has-enough-data-to-read.patch | 47 - ...og-level-for-graceful-restart-events.patch | 122 - ...tes-async-notification-do-not-need-t.patch | 46 - ...ble-ipv6-src-address-test-in-pceplib.patch | 14 +- .../patch/cross-compile-changes.patch | 77 +- src/sonic-frr/patch/series | 49 +- 48 files changed, 4243 insertions(+), 2301 deletions(-) delete mode 100644 src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch rename src/sonic-frr/patch/{0002-Reduce-severity-of-Vty-connected-from-message.patch => 0001-Reduce-severity-of-Vty-connected-from-message.patch} (52%) create mode 100644 src/sonic-frr/patch/0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch rename src/sonic-frr/patch/{0005-nexthops-compare-vrf-only-if-ip-type.patch => 0003-nexthops-compare-vrf-only-if-ip-type.patch} (75%) delete mode 100644 src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch rename src/sonic-frr/patch/{0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch => 0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch} (60%) rename src/sonic-frr/patch/{0007-Add-support-of-bgp-l3vni-evpn.patch => 0005-Add-support-of-bgp-l3vni-evpn.patch} (78%) create mode 100644 src/sonic-frr/patch/0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch rename src/sonic-frr/patch/{0009-ignore-route-from-default-table.patch => 0007-ignore-route-from-default-table.patch} (68%) delete mode 100644 src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch rename src/sonic-frr/patch/{0023-Use-vrf_id-for-vrf-not-tabled_id.patch => 0008-Use-vrf_id-for-vrf-not-tabled_id.patch} (84%) rename src/sonic-frr/patch/{0026-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch => 0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch} (80%) create mode 100644 src/sonic-frr/patch/0010-bgpd-Change-log-level-for-graceful-restart-events.patch delete mode 100644 src/sonic-frr/patch/0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch delete mode 100644 src/sonic-frr/patch/0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch create mode 100644 src/sonic-frr/patch/0011-zebra-Static-routes-async-notification-do-not-need-t.patch delete mode 100644 src/sonic-frr/patch/0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch create mode 100644 src/sonic-frr/patch/0012-zebra-Rename-vrf_lookup_by_tableid-to-zebra_vrf_look.patch create mode 100644 src/sonic-frr/patch/0013-zebra-Move-protodown_r_bit-to-a-better-spot.patch delete mode 100644 src/sonic-frr/patch/0013-zebra-fix-dplane-fpm-nl-to-allow-for-fast-configuration.patch delete mode 100644 src/sonic-frr/patch/0014-bgpd-Allow-network-XXX-to-work-with-bgp-suppress-fib.patch create mode 100644 src/sonic-frr/patch/0014-zebra-Remove-unused-dplane_intf_delete.patch create mode 100644 src/sonic-frr/patch/0015-zebra-Remove-unused-add-variable.patch delete mode 100755 src/sonic-frr/patch/0015-zebra-Return-statements-do-not-use-paranthesis.patch delete mode 100755 src/sonic-frr/patch/0016-zebra-Add-zrouter.asic_notification_nexthop_control.patch create mode 100644 src/sonic-frr/patch/0016-zebra-Remove-duplicate-function-for-netlink-interfac.patch create mode 100644 src/sonic-frr/patch/0017-zebra-Add-code-to-get-set-interface-to-pass-up-from-.patch delete mode 100755 src/sonic-frr/patch/0017-zebra-Re-arrange-fpm_read-to-reduce-code-duplication.patch delete mode 100755 src/sonic-frr/patch/0018-zebra-Add-dplane_ctx_get-set_flags.patch create mode 100644 src/sonic-frr/patch/0018-zebra-Use-zebra-dplane-for-RTM-link-and-addr.patch create mode 100644 src/sonic-frr/patch/0019-zebra-Abstract-dplane_ctx_route_init-to-init-route-w.patch delete mode 100755 src/sonic-frr/patch/0019-zebra-Rearrange-dplane_ctx_route_init.patch delete mode 100755 src/sonic-frr/patch/0020-zebra-Add-ctx-to-netlink-message-parsing.patch create mode 100644 src/sonic-frr/patch/0020-zebra-Fix-crash-when-dplane_fpm_nl-fails-to-process-.patch delete mode 100755 src/sonic-frr/patch/0021-zebra-Read-from-the-dplane_fpm_nl-a-route-update.patch delete mode 100755 src/sonic-frr/patch/0022-zebra-Fix-code-because-missing-backport.patch delete mode 100644 src/sonic-frr/patch/0024-zebra-continue-fpm-read-when-we-decide-a-netlink-message-is-not-needed.patch delete mode 100644 src/sonic-frr/patch/0025-zebra-Send-nht-resolved-entry-up-to-concerned-protoc.patch delete mode 100644 src/sonic-frr/patch/0027-bgpd-Ensure-FRR-has-enough-data-to-read-in-peek_for_as4_capability-and-bgp_open_option_parse.patch delete mode 100644 src/sonic-frr/patch/0028-bgpd-Ensure-that-bgp-open-message-stream-has-enough-data-to-read.patch delete mode 100644 src/sonic-frr/patch/0029-bgpd-Change-log-level-for-graceful-restart-events.patch delete mode 100644 src/sonic-frr/patch/0030-zebra-Static-routes-async-notification-do-not-need-t.patch diff --git a/.gitmodules b/.gitmodules index 56fcd2eb0865..b91c3e8aaa67 100644 --- a/.gitmodules +++ b/.gitmodules @@ -46,7 +46,7 @@ [submodule "src/sonic-frr/frr"] path = src/sonic-frr/frr url = https://github.com/sonic-net/sonic-frr.git - branch = frr/8.2 + branch = frr/8.5 [submodule "platform/p4/p4-hlir/p4-hlir-v1.1"] path = platform/p4/p4-hlir/p4-hlir-v1.1 url = https://github.com/p4lang/p4-hlir.git diff --git a/rules/frr.mk b/rules/frr.mk index 7bc5cc8024f0..b062016fbc09 100644 --- a/rules/frr.mk +++ b/rules/frr.mk @@ -1,9 +1,9 @@ # FRRouting (frr) package -FRR_VERSION = 8.2.2 +FRR_VERSION = 8.5.1 FRR_SUBVERSION = 0 -FRR_BRANCH = frr/8.2 -FRR_TAG = frr-8.2.2 +FRR_BRANCH = frr/8.5 +FRR_TAG = frr-8.5.1 export FRR_VERSION FRR_SUBVERSION FRR_BRANCH FRR_TAG diff --git a/src/sonic-frr/frr b/src/sonic-frr/frr index 79188bf710e9..7a2b85ae52b3 160000 --- a/src/sonic-frr/frr +++ b/src/sonic-frr/frr @@ -1 +1 @@ -Subproject commit 79188bf710e92acf42fb5b9b0a2e9593a5ee9b05 +Subproject commit 7a2b85ae52b354248fa9da04100efba0ec6c70c9 diff --git a/src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch b/src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch deleted file mode 100644 index ba5668394385..000000000000 --- a/src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 4ab192df23362e64d1a11441fae82329388f103e Mon Sep 17 00:00:00 2001 -From: Pavel Shirshov -Date: Mon, 16 Nov 2020 18:00:12 -0800 -Subject: [PATCH 1/8] Add support of bgp tcp DSCP value - ---- - bgpd/bgp_network.c | 11 ++++------- - bgpd/bgp_vty.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ - bgpd/bgpd.c | 1 + - bgpd/bgpd.h | 3 +++ - 4 files changed, 52 insertions(+), 7 deletions(-) - -diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c -index 3fb7619ed..70c771683 100644 ---- a/bgpd/bgp_network.c -+++ b/bgpd/bgp_network.c -@@ -743,11 +743,9 @@ int bgp_connect(struct peer *peer) - #ifdef IPTOS_PREC_INTERNETCONTROL - frr_with_privs(&bgpd_privs) { - if (sockunion_family(&peer->su) == AF_INET) -- setsockopt_ipv4_tos(peer->fd, -- IPTOS_PREC_INTERNETCONTROL); -+ setsockopt_ipv4_tos(peer->fd, peer->bgp->tcp_dscp); - else if (sockunion_family(&peer->su) == AF_INET6) -- setsockopt_ipv6_tclass(peer->fd, -- IPTOS_PREC_INTERNETCONTROL); -+ setsockopt_ipv6_tclass(peer->fd, peer->bgp->tcp_dscp); - } - #endif - -@@ -824,10 +822,9 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen, - - #ifdef IPTOS_PREC_INTERNETCONTROL - if (sa->sa_family == AF_INET) -- setsockopt_ipv4_tos(sock, IPTOS_PREC_INTERNETCONTROL); -+ setsockopt_ipv4_tos(sock, bgp->tcp_dscp); - else if (sa->sa_family == AF_INET6) -- setsockopt_ipv6_tclass(sock, -- IPTOS_PREC_INTERNETCONTROL); -+ setsockopt_ipv6_tclass(sock, bgp->tcp_dscp); - #endif - - sockopt_v6only(sa->sa_family, sock); -diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c -index 4df2abef8..950d1d25c 100644 ---- a/bgpd/bgp_vty.c -+++ b/bgpd/bgp_vty.c -@@ -1558,6 +1558,42 @@ DEFUN (no_router_bgp, - return CMD_SUCCESS; - } - -+/* bgp session-dscp */ -+ -+DEFUN (bgp_session_dscp, -+ bgp_session_dscp_cmd, -+ "bgp session-dscp DSCP", -+ BGP_STR -+ "Override default (C0) bgp TCP session DSCP value\n" -+ "Manually configured dscp parameter\n") -+{ -+ struct bgp *bgp = VTY_GET_CONTEXT(bgp); -+ -+ uint8_t value = (uint8_t)strtol(argv[2]->arg, NULL, 16); -+ if ((value == 0 && errno == EINVAL) || (value > 0x3f)) -+ { -+ vty_out (vty, "%% Malformed bgp session-dscp parameter\n"); -+ return CMD_WARNING_CONFIG_FAILED; -+ } -+ -+ bgp->tcp_dscp = value << 2; -+ -+ return CMD_SUCCESS; -+} -+ -+DEFUN (no_bgp_session_dscp, -+ no_bgp_session_dscp_cmd, -+ "no bgp session-dscp", -+ NO_STR -+ BGP_STR -+ "Override default (C0) bgp tcp session ip dscp value\n") -+{ -+ struct bgp *bgp = VTY_GET_CONTEXT(bgp); -+ -+ bgp->tcp_dscp = IPTOS_PREC_INTERNETCONTROL; -+ -+ return CMD_SUCCESS; -+} - - /* BGP router-id. */ - -@@ -17053,6 +17089,10 @@ int bgp_config_write(struct vty *vty) - if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER)) - vty_out(vty, " no bgp fast-external-failover\n"); - -+ /* BGP session DSCP value */ -+ if (bgp->tcp_dscp != IPTOS_PREC_INTERNETCONTROL) -+ vty_out(vty, " bgp session-dscp %02X\n", bgp->tcp_dscp >> 2); -+ - /* BGP router ID. */ - if (bgp->router_id_static.s_addr != INADDR_ANY) - vty_out(vty, " bgp router-id %pI4\n", -@@ -17662,6 +17702,10 @@ void bgp_vty_init(void) - /* "no router bgp" commands. */ - install_element(CONFIG_NODE, &no_router_bgp_cmd); - -+ /* "bgp session-dscp command */ -+ install_element (BGP_NODE, &bgp_session_dscp_cmd); -+ install_element (BGP_NODE, &no_bgp_session_dscp_cmd); -+ - /* "bgp router-id" commands. */ - install_element(BGP_NODE, &bgp_router_id_cmd); - install_element(BGP_NODE, &no_bgp_router_id_cmd); -diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c -index 7e528b219..005523544 100644 ---- a/bgpd/bgpd.c -+++ b/bgpd/bgpd.c -@@ -3229,6 +3229,7 @@ static struct bgp *bgp_create(as_t *as, const char *name, - bgp->evpn_info = XCALLOC(MTYPE_BGP_EVPN_INFO, - sizeof(struct bgp_evpn_info)); - -+ bgp->tcp_dscp = IPTOS_PREC_INTERNETCONTROL; - bgp_evpn_init(bgp); - bgp_evpn_vrf_es_init(bgp); - bgp_pbr_init(bgp); -diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h -index 8b93c450e..e780d8a03 100644 ---- a/bgpd/bgpd.h -+++ b/bgpd/bgpd.h -@@ -743,6 +743,9 @@ struct bgp { - /* Weighted ECMP related config. */ - enum bgp_link_bw_handling lb_handling; - -+ /* dscp value for tcp sessions */ -+ uint8_t tcp_dscp; -+ - /* Process Queue for handling routes */ - struct work_queue *process_queue; - --- -2.12.2 - diff --git a/src/sonic-frr/patch/0002-Reduce-severity-of-Vty-connected-from-message.patch b/src/sonic-frr/patch/0001-Reduce-severity-of-Vty-connected-from-message.patch similarity index 52% rename from src/sonic-frr/patch/0002-Reduce-severity-of-Vty-connected-from-message.patch rename to src/sonic-frr/patch/0001-Reduce-severity-of-Vty-connected-from-message.patch index 764d38463289..3aafe4c93d03 100644 --- a/src/sonic-frr/patch/0002-Reduce-severity-of-Vty-connected-from-message.patch +++ b/src/sonic-frr/patch/0001-Reduce-severity-of-Vty-connected-from-message.patch @@ -1,17 +1,16 @@ -From 15274a197e4d3b7ac0f11ca63a5274f1168739f5 Mon Sep 17 00:00:00 2001 +From 69370e52e94c66e06052a7859dd059dfa34fd61e Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 16 Nov 2020 18:11:47 -0800 -Subject: [PATCH 2/8] Reduce severity of 'Vty connected from' message +Subject: [PATCH] From 15274a197e4d3b7ac0f11ca63a5274f1168739f5 Mon Sep 17 + 00:00:00 2001 Subject: [PATCH 2/8] Reduce severity of 'Vty connected from' + message ---- - lib/vty.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vty.c b/lib/vty.c -index 8eaf13619..7edeb5538 100644 +index ab98ac14e..c32fc13ba 100644 --- a/lib/vty.c +++ b/lib/vty.c -@@ -1814,7 +1814,7 @@ static int vty_accept(struct thread *thread) +@@ -1843,7 +1843,7 @@ static void vty_accept(struct thread *thread) zlog_info("can't set sockopt to vty_sock : %s", safe_strerror(errno)); @@ -19,7 +18,7 @@ index 8eaf13619..7edeb5538 100644 + zlog_debug("Vty connection from %pSU", &su); vty_create(vty_sock, &su); - + } -- -2.12.2 +2.17.1 diff --git a/src/sonic-frr/patch/0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch b/src/sonic-frr/patch/0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch new file mode 100644 index 000000000000..f80a3d5d5e4e --- /dev/null +++ b/src/sonic-frr/patch/0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch @@ -0,0 +1,25 @@ +From 44ed2b0d2a2ca6029238118603264e02e2e965f4 Mon Sep 17 00:00:00 2001 +From: Pavel Shirshov +Date: Mon, 16 Nov 2020 18:33:46 -0800 +Subject: [PATCH] From afff474c79e0c177e090d1b45d68c9f816a52e3e Mon Sep 17 + 00:00:00 2001 Subject: [PATCH 4/8] Allow BGP attr NEXT_HOP to be 0.0.0.0 due + to alleviate + + +diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c +index f4dff0d80..f00c54c40 100644 +--- a/bgpd/bgp_route.c ++++ b/bgpd/bgp_route.c +@@ -3835,8 +3835,7 @@ bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi, + + /* If NEXT_HOP is present, validate it. */ + if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP)) { +- if (attr->nexthop.s_addr == INADDR_ANY || +- !ipv4_unicast_valid(&attr->nexthop) || ++ if (!ipv4_unicast_valid(&attr->nexthop) || + bgp_nexthop_self(bgp, afi, type, stype, attr, dest)) + return true; + } +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0005-nexthops-compare-vrf-only-if-ip-type.patch b/src/sonic-frr/patch/0003-nexthops-compare-vrf-only-if-ip-type.patch similarity index 75% rename from src/sonic-frr/patch/0005-nexthops-compare-vrf-only-if-ip-type.patch rename to src/sonic-frr/patch/0003-nexthops-compare-vrf-only-if-ip-type.patch index 2db1105622eb..1d5b89a30f72 100644 --- a/src/sonic-frr/patch/0005-nexthops-compare-vrf-only-if-ip-type.patch +++ b/src/sonic-frr/patch/0003-nexthops-compare-vrf-only-if-ip-type.patch @@ -1,15 +1,12 @@ -From 786087468520db44c55e3566f77438b41f52763f Mon Sep 17 00:00:00 2001 +From 2b778b1984c5f88500625a0e96a5ba1d1fe0316c Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 16 Nov 2020 18:35:01 -0800 -Subject: [PATCH 5/8] nexthops compare vrf only if ip type +Subject: [PATCH] From 786087468520db44c55e3566f77438b41f52763f Mon Sep 17 + 00:00:00 2001 Subject: [PATCH 5/8] nexthops compare vrf only if ip type ---- - lib/nexthop.c | 12 ++++++------ - lib/zclient.c | 12 ++++++------ - 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/nexthop.c b/lib/nexthop.c -index e17eeb830..a1ce22e3b 100644 +index 248acd270..7ebc4fefb 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c @@ -140,12 +140,6 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1, @@ -39,10 +36,10 @@ index e17eeb830..a1ce22e3b 100644 if (ret != 0) return ret; diff --git a/lib/zclient.c b/lib/zclient.c -index 445837017..c104623b7 100644 +index 07c7e5aea..0082b2148 100644 --- a/lib/zclient.c +++ b/lib/zclient.c -@@ -864,12 +864,6 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, +@@ -869,12 +869,6 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, { int ret = 0; @@ -55,7 +52,7 @@ index 445837017..c104623b7 100644 if (next1->type < next2->type) return -1; -@@ -885,6 +879,12 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, +@@ -890,6 +884,12 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, switch (next1->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV6: @@ -69,5 +66,5 @@ index 445837017..c104623b7 100644 &next2->gate); if (ret != 0) -- -2.12.2 +2.17.1 diff --git a/src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch b/src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch deleted file mode 100644 index 9d2f08efb191..000000000000 --- a/src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch +++ /dev/null @@ -1,27 +0,0 @@ -From afff474c79e0c177e090d1b45d68c9f816a52e3e Mon Sep 17 00:00:00 2001 -From: Pavel Shirshov -Date: Mon, 16 Nov 2020 18:33:46 -0800 -Subject: [PATCH 4/8] Allow BGP attr NEXT_HOP to be 0.0.0.0 due to - alleviate - ---- - bgpd/bgp_route.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index b297ca006..d4b5066c6 100644 ---- a/bgpd/bgp_route.c -+++ b/bgpd/bgp_route.c -@@ -3625,8 +3625,7 @@ bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi, - - /* If NEXT_HOP is present, validate it. */ - if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP)) { -- if (attr->nexthop.s_addr == INADDR_ANY -- || IPV4_CLASS_DE(ntohl(attr->nexthop.s_addr)) -+ if (IPV4_CLASS_DE(ntohl(attr->nexthop.s_addr)) - || bgp_nexthop_self(bgp, afi, type, stype, attr, dest)) - return true; - } --- -2.12.2 - diff --git a/src/sonic-frr/patch/0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch b/src/sonic-frr/patch/0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch similarity index 60% rename from src/sonic-frr/patch/0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch rename to src/sonic-frr/patch/0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch index 6d3db6d518e9..6936e36100a0 100644 --- a/src/sonic-frr/patch/0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch +++ b/src/sonic-frr/patch/0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch @@ -1,27 +1,25 @@ -From 0417036a3aece862c95111d4646ca7508a028165 Mon Sep 17 00:00:00 2001 +From ece5d83bebfe2345edf8e18f5af713bd99cc3739 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 25 Nov 2020 22:28:43 +0000 -Subject: [PATCH] [PATCH 6/8] [frr] remove frr log outchannel to /var/log/frr.log -SONiC runs frr inside a docker and the logs are sent to base image -via rsyslog and recorded already. There is no need to keep the -frr.log inside the docker. It will grow and take all harddrive -space eventually. +Subject: [PATCH] From 0417036a3aece862c95111d4646ca7508a028165 Mon Sep 17 + 00:00:00 2001 Subject: [PATCH] [PATCH 6/8] [frr] remove frr log outchannel to + /var/log/frr.log SONiC runs frr inside a docker and the logs are sent to base + image via rsyslog and recorded already. There is no need to keep the frr.log + inside the docker. It will grow and take all harddrive space eventually. ---- - tools/etc/rsyslog.d/45-frr.conf | 19 ------------------- - 1 file changed, 19 deletions(-) diff --git a/tools/etc/rsyslog.d/45-frr.conf b/tools/etc/rsyslog.d/45-frr.conf -index feeeb13f1..fcd23d23a 100644 +index 75b20d76b..9cdd55762 100644 --- a/tools/etc/rsyslog.d/45-frr.conf +++ b/tools/etc/rsyslog.d/45-frr.conf -@@ -2,25 +2,6 @@ +@@ -2,29 +2,6 @@ # to /var/log/frr/frr.log, then drops the message so it does # not also go to /var/log/syslog, so the messages are not duplicated -$outchannel frr_log,/var/log/frr/frr.log -if $programname == 'babeld' or - $programname == 'bgpd' or +- $programname == 'bfdd' or - $programname == 'eigrpd' or - $programname == 'frr' or - $programname == 'isisd' or @@ -31,6 +29,9 @@ index feeeb13f1..fcd23d23a 100644 - $programname == 'ospf6d' or - $programname == 'ospfd' or - $programname == 'pimd' or +- $programname == 'pim6d' or +- $programname == 'pathd' or +- $programname == 'pbrd' or - $programname == 'ripd' or - $programname == 'ripngd' or - $programname == 'vrrpd' or @@ -40,7 +41,7 @@ index feeeb13f1..fcd23d23a 100644 - if $programname == 'babeld' or $programname == 'bgpd' or - $programname == 'eigrpd' or + $programname == 'bfdd' or -- -2.12.2 +2.17.1 diff --git a/src/sonic-frr/patch/0007-Add-support-of-bgp-l3vni-evpn.patch b/src/sonic-frr/patch/0005-Add-support-of-bgp-l3vni-evpn.patch similarity index 78% rename from src/sonic-frr/patch/0007-Add-support-of-bgp-l3vni-evpn.patch rename to src/sonic-frr/patch/0005-Add-support-of-bgp-l3vni-evpn.patch index 5efd29fdcf09..fe2636c2e289 100644 --- a/src/sonic-frr/patch/0007-Add-support-of-bgp-l3vni-evpn.patch +++ b/src/sonic-frr/patch/0005-Add-support-of-bgp-l3vni-evpn.patch @@ -1,22 +1,16 @@ -From 369bbb4d62aa47d5a6d5157ca6ea819c4cb80f15 Mon Sep 17 00:00:00 2001 +From f5f0018266c98ad96cdbe69ae60d501de21e5600 Mon Sep 17 00:00:00 2001 From: Stepan Blyschak Date: Thu, 20 Oct 2022 13:19:31 +0000 -Subject: [PATCH 07/13] Added support of L3VNI EVPN +Subject: [PATCH] From 369bbb4d62aa47d5a6d5157ca6ea819c4cb80f15 Mon Sep 17 + 00:00:00 2001 Subject: [PATCH 07/13] Added support of L3VNI EVPN This is temp patch till Prefix to ARP indirection is add in neighorch Signed-off-by: Kishore Kunal Signed-off-by: Stepan Blyschak ---- - lib/nexthop.c | 1 + - lib/nexthop.h | 7 ++++++- - zebra/rt_netlink.c | 15 ++++++++++++++- - zebra/zapi_msg.c | 4 ++++ - zebra/zebra_dplane.c | 2 +- - 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/nexthop.c b/lib/nexthop.c -index a1ce22e3b..10a87f072 100644 +index 7ebc4fefb..2f7bb0e7b 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c @@ -813,6 +813,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy, @@ -28,13 +22,13 @@ index a1ce22e3b..10a87f072 100644 nexthop_add_labels(copy, nexthop->nh_label_type, nexthop->nh_label->num_labels, diff --git a/lib/nexthop.h b/lib/nexthop.h -index 320b46315..77eea3674 100644 +index f1309aa52..7b4bbbafd 100644 --- a/lib/nexthop.h +++ b/lib/nexthop.h @@ -66,6 +66,11 @@ enum nh_encap_type { /* Backup index value is limited */ #define NEXTHOP_BACKUP_IDX_MAX 255 - + +struct vxlan_nh_encap { + vni_t vni; + struct ethaddr rmac; @@ -43,31 +37,31 @@ index 320b46315..77eea3674 100644 /* Nexthop structure. */ struct nexthop { struct nexthop *next; -@@ -135,7 +140,7 @@ struct nexthop { +@@ -137,7 +142,7 @@ struct nexthop { /* Encapsulation information. */ enum nh_encap_type nh_encap_type; union { - vni_t vni; + struct vxlan_nh_encap encap_data; } nh_encap; - + /* SR-TE color used for matching SR-TE policies */ diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c -index 03c84d6dc..a56a95276 100644 +index 79d79d74b..325199eff 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c -@@ -1869,6 +1869,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen, +@@ -1969,6 +1969,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen, struct nexthop *nh) { struct rtattr *nest; + struct vxlan_nh_encap* encap_data; - + switch (nh->nh_encap_type) { case NET_VXLAN: -@@ -1879,9 +1880,21 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen, +@@ -1979,9 +1980,21 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen, if (!nest) return false; - + + encap_data = &nh->nh_encap.encap_data; + if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */, @@ -88,10 +82,10 @@ index 03c84d6dc..a56a95276 100644 break; } diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c -index 5cf7d815d..529cbb44b 100644 +index c0945eae2..157c33ced 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c -@@ -1577,6 +1577,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh, +@@ -1605,6 +1605,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh, vtep_ip.ipa_type = IPADDR_V4; memcpy(&(vtep_ip.ipaddr_v4), &(api_nh->gate.ipv4), sizeof(struct in_addr)); @@ -99,8 +93,8 @@ index 5cf7d815d..529cbb44b 100644 + &api_nh->rmac, ETH_ALEN); zebra_rib_queue_evpn_route_add( api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p); - } -@@ -1610,6 +1612,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh, + SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN); +@@ -1639,6 +1641,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh, vtep_ip.ipa_type = IPADDR_V6; memcpy(&vtep_ip.ipaddr_v6, &(api_nh->gate.ipv6), sizeof(struct in6_addr)); @@ -108,12 +102,12 @@ index 5cf7d815d..529cbb44b 100644 + &api_nh->rmac, ETH_ALEN); zebra_rib_queue_evpn_route_add( api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p); - } + SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN); diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c -index 656ebcf3b..bd59df189 100644 +index f6f436f39..c8511bd28 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c -@@ -2420,7 +2420,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, +@@ -2917,7 +2917,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, zl3vni = zl3vni_from_vrf(nexthop->vrf_id); if (zl3vni && is_l3vni_oper_up(zl3vni)) { nexthop->nh_encap_type = NET_VXLAN; @@ -121,7 +115,7 @@ index 656ebcf3b..bd59df189 100644 + nexthop->nh_encap.encap_data.vni = zl3vni->vni; } } - --- -2.30.2 + +-- +2.17.1 diff --git a/src/sonic-frr/patch/0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch b/src/sonic-frr/patch/0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch new file mode 100644 index 000000000000..575e636593bb --- /dev/null +++ b/src/sonic-frr/patch/0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch @@ -0,0 +1,28 @@ +From 4fdb386b2b41278ca10431fe2b386853985aff0f Mon Sep 17 00:00:00 2001 +From: Akhilesh Samineni +Date: Mon, 5 Apr 2021 13:21:40 -0700 +Subject: [PATCH] From 92ab2d74fca06f86c00d886ac249f7f2d89e93fe Mon Sep 17 + 00:00:00 2001 Subject: [PATCH 8/8] Link local scope was not set while binding + socket with local address causing socket errors for bgp ipv6 link local + neighbors. + + +diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c +index 76bb9949d..5acdde08d 100644 +--- a/bgpd/bgp_network.c ++++ b/bgpd/bgp_network.c +@@ -678,6 +678,11 @@ int bgp_update_address(struct interface *ifp, const union sockunion *dst, + return 1; + + prefix2sockunion(sel, addr); ++ ++ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6.sin6_addr)) { ++ addr->sin6.sin6_scope_id = ifp->ifindex; ++ } ++ + return 0; + } + +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0009-ignore-route-from-default-table.patch b/src/sonic-frr/patch/0007-ignore-route-from-default-table.patch similarity index 68% rename from src/sonic-frr/patch/0009-ignore-route-from-default-table.patch rename to src/sonic-frr/patch/0007-ignore-route-from-default-table.patch index 6af5bfc45783..52167d765287 100644 --- a/src/sonic-frr/patch/0009-ignore-route-from-default-table.patch +++ b/src/sonic-frr/patch/0007-ignore-route-from-default-table.patch @@ -1,21 +1,19 @@ -From ca66350aecf7db3354019480d11754fabae3a97c Mon Sep 17 00:00:00 2001 +From 1a639f2dcd400997345dab424a2adbc091752661 Mon Sep 17 00:00:00 2001 From: Stepan Blyschak Date: Thu, 20 Oct 2022 13:07:18 +0000 -Subject: [PATCH 09/13] ignore route from default table +Subject: [PATCH] From ca66350aecf7db3354019480d11754fabae3a97c Mon Sep 17 + 00:00:00 2001 Subject: [PATCH 09/13] ignore route from default table Signed-off-by: Stepan Blyschak ---- - zebra/dplane_fpm_nl.c | 9 +++++++++ - 1 file changed, 9 insertions(+) diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c -index 3b02128c9..da8504adf 100644 +index 0a9fecc9d..b18a96353 100644 --- a/zebra/dplane_fpm_nl.c +++ b/zebra/dplane_fpm_nl.c -@@ -699,6 +699,15 @@ static int fpm_nl_enqueue(struct fpm_nl_ctx *fnc, struct zebra_dplane_ctx *ctx) +@@ -814,6 +814,15 @@ static int fpm_nl_enqueue(struct fpm_nl_ctx *fnc, struct zebra_dplane_ctx *ctx) || op == DPLANE_OP_NH_UPDATE)) return 0; - + + /* + * Ignore route from default table, because when mgmt port goes down, + * zebra will remove the default route and causing ASIC to blackhole IO. @@ -26,7 +24,8 @@ index 3b02128c9..da8504adf 100644 + } + nl_buf_len = 0; - + frr_mutex_lock_autounlock(&fnc->obuf_mutex); --- -2.30.2 +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch b/src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch deleted file mode 100644 index c2ff17dab88c..000000000000 --- a/src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 92ab2d74fca06f86c00d886ac249f7f2d89e93fe Mon Sep 17 00:00:00 2001 -From: Akhilesh Samineni -Date: Mon, 5 Apr 2021 13:21:40 -0700 -Subject: [PATCH 8/8] Link local scope was not set while binding socket - with local address causing socket errors for bgp ipv6 link local neighbors. - ---- - bgpd/bgp_network.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c -index 70c771683..dbc9870a5 100644 ---- a/bgpd/bgp_network.c -+++ b/bgpd/bgp_network.c -@@ -662,6 +662,11 @@ static int bgp_update_address(struct interface *ifp, const union sockunion *dst, - return 1; - - prefix2sockunion(sel, addr); -+ -+ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6.sin6_addr)) { -+ addr->sin6.sin6_scope_id = ifp->ifindex; -+ } -+ - return 0; - } - --- -2.12.2 - diff --git a/src/sonic-frr/patch/0023-Use-vrf_id-for-vrf-not-tabled_id.patch b/src/sonic-frr/patch/0008-Use-vrf_id-for-vrf-not-tabled_id.patch similarity index 84% rename from src/sonic-frr/patch/0023-Use-vrf_id-for-vrf-not-tabled_id.patch rename to src/sonic-frr/patch/0008-Use-vrf_id-for-vrf-not-tabled_id.patch index b69ce1fbb811..ae8b05f06bd0 100644 --- a/src/sonic-frr/patch/0023-Use-vrf_id-for-vrf-not-tabled_id.patch +++ b/src/sonic-frr/patch/0008-Use-vrf_id-for-vrf-not-tabled_id.patch @@ -1,18 +1,16 @@ -From 349e3f758860be0077b69919c39764d3486ec44a Mon Sep 17 00:00:00 2001 +From 44f3736ee601e06e43e978fa075402c3da4823bd Mon Sep 17 00:00:00 2001 From: Stepan Blyschak Date: Mon, 16 Jan 2023 11:45:19 +0000 -Subject: [PATCH] use vrf id instead of table id +Subject: [PATCH] From 349e3f758860be0077b69919c39764d3486ec44a Mon Sep 17 + 00:00:00 2001 Subject: [PATCH] use vrf id instead of table id Signed-off-by: Stepan Blyschak ---- - zebra/rt_netlink.c | 74 ++++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c -index 29137a09f..e7b808754 100644 +index 325199eff..587045eac 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c -@@ -388,6 +388,30 @@ vrf_id_t vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id) +@@ -406,6 +406,30 @@ vrf_id_t vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id) return VRF_DEFAULT; } @@ -43,7 +41,7 @@ index 29137a09f..e7b808754 100644 /** * @parse_encap_mpls() - Parses encapsulated mpls attributes * @tb: Pointer to rtattr to look for nested items in. -@@ -754,14 +778,26 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h, +@@ -782,14 +806,26 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h, if (rtm->rtm_family == AF_MPLS) return 0; @@ -77,8 +75,8 @@ index 29137a09f..e7b808754 100644 if (vrf_id == VRF_DEFAULT) { if (!is_zebra_valid_kernel_table(table) && !is_zebra_main_routing_table(table)) -@@ -2004,12 +2040,24 @@ ssize_t netlink_route_multipath_msg_encode(int cmd, - #endif +@@ -2102,12 +2138,24 @@ ssize_t netlink_route_multipath_msg_encode(int cmd, + /* Table corresponding to this route. */ table_id = dplane_ctx_get_table(ctx); - if (table_id < 256) @@ -109,5 +107,5 @@ index 29137a09f..e7b808754 100644 if (IS_ZEBRA_DEBUG_KERNEL) -- -2.30.2 +2.17.1 diff --git a/src/sonic-frr/patch/0026-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch b/src/sonic-frr/patch/0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch similarity index 80% rename from src/sonic-frr/patch/0026-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch rename to src/sonic-frr/patch/0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch index 4805315cee1d..a276f9ba5b49 100644 --- a/src/sonic-frr/patch/0026-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch +++ b/src/sonic-frr/patch/0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch @@ -1,8 +1,9 @@ -From 5a1d3c9e24791ebdb7e375a02afe9c5f6146c488 Mon Sep 17 00:00:00 2001 +From c4a198c977168a6bd420197d19c8a4c0f4eacc8a Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 22 Mar 2023 11:35:28 -0400 -Subject: [PATCH] bgpd: Ensure suppress-fib-pending works with network - statements +Subject: [PATCH] From 5a1d3c9e24791ebdb7e375a02afe9c5f6146c488 Mon Sep 17 + 00:00:00 2001 Subject: [PATCH] bgpd: Ensure suppress-fib-pending works with + network statements The flag for telling BGP that a route is expected to be installed first before notifying a peer was always being set upon receipt @@ -22,17 +23,12 @@ cover the case when a network statement is added after the route has been learned from a peer. Signed-off-by: Donald Sharp ---- - bgpd/bgp_route.c | 22 ------------------- - bgpd/bgp_zebra.c | 14 ++++++++++++ - .../bgp_suppress_fib/test_bgp_suppress_fib.py | 14 ++++++++++++ - 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index d4b5066c6..c01e2fd2c 100644 +index f00c54c40..a7a5c9849 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c -@@ -2994,11 +2994,6 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest, +@@ -3203,11 +3203,6 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest, if (bgp_fibupd_safi(safi) && !bgp_option_check(BGP_OPT_NO_FIB)) { @@ -44,7 +40,7 @@ index d4b5066c6..c01e2fd2c 100644 if (new_select->type == ZEBRA_ROUTE_BGP && (new_select->sub_type == BGP_ROUTE_NORMAL || new_select->sub_type -@@ -3104,10 +3099,6 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest, +@@ -3313,10 +3308,6 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest, || new_select->sub_type == BGP_ROUTE_AGGREGATE || new_select->sub_type == BGP_ROUTE_IMPORTED)) { @@ -55,10 +51,10 @@ index d4b5066c6..c01e2fd2c 100644 /* if this is an evpn imported type-5 prefix, * we need to withdraw the route first to clear * the nh neigh and the RMAC entry. -@@ -3953,19 +3944,6 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, +@@ -4261,18 +4252,6 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, + bgp_attr_flush(&new_attr); goto filtered; } - - /* The flag BGP_NODE_FIB_INSTALL_PENDING is for the following - * condition : - * Suppress fib is enabled @@ -71,17 +67,16 @@ index d4b5066c6..c01e2fd2c 100644 - && (!bgp_option_check(BGP_OPT_NO_FIB)) - && (!CHECK_FLAG(dest->flags, BGP_NODE_FIB_INSTALLED))) - SET_FLAG(dest->flags, BGP_NODE_FIB_INSTALL_PENDING); -- - /* If maximum prefix count is configured and current prefix - * count exeed it. - */ + + /* If neighbor soo is configured, tag all incoming routes with + * this SoO tag and then filter out advertisements in diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c -index 21912d143..71816813a 100644 +index 95e80ba1b..efcf49785 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c -@@ -1269,6 +1269,14 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p, - uint32_t nhg_id = 0; - bool is_add; +@@ -1322,6 +1322,14 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p, + uint32_t bos = 0; + uint32_t exp = 0; + /* + * BGP is installing this route and bgp has been configured @@ -94,7 +89,7 @@ index 21912d143..71816813a 100644 /* Don't try to install if we're not connected to Zebra or Zebra doesn't * know of this instance. */ -@@ -1681,6 +1689,12 @@ void bgp_zebra_withdraw(const struct prefix *p, struct bgp_path_info *info, +@@ -1758,6 +1766,12 @@ void bgp_zebra_withdraw(const struct prefix *p, struct bgp_path_info *info, struct zapi_route api; struct peer *peer; @@ -108,10 +103,10 @@ index 21912d143..71816813a 100644 * know of this instance. */ diff --git a/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py b/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py -index 96a294cae..f812079c7 100644 +index 6d2b65a61..7bcb28166 100644 --- a/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py +++ b/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py -@@ -229,6 +229,20 @@ def test_bgp_allow_as_in(): +@@ -230,6 +230,20 @@ def test_bgp_allow_as_in(): assertmsg = '"r2" 192.168.1.1/32 route should be gone' assert result is None, assertmsg @@ -133,5 +128,5 @@ index 96a294cae..f812079c7 100644 if __name__ == "__main__": args = ["-s"] + sys.argv[1:] -- -2.20.1 +2.17.1 diff --git a/src/sonic-frr/patch/0010-bgpd-Change-log-level-for-graceful-restart-events.patch b/src/sonic-frr/patch/0010-bgpd-Change-log-level-for-graceful-restart-events.patch new file mode 100644 index 000000000000..54fcc1575a75 --- /dev/null +++ b/src/sonic-frr/patch/0010-bgpd-Change-log-level-for-graceful-restart-events.patch @@ -0,0 +1,116 @@ +From a05f213343ee7ee5dbfcfd1984c40db5c262db3c Mon Sep 17 00:00:00 2001 +From: stormliang +Date: Mon, 19 Jun 2023 13:57:01 +0000 +Subject: [PATCH] From c423bce4db804c1d07d65ce3d06a9e62c4eceb2b Mon Sep 17 + 00:00:00 2001 Subject: [PATCH] change log level for graceful restart events + + +diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c +index 9624adfbe..74b4dfc4a 100644 +--- a/bgpd/bgp_fsm.c ++++ b/bgpd/bgp_fsm.c +@@ -778,10 +778,10 @@ static void bgp_graceful_restart_timer_expire(struct thread *thread) + + peer = THREAD_ARG(thread); + +- if (bgp_debug_neighbor_events(peer)) { +- zlog_debug("%pBP graceful restart timer expired", peer); +- zlog_debug("%pBP graceful restart stalepath timer stopped", +- peer); ++ if (peer) { ++ zlog_info("%pBP graceful restart timer expired", peer); ++ zlog_info("%pBP graceful restart stalepath timer stopped", ++ peer); + } + + FOREACH_AFI_SAFI (afi, safi) { +@@ -842,8 +842,8 @@ static void bgp_graceful_stale_timer_expire(struct thread *thread) + + peer = THREAD_ARG(thread); + +- if (bgp_debug_neighbor_events(peer)) +- zlog_debug("%pBP graceful restart stalepath timer expired", ++ if (peer) ++ zlog_info("%pBP graceful restart stalepath timer expired", + peer); + + /* NSF delete stale route */ +@@ -1412,20 +1412,17 @@ enum bgp_fsm_state_progress bgp_stop(struct peer *peer) + /* graceful restart */ + if (peer->t_gr_stale) { + THREAD_OFF(peer->t_gr_stale); +- if (bgp_debug_neighbor_events(peer)) +- zlog_debug( +- "%pBP graceful restart stalepath timer stopped", +- peer); ++ zlog_info( ++ "%pBP graceful restart stalepath timer stopped", ++ peer); + } + if (CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT)) { +- if (bgp_debug_neighbor_events(peer)) { +- zlog_debug( +- "%pBP graceful restart timer started for %d sec", +- peer, peer->v_gr_restart); +- zlog_debug( +- "%pBP graceful restart stalepath timer started for %d sec", +- peer, peer->bgp->stalepath_time); +- } ++ zlog_info( ++ "%pBP graceful restart timer started for %d sec", ++ peer, peer->v_gr_restart); ++ zlog_info( ++ "%pBP graceful restart stalepath timer started for %d sec", ++ peer, peer->bgp->stalepath_time); + BGP_TIMER_ON(peer->t_gr_restart, + bgp_graceful_restart_timer_expire, + peer->v_gr_restart); +@@ -2225,17 +2222,15 @@ static enum bgp_fsm_state_progress bgp_establish(struct peer *peer) + UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE); + if (peer->t_gr_stale) { + THREAD_OFF(peer->t_gr_stale); +- if (bgp_debug_neighbor_events(peer)) +- zlog_debug( +- "%pBP graceful restart stalepath timer stopped", +- peer); ++ zlog_info( ++ "%pBP graceful restart stalepath timer stopped", ++ peer); + } + } + + if (peer->t_gr_restart) { + THREAD_OFF(peer->t_gr_restart); +- if (bgp_debug_neighbor_events(peer)) +- zlog_debug("%pBP graceful restart timer stopped", peer); ++ zlog_info("%pBP graceful restart timer stopped", peer); + } + + /* Reset uptime, turn on keepalives, send current table. */ +diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c +index 8b3a1e3dd..2f3b837a5 100644 +--- a/bgpd/bgpd.c ++++ b/bgpd/bgpd.c +@@ -2453,15 +2453,13 @@ void peer_nsf_stop(struct peer *peer) + + if (peer->t_gr_restart) { + THREAD_OFF(peer->t_gr_restart); +- if (bgp_debug_neighbor_events(peer)) +- zlog_debug("%pBP graceful restart timer stopped", peer); ++ zlog_info("%pBP graceful restart timer stopped", peer); + } + if (peer->t_gr_stale) { + THREAD_OFF(peer->t_gr_stale); +- if (bgp_debug_neighbor_events(peer)) +- zlog_debug( +- "%pBP graceful restart stalepath timer stopped", +- peer); ++ zlog_info( ++ "%pBP graceful restart stalepath timer stopped", ++ peer); + } + bgp_clear_route_all(peer); + } +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch b/src/sonic-frr/patch/0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch deleted file mode 100644 index 3da1ab318d1c..000000000000 --- a/src/sonic-frr/patch/0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 8f10590a85669f300d2706d5ef1e560cdbaaf0f8 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Fri, 25 Mar 2022 19:08:14 -0400 -Subject: [PATCH 10/10] zebra: Note when the netlink DUMP command is - interrupted - -There exists code paths in the linux kernel where a dump command -will be interrupted( I am not sure I understand what this really -means ) and the data sent back from the kernel is wrong or incomplete. - -At this point in time I am not 100% certain what should be done, but -let's start noticing that this has happened so we can formulate a plan -or allow the end operator to know bad stuff is a foot at the circle K. - -Signed-off-by: Donald Sharp ---- - zebra/kernel_netlink.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c -index ccafc8f0c..9dc597fad 100644 ---- a/zebra/kernel_netlink.c -+++ b/zebra/kernel_netlink.c -@@ -972,6 +972,18 @@ int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int), - return err; - } - -+ /* -+ * What is the right thing to do? The kernel -+ * is telling us that the dump request was interrupted -+ * and we more than likely are out of luck and have -+ * missed data from the kernel. At this point in time -+ * lets just note that this is happening. -+ */ -+ if (h->nlmsg_flags & NLM_F_DUMP_INTR) -+ flog_err( -+ EC_ZEBRA_NETLINK_BAD_SEQUENCE, -+ "netlink recvmsg: The Dump request was interrupted"); -+ - /* OK we got netlink message. */ - if (IS_ZEBRA_DEBUG_KERNEL) - zlog_debug( --- -2.17.1 - diff --git a/src/sonic-frr/patch/0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch b/src/sonic-frr/patch/0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch deleted file mode 100644 index cefa7c31449f..000000000000 --- a/src/sonic-frr/patch/0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 4db4fc1bf0599f79067bfd62aa435be8e161d81e Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Tue, 3 May 2022 12:51:21 -0400 -Subject: [PATCH] bgpd: enhanced capability is always turned on for interface - based peers - -FRR is displaying that the peer enhanced capability command is not -turned on when the interface is part of a peer group. Saving the -config and then reloading actually turns it off. - -Fix the code so that FRR does not display the enhanced capability -for interface based peers. - -Fixes: #11108 -Signed-off-by: Donald Sharp ---- - bgpd/bgp_vty.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c -index 4df2abef8..6fcce239b 100644 ---- a/bgpd/bgp_vty.c -+++ b/bgpd/bgp_vty.c -@@ -16586,7 +16586,8 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp, - - /* capability extended-nexthop */ - if (peergroup_flag_check(peer, PEER_FLAG_CAPABILITY_ENHE)) { -- if (CHECK_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE)) -+ if (CHECK_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE) && -+ !peer->conf_if) - vty_out(vty, - " no neighbor %s capability extended-nexthop\n", - addr); --- -2.17.1 - diff --git a/src/sonic-frr/patch/0011-zebra-Static-routes-async-notification-do-not-need-t.patch b/src/sonic-frr/patch/0011-zebra-Static-routes-async-notification-do-not-need-t.patch new file mode 100644 index 000000000000..6b633badf97b --- /dev/null +++ b/src/sonic-frr/patch/0011-zebra-Static-routes-async-notification-do-not-need-t.patch @@ -0,0 +1,99 @@ +From 56d349ef47ba24bcf838488b1e40474755655259 Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Thu, 29 Jun 2023 09:35:00 -0400 +Subject: [PATCH] zebra: Static routes async notification do not need this test + +When using asic_offload with an asynchronous notification the +rib_route_match_ctx function is testing for distance and tag +being correct against the re. + +Normal route notification for static routes is this(well really all routes): +a) zebra dplane generates a ctx to send to the dplane for route install +b) dplane installs it in the kernel +c) if the dplane_fpm_nl.c module is being used it installs it. +d) The context's success code is set to it worked and passes the context +back up to zebra for processing. +e) Zebra master receives this and checks the distance and tag are correct +for static routes and accepts the route and marks it installed. + +If the operator is using a wait for install mechansim where the dplane +is asynchronously sending the result back up at a future time *and* +it is using the dplane_fpm_nl.c code where it uses the rt_netlink.c +route parsing code, then there is no way to set distance as that we +do not pass distance to the kernel. + +As such static routes were never being properly handled since the re and +context would not match and the route would still be marked as queued. + +Modify the code such that the asynchronous path notification for static +routes ignores the distance and tag's as that there is no way to test +for this data from that path at this point in time. + +Signed-off-by: Donald Sharp + +diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c +index fd6df441c6..039c44cc09 100644 +--- a/zebra/zebra_rib.c ++++ b/zebra/zebra_rib.c +@@ -1465,7 +1465,7 @@ static void zebra_rib_evaluate_mpls(struct route_node *rn) + */ + static bool rib_route_match_ctx(const struct route_entry *re, + const struct zebra_dplane_ctx *ctx, +- bool is_update) ++ bool is_update, bool async) + { + bool result = false; + +@@ -1481,13 +1481,12 @@ static bool rib_route_match_ctx(const struct route_entry *re, + /* We use an extra test for statics, and another for + * kernel routes. + */ +- if (re->type == ZEBRA_ROUTE_STATIC && ++ if (re->type == ZEBRA_ROUTE_STATIC && !async && + (re->distance != dplane_ctx_get_old_distance(ctx) || + re->tag != dplane_ctx_get_old_tag(ctx))) { + result = false; + } else if (re->type == ZEBRA_ROUTE_KERNEL && +- re->metric != +- dplane_ctx_get_old_metric(ctx)) { ++ re->metric != dplane_ctx_get_old_metric(ctx)) { + result = false; + } + } +@@ -1509,7 +1508,7 @@ static bool rib_route_match_ctx(const struct route_entry *re, + /* We use an extra test for statics, and another for + * kernel routes. + */ +- if (re->type == ZEBRA_ROUTE_STATIC && ++ if (re->type == ZEBRA_ROUTE_STATIC && !async && + (re->distance != dplane_ctx_get_distance(ctx) || + re->tag != dplane_ctx_get_tag(ctx))) { + result = false; +@@ -1973,13 +1972,13 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) + RNODE_FOREACH_RE(rn, rib) { + + if (re == NULL) { +- if (rib_route_match_ctx(rib, ctx, false)) ++ if (rib_route_match_ctx(rib, ctx, false, false)) + re = rib; + } + + /* Check for old route match */ + if (is_update && (old_re == NULL)) { +- if (rib_route_match_ctx(rib, ctx, true /*is_update*/)) ++ if (rib_route_match_ctx(rib, ctx, true, false)) + old_re = rib; + } + +@@ -2247,7 +2246,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) + * info. + */ + RNODE_FOREACH_RE(rn, re) { +- if (rib_route_match_ctx(re, ctx, false /*!update*/)) ++ if (rib_route_match_ctx(re, ctx, false, true)) + break; + } + +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch b/src/sonic-frr/patch/0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch deleted file mode 100644 index d46f13a3caf1..000000000000 --- a/src/sonic-frr/patch/0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch +++ /dev/null @@ -1,108 +0,0 @@ -From d8d77d3733bc299ed5dd7b44c4d464ba2bfed288 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Wed, 20 Jul 2022 16:43:17 -0400 -Subject: [PATCH 1/3] ospfclient: Ensure ospf_apiclient_lsa_originate cannot - accidently write into stack - -Even though OSPF_MAX_LSA_SIZE is quite large and holds the upper bound -on what can be written into a lsa, let's add a small check to ensure -it is not possible to do a bad thing. - -This wins one of the long standing bug awards. 2003! - -Fixes: #11602 -Signed-off-by: Donald Sharp ---- - ospfclient/ospf_apiclient.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/ospfclient/ospf_apiclient.c b/ospfclient/ospf_apiclient.c -index 29f1c0807db..51c8a5b8c06 100644 ---- a/ospfclient/ospf_apiclient.c -+++ b/ospfclient/ospf_apiclient.c -@@ -447,6 +447,12 @@ int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient, - return OSPF_API_ILLEGALLSATYPE; - } - -+ if ((size_t)opaquelen > sizeof(buf) - sizeof(struct lsa_header)) { -+ fprintf(stderr, "opaquelen(%d) is larger than buf size %zu\n", -+ opaquelen, sizeof(buf)); -+ return OSPF_API_NOMEMORY; -+ } -+ - /* Make a new LSA from parameters */ - lsah = (struct lsa_header *)buf; - lsah->ls_age = 0; - -From 519929cdd47ac4d9f7f33e13922e1a063f69bb24 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Wed, 20 Jul 2022 16:49:09 -0400 -Subject: [PATCH 2/3] isisd: Ensure rcap is freed in error case - -unpack_tlv_router_cap allocates memory that in the error -case is not being freed. - -Signed-off-by: Donald Sharp ---- - isisd/isis_tlvs.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c -index f1aae7caf10..dad271225b3 100644 ---- a/isisd/isis_tlvs.c -+++ b/isisd/isis_tlvs.c -@@ -2966,9 +2966,9 @@ static int pack_tlv_router_cap(const struct isis_router_cap *router_cap, - } - - static int unpack_tlv_router_cap(enum isis_tlv_context context, -- uint8_t tlv_type, uint8_t tlv_len, -- struct stream *s, struct sbuf *log, -- void *dest, int indent) -+ uint8_t tlv_type, uint8_t tlv_len, -+ struct stream *s, struct sbuf *log, void *dest, -+ int indent) - { - struct isis_tlvs *tlvs = dest; - struct isis_router_cap *rcap; -@@ -3013,7 +3013,7 @@ static int unpack_tlv_router_cap(enum isis_tlv_context context, - log, indent, - "WARNING: Router Capability subTLV length too large compared to expected size\n"); - stream_forward_getp(s, STREAM_READABLE(s)); -- -+ XFREE(MTYPE_ISIS_TLV, rcap); - return 0; - } - - -From 3c4821679f2362bcd38fcc7803f28a5210441ddb Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Thu, 21 Jul 2022 08:11:58 -0400 -Subject: [PATCH 3/3] bgpd: Make sure hdr length is at a minimum of what is - expected - -Ensure that if the capability length specified is enough data. - -Signed-off-by: Donald Sharp ---- - bgpd/bgp_packet.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c -index 7c92a8d9e83..bcd47e32d45 100644 ---- a/bgpd/bgp_packet.c -+++ b/bgpd/bgp_packet.c -@@ -2440,6 +2440,14 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt, - "%s CAPABILITY has action: %d, code: %u, length %u", - peer->host, action, hdr->code, hdr->length); - -+ if (hdr->length < sizeof(struct capability_mp_data)) { -+ zlog_info( -+ "%s Capability structure is not properly filled out, expected at least %zu bytes but header length specified is %d", -+ peer->host, sizeof(struct capability_mp_data), -+ hdr->length); -+ return BGP_Stop; -+ } -+ - /* Capability length check. */ - if ((pnt + hdr->length + 3) > end) { - zlog_info("%s Capability length error", peer->host); diff --git a/src/sonic-frr/patch/0012-zebra-Rename-vrf_lookup_by_tableid-to-zebra_vrf_look.patch b/src/sonic-frr/patch/0012-zebra-Rename-vrf_lookup_by_tableid-to-zebra_vrf_look.patch new file mode 100644 index 000000000000..ca6517fbf655 --- /dev/null +++ b/src/sonic-frr/patch/0012-zebra-Rename-vrf_lookup_by_tableid-to-zebra_vrf_look.patch @@ -0,0 +1,147 @@ +From 2b9c7592a9857ddccc77b9d3f178e0c5bd5f19ed Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Wed, 26 Apr 2023 23:25:27 -0400 +Subject: [PATCH] zebra: Rename vrf_lookup_by_tableid to zebra_vrf_lookup.. + +Rename the vrf_lookup_by_id function to zebra_vrf_lookup_by_id +and move to zebra_vrf.c where it nominally belongs, as that +we need zebra specific data to find this vrf_id and as such +it does not belong in vrf.c + +Signed-off-by: Donald Sharp + +diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c +index 81347b550a..4599121261 100644 +--- a/zebra/if_netlink.c ++++ b/zebra/if_netlink.c +@@ -342,7 +342,8 @@ static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb, + if (!vrf_lookup_by_id((vrf_id_t)ifi->ifi_index)) { + vrf_id_t exist_id; + +- exist_id = vrf_lookup_by_table(nl_table_id, ns_id); ++ exist_id = ++ zebra_vrf_lookup_by_table(nl_table_id, ns_id); + if (exist_id != VRF_DEFAULT) { + vrf = vrf_lookup_by_id(exist_id); + +diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c +index 587045eac2..6b9b047858 100644 +--- a/zebra/rt_netlink.c ++++ b/zebra/rt_netlink.c +@@ -379,33 +379,6 @@ static inline int proto2zebra(int proto, int family, bool is_nexthop) + return proto; + } + +-/* +-Pending: create an efficient table_id (in a tree/hash) based lookup) +- */ +-vrf_id_t vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id) +-{ +- struct vrf *vrf; +- struct zebra_vrf *zvrf; +- +- RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) { +- zvrf = vrf->info; +- if (zvrf == NULL) +- continue; +- /* case vrf with netns : match the netnsid */ +- if (vrf_is_backend_netns()) { +- if (ns_id == zvrf_id(zvrf)) +- return zvrf_id(zvrf); +- } else { +- /* VRF is VRF_BACKEND_VRF_LITE */ +- if (zvrf->table_id != table_id) +- continue; +- return zvrf_id(zvrf); +- } +- } +- +- return VRF_DEFAULT; +-} +- + static uint32_t table_lookup_by_vrf(vrf_id_t vrf_id, ns_id_t ns_id) + { + struct vrf *vrf; +@@ -814,7 +787,7 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h, + table = rtm->rtm_table; + + /* Map to VRF */ +- vrf_id = vrf_lookup_by_table(table, ns_id); ++ vrf_id = zebra_vrf_lookup_by_table(table, ns_id); + } else { + /* With FPM, rtm_table contains vrf id, see netlink_route_multipath_msg_encode */ + if (tb[RTA_TABLE]) +@@ -1114,7 +1087,7 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h, + else + table = rtm->rtm_table; + +- vrf = vrf_lookup_by_table(table, ns_id); ++ vrf = zebra_vrf_lookup_by_table(table, ns_id); + + if (tb[RTA_IIF]) + iif = *(int *)RTA_DATA(tb[RTA_IIF]); +diff --git a/zebra/rt_netlink.h b/zebra/rt_netlink.h +index 8506367ae4..364aac0f6b 100644 +--- a/zebra/rt_netlink.h ++++ b/zebra/rt_netlink.h +@@ -102,7 +102,6 @@ extern int netlink_macfdb_read_specific_mac(struct zebra_ns *zns, + uint16_t vid); + extern int netlink_neigh_read_specific_ip(const struct ipaddr *ip, + struct interface *vlan_if); +-extern vrf_id_t vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id); + + struct nl_batch; + extern enum netlink_msg_status +diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c +index be5e91495f..c59cb7c0a7 100644 +--- a/zebra/zebra_vrf.c ++++ b/zebra/zebra_vrf.c +@@ -389,6 +389,33 @@ struct zebra_vrf *zebra_vrf_alloc(struct vrf *vrf) + return zvrf; + } + ++/* ++Pending: create an efficient table_id (in a tree/hash) based lookup) ++ */ ++vrf_id_t zebra_vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id) ++{ ++ struct vrf *vrf; ++ struct zebra_vrf *zvrf; ++ ++ RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) { ++ zvrf = vrf->info; ++ if (zvrf == NULL) ++ continue; ++ /* case vrf with netns : match the netnsid */ ++ if (vrf_is_backend_netns()) { ++ if (ns_id == zvrf_id(zvrf)) ++ return zvrf_id(zvrf); ++ } else { ++ /* VRF is VRF_BACKEND_VRF_LITE */ ++ if (zvrf->table_id != table_id) ++ continue; ++ return zvrf_id(zvrf); ++ } ++ } ++ ++ return VRF_DEFAULT; ++} ++ + /* Lookup VRF by identifier. */ + struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id) + { +diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h +index 02e3c197c9..937e7fb144 100644 +--- a/zebra/zebra_vrf.h ++++ b/zebra/zebra_vrf.h +@@ -252,6 +252,7 @@ extern struct route_table *zebra_vrf_get_table_with_table_id(afi_t afi, + extern void zebra_vrf_update_all(struct zserv *client); + extern struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id); + extern struct zebra_vrf *zebra_vrf_lookup_by_name(const char *); ++extern vrf_id_t zebra_vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id); + extern struct zebra_vrf *zebra_vrf_alloc(struct vrf *vrf); + extern struct route_table *zebra_vrf_table(afi_t, safi_t, vrf_id_t); + +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0013-zebra-Move-protodown_r_bit-to-a-better-spot.patch b/src/sonic-frr/patch/0013-zebra-Move-protodown_r_bit-to-a-better-spot.patch new file mode 100644 index 000000000000..cd88419fcbd6 --- /dev/null +++ b/src/sonic-frr/patch/0013-zebra-Move-protodown_r_bit-to-a-better-spot.patch @@ -0,0 +1,181 @@ +From c43808ca6daa59d533e14790ffc7f2e11b508924 Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Thu, 27 Apr 2023 07:37:58 -0400 +Subject: [PATCH] zebra: Move protodown_r_bit to a better spot + +Since we are moving some code handling out of the dataplane +and into zebra proper, lets move the protodown r bit as well. + +Signed-off-by: Donald Sharp + +diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c +index 4599121261..95889e22fd 100644 +--- a/zebra/if_netlink.c ++++ b/zebra/if_netlink.c +@@ -78,7 +78,6 @@ + #include "zebra/zebra_trace.h" + + extern struct zebra_privs_t zserv_privs; +-uint8_t frr_protodown_r_bit = FRR_PROTODOWN_REASON_DEFAULT_BIT; + + /* Note: on netlink systems, there should be a 1-to-1 mapping between interface + names and ifindex values. */ +@@ -819,9 +818,7 @@ static int netlink_bridge_interface(struct nlmsghdr *h, int len, ns_id_t ns_id, + + static bool is_if_protodown_reason_only_frr(uint32_t rc_bitfield) + { +- /* This shouldn't be possible */ +- assert(frr_protodown_r_bit < 32); +- return (rc_bitfield == (((uint32_t)1) << frr_protodown_r_bit)); ++ return (rc_bitfield == (((uint32_t)1) << if_netlink_get_frr_protodown_r_bit())); + } + + /* +@@ -2247,9 +2244,10 @@ ssize_t netlink_intf_msg_encode(uint16_t cmd, + return -1; + + nl_attr_put32(&req->n, buflen, IFLA_PROTO_DOWN_REASON_MASK, +- (1 << frr_protodown_r_bit)); ++ (1 << if_netlink_get_frr_protodown_r_bit())); + nl_attr_put32(&req->n, buflen, IFLA_PROTO_DOWN_REASON_VALUE, +- ((int)pd_reason_val) << frr_protodown_r_bit); ++ ((int)pd_reason_val) ++ << if_netlink_get_frr_protodown_r_bit()); + + nl_attr_nest_end(&req->n, nest_protodown_reason); + +@@ -2274,37 +2272,6 @@ void interface_list(struct zebra_ns *zns) + interface_addr_lookup_netlink(zns); + } + +-void if_netlink_set_frr_protodown_r_bit(uint8_t bit) +-{ +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "Protodown reason bit index changed: bit-index %u -> bit-index %u", +- frr_protodown_r_bit, bit); +- +- frr_protodown_r_bit = bit; +-} +- +-void if_netlink_unset_frr_protodown_r_bit(void) +-{ +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "Protodown reason bit index changed: bit-index %u -> bit-index %u", +- frr_protodown_r_bit, FRR_PROTODOWN_REASON_DEFAULT_BIT); +- +- frr_protodown_r_bit = FRR_PROTODOWN_REASON_DEFAULT_BIT; +-} +- +- +-bool if_netlink_frr_protodown_r_bit_is_set(void) +-{ +- return (frr_protodown_r_bit != FRR_PROTODOWN_REASON_DEFAULT_BIT); +-} +- +-uint8_t if_netlink_get_frr_protodown_r_bit(void) +-{ +- return frr_protodown_r_bit; +-} +- + /** + * netlink_request_tunneldump() - Request all tunnels from the linux kernel + * +diff --git a/zebra/if_netlink.h b/zebra/if_netlink.h +index 21ae1713be..f5a170a609 100644 +--- a/zebra/if_netlink.h ++++ b/zebra/if_netlink.h +@@ -54,17 +54,6 @@ extern int netlink_tunneldump_read(struct zebra_ns *zns); + extern enum netlink_msg_status + netlink_put_intf_update_msg(struct nl_batch *bth, struct zebra_dplane_ctx *ctx); + +-#define FRR_PROTODOWN_REASON_DEFAULT_BIT 7 +-/* Protodown bit setter/getter +- * +- * Allow users to change the bit if it conflicts with another +- * on their system. +- */ +-extern void if_netlink_set_frr_protodown_r_bit(uint8_t bit); +-extern void if_netlink_unset_frr_protodown_r_bit(void); +-extern bool if_netlink_frr_protodown_r_bit_is_set(void); +-extern uint8_t if_netlink_get_frr_protodown_r_bit(void); +- + #ifdef __cplusplus + } + #endif +diff --git a/zebra/zebra_router.c b/zebra/zebra_router.c +index a9a7b66ce7..12689804ea 100644 +--- a/zebra/zebra_router.c ++++ b/zebra/zebra_router.c +@@ -280,6 +280,8 @@ void zebra_router_init(bool asic_offload, bool notify_on_ack) + { + zrouter.sequence_num = 0; + ++ zrouter.protodown_r_bit = FRR_PROTODOWN_REASON_DEFAULT_BIT; ++ + zrouter.allow_delete = false; + + zrouter.packets_to_process = ZEBRA_ZAPI_PACKETS_TO_PROCESS; +diff --git a/zebra/zebra_router.h b/zebra/zebra_router.h +index e0ef86f082..61bde4ac2a 100644 +--- a/zebra/zebra_router.h ++++ b/zebra/zebra_router.h +@@ -244,6 +244,8 @@ struct zebra_router { + + /* Should we allow non FRR processes to delete our routes */ + bool allow_delete; ++ ++ uint8_t protodown_r_bit; + }; + + #define GRACEFUL_RESTART_TIME 60 +@@ -302,6 +304,32 @@ static inline bool zebra_router_in_shutdown(void) + return atomic_load_explicit(&zrouter.in_shutdown, memory_order_relaxed); + } + ++#define FRR_PROTODOWN_REASON_DEFAULT_BIT 7 ++/* Protodown bit setter/getter ++ * ++ * Allow users to change the bit if it conflicts with another ++ * on their system. ++ */ ++static inline void if_netlink_set_frr_protodown_r_bit(uint8_t bit) ++{ ++ zrouter.protodown_r_bit = bit; ++} ++ ++static inline void if_netlink_unset_frr_protodown_r_bit(void) ++{ ++ zrouter.protodown_r_bit = FRR_PROTODOWN_REASON_DEFAULT_BIT; ++} ++ ++static inline bool if_netlink_frr_protodown_r_bit_is_set(void) ++{ ++ return (zrouter.protodown_r_bit != FRR_PROTODOWN_REASON_DEFAULT_BIT); ++} ++ ++static inline uint8_t if_netlink_get_frr_protodown_r_bit(void) ++{ ++ return zrouter.protodown_r_bit; ++} ++ + /* zebra_northbound.c */ + extern const struct frr_yang_module_info frr_zebra_info; + +diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c +index c59cb7c0a7..9c5b38b96b 100644 +--- a/zebra/zebra_vrf.c ++++ b/zebra/zebra_vrf.c +@@ -390,7 +390,7 @@ struct zebra_vrf *zebra_vrf_alloc(struct vrf *vrf) + } + + /* +-Pending: create an efficient table_id (in a tree/hash) based lookup) ++ * Pending: create an efficient table_id (in a tree/hash) based lookup) + */ + vrf_id_t zebra_vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id) + { +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0013-zebra-fix-dplane-fpm-nl-to-allow-for-fast-configuration.patch b/src/sonic-frr/patch/0013-zebra-fix-dplane-fpm-nl-to-allow-for-fast-configuration.patch deleted file mode 100644 index 9a412d24ee86..000000000000 --- a/src/sonic-frr/patch/0013-zebra-fix-dplane-fpm-nl-to-allow-for-fast-configuration.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 551fa8c3549e24020dfce33d06ade4a14f72abfe Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Mon, 14 Nov 2022 08:28:45 -0500 -Subject: [PATCH] zebra: Fix dplane_fpm_nl to allow for fast configuration - -If you have this order in your configuration file: - -no fpm use-next-hop-groups -fpm address 127.0.0.1 - -the dplane code was using the same event thread t_event and the second -add event in the code was going, you already have an event scheduled -and as such the second event does not overwrite it. Leaving -no code to actually start the whole processing. There are probably -other cli iterations that will cause this fun as well, but I'm -not going to spend the time sussing them out at the moment. - -Fixes: #12314 -Signed-off-by: Donald Sharp ---- - zebra/dplane_fpm_nl.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c -index 7383c982baa..c5e1c113cb0 100644 ---- a/zebra/dplane_fpm_nl.c -+++ b/zebra/dplane_fpm_nl.c -@@ -98,6 +98,7 @@ struct fpm_nl_ctx { - struct thread *t_read; - struct thread *t_write; - struct thread *t_event; -+ struct thread *t_nhg; - struct thread *t_dequeue; - - /* zebra events. */ -@@ -271,7 +272,7 @@ DEFUN(fpm_use_nhg, fpm_use_nhg_cmd, - return CMD_SUCCESS; - - thread_add_event(gfnc->fthread->master, fpm_process_event, gfnc, -- FNE_TOGGLE_NHG, &gfnc->t_event); -+ FNE_TOGGLE_NHG, &gfnc->t_nhg); - - return CMD_SUCCESS; - } -@@ -287,7 +288,7 @@ DEFUN(no_fpm_use_nhg, no_fpm_use_nhg_cmd, - return CMD_SUCCESS; - - thread_add_event(gfnc->fthread->master, fpm_process_event, gfnc, -- FNE_TOGGLE_NHG, &gfnc->t_event); -+ FNE_TOGGLE_NHG, &gfnc->t_nhg); - - return CMD_SUCCESS; - } -@@ -1367,6 +1368,8 @@ static int fpm_nl_finish_early(struct fpm_nl_ctx *fnc) - THREAD_OFF(fnc->t_ribwalk); - THREAD_OFF(fnc->t_rmacreset); - THREAD_OFF(fnc->t_rmacwalk); -+ THREAD_OFF(fnc->t_event); -+ THREAD_OFF(fnc->t_nhg); - thread_cancel_async(fnc->fthread->master, &fnc->t_read, NULL); - thread_cancel_async(fnc->fthread->master, &fnc->t_write, NULL); - thread_cancel_async(fnc->fthread->master, &fnc->t_connect, NULL); diff --git a/src/sonic-frr/patch/0014-bgpd-Allow-network-XXX-to-work-with-bgp-suppress-fib.patch b/src/sonic-frr/patch/0014-bgpd-Allow-network-XXX-to-work-with-bgp-suppress-fib.patch deleted file mode 100644 index 60f1aa4cd357..000000000000 --- a/src/sonic-frr/patch/0014-bgpd-Allow-network-XXX-to-work-with-bgp-suppress-fib.patch +++ /dev/null @@ -1,190 +0,0 @@ -From 2ce65073a1c2c1a225488287eb886a76149db0a4 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Wed, 12 Oct 2022 14:53:21 -0400 -Subject: [PATCH 04/11] bgpd: Allow `network XXX` to work with bgp - suppress-fib-pending - -When bgp is using `bgp suppress-fib-pending` and the end -operator is using network statements, bgp was not sending -the network'ed prefix'es to it's peers. Fix this. - -Also update the test cases for bgp_suppress_fib to test -this new corner case( I am sure that there are going to -be others that will need to be added ). - -Fixes: #12112 -Signed-off-by: Donald Sharp -(cherry picked from commit 4801fc4670020406fc609dedabc7482d88e3b656) ---- - bgpd/bgp_route.h | 20 ++++++++++++++-- - .../bgp_suppress_fib/r1/bgp_ipv4_allowas.json | 2 +- - .../bgp_suppress_fib/r2/bgp_ipv4_allowas.json | 2 +- - tests/topotests/bgp_suppress_fib/r2/bgpd.conf | 2 ++ - .../topotests/bgp_suppress_fib/r2/zebra.conf | 3 +++ - .../bgp_suppress_fib/r3/v4_route3.json | 23 +++++++++++++++++++ - .../bgp_suppress_fib/test_bgp_suppress_fib.py | 14 ++++++++--- - 7 files changed, 59 insertions(+), 7 deletions(-) - create mode 100644 tests/topotests/bgp_suppress_fib/r3/v4_route3.json - -diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h -index a8ec2dc90..003a6cb79 100644 ---- a/bgpd/bgp_route.h -+++ b/bgpd/bgp_route.h -@@ -595,19 +595,35 @@ static inline bool bgp_check_advertise(struct bgp *bgp, struct bgp_dest *dest) - */ - static inline bool bgp_check_withdrawal(struct bgp *bgp, struct bgp_dest *dest) - { -- struct bgp_path_info *pi; -+ struct bgp_path_info *pi, *selected = NULL; - - if (!BGP_SUPPRESS_FIB_ENABLED(bgp)) - return false; - - for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) { -- if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) -+ if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) { -+ selected = pi; - continue; -+ } - - if (pi->sub_type != BGP_ROUTE_NORMAL) - return true; - } - -+ /* -+ * pi is selected and bgp is dealing with a static route -+ * ( ie a network statement of some sort ). FIB installed -+ * is irrelevant -+ * -+ * I am not sure what the above for loop is wanted in this -+ * manner at this point. But I do know that if I have -+ * a static route that is selected and it's the one -+ * being checked for should I withdrawal we do not -+ * want to withdraw the route on installation :) -+ */ -+ if (selected && selected->sub_type == BGP_ROUTE_STATIC) -+ return false; -+ - if (CHECK_FLAG(dest->flags, BGP_NODE_FIB_INSTALLED)) - return false; - -diff --git a/tests/topotests/bgp_suppress_fib/r1/bgp_ipv4_allowas.json b/tests/topotests/bgp_suppress_fib/r1/bgp_ipv4_allowas.json -index bc4d0f479..1a5ede276 100644 ---- a/tests/topotests/bgp_suppress_fib/r1/bgp_ipv4_allowas.json -+++ b/tests/topotests/bgp_suppress_fib/r1/bgp_ipv4_allowas.json -@@ -32,7 +32,7 @@ - ], - "peer":{ - "peerId":"10.0.0.2", -- "routerId":"10.0.0.9", -+ "routerId":"60.0.0.1", - "type":"external" - } - } -diff --git a/tests/topotests/bgp_suppress_fib/r2/bgp_ipv4_allowas.json b/tests/topotests/bgp_suppress_fib/r2/bgp_ipv4_allowas.json -index 16561ce83..4a35abfd6 100644 ---- a/tests/topotests/bgp_suppress_fib/r2/bgp_ipv4_allowas.json -+++ b/tests/topotests/bgp_suppress_fib/r2/bgp_ipv4_allowas.json -@@ -61,7 +61,7 @@ - ], - "peer":{ - "peerId":"0.0.0.0", -- "routerId":"10.0.0.9" -+ "routerId":"60.0.0.1" - } - } - ] -diff --git a/tests/topotests/bgp_suppress_fib/r2/bgpd.conf b/tests/topotests/bgp_suppress_fib/r2/bgpd.conf -index ebef2012a..010e86aad 100644 ---- a/tests/topotests/bgp_suppress_fib/r2/bgpd.conf -+++ b/tests/topotests/bgp_suppress_fib/r2/bgpd.conf -@@ -7,3 +7,5 @@ router bgp 2 - bgp suppress-fib-pending - neighbor 10.0.0.1 remote-as 1 - neighbor 10.0.0.10 remote-as 3 -+ address-family ipv4 uni -+ network 60.0.0.0/24 -\ No newline at end of file -diff --git a/tests/topotests/bgp_suppress_fib/r2/zebra.conf b/tests/topotests/bgp_suppress_fib/r2/zebra.conf -index 443fffc70..6e8bce045 100644 ---- a/tests/topotests/bgp_suppress_fib/r2/zebra.conf -+++ b/tests/topotests/bgp_suppress_fib/r2/zebra.conf -@@ -1,4 +1,7 @@ - ! -+interface lo -+ ip address 60.0.0.1/24 -+! - interface r2-eth0 - ip address 10.0.0.2/30 - ! -diff --git a/tests/topotests/bgp_suppress_fib/r3/v4_route3.json b/tests/topotests/bgp_suppress_fib/r3/v4_route3.json -new file mode 100644 -index 000000000..ab8c3aa5e ---- /dev/null -+++ b/tests/topotests/bgp_suppress_fib/r3/v4_route3.json -@@ -0,0 +1,23 @@ -+{ -+ "60.0.0.0/24":[ -+ { -+ "prefix":"60.0.0.0/24", -+ "protocol":"bgp", -+ "selected":true, -+ "destSelected":true, -+ "distance":20, -+ "metric":0, -+ "installed":true, -+ "table":254, -+ "nexthops":[ -+ { -+ "fib":true, -+ "ip":"10.0.0.9", -+ "afi":"ipv4", -+ "interfaceName":"r3-eth0", -+ "active":true -+ } -+ ] -+ } -+ ] -+} -diff --git a/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py b/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py -index 2c87d9d7b..96a294cae 100644 ---- a/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py -+++ b/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py -@@ -84,8 +84,6 @@ def test_bgp_route(): - - r3 = tgen.gears["r3"] - -- sleep(5) -- - json_file = "{}/r3/v4_route.json".format(CWD) - expected = json.loads(open(json_file).read()) - -@@ -95,7 +93,7 @@ def test_bgp_route(): - "show ip route 40.0.0.0 json", - expected, - ) -- _, result = topotest.run_and_expect(test_func, None, count=2, wait=0.5) -+ _, result = topotest.run_and_expect(test_func, None, count=20, wait=0.5) - assertmsg = '"r3" JSON output mismatches' - assert result is None, assertmsg - -@@ -112,6 +110,16 @@ def test_bgp_route(): - assertmsg = '"r3" JSON output mismatches' - assert result is None, assertmsg - -+ json_file = "{}/r3/v4_route3.json".format(CWD) -+ expected = json.loads(open(json_file).read()) -+ -+ test_func = partial( -+ topotest.router_json_cmp, -+ r3, -+ "show ip route 10.0.0.3 json", -+ expected, -+ ) -+ _, result = topotest.run_and_expect(test_func, None, count=3, wait=0.5) - - def test_bgp_better_admin_won(): - "A better Admin distance protocol may come along and knock us out" --- -2.30.2 - diff --git a/src/sonic-frr/patch/0014-zebra-Remove-unused-dplane_intf_delete.patch b/src/sonic-frr/patch/0014-zebra-Remove-unused-dplane_intf_delete.patch new file mode 100644 index 000000000000..756e0cf97419 --- /dev/null +++ b/src/sonic-frr/patch/0014-zebra-Remove-unused-dplane_intf_delete.patch @@ -0,0 +1,48 @@ +From 88f7441f56bf61008a52adda97525ffb20f9543d Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Fri, 14 Apr 2023 07:43:19 -0400 +Subject: [PATCH] zebra: Remove unused dplane_intf_delete + +There is no need for this functionality and it is +not used. + +Signed-off-by: Donald Sharp + +diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c +index 4927af5625..a6c08f7371 100644 +--- a/zebra/zebra_dplane.c ++++ b/zebra/zebra_dplane.c +@@ -4648,18 +4648,6 @@ enum zebra_dplane_result dplane_intf_update(const struct interface *ifp) + return ret; + } + +-/* +- * Enqueue a interface delete for the dataplane. +- */ +-enum zebra_dplane_result dplane_intf_delete(const struct interface *ifp) +-{ +- enum zebra_dplane_result ret = ZEBRA_DPLANE_REQUEST_FAILURE; +- +- if (ifp) +- ret = dplane_intf_update_internal(ifp, DPLANE_OP_INTF_DELETE); +- return ret; +-} +- + /* + * Enqueue vxlan/evpn mac add (or update). + */ +diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h +index ae13243a16..9ef0afd3a8 100644 +--- a/zebra/zebra_dplane.h ++++ b/zebra/zebra_dplane.h +@@ -758,7 +758,6 @@ enum zebra_dplane_result dplane_intf_addr_unset(const struct interface *ifp, + */ + enum zebra_dplane_result dplane_intf_add(const struct interface *ifp); + enum zebra_dplane_result dplane_intf_update(const struct interface *ifp); +-enum zebra_dplane_result dplane_intf_delete(const struct interface *ifp); + + /* + * Enqueue tc link changes for the dataplane. +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0015-zebra-Remove-unused-add-variable.patch b/src/sonic-frr/patch/0015-zebra-Remove-unused-add-variable.patch new file mode 100644 index 000000000000..dc263d3d94c0 --- /dev/null +++ b/src/sonic-frr/patch/0015-zebra-Remove-unused-add-variable.patch @@ -0,0 +1,53 @@ +From 4cc6c7af6f7c72ddf18ab562f4e2c2b25e32f1b5 Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Sat, 15 Apr 2023 08:04:51 -0400 +Subject: [PATCH] zebra: Remove unused add variable + +Function was not using the add variable. Remove it. + +Signed-off-by: Donald Sharp + +diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c +index 95889e22fd..e54fb09022 100644 +--- a/zebra/if_netlink.c ++++ b/zebra/if_netlink.c +@@ -670,7 +670,7 @@ static void netlink_interface_update_l2info(struct interface *ifp, + struct zebra_l2info_bridge bridge_info; + + netlink_extract_bridge_info(link_data, &bridge_info); +- zebra_l2_bridge_add_update(ifp, &bridge_info, add); ++ zebra_l2_bridge_add_update(ifp, &bridge_info); + } else if (IS_ZEBRA_IF_VLAN(ifp)) { + struct zebra_l2info_vlan vlan_info; + +diff --git a/zebra/zebra_l2.c b/zebra/zebra_l2.c +index 8a9f3dffe3..07bbc6e3bc 100644 +--- a/zebra/zebra_l2.c ++++ b/zebra/zebra_l2.c +@@ -258,8 +258,7 @@ void zebra_l2if_update_bond(struct interface *ifp, bool add) + * map slaves (if any) to the bridge. + */ + void zebra_l2_bridge_add_update(struct interface *ifp, +- struct zebra_l2info_bridge *bridge_info, +- int add) ++ struct zebra_l2info_bridge *bridge_info) + { + struct zebra_if *zif; + +diff --git a/zebra/zebra_l2.h b/zebra/zebra_l2.h +index 1c3e98158d..8fef008f52 100644 +--- a/zebra/zebra_l2.h ++++ b/zebra/zebra_l2.h +@@ -109,8 +109,7 @@ extern void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave, + extern void + zebra_l2_unmap_slave_from_bridge(struct zebra_l2info_brslave *br_slave); + extern void zebra_l2_bridge_add_update(struct interface *ifp, +- struct zebra_l2info_bridge *bridge_info, +- int add); ++ struct zebra_l2info_bridge *bridge_info); + extern void zebra_l2_bridge_del(struct interface *ifp); + extern void zebra_l2_vlanif_update(struct interface *ifp, + struct zebra_l2info_vlan *vlan_info); +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0015-zebra-Return-statements-do-not-use-paranthesis.patch b/src/sonic-frr/patch/0015-zebra-Return-statements-do-not-use-paranthesis.patch deleted file mode 100755 index 592af9308c07..000000000000 --- a/src/sonic-frr/patch/0015-zebra-Return-statements-do-not-use-paranthesis.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 07a41dcd82ff41b406d0011554d70ce79da68df5 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Wed, 5 Oct 2022 10:26:07 -0400 -Subject: [PATCH 1/8] zebra: Return statements do not use paranthesis - -Signed-off-by: Donald Sharp ---- - zebra/zebra_rib.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c -index cf1baf077..472e48925 100644 ---- a/zebra/zebra_rib.c -+++ b/zebra/zebra_rib.c -@@ -1403,8 +1403,7 @@ static bool rib_route_match_ctx(const struct route_entry *re, - } - - done: -- -- return (result); -+ return result; - } - - static void zebra_rib_fixup_system(struct route_node *rn) --- -2.30.2 - diff --git a/src/sonic-frr/patch/0016-zebra-Add-zrouter.asic_notification_nexthop_control.patch b/src/sonic-frr/patch/0016-zebra-Add-zrouter.asic_notification_nexthop_control.patch deleted file mode 100755 index 78e17849cad0..000000000000 --- a/src/sonic-frr/patch/0016-zebra-Add-zrouter.asic_notification_nexthop_control.patch +++ /dev/null @@ -1,205 +0,0 @@ -From 01e267d98c63ee4464f96fead11dda9ee0ad911b Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Wed, 5 Oct 2022 10:04:11 -0400 -Subject: [PATCH 2/8] zebra: Add `zrouter.asic_notification_nexthop_control` - -Volta submitted notification changes for the dplane that had a -special use case for their system. Volta is no more, the code -is not being actively developed and from talking with ex-Volta -employees there is no current plans to even maintain this code. -Wrap the special handling of nexthops that their asic-dataplane -did in a bit of code to isolate it and allow for future removal, -as that I do not actually believe anyone else is using this code. -Add a CPP_NOTICE several years into the future that will tell us -to remove the code. If someone starts using it then they will -have to notice this variable to set it and hopefully they will -see my CPP_NOTICE to come talk to us. If this is being used then -we can just remove this wrapper. - -Signed-off-by: Donald Sharp ---- - zebra/zebra_rib.c | 95 +++++++++++++++++++++++++------------------- - zebra/zebra_router.c | 11 +++++ - zebra/zebra_router.h | 8 ++++ - zebra/zebra_vty.c | 9 +++++ - 4 files changed, 83 insertions(+), 40 deletions(-) - -diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c -index 472e48925..abd6e07f9 100644 ---- a/zebra/zebra_rib.c -+++ b/zebra/zebra_rib.c -@@ -2215,55 +2215,70 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) - /* Various fib transitions: changed nexthops; from installed to - * not-installed; or not-installed to installed. - */ -- if (start_count > 0 && end_count > 0) { -- if (debug_p) -- zlog_debug( -- "%s(%u:%u):%pRN applied nexthop changes from dplane notification", -- VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), -- dplane_ctx_get_table(ctx), rn); -+ if (zrouter.asic_notification_nexthop_control) { -+ if (start_count > 0 && end_count > 0) { -+ if (debug_p) -+ zlog_debug( -+ "%s(%u:%u):%pRN applied nexthop changes from dplane notification", -+ VRF_LOGNAME(vrf), -+ dplane_ctx_get_vrf(ctx), -+ dplane_ctx_get_table(ctx), rn); - -- /* Changed nexthops - update kernel/others */ -- dplane_route_notif_update(rn, re, -- DPLANE_OP_ROUTE_UPDATE, ctx); -+ /* Changed nexthops - update kernel/others */ -+ dplane_route_notif_update(rn, re, -+ DPLANE_OP_ROUTE_UPDATE, ctx); - -- } else if (start_count == 0 && end_count > 0) { -- if (debug_p) -- zlog_debug( -- "%s(%u:%u):%pRN installed transition from dplane notification", -- VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), -- dplane_ctx_get_table(ctx), rn); -+ } else if (start_count == 0 && end_count > 0) { -+ if (debug_p) -+ zlog_debug( -+ "%s(%u:%u):%pRN installed transition from dplane notification", -+ VRF_LOGNAME(vrf), -+ dplane_ctx_get_vrf(ctx), -+ dplane_ctx_get_table(ctx), rn); - -- /* We expect this to be the selected route, so we want -- * to tell others about this transition. -- */ -- SET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); -+ /* We expect this to be the selected route, so we want -+ * to tell others about this transition. -+ */ -+ SET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); - -- /* Changed nexthops - update kernel/others */ -- dplane_route_notif_update(rn, re, DPLANE_OP_ROUTE_UPDATE, ctx); -+ /* Changed nexthops - update kernel/others */ -+ dplane_route_notif_update(rn, re, -+ DPLANE_OP_ROUTE_UPDATE, ctx); - -- /* Redistribute, lsp, and nht update */ -- redistribute_update(rn, re, NULL); -+ /* Redistribute, lsp, and nht update */ -+ redistribute_update(rn, re, NULL); - -- } else if (start_count > 0 && end_count == 0) { -- if (debug_p) -- zlog_debug( -- "%s(%u:%u):%pRN un-installed transition from dplane notification", -- VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx), -- dplane_ctx_get_table(ctx), rn); -+ } else if (start_count > 0 && end_count == 0) { -+ if (debug_p) -+ zlog_debug( -+ "%s(%u:%u):%pRN un-installed transition from dplane notification", -+ VRF_LOGNAME(vrf), -+ dplane_ctx_get_vrf(ctx), -+ dplane_ctx_get_table(ctx), rn); - -- /* Transition from _something_ installed to _nothing_ -- * installed. -- */ -- /* We expect this to be the selected route, so we want -- * to tell others about this transistion. -- */ -- UNSET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); -+ /* Transition from _something_ installed to _nothing_ -+ * installed. -+ */ -+ /* We expect this to be the selected route, so we want -+ * to tell others about this transistion. -+ */ -+ UNSET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); - -- /* Changed nexthops - update kernel/others */ -- dplane_route_notif_update(rn, re, DPLANE_OP_ROUTE_DELETE, ctx); -+ /* Changed nexthops - update kernel/others */ -+ dplane_route_notif_update(rn, re, -+ DPLANE_OP_ROUTE_DELETE, ctx); - -- /* Redistribute, lsp, and nht update */ -- redistribute_delete(rn, re, NULL); -+ /* Redistribute, lsp, and nht update */ -+ redistribute_delete(rn, re, NULL); -+ } -+ } -+ -+ if (!zebra_router_notify_on_ack()) { -+ if (CHECK_FLAG(re->flags, ZEBRA_FLAG_OFFLOADED)) -+ zsend_route_notify_owner_ctx(ctx, ZAPI_ROUTE_INSTALLED); -+ if (CHECK_FLAG(re->flags, ZEBRA_FLAG_OFFLOAD_FAILED)) -+ zsend_route_notify_owner_ctx(ctx, -+ ZAPI_ROUTE_FAIL_INSTALL); - } - - /* Make any changes visible for lsp and nexthop-tracking processing */ -diff --git a/zebra/zebra_router.c b/zebra/zebra_router.c -index 92a3b9424..d47517bbb 100644 ---- a/zebra/zebra_router.c -+++ b/zebra/zebra_router.c -@@ -304,6 +304,17 @@ void zebra_router_init(bool asic_offload, bool notify_on_ack) - zrouter.asic_offloaded = asic_offload; - zrouter.notify_on_ack = notify_on_ack; - -+ /* -+ * If you start using asic_notification_nexthop_control -+ * come talk to the FRR community about what you are doing -+ * We would like to know. -+ */ -+#if CONFDATE > 20251231 -+ CPP_NOTICE( -+ "Remove zrouter.asic_notification_nexthop_control as that it's not being maintained or used"); -+#endif -+ zrouter.asic_notification_nexthop_control = false; -+ - #ifdef HAVE_SCRIPTING - zebra_script_init(); - #endif -diff --git a/zebra/zebra_router.h b/zebra/zebra_router.h -index c0eab9cd6..583bd0038 100644 ---- a/zebra/zebra_router.h -+++ b/zebra/zebra_router.h -@@ -209,6 +209,14 @@ struct zebra_router { - */ - bool asic_offloaded; - bool notify_on_ack; -+ -+ /* -+ * If the asic is notifying us about successful nexthop -+ * allocation/control. Some developers have made their -+ * asic take control of how many nexthops/ecmp they can -+ * have and will report what is successfull or not -+ */ -+ bool asic_notification_nexthop_control; - }; - - #define GRACEFUL_RESTART_TIME 60 -diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c -index 0a3d676a9..a7eb09df0 100644 ---- a/zebra/zebra_vty.c -+++ b/zebra/zebra_vty.c -@@ -3972,6 +3972,15 @@ DEFUN (show_zebra, - if (zrouter.asic_offloaded) - vty_out(vty, "Asic Offload is being used\n"); - -+ /* -+ * Do not display this unless someone is actually using it -+ * -+ * Why this distinction? I think this is effectively dead code -+ * and should not be exposed. Maybe someone proves me wrong. -+ */ -+ if (zrouter.asic_notification_nexthop_control) -+ vty_out(vty, "ASIC offload and nexthop control is being used"); -+ - vty_out(vty, - " Route Route Neighbor LSP LSP\n"); - vty_out(vty, --- -2.30.2 - diff --git a/src/sonic-frr/patch/0016-zebra-Remove-duplicate-function-for-netlink-interfac.patch b/src/sonic-frr/patch/0016-zebra-Remove-duplicate-function-for-netlink-interfac.patch new file mode 100644 index 000000000000..8f13d20f0052 --- /dev/null +++ b/src/sonic-frr/patch/0016-zebra-Remove-duplicate-function-for-netlink-interfac.patch @@ -0,0 +1,301 @@ +From e12ffa6871d33712b03fc2ca28de278913e95bce Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Thu, 13 Apr 2023 16:43:27 -0400 +Subject: [PATCH] zebra: Remove duplicate function for netlink interface + changes + +Turns out FRR has 2 functions one specifically for startup +and one for normal day to day operations. There were only +a couple of minor differences from what I could tell, and +where they were different the after startup functionality should +have been updated too. I cannot figure out why we have 2. + +Non-startup handling of bonds appears to be incorrect +so let's fix that. Additionally the speed was not +properly being set in non-startup situations. + +Signed-off-by: Donald Sharp + +diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c +index e54fb09022..ed5b3c4a66 100644 +--- a/zebra/if_netlink.c ++++ b/zebra/if_netlink.c +@@ -938,178 +938,6 @@ static void if_sweep_protodown(struct zebra_if *zif) + dplane_intf_update(zif->ifp); + } + +-/* +- * Called from interface_lookup_netlink(). This function is only used +- * during bootstrap. +- */ +-static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup) +-{ +- int len; +- struct ifinfomsg *ifi; +- struct rtattr *tb[IFLA_MAX + 1]; +- struct rtattr *linkinfo[IFLA_MAX + 1]; +- struct interface *ifp; +- char *name = NULL; +- char *kind = NULL; +- char *desc = NULL; +- char *slave_kind = NULL; +- struct zebra_ns *zns = NULL; +- vrf_id_t vrf_id = VRF_DEFAULT; +- enum zebra_iftype zif_type = ZEBRA_IF_OTHER; +- enum zebra_slave_iftype zif_slave_type = ZEBRA_IF_SLAVE_NONE; +- ifindex_t bridge_ifindex = IFINDEX_INTERNAL; +- ifindex_t link_ifindex = IFINDEX_INTERNAL; +- ifindex_t bond_ifindex = IFINDEX_INTERNAL; +- struct zebra_if *zif; +- ns_id_t link_nsid = ns_id; +- uint8_t bypass = 0; +- +- frrtrace(3, frr_zebra, netlink_interface, h, ns_id, startup); +- +- zns = zebra_ns_lookup(ns_id); +- ifi = NLMSG_DATA(h); +- +- if (h->nlmsg_type != RTM_NEWLINK) +- return 0; +- +- len = h->nlmsg_len - NLMSG_LENGTH(sizeof(struct ifinfomsg)); +- if (len < 0) { +- zlog_err( +- "%s: Message received from netlink is of a broken size: %d %zu", +- __func__, h->nlmsg_len, +- (size_t)NLMSG_LENGTH(sizeof(struct ifinfomsg))); +- return -1; +- } +- +- /* We are interested in some AF_BRIDGE notifications. */ +- if (ifi->ifi_family == AF_BRIDGE) +- return netlink_bridge_interface(h, len, ns_id, startup); +- +- /* Looking up interface name. */ +- memset(linkinfo, 0, sizeof(linkinfo)); +- netlink_parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(ifi), len, +- NLA_F_NESTED); +- +- /* check for wireless messages to ignore */ +- if ((tb[IFLA_WIRELESS] != NULL) && (ifi->ifi_change == 0)) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug("%s: ignoring IFLA_WIRELESS message", +- __func__); +- return 0; +- } +- +- if (tb[IFLA_IFNAME] == NULL) +- return -1; +- name = (char *)RTA_DATA(tb[IFLA_IFNAME]); +- +- if (tb[IFLA_IFALIAS]) +- desc = (char *)RTA_DATA(tb[IFLA_IFALIAS]); +- +- if (tb[IFLA_LINKINFO]) { +- netlink_parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, +- tb[IFLA_LINKINFO]); +- +- if (linkinfo[IFLA_INFO_KIND]) +- kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]); +- +- if (linkinfo[IFLA_INFO_SLAVE_KIND]) +- slave_kind = RTA_DATA(linkinfo[IFLA_INFO_SLAVE_KIND]); +- +- if ((slave_kind != NULL) && strcmp(slave_kind, "bond") == 0) +- netlink_determine_zebra_iftype("bond_slave", &zif_type); +- else +- netlink_determine_zebra_iftype(kind, &zif_type); +- } +- +- /* If VRF, create the VRF structure itself. */ +- if (zif_type == ZEBRA_IF_VRF && !vrf_is_backend_netns()) { +- netlink_vrf_change(h, tb[IFLA_LINKINFO], ns_id, name); +- vrf_id = (vrf_id_t)ifi->ifi_index; +- } +- +- if (tb[IFLA_MASTER]) { +- if (slave_kind && (strcmp(slave_kind, "vrf") == 0) +- && !vrf_is_backend_netns()) { +- zif_slave_type = ZEBRA_IF_SLAVE_VRF; +- vrf_id = *(uint32_t *)RTA_DATA(tb[IFLA_MASTER]); +- } else if (slave_kind && (strcmp(slave_kind, "bridge") == 0)) { +- zif_slave_type = ZEBRA_IF_SLAVE_BRIDGE; +- bridge_ifindex = +- *(ifindex_t *)RTA_DATA(tb[IFLA_MASTER]); +- } else if (slave_kind && (strcmp(slave_kind, "bond") == 0)) { +- zif_slave_type = ZEBRA_IF_SLAVE_BOND; +- bond_ifindex = *(ifindex_t *)RTA_DATA(tb[IFLA_MASTER]); +- bypass = netlink_parse_lacp_bypass(linkinfo); +- } else +- zif_slave_type = ZEBRA_IF_SLAVE_OTHER; +- } +- if (vrf_is_backend_netns()) +- vrf_id = (vrf_id_t)ns_id; +- +- /* If linking to another interface, note it. */ +- if (tb[IFLA_LINK]) +- link_ifindex = *(ifindex_t *)RTA_DATA(tb[IFLA_LINK]); +- +- if (tb[IFLA_LINK_NETNSID]) { +- link_nsid = *(ns_id_t *)RTA_DATA(tb[IFLA_LINK_NETNSID]); +- link_nsid = ns_id_get_absolute(ns_id, link_nsid); +- } +- +- ifp = if_get_by_name(name, vrf_id, NULL); +- set_ifindex(ifp, ifi->ifi_index, zns); /* add it to ns struct */ +- +- ifp->flags = ifi->ifi_flags & 0x0000fffff; +- ifp->mtu6 = ifp->mtu = *(uint32_t *)RTA_DATA(tb[IFLA_MTU]); +- ifp->metric = 0; +- ifp->speed = get_iflink_speed(ifp, NULL); +- ifp->ptm_status = ZEBRA_PTM_STATUS_UNKNOWN; +- +- /* Set zebra interface type */ +- zebra_if_set_ziftype(ifp, zif_type, zif_slave_type); +- if (IS_ZEBRA_IF_VRF(ifp)) +- SET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK); +- +- /* +- * Just set the @link/lower-device ifindex. During nldump interfaces are +- * not ordered in any fashion so we may end up getting upper devices +- * before lower devices. We will setup the real linkage once the dump +- * is complete. +- */ +- zif = (struct zebra_if *)ifp->info; +- zif->link_ifindex = link_ifindex; +- +- if (desc) { +- XFREE(MTYPE_ZIF_DESC, zif->desc); +- zif->desc = XSTRDUP(MTYPE_ZIF_DESC, desc); +- } +- +- /* Hardware type and address. */ +- ifp->ll_type = netlink_to_zebra_link_type(ifi->ifi_type); +- +- netlink_interface_update_hw_addr(tb, ifp); +- +- if_add_update(ifp); +- +- /* Extract and save L2 interface information, take additional actions. +- */ +- netlink_interface_update_l2info(ifp, linkinfo[IFLA_INFO_DATA], +- 1, link_nsid); +- if (IS_ZEBRA_IF_BOND(ifp)) +- zebra_l2if_update_bond(ifp, true); +- if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp)) +- zebra_l2if_update_bridge_slave(ifp, bridge_ifindex, ns_id, +- ZEBRA_BRIDGE_NO_ACTION); +- else if (IS_ZEBRA_IF_BOND_SLAVE(ifp)) +- zebra_l2if_update_bond_slave(ifp, bond_ifindex, !!bypass); +- +- if (tb[IFLA_PROTO_DOWN]) { +- netlink_proc_dplane_if_protodown(zif, tb); +- if_sweep_protodown(zif); +- } +- +- return 0; +-} +- + /* Request for specific interface or address information from the kernel */ + static int netlink_request_intf_addr(struct nlsock *netlink_cmd, int family, + int type, uint32_t filter_mask) +@@ -1165,7 +993,7 @@ int interface_lookup_netlink(struct zebra_ns *zns) + ret = netlink_request_intf_addr(netlink_cmd, AF_PACKET, RTM_GETLINK, 0); + if (ret < 0) + return ret; +- ret = netlink_parse_info(netlink_interface, netlink_cmd, &dp_info, 0, ++ ret = netlink_parse_info(netlink_link_change, netlink_cmd, &dp_info, 0, + true); + if (ret < 0) + return ret; +@@ -1175,7 +1003,7 @@ int interface_lookup_netlink(struct zebra_ns *zns) + RTEXT_FILTER_BRVLAN); + if (ret < 0) + return ret; +- ret = netlink_parse_info(netlink_interface, netlink_cmd, &dp_info, 0, ++ ret = netlink_parse_info(netlink_link_change, netlink_cmd, &dp_info, 0, + true); + if (ret < 0) + return ret; +@@ -1816,6 +1644,8 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + ifindex_t master_infindex = IFINDEX_INTERNAL; + uint8_t bypass = 0; + ++ frrtrace(3, frr_zebra, netlink_interface, h, ns_id, startup); ++ + zns = zebra_ns_lookup(ns_id); + ifi = NLMSG_DATA(h); + +@@ -1884,7 +1714,10 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + if (linkinfo[IFLA_INFO_SLAVE_KIND]) + slave_kind = RTA_DATA(linkinfo[IFLA_INFO_SLAVE_KIND]); + +- netlink_determine_zebra_iftype(kind, &zif_type); ++ if ((slave_kind != NULL) && strcmp(slave_kind, "bond") == 0) ++ netlink_determine_zebra_iftype("bond_slave", &zif_type); ++ else ++ netlink_determine_zebra_iftype(kind, &zif_type); + } + + /* If linking to another interface, note it. */ +@@ -1961,6 +1794,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + } + ifp->mtu6 = ifp->mtu = *(int *)RTA_DATA(tb[IFLA_MTU]); + ifp->metric = 0; ++ ifp->speed = get_iflink_speed(ifp, NULL); + ifp->ptm_status = ZEBRA_PTM_STATUS_UNKNOWN; + + /* Set interface type */ +@@ -1972,6 +1806,16 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + /* Update link. */ + zebra_if_update_link(ifp, link_ifindex, link_nsid); + ++ /* ++ * Just set the @link/lower-device ifindex. During ++ * nldump interfaces are not ordered in any fashion so ++ * we may end up getting upper devices before lower ++ * devices. We will setup the real linkage once the dump ++ * is complete. ++ */ ++ zif = (struct zebra_if *)ifp->info; ++ zif->link_ifindex = link_ifindex; ++ + ifp->ll_type = + netlink_to_zebra_link_type(ifi->ifi_type); + netlink_interface_update_hw_addr(tb, ifp); +@@ -1984,6 +1828,8 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + netlink_interface_update_l2info( + ifp, linkinfo[IFLA_INFO_DATA], + 1, link_nsid); ++ if (IS_ZEBRA_IF_BOND(ifp)) ++ zebra_l2if_update_bond(ifp, true); + if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp)) + zebra_l2if_update_bridge_slave( + ifp, bridge_ifindex, ns_id, +@@ -1992,10 +1838,12 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + zebra_l2if_update_bond_slave(ifp, bond_ifindex, + !!bypass); + +- if (tb[IFLA_PROTO_DOWN]) ++ if (tb[IFLA_PROTO_DOWN]) { + netlink_proc_dplane_if_protodown(ifp->info, tb); ++ if (startup) ++ if_sweep_protodown(zif); ++ } + if (IS_ZEBRA_IF_BRIDGE(ifp)) { +- zif = ifp->info; + if (IS_ZEBRA_DEBUG_KERNEL) + zlog_debug( + "RTM_NEWLINK ADD for %s(%u), vlan-aware %d", +@@ -2329,7 +2177,7 @@ int netlink_tunneldump_read(struct zebra_ns *zns) + if (ret < 0) + return ret; + +- ret = netlink_parse_info(netlink_interface, netlink_cmd, ++ ret = netlink_parse_info(netlink_link_change, netlink_cmd, + &dp_info, 0, true); + + if (ret < 0) +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0017-zebra-Add-code-to-get-set-interface-to-pass-up-from-.patch b/src/sonic-frr/patch/0017-zebra-Add-code-to-get-set-interface-to-pass-up-from-.patch new file mode 100644 index 000000000000..c46c29737a0e --- /dev/null +++ b/src/sonic-frr/patch/0017-zebra-Add-code-to-get-set-interface-to-pass-up-from-.patch @@ -0,0 +1,809 @@ +From 1b576b080613cd545ecd742b6a16146ab781695f Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Thu, 20 Apr 2023 08:51:42 -0400 +Subject: [PATCH] zebra: Add code to get/set interface to pass up from dplane + +1) Add a bunch of get/set functions and associated data +structure in zebra_dplane to allow the setting and retrieval +of interface netlink data up into the master pthread. + +2) Add a bit of code to breakup startup into stages. This is +because FRR currently has a mix of dplane and non dplane interactions +and the code needs to be paused before continuing on. + +Signed-off-by: Donald Sharp + +diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c +index 804eb43a44..0d629fe0b9 100644 +--- a/zebra/dplane_fpm_nl.c ++++ b/zebra/dplane_fpm_nl.c +@@ -955,6 +955,7 @@ static int fpm_nl_enqueue(struct fpm_nl_ctx *fnc, struct zebra_dplane_ctx *ctx) + case DPLANE_OP_TC_FILTER_DELETE: + case DPLANE_OP_TC_FILTER_UPDATE: + case DPLANE_OP_NONE: ++ case DPLANE_OP_STARTUP_STAGE: + break; + + } +diff --git a/zebra/interface.c b/zebra/interface.c +index 84e52d4b43..a05b9690ef 100644 +--- a/zebra/interface.c ++++ b/zebra/interface.c +@@ -1590,6 +1590,7 @@ void zebra_if_dplane_result(struct zebra_dplane_ctx *ctx) + case DPLANE_OP_TC_FILTER_ADD: + case DPLANE_OP_TC_FILTER_DELETE: + case DPLANE_OP_TC_FILTER_UPDATE: ++ case DPLANE_OP_STARTUP_STAGE: + break; /* should never hit here */ + } + } +diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c +index 42afe61469..4cd84cada2 100644 +--- a/zebra/kernel_netlink.c ++++ b/zebra/kernel_netlink.c +@@ -1632,6 +1632,7 @@ static enum netlink_msg_status nl_put_msg(struct nl_batch *bth, + case DPLANE_OP_IPSET_DELETE: + case DPLANE_OP_IPSET_ENTRY_ADD: + case DPLANE_OP_IPSET_ENTRY_DELETE: ++ case DPLANE_OP_STARTUP_STAGE: + return FRR_NETLINK_ERROR; + + case DPLANE_OP_GRE_SET: +diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c +index 684ccc3ed5..f3462b9f22 100644 +--- a/zebra/kernel_socket.c ++++ b/zebra/kernel_socket.c +@@ -1631,6 +1631,7 @@ void kernel_update_multi(struct dplane_ctx_list_head *ctx_list) + case DPLANE_OP_GRE_SET: + case DPLANE_OP_INTF_ADDR_ADD: + case DPLANE_OP_INTF_ADDR_DEL: ++ case DPLANE_OP_STARTUP_STAGE: + zlog_err("Unhandled dplane data for %s", + dplane_op2str(dplane_ctx_get_op(ctx))); + res = ZEBRA_DPLANE_REQUEST_FAILURE; +diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c +index a6c08f7371..0b33a5189c 100644 +--- a/zebra/zebra_dplane.c ++++ b/zebra/zebra_dplane.c +@@ -193,10 +193,43 @@ struct dplane_br_port_info { + */ + struct dplane_intf_info { + ++ enum zebra_iftype zif_type; ++ ifindex_t bond_ifindex; ++ ifindex_t link_ifindex; ++ int32_t mtu; ++ vrf_id_t vrf_id; ++ enum zebra_slave_iftype zif_slave_type; ++ ifindex_t master_ifindex; ++ ifindex_t bridge_ifindex; ++ ns_id_t link_nsid; ++ enum zebra_slave_iftype zslave_type; ++ uint8_t bypass; ++ enum zebra_link_type zltype; ++ bool startup; ++ uint8_t family; ++ struct zebra_vxlan_vni_array *vniarray; ++ struct zebra_dplane_bridge_vlan_info bvinfo; ++ struct zebra_dplane_bridge_vlan_info_array *bvarray; ++ ++ char desc[128]; ++ ++ int32_t hw_addr_len; ++ uint8_t hw_addr[INTERFACE_HWADDR_MAX]; ++ ++ uint32_t table_id; ++ ++ struct zebra_l2info_bridge binfo; ++ struct zebra_l2info_vlan vinfo; ++ struct zebra_l2info_vxlan vxinfo; ++ struct zebra_l2info_gre grinfo; ++ ++ uint32_t rc_bitfield; ++ + uint32_t metric; + uint32_t flags; + + bool protodown; ++ bool protodown_set; + bool pd_reason_val; + + #define DPLANE_INTF_CONNECTED (1 << 0) /* Connected peer, p2p */ +@@ -408,6 +441,7 @@ struct zebra_dplane_ctx { + struct dplane_neigh_table neightable; + struct dplane_gre_ctx gre; + struct dplane_netconf_info netconf; ++ enum zebra_dplane_startup_notifications spot; + } u; + + /* Namespace info, used especially for netlink kernel communication */ +@@ -820,8 +854,14 @@ static void dplane_ctx_free_internal(struct zebra_dplane_ctx *ctx) + case DPLANE_OP_NONE: + case DPLANE_OP_IPSET_ADD: + case DPLANE_OP_IPSET_DELETE: ++ break; + case DPLANE_OP_INTF_INSTALL: + case DPLANE_OP_INTF_UPDATE: ++ if (ctx->u.intf.vniarray) ++ XFREE(MTYPE_TMP, ctx->u.intf.vniarray); ++ if (ctx->u.intf.bvarray) ++ XFREE(MTYPE_TMP, ctx->u.intf.bvarray); ++ break; + case DPLANE_OP_INTF_DELETE: + case DPLANE_OP_TC_QDISC_INSTALL: + case DPLANE_OP_TC_QDISC_UNINSTALL: +@@ -845,6 +885,7 @@ static void dplane_ctx_free_internal(struct zebra_dplane_ctx *ctx) + break; + case DPLANE_OP_GRE_SET: + case DPLANE_OP_INTF_NETCONFIG: ++ case DPLANE_OP_STARTUP_STAGE: + break; + } + } +@@ -1168,6 +1209,8 @@ const char *dplane_op2str(enum dplane_op_e op) + case DPLANE_OP_TC_FILTER_UPDATE: + ret = "TC__FILTER_UPDATE"; + break; ++ case DPLANE_OP_STARTUP_STAGE: ++ ret = "STARTUP_STAGE"; + } + + return ret; +@@ -1309,6 +1352,422 @@ const char *dplane_ctx_get_ifname(const struct zebra_dplane_ctx *ctx) + return ctx->zd_ifname; + } + ++void dplane_ctx_set_ifp_bridge_vlan_info_array( ++ struct zebra_dplane_ctx *ctx, ++ struct zebra_dplane_bridge_vlan_info_array *bvarray) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.bvarray = bvarray; ++} ++ ++const struct zebra_dplane_bridge_vlan_info_array * ++dplane_ctx_get_ifp_bridge_vlan_info_array(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.bvarray; ++} ++ ++void dplane_ctx_set_ifp_vxlan_vni_array(struct zebra_dplane_ctx *ctx, ++ struct zebra_vxlan_vni_array *vniarray) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.vniarray = vniarray; ++} ++ ++const struct zebra_vxlan_vni_array * ++dplane_ctx_get_ifp_vxlan_vni_array(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.vniarray; ++} ++ ++void dplane_ctx_set_ifp_bridge_vlan_info( ++ struct zebra_dplane_ctx *ctx, ++ struct zebra_dplane_bridge_vlan_info *bvinfo) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.bvinfo = *bvinfo; ++} ++ ++const struct zebra_dplane_bridge_vlan_info * ++dplane_ctx_get_ifp_bridge_vlan_info(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return &ctx->u.intf.bvinfo; ++} ++ ++void dplane_ctx_set_ifp_family(struct zebra_dplane_ctx *ctx, uint8_t family) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.family = family; ++} ++ ++uint8_t dplane_ctx_get_ifp_family(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.family; ++} ++ ++void dplane_ctx_set_ifp_zltype(struct zebra_dplane_ctx *ctx, ++ enum zebra_link_type zltype) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.zltype = zltype; ++} ++ ++enum zebra_link_type ++dplane_ctx_get_ifp_zltype(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.zltype; ++} ++ ++void dplane_ctx_set_ifp_link_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t link_ifindex) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.link_ifindex = link_ifindex; ++} ++ ++ifindex_t dplane_ctx_get_ifp_link_ifindex(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.link_ifindex; ++} ++ ++void dplane_ctx_set_ifp_desc(struct zebra_dplane_ctx *ctx, const char *desc) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ strlcpy(ctx->u.intf.desc, desc, sizeof(ctx->u.intf.desc)); ++} ++ ++char *dplane_ctx_get_ifp_desc(struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.desc; ++} ++ ++void dplane_ctx_set_ifp_flags(struct zebra_dplane_ctx *ctx, uint64_t flags) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.flags = flags; ++} ++ ++uint64_t dplane_ctx_get_ifp_flags(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.flags; ++} ++ ++void dplane_ctx_set_ifp_bypass(struct zebra_dplane_ctx *ctx, uint8_t bypass) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.bypass = bypass; ++} ++ ++uint8_t dplane_ctx_get_ifp_bypass(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.bypass; ++} ++ ++void dplane_ctx_set_ifp_bridge_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t bridge_ifindex) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.bridge_ifindex = bridge_ifindex; ++} ++ ++ifindex_t dplane_ctx_get_ifp_bridge_ifindex(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.bridge_ifindex; ++} ++ ++void dplane_ctx_set_ifp_zif_slave_type(struct zebra_dplane_ctx *ctx, ++ enum zebra_slave_iftype zslave_type) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.zslave_type = zslave_type; ++} ++ ++enum zebra_slave_iftype ++dplane_ctx_get_ifp_zif_slave_type(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.zslave_type; ++} ++ ++void dplane_ctx_set_ifp_master_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t master_ifindex) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.master_ifindex = master_ifindex; ++} ++ ++ifindex_t dplane_ctx_get_ifp_master_ifindex(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.master_ifindex; ++} ++ ++void dplane_ctx_set_ifp_mtu(struct zebra_dplane_ctx *ctx, uint32_t mtu) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.mtu = mtu; ++} ++ ++uint32_t dplane_ctx_get_ifp_mtu(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.mtu; ++} ++ ++void dplane_ctx_set_ifp_vrf_id(struct zebra_dplane_ctx *ctx, vrf_id_t vrf_id) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.vrf_id = vrf_id; ++} ++ ++vrf_id_t dplane_ctx_get_ifp_vrf_id(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.vrf_id; ++} ++ ++void dplane_ctx_set_ifp_link_nsid(struct zebra_dplane_ctx *ctx, ++ ns_id_t link_nsid) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.link_nsid = link_nsid; ++} ++ ++ns_id_t dplane_ctx_get_ifp_link_nsid(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.link_nsid; ++} ++ ++void dplane_ctx_set_ifp_startup(struct zebra_dplane_ctx *ctx, bool startup) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.startup = startup; ++} ++ ++bool dplane_ctx_get_ifp_startup(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.startup; ++} ++ ++void dplane_ctx_set_ifp_protodown_set(struct zebra_dplane_ctx *ctx, bool set) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.protodown_set = set; ++} ++ ++bool dplane_ctx_get_ifp_protodown_set(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.protodown_set; ++} ++ ++void dplane_ctx_set_ifp_protodown(struct zebra_dplane_ctx *ctx, bool protodown) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.protodown = protodown; ++} ++ ++bool dplane_ctx_get_ifp_protodown(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.protodown; ++} ++ ++ifindex_t dplane_ctx_get_ifp_bond_ifindex(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.bond_ifindex; ++} ++ ++void dplane_ctx_set_ifp_rc_bitfield(struct zebra_dplane_ctx *ctx, ++ uint32_t rc_bitfield) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.rc_bitfield = rc_bitfield; ++} ++ ++uint32_t dplane_ctx_get_ifp_rc_bitfield(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.rc_bitfield; ++} ++ ++void dplane_ctx_set_ifp_gre_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_gre *grinfo) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.grinfo = *grinfo; ++} ++ ++const struct zebra_l2info_gre * ++dplane_ctx_get_ifp_gre_info(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return &ctx->u.intf.grinfo; ++} ++ ++void dplane_ctx_set_ifp_vxlan_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_vxlan *vxinfo) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.vxinfo = *vxinfo; ++} ++ ++const struct zebra_l2info_vxlan * ++dplane_ctx_get_ifp_vxlan_info(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return &ctx->u.intf.vxinfo; ++} ++ ++void dplane_ctx_set_ifp_vlan_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_vlan *vinfo) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.vinfo = *vinfo; ++} ++ ++const struct zebra_l2info_vlan * ++dplane_ctx_get_ifp_vlan_info(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return &ctx->u.intf.vinfo; ++} ++ ++void dplane_ctx_set_ifp_bridge_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_bridge *binfo) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.binfo = *binfo; ++} ++ ++const struct zebra_l2info_bridge * ++dplane_ctx_get_ifp_bridge_info(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return &ctx->u.intf.binfo; ++} ++ ++void dplane_ctx_set_ifp_table_id(struct zebra_dplane_ctx *ctx, ++ uint32_t table_id) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.table_id = table_id; ++} ++ ++uint32_t dplane_ctx_get_ifp_table_id(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.table_id; ++} ++ ++void dplane_ctx_set_ifp_hw_addr(struct zebra_dplane_ctx *ctx, ++ int32_t hw_addr_len, uint8_t *hw_addr) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.hw_addr_len = hw_addr_len; ++ memcpy(ctx->u.intf.hw_addr, hw_addr, hw_addr_len); ++} ++ ++int32_t dplane_ctx_get_ifp_hw_addr_len(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.hw_addr_len; ++} ++ ++const uint8_t *dplane_ctx_get_ifp_hw_addr(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.hw_addr; ++} ++ ++void dplane_ctx_set_ifp_bond_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t bond_ifindex) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.bond_ifindex = bond_ifindex; ++} ++ ++enum zebra_iftype ++dplane_ctx_get_ifp_zif_type(const struct zebra_dplane_ctx *ctx) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ return ctx->u.intf.zif_type; ++} ++ ++void dplane_ctx_set_ifp_zif_type(struct zebra_dplane_ctx *ctx, ++ enum zebra_iftype zif_type) ++{ ++ DPLANE_CTX_VALID(ctx); ++ ++ ctx->u.intf.zif_type = zif_type; ++} ++ + void dplane_ctx_set_ifname(struct zebra_dplane_ctx *ctx, const char *ifname) + { + DPLANE_CTX_VALID(ctx); +@@ -6102,6 +6561,7 @@ static void kernel_dplane_log_detail(struct zebra_dplane_ctx *ctx) + case DPLANE_OP_TC_FILTER_ADD: + case DPLANE_OP_TC_FILTER_DELETE: + case DPLANE_OP_TC_FILTER_UPDATE: ++ case DPLANE_OP_STARTUP_STAGE: + break; + } + } +@@ -6274,6 +6734,7 @@ static void kernel_dplane_handle_result(struct zebra_dplane_ctx *ctx) + break; + + case DPLANE_OP_NONE: ++ case DPLANE_OP_STARTUP_STAGE: + if (res != ZEBRA_DPLANE_REQUEST_SUCCESS) + atomic_fetch_add_explicit(&zdplane_info.dg_other_errors, + 1, memory_order_relaxed); +@@ -6966,6 +7427,25 @@ void zebra_dplane_start(void) + frr_pthread_run(zdplane_info.dg_pthread, NULL); + } + ++enum zebra_dplane_startup_notifications ++dplane_ctx_get_startup_spot(struct zebra_dplane_ctx *ctx) ++{ ++ return ctx->u.spot; ++} ++ ++void zebra_dplane_startup_stage(struct zebra_ns *zns, ++ enum zebra_dplane_startup_notifications spot) ++{ ++ struct zebra_dplane_ctx *ctx = dplane_ctx_alloc(); ++ ++ ctx->zd_op = DPLANE_OP_STARTUP_STAGE; ++ ctx->zd_status = ZEBRA_DPLANE_REQUEST_QUEUED; ++ ++ ctx->u.spot = spot; ++ dplane_ctx_set_ns_id(ctx, zns->ns_id); ++ ++ dplane_provider_enqueue_to_zebra(ctx); ++} + /* + * Initialize the dataplane module at startup; called by zebra rib_init() + */ +diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h +index 9ef0afd3a8..c10482ed96 100644 +--- a/zebra/zebra_dplane.h ++++ b/zebra/zebra_dplane.h +@@ -100,6 +100,11 @@ enum zebra_dplane_result { + ZEBRA_DPLANE_REQUEST_FAILURE, + }; + ++enum zebra_dplane_startup_notifications { ++ ZEBRA_DPLANE_INTERFACES_READ, ++ ZEBRA_DPLANE_TUNNELS_READ, ++ ZEBRA_DPLANE_ADDRESSES_READ, ++}; + /* + * API between the zebra dataplane system and the main zebra processing + * context. +@@ -201,7 +206,10 @@ enum dplane_op_e { + DPLANE_OP_TC_CLASS_UPDATE, + DPLANE_OP_TC_FILTER_ADD, + DPLANE_OP_TC_FILTER_DELETE, +- DPLANE_OP_TC_FILTER_UPDATE ++ DPLANE_OP_TC_FILTER_UPDATE, ++ ++ /* Startup Control */ ++ DPLANE_OP_STARTUP_STAGE, + }; + + /* +@@ -336,6 +344,105 @@ const char *dplane_ctx_get_ifname(const struct zebra_dplane_ctx *ctx); + void dplane_ctx_set_ifname(struct zebra_dplane_ctx *ctx, const char *ifname); + ifindex_t dplane_ctx_get_ifindex(const struct zebra_dplane_ctx *ctx); + void dplane_ctx_set_ifindex(struct zebra_dplane_ctx *ctx, ifindex_t ifindex); ++void dplane_ctx_set_ifp_bond_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t ifindex); ++ifindex_t dplane_ctx_get_ifp_bond_ifindex(const struct zebra_dplane_ctx *ctx); ++enum zebra_iftype ++dplane_ctx_get_ifp_zif_type(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_zif_type(struct zebra_dplane_ctx *ctx, ++ enum zebra_iftype zif_type); ++void dplane_ctx_set_ifp_table_id(struct zebra_dplane_ctx *ctx, ++ uint32_t table_id); ++uint32_t dplane_ctx_get_ifp_table_id(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_hw_addr(struct zebra_dplane_ctx *ctx, ++ int32_t hw_addr_len, uint8_t *hw_addr); ++int32_t dplane_ctx_get_ifp_hw_addr_len(const struct zebra_dplane_ctx *ctx); ++const uint8_t *dplane_ctx_get_ifp_hw_addr(const struct zebra_dplane_ctx *ctx); ++struct zebra_l2info_bridge; ++void dplane_ctx_set_ifp_bridge_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_bridge *binfo); ++const struct zebra_l2info_bridge * ++dplane_ctx_get_ifp_bridge_info(const struct zebra_dplane_ctx *ctx); ++struct zebra_l2info_vlan; ++void dplane_ctx_set_ifp_vlan_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_vlan *vinfo); ++const struct zebra_l2info_vlan * ++dplane_ctx_get_ifp_vlan_info(const struct zebra_dplane_ctx *ctx); ++struct zebra_l2info_vxlan; ++void dplane_ctx_set_ifp_vxlan_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_vxlan *vxinfo); ++const struct zebra_l2info_vxlan * ++dplane_ctx_get_ifp_vxlan_info(const struct zebra_dplane_ctx *ctx); ++struct zebra_l2info_gre; ++void dplane_ctx_set_ifp_gre_info(struct zebra_dplane_ctx *ctx, ++ struct zebra_l2info_gre *greinfo); ++const struct zebra_l2info_gre * ++dplane_ctx_get_ifp_gre_info(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_zltype(struct zebra_dplane_ctx *ctx, ++ enum zebra_link_type zlt); ++enum zebra_link_type ++dplane_ctx_get_ifp_zltype(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_link_nsid(struct zebra_dplane_ctx *ctx, ns_id_t ns_id); ++ns_id_t dplane_ctx_get_ifp_link_nsid(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_desc(struct zebra_dplane_ctx *ctx, const char *desc); ++char *dplane_ctx_get_ifp_desc(struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_mtu(struct zebra_dplane_ctx *ctx, uint32_t mtu); ++uint32_t dplane_ctx_get_ifp_mtu(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_vrf_id(struct zebra_dplane_ctx *ctx, vrf_id_t vrf_id); ++vrf_id_t dplane_ctx_get_ifp_vrf_id(const struct zebra_dplane_ctx *ctx); ++enum zebra_slave_iftype; ++void dplane_ctx_set_ifp_zif_slave_type(struct zebra_dplane_ctx *ctx, ++ enum zebra_slave_iftype zslave_type); ++enum zebra_slave_iftype ++dplane_ctx_get_ifp_zif_slave_type(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_master_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t master_ifindex); ++ifindex_t dplane_ctx_get_ifp_master_ifindex(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_bridge_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t bridge_ifindex); ++ifindex_t dplane_ctx_get_ifp_bridge_ifindex(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_bypass(struct zebra_dplane_ctx *ctx, uint8_t bypass); ++uint8_t dplane_ctx_get_ifp_bypass(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_flags(struct zebra_dplane_ctx *ctx, uint64_t flags); ++uint64_t dplane_ctx_get_ifp_flags(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_protodown(struct zebra_dplane_ctx *ctx, bool protodown); ++bool dplane_ctx_get_ifp_protodown(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_startup(struct zebra_dplane_ctx *ctx, bool startup); ++bool dplane_ctx_get_ifp_startup(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_protodown_set(struct zebra_dplane_ctx *ctx, bool set); ++bool dplane_ctx_get_ifp_protodown_set(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_rc_bitfield(struct zebra_dplane_ctx *ctx, ++ uint32_t rc_bitfield); ++uint32_t dplane_ctx_get_ifp_rc_bitfield(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_link_ifindex(struct zebra_dplane_ctx *ctx, ++ ifindex_t link_ifindex); ++ifindex_t dplane_ctx_get_ifp_link_ifindex(const struct zebra_dplane_ctx *ctx); ++void dplane_ctx_set_ifp_family(struct zebra_dplane_ctx *ctx, uint8_t family); ++uint8_t dplane_ctx_get_ifp_family(const struct zebra_dplane_ctx *ctx); ++struct zebra_vxlan_vni_array; ++void dplane_ctx_set_ifp_vxlan_vni_array(struct zebra_dplane_ctx *ctx, ++ struct zebra_vxlan_vni_array *vniarray); ++const struct zebra_vxlan_vni_array * ++dplane_ctx_get_ifp_vxlan_vni_array(const struct zebra_dplane_ctx *ctx); ++struct zebra_dplane_bridge_vlan_info { ++ uint16_t flags; ++ uint16_t vid; ++}; ++void dplane_ctx_set_ifp_bridge_vlan_info( ++ struct zebra_dplane_ctx *ctx, ++ struct zebra_dplane_bridge_vlan_info *bvinfo); ++const struct zebra_dplane_bridge_vlan_info * ++dplane_ctx_get_ifp_bridge_vlan_info(const struct zebra_dplane_ctx *ctx); ++ ++struct zebra_dplane_bridge_vlan_info_array { ++ int count; ++ struct zebra_dplane_bridge_vlan_info array[0]; ++}; ++void dplane_ctx_set_ifp_bridge_vlan_info_array( ++ struct zebra_dplane_ctx *ctx, ++ struct zebra_dplane_bridge_vlan_info_array *bvarray); ++const struct zebra_dplane_bridge_vlan_info_array * ++dplane_ctx_get_ifp_bridge_vlan_info_array(const struct zebra_dplane_ctx *ctx); + + /* Retrieve last/current provider id */ + uint32_t dplane_ctx_get_provider(const struct zebra_dplane_ctx *ctx); +@@ -1083,6 +1190,9 @@ void zebra_dplane_pre_finish(void); + void zebra_dplane_finish(void); + void zebra_dplane_shutdown(void); + ++void zebra_dplane_startup_stage(struct zebra_ns *zns, ++ enum zebra_dplane_startup_notifications spot); ++ + /* + * decision point for sending a routing update through the old + * straight to zebra master pthread or through the dplane to +@@ -1093,6 +1203,9 @@ void dplane_rib_add_multipath(afi_t afi, safi_t safi, struct prefix *p, + struct nexthop_group *ng, int startup, + struct zebra_dplane_ctx *ctx); + ++enum zebra_dplane_startup_notifications ++dplane_ctx_get_startup_spot(struct zebra_dplane_ctx *ctx); ++ + #ifdef __cplusplus + } + #endif +diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c +index 758fed7280..8f686eb5f8 100644 +--- a/zebra/zebra_nhg.c ++++ b/zebra/zebra_nhg.c +@@ -3177,6 +3177,7 @@ void zebra_nhg_dplane_result(struct zebra_dplane_ctx *ctx) + case DPLANE_OP_TC_FILTER_ADD: + case DPLANE_OP_TC_FILTER_DELETE: + case DPLANE_OP_TC_FILTER_UPDATE: ++ case DPLANE_OP_STARTUP_STAGE: + break; + } + } +diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c +index 5e50d720a6..201fc761ae 100644 +--- a/zebra/zebra_rib.c ++++ b/zebra/zebra_rib.c +@@ -4770,6 +4770,7 @@ static void rib_process_dplane_results(struct thread *thread) + case DPLANE_OP_NEIGH_TABLE_UPDATE: + case DPLANE_OP_GRE_SET: + case DPLANE_OP_NONE: ++ case DPLANE_OP_STARTUP_STAGE: + break; + + } /* Dispatch by op code */ +diff --git a/zebra/zebra_script.c b/zebra/zebra_script.c +index 5c67ad4f16..22c1824b5a 100644 +--- a/zebra/zebra_script.c ++++ b/zebra/zebra_script.c +@@ -428,6 +428,7 @@ void lua_pushzebra_dplane_ctx(lua_State *L, const struct zebra_dplane_ctx *ctx) + /* Not currently handled */ + case DPLANE_OP_INTF_NETCONFIG: /*NYI*/ + case DPLANE_OP_NONE: ++ case DPLANE_OP_STARTUP_STAGE: + break; + } /* Dispatch by op code */ + } +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0017-zebra-Re-arrange-fpm_read-to-reduce-code-duplication.patch b/src/sonic-frr/patch/0017-zebra-Re-arrange-fpm_read-to-reduce-code-duplication.patch deleted file mode 100755 index 4c392f511118..000000000000 --- a/src/sonic-frr/patch/0017-zebra-Re-arrange-fpm_read-to-reduce-code-duplication.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 88ba9ad950d461847a159b0f4899375ecd23d4b9 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Wed, 5 Oct 2022 11:28:43 -0400 -Subject: [PATCH 3/8] zebra: Re-arrange fpm_read to reduce code duplication - -Signed-off-by: Donald Sharp ---- - zebra/dplane_fpm_nl.c | 19 +++++++++---------- - 1 file changed, 9 insertions(+), 10 deletions(-) - -diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c -index 3b02128c9..8d41f3b07 100644 ---- a/zebra/dplane_fpm_nl.c -+++ b/zebra/dplane_fpm_nl.c -@@ -466,13 +466,6 @@ static int fpm_read(struct thread *t) - /* Let's ignore the input at the moment. */ - rv = stream_read_try(fnc->ibuf, fnc->socket, - STREAM_WRITEABLE(fnc->ibuf)); -- /* We've got an interruption. */ -- if (rv == -2) { -- /* Schedule next read. */ -- thread_add_read(fnc->fthread->master, fpm_read, fnc, -- fnc->socket, &fnc->t_read); -- return 0; -- } - if (rv == 0) { - atomic_fetch_add_explicit(&fnc->counters.connection_closes, 1, - memory_order_relaxed); -@@ -491,15 +484,21 @@ static int fpm_read(struct thread *t) - FPM_RECONNECT(fnc); - return 0; - } -+ -+ /* Schedule the next read */ -+ thread_add_read(fnc->fthread->master, fpm_read, fnc, fnc->socket, -+ &fnc->t_read); -+ -+ /* We've got an interruption. */ -+ if (rv == -2) -+ return 0; -+ - stream_reset(fnc->ibuf); - - /* Account all bytes read. */ - atomic_fetch_add_explicit(&fnc->counters.bytes_read, rv, - memory_order_relaxed); - -- thread_add_read(fnc->fthread->master, fpm_read, fnc, fnc->socket, -- &fnc->t_read); -- - return 0; - } - --- -2.30.2 - diff --git a/src/sonic-frr/patch/0018-zebra-Add-dplane_ctx_get-set_flags.patch b/src/sonic-frr/patch/0018-zebra-Add-dplane_ctx_get-set_flags.patch deleted file mode 100755 index a75623cc5b8c..000000000000 --- a/src/sonic-frr/patch/0018-zebra-Add-dplane_ctx_get-set_flags.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 77d430e04359417d6fca8226e256ee2845fbbc58 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Mon, 3 Oct 2022 15:28:48 -0400 -Subject: [PATCH 4/8] zebra: Add dplane_ctx_get|set_flags - -Zebra needs the ability to pass this data around. -Add it to the dplanes ability to pass. - -Signed-off-by: Donald Sharp - -zebra: Add a dplane_ctx_set_flags - -The dplane_ctx_set_flags call is missing, we will need it. Add it. - -Signed-off-by: Donald Sharp ---- - zebra/zebra_dplane.c | 17 +++++++++++++++++ - zebra/zebra_dplane.h | 2 ++ - 2 files changed, 19 insertions(+) - -diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c -index 656ebcf3b..5d94e1a0b 100644 ---- a/zebra/zebra_dplane.c -+++ b/zebra/zebra_dplane.c -@@ -132,6 +132,8 @@ struct dplane_route_info { - uint32_t zd_mtu; - uint32_t zd_nexthop_mtu; - -+ uint32_t zd_flags; -+ - /* Nexthop hash entry info */ - struct dplane_nexthop_info nhe; - -@@ -1323,6 +1325,20 @@ uint16_t dplane_ctx_get_old_instance(const struct zebra_dplane_ctx *ctx) - return ctx->u.rinfo.zd_old_instance; - } - -+uint32_t dplane_ctx_get_flags(const struct zebra_dplane_ctx *ctx) -+{ -+ DPLANE_CTX_VALID(ctx); -+ -+ return ctx->u.rinfo.zd_flags; -+} -+ -+void dplane_ctx_set_flags(struct zebra_dplane_ctx *ctx, uint32_t flags) -+{ -+ DPLANE_CTX_VALID(ctx); -+ -+ ctx->u.rinfo.zd_flags = flags; -+} -+ - uint32_t dplane_ctx_get_metric(const struct zebra_dplane_ctx *ctx) - { - DPLANE_CTX_VALID(ctx); -@@ -2358,6 +2374,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - - ctx->zd_table_id = re->table; - -+ ctx->u.rinfo.zd_flags = re->flags; - ctx->u.rinfo.zd_metric = re->metric; - ctx->u.rinfo.zd_old_metric = re->metric; - ctx->zd_vrf_id = re->vrf_id; -diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h -index 1d5518138..3210137c0 100644 ---- a/zebra/zebra_dplane.h -+++ b/zebra/zebra_dplane.h -@@ -343,6 +343,8 @@ route_tag_t dplane_ctx_get_old_tag(const struct zebra_dplane_ctx *ctx); - uint16_t dplane_ctx_get_instance(const struct zebra_dplane_ctx *ctx); - void dplane_ctx_set_instance(struct zebra_dplane_ctx *ctx, uint16_t instance); - uint16_t dplane_ctx_get_old_instance(const struct zebra_dplane_ctx *ctx); -+uint32_t dplane_ctx_get_flags(const struct zebra_dplane_ctx *ctx); -+void dplane_ctx_set_flags(struct zebra_dplane_ctx *ctx, uint32_t flags); - uint32_t dplane_ctx_get_metric(const struct zebra_dplane_ctx *ctx); - uint32_t dplane_ctx_get_old_metric(const struct zebra_dplane_ctx *ctx); - uint32_t dplane_ctx_get_mtu(const struct zebra_dplane_ctx *ctx); --- -2.30.2 - diff --git a/src/sonic-frr/patch/0018-zebra-Use-zebra-dplane-for-RTM-link-and-addr.patch b/src/sonic-frr/patch/0018-zebra-Use-zebra-dplane-for-RTM-link-and-addr.patch new file mode 100644 index 000000000000..98f3b224a75e --- /dev/null +++ b/src/sonic-frr/patch/0018-zebra-Use-zebra-dplane-for-RTM-link-and-addr.patch @@ -0,0 +1,2154 @@ +From 2c33b9ab847a53d8006687e89c0cbd589fe7071f Mon Sep 17 00:00:00 2001 +From: Donald Sharp +Date: Wed, 26 Apr 2023 23:02:09 -0400 +Subject: [PATCH] zebra: Use zebra dplane for RTM link and addr + +a) Move the reads of link and address information +into the dplane +b) Move the startup read of data into the dplane +as well. +c) Break up startup reading of the linux kernel data +into multiple phases. As that we have implied ordering +of data that must be read first and if the dplane has +taken over some data reading then we must delay initial +read-in of other data. + +Fixes: #13288 +Signed-off-by: Donald Sharp + +diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c +index ed5b3c4a66..7613f5fcc4 100644 +--- a/zebra/if_netlink.c ++++ b/zebra/if_netlink.c +@@ -79,64 +79,21 @@ + + extern struct zebra_privs_t zserv_privs; + +-/* Note: on netlink systems, there should be a 1-to-1 mapping between interface +- names and ifindex values. */ +-static void set_ifindex(struct interface *ifp, ifindex_t ifi_index, +- struct zebra_ns *zns) +-{ +- struct interface *oifp; +- +- if (((oifp = if_lookup_by_index_per_ns(zns, ifi_index)) != NULL) +- && (oifp != ifp)) { +- if (ifi_index == IFINDEX_INTERNAL) +- flog_err( +- EC_LIB_INTERFACE, +- "Netlink is setting interface %s ifindex to reserved internal value %u", +- ifp->name, ifi_index); +- else { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "interface index %d was renamed from %s to %s", +- ifi_index, oifp->name, ifp->name); +- if (if_is_up(oifp)) +- flog_err( +- EC_LIB_INTERFACE, +- "interface rename detected on up interface: index %d was renamed from %s to %s, results are uncertain!", +- ifi_index, oifp->name, ifp->name); +- if_delete_update(&oifp); +- } +- } +- if_set_index(ifp, ifi_index); +-} +- + /* Utility function to parse hardware link-layer address and update ifp */ + static void netlink_interface_update_hw_addr(struct rtattr **tb, +- struct interface *ifp) ++ struct zebra_dplane_ctx *ctx) + { +- int i; +- + if (tb[IFLA_ADDRESS]) { + int hw_addr_len; + + hw_addr_len = RTA_PAYLOAD(tb[IFLA_ADDRESS]); + + if (hw_addr_len > INTERFACE_HWADDR_MAX) +- zlog_debug("Hardware address is too large: %d", +- hw_addr_len); +- else { +- ifp->hw_addr_len = hw_addr_len; +- memcpy(ifp->hw_addr, RTA_DATA(tb[IFLA_ADDRESS]), +- hw_addr_len); +- +- for (i = 0; i < hw_addr_len; i++) +- if (ifp->hw_addr[i] != 0) +- break; +- +- if (i == hw_addr_len) +- ifp->hw_addr_len = 0; +- else +- ifp->hw_addr_len = hw_addr_len; +- } ++ zlog_warn("Hardware address is too large: %d", ++ hw_addr_len); ++ else ++ dplane_ctx_set_ifp_hw_addr(ctx, hw_addr_len, ++ RTA_DATA(tb[IFLA_ADDRESS])); + } + } + +@@ -251,26 +208,6 @@ static enum zebra_link_type netlink_to_zebra_link_type(unsigned int hwt) + } + } + +-static inline void zebra_if_set_ziftype(struct interface *ifp, +- enum zebra_iftype zif_type, +- enum zebra_slave_iftype zif_slave_type) +-{ +- struct zebra_if *zif; +- +- zif = (struct zebra_if *)ifp->info; +- zif->zif_slave_type = zif_slave_type; +- +- if (zif->zif_type != zif_type) { +- zif->zif_type = zif_type; +- /* If the if_type has been set to bond initialize ES info +- * against it. XXX - note that we don't handle the case where +- * a zif changes from bond to non-bond; it is really +- * an unexpected/error condition. +- */ +- zebra_evpn_if_init(zif); +- } +-} +- + static void netlink_determine_zebra_iftype(const char *kind, + enum zebra_iftype *zif_type) + { +@@ -300,16 +237,11 @@ static void netlink_determine_zebra_iftype(const char *kind, + } + + static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb, +- uint32_t ns_id, const char *name) ++ uint32_t ns_id, const char *name, ++ struct zebra_dplane_ctx *ctx) + { +- struct ifinfomsg *ifi; + struct rtattr *linkinfo[IFLA_INFO_MAX + 1]; + struct rtattr *attr[IFLA_VRF_MAX + 1]; +- struct vrf *vrf = NULL; +- struct zebra_vrf *zvrf; +- uint32_t nl_table_id; +- +- ifi = NLMSG_DATA(h); + + netlink_parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb); + +@@ -331,75 +263,8 @@ static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb, + return; + } + +- nl_table_id = *(uint32_t *)RTA_DATA(attr[IFLA_VRF_TABLE]); +- +- if (h->nlmsg_type == RTM_NEWLINK) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug("RTM_NEWLINK for VRF %s(%u) table %u", name, +- ifi->ifi_index, nl_table_id); +- +- if (!vrf_lookup_by_id((vrf_id_t)ifi->ifi_index)) { +- vrf_id_t exist_id; +- +- exist_id = +- zebra_vrf_lookup_by_table(nl_table_id, ns_id); +- if (exist_id != VRF_DEFAULT) { +- vrf = vrf_lookup_by_id(exist_id); +- +- flog_err( +- EC_ZEBRA_VRF_MISCONFIGURED, +- "VRF %s id %u table id overlaps existing vrf %s, misconfiguration exiting", +- name, ifi->ifi_index, vrf->name); +- exit(-1); +- } +- } +- +- vrf = vrf_update((vrf_id_t)ifi->ifi_index, name); +- if (!vrf) { +- flog_err(EC_LIB_INTERFACE, "VRF %s id %u not created", +- name, ifi->ifi_index); +- return; +- } +- +- /* +- * This is the only place that we get the actual kernel table_id +- * being used. We need it to set the table_id of the routes +- * we are passing to the kernel.... And to throw some totally +- * awesome parties. that too. +- * +- * At this point we *must* have a zvrf because the vrf_create +- * callback creates one. We *must* set the table id +- * before the vrf_enable because of( at the very least ) +- * static routes being delayed for installation until +- * during the vrf_enable callbacks. +- */ +- zvrf = (struct zebra_vrf *)vrf->info; +- zvrf->table_id = nl_table_id; +- +- /* Enable the created VRF. */ +- if (!vrf_enable(vrf)) { +- flog_err(EC_LIB_INTERFACE, +- "Failed to enable VRF %s id %u", name, +- ifi->ifi_index); +- return; +- } +- +- } else // h->nlmsg_type == RTM_DELLINK +- { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug("RTM_DELLINK for VRF %s(%u)", name, +- ifi->ifi_index); +- +- vrf = vrf_lookup_by_id((vrf_id_t)ifi->ifi_index); +- +- if (!vrf) { +- flog_warn(EC_ZEBRA_VRF_NOT_FOUND, "%s: vrf not found", +- __func__); +- return; +- } +- +- vrf_delete(vrf); +- } ++ dplane_ctx_set_ifp_table_id( ++ ctx, *(uint32_t *)RTA_DATA(attr[IFLA_VRF_TABLE])); + } + + static uint32_t get_iflink_speed(struct interface *interface, int *error) +@@ -659,58 +524,120 @@ static int netlink_extract_vxlan_info(struct rtattr *link_data, + * bridge interface is added or updated, take further actions to map + * its members. Likewise, for VxLAN interface. + */ +-static void netlink_interface_update_l2info(struct interface *ifp, ++static void netlink_interface_update_l2info(struct zebra_dplane_ctx *ctx, ++ enum zebra_iftype zif_type, + struct rtattr *link_data, int add, + ns_id_t link_nsid) + { ++ struct zebra_l2info_bridge bridge_info; ++ struct zebra_l2info_vlan vlan_info; ++ struct zebra_l2info_vxlan vxlan_info; ++ struct zebra_l2info_gre gre_info; ++ + if (!link_data) + return; + +- if (IS_ZEBRA_IF_BRIDGE(ifp)) { +- struct zebra_l2info_bridge bridge_info; +- ++ switch (zif_type) { ++ case ZEBRA_IF_BRIDGE: + netlink_extract_bridge_info(link_data, &bridge_info); +- zebra_l2_bridge_add_update(ifp, &bridge_info); +- } else if (IS_ZEBRA_IF_VLAN(ifp)) { +- struct zebra_l2info_vlan vlan_info; +- ++ dplane_ctx_set_ifp_bridge_info(ctx, &bridge_info); ++ break; ++ case ZEBRA_IF_VLAN: + netlink_extract_vlan_info(link_data, &vlan_info); +- zebra_l2_vlanif_update(ifp, &vlan_info); +- zebra_evpn_acc_bd_svi_set(ifp->info, NULL, +- !!if_is_operative(ifp)); +- } else if (IS_ZEBRA_IF_VXLAN(ifp)) { +- struct zebra_l2info_vxlan vxlan_info; +- ++ dplane_ctx_set_ifp_vlan_info(ctx, &vlan_info); ++ break; ++ case ZEBRA_IF_VXLAN: + netlink_extract_vxlan_info(link_data, &vxlan_info); + vxlan_info.link_nsid = link_nsid; +- zebra_l2_vxlanif_add_update(ifp, &vxlan_info, add); +- if (link_nsid != NS_UNKNOWN && +- vxlan_info.ifindex_link) +- zebra_if_update_link(ifp, vxlan_info.ifindex_link, +- link_nsid); +- } else if (IS_ZEBRA_IF_GRE(ifp)) { +- struct zebra_l2info_gre gre_info; +- ++ dplane_ctx_set_ifp_vxlan_info(ctx, &vxlan_info); ++ break; ++ case ZEBRA_IF_GRE: + netlink_extract_gre_info(link_data, &gre_info); + gre_info.link_nsid = link_nsid; +- zebra_l2_greif_add_update(ifp, &gre_info, add); +- if (link_nsid != NS_UNKNOWN && +- gre_info.ifindex_link) +- zebra_if_update_link(ifp, gre_info.ifindex_link, +- link_nsid); ++ dplane_ctx_set_ifp_gre_info(ctx, &gre_info); ++ break; ++ case ZEBRA_IF_OTHER: ++ case ZEBRA_IF_VRF: ++ case ZEBRA_IF_MACVLAN: ++ case ZEBRA_IF_VETH: ++ case ZEBRA_IF_BOND: ++ case ZEBRA_IF_BOND_SLAVE: ++ break; + } + } + +-static int netlink_bridge_vxlan_update(struct interface *ifp, +- struct rtattr *af_spec) ++#if 0 ++static int ++netlink_bridge_vxlan_vlan_vni_map_update(struct zebra_dplane_ctx *ctx, ++ struct rtattr *af_spec) ++{ ++ int rem; ++ uint16_t flags; ++ struct rtattr *i; ++ struct zebra_vxlan_vni_array *vniarray = NULL; ++ struct zebra_vxlan_vni vni_end; ++ struct zebra_vxlan_vni vni_start; ++ struct rtattr *aftb[IFLA_BRIDGE_VLAN_TUNNEL_MAX + 1]; ++ int32_t count = 0; ++ ++ memset(&vni_start, 0, sizeof(vni_start)); ++ memset(&vni_end, 0, sizeof(vni_end)); ++ ++ for (i = RTA_DATA(af_spec), rem = RTA_PAYLOAD(af_spec); RTA_OK(i, rem); ++ i = RTA_NEXT(i, rem)) { ++ ++ if (i->rta_type != IFLA_BRIDGE_VLAN_TUNNEL_INFO) ++ continue; ++ ++ memset(aftb, 0, sizeof(aftb)); ++ netlink_parse_rtattr_nested(aftb, IFLA_BRIDGE_VLAN_TUNNEL_MAX, ++ i); ++ if (!aftb[IFLA_BRIDGE_VLAN_TUNNEL_ID] || ++ !aftb[IFLA_BRIDGE_VLAN_TUNNEL_VID]) ++ /* vlan-vni info missing */ ++ return 0; ++ ++ count++; ++ flags = 0; ++ vniarray = XREALLOC( ++ MTYPE_TMP, vniarray, ++ sizeof(struct zebra_vxlan_vni_array) + ++ count * sizeof(struct zebra_vxlan_vni)); ++ ++ memset(&vniarray->vnis[count - 1], 0, ++ sizeof(struct zebra_vxlan_vni)); ++ ++ vniarray->vnis[count - 1].vni = ++ *(vni_t *)RTA_DATA(aftb[IFLA_BRIDGE_VLAN_TUNNEL_ID]); ++ vniarray->vnis[count - 1].access_vlan = *(vlanid_t *)RTA_DATA( ++ aftb[IFLA_BRIDGE_VLAN_TUNNEL_VID]); ++ ++ if (aftb[IFLA_BRIDGE_VLAN_TUNNEL_FLAGS]) ++ flags = *(uint16_t *)RTA_DATA( ++ aftb[IFLA_BRIDGE_VLAN_TUNNEL_FLAGS]); ++ ++ vniarray->vnis[count - 1].flags = flags; ++ } ++ ++ if (count) { ++ vniarray->count = count; ++ dplane_ctx_set_ifp_vxlan_vni_array(ctx, vniarray); ++ } ++ return 0; ++} ++#endif ++static int netlink_bridge_vxlan_update(struct zebra_dplane_ctx *ctx, ++ struct rtattr *af_spec) + { + struct rtattr *aftb[IFLA_BRIDGE_MAX + 1]; + struct bridge_vlan_info *vinfo; +- vlanid_t access_vlan; ++ struct zebra_dplane_bridge_vlan_info bvinfo; + + if (!af_spec) + return 0; + ++ //netlink_bridge_vxlan_vlan_vni_map_update(ctx, af_spec); ++ + /* There is a 1-to-1 mapping of VLAN to VxLAN - hence + * only 1 access VLAN is accepted. + */ +@@ -719,119 +646,73 @@ static int netlink_bridge_vxlan_update(struct interface *ifp, + return 0; + + vinfo = RTA_DATA(aftb[IFLA_BRIDGE_VLAN_INFO]); +- if (!(vinfo->flags & BRIDGE_VLAN_INFO_PVID)) +- return 0; ++ bvinfo.flags = vinfo->flags; ++ bvinfo.vid = vinfo->vid; + +- access_vlan = (vlanid_t)vinfo->vid; +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug("Access VLAN %u for VxLAN IF %s(%u)", access_vlan, +- ifp->name, ifp->ifindex); +- zebra_l2_vxlanif_update_access_vlan(ifp, access_vlan); ++ dplane_ctx_set_ifp_bridge_vlan_info(ctx, &bvinfo); + return 0; + } + +-static void netlink_bridge_vlan_update(struct interface *ifp, +- struct rtattr *af_spec) ++static void netlink_bridge_vlan_update(struct zebra_dplane_ctx *ctx, ++ struct rtattr *af_spec) + { + struct rtattr *i; + int rem; +- uint16_t vid_range_start = 0; +- struct zebra_if *zif; +- bitfield_t old_vlan_bitmap; + struct bridge_vlan_info *vinfo; +- +- zif = (struct zebra_if *)ifp->info; +- +- /* cache the old bitmap addrs */ +- old_vlan_bitmap = zif->vlan_bitmap; +- /* create a new bitmap space for re-eval */ +- bf_init(zif->vlan_bitmap, IF_VLAN_BITMAP_MAX); ++ struct zebra_dplane_bridge_vlan_info_array *bvarray = NULL; ++ int32_t count = 0; + + if (af_spec) { + for (i = RTA_DATA(af_spec), rem = RTA_PAYLOAD(af_spec); + RTA_OK(i, rem); i = RTA_NEXT(i, rem)) { +- + if (i->rta_type != IFLA_BRIDGE_VLAN_INFO) + continue; + +- vinfo = RTA_DATA(i); +- +- if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) { +- vid_range_start = vinfo->vid; +- continue; +- } ++ count++; ++ bvarray = XREALLOC( ++ MTYPE_TMP, bvarray, ++ sizeof(struct ++ zebra_dplane_bridge_vlan_info_array) + ++ count * sizeof(struct ++ zebra_dplane_bridge_vlan_info)); + +- if (!(vinfo->flags & BRIDGE_VLAN_INFO_RANGE_END)) +- vid_range_start = vinfo->vid; +- +- zebra_vlan_bitmap_compute(ifp, vid_range_start, +- vinfo->vid); ++ vinfo = RTA_DATA(i); ++ bvarray->array[count - 1].flags = vinfo->flags; ++ bvarray->array[count - 1].vid = vinfo->vid; + } + } + +- zebra_vlan_mbr_re_eval(ifp, old_vlan_bitmap); +- +- bf_free(old_vlan_bitmap); ++ if (count) { ++ bvarray->count = count; ++ dplane_ctx_set_ifp_bridge_vlan_info_array(ctx, bvarray); ++ } + } + +-static int netlink_bridge_interface(struct nlmsghdr *h, int len, ns_id_t ns_id, +- int startup) ++static int netlink_bridge_interface(struct zebra_dplane_ctx *ctx, ++ struct rtattr *af_spec, int startup) + { +- char *name = NULL; +- struct ifinfomsg *ifi; +- struct rtattr *tb[IFLA_MAX + 1]; +- struct interface *ifp; +- struct zebra_if *zif; +- struct rtattr *af_spec; + +- /* Fetch name and ifindex */ +- ifi = NLMSG_DATA(h); +- netlink_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); +- +- if (tb[IFLA_IFNAME] == NULL) +- return -1; +- name = (char *)RTA_DATA(tb[IFLA_IFNAME]); +- +- /* The interface should already be known, if not discard. */ +- ifp = if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id), ifi->ifi_index); +- if (!ifp) { +- zlog_debug("Cannot find bridge IF %s(%u)", name, +- ifi->ifi_index); +- return 0; +- } +- +- /* We are only interested in the access VLAN i.e., AF_SPEC */ +- af_spec = tb[IFLA_AF_SPEC]; +- +- if (IS_ZEBRA_IF_VXLAN(ifp)) +- return netlink_bridge_vxlan_update(ifp, af_spec); ++ netlink_bridge_vxlan_update(ctx, af_spec); + + /* build vlan bitmap associated with this interface if that + * device type is interested in the vlans + */ +- zif = (struct zebra_if *)ifp->info; +- if (bf_is_inited(zif->vlan_bitmap)) +- netlink_bridge_vlan_update(ifp, af_spec); ++ netlink_bridge_vlan_update(ctx, af_spec); + ++ dplane_provider_enqueue_to_zebra(ctx); + return 0; + } + +-static bool is_if_protodown_reason_only_frr(uint32_t rc_bitfield) +-{ +- return (rc_bitfield == (((uint32_t)1) << if_netlink_get_frr_protodown_r_bit())); +-} +- + /* + * Process interface protodown dplane update. + * + * If the interface is an es bond member then it must follow EVPN's + * protodown setting. + */ +-static void netlink_proc_dplane_if_protodown(struct zebra_if *zif, ++static void netlink_proc_dplane_if_protodown(struct zebra_dplane_ctx *ctx, + struct rtattr **tb) + { + bool protodown; +- bool old_protodown; + uint32_t rc_bitfield = 0; + struct rtattr *pd_reason_info[IFLA_MAX + 1]; + +@@ -846,59 +727,9 @@ static void netlink_proc_dplane_if_protodown(struct zebra_if *zif, + pd_reason_info[IFLA_PROTO_DOWN_REASON_VALUE]); + } + +- /* +- * Set our reason code to note it wasn't us. +- * If the reason we got from the kernel is ONLY frr though, don't +- * set it. +- */ +- COND_FLAG(zif->protodown_rc, ZEBRA_PROTODOWN_EXTERNAL, +- protodown && rc_bitfield && +- !is_if_protodown_reason_only_frr(rc_bitfield)); +- +- +- old_protodown = !!ZEBRA_IF_IS_PROTODOWN(zif); +- if (protodown == old_protodown) +- return; +- +- if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug("interface %s dplane change, protdown %s", +- zif->ifp->name, protodown ? "on" : "off"); +- +- /* Set protodown, respectively */ +- COND_FLAG(zif->flags, ZIF_FLAG_PROTODOWN, protodown); +- +- if (zebra_evpn_is_es_bond_member(zif->ifp)) { +- /* Check it's not already being sent to the dplane first */ +- if (protodown && +- CHECK_FLAG(zif->flags, ZIF_FLAG_SET_PROTODOWN)) { +- if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "bond mbr %s protodown on recv'd but already sent protodown on to the dplane", +- zif->ifp->name); +- return; +- } +- +- if (!protodown && +- CHECK_FLAG(zif->flags, ZIF_FLAG_UNSET_PROTODOWN)) { +- if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "bond mbr %s protodown off recv'd but already sent protodown off to the dplane", +- zif->ifp->name); +- return; +- } +- +- if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "bond mbr %s reinstate protodown %s in the dplane", +- zif->ifp->name, old_protodown ? "on" : "off"); +- +- if (old_protodown) +- SET_FLAG(zif->flags, ZIF_FLAG_SET_PROTODOWN); +- else +- SET_FLAG(zif->flags, ZIF_FLAG_UNSET_PROTODOWN); +- +- dplane_intf_update(zif->ifp); +- } ++ dplane_ctx_set_ifp_rc_bitfield(ctx, rc_bitfield); ++ dplane_ctx_set_ifp_protodown(ctx, protodown); ++ dplane_ctx_set_ifp_protodown_set(ctx, true); + } + + static uint8_t netlink_parse_lacp_bypass(struct rtattr **linkinfo) +@@ -915,29 +746,6 @@ static uint8_t netlink_parse_lacp_bypass(struct rtattr **linkinfo) + return bypass; + } + +-/* +- * Only called at startup to cleanup leftover protodown reasons we may +- * have not cleaned up. We leave protodown set though. +- */ +-static void if_sweep_protodown(struct zebra_if *zif) +-{ +- bool protodown; +- +- protodown = !!ZEBRA_IF_IS_PROTODOWN(zif); +- +- if (!protodown) +- return; +- +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug("interface %s sweeping protodown %s reason 0x%x", +- zif->ifp->name, protodown ? "on" : "off", +- zif->protodown_rc); +- +- /* Only clear our reason codes, leave external if it was set */ +- UNSET_FLAG(zif->protodown_rc, ZEBRA_PROTODOWN_ALL); +- dplane_intf_update(zif->ifp); +-} +- + /* Request for specific interface or address information from the kernel */ + static int netlink_request_intf_addr(struct nlsock *netlink_cmd, int family, + int type, uint32_t filter_mask) +@@ -984,7 +792,7 @@ int interface_lookup_netlink(struct zebra_ns *zns) + { + int ret; + struct zebra_dplane_info dp_info; +- struct nlsock *netlink_cmd = &zns->netlink_cmd; ++ struct nlsock *netlink_cmd = &zns->netlink_dplane_out; + + /* Capture key info from ns struct */ + zebra_dplane_info_from_zns(&dp_info, zns, true /*is_cmd*/); +@@ -1008,6 +816,13 @@ int interface_lookup_netlink(struct zebra_ns *zns) + if (ret < 0) + return ret; + ++ return ret; ++} ++ ++void interface_list_tunneldump(struct zebra_ns *zns) ++{ ++ int ret; ++ + /* + * So netlink_tunneldump_read will initiate a request + * per tunnel to get data. If we are on a kernel that +@@ -1020,13 +835,12 @@ int interface_lookup_netlink(struct zebra_ns *zns) + */ + ret = netlink_tunneldump_read(zns); + if (ret < 0) +- return ret; ++ return; + +- /* fixup linkages */ +- zebra_if_update_all_links(zns); +- return 0; ++ zebra_dplane_startup_stage(zns, ZEBRA_DPLANE_TUNNELS_READ); + } + ++ + /** + * interface_addr_lookup_netlink() - Look up interface addresses + * +@@ -1046,8 +860,8 @@ static int interface_addr_lookup_netlink(struct zebra_ns *zns) + ret = netlink_request_intf_addr(netlink_cmd, AF_INET, RTM_GETADDR, 0); + if (ret < 0) + return ret; +- ret = netlink_parse_info(netlink_interface_addr, netlink_cmd, &dp_info, +- 0, true); ++ ret = netlink_parse_info(netlink_interface_addr_dplane, netlink_cmd, ++ &dp_info, 0, true); + if (ret < 0) + return ret; + +@@ -1055,8 +869,8 @@ static int interface_addr_lookup_netlink(struct zebra_ns *zns) + ret = netlink_request_intf_addr(netlink_cmd, AF_INET6, RTM_GETADDR, 0); + if (ret < 0) + return ret; +- ret = netlink_parse_info(netlink_interface_addr, netlink_cmd, &dp_info, +- 0, true); ++ ret = netlink_parse_info(netlink_interface_addr_dplane, netlink_cmd, ++ &dp_info, 0, true); + if (ret < 0) + return ret; + +@@ -1616,7 +1430,6 @@ int netlink_interface_addr_dplane(struct nlmsghdr *h, ns_id_t ns_id, + + /* Enqueue ctx for main pthread to process */ + dplane_provider_enqueue_to_zebra(ctx); +- + return 0; + } + +@@ -1626,27 +1439,21 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + struct ifinfomsg *ifi; + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_MAX + 1]; +- struct interface *ifp; + char *name = NULL; + char *kind = NULL; +- char *desc = NULL; + char *slave_kind = NULL; +- struct zebra_ns *zns; + vrf_id_t vrf_id = VRF_DEFAULT; + enum zebra_iftype zif_type = ZEBRA_IF_OTHER; + enum zebra_slave_iftype zif_slave_type = ZEBRA_IF_SLAVE_NONE; + ifindex_t bridge_ifindex = IFINDEX_INTERNAL; + ifindex_t bond_ifindex = IFINDEX_INTERNAL; + ifindex_t link_ifindex = IFINDEX_INTERNAL; +- uint8_t old_hw_addr[INTERFACE_HWADDR_MAX]; +- struct zebra_if *zif; + ns_id_t link_nsid = ns_id; + ifindex_t master_infindex = IFINDEX_INTERNAL; + uint8_t bypass = 0; + + frrtrace(3, frr_zebra, netlink_interface, h, ns_id, startup); + +- zns = zebra_ns_lookup(ns_id); + ifi = NLMSG_DATA(h); + + /* assume if not default zns, then new VRF */ +@@ -1675,10 +1482,6 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + return -1; + } + +- /* We are interested in some AF_BRIDGE notifications. */ +- if (ifi->ifi_family == AF_BRIDGE) +- return netlink_bridge_interface(h, len, ns_id, startup); +- + /* Looking up interface name. */ + memset(linkinfo, 0, sizeof(linkinfo)); + netlink_parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(ifi), len, +@@ -1728,18 +1531,47 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + link_nsid = *(ns_id_t *)RTA_DATA(tb[IFLA_LINK_NETNSID]); + link_nsid = ns_id_get_absolute(ns_id, link_nsid); + } +- if (tb[IFLA_IFALIAS]) { +- desc = (char *)RTA_DATA(tb[IFLA_IFALIAS]); +- } + +- /* See if interface is present. */ +- ifp = if_lookup_by_name_per_ns(zns, name); ++ struct zebra_dplane_ctx *ctx = dplane_ctx_alloc(); ++ dplane_ctx_set_ns_id(ctx, ns_id); ++ dplane_ctx_set_ifp_link_nsid(ctx, link_nsid); ++ dplane_ctx_set_ifp_zif_type(ctx, zif_type); ++ dplane_ctx_set_ifindex(ctx, ifi->ifi_index); ++ dplane_ctx_set_ifname(ctx, name); ++ dplane_ctx_set_ifp_startup(ctx, startup); ++ dplane_ctx_set_ifp_family(ctx, ifi->ifi_family); ++ ++ /* We are interested in some AF_BRIDGE notifications. */ ++#ifndef AF_BRIDGE ++#define AF_BRIDGE 7 ++#endif ++ if (ifi->ifi_family == AF_BRIDGE) { ++ dplane_ctx_set_op(ctx, DPLANE_OP_INTF_INSTALL); ++ return netlink_bridge_interface(ctx, tb[IFLA_AF_SPEC], startup); ++ } + + if (h->nlmsg_type == RTM_NEWLINK) { ++ dplane_ctx_set_ifp_link_ifindex(ctx, link_ifindex); ++ dplane_ctx_set_op(ctx, DPLANE_OP_INTF_INSTALL); ++ dplane_ctx_set_status(ctx, ZEBRA_DPLANE_REQUEST_QUEUED); ++ if (tb[IFLA_IFALIAS]) { ++ dplane_ctx_set_ifp_desc(ctx, ++ RTA_DATA(tb[IFLA_IFALIAS])); ++ } ++ if (!tb[IFLA_MTU]) { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "RTM_NEWLINK for interface %s(%u) without MTU set", ++ name, ifi->ifi_index); ++ return 0; ++ } ++ dplane_ctx_set_ifp_mtu(ctx, *(int *)RTA_DATA(tb[IFLA_MTU])); ++ + /* If VRF, create or update the VRF structure itself. */ + if (zif_type == ZEBRA_IF_VRF && !vrf_is_backend_netns()) { +- netlink_vrf_change(h, tb[IFLA_LINKINFO], ns_id, name); +- vrf_id = (vrf_id_t)ifi->ifi_index; ++ netlink_vrf_change(h, tb[IFLA_LINKINFO], ns_id, name, ++ ctx); ++ vrf_id = ifi->ifi_index; + } + + if (tb[IFLA_MASTER]) { +@@ -1762,279 +1594,45 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) + } else + zif_slave_type = ZEBRA_IF_SLAVE_OTHER; + } ++ dplane_ctx_set_ifp_zif_slave_type(ctx, zif_slave_type); ++ dplane_ctx_set_ifp_vrf_id(ctx, vrf_id); ++ dplane_ctx_set_ifp_master_ifindex(ctx, master_infindex); ++ dplane_ctx_set_ifp_bridge_ifindex(ctx, bridge_ifindex); ++ dplane_ctx_set_ifp_bond_ifindex(ctx, bond_ifindex); ++ dplane_ctx_set_ifp_bypass(ctx, bypass); ++ dplane_ctx_set_ifp_zltype( ++ ctx, netlink_to_zebra_link_type(ifi->ifi_type)); ++ + if (vrf_is_backend_netns()) +- vrf_id = (vrf_id_t)ns_id; +- if (ifp == NULL +- || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) { +- /* Add interface notification from kernel */ +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "RTM_NEWLINK ADD for %s(%u) vrf_id %u type %d sl_type %d master %u flags 0x%x", +- name, ifi->ifi_index, vrf_id, zif_type, +- zif_slave_type, master_infindex, +- ifi->ifi_flags); +- +- if (ifp == NULL) { +- /* unknown interface */ +- ifp = if_get_by_name(name, vrf_id, NULL); +- } else { +- /* pre-configured interface, learnt now */ +- if (ifp->vrf->vrf_id != vrf_id) +- if_update_to_new_vrf(ifp, vrf_id); +- } +- +- /* Update interface information. */ +- set_ifindex(ifp, ifi->ifi_index, zns); +- ifp->flags = ifi->ifi_flags & 0x0000fffff; +- if (!tb[IFLA_MTU]) { +- zlog_debug( +- "RTM_NEWLINK for interface %s(%u) without MTU set", +- name, ifi->ifi_index); +- return 0; +- } +- ifp->mtu6 = ifp->mtu = *(int *)RTA_DATA(tb[IFLA_MTU]); +- ifp->metric = 0; +- ifp->speed = get_iflink_speed(ifp, NULL); +- ifp->ptm_status = ZEBRA_PTM_STATUS_UNKNOWN; +- +- /* Set interface type */ +- zebra_if_set_ziftype(ifp, zif_type, zif_slave_type); +- if (IS_ZEBRA_IF_VRF(ifp)) +- SET_FLAG(ifp->status, +- ZEBRA_INTERFACE_VRF_LOOPBACK); +- +- /* Update link. */ +- zebra_if_update_link(ifp, link_ifindex, link_nsid); +- +- /* +- * Just set the @link/lower-device ifindex. During +- * nldump interfaces are not ordered in any fashion so +- * we may end up getting upper devices before lower +- * devices. We will setup the real linkage once the dump +- * is complete. +- */ +- zif = (struct zebra_if *)ifp->info; +- zif->link_ifindex = link_ifindex; +- +- ifp->ll_type = +- netlink_to_zebra_link_type(ifi->ifi_type); +- netlink_interface_update_hw_addr(tb, ifp); +- +- /* Inform clients, install any configured addresses. */ +- if_add_update(ifp); +- +- /* Extract and save L2 interface information, take +- * additional actions. */ +- netlink_interface_update_l2info( +- ifp, linkinfo[IFLA_INFO_DATA], +- 1, link_nsid); +- if (IS_ZEBRA_IF_BOND(ifp)) +- zebra_l2if_update_bond(ifp, true); +- if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp)) +- zebra_l2if_update_bridge_slave( +- ifp, bridge_ifindex, ns_id, +- ZEBRA_BRIDGE_NO_ACTION); +- else if (IS_ZEBRA_IF_BOND_SLAVE(ifp)) +- zebra_l2if_update_bond_slave(ifp, bond_ifindex, +- !!bypass); +- +- if (tb[IFLA_PROTO_DOWN]) { +- netlink_proc_dplane_if_protodown(ifp->info, tb); +- if (startup) +- if_sweep_protodown(zif); +- } +- if (IS_ZEBRA_IF_BRIDGE(ifp)) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "RTM_NEWLINK ADD for %s(%u), vlan-aware %d", +- name, ifp->ifindex, +- IS_ZEBRA_IF_BRIDGE_VLAN_AWARE( +- zif)); +- } +- } else if (ifp->vrf->vrf_id != vrf_id) { +- /* VRF change for an interface. */ +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "RTM_NEWLINK vrf-change for %s(%u) vrf_id %u -> %u flags 0x%x", +- name, ifp->ifindex, ifp->vrf->vrf_id, +- vrf_id, ifi->ifi_flags); ++ dplane_ctx_set_ifp_vrf_id(ctx, ns_id); + +- if_handle_vrf_change(ifp, vrf_id); +- } else { +- bool was_bridge_slave, was_bond_slave; +- uint8_t chgflags = ZEBRA_BRIDGE_NO_ACTION; +- zif = ifp->info; ++ dplane_ctx_set_ifp_flags(ctx, ifi->ifi_flags & 0x0000fffff); + +- /* Interface update. */ +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "RTM_NEWLINK update for %s(%u) sl_type %d master %u flags 0x%x", +- name, ifp->ifindex, zif_slave_type, +- master_infindex, ifi->ifi_flags); ++ if (tb[IFLA_PROTO_DOWN]) { ++ dplane_ctx_set_ifp_protodown_set(ctx, true); ++ netlink_proc_dplane_if_protodown(ctx, tb); ++ } else ++ dplane_ctx_set_ifp_protodown_set(ctx, false); + +- set_ifindex(ifp, ifi->ifi_index, zns); +- if (!tb[IFLA_MTU]) { +- zlog_debug( +- "RTM_NEWLINK for interface %s(%u) without MTU set", +- name, ifi->ifi_index); +- return 0; +- } +- ifp->mtu6 = ifp->mtu = *(int *)RTA_DATA(tb[IFLA_MTU]); +- ifp->metric = 0; +- +- /* Update interface type - NOTE: Only slave_type can +- * change. */ +- was_bridge_slave = IS_ZEBRA_IF_BRIDGE_SLAVE(ifp); +- was_bond_slave = IS_ZEBRA_IF_BOND_SLAVE(ifp); +- zebra_if_set_ziftype(ifp, zif_type, zif_slave_type); +- +- memcpy(old_hw_addr, ifp->hw_addr, INTERFACE_HWADDR_MAX); +- +- /* Update link. */ +- zebra_if_update_link(ifp, link_ifindex, link_nsid); +- +- ifp->ll_type = +- netlink_to_zebra_link_type(ifi->ifi_type); +- netlink_interface_update_hw_addr(tb, ifp); +- +- if (tb[IFLA_PROTO_DOWN]) +- netlink_proc_dplane_if_protodown(ifp->info, tb); +- +- if (if_is_no_ptm_operative(ifp)) { +- bool is_up = if_is_operative(ifp); +- ifp->flags = ifi->ifi_flags & 0x0000fffff; +- if (!if_is_no_ptm_operative(ifp) || +- CHECK_FLAG(zif->flags, +- ZIF_FLAG_PROTODOWN)) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "Intf %s(%u) has gone DOWN", +- name, ifp->ifindex); +- if_down(ifp); +- rib_update(RIB_UPDATE_KERNEL); +- } else if (if_is_operative(ifp)) { +- bool mac_updated = false; +- +- /* Must notify client daemons of new +- * interface status. */ +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "Intf %s(%u) PTM up, notifying clients", +- name, ifp->ifindex); +- if_up(ifp, !is_up); +- +- /* Update EVPN VNI when SVI MAC change +- */ +- if (memcmp(old_hw_addr, ifp->hw_addr, +- INTERFACE_HWADDR_MAX)) +- mac_updated = true; +- if (IS_ZEBRA_IF_VLAN(ifp) +- && mac_updated) { +- struct interface *link_if; +- +- link_if = +- if_lookup_by_index_per_ns( +- zebra_ns_lookup(NS_DEFAULT), +- link_ifindex); +- if (link_if) +- zebra_vxlan_svi_up(ifp, +- link_if); +- } else if (mac_updated +- && IS_ZEBRA_IF_BRIDGE(ifp)) { +- zlog_debug( +- "Intf %s(%u) bridge changed MAC address", +- name, ifp->ifindex); +- chgflags = +- ZEBRA_BRIDGE_MASTER_MAC_CHANGE; +- } +- } +- } else { +- ifp->flags = ifi->ifi_flags & 0x0000fffff; +- if (if_is_operative(ifp) && +- !CHECK_FLAG(zif->flags, +- ZIF_FLAG_PROTODOWN)) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "Intf %s(%u) has come UP", +- name, ifp->ifindex); +- if_up(ifp, true); +- if (IS_ZEBRA_IF_BRIDGE(ifp)) +- chgflags = +- ZEBRA_BRIDGE_MASTER_UP; +- } else { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "Intf %s(%u) has gone DOWN", +- name, ifp->ifindex); +- if_down(ifp); +- rib_update(RIB_UPDATE_KERNEL); +- } +- } +- +- /* Extract and save L2 interface information, take +- * additional actions. */ +- netlink_interface_update_l2info( +- ifp, linkinfo[IFLA_INFO_DATA], +- 0, link_nsid); +- if (IS_ZEBRA_IF_BRIDGE(ifp)) +- zebra_l2if_update_bridge(ifp, chgflags); +- if (IS_ZEBRA_IF_BOND(ifp)) +- zebra_l2if_update_bond(ifp, true); +- if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) || was_bridge_slave) +- zebra_l2if_update_bridge_slave( +- ifp, bridge_ifindex, ns_id, chgflags); +- else if (IS_ZEBRA_IF_BOND_SLAVE(ifp) || was_bond_slave) +- zebra_l2if_update_bond_slave(ifp, bond_ifindex, +- !!bypass); +- if (IS_ZEBRA_IF_BRIDGE(ifp)) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "RTM_NEWLINK update for %s(%u), vlan-aware %d", +- name, ifp->ifindex, +- IS_ZEBRA_IF_BRIDGE_VLAN_AWARE( +- zif)); +- } +- } ++ netlink_interface_update_hw_addr(tb, ctx); + +- zif = ifp->info; +- if (zif) { +- XFREE(MTYPE_ZIF_DESC, zif->desc); +- if (desc) +- zif->desc = XSTRDUP(MTYPE_ZIF_DESC, desc); +- } ++ /* Extract and save L2 interface information, take ++ * additional actions. */ ++ netlink_interface_update_l2info( ++ ctx, zif_type, linkinfo[IFLA_INFO_DATA], 1, link_nsid); + } else { +- /* Delete interface notification from kernel */ +- if (ifp == NULL) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "RTM_DELLINK for unknown interface %s(%u)", +- name, ifi->ifi_index); +- return 0; +- } +- + if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug("RTM_DELLINK for %s(%u)", name, +- ifp->ifindex); +- +- UNSET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK); +- +- if (IS_ZEBRA_IF_BOND(ifp)) +- zebra_l2if_update_bond(ifp, false); +- if (IS_ZEBRA_IF_BOND_SLAVE(ifp)) +- zebra_l2if_update_bond_slave(ifp, bond_ifindex, false); +- /* Special handling for bridge or VxLAN interfaces. */ +- if (IS_ZEBRA_IF_BRIDGE(ifp)) +- zebra_l2_bridge_del(ifp); +- else if (IS_ZEBRA_IF_VXLAN(ifp)) +- zebra_l2_vxlanif_del(ifp); +- +- if_delete_update(&ifp); +- +- /* If VRF, delete the VRF structure itself. */ +- if (zif_type == ZEBRA_IF_VRF && !vrf_is_backend_netns()) +- netlink_vrf_change(h, tb[IFLA_LINKINFO], ns_id, name); ++ zlog_debug("RTM_DELLINK for %s(%u), enqueuing to zebra", ++ name, ifi->ifi_index); ++ ++ dplane_ctx_set_op(ctx, DPLANE_OP_INTF_DELETE); ++ dplane_ctx_set_status(ctx, ZEBRA_DPLANE_REQUEST_QUEUED); ++ ++ dplane_ctx_set_ifp_bond_ifindex(ctx, bond_ifindex); + } + ++ dplane_provider_enqueue_to_zebra(ctx); ++ + return 0; + } + +@@ -2111,6 +1709,13 @@ ssize_t netlink_intf_msg_encode(uint16_t cmd, + void interface_list(struct zebra_ns *zns) + { + interface_lookup_netlink(zns); ++ ++ zebra_dplane_startup_stage(zns, ZEBRA_DPLANE_INTERFACES_READ); ++} ++ ++void interface_list_second(struct zebra_ns *zns) ++{ ++ zebra_if_update_all_links(zns); + /* We add routes for interface address, + * so we need to get the nexthop info + * from the kernel before we can do that +@@ -2118,6 +1723,8 @@ void interface_list(struct zebra_ns *zns) + netlink_nexthop_read(zns); + + interface_addr_lookup_netlink(zns); ++ ++ zebra_dplane_startup_stage(zns, ZEBRA_DPLANE_ADDRESSES_READ); + } + + /** +diff --git a/zebra/interface.c b/zebra/interface.c +index a05b9690ef..bfe7a06896 100644 +--- a/zebra/interface.c ++++ b/zebra/interface.c +@@ -1298,6 +1298,9 @@ static void zebra_if_addr_update_ctx(struct zebra_dplane_ctx *ctx, + const struct prefix *addr, *dest = NULL; + enum dplane_op_e op; + ++ if (!ifp) ++ return; ++ + op = dplane_ctx_get_op(ctx); + addr = dplane_ctx_get_intf_addr(ctx); + +@@ -1416,6 +1419,13 @@ static void zebra_if_netconf_update_ctx(struct zebra_dplane_ctx *ctx, + enum dplane_netconf_status_e mpls, mcast_on, linkdown; + bool *mcast_set, *linkdown_set; + ++ if (!ifp && ifindex != -1 && ifindex != -2) { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug("%s: Can't find ifp(%u)", __func__, ifindex); ++ ++ return; ++ } ++ + afi = dplane_ctx_get_afi(ctx); + mpls = dplane_ctx_get_netconf_mpls(ctx); + linkdown = dplane_ctx_get_netconf_linkdown(ctx); +@@ -1485,6 +1495,686 @@ static void zebra_if_netconf_update_ctx(struct zebra_dplane_ctx *ctx, + (*linkdown_set ? "ON" : "OFF")); + } + ++static void interface_vrf_change(enum dplane_op_e op, ifindex_t ifindex, ++ const char *name, uint32_t tableid, ++ ns_id_t ns_id) ++{ ++ struct vrf *vrf; ++ struct zebra_vrf *zvrf = NULL; ++ ++ if (op == DPLANE_OP_INTF_DELETE) { ++ if (IS_ZEBRA_DEBUG_DPLANE) ++ zlog_debug("DPLANE_OP_INTF_DELETE for VRF %s(%u)", name, ++ ifindex); ++ ++ vrf = vrf_lookup_by_id((vrf_id_t)ifindex); ++ if (!vrf) { ++ flog_warn(EC_ZEBRA_VRF_NOT_FOUND, ++ "%s(%u): vrf not found", name, ifindex); ++ return; ++ } ++ ++ vrf_delete(vrf); ++ } else { ++ if (IS_ZEBRA_DEBUG_DPLANE) ++ zlog_debug( ++ "DPLANE_OP_INTF_UPDATE for VRF %s(%u) table %u", ++ name, ifindex, tableid); ++ ++ if (!vrf_lookup_by_id((vrf_id_t)ifindex)) { ++ vrf_id_t exist_id; ++ ++ exist_id = zebra_vrf_lookup_by_table(tableid, ns_id); ++ if (exist_id != VRF_DEFAULT) { ++ vrf = vrf_lookup_by_id(exist_id); ++ ++ flog_err( ++ EC_ZEBRA_VRF_MISCONFIGURED, ++ "VRF %s id %u table id overlaps existing vrf %s(%d), misconfiguration exiting", ++ name, ifindex, vrf->name, vrf->vrf_id); ++ exit(-1); ++ } ++ } ++ ++ vrf = vrf_update((vrf_id_t)ifindex, name); ++ if (!vrf) { ++ flog_err(EC_LIB_INTERFACE, "VRF %s id %u not created", ++ name, ifindex); ++ return; ++ } ++ ++ /* ++ * This is the only place that we get the actual kernel table_id ++ * being used. We need it to set the table_id of the routes ++ * we are passing to the kernel.... And to throw some totally ++ * awesome parties. that too. ++ * ++ * At this point we *must* have a zvrf because the vrf_create ++ * callback creates one. We *must* set the table id ++ * before the vrf_enable because of( at the very least ) ++ * static routes being delayed for installation until ++ * during the vrf_enable callbacks. ++ */ ++ zvrf = (struct zebra_vrf *)vrf->info; ++ zvrf->table_id = tableid; ++ ++ /* Enable the created VRF. */ ++ if (!vrf_enable(vrf)) { ++ flog_err(EC_LIB_INTERFACE, ++ "Failed to enable VRF %s id %u", name, ++ ifindex); ++ return; ++ } ++ } ++} ++ ++/* ++ * Note: on netlink systems, there should be a 1-to-1 mapping ++ * between interface names and ifindex values. ++ */ ++static void set_ifindex(struct interface *ifp, ifindex_t ifi_index, ++ struct zebra_ns *zns) ++{ ++ struct interface *oifp; ++ ++ oifp = if_lookup_by_index_per_ns(zns, ifi_index); ++ if ((oifp != NULL) && (oifp != ifp)) { ++ if (ifi_index == IFINDEX_INTERNAL) ++ flog_err( ++ EC_LIB_INTERFACE, ++ "Netlink is setting interface %s ifindex to reserved internal value %u", ++ ifp->name, ifi_index); ++ else { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "interface index %d was renamed from %s to %s", ++ ifi_index, oifp->name, ifp->name); ++ if (if_is_up(oifp)) ++ flog_err( ++ EC_LIB_INTERFACE, ++ "interface rename detected on up interface: index %d was renamed from %s to %s, results are uncertain!", ++ ifi_index, oifp->name, ifp->name); ++ if_delete_update(&oifp); ++ } ++ } ++ if_set_index(ifp, ifi_index); ++} ++ ++static inline void zebra_if_set_ziftype(struct interface *ifp, ++ enum zebra_iftype zif_type, ++ enum zebra_slave_iftype zif_slave_type) ++{ ++ struct zebra_if *zif; ++ ++ zif = (struct zebra_if *)ifp->info; ++ zif->zif_slave_type = zif_slave_type; ++ ++ if (zif->zif_type != zif_type) { ++ zif->zif_type = zif_type; ++ /* If the if_type has been set to bond initialize ES info ++ * against it. XXX - note that we don't handle the case where ++ * a zif changes from bond to non-bond; it is really ++ * an unexpected/error condition. ++ */ ++ zebra_evpn_if_init(zif); ++ } ++} ++ ++static void interface_update_hw_addr(struct zebra_dplane_ctx *ctx, ++ struct interface *ifp) ++{ ++ int i; ++ ++ ifp->hw_addr_len = dplane_ctx_get_ifp_hw_addr_len(ctx); ++ memcpy(ifp->hw_addr, dplane_ctx_get_ifp_hw_addr(ctx), ifp->hw_addr_len); ++ ++ for (i = 0; i < ifp->hw_addr_len; i++) ++ if (ifp->hw_addr[i] != 0) ++ break; ++ ++ if (i == ifp->hw_addr_len) ++ ifp->hw_addr_len = 0; ++} ++ ++static void interface_update_l2info(struct zebra_dplane_ctx *ctx, ++ struct interface *ifp, ++ enum zebra_iftype zif_type, int add, ++ ns_id_t link_nsid) ++{ ++ const struct zebra_l2info_vxlan *vxlan_info; ++ const struct zebra_l2info_gre *gre_info; ++ ++ switch (zif_type) { ++ case ZEBRA_IF_BRIDGE: ++ zebra_l2_bridge_add_update(ifp, ++ dplane_ctx_get_ifp_bridge_info(ctx)); ++ break; ++ case ZEBRA_IF_VLAN: ++ zebra_l2_vlanif_update(ifp, dplane_ctx_get_ifp_vlan_info(ctx)); ++ zebra_evpn_acc_bd_svi_set(ifp->info, NULL, ++ !!if_is_operative(ifp)); ++ break; ++ case ZEBRA_IF_VXLAN: ++ vxlan_info = dplane_ctx_get_ifp_vxlan_info(ctx); ++ zebra_l2_vxlanif_add_update(ifp, vxlan_info, add); ++ if (link_nsid != NS_UNKNOWN && vxlan_info->ifindex_link) ++ zebra_if_update_link(ifp, vxlan_info->ifindex_link, ++ link_nsid); ++ break; ++ case ZEBRA_IF_GRE: ++ gre_info = dplane_ctx_get_ifp_gre_info(ctx); ++ zebra_l2_greif_add_update(ifp, gre_info, add); ++ if (link_nsid != NS_UNKNOWN && gre_info->ifindex_link) ++ zebra_if_update_link(ifp, gre_info->ifindex_link, ++ link_nsid); ++ break; ++ case ZEBRA_IF_OTHER: ++ case ZEBRA_IF_VRF: ++ case ZEBRA_IF_MACVLAN: ++ case ZEBRA_IF_VETH: ++ case ZEBRA_IF_BOND: ++ case ZEBRA_IF_BOND_SLAVE: ++ break; ++ } ++} ++ ++static bool is_if_protodown_reason_only_frr(uint32_t rc_bitfield) ++{ ++ uint8_t frr_protodown_r_bit = if_netlink_get_frr_protodown_r_bit(); ++ ++ return (rc_bitfield == (((uint32_t)1) << frr_protodown_r_bit)); ++} ++ ++static void interface_if_protodown(struct interface *ifp, bool protodown, ++ uint32_t rc_bitfield) ++{ ++ struct zebra_if *zif = ifp->info; ++ bool old_protodown; ++ ++ /* ++ * Set our reason code to note it wasn't us. ++ * If the reason we got from the kernel is ONLY frr though, don't ++ * set it. ++ */ ++ COND_FLAG(zif->protodown_rc, ZEBRA_PROTODOWN_EXTERNAL, ++ protodown && rc_bitfield && ++ !is_if_protodown_reason_only_frr(rc_bitfield)); ++ ++ ++ old_protodown = !!ZEBRA_IF_IS_PROTODOWN(zif); ++ if (protodown == old_protodown) ++ return; ++ ++ if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_DPLANE) ++ zlog_debug("interface %s dplane change, protodown %s", ++ ifp->name, protodown ? "on" : "off"); ++ ++ /* Set protodown, respectively */ ++ COND_FLAG(zif->flags, ZIF_FLAG_PROTODOWN, protodown); ++ ++ if (zebra_evpn_is_es_bond_member(ifp)) { ++ /* Check it's not already being sent to the dplane first */ ++ if (protodown && ++ CHECK_FLAG(zif->flags, ZIF_FLAG_SET_PROTODOWN)) { ++ if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "bond mbr %s protodown on recv'd but already sent protodown on to the dplane", ++ ifp->name); ++ return; ++ } ++ ++ if (!protodown && ++ CHECK_FLAG(zif->flags, ZIF_FLAG_UNSET_PROTODOWN)) { ++ if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "bond mbr %s protodown off recv'd but already sent protodown off to the dplane", ++ ifp->name); ++ return; ++ } ++ ++ if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "bond mbr %s reinstate protodown %s in the dplane", ++ ifp->name, old_protodown ? "on" : "off"); ++ ++ if (old_protodown) ++ SET_FLAG(zif->flags, ZIF_FLAG_SET_PROTODOWN); ++ else ++ SET_FLAG(zif->flags, ZIF_FLAG_UNSET_PROTODOWN); ++ ++ dplane_intf_update(zif->ifp); ++ } ++} ++ ++static void if_sweep_protodown(struct zebra_if *zif) ++{ ++ bool protodown; ++ ++ protodown = !!ZEBRA_IF_IS_PROTODOWN(zif); ++ ++ if (!protodown) ++ return; ++ ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug("interface %s sweeping protodown %s reason 0x%x", ++ zif->ifp->name, protodown ? "on" : "off", ++ zif->protodown_rc); ++ ++ /* Only clear our reason codes, leave external if it was set */ ++ UNSET_FLAG(zif->protodown_rc, ZEBRA_PROTODOWN_ALL); ++ dplane_intf_update(zif->ifp); ++} ++ ++static void interface_bridge_vxlan_update(struct zebra_dplane_ctx *ctx, ++ struct interface *ifp) ++{ ++ const struct zebra_dplane_bridge_vlan_info *bvinfo; ++ ++ bvinfo = dplane_ctx_get_ifp_bridge_vlan_info(ctx); ++ ++ if (!(bvinfo->flags & DPLANE_BRIDGE_VLAN_INFO_PVID)) ++ return; ++ ++ if (IS_ZEBRA_DEBUG_DPLANE) ++ zlog_debug("Access VLAN %u for VxLAN IF %s(%u)", bvinfo->vid, ++ ifp->name, ifp->ifindex); ++ ++ zebra_l2_vxlanif_update_access_vlan(ifp, bvinfo->vid); ++} ++ ++static void interface_bridge_vlan_update(struct zebra_dplane_ctx *ctx, ++ struct interface *ifp) ++{ ++ struct zebra_if *zif = ifp->info; ++ const struct zebra_dplane_bridge_vlan_info_array *bvarray; ++ struct zebra_dplane_bridge_vlan_info bvinfo; ++ bitfield_t old_vlan_bitmap; ++ uint16_t vid_range_start = 0; ++ int32_t i; ++ ++ /* cache the old bitmap addrs */ ++ old_vlan_bitmap = zif->vlan_bitmap; ++ /* create a new bitmap space for re-eval */ ++ bf_init(zif->vlan_bitmap, IF_VLAN_BITMAP_MAX); ++ ++ /* Could we have multiple bridge vlan infos? */ ++ bvarray = dplane_ctx_get_ifp_bridge_vlan_info_array(ctx); ++ if (!bvarray) ++ return; ++ ++ for (i = 0; i < bvarray->count; i++) { ++ bvinfo = bvarray->array[i]; ++ ++ if (bvinfo.flags & DPLANE_BRIDGE_VLAN_INFO_RANGE_BEGIN) { ++ vid_range_start = bvinfo.vid; ++ continue; ++ } ++ ++ if (!(bvinfo.flags & DPLANE_BRIDGE_VLAN_INFO_RANGE_END)) ++ vid_range_start = bvinfo.vid; ++ ++ zebra_vlan_bitmap_compute(ifp, vid_range_start, bvinfo.vid); ++ } ++ ++ zebra_vlan_mbr_re_eval(ifp, old_vlan_bitmap); ++ bf_free(old_vlan_bitmap); ++} ++ ++static void interface_bridge_handling(struct zebra_dplane_ctx *ctx, ++ struct interface *ifp, ++ enum zebra_iftype zif_type) ++{ ++ struct zebra_if *zif; ++ ++ if (!ifp) { ++ zlog_warn("Cannot find bridge if %s(%u)", ++ dplane_ctx_get_ifname(ctx), ++ dplane_ctx_get_ifindex(ctx)); ++ return; ++ } ++ ++ if (IS_ZEBRA_IF_VXLAN(ifp)) ++ return interface_bridge_vxlan_update(ctx, ifp); ++ ++ /* ++ * build vlan bitmap associated with this interface if that ++ * device type is interested in the vlans ++ */ ++ zif = ifp->info; ++ if (bf_is_inited(zif->vlan_bitmap)) ++ interface_bridge_vlan_update(ctx, ifp); ++} ++ ++static void zebra_if_dplane_ifp_handling(struct zebra_dplane_ctx *ctx) ++{ ++ enum dplane_op_e op = dplane_ctx_get_op(ctx); ++ const char *name = dplane_ctx_get_ifname(ctx); ++ ns_id_t ns_id = dplane_ctx_get_ns_id(ctx); ++ ifindex_t ifindex = dplane_ctx_get_ifindex(ctx); ++ ifindex_t bond_ifindex = dplane_ctx_get_ifp_bond_ifindex(ctx); ++ uint32_t tableid = dplane_ctx_get_ifp_table_id(ctx); ++ enum zebra_iftype zif_type = dplane_ctx_get_ifp_zif_type(ctx); ++ struct interface *ifp; ++ struct zebra_ns *zns; ++ ++ zns = zebra_ns_lookup(ns_id); ++ if (!zns) { ++ zlog_err("Where is our namespace?"); ++ return; ++ } ++ ++ if (IS_ZEBRA_DEBUG_DPLANE) ++ zlog_debug("%s for %s(%u)", dplane_op2str(op), name, ifindex); ++ ++ ifp = if_lookup_by_name_per_ns(zns, name); ++ if (op == DPLANE_OP_INTF_DELETE) { ++ /* Delete interface notification from kernel */ ++ if (ifp == NULL) { ++ if (IS_ZEBRA_DEBUG_EVENT) ++ zlog_debug( ++ "Delete LINK received for unknown interface %s(%u)", ++ name, ifindex); ++ return; ++ } ++ ++ if (IS_ZEBRA_IF_BOND(ifp)) ++ zebra_l2if_update_bond(ifp, false); ++ if (IS_ZEBRA_IF_BOND_SLAVE(ifp)) ++ zebra_l2if_update_bond_slave(ifp, bond_ifindex, false); ++ /* Special handling for bridge or VxLAN interfaces. */ ++ if (IS_ZEBRA_IF_BRIDGE(ifp)) ++ zebra_l2_bridge_del(ifp); ++ else if (IS_ZEBRA_IF_VXLAN(ifp)) ++ zebra_l2_vxlanif_del(ifp); ++ ++ if_delete_update(&ifp); ++ ++ if (zif_type == ZEBRA_IF_VRF && !vrf_is_backend_netns()) ++ interface_vrf_change(op, ifindex, name, tableid, ns_id); ++ } else { ++ ifindex_t master_ifindex, bridge_ifindex, bond_ifindex, ++ link_ifindex; ++ enum zebra_slave_iftype zif_slave_type; ++ uint8_t bypass; ++ uint64_t flags; ++ vrf_id_t vrf_id; ++ uint32_t mtu; ++ ns_id_t link_nsid; ++ struct zebra_if *zif; ++ bool protodown, protodown_set, startup; ++ uint32_t rc_bitfield; ++ uint8_t old_hw_addr[INTERFACE_HWADDR_MAX]; ++ char *desc; ++ uint8_t family; ++ ++ /* If VRF, create or update the VRF structure itself. */ ++ if (zif_type == ZEBRA_IF_VRF && !vrf_is_backend_netns()) ++ interface_vrf_change(op, ifindex, name, tableid, ns_id); ++ ++ master_ifindex = dplane_ctx_get_ifp_master_ifindex(ctx); ++ zif_slave_type = dplane_ctx_get_ifp_zif_slave_type(ctx); ++ bridge_ifindex = dplane_ctx_get_ifp_bridge_ifindex(ctx); ++ bond_ifindex = dplane_ctx_get_ifp_bond_ifindex(ctx); ++ bypass = dplane_ctx_get_ifp_bypass(ctx); ++ flags = dplane_ctx_get_ifp_flags(ctx); ++ vrf_id = dplane_ctx_get_ifp_vrf_id(ctx); ++ mtu = dplane_ctx_get_ifp_mtu(ctx); ++ link_ifindex = dplane_ctx_get_ifp_link_ifindex(ctx); ++ link_nsid = dplane_ctx_get_ifp_link_nsid(ctx); ++ protodown_set = dplane_ctx_get_ifp_protodown_set(ctx); ++ protodown = dplane_ctx_get_ifp_protodown(ctx); ++ rc_bitfield = dplane_ctx_get_ifp_rc_bitfield(ctx); ++ startup = dplane_ctx_get_ifp_startup(ctx); ++ desc = dplane_ctx_get_ifp_desc(ctx); ++ family = dplane_ctx_get_ifp_family(ctx); ++ ++#ifndef AF_BRIDGE ++ /* ++ * Work around to make free bsd happy at the moment ++ */ ++#define AF_BRIDGE 7 ++#endif ++ if (family == AF_BRIDGE) ++ return interface_bridge_handling(ctx, ifp, zif_type); ++ ++ if (ifp == NULL || ++ !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) { ++ /* Add interface notification from kernel */ ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "RTM_NEWLINK ADD for %s(%u) vrf_id %u type %d sl_type %d master %u", ++ name, ifindex, vrf_id, zif_type, ++ zif_slave_type, master_ifindex); ++ ++ if (ifp == NULL) { ++ /* unknown interface */ ++ ifp = if_get_by_name(name, vrf_id, NULL); ++ } else { ++ /* pre-configured interface, learnt now */ ++ if (ifp->vrf->vrf_id != vrf_id) ++ if_update_to_new_vrf(ifp, vrf_id); ++ } ++ ++ /* Update interface information. */ ++ set_ifindex(ifp, ifindex, zns); ++ ifp->flags = flags; ++ ifp->mtu6 = ifp->mtu = mtu; ++ ifp->metric = 0; ++ ifp->speed = kernel_get_speed(ifp, NULL); ++ ifp->ptm_status = ZEBRA_PTM_STATUS_UNKNOWN; ++ ++ /* Set interface type */ ++ zebra_if_set_ziftype(ifp, zif_type, zif_slave_type); ++ if (IS_ZEBRA_IF_VRF(ifp)) ++ SET_FLAG(ifp->status, ++ ZEBRA_INTERFACE_VRF_LOOPBACK); ++ ++ /* Update link. */ ++ zebra_if_update_link(ifp, link_ifindex, link_nsid); ++ ++ /* ++ * Just set the @link/lower-device ifindex. During ++ * nldump interfaces are not ordered in any fashion so ++ * we may end up getting upper devices before lower ++ * devices. We will setup the real linkage once the dump ++ * is complete. ++ */ ++ zif = (struct zebra_if *)ifp->info; ++ zif->link_ifindex = link_ifindex; ++ ++ ifp->ll_type = dplane_ctx_get_ifp_zltype(ctx); ++ interface_update_hw_addr(ctx, ifp); ++ ++ /* Inform clients, install any configured addresses. */ ++ if_add_update(ifp); ++ ++ /* ++ * Extract and save L2 interface information, take ++ * additional actions. ++ */ ++ interface_update_l2info(ctx, ifp, zif_type, 1, ++ link_nsid); ++ if (IS_ZEBRA_IF_BOND(ifp)) ++ zebra_l2if_update_bond(ifp, true); ++ if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp)) ++ zebra_l2if_update_bridge_slave( ++ ifp, bridge_ifindex, ns_id, ++ ZEBRA_BRIDGE_NO_ACTION); ++ else if (IS_ZEBRA_IF_BOND_SLAVE(ifp)) ++ zebra_l2if_update_bond_slave(ifp, bond_ifindex, ++ !!bypass); ++ ++ if (protodown_set) { ++ interface_if_protodown(ifp, protodown, ++ rc_bitfield); ++ if (startup) ++ if_sweep_protodown(zif); ++ } ++ ++ if (IS_ZEBRA_IF_BRIDGE(ifp)) { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "RTM_NEWLINK ADD for %s(%u), vlan-aware %d", ++ name, ifp->ifindex, ++ IS_ZEBRA_IF_BRIDGE_VLAN_AWARE( ++ zif)); ++ } ++ } else if (ifp->vrf->vrf_id != vrf_id) { ++ /* VRF change for an interface. */ ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "RTM_NEWLINK vrf-change for %s(%u) vrf_id %u -> %u", ++ name, ifp->ifindex, ifp->vrf->vrf_id, ++ vrf_id); ++ ++ if_handle_vrf_change(ifp, vrf_id); ++ } else { ++ bool was_bridge_slave, was_bond_slave; ++ uint8_t chgflags = ZEBRA_BRIDGE_NO_ACTION; ++ ++ zif = ifp->info; ++ ++ /* Interface update. */ ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "RTM_NEWLINK update for %s(%u) sl_type %d master %u", ++ name, ifp->ifindex, zif_slave_type, ++ master_ifindex); ++ ++ set_ifindex(ifp, ifindex, zns); ++ ifp->mtu6 = ifp->mtu = mtu; ++ ifp->metric = 0; ++ ++ /* ++ * Update interface type - NOTE: Only slave_type can ++ * change. ++ */ ++ was_bridge_slave = IS_ZEBRA_IF_BRIDGE_SLAVE(ifp); ++ was_bond_slave = IS_ZEBRA_IF_BOND_SLAVE(ifp); ++ zebra_if_set_ziftype(ifp, zif_type, zif_slave_type); ++ ++ memcpy(old_hw_addr, ifp->hw_addr, INTERFACE_HWADDR_MAX); ++ ++ /* Update link. */ ++ zebra_if_update_link(ifp, link_ifindex, link_nsid); ++ ++ ifp->ll_type = dplane_ctx_get_ifp_zltype(ctx); ++ interface_update_hw_addr(ctx, ifp); ++ ++ if (protodown_set) ++ interface_if_protodown(ifp, protodown, ++ rc_bitfield); ++ ++ if (if_is_no_ptm_operative(ifp)) { ++ bool is_up = if_is_operative(ifp); ++ ++ ifp->flags = flags; ++ if (!if_is_no_ptm_operative(ifp) || ++ CHECK_FLAG(zif->flags, ++ ZIF_FLAG_PROTODOWN)) { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "Intf %s(%u) has gone DOWN", ++ name, ifp->ifindex); ++ if_down(ifp); ++ rib_update(RIB_UPDATE_KERNEL); ++ } else if (if_is_operative(ifp)) { ++ bool mac_updated = false; ++ ++ /* ++ * Must notify client daemons of new ++ * interface status. ++ */ ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "Intf %s(%u) PTM up, notifying clients", ++ name, ifp->ifindex); ++ if_up(ifp, !is_up); ++ ++ /* ++ * Update EVPN VNI when SVI MAC change ++ */ ++ if (memcmp(old_hw_addr, ifp->hw_addr, ++ INTERFACE_HWADDR_MAX)) ++ mac_updated = true; ++ if (IS_ZEBRA_IF_VLAN(ifp) && ++ mac_updated) { ++ struct interface *link_if; ++ ++ link_if = if_lookup_by_index_per_ns( ++ zebra_ns_lookup( ++ NS_DEFAULT), ++ link_ifindex); ++ if (link_if) ++ zebra_vxlan_svi_up( ++ ifp, link_if); ++ } else if (mac_updated && ++ IS_ZEBRA_IF_BRIDGE(ifp)) { ++ zlog_debug( ++ "Intf %s(%u) bridge changed MAC address", ++ name, ifp->ifindex); ++ chgflags = ++ ZEBRA_BRIDGE_MASTER_MAC_CHANGE; ++ } ++ } ++ } else { ++ ifp->flags = flags; ++ if (if_is_operative(ifp) && ++ !CHECK_FLAG(zif->flags, ++ ZIF_FLAG_PROTODOWN)) { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "Intf %s(%u) has come UP", ++ name, ifp->ifindex); ++ if_up(ifp, true); ++ if (IS_ZEBRA_IF_BRIDGE(ifp)) ++ chgflags = ++ ZEBRA_BRIDGE_MASTER_UP; ++ } else { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "Intf %s(%u) has gone DOWN", ++ name, ifp->ifindex); ++ if_down(ifp); ++ rib_update(RIB_UPDATE_KERNEL); ++ } ++ } ++ ++ /* ++ * Extract and save L2 interface information, take ++ * additional actions. ++ */ ++ interface_update_l2info(ctx, ifp, zif_type, 0, ++ link_nsid); ++ if (IS_ZEBRA_IF_BRIDGE(ifp)) ++ zebra_l2if_update_bridge(ifp, chgflags); ++ if (IS_ZEBRA_IF_BOND(ifp)) ++ zebra_l2if_update_bond(ifp, true); ++ if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) || was_bridge_slave) ++ zebra_l2if_update_bridge_slave( ++ ifp, bridge_ifindex, ns_id, chgflags); ++ else if (IS_ZEBRA_IF_BOND_SLAVE(ifp) || was_bond_slave) ++ zebra_l2if_update_bond_slave(ifp, bond_ifindex, ++ !!bypass); ++ if (IS_ZEBRA_IF_BRIDGE(ifp)) { ++ if (IS_ZEBRA_DEBUG_KERNEL) ++ zlog_debug( ++ "RTM_NEWLINK update for %s(%u), vlan-aware %d", ++ name, ifp->ifindex, ++ IS_ZEBRA_IF_BRIDGE_VLAN_AWARE( ++ zif)); ++ } ++ } ++ ++ zif = ifp->info; ++ if (zif) { ++ XFREE(MTYPE_ZIF_DESC, zif->desc); ++ if (desc[0]) ++ zif->desc = XSTRDUP(MTYPE_ZIF_DESC, desc); ++ } ++ } ++} ++ + void zebra_if_dplane_result(struct zebra_dplane_ctx *ctx) + { + struct zebra_ns *zns; +@@ -1514,17 +2204,6 @@ void zebra_if_dplane_result(struct zebra_dplane_ctx *ctx) + } + + ifp = if_lookup_by_index_per_ns(zns, ifindex); +- if (ifp == NULL) { +- if (op != DPLANE_OP_INTF_NETCONFIG || +- (ifindex != -1 && ifindex != -2)) { +- if (IS_ZEBRA_DEBUG_KERNEL) +- zlog_debug( +- "%s: can't find ifp at nsid %u index %d", +- __func__, ns_id, ifindex); +- +- return; +- } +- } + + switch (op) { + case DPLANE_OP_INTF_ADDR_ADD: +@@ -1535,7 +2214,15 @@ void zebra_if_dplane_result(struct zebra_dplane_ctx *ctx) + case DPLANE_OP_INTF_INSTALL: + case DPLANE_OP_INTF_UPDATE: + case DPLANE_OP_INTF_DELETE: +- zebra_if_update_ctx(ctx, ifp); ++ /* ++ * Queued from the dplane means it is something ++ * that we need to handle( create/delete the ++ * interface as needed ) ++ */ ++ if (dp_res == ZEBRA_DPLANE_REQUEST_QUEUED) ++ zebra_if_dplane_ifp_handling(ctx); ++ else ++ zebra_if_update_ctx(ctx, ifp); + break; + + case DPLANE_OP_INTF_NETCONFIG: +diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c +index 4cd84cada2..3756a4ab0c 100644 +--- a/zebra/kernel_netlink.c ++++ b/zebra/kernel_netlink.c +@@ -410,7 +410,7 @@ static int netlink_information_fetch(struct nlmsghdr *h, ns_id_t ns_id, + case RTM_NEWLINK: + return netlink_link_change(h, ns_id, startup); + case RTM_DELLINK: +- return netlink_link_change(h, ns_id, startup); ++ return 0; + case RTM_NEWNEIGH: + case RTM_DELNEIGH: + case RTM_GETNEIGH: +@@ -482,6 +482,7 @@ static int dplane_netlink_information_fetch(struct nlmsghdr *h, ns_id_t ns_id, + + case RTM_NEWLINK: + case RTM_DELLINK: ++ return netlink_link_change(h, ns_id, startup); + + default: + break; +@@ -1170,7 +1171,6 @@ int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int), + h->nlmsg_type, h->nlmsg_len, + h->nlmsg_seq, h->nlmsg_pid); + +- + /* + * Ignore messages that maybe sent from + * other actors besides the kernel +@@ -1774,17 +1774,11 @@ void kernel_init(struct zebra_ns *zns) + * lead to confusion, so we need to convert the + * RTNLGRP_XXX to a bit position for ourself + */ +- groups = RTMGRP_LINK | +- RTMGRP_IPV4_ROUTE | +- RTMGRP_IPV4_IFADDR | +- RTMGRP_IPV6_ROUTE | +- RTMGRP_IPV6_IFADDR | +- RTMGRP_IPV4_MROUTE | +- RTMGRP_NEIGH | +- ((uint32_t) 1 << (RTNLGRP_IPV4_RULE - 1)) | +- ((uint32_t) 1 << (RTNLGRP_IPV6_RULE - 1)) | +- ((uint32_t) 1 << (RTNLGRP_NEXTHOP - 1)) | +- ((uint32_t) 1 << (RTNLGRP_TC - 1)); ++ groups = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_IPV4_MROUTE | ++ RTMGRP_NEIGH | ((uint32_t)1 << (RTNLGRP_IPV4_RULE - 1)) | ++ ((uint32_t)1 << (RTNLGRP_IPV6_RULE - 1)) | ++ ((uint32_t)1 << (RTNLGRP_NEXTHOP - 1)) | ++ ((uint32_t)1 << (RTNLGRP_TC - 1)); + + dplane_groups = (RTMGRP_LINK | + RTMGRP_IPV4_IFADDR | +diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c +index f3462b9f22..98553edae6 100644 +--- a/zebra/kernel_socket.c ++++ b/zebra/kernel_socket.c +@@ -1482,6 +1482,14 @@ static void routing_socket(struct zebra_ns *zns) + thread_add_read(zrouter.master, kernel_read, NULL, routing_sock, NULL); + } + ++void interface_list_second(struct zebra_ns *zns) ++{ ++} ++ ++void interface_list_tunneldump(struct zebra_ns *zns) ++{ ++} ++ + /* Exported interface function. This function simply calls + routing_socket (). */ + void kernel_init(struct zebra_ns *zns) +diff --git a/zebra/rt.h b/zebra/rt.h +index 6f4dd48a54..3e91cdfffa 100644 +--- a/zebra/rt.h ++++ b/zebra/rt.h +@@ -99,6 +99,8 @@ extern int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *mroute); + * state. + */ + extern void interface_list(struct zebra_ns *zns); ++extern void interface_list_tunneldump(struct zebra_ns *zns); ++extern void interface_list_second(struct zebra_ns *zns); + extern void kernel_init(struct zebra_ns *zns); + extern void kernel_terminate(struct zebra_ns *zns, bool complete); + extern void macfdb_read(struct zebra_ns *zns); +diff --git a/zebra/rule_netlink.c b/zebra/rule_netlink.c +index 135f065428..4cc4281c1e 100644 +--- a/zebra/rule_netlink.c ++++ b/zebra/rule_netlink.c +@@ -416,6 +416,7 @@ int netlink_rules_read(struct zebra_ns *zns) + + ret = netlink_parse_info(netlink_rule_change, &zns->netlink_cmd, + &dp_info, 0, true); ++ + return ret; + } + +diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h +index c10482ed96..9f9496c8f4 100644 +--- a/zebra/zebra_dplane.h ++++ b/zebra/zebra_dplane.h +@@ -422,6 +422,19 @@ uint8_t dplane_ctx_get_ifp_family(const struct zebra_dplane_ctx *ctx); + struct zebra_vxlan_vni_array; + void dplane_ctx_set_ifp_vxlan_vni_array(struct zebra_dplane_ctx *ctx, + struct zebra_vxlan_vni_array *vniarray); ++ ++/* ++ * These defines mirror the values for bridge values in linux ++ * at this point since we only have a linux implementation ++ * we don't need to do any type of translation. Let's just ++ * pass these through and use them ++ */ ++#define DPLANE_BRIDGE_VLAN_INFO_PVID \ ++ (1 << 1) /* VLAN is PVID, ingress untagged */ ++#define DPLANE_BRIDGE_VLAN_INFO_RANGE_BEGIN \ ++ (1 << 3) /* VLAN is start of vlan range */ ++#define DPLANE_BRIDGE_VLAN_INFO_RANGE_END \ ++ (1 << 4) /* VLAN is end of vlan range */ + const struct zebra_vxlan_vni_array * + dplane_ctx_get_ifp_vxlan_vni_array(const struct zebra_dplane_ctx *ctx); + struct zebra_dplane_bridge_vlan_info { +diff --git a/zebra/zebra_l2.c b/zebra/zebra_l2.c +index 07bbc6e3bc..4ad262a21d 100644 +--- a/zebra/zebra_l2.c ++++ b/zebra/zebra_l2.c +@@ -258,7 +258,7 @@ void zebra_l2if_update_bond(struct interface *ifp, bool add) + * map slaves (if any) to the bridge. + */ + void zebra_l2_bridge_add_update(struct interface *ifp, +- struct zebra_l2info_bridge *bridge_info) ++ const struct zebra_l2info_bridge *bridge_info) + { + struct zebra_if *zif; + +@@ -293,7 +293,7 @@ void zebra_l2if_update_bridge(struct interface *ifp, uint8_t chgflags) + * VLAN Id and this cannot change. + */ + void zebra_l2_vlanif_update(struct interface *ifp, +- struct zebra_l2info_vlan *vlan_info) ++ const struct zebra_l2info_vlan *vlan_info) + { + struct zebra_if *zif; + +@@ -310,7 +310,7 @@ void zebra_l2_vlanif_update(struct interface *ifp, + * clients about GRE information. + */ + void zebra_l2_greif_add_update(struct interface *ifp, +- struct zebra_l2info_gre *gre_info, int add) ++ const struct zebra_l2info_gre *gre_info, int add) + { + struct zebra_if *zif; + struct in_addr old_vtep_ip; +@@ -337,7 +337,8 @@ void zebra_l2_greif_add_update(struct interface *ifp, + * IP and VLAN mapping, but the latter is handled separately. + */ + void zebra_l2_vxlanif_add_update(struct interface *ifp, +- struct zebra_l2info_vxlan *vxlan_info, int add) ++ const struct zebra_l2info_vxlan *vxlan_info, ++ int add) + { + struct zebra_if *zif; + struct in_addr old_vtep_ip; +diff --git a/zebra/zebra_l2.h b/zebra/zebra_l2.h +index 8fef008f52..e3c5544f8f 100644 +--- a/zebra/zebra_l2.h ++++ b/zebra/zebra_l2.h +@@ -71,6 +71,18 @@ struct zebra_l2info_gre { + ns_id_t link_nsid; + }; + ++struct zebra_vxlan_vni { ++ vni_t vni; /* VNI */ ++ vlanid_t access_vlan; /* Access VLAN - for VLAN-aware bridge. */ ++ struct in_addr mcast_grp; ++ uint16_t flags; ++}; ++ ++struct zebra_vxlan_vni_array { ++ uint16_t count; ++ struct zebra_vxlan_vni vnis[0]; ++}; ++ + /* zebra L2 interface information - VXLAN interface */ + struct zebra_l2info_vxlan { + vni_t vni; /* VNI */ +@@ -108,17 +120,19 @@ extern void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave, + struct zebra_ns *zns); + extern void + zebra_l2_unmap_slave_from_bridge(struct zebra_l2info_brslave *br_slave); +-extern void zebra_l2_bridge_add_update(struct interface *ifp, +- struct zebra_l2info_bridge *bridge_info); ++extern void ++zebra_l2_bridge_add_update(struct interface *ifp, ++ const struct zebra_l2info_bridge *bridge_info); + extern void zebra_l2_bridge_del(struct interface *ifp); + extern void zebra_l2_vlanif_update(struct interface *ifp, +- struct zebra_l2info_vlan *vlan_info); ++ const struct zebra_l2info_vlan *vlan_info); + extern void zebra_l2_greif_add_update(struct interface *ifp, +- struct zebra_l2info_gre *vxlan_info, ++ const struct zebra_l2info_gre *vxlan_info, + int add); +-extern void zebra_l2_vxlanif_add_update(struct interface *ifp, +- struct zebra_l2info_vxlan *vxlan_info, +- int add); ++extern void ++zebra_l2_vxlanif_add_update(struct interface *ifp, ++ const struct zebra_l2info_vxlan *vxlan_info, ++ int add); + extern void zebra_l2_vxlanif_update_access_vlan(struct interface *ifp, + vlanid_t access_vlan); + extern void zebra_l2_greif_del(struct interface *ifp); +diff --git a/zebra/zebra_ns.c b/zebra/zebra_ns.c +index 7b076b8a4a..4714cdbff8 100644 +--- a/zebra/zebra_ns.c ++++ b/zebra/zebra_ns.c +@@ -38,6 +38,7 @@ + #include "rib.h" + #include "table_manager.h" + #include "zebra_errors.h" ++#include "zebra_dplane.h" + + extern struct zebra_privs_t zserv_privs; + +@@ -116,6 +117,35 @@ int zebra_ns_disabled(struct ns *ns) + return zebra_ns_disable_internal(zns, true); + } + ++void zebra_ns_startup_continue(struct zebra_dplane_ctx *ctx) ++{ ++ struct zebra_ns *zns = zebra_ns_lookup(dplane_ctx_get_ns_id(ctx)); ++ enum zebra_dplane_startup_notifications spot; ++ ++ if (!zns) { ++ zlog_err("%s: No Namespace associated with %u", __func__, ++ dplane_ctx_get_ns_id(ctx)); ++ return; ++ } ++ ++ spot = dplane_ctx_get_startup_spot(ctx); ++ ++ switch (spot) { ++ case ZEBRA_DPLANE_INTERFACES_READ: ++ interface_list_tunneldump(zns); ++ break; ++ case ZEBRA_DPLANE_TUNNELS_READ: ++ interface_list_second(zns); ++ break; ++ case ZEBRA_DPLANE_ADDRESSES_READ: ++ route_read(zns); ++ ++ kernel_read_pbr_rules(zns); ++ kernel_read_tc_qdisc(zns); ++ break; ++ } ++} ++ + /* Do global enable actions - open sockets, read kernel config etc. */ + int zebra_ns_enable(ns_id_t ns_id, void **info) + { +@@ -126,9 +156,6 @@ int zebra_ns_enable(ns_id_t ns_id, void **info) + kernel_init(zns); + zebra_dplane_ns_enable(zns, true); + interface_list(zns); +- route_read(zns); +- kernel_read_pbr_rules(zns); +- kernel_read_tc_qdisc(zns); + + return 0; + } +diff --git a/zebra/zebra_ns.h b/zebra/zebra_ns.h +index 7a0ffbc1ee..3d7d96c83f 100644 +--- a/zebra/zebra_ns.h ++++ b/zebra/zebra_ns.h +@@ -83,6 +83,8 @@ int zebra_ns_final_shutdown(struct ns *ns, + void **param_out __attribute__((unused))); + int zebra_ns_config_write(struct vty *vty, struct ns *ns); + ++void zebra_ns_startup_continue(struct zebra_dplane_ctx *ctx); ++ + #ifdef __cplusplus + } + #endif +diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c +index 201fc761ae..fd6df441c6 100644 +--- a/zebra/zebra_rib.c ++++ b/zebra/zebra_rib.c +@@ -4770,7 +4770,9 @@ static void rib_process_dplane_results(struct thread *thread) + case DPLANE_OP_NEIGH_TABLE_UPDATE: + case DPLANE_OP_GRE_SET: + case DPLANE_OP_NONE: ++ break; + case DPLANE_OP_STARTUP_STAGE: ++ zebra_ns_startup_continue(ctx); + break; + + } /* Dispatch by op code */ +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0019-zebra-Abstract-dplane_ctx_route_init-to-init-route-w.patch b/src/sonic-frr/patch/0019-zebra-Abstract-dplane_ctx_route_init-to-init-route-w.patch new file mode 100644 index 000000000000..583609209e71 --- /dev/null +++ b/src/sonic-frr/patch/0019-zebra-Abstract-dplane_ctx_route_init-to-init-route-w.patch @@ -0,0 +1,74 @@ +From 6fe32f784f57b4f10b96c9cdb938bf5ebf097fa2 Mon Sep 17 00:00:00 2001 +From: Carmine Scarpitta +Date: Fri, 7 Jul 2023 02:55:18 +0200 +Subject: [PATCH 1/2] zebra: Abstract `dplane_ctx_route_init` to init route + without copying + +The function `dplane_ctx_route_init` initializes a dplane route context +from the route object passed as an argument. Let's abstract this +function to allow initializing the dplane route context without actually +copying a route object. + +This allows us to use this function for initializing a dplane route +context when we don't have any route to copy in it. + +Signed-off-by: Carmine Scarpitta + +diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c +index 83a38c2199..ae87e4f8b6 100644 +--- a/zebra/zebra_dplane.c ++++ b/zebra/zebra_dplane.c +@@ -3257,7 +3257,7 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, + { + int ret = EINVAL; + +- if (!ctx || !re) ++ if (!ctx) + return ret; + + dplane_intf_extra_list_init(&ctx->u.rinfo.intf_extra_list); +@@ -3265,6 +3265,13 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, + ctx->zd_op = op; + ctx->zd_status = ZEBRA_DPLANE_REQUEST_SUCCESS; + ++ /* This function may be called to create/init a dplane context, not ++ * necessarily to copy a route object. Let's return if there is no route ++ * object to copy. ++ */ ++ if (!re) ++ return AOK; ++ + ctx->u.rinfo.zd_type = re->type; + ctx->u.rinfo.zd_old_type = re->type; + +@@ -3296,6 +3303,8 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, + + /* + * Initialize a context block for a route update from zebra data structs. ++ * If the `rn` or `re` parameters are NULL, this function only initializes the ++ * dplane context without copying a route object into it. + */ + int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, + struct route_node *rn, struct route_entry *re) +@@ -3312,9 +3321,17 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, + const struct interface *ifp; + struct dplane_intf_extra *if_extra; + +- if (!ctx || !rn || !re) ++ if (!ctx) + return ret; + ++ /* ++ * Initialize the dplane context and return, if there is no route ++ * object to copy ++ */ ++ if (!re || !rn) ++ return dplane_ctx_route_init_basic(ctx, op, NULL, NULL, NULL, ++ AFI_UNSPEC, SAFI_UNSPEC); ++ + /* + * Let's grab the data from the route_node + * so that we can call a helper function +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0019-zebra-Rearrange-dplane_ctx_route_init.patch b/src/sonic-frr/patch/0019-zebra-Rearrange-dplane_ctx_route_init.patch deleted file mode 100755 index 5e76f7abdb68..000000000000 --- a/src/sonic-frr/patch/0019-zebra-Rearrange-dplane_ctx_route_init.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 1ecc146b19ea78a34fc5cba08d55aca72527d7c3 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Mon, 3 Oct 2022 13:22:22 -0400 -Subject: [PATCH 5/8] zebra: Rearrange dplane_ctx_route_init - -In order for a future commit to abstract the dplane_ctx_route_init -so that the kernel can use it, let's move some stuff around -and add a dplane_ctx_route_init_basic that can be used by multiple -different paths - -Signed-off-by: Donald Sharp - -create a dplane_ctx_route_init_basic so it can be used - -Signed-off-by: Donald Sharp ---- - zebra/zebra_dplane.c | 64 +++++++++++++++++++++++++++++--------------- - zebra/zebra_dplane.h | 6 +++++ - 2 files changed, 49 insertions(+), 21 deletions(-) - -diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c -index 5d94e1a0b..05f9c2e08 100644 ---- a/zebra/zebra_dplane.c -+++ b/zebra/zebra_dplane.c -@@ -2334,25 +2334,16 @@ static int dplane_ctx_ns_init(struct zebra_dplane_ctx *ctx, - return AOK; - } - --/* -- * Initialize a context block for a route update from zebra data structs. -- */ --int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, -- struct route_node *rn, struct route_entry *re) -+int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, -+ enum dplane_op_e op, struct route_entry *re, -+ const struct prefix *p, -+ const struct prefix *src_p, afi_t afi, -+ safi_t safi) - { - int ret = EINVAL; -- const struct route_table *table = NULL; -- const struct rib_table_info *info; -- const struct prefix *p, *src_p; -- struct zebra_ns *zns; -- struct zebra_vrf *zvrf; -- struct nexthop *nexthop; -- struct zebra_l3vni *zl3vni; -- const struct interface *ifp; -- struct dplane_intf_extra *if_extra; - -- if (!ctx || !rn || !re) -- goto done; -+ if (!ctx || !re) -+ return ret; - - TAILQ_INIT(&ctx->u.rinfo.intf_extra_q); - -@@ -2362,9 +2353,6 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - ctx->u.rinfo.zd_type = re->type; - ctx->u.rinfo.zd_old_type = re->type; - -- /* Prefixes: dest, and optional source */ -- srcdest_rnode_prefixes(rn, &p, &src_p); -- - prefix_copy(&(ctx->u.rinfo.zd_dest), p); - - if (src_p) -@@ -2385,11 +2373,45 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - ctx->u.rinfo.zd_old_tag = re->tag; - ctx->u.rinfo.zd_distance = re->distance; - -+ ctx->u.rinfo.zd_afi = afi; -+ ctx->u.rinfo.zd_safi = safi; -+ -+ return AOK; -+} -+ -+/* -+ * Initialize a context block for a route update from zebra data structs. -+ */ -+int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, -+ struct route_node *rn, struct route_entry *re) -+{ -+ int ret = EINVAL; -+ const struct route_table *table = NULL; -+ const struct rib_table_info *info; -+ const struct prefix *p, *src_p; -+ struct zebra_ns *zns; -+ struct zebra_vrf *zvrf; -+ struct nexthop *nexthop; -+ struct zebra_l3vni *zl3vni; -+ const struct interface *ifp; -+ struct dplane_intf_extra *if_extra; -+ -+ if (!ctx || !rn || !re) -+ return ret; -+ -+ /* -+ * Let's grab the data from the route_node -+ * so that we can call a helper function -+ */ -+ -+ /* Prefixes: dest, and optional source */ -+ srcdest_rnode_prefixes(rn, &p, &src_p); - table = srcdest_rnode_table(rn); - info = table->info; - -- ctx->u.rinfo.zd_afi = info->afi; -- ctx->u.rinfo.zd_safi = info->safi; -+ if (dplane_ctx_route_init_basic(ctx, op, re, p, src_p, info->afi, -+ info->safi) != AOK) -+ return ret; - - /* Copy nexthops; recursive info is included too */ - copy_nexthops(&(ctx->u.rinfo.zd_ng.nexthop), -diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h -index 3210137c0..9d7502828 100644 ---- a/zebra/zebra_dplane.h -+++ b/zebra/zebra_dplane.h -@@ -774,6 +774,12 @@ dplane_pbr_ipset_entry_delete(struct zebra_pbr_ipset_entry *ipset); - int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - struct route_node *rn, struct route_entry *re); - -+int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, -+ enum dplane_op_e op, struct route_entry *re, -+ const struct prefix *p, -+ const struct prefix *src_p, afi_t afi, -+ safi_t safi); -+ - /* Encode next hop information into data plane context. */ - int dplane_ctx_nexthop_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - struct nhg_hash_entry *nhe); --- -2.30.2 - diff --git a/src/sonic-frr/patch/0020-zebra-Add-ctx-to-netlink-message-parsing.patch b/src/sonic-frr/patch/0020-zebra-Add-ctx-to-netlink-message-parsing.patch deleted file mode 100755 index 9c1dd6ac5f76..000000000000 --- a/src/sonic-frr/patch/0020-zebra-Add-ctx-to-netlink-message-parsing.patch +++ /dev/null @@ -1,155 +0,0 @@ -From aebf87ce244c5189cec686ddf1278ae343807a53 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Tue, 4 Oct 2022 15:41:36 -0400 -Subject: [PATCH 6/8] zebra: Add ctx to netlink message parsing - -Add the initial step of passing in a dplane context -to reading route netlink messages. This code -will be run in two contexts: - -a) The normal pthread for reading netlink messages from -the kernel -b) The dplane_fpm_nl pthread. - -The goal of this commit is too just allow a) to work -b) will be filled in in the future. Effectively -everything should still be working as it should -pre this change. We will just possibly allow -the passing of the context around( but not used ) - -Signed-off-by: Donald Sharp ---- - zebra/rt_netlink.c | 31 +++++++++++++++++++++++-------- - zebra/rt_netlink.h | 4 ++++ - zebra/zebra_dplane.c | 11 +++++++++++ - zebra/zebra_dplane.h | 10 ++++++++++ - 4 files changed, 48 insertions(+), 8 deletions(-) - -diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c -index 24c01b7f5..b2df2cd8a 100644 ---- a/zebra/rt_netlink.c -+++ b/zebra/rt_netlink.c -@@ -667,8 +667,9 @@ static uint8_t parse_multipath_nexthops_unicast(ns_id_t ns_id, - } - - /* Looking up routing table by netlink interface. */ --static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, -- int startup) -+int netlink_route_change_read_unicast_internal(struct nlmsghdr *h, -+ ns_id_t ns_id, int startup, -+ struct zebra_dplane_ctx *ctx) - { - int len; - struct rtmsg *rtm; -@@ -740,9 +741,8 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, - - selfroute = is_selfroute(rtm->rtm_protocol); - -- if (!startup && selfroute -- && h->nlmsg_type == RTM_NEWROUTE -- && !zrouter.asic_offloaded) { -+ if (!startup && selfroute && h->nlmsg_type == RTM_NEWROUTE && -+ !zrouter.asic_offloaded && !ctx) { - if (IS_ZEBRA_DEBUG_KERNEL) - zlog_debug("Route type: %d Received that we think we have originated, ignoring", - rtm->rtm_protocol); -@@ -963,12 +963,20 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, - } - - if (nhe_id || ng) -- rib_add_multipath(afi, SAFI_UNICAST, &p, -- &src_p, re, ng); -+ dplane_rib_add_multipath(afi, SAFI_UNICAST, &p, -+ &src_p, re, ng, -+ startup, ctx); - else - XFREE(MTYPE_RE, re); - } - } else { -+ if (ctx) { -+ zlog_err( -+ "%s: %pFX RTM_DELROUTE received but received a context as well", -+ __func__, &p); -+ return 0; -+ } -+ - if (nhe_id) { - rib_delete(afi, SAFI_UNICAST, vrf_id, proto, 0, flags, - &p, &src_p, NULL, nhe_id, table, metric, -@@ -993,7 +1001,14 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, - } - } - -- return 0; -+ return 1; -+} -+ -+static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, -+ int startup) -+{ -+ return netlink_route_change_read_unicast_internal(h, ns_id, startup, -+ NULL); - } - - static struct mcast_route_data *mroute = NULL; -diff --git a/zebra/rt_netlink.h b/zebra/rt_netlink.h -index 93c06e555..da044c2c4 100644 ---- a/zebra/rt_netlink.h -+++ b/zebra/rt_netlink.h -@@ -122,6 +122,10 @@ netlink_put_lsp_update_msg(struct nl_batch *bth, struct zebra_dplane_ctx *ctx); - extern enum netlink_msg_status - netlink_put_pw_update_msg(struct nl_batch *bth, struct zebra_dplane_ctx *ctx); - -+int netlink_route_change_read_unicast_internal(struct nlmsghdr *h, -+ ns_id_t ns_id, int startup, -+ struct zebra_dplane_ctx *ctx); -+ - #ifdef NETLINK_DEBUG - const char *nlmsg_type2str(uint16_t type); - const char *af_type2str(int type); -diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c -index 05f9c2e08..5048bf7dc 100644 ---- a/zebra/zebra_dplane.c -+++ b/zebra/zebra_dplane.c -@@ -5320,6 +5320,17 @@ kernel_dplane_process_ipset_entry(struct zebra_dplane_provider *prov, - dplane_provider_enqueue_out_ctx(prov, ctx); - } - -+void dplane_rib_add_multipath(afi_t afi, safi_t safi, struct prefix *p, -+ struct prefix_ipv6 *src_p, struct route_entry *re, -+ struct nexthop_group *ng, int startup, -+ struct zebra_dplane_ctx *ctx) -+{ -+ if (!ctx) -+ rib_add_multipath(afi, safi, p, src_p, re, ng); -+ else { -+ } -+} -+ - /* - * Kernel provider callback - */ -diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h -index 9d7502828..4732a1628 100644 ---- a/zebra/zebra_dplane.h -+++ b/zebra/zebra_dplane.h -@@ -938,6 +938,16 @@ void zebra_dplane_pre_finish(void); - void zebra_dplane_finish(void); - void zebra_dplane_shutdown(void); - -+/* -+ * decision point for sending a routing update through the old -+ * straight to zebra master pthread or through the dplane to -+ * the master pthread for handling -+ */ -+void dplane_rib_add_multipath(afi_t afi, safi_t safi, struct prefix *p, -+ struct prefix_ipv6 *src_p, struct route_entry *re, -+ struct nexthop_group *ng, int startup, -+ struct zebra_dplane_ctx *ctx); -+ - #ifdef __cplusplus - } - #endif --- -2.30.2 - diff --git a/src/sonic-frr/patch/0020-zebra-Fix-crash-when-dplane_fpm_nl-fails-to-process-.patch b/src/sonic-frr/patch/0020-zebra-Fix-crash-when-dplane_fpm_nl-fails-to-process-.patch new file mode 100644 index 000000000000..f1bbf13061f2 --- /dev/null +++ b/src/sonic-frr/patch/0020-zebra-Fix-crash-when-dplane_fpm_nl-fails-to-process-.patch @@ -0,0 +1,50 @@ +From 6d7a251e5075a6fbced11e43fcdaa9e324c3871f Mon Sep 17 00:00:00 2001 +From: Carmine Scarpitta +Date: Fri, 7 Jul 2023 02:57:07 +0200 +Subject: [PATCH 2/2] zebra: Fix crash when `dplane_fpm_nl` fails to process + received routes + +When `dplane_fpm_nl` receives a route, it allocates memory for a dplane +context and calls `netlink_route_change_read_unicast_internal` without +initializing the `intf_extra_list` contained in the dplane context. If +`netlink_route_change_read_unicast_internal` is not able to process the +route, we call `dplane_ctx_fini` to free the dplane context. This causes +a crash because `dplane_ctx_fini` attempts to access the intf_extra_list +which is not initialized. + +To solve this issue, we can call `dplane_ctx_route_init`to initialize +the dplane route context properly, just after the dplane context +allocation. + +(gdb) bt +#0 0x0000555dd5ceae80 in dplane_intf_extra_list_pop (h=0x7fae1c007e68) at ../zebra/zebra_dplane.c:427 +#1 dplane_ctx_free_internal (ctx=0x7fae1c0074b0) at ../zebra/zebra_dplane.c:724 +#2 0x0000555dd5cebc99 in dplane_ctx_free (pctx=0x7fae2aa88c98) at ../zebra/zebra_dplane.c:869 +#3 dplane_ctx_free (pctx=0x7fae2aa88c98, pctx@entry=0x7fae2aa78c28) at ../zebra/zebra_dplane.c:855 +#4 dplane_ctx_fini (pctx=pctx@entry=0x7fae2aa88c98) at ../zebra/zebra_dplane.c:890 +#5 0x00007fae31e93f29 in fpm_read (t=) at ../zebra/dplane_fpm_nl.c:605 +#6 0x00007fae325191dd in thread_call (thread=thread@entry=0x7fae2aa98da0) at ../lib/thread.c:2006 +#7 0x00007fae324c42b8 in fpt_run (arg=0x555dd74777c0) at ../lib/frr_pthread.c:309 +#8 0x00007fae32405ea7 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0 +#9 0x00007fae32325a2f in clone () from /lib/x86_64-linux-gnu/libc.so.6 + +Fixes: #13754 +Signed-off-by: Carmine Scarpitta + +diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c +index 9f38401618..caa2f988e2 100644 +--- a/zebra/dplane_fpm_nl.c ++++ b/zebra/dplane_fpm_nl.c +@@ -599,7 +599,8 @@ static void fpm_read(struct thread *t) + switch (hdr->nlmsg_type) { + case RTM_NEWROUTE: + ctx = dplane_ctx_alloc(); +- dplane_ctx_set_op(ctx, DPLANE_OP_ROUTE_NOTIFY); ++ dplane_ctx_route_init(ctx, DPLANE_OP_ROUTE_NOTIFY, NULL, ++ NULL); + if (netlink_route_change_read_unicast_internal( + hdr, 0, false, ctx) != 1) { + dplane_ctx_fini(&ctx); +-- +2.17.1 + diff --git a/src/sonic-frr/patch/0021-zebra-Read-from-the-dplane_fpm_nl-a-route-update.patch b/src/sonic-frr/patch/0021-zebra-Read-from-the-dplane_fpm_nl-a-route-update.patch deleted file mode 100755 index 0af36d76172a..000000000000 --- a/src/sonic-frr/patch/0021-zebra-Read-from-the-dplane_fpm_nl-a-route-update.patch +++ /dev/null @@ -1,289 +0,0 @@ -From 95fac14ae8076ef4f5749aa3b761a7603b8c05cc Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Fri, 7 Oct 2022 08:02:44 -0400 -Subject: [PATCH 7/8] zebra: Read from the dplane_fpm_nl a route update - -Read from the fpm dplane a route update that will -include status about whether or not the asic was -successfull in offloading the route. - -Have this data passed up to zebra for processing and disseminate -this data as appropriate. - -Signed-off-by: Donald Sharp ---- - doc/developer/fpm.rst | 16 ++++++ - zebra/dplane_fpm_nl.c | 122 +++++++++++++++++++++++++++++++++++++++++- - zebra/zebra_dplane.c | 10 ++-- - zebra/zebra_dplane.h | 2 +- - zebra/zebra_rib.c | 16 +++++- - 5 files changed, 158 insertions(+), 8 deletions(-) - -diff --git a/doc/developer/fpm.rst b/doc/developer/fpm.rst -index 984986913..56d33671d 100644 ---- a/doc/developer/fpm.rst -+++ b/doc/developer/fpm.rst -@@ -101,3 +101,19 @@ Data - ^^^^ - - The netlink or protobuf message payload. -+ -+ -+Route Status Notification from ASIC -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+The dplane_fpm_nl has the ability to read route netlink messages -+from the underlying fpm implementation that can tell zebra -+whether or not the route has been Offloaded/Failed or Trapped. -+The end developer must send the data up the same socket that has -+been created to listen for FPM messages from Zebra. The data sent -+must have a Frame Header with Version set to 1, Message Type set to 1 -+and an appropriate message Length. The message data must contain -+a RTM_NEWROUTE netlink message that sends the prefix and nexthops -+associated with the route. Finally rtm_flags must contain -+RTM_F_OFFLOAD, RTM_F_TRAP and or RTM_F_OFFLOAD_FAILED to signify -+what has happened to the route in the ASIC. -diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c -index 8d41f3b07..893ee5845 100644 ---- a/zebra/dplane_fpm_nl.c -+++ b/zebra/dplane_fpm_nl.c -@@ -51,6 +51,7 @@ - #include "zebra/kernel_netlink.h" - #include "zebra/rt_netlink.h" - #include "zebra/debug.h" -+#include "fpm/fpm.h" - - #define SOUTHBOUND_DEFAULT_ADDR INADDR_LOOPBACK - #define SOUTHBOUND_DEFAULT_PORT 2620 -@@ -461,7 +462,13 @@ static void fpm_reconnect(struct fpm_nl_ctx *fnc) - static int fpm_read(struct thread *t) - { - struct fpm_nl_ctx *fnc = THREAD_ARG(t); -+ fpm_msg_hdr_t fpm; - ssize_t rv; -+ char buf[65535]; -+ struct nlmsghdr *hdr; -+ struct zebra_dplane_ctx *ctx; -+ size_t available_bytes; -+ size_t hdr_available_bytes; - - /* Let's ignore the input at the moment. */ - rv = stream_read_try(fnc->ibuf, fnc->socket, -@@ -493,12 +500,123 @@ static int fpm_read(struct thread *t) - if (rv == -2) - return 0; - -- stream_reset(fnc->ibuf); -- - /* Account all bytes read. */ - atomic_fetch_add_explicit(&fnc->counters.bytes_read, rv, - memory_order_relaxed); - -+ available_bytes = STREAM_READABLE(fnc->ibuf); -+ while (available_bytes) { -+ if (available_bytes < (ssize_t)FPM_MSG_HDR_LEN) { -+ stream_pulldown(fnc->ibuf); -+ return 0; -+ } -+ -+ fpm.version = stream_getc(fnc->ibuf); -+ fpm.msg_type = stream_getc(fnc->ibuf); -+ fpm.msg_len = stream_getw(fnc->ibuf); -+ -+ if (fpm.version != FPM_PROTO_VERSION && -+ fpm.msg_type != FPM_MSG_TYPE_NETLINK) { -+ stream_reset(fnc->ibuf); -+ zlog_warn( -+ "%s: Received version/msg_type %u/%u, expected 1/1", -+ __func__, fpm.version, fpm.msg_type); -+ -+ FPM_RECONNECT(fnc); -+ return 0; -+ } -+ -+ /* -+ * If the passed in length doesn't even fill in the header -+ * something is wrong and reset. -+ */ -+ if (fpm.msg_len < FPM_MSG_HDR_LEN) { -+ zlog_warn( -+ "%s: Received message length: %u that does not even fill the FPM header", -+ __func__, fpm.msg_len); -+ FPM_RECONNECT(fnc); -+ return 0; -+ } -+ -+ /* -+ * If we have not received the whole payload, reset the stream -+ * back to the beginning of the header and move it to the -+ * top. -+ */ -+ if (fpm.msg_len > available_bytes) { -+ stream_rewind_getp(fnc->ibuf, FPM_MSG_HDR_LEN); -+ stream_pulldown(fnc->ibuf); -+ return 0; -+ } -+ -+ available_bytes -= FPM_MSG_HDR_LEN; -+ -+ /* -+ * Place the data from the stream into a buffer -+ */ -+ hdr = (struct nlmsghdr *)buf; -+ stream_get(buf, fnc->ibuf, fpm.msg_len - FPM_MSG_HDR_LEN); -+ hdr_available_bytes = fpm.msg_len - FPM_MSG_HDR_LEN; -+ available_bytes -= hdr_available_bytes; -+ -+ /* Sanity check: must be at least header size. */ -+ if (hdr->nlmsg_len < sizeof(*hdr)) { -+ zlog_warn( -+ "%s: [seq=%u] invalid message length %u (< %zu)", -+ __func__, hdr->nlmsg_seq, hdr->nlmsg_len, -+ sizeof(*hdr)); -+ continue; -+ } -+ -+ if (hdr->nlmsg_len > fpm.msg_len) { -+ zlog_warn( -+ "%s: Received a inner header length of %u that is greater than the fpm total length of %u", -+ __func__, hdr->nlmsg_len, fpm.msg_len); -+ FPM_RECONNECT(fnc); -+ } -+ -+ /* Not enough bytes available. */ -+ if (hdr->nlmsg_len > hdr_available_bytes) { -+ zlog_warn( -+ "%s: [seq=%u] invalid message length %u (> %zu)", -+ __func__, hdr->nlmsg_seq, hdr->nlmsg_len, -+ available_bytes); -+ continue; -+ } -+ -+ if (!(hdr->nlmsg_flags & NLM_F_REQUEST)) { -+ if (IS_ZEBRA_DEBUG_FPM) -+ zlog_debug( -+ "%s: [seq=%u] not a request, skipping", -+ __func__, hdr->nlmsg_seq); -+ -+ /* -+ * This request is a bust, go to the next one -+ */ -+ continue; -+ } -+ -+ switch (hdr->nlmsg_type) { -+ case RTM_NEWROUTE: -+ ctx = dplane_ctx_alloc(); -+ dplane_ctx_set_op(ctx, DPLANE_OP_ROUTE_NOTIFY); -+ if (netlink_route_change_read_unicast_internal( -+ hdr, 0, false, ctx) != 1) { -+ dplane_ctx_fini(&ctx); -+ stream_pulldown(fnc->ibuf); -+ return 0; -+ } -+ break; -+ default: -+ if (IS_ZEBRA_DEBUG_FPM) -+ zlog_debug( -+ "%s: Received message type %u which is not currently handled", -+ __func__, hdr->nlmsg_type); -+ break; -+ } -+ } -+ -+ stream_reset(fnc->ibuf); - return 0; - } - -diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c -index 5048bf7dc..336056abb 100644 ---- a/zebra/zebra_dplane.c -+++ b/zebra/zebra_dplane.c -@@ -2337,7 +2337,7 @@ static int dplane_ctx_ns_init(struct zebra_dplane_ctx *ctx, - int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, - enum dplane_op_e op, struct route_entry *re, - const struct prefix *p, -- const struct prefix *src_p, afi_t afi, -+ const struct prefix_ipv6 *src_p, afi_t afi, - safi_t safi) - { - int ret = EINVAL; -@@ -2388,7 +2388,8 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - int ret = EINVAL; - const struct route_table *table = NULL; - const struct rib_table_info *info; -- const struct prefix *p, *src_p; -+ const struct prefix *p; -+ const struct prefix_ipv6 *src_p; - struct zebra_ns *zns; - struct zebra_vrf *zvrf; - struct nexthop *nexthop; -@@ -2405,7 +2406,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - */ - - /* Prefixes: dest, and optional source */ -- srcdest_rnode_prefixes(rn, &p, &src_p); -+ srcdest_rnode_prefixes(rn, &p, (const struct prefix **)&src_p); - table = srcdest_rnode_table(rn); - info = table->info; - -@@ -5328,6 +5329,9 @@ void dplane_rib_add_multipath(afi_t afi, safi_t safi, struct prefix *p, - if (!ctx) - rib_add_multipath(afi, safi, p, src_p, re, ng); - else { -+ dplane_ctx_route_init_basic(ctx, dplane_ctx_get_op(ctx), re, p, -+ src_p, afi, safi); -+ dplane_provider_enqueue_to_zebra(ctx); - } - } - -diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h -index 4732a1628..c3fe3ba40 100644 ---- a/zebra/zebra_dplane.h -+++ b/zebra/zebra_dplane.h -@@ -777,7 +777,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, - enum dplane_op_e op, struct route_entry *re, - const struct prefix *p, -- const struct prefix *src_p, afi_t afi, -+ const struct prefix_ipv6 *src_p, afi_t afi, - safi_t safi); - - /* Encode next hop information into data plane context. */ -diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c -index abd6e07f9..50f19adcc 100644 ---- a/zebra/zebra_rib.c -+++ b/zebra/zebra_rib.c -@@ -2138,8 +2138,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) - } - - /* Ensure we clear the QUEUED flag */ -- if (!zrouter.asic_offloaded) -- UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); -+ UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); - - /* Is this a notification that ... matters? We mostly care about - * the route that is currently selected for installation; we may also -@@ -2182,6 +2181,19 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) - dplane_ctx_get_type(ctx))); - } - goto done; -+ } else { -+ uint32_t flags = dplane_ctx_get_flags(ctx); -+ -+ if (CHECK_FLAG(flags, ZEBRA_FLAG_OFFLOADED)) { -+ UNSET_FLAG(re->flags, ZEBRA_FLAG_OFFLOAD_FAILED); -+ SET_FLAG(re->flags, ZEBRA_FLAG_OFFLOADED); -+ } -+ if (CHECK_FLAG(flags, ZEBRA_FLAG_OFFLOAD_FAILED)) { -+ UNSET_FLAG(re->flags, ZEBRA_FLAG_OFFLOADED); -+ SET_FLAG(re->flags, ZEBRA_FLAG_OFFLOAD_FAILED); -+ } -+ if (CHECK_FLAG(flags, ZEBRA_FLAG_TRAPPED)) -+ SET_FLAG(re->flags, ZEBRA_FLAG_TRAPPED); - } - - /* We'll want to determine whether the installation status of the --- -2.30.2 - diff --git a/src/sonic-frr/patch/0022-zebra-Fix-code-because-missing-backport.patch b/src/sonic-frr/patch/0022-zebra-Fix-code-because-missing-backport.patch deleted file mode 100755 index 4fa3a490ffac..000000000000 --- a/src/sonic-frr/patch/0022-zebra-Fix-code-because-missing-backport.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 0104413e893f3e2d41da101b6788aea240e5a21a Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Thu, 15 Dec 2022 10:52:38 -0500 -Subject: [PATCH 8/8] zebra: Fix code because missing backport - -The commit: -commit 07fd1f7e9420efd480e85a9ab72b88fff274f791 -Author: Donald Sharp -Date: Tue Aug 9 20:07:09 2022 -0400 - - zebra: use rib_add_multipath in rt_netlink.c - - The new route code path was using a combination of - both rib_add() and rib_add_multipath() let's clean - it up some to use rib_add_multipath() - - Signed-off-by: Donald Sharp - -Abstracted the calling of rib_add and rib_add_multipath in -netlink_route_change_read_unicast to just calling rib_add_multipath -one time. Since this commit was not backported the netlink_route_change_read_unicast -function had an additional rib_add that is not going through the new dplane -code to make a decision point about how to send up the message. - -Make it so the non multipath case uses the new decision point. - -Signed-off-by: Donald Sharp ---- - zebra/rt_netlink.c | 41 ++++++++++++++++++++++++----------------- - 1 file changed, 24 insertions(+), 17 deletions(-) - -diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c -index b2df2cd8a..76402561e 100644 ---- a/zebra/rt_netlink.c -+++ b/zebra/rt_netlink.c -@@ -909,37 +909,44 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h, - afi = AFI_IP6; - - if (h->nlmsg_type == RTM_NEWROUTE) { -+ struct route_entry *re; -+ struct nexthop_group *ng = NULL; -+ -+ re = XCALLOC(MTYPE_RE, sizeof(struct route_entry)); -+ re->type = proto; -+ re->distance = distance; -+ re->flags = flags; -+ re->metric = metric; -+ re->mtu = mtu; -+ re->vrf_id = vrf_id; -+ re->table = table; -+ re->uptime = monotime(NULL); -+ re->tag = tag; -+ re->nhe_id = nhe_id; -+ -+ if (!nhe_id) -+ ng = nexthop_group_new(); - - if (!tb[RTA_MULTIPATH]) { -- struct nexthop nh = {0}; -+ struct nexthop *nexthop, nh = {0}; - - if (!nhe_id) { - nh = parse_nexthop_unicast( - ns_id, rtm, tb, bh_type, index, prefsrc, - gate, afi, vrf_id); -+ -+ nexthop = nexthop_new(); -+ *nexthop = nh; -+ nexthop_group_add_sorted(ng, nexthop); - } -- rib_add(afi, SAFI_UNICAST, vrf_id, proto, 0, flags, &p, -- &src_p, &nh, nhe_id, table, metric, mtu, -- distance, tag); -+ dplane_rib_add_multipath(afi, SAFI_UNICAST, &p, &src_p, -+ re, ng, startup, ctx); - } else { - /* This is a multipath route */ -- struct route_entry *re; - struct nexthop_group *ng = NULL; - struct rtnexthop *rtnh = - (struct rtnexthop *)RTA_DATA(tb[RTA_MULTIPATH]); - -- re = XCALLOC(MTYPE_RE, sizeof(struct route_entry)); -- re->type = proto; -- re->distance = distance; -- re->flags = flags; -- re->metric = metric; -- re->mtu = mtu; -- re->vrf_id = vrf_id; -- re->table = table; -- re->uptime = monotime(NULL); -- re->tag = tag; -- re->nhe_id = nhe_id; -- - if (!nhe_id) { - uint8_t nhop_num; - --- -2.30.2 - diff --git a/src/sonic-frr/patch/0024-zebra-continue-fpm-read-when-we-decide-a-netlink-message-is-not-needed.patch b/src/sonic-frr/patch/0024-zebra-continue-fpm-read-when-we-decide-a-netlink-message-is-not-needed.patch deleted file mode 100644 index 6014fa3ea400..000000000000 --- a/src/sonic-frr/patch/0024-zebra-continue-fpm-read-when-we-decide-a-netlink-message-is-not-needed.patch +++ /dev/null @@ -1,31 +0,0 @@ -From c0275ab189d619c2f688a383e5e83183f02eaf6f Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Tue, 10 Jan 2023 08:36:50 -0500 -Subject: [PATCH] zebra: Continue fpm_read when we decide a netlink message is - not needed - -When FRR receives a netlink message that it decides to stop parsing -it returns a 0 ( instead of a -1 ). Just make the dplane continue -reading other data instead of aborting the read. - -Signed-off-by: Donald Sharp ---- - zebra/dplane_fpm_nl.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c -index a31e79212..9d9ea7283 100644 ---- a/zebra/dplane_fpm_nl.c -+++ b/zebra/dplane_fpm_nl.c -@@ -605,7 +610,10 @@ static void fpm_read(struct thread *t) - hdr, 0, false, ctx) != 1) { - dplane_ctx_fini(&ctx); - stream_pulldown(fnc->ibuf); -- return 0; -+ /* -+ * Let's continue to read other messages -+ * Even if we ignore this one. -+ */ - } - break; - default: diff --git a/src/sonic-frr/patch/0025-zebra-Send-nht-resolved-entry-up-to-concerned-protoc.patch b/src/sonic-frr/patch/0025-zebra-Send-nht-resolved-entry-up-to-concerned-protoc.patch deleted file mode 100644 index 402515c3c8d4..000000000000 --- a/src/sonic-frr/patch/0025-zebra-Send-nht-resolved-entry-up-to-concerned-protoc.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 49c14222cb0d3cb60b32340976b4e42e5644a563 Mon Sep 17 00:00:00 2001 -From: Stepan Blyschak -Date: Tue, 31 Jan 2023 10:24:30 +0000 -Subject: [PATCH] zebra: Send nht resolved entry up to concerned protocols in - all cases - -There existed the idea, from Volta, that a nexthop group would not have -the same nexthops installed -vs- what FRR actually sent down. The -dplane would notify you. - -With the addition of 06525c4 -the code was put behind a bit of a wall controlled the usage -of it. - -The flag ROUTE_ENTRY_USE_FIB_NHG flag was being used -to control which set was being sent up to concerned parties -in nexthop tracking. Put this flag behind the wall and -do not necessarily set it when we receive a data plane -notification about a route being installed or not. - -Fixes: #12706 -Signed-off-by: Donald Sharp ---- - zebra/zebra_rib.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c -index 50f19adcc..a8dbe4470 100644 ---- a/zebra/zebra_rib.c -+++ b/zebra/zebra_rib.c -@@ -1666,9 +1666,12 @@ no_nexthops: - ctxnhg->nexthop != NULL ? "" : " (empty)"); - - /* Set the flag about the dedicated fib list */ -- SET_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG); -- if (ctxnhg->nexthop) -- copy_nexthops(&(re->fib_ng.nexthop), ctxnhg->nexthop, NULL); -+ if (zrouter.asic_notification_nexthop_control) { -+ SET_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG); -+ if (ctxnhg->nexthop) -+ copy_nexthops(&(re->fib_ng.nexthop), ctxnhg->nexthop, -+ NULL); -+ } - - check_backups: - --- -2.30.2 - diff --git a/src/sonic-frr/patch/0027-bgpd-Ensure-FRR-has-enough-data-to-read-in-peek_for_as4_capability-and-bgp_open_option_parse.patch b/src/sonic-frr/patch/0027-bgpd-Ensure-FRR-has-enough-data-to-read-in-peek_for_as4_capability-and-bgp_open_option_parse.patch deleted file mode 100644 index fb6352b3fc9d..000000000000 --- a/src/sonic-frr/patch/0027-bgpd-Ensure-FRR-has-enough-data-to-read-in-peek_for_as4_capability-and-bgp_open_option_parse.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 3e46b43e3788f0f87bae56a86b54d412b4710286 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Fri, 30 Sep 2022 08:51:45 -0400 -Subject: [PATCH 1/2] bgpd: Ensure FRR has enough data to read 2 bytes in - peek_for_as4_capability - -In peek_for_as4_capability the code is checking that the -stream has at least 2 bytes to read ( the opt_type and the -opt_length ). However if BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer) -is configured then FRR is reading 3 bytes. Which is not good -since the packet could be badly formated. Ensure that -FRR has the appropriate data length to read the data. - -Signed-off-by: Donald Sharp ---- - bgpd/bgp_open.c | 27 +++++++++++++++++++++------ - 1 file changed, 21 insertions(+), 6 deletions(-) - -diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c -index 7248f034a5a..a760a7ca013 100644 ---- a/bgpd/bgp_open.c -+++ b/bgpd/bgp_open.c -@@ -1185,15 +1185,30 @@ as_t peek_for_as4_capability(struct peer *peer, uint16_t length) - uint8_t opt_type; - uint16_t opt_length; - -- /* Check the length. */ -- if (stream_get_getp(s) + 2 > end) -+ /* Ensure we can read the option type */ -+ if (stream_get_getp(s) + 1 > end) - goto end; - -- /* Fetch option type and length. */ -+ /* Fetch the option type */ - opt_type = stream_getc(s); -- opt_length = BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer) -- ? stream_getw(s) -- : stream_getc(s); -+ -+ /* -+ * Check the length and fetch the opt_length -+ * If the peer is BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer) -+ * then we do a getw which is 2 bytes. So we need to -+ * ensure that we can read that as well -+ */ -+ if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer)) { -+ if (stream_get_getp(s) + 2 > end) -+ goto end; -+ -+ opt_length = stream_getw(s); -+ } else { -+ if (stream_get_getp(s) + 1 > end) -+ goto end; -+ -+ opt_length = stream_getc(s); -+ } - - /* Option length check. */ - if (stream_get_getp(s) + opt_length > end) - -From 1117baca3c592877a4d8a13ed6a1d9bd83977487 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Fri, 30 Sep 2022 08:57:43 -0400 -Subject: [PATCH 2/2] bgpd: Ensure FRR has enough data to read 2 bytes in - bgp_open_option_parse - -In bgp_open_option_parse the code is checking that the -stream has at least 2 bytes to read ( the opt_type and -the opt_length). However if BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer) -is configured then FRR is reading 3 bytes. Which is not good -since the packet could be badly formateed. Ensure that -FRR has the appropriate data length to read the data. - -Signed-off-by: Donald Sharp ---- - bgpd/bgp_open.c | 35 ++++++++++++++++++++++++++++------- - 1 file changed, 28 insertions(+), 7 deletions(-) - -diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c -index a760a7ca013..d1667fac261 100644 ---- a/bgpd/bgp_open.c -+++ b/bgpd/bgp_open.c -@@ -1278,19 +1278,40 @@ int bgp_open_option_parse(struct peer *peer, uint16_t length, - uint8_t opt_type; - uint16_t opt_length; - -- /* Must have at least an OPEN option header */ -- if (STREAM_READABLE(s) < 2) { -+ /* -+ * Check that we can read the opt_type and fetch it -+ */ -+ if (STREAM_READABLE(s) < 1) { - zlog_info("%s Option length error", peer->host); - bgp_notify_send(peer, BGP_NOTIFY_OPEN_ERR, - BGP_NOTIFY_OPEN_MALFORMED_ATTR); - return -1; - } -- -- /* Fetch option type and length. */ - opt_type = stream_getc(s); -- opt_length = BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer) -- ? stream_getw(s) -- : stream_getc(s); -+ -+ /* -+ * Check the length of the stream to ensure that -+ * FRR can properly read the opt_length. Then read it -+ */ -+ if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer)) { -+ if (STREAM_READABLE(s) < 2) { -+ zlog_info("%s Option length error", peer->host); -+ bgp_notify_send(peer, BGP_NOTIFY_OPEN_ERR, -+ BGP_NOTIFY_OPEN_MALFORMED_ATTR); -+ return -1; -+ } -+ -+ opt_length = stream_getw(s); -+ } else { -+ if (STREAM_READABLE(s) < 1) { -+ zlog_info("%s Option length error", peer->host); -+ bgp_notify_send(peer, BGP_NOTIFY_OPEN_ERR, -+ BGP_NOTIFY_OPEN_MALFORMED_ATTR); -+ return -1; -+ } -+ -+ opt_length = stream_getc(s); -+ } - - /* Option length check. */ - if (STREAM_READABLE(s) < opt_length) { diff --git a/src/sonic-frr/patch/0028-bgpd-Ensure-that-bgp-open-message-stream-has-enough-data-to-read.patch b/src/sonic-frr/patch/0028-bgpd-Ensure-that-bgp-open-message-stream-has-enough-data-to-read.patch deleted file mode 100644 index 73fcfc30266b..000000000000 --- a/src/sonic-frr/patch/0028-bgpd-Ensure-that-bgp-open-message-stream-has-enough-data-to-read.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 766eec1b7accffe2c04a5c9ebb14e9f487bb9f78 Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Wed, 2 Nov 2022 13:24:48 -0400 -Subject: [PATCH] bgpd: Ensure that bgp open message stream has enough data to - read - -If a operator receives an invalid packet that is of insufficient size -then it is possible for BGP to assert during reading of the packet -instead of gracefully resetting the connection with the peer. - -Signed-off-by: Donald Sharp ---- - bgpd/bgp_packet.c | 19 +++++++++++++++++++ - 1 file changed, 19 insertions(+) - -diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c -index 769f9613da8..72d6a923175 100644 ---- a/bgpd/bgp_packet.c -+++ b/bgpd/bgp_packet.c -@@ -1386,8 +1386,27 @@ static int bgp_open_receive(struct peer *peer, bgp_size_t size) - || CHECK_FLAG(peer->flags, PEER_FLAG_EXTENDED_OPT_PARAMS)) { - uint8_t opttype; - -+ if (STREAM_READABLE(peer->curr) < 1) { -+ flog_err( -+ EC_BGP_PKT_OPEN, -+ "%s: stream does not have enough bytes for extended optional parameters", -+ peer->host); -+ bgp_notify_send(peer, BGP_NOTIFY_OPEN_ERR, -+ BGP_NOTIFY_OPEN_MALFORMED_ATTR); -+ return BGP_Stop; -+ } -+ - opttype = stream_getc(peer->curr); - if (opttype == BGP_OPEN_NON_EXT_OPT_TYPE_EXTENDED_LENGTH) { -+ if (STREAM_READABLE(peer->curr) < 2) { -+ flog_err( -+ EC_BGP_PKT_OPEN, -+ "%s: stream does not have enough bytes to read the extended optional parameters optlen", -+ peer->host); -+ bgp_notify_send(peer, BGP_NOTIFY_OPEN_ERR, -+ BGP_NOTIFY_OPEN_MALFORMED_ATTR); -+ return BGP_Stop; -+ } - optlen = stream_getw(peer->curr); - SET_FLAG(peer->sflags, - PEER_STATUS_EXT_OPT_PARAMS_LENGTH); diff --git a/src/sonic-frr/patch/0029-bgpd-Change-log-level-for-graceful-restart-events.patch b/src/sonic-frr/patch/0029-bgpd-Change-log-level-for-graceful-restart-events.patch deleted file mode 100644 index a3474ae64f71..000000000000 --- a/src/sonic-frr/patch/0029-bgpd-Change-log-level-for-graceful-restart-events.patch +++ /dev/null @@ -1,122 +0,0 @@ -From c423bce4db804c1d07d65ce3d06a9e62c4eceb2b Mon Sep 17 00:00:00 2001 -From: stormliang -Date: Mon, 19 Jun 2023 13:57:01 +0000 -Subject: [PATCH] change log level for graceful restart events - ---- - bgpd/bgp_fsm.c | 44 ++++++++++++++++++++------------------------ - bgpd/bgpd.c | 12 +++++------- - 2 files changed, 25 insertions(+), 31 deletions(-) - -diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c -index 672fa4512..e392cd6e1 100644 ---- a/bgpd/bgp_fsm.c -+++ b/bgpd/bgp_fsm.c -@@ -786,9 +786,9 @@ static int bgp_graceful_restart_timer_expire(struct thread *thread) - - peer = THREAD_ARG(thread); - -- if (bgp_debug_neighbor_events(peer)) { -- zlog_debug("%s graceful restart timer expired", peer->host); -- zlog_debug("%s graceful restart stalepath timer stopped", -+ if (peer) { -+ zlog_info("%s graceful restart timer expired", peer->host); -+ zlog_info("%s graceful restart stalepath timer stopped", - peer->host); - } - -@@ -852,8 +852,8 @@ static int bgp_graceful_stale_timer_expire(struct thread *thread) - - peer = THREAD_ARG(thread); - -- if (bgp_debug_neighbor_events(peer)) -- zlog_debug("%s graceful restart stalepath timer expired", -+ if (peer) -+ zlog_info("%s graceful restart stalepath timer expired", - peer->host); - - /* NSF delete stale route */ -@@ -1427,20 +1427,18 @@ int bgp_stop(struct peer *peer) - /* graceful restart */ - if (peer->t_gr_stale) { - BGP_TIMER_OFF(peer->t_gr_stale); -- if (bgp_debug_neighbor_events(peer)) -- zlog_debug( -- "%s graceful restart stalepath timer stopped", -- peer->host); -+ zlog_info( -+ "%s graceful restart stalepath timer stopped", -+ peer->host); - } - if (CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT)) { -- if (bgp_debug_neighbor_events(peer)) { -- zlog_debug( -- "%s graceful restart timer started for %d sec", -- peer->host, peer->v_gr_restart); -- zlog_debug( -- "%s graceful restart stalepath timer started for %d sec", -- peer->host, peer->bgp->stalepath_time); -- } -+ zlog_info( -+ "%s graceful restart timer started for %d sec", -+ peer->host, peer->v_gr_restart); -+ zlog_info( -+ "%s graceful restart stalepath timer started for %d sec", -+ peer->host, peer->bgp->stalepath_time); -+ - BGP_TIMER_ON(peer->t_gr_restart, - bgp_graceful_restart_timer_expire, - peer->v_gr_restart); -@@ -2205,18 +2203,16 @@ static int bgp_establish(struct peer *peer) - UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE); - if (peer->t_gr_stale) { - BGP_TIMER_OFF(peer->t_gr_stale); -- if (bgp_debug_neighbor_events(peer)) -- zlog_debug( -- "%s graceful restart stalepath timer stopped", -- peer->host); -+ zlog_info( -+ "%s graceful restart stalepath timer stopped", -+ peer->host); - } - } - - if (peer->t_gr_restart) { - BGP_TIMER_OFF(peer->t_gr_restart); -- if (bgp_debug_neighbor_events(peer)) -- zlog_debug("%s graceful restart timer stopped", -- peer->host); -+ zlog_info("%s graceful restart timer stopped", -+ peer->host); - } - - /* Reset uptime, turn on keepalives, send current table. */ -diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c -index 7e528b219..2fc471555 100644 ---- a/bgpd/bgpd.c -+++ b/bgpd/bgpd.c -@@ -2346,16 +2346,14 @@ void peer_nsf_stop(struct peer *peer) - - if (peer->t_gr_restart) { - BGP_TIMER_OFF(peer->t_gr_restart); -- if (bgp_debug_neighbor_events(peer)) -- zlog_debug("%s graceful restart timer stopped", -- peer->host); -+ zlog_info("%s graceful restart timer stopped", -+ peer->host); - } - if (peer->t_gr_stale) { - BGP_TIMER_OFF(peer->t_gr_stale); -- if (bgp_debug_neighbor_events(peer)) -- zlog_debug( -- "%s graceful restart stalepath timer stopped", -- peer->host); -+ zlog_info( -+ "%s graceful restart stalepath timer stopped", -+ peer->host); - } - bgp_clear_route_all(peer); - } --- -2.25.1 - diff --git a/src/sonic-frr/patch/0030-zebra-Static-routes-async-notification-do-not-need-t.patch b/src/sonic-frr/patch/0030-zebra-Static-routes-async-notification-do-not-need-t.patch deleted file mode 100644 index aab240f018ab..000000000000 --- a/src/sonic-frr/patch/0030-zebra-Static-routes-async-notification-do-not-need-t.patch +++ /dev/null @@ -1,46 +0,0 @@ -From cb89515f7751c23368bc8dcaf0bcf768a42a0c11 Mon Sep 17 00:00:00 2001 -From: dgsudharsan -Date: Wed, 28 Jun 2023 19:42:16 +0000 -Subject: [PATCH] zebra: Static routes async notification do not need this test - When using asic_offload with an asynchronous notification the - rib_route_match_ctx function is testing for distance and tag being correct - against the re. This is no longer necessary. - -Normal route notification for static routes is this(well really all routes): a) zebra dplane generates a ctx to send to the dplane for route install b) dplane installs it in the kernel -c) if the dplane_fpm_nl.c module is being used it installs it. d) The context's success code is set to it worked and passes the context back up to zebra for processing. -e) Zebra master receives this and checks the distance and tag are correct for static routes and accepts the route and marks it installed. - -If the operator is using a wait for install mechansim where the dplane is asynchronously sending the result back up at a future time and it is using the dplane_fpm_nl.c code where it uses the rt_netlink.c route parsing code, then there is no way to set distance as that we do not pass distance to the kernel. - -As such static routes were never being properly handled since the re and context would not match and the route would still be marked as queued. - -This code is historical in nature and is no longer necessary. rib_route_match_ctx is only ever used with dplane notifications. Additionally static routes are now handled more intelligently from staticd and the distance changes are held in staticd not zebra, thus it can be removed. - -diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c -index a8dbe4470..e021ed142 100644 ---- a/zebra/zebra_rib.c -+++ b/zebra/zebra_rib.c -@@ -1385,15 +1385,12 @@ static bool rib_route_match_ctx(const struct route_entry *re, - (re->instance == dplane_ctx_get_instance(ctx))) { - result = true; - -- /* We use an extra test for statics, and another for -- * kernel routes. -+ /* -+ * We use different tests for kernel and for -+ * connected routes. - */ -- if (re->type == ZEBRA_ROUTE_STATIC && -- (re->distance != dplane_ctx_get_distance(ctx) || -- re->tag != dplane_ctx_get_tag(ctx))) { -- result = false; -- } else if (re->type == ZEBRA_ROUTE_KERNEL && -- re->metric != dplane_ctx_get_metric(ctx)) { -+ if (re->type == ZEBRA_ROUTE_KERNEL && -+ re->metric != dplane_ctx_get_metric(ctx)) { - result = false; - } else if (re->type == ZEBRA_ROUTE_CONNECT) { - result = nexthop_group_equal_no_recurse( --- -2.17.1 - diff --git a/src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch b/src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch index b924b9a66fc4..3bf2fa42eae7 100644 --- a/src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch +++ b/src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch @@ -1,13 +1,11 @@ -From dfe0158344ea581370dd2dba8e4db189cf369147 Mon Sep 17 00:00:00 2001 +From 54ac159d360a8fc9e8fcb19d984e8230e16f6fc0 Mon Sep 17 00:00:00 2001 From: Syed Hasan Raza Naqvi Date: Wed, 4 May 2022 05:11:01 +0000 -Subject: [PATCH] Disable ipv6 src address test in pcep. Docker lo interface - doesn't have ipv6 enabled. Socket bind returns cannot assign requested - address. +Subject: [PATCH] From dfe0158344ea581370dd2dba8e4db189cf369147 Mon Sep 17 + 00:00:00 2001 Subject: [PATCH] Disable ipv6 src address test in pcep. Docker + lo interface doesn't have ipv6 enabled. Socket bind returns cannot assign + requested address. ---- - pceplib/test/pcep_socket_comm_test.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pceplib/test/pcep_socket_comm_test.c b/pceplib/test/pcep_socket_comm_test.c index 116531f12..8b71a5090 100644 @@ -23,5 +21,5 @@ index 116531f12..8b71a5090 100644 void pcep_socket_comm_test_teardown() -- -2.20.1 +2.17.1 diff --git a/src/sonic-frr/patch/cross-compile-changes.patch b/src/sonic-frr/patch/cross-compile-changes.patch index 621a8a66985d..2e618f059fc6 100644 --- a/src/sonic-frr/patch/cross-compile-changes.patch +++ b/src/sonic-frr/patch/cross-compile-changes.patch @@ -1,52 +1,47 @@ -From ece218405fe4c086017f2a4f2b2b4c86b9790db0 Mon Sep 17 00:00:00 2001 +From 611505531a96375000184fdf191d91bd021bd35f Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Wed, 6 Jul 2022 11:28:16 -0700 -Subject: [PATCH] Make changes to support crosscompilation in SONiC +Subject: [PATCH] From ece218405fe4c086017f2a4f2b2b4c86b9790db0 Mon Sep 17 + 00:00:00 2001 Subject: [PATCH] Make changes to support crosscompilation in + SONiC Signed-off-by: Saikrishna Arcot ---- - debian/frr-doc.info | 1 - - debian/frr.manpages | 16 ---------------- - debian/rules | 17 ++++++++++++----- - 3 files changed, 12 insertions(+), 22 deletions(-) - delete mode 100644 debian/frr-doc.info - delete mode 100644 debian/frr.manpages diff --git a/debian/frr-doc.info b/debian/frr-doc.info deleted file mode 100644 -index a83255a24..000000000 +index 1976365e3..000000000 --- a/debian/frr-doc.info +++ /dev/null @@ -1 +0,0 @@ --doc/user/_build/texinfo/frr.info +-build/doc/user/_build/texinfo/frr.info diff --git a/debian/frr.manpages b/debian/frr.manpages deleted file mode 100644 -index 5075fd763..000000000 +index 5a1b74cfc..000000000 --- a/debian/frr.manpages +++ /dev/null @@ -1,16 +0,0 @@ --doc/manpages/_build/man/frr-bgpd.8 --doc/manpages/_build/man/frr-eigrpd.8 --doc/manpages/_build/man/frr-fabricd.8 --doc/manpages/_build/man/frr-isisd.8 --doc/manpages/_build/man/frr-ldpd.8 --doc/manpages/_build/man/frr-nhrpd.8 --doc/manpages/_build/man/frr-ospf6d.8 --doc/manpages/_build/man/frr-ospfd.8 --doc/manpages/_build/man/frr-pimd.8 --doc/manpages/_build/man/frr-ripd.8 --doc/manpages/_build/man/frr-ripngd.8 --doc/manpages/_build/man/frr-watchfrr.8 --doc/manpages/_build/man/frr-zebra.8 --doc/manpages/_build/man/frr.1 --doc/manpages/_build/man/mtracebis.8 --doc/manpages/_build/man/vtysh.1 +-build/doc/manpages/_build/man/frr-bgpd.8 +-build/doc/manpages/_build/man/frr-eigrpd.8 +-build/doc/manpages/_build/man/frr-fabricd.8 +-build/doc/manpages/_build/man/frr-isisd.8 +-build/doc/manpages/_build/man/frr-ldpd.8 +-build/doc/manpages/_build/man/frr-nhrpd.8 +-build/doc/manpages/_build/man/frr-ospf6d.8 +-build/doc/manpages/_build/man/frr-ospfd.8 +-build/doc/manpages/_build/man/frr-pimd.8 +-build/doc/manpages/_build/man/frr-ripd.8 +-build/doc/manpages/_build/man/frr-ripngd.8 +-build/doc/manpages/_build/man/frr-watchfrr.8 +-build/doc/manpages/_build/man/frr-zebra.8 +-build/doc/manpages/_build/man/frr.1 +-build/doc/manpages/_build/man/mtracebis.8 +-build/doc/manpages/_build/man/vtysh.1 diff --git a/debian/rules b/debian/rules -index 0fa9c3a3b..6b005ea5f 100755 +index 43e5d7e61..aa13106fe 100755 --- a/debian/rules +++ b/debian/rules -@@ -27,10 +27,17 @@ else - CONF_LUA=--enable-scripting +@@ -33,10 +33,17 @@ else + CONF_PIM6=--disable-pim6d endif +DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) @@ -59,28 +54,26 @@ index 0fa9c3a3b..6b005ea5f 100755 +endif %: -- dh $@ -+ dh $@ --builddirectory=build +- dh $@ -Bbuild --with=sphinxdoc ++ dh $@ -Bbuild --with=sphinxdoc --builddirectory=build override_dh_auto_configure: $(shell dpkg-buildflags --export=sh); \ -@@ -67,12 +74,12 @@ override_dh_auto_configure: +@@ -74,10 +81,10 @@ override_dh_auto_configure: override_dh_auto_install: dh_auto_install - sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/frr-reload.py - sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/generate_support_bundle.py +- sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/frr_babeltrace.py +- sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/ospfclient.py + sed -e '1c #!$(shell which $PYTHON)' -i debian/tmp/usr/lib/frr/frr-reload.py + sed -e '1c #!$(shell which $PYTHON)' -i debian/tmp/usr/lib/frr/generate_support_bundle.py ++ sed -e '1c #!$(shell which $PYTHON)' -i debian/tmp/usr/lib/frr/frr_babeltrace.py ++ sed -e '1c #!$(shell which $PYTHON)' -i debian/tmp/usr/lib/frr/ospfclient.py # let dh_systemd_* and dh_installinit do their thing automatically -- cp tools/frr.service debian/frr.service -- cp tools/frrinit.sh debian/frr.init -+ cp build/tools/frr.service debian/frr.service -+ cp build/tools/frrinit.sh debian/frr.init - -rm -f debian/tmp/usr/lib/frr/frr - - # install config files + cp build/tools/frr.service debian/frr.service -- -2.25.1 +2.17.1 diff --git a/src/sonic-frr/patch/series b/src/sonic-frr/patch/series index 0de573f3a596..a0cdde792fac 100644 --- a/src/sonic-frr/patch/series +++ b/src/sonic-frr/patch/series @@ -1,31 +1,22 @@ -0001-Add-support-of-bgp-tcp-DSCP-value.patch -0002-Reduce-severity-of-Vty-connected-from-message.patch -0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch -0005-nexthops-compare-vrf-only-if-ip-type.patch -0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch -0007-Add-support-of-bgp-l3vni-evpn.patch -0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch +0001-Reduce-severity-of-Vty-connected-from-message.patch +0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch +0003-nexthops-compare-vrf-only-if-ip-type.patch +0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch +0005-Add-support-of-bgp-l3vni-evpn.patch +0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch Disable-ipv6-src-address-test-in-pceplib.patch cross-compile-changes.patch -0009-ignore-route-from-default-table.patch -0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch -0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch -0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch -0013-zebra-fix-dplane-fpm-nl-to-allow-for-fast-configuration.patch -0014-bgpd-Allow-network-XXX-to-work-with-bgp-suppress-fib.patch -0015-zebra-Return-statements-do-not-use-paranthesis.patch -0016-zebra-Add-zrouter.asic_notification_nexthop_control.patch -0017-zebra-Re-arrange-fpm_read-to-reduce-code-duplication.patch -0018-zebra-Add-dplane_ctx_get-set_flags.patch -0019-zebra-Rearrange-dplane_ctx_route_init.patch -0020-zebra-Add-ctx-to-netlink-message-parsing.patch -0021-zebra-Read-from-the-dplane_fpm_nl-a-route-update.patch -0022-zebra-Fix-code-because-missing-backport.patch -0023-Use-vrf_id-for-vrf-not-tabled_id.patch -0024-zebra-continue-fpm-read-when-we-decide-a-netlink-message-is-not-needed.patch -0025-zebra-Send-nht-resolved-entry-up-to-concerned-protoc.patch -0026-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch -0027-bgpd-Ensure-FRR-has-enough-data-to-read-in-peek_for_as4_capability-and-bgp_open_option_parse.patch -0028-bgpd-Ensure-that-bgp-open-message-stream-has-enough-data-to-read.patch -0029-bgpd-Change-log-level-for-graceful-restart-events.patch -0030-zebra-Static-routes-async-notification-do-not-need-t.patch +0007-ignore-route-from-default-table.patch +0008-Use-vrf_id-for-vrf-not-tabled_id.patch +0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch +0010-bgpd-Change-log-level-for-graceful-restart-events.patch +0011-zebra-Static-routes-async-notification-do-not-need-t.patch +0012-zebra-Rename-vrf_lookup_by_tableid-to-zebra_vrf_look.patch +0013-zebra-Move-protodown_r_bit-to-a-better-spot.patch +0014-zebra-Remove-unused-dplane_intf_delete.patch +0015-zebra-Remove-unused-add-variable.patch +0016-zebra-Remove-duplicate-function-for-netlink-interfac.patch +0017-zebra-Add-code-to-get-set-interface-to-pass-up-from-.patch +0018-zebra-Use-zebra-dplane-for-RTM-link-and-addr.patch +0019-zebra-Abstract-dplane_ctx_route_init-to-init-route-w.patch +0020-zebra-Fix-crash-when-dplane_fpm_nl-fails-to-process-.patch From d9393b014940f4ba5cf2d0b11bf064ade9fdb5f6 Mon Sep 17 00:00:00 2001 From: shdasari <53248666+shdasari@users.noreply.github.com> Date: Mon, 7 Aug 2023 22:18:18 +0530 Subject: [PATCH 107/145] [radius]: Use execl instead of popen in RADIUS NSS code to fix vulnerability. (#15512) Why I did it #15284 fixes a case of shell escape exploit for TACACS+. This applies to RADIUS as well. RADIUS creates an unconfirmed user locally on the switch while attempting authentication. popen() is used to execute useradd,usermod and userdel commands. This exposes a vulnerability where a tactically designed username (which could contain explicit linux commands) can lead to getting executed as root. An example of such a username could be "asd";echo>remoteRCE2;#". This leads to remoteRCE2 getting created in "/". How I did it All calls to popen() used to execute useradd, usermod and userdel are replaced with fork()/execl(). How to verify it Prior to the fix, following is the behavior: [s@i vm] ssh "asd";echo>remoteRCE2;#"@1.1.1.1 asd";echo>remoteRCE2;#@1.1.1.1's password: Permission denied, please try again. On the SONiC switch, root@sonic:/# ls accton_as7816_monitor.log home lib64 remoteRCE2 sys bin host libx32 root tmp boot initrd.img media run usr cache.tgz initrd.img.old mnt sbin var dev lib opt sonic vmlinuz etc lib32 proc srv vmlinuz.old root@sonic:/# ls -l With the fix: [s@i vm] ssh "asd";echo>remoteRCE2;#"@1.1.1.1 asd";echo>remoteRCE2;#@1.1.1.1's password: Permission denied, please try again. root@sonic:/# ls accton_as7816_monitor.log etc lib mnt sbin usr bin home lib32 opt sonic var boot host lib64 proc srv vmlinuz cache.tgz initrd.img libx32 root sys vmlinuz.old dev initrd.img.old media run tmp Verified that RADIUS authentication works as expected for valid users as well. --- .../nss/libnss-radius/nss_radius_common.c | 214 ++++++++++++------ 1 file changed, 143 insertions(+), 71 deletions(-) diff --git a/src/radius/nss/libnss-radius/nss_radius_common.c b/src/radius/nss/libnss-radius/nss_radius_common.c index 652d04ae5c7b..bd828ffc8036 100644 --- a/src/radius/nss/libnss-radius/nss_radius_common.c +++ b/src/radius/nss/libnss-radius/nss_radius_common.c @@ -25,6 +25,7 @@ The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. #include #include #include +#include #include "nss_radius_common.h" @@ -167,6 +168,124 @@ static void init_rnm(RADIUS_NSS_CONF_B * conf) { } +static int user_add(const char* name, char* gid, char* sec_grp, char* gecos, + char* home, char* shell, const char* unconfirmed_user, int many_to_one) { + pid_t pid, w; + int status = 0; + int wstatus; + char cmd[64]; + + snprintf(cmd, 63, "%s", USERADD); + + pid = fork(); + + if(pid > 0) { + do { + w = waitpid(pid, &wstatus, WUNTRACED | WCONTINUED); + if (w == -1) + return -1; + } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus)); + if WIFEXITED(wstatus) + return WEXITSTATUS(wstatus); + else + return -1; + + // Child + + } else if(pid == 0) { + + if (many_to_one) + execl(cmd, cmd, "-g", gid, "-G", sec_grp, "-c", gecos, "-m", "-s", shell, name, NULL); + else + execl(cmd, cmd, "-U", "-G", sec_grp, "-c", unconfirmed_user, "-d", home, "-m", "-s", shell, name, NULL); + syslog(LOG_ERR, "exec of %s failed with errno=%d", cmd, errno); + return -1; + + // Error + } else { + fprintf(stderr, "error forking the child\n"); + return -1; + } + + return status; +} + +static int user_del(const char* name) { + pid_t pid, w; + int status = 0; + int wstatus; + char cmd[64]; + + snprintf(cmd, 63, "%s", USERDEL); + + pid = fork(); + + if(pid > 0) { + do { + w = waitpid(pid, &wstatus, WUNTRACED | WCONTINUED); + if (w == -1) + return -1; + } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus)); + if WIFEXITED(wstatus) + return WEXITSTATUS(wstatus); + else + return -1; + + // Child + + } else if(pid == 0) { + + execl(cmd, cmd, "-r", name, NULL); + syslog(LOG_ERR, "exec of %s failed with errno=%d", cmd, errno); + return -1; + + // Error + } else { + fprintf(stderr, "error forking the child\n"); + return -1; + } + + return status; +} + +static int user_mod(const char* name, char* sec_grp) { + pid_t pid, w; + int status = 0; + int wstatus; + char cmd[64]; + + snprintf(cmd, 63, "%s", USERMOD); + + pid = fork(); + + if(pid > 0) { + do { + w = waitpid(pid, &wstatus, WUNTRACED | WCONTINUED); + if (w == -1) + return -1; + } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus)); + if WIFEXITED(wstatus) + return WEXITSTATUS(wstatus); + else + return -1; + + // Child + + } else if(pid == 0) { + + execl(cmd, cmd, "-G", sec_grp, "-c", name, name, NULL); + syslog(LOG_ERR, "exec of %s failed with errno=%d", cmd, errno); + return -1; + + // Error + } else { + fprintf(stderr, "error forking the child\n"); + return -1; + } + + return status; +} + int parse_nss_config(RADIUS_NSS_CONF_B * conf, char * prog, char * file_buf, int file_buf_sz, int * errnop, int * plockfd) { @@ -379,22 +498,6 @@ int unparse_nss_config(RADIUS_NSS_CONF_B * conf, int * errnop, int * plockfd) { return 0; } -static int invoke_popen(RADIUS_NSS_CONF_B * conf, char * cmd) { - FILE * fp; - int status = 0; - - if (conf->debug) - syslog(LOG_DEBUG, "%s:%s", conf->prog, cmd); - - if (((fp = popen(cmd, "r")) == NULL) || (pclose(fp) == -1)) { - syslog(LOG_ERR, "%s: %s: popen()/pclose() failed %p, errno=%d", - conf->prog, cmd, fp, errno); - status = errno; - } - - return status; -} - static int radius_getpwnam_r_cleanup(int status, FILE * fp) { if (fp) fclose(fp); @@ -434,10 +537,8 @@ static int radius_update_user_cleanup(int status) { int radius_update_user(RADIUS_NSS_CONF_B * conf, const char * user, int mpl) { char buf[BUFLEN]; - char usermod[4096]; struct passwd pw, *result = NULL; RADIUS_NSS_MPL * rnm = NULL; - int written = 0; int status; /* Verify uid is not in the reserved range (<=1000). @@ -466,82 +567,53 @@ int radius_update_user(RADIUS_NSS_CONF_B * conf, const char * user, int mpl) { if (conf->trace) dump_rnm(mpl, rnm, "update"); - written = snprintf(usermod, sizeof(usermod), - "%s -G %s -c \"%s\" \"%s\"", USERMOD, rnm->groups, user, user); - - if (written >= sizeof(usermod)) { - syslog(LOG_ERR, - "%s: truncated usermod cmd. Skipping:\"%s\"\n", conf->prog, usermod); - return radius_update_user_cleanup(STATUS_E2BIG); + if(0 != user_mod(user, rnm->groups)) { + syslog(LOG_ERR, "%s: %s %s failed", conf->prog, USERMOD, user); + return -1; } - - return radius_update_user_cleanup(invoke_popen(conf, usermod)); -} - -static int radius_create_user_cleanup(int status) { - return status; + return 0; } int radius_create_user(RADIUS_NSS_CONF_B * conf, const char * user, int mpl, int unconfirmed) { - char buf[BUFLEN]; - char useradd[4096]; + char buf[BUFLEN] = {0}; RADIUS_NSS_MPL * rnm = &((conf->rnm)[mpl-1]); - int written = 0; if (conf->trace) dump_rnm(mpl, rnm, "create"); + if(strlen(user) > 32) { + syslog(LOG_ERR, "%s: Username too long", conf->prog); + return -1; + } - if (conf->many_to_one) { + syslog(LOG_INFO, "%s: Creating user \"%s\"", conf->prog, user); - written = snprintf(useradd, sizeof(useradd), - "%s -g %d -G %s -c \"%s\" -m -s %s \"%s\"", - USERADD, rnm->gid, rnm->groups, rnm->gecos, rnm->shell, user); + char sgid[10] = {0}; + char home[64] = {0}; + snprintf(sgid, 10, "%d", rnm->gid); + snprintf(home, 63, "/home/%s", user); - } else { + snprintf(buf, sizeof(buf), "Unconfirmed-%ld", time(NULL)); - snprintf(buf, sizeof(buf), "Unconfirmed-%ld", time(NULL)); - written = snprintf(useradd, sizeof(useradd), - "%s -U -G %s -c \"%s\" -d \"/home/%s\" -m -s %s \"%s\"", - USERADD, rnm->groups, unconfirmed ? buf : user, user, - rnm->shell, user); - - } + if(0 != user_add(user, sgid, rnm->groups, rnm->gecos, home, rnm->shell, unconfirmed ? buf : user, conf->many_to_one)) { + syslog(LOG_ERR, "%s: %s %s failed", conf->prog, USERADD, user); - if (written >= sizeof(useradd)) { - syslog(LOG_ERR, - "%s: truncated useradd cmd. Skipping:\"%s\"\n", conf->prog, useradd); - return radius_create_user_cleanup(STATUS_E2BIG); + return -1; } - - syslog(LOG_INFO, "%s: Creating user \"%s\"", conf->prog, user); - - return radius_create_user_cleanup(invoke_popen(conf, useradd)); -} - -static int radius_delete_user_cleanup(int status) { - return status; + return 0; } int radius_delete_user(RADIUS_NSS_CONF_B * conf, const char * user) { - char buf[BUFLEN]; - char userdel[4096]; - int written = 0; - - written = snprintf(userdel, sizeof(userdel), "%s -r \"%s\"", USERDEL, user); - - if (written >= sizeof(userdel)) { - syslog(LOG_ERR, - "%s: truncated userdel cmd. Skipping:\"%s\"\n", conf->prog, userdel); - return radius_delete_user_cleanup(STATUS_E2BIG); - } - syslog(LOG_INFO, "%s: Deleting user \"%s\"", conf->prog, user); + if(0 != user_del(user)) { + syslog(LOG_ERR, "%s: %s %s failed", conf->prog, USERDEL, user); - return radius_delete_user_cleanup(invoke_popen(conf, userdel)); + return -1; + } + return 0; } int radius_clear_unconfirmed_users_cleanup(int status, FILE * fp) { From 46817036fd871af4c424c491a9ce6ca14563f8f7 Mon Sep 17 00:00:00 2001 From: Arvindsrinivasan Lakshmi Narasimhan <55814491+arlakshm@users.noreply.github.com> Date: Mon, 7 Aug 2023 09:52:48 -0700 Subject: [PATCH 108/145] [chassis]: removed dependency for bgp and swss for chassis supervisor (#15734) Fixes #15667 and #13293 Work item tracking Microsoft ADO 24472854: How I did it On chassis supervisor bgp feature is disabled in hostcfgd. The dependency between swss and bgp causes the bgp containers to start even though the feature is disabled. How to verify it Tests on chassis supervisor and LC --- files/scripts/swss.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 86c2bae2ddb8..f79e7ed13731 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -318,6 +318,16 @@ function check_macsec() fi } +function check_add_bgp_dependency() +{ + if ! is_chassis_supervisor; then + if [ "$DEV" ]; then + DEPENDENT="${DEPENDENT} bgp@${DEV}" + else + DEPENDENT="${DEPENDENT} bgp" + fi + fi +} function check_ports_present() { PORT_CONFIG_INI=/usr/share/sonic/device/$PLATFORM/$HWSKU/$DEV/port_config.ini @@ -353,11 +363,9 @@ fi if [ "$DEV" ]; then NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace SONIC_DB_CLI="sonic-db-cli -n $NET_NS" - DEPENDENT+=" bgp@${DEV}" else NET_NS="" SONIC_DB_CLI="sonic-db-cli" - DEPENDENT+=" bgp" fi PLATFORM=`$SONIC_DB_CLI CONFIG_DB hget 'DEVICE_METADATA|localhost' platform` @@ -365,7 +373,7 @@ HWSKU=`$SONIC_DB_CLI CONFIG_DB hget 'DEVICE_METADATA|localhost' hwsku` check_peer_gbsyncd check_macsec - +check_add_bgp_dependency check_ports_present PORTS_PRESENT=$? From 345b5e20002c02c6402ea55910a776332a73f27f Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Tue, 8 Aug 2023 15:32:55 +0800 Subject: [PATCH 109/145] [submodule] Update submodule sonic-swss to the latest HEAD automatically (#16073) #### Why I did it src/sonic-swss ``` * 23cb2e50 - (HEAD -> master, origin/master, origin/HEAD) [ASAN] Fix Indirect Mem Leaks in Orchagent (#2869) (10 hours ago) [Vivek] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index d54c767c6d92..23cb2e50a23b 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit d54c767c6d9210a7c3e88e922a21c291b5a42276 +Subproject commit 23cb2e50a23b8aa110208d669eb9b35ea7a448b6 From 803c71c86ac1a583314450b082d17703bf36cc8e Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Tue, 8 Aug 2023 14:47:33 -0700 Subject: [PATCH 110/145] [SNMP][IPv6]: Fix to use link local IPv6 address as snmp agentAddress (#16013) #### Why I did it fixes: https://github.com/sonic-net/sonic-buildimage/issues/16001 Caused by: https://github.com/sonic-net/sonic-buildimage/pull/15487 The above PR introduced change to use Management and Loopback Ipv4 and ipv6 addresses as snmpagent address in snmpd.conf file. With this change, if Link local IP address is configured as management or Loopback IPv6 address, then snmpd tries to open socket on that ipv6 address and fails with the below error: ``` Error opening specified endpoint "udp6:[fe80::5054:ff:fe6f:16f0]:161" Server Exiting with code 1 ``` From RFC4007, if we need to specify non-global ipv6 address without ambiguity, we need to use zone id along with the ipv6 address:
% Reference: https://datatracker.ietf.org/doc/html/rfc4007 ##### Work item tracking - Microsoft ADO **(number only)**: #### How I did it Modify snmpd.conf file to use the %zone_id representation for ipv6 address. #### How to verify it In VS testbed, modify config_db to use link local ipv6 address as management address: "MGMT_INTERFACE": { "eth0|10.250.0.101/24": { "forced_mgmt_routes": [ "172.17.0.1/24" ], "gwaddr": "10.250.0.1" }, "eth0|fe80::5054:ff:fe6f:16f0/64": { "gwaddr": "fe80::1" } }, Execute config_reload after the above change. snmpd comes up and check if snmpd is listening on ipv4 and ipv6 addresses: ``` admin@vlab-01:~$ sudo netstat -tulnp | grep 161 tcp 0 0 127.0.0.1:3161 0.0.0.0:* LISTEN 274060/snmpd udp 0 0 10.1.0.32:161 0.0.0.0:* 274060/snmpd udp 0 0 10.250.0.101:161 0.0.0.0:* 274060/snmpd udp6 0 0 fc00:1::32:161 :::* 274060/snmpd udp6 0 0 fe80::5054:ff:fe6f::161 :::* 274060/snmpd -- Link local admin@vlab-01:~$ sudo ifconfig eth0 eth0: flags=4163 mtu 1500 inet 10.250.0.101 netmask 255.255.255.0 broadcast 10.250.0.255 inet6 fe80::5054:ff:fe6f:16f0 prefixlen 64 scopeid 0x20 ether 52:54:00:6f:16:f0 txqueuelen 1000 (Ethernet) RX packets 36384 bytes 22878123 (21.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 261265 bytes 46585948 (44.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 admin@vlab-01:~$ docker exec -it snmp snmpget -v2c -c public fe80::5054:ff:fe6f:16f0 1.3.6.1.2.1.1.1.0 iso.3.6.1.2.1.1.1.0 = STRING: "SONiC Software Version: SONiC.master.327516-04a6031b2 - HwSku: Force10-S6000 - Distribution: Debian 11.7 - Kernel: 5.10.0-18-2-amd64" ``` Logs from snmpd: ``` Turning on AgentX master support. NET-SNMP version 5.9 Connection from UDP/IPv6: [fe80::5054:ff:fe6f:16f0%eth0]:44308 ``` Ran test_snmp_loopback test to check if loopback ipv4 and ipv6 works: ``` ./run_tests.sh -n vms-kvm-t0 -d vlab-01 -c snmp/test_snmp_loopback.py -f vtestbed.yaml -i ../ansible/veos_vtb -e "--skip_sanity --disable_loganalyzer" -u === Running tests in groups === Running: pytest snmp/test_snmp_loopback.py --inventory ../ansible/veos_vtb --host-pattern vlab-01 --testbed vms-kvm-t0 --testbed_file vtestbed.yaml --log-cli-level warning --log-file-level debug --kube_master unset --showlocals --assert plain --show-capture no -rav --allow_recover --ignore=ptftests --ignore=acstests --ignore=saitests --ignore=scripts --ignore=k8s --ignore=sai_qualify --junit-xml=logs/tr.xml --log-file=logs/test.log --skip_sanity --disable_loganalyzer .. snmp/test_snmp_loopback.py::test_snmp_loopback[vlab-01] PASSED ``` #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [x] 202012 - [x] 202106 - [x] 202111 - [x] 202205 - [x] 202211 - [x] 202305 #### Tested branch (Please provide the tested image version) - [ ] - [ ] #### Description for the changelog #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- dockers/docker-snmp/snmpd.conf.j2 | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/dockers/docker-snmp/snmpd.conf.j2 b/dockers/docker-snmp/snmpd.conf.j2 index cf7f8f385138..182056b636e1 100644 --- a/dockers/docker-snmp/snmpd.conf.j2 +++ b/dockers/docker-snmp/snmpd.conf.j2 @@ -30,16 +30,27 @@ agentAddress {{ protocol(agentip) }}:[{{ agentip }}]{% if port %}:{{ port }}{% e {% endfor %} {% elif NAMESPACE_COUNT is not defined or NAMESPACE_COUNT|int <= 1 %} {% if MGMT_INTERFACE is defined %} -{% for if, ip in MGMT_INTERFACE %} -{% set agentip = ip.split('/')[0] %} -agentAddress {{ protocol(agentip) }}:[{{ agentip }}]:161 +{% for intf, ip in MGMT_INTERFACE %} +{% set agentip = ip.split('/')[0]|lower %} +{% set zoneid = '' %} +# Use interface as zoneid for link local ipv6 +{% if agentip.startswith('fe80') %} +{% set zoneid = '%' + intf %} +{% endif %} +agentAddress {{ protocol(agentip) }}:[{{ agentip }}{{ zoneid }}]:161 {% endfor %} {% endif %} {% if LOOPBACK_INTERFACE is defined %} {% for lo in LOOPBACK_INTERFACE %} {% if lo | length == 2 %} -{% set agentip = lo[1].split('/')[0] %} -agentAddress {{ protocol(agentip) }}:[{{ agentip }}]:161 +{% set intf = lo[0] %} +{% set agentip = lo[1].split('/')[0]|lower %} +{% set zoneid = '' %} +# Use interface as zoneid for link local ipv6 +{% if agentip.startswith('fe80') %} +{% set zoneid = '%' + intf %} +{% endif %} +agentAddress {{ protocol(agentip) }}:[{{ agentip }}{{ zoneid }}]:161 {% endif %} {% endfor %} {% endif %} From 8524e563d3b4339826b9d8906b158a6a55e41d98 Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Wed, 9 Aug 2023 03:29:36 +0530 Subject: [PATCH 111/145] PDDF: Supporting extra system fans in the common PDDF drivers (#15956) --- .../i2c/modules/fan/driver/pddf_fan_api.c | 36 ++++++++++ .../i2c/modules/fan/driver/pddf_fan_driver.c | 72 +++++++++++++++++++ .../i2c/modules/include/pddf_fan_driver.h | 24 +++++++ 3 files changed, 132 insertions(+) diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c index 66bd2169c1ee..4b95060e3c80 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c @@ -106,6 +106,18 @@ void get_fan_extra_default_sysfs(int idx, char *str) break; case FAN12_PRESENT: strcpy(str, "fan12_status"); + break; + case FAN13_PRESENT: + strcpy(str, "fan13_status"); + break; + case FAN14_PRESENT: + strcpy(str, "fan14_status"); + break; + case FAN15_PRESENT: + strcpy(str, "fan15_status"); + break; + case FAN16_PRESENT: + strcpy(str, "fan16_status"); break; default: break; @@ -242,6 +254,10 @@ ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char * case FAN10_PRESENT: case FAN11_PRESENT: case FAN12_PRESENT: + case FAN13_PRESENT: + case FAN14_PRESENT: + case FAN15_PRESENT: + case FAN16_PRESENT: case FAN1_DIRECTION: case FAN2_DIRECTION: case FAN3_DIRECTION: @@ -254,6 +270,10 @@ ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char * case FAN10_DIRECTION: case FAN11_DIRECTION: case FAN12_DIRECTION: + case FAN13_DIRECTION: + case FAN14_DIRECTION: + case FAN15_DIRECTION: + case FAN16_DIRECTION: case FAN1_INPUT: case FAN2_INPUT: case FAN3_INPUT: @@ -266,6 +286,10 @@ ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char * case FAN10_INPUT: case FAN11_INPUT: case FAN12_INPUT: + case FAN13_INPUT: + case FAN14_INPUT: + case FAN15_INPUT: + case FAN16_INPUT: case FAN1_PWM: case FAN2_PWM: case FAN3_PWM: @@ -278,6 +302,10 @@ ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char * case FAN10_PWM: case FAN11_PWM: case FAN12_PWM: + case FAN13_PWM: + case FAN14_PWM: + case FAN15_PWM: + case FAN16_PWM: case FAN1_FAULT: case FAN2_FAULT: case FAN3_FAULT: @@ -290,6 +318,10 @@ ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char * case FAN10_FAULT: case FAN11_FAULT: case FAN12_FAULT: + case FAN13_FAULT: + case FAN14_FAULT: + case FAN15_FAULT: + case FAN16_FAULT: case FAN_DUTY_CYCLE: status = attr_info->val.intval; break; @@ -359,6 +391,10 @@ ssize_t fan_store_default(struct device *dev, struct device_attribute *da, const case FAN10_PWM: case FAN11_PWM: case FAN12_PWM: + case FAN13_PWM: + case FAN14_PWM: + case FAN15_PWM: + case FAN16_PWM: ret = kstrtoint(buf, 10, &val); if (ret) { diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c index 6c72b4adc4a3..cf83724d1f97 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c @@ -77,6 +77,14 @@ FAN_SYSFS_ATTR_DATA data_fan11_present = {FAN11_PRESENT, S_IRUGO, fan_show_defau EXPORT_SYMBOL(data_fan11_present); FAN_SYSFS_ATTR_DATA data_fan12_present = {FAN12_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; EXPORT_SYMBOL(data_fan12_present); +FAN_SYSFS_ATTR_DATA data_fan13_present = {FAN13_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan13_present); +FAN_SYSFS_ATTR_DATA data_fan14_present = {FAN14_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan14_present); +FAN_SYSFS_ATTR_DATA data_fan15_present = {FAN15_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan15_present); +FAN_SYSFS_ATTR_DATA data_fan16_present = {FAN16_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan16_present); FAN_SYSFS_ATTR_DATA data_fan1_direction = {FAN1_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; @@ -103,6 +111,14 @@ FAN_SYSFS_ATTR_DATA data_fan11_direction = {FAN11_DIRECTION, S_IRUGO, fan_show_d EXPORT_SYMBOL(data_fan11_direction); FAN_SYSFS_ATTR_DATA data_fan12_direction = {FAN12_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; EXPORT_SYMBOL(data_fan12_direction); +FAN_SYSFS_ATTR_DATA data_fan13_direction = {FAN13_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan13_direction); +FAN_SYSFS_ATTR_DATA data_fan14_direction = {FAN14_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan14_direction); +FAN_SYSFS_ATTR_DATA data_fan15_direction = {FAN15_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan15_direction); +FAN_SYSFS_ATTR_DATA data_fan16_direction = {FAN16_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan16_direction); FAN_SYSFS_ATTR_DATA data_fan1_input = {FAN1_INPUT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; @@ -129,6 +145,14 @@ FAN_SYSFS_ATTR_DATA data_fan11_input = {FAN11_INPUT, S_IRUGO, fan_show_default, EXPORT_SYMBOL(data_fan11_input); FAN_SYSFS_ATTR_DATA data_fan12_input = {FAN12_INPUT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; EXPORT_SYMBOL(data_fan12_input); +FAN_SYSFS_ATTR_DATA data_fan13_input = {FAN13_INPUT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan13_input); +FAN_SYSFS_ATTR_DATA data_fan14_input = {FAN14_INPUT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan14_input); +FAN_SYSFS_ATTR_DATA data_fan15_input = {FAN15_INPUT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan15_input); +FAN_SYSFS_ATTR_DATA data_fan16_input = {FAN16_INPUT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan16_input); FAN_SYSFS_ATTR_DATA data_fan1_pwm = {FAN1_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; @@ -155,6 +179,14 @@ FAN_SYSFS_ATTR_DATA data_fan11_pwm = {FAN11_PWM, S_IRUGO | S_IWUSR, fan_show_def EXPORT_SYMBOL(data_fan11_pwm); FAN_SYSFS_ATTR_DATA data_fan12_pwm = {FAN12_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; EXPORT_SYMBOL(data_fan12_pwm); +FAN_SYSFS_ATTR_DATA data_fan13_pwm = {FAN13_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan13_pwm); +FAN_SYSFS_ATTR_DATA data_fan14_pwm = {FAN14_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan14_pwm); +FAN_SYSFS_ATTR_DATA data_fan15_pwm = {FAN15_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan15_pwm); +FAN_SYSFS_ATTR_DATA data_fan16_pwm = {FAN16_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan16_pwm); FAN_SYSFS_ATTR_DATA data_fan1_fault = {FAN1_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; @@ -181,6 +213,14 @@ FAN_SYSFS_ATTR_DATA data_fan11_fault = {FAN11_FAULT, S_IRUGO, fan_show_default, EXPORT_SYMBOL(data_fan11_fault); FAN_SYSFS_ATTR_DATA data_fan12_fault = {FAN12_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; EXPORT_SYMBOL(data_fan12_fault); +FAN_SYSFS_ATTR_DATA data_fan13_fault = {FAN13_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan13_fault); +FAN_SYSFS_ATTR_DATA data_fan14_fault = {FAN14_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan14_fault); +FAN_SYSFS_ATTR_DATA data_fan15_fault = {FAN15_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan15_fault); +FAN_SYSFS_ATTR_DATA data_fan16_fault = {FAN16_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan16_fault); /* Derived attributes like status (should be derived from 'presence' and 'speed'/'fault' attributes) etc */ FAN_SYSFS_ATTR_DATA data_fan1_status = {FAN1_STATUS, S_IRUGO, fan_show_status, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; @@ -207,6 +247,14 @@ FAN_SYSFS_ATTR_DATA data_fan11_status = {FAN11_STATUS, S_IRUGO, fan_show_status, EXPORT_SYMBOL(data_fan11_status); FAN_SYSFS_ATTR_DATA data_fan12_status = {FAN12_STATUS, S_IRUGO, fan_show_status, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; EXPORT_SYMBOL(data_fan12_status); +FAN_SYSFS_ATTR_DATA data_fan13_status = {FAN13_STATUS, S_IRUGO, fan_show_status, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan13_status); +FAN_SYSFS_ATTR_DATA data_fan14_status = {FAN14_STATUS, S_IRUGO, fan_show_status, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan14_status); +FAN_SYSFS_ATTR_DATA data_fan15_status = {FAN15_STATUS, S_IRUGO, fan_show_status, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan15_status); +FAN_SYSFS_ATTR_DATA data_fan16_status = {FAN16_STATUS, S_IRUGO, fan_show_status, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan16_status); /* Some generic fan attributes */ FAN_SYSFS_ATTR_DATA data_fan_duty_cycle = {FAN_DUTY_CYCLE, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_dc_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_dc_default, NULL, NULL}; @@ -238,6 +286,10 @@ FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= { "fan10_present", &data_fan10_present}, { "fan11_present", &data_fan11_present}, { "fan12_present", &data_fan12_present}, + { "fan13_present", &data_fan13_present}, + { "fan14_present", &data_fan14_present}, + { "fan15_present", &data_fan15_present}, + { "fan16_present", &data_fan16_present}, { "fan1_direction", &data_fan1_direction}, { "fan2_direction", &data_fan2_direction}, { "fan3_direction", &data_fan3_direction}, @@ -250,6 +302,10 @@ FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= { "fan10_direction", &data_fan10_direction}, { "fan11_direction", &data_fan11_direction}, { "fan12_direction", &data_fan12_direction}, + { "fan13_direction", &data_fan13_direction}, + { "fan14_direction", &data_fan14_direction}, + { "fan15_direction", &data_fan15_direction}, + { "fan16_direction", &data_fan16_direction}, { "fan1_input", &data_fan1_input}, { "fan2_input", &data_fan2_input}, { "fan3_input", &data_fan3_input}, @@ -262,6 +318,10 @@ FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= { "fan10_input", &data_fan10_input}, { "fan11_input", &data_fan11_input}, { "fan12_input", &data_fan12_input}, + { "fan13_input", &data_fan13_input}, + { "fan14_input", &data_fan14_input}, + { "fan15_input", &data_fan15_input}, + { "fan16_input", &data_fan16_input}, { "fan1_pwm", &data_fan1_pwm}, { "fan2_pwm", &data_fan2_pwm}, { "fan3_pwm", &data_fan3_pwm}, @@ -274,6 +334,10 @@ FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= { "fan10_pwm", &data_fan10_pwm}, { "fan11_pwm", &data_fan11_pwm}, { "fan12_pwm", &data_fan12_pwm}, + { "fan13_pwm", &data_fan13_pwm}, + { "fan14_pwm", &data_fan14_pwm}, + { "fan15_pwm", &data_fan15_pwm}, + { "fan16_pwm", &data_fan16_pwm}, { "fan1_fault", &data_fan1_fault}, { "fan2_fault", &data_fan2_fault}, { "fan3_fault", &data_fan3_fault}, @@ -286,6 +350,10 @@ FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= { "fan10_fault", &data_fan10_fault}, { "fan11_fault", &data_fan11_fault}, { "fan12_fault", &data_fan12_fault}, + { "fan13_fault", &data_fan13_fault}, + { "fan14_fault", &data_fan14_fault}, + { "fan15_fault", &data_fan15_fault}, + { "fan16_fault", &data_fan16_fault}, { "fan1_status", &data_fan1_status}, { "fan2_status", &data_fan2_status}, { "fan3_status", &data_fan3_status}, @@ -298,6 +366,10 @@ FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= { "fan10_status", &data_fan10_status}, { "fan11_status", &data_fan11_status}, { "fan12_status", &data_fan12_status}, + { "fan13_status", &data_fan13_status}, + { "fan14_status", &data_fan14_status}, + { "fan15_status", &data_fan15_status}, + { "fan16_status", &data_fan16_status}, { "fan_duty_cycle", &data_fan_duty_cycle}, { "fan_model_name", &data_fan_model_name}, { "fan_serial_num", &data_fan_serial_num}, diff --git a/platform/pddf/i2c/modules/include/pddf_fan_driver.h b/platform/pddf/i2c/modules/include/pddf_fan_driver.h index ca5b73da276c..07e1339a8555 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_driver.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_driver.h @@ -32,6 +32,10 @@ enum fan_sysfs_attributes { FAN10_PRESENT, FAN11_PRESENT, FAN12_PRESENT, + FAN13_PRESENT, + FAN14_PRESENT, + FAN15_PRESENT, + FAN16_PRESENT, FAN1_DIRECTION, FAN2_DIRECTION, FAN3_DIRECTION, @@ -44,6 +48,10 @@ enum fan_sysfs_attributes { FAN10_DIRECTION, FAN11_DIRECTION, FAN12_DIRECTION, + FAN13_DIRECTION, + FAN14_DIRECTION, + FAN15_DIRECTION, + FAN16_DIRECTION, FAN1_INPUT, FAN2_INPUT, FAN3_INPUT, @@ -56,6 +64,10 @@ enum fan_sysfs_attributes { FAN10_INPUT, FAN11_INPUT, FAN12_INPUT, + FAN13_INPUT, + FAN14_INPUT, + FAN15_INPUT, + FAN16_INPUT, FAN1_PWM, FAN2_PWM, FAN3_PWM, @@ -68,6 +80,10 @@ enum fan_sysfs_attributes { FAN10_PWM, FAN11_PWM, FAN12_PWM, + FAN13_PWM, + FAN14_PWM, + FAN15_PWM, + FAN16_PWM, FAN1_FAULT, FAN2_FAULT, FAN3_FAULT, @@ -80,6 +96,10 @@ enum fan_sysfs_attributes { FAN10_FAULT, FAN11_FAULT, FAN12_FAULT, + FAN13_FAULT, + FAN14_FAULT, + FAN15_FAULT, + FAN16_FAULT, FAN1_STATUS, FAN2_STATUS, FAN3_STATUS, @@ -92,6 +112,10 @@ enum fan_sysfs_attributes { FAN10_STATUS, FAN11_STATUS, FAN12_STATUS, + FAN13_STATUS, + FAN14_STATUS, + FAN15_STATUS, + FAN16_STATUS, FAN_DUTY_CYCLE, FAN_MODEL_NAME, FAN_SERIAL_NUM, From 96757a335c0d38b3e89cf7e5c646898fed688d44 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Wed, 9 Aug 2023 12:04:54 +0800 Subject: [PATCH 112/145] Remove temporary files and import dash_api to python3 env (#16033) 1. Remove useless temporary protobuf deb packages 2. Import dash_api to python3 env ### Why I did it 1. There are some temporary Debian packages,protobuf packages, needs to be deleted 2. The dash-api was installed in the system folder that cannot be imported by the virtual python3 environment. But the testcases of DASH in sonic-mgmt are executed in virtual python3 environment. ##### Work item tracking - Microsoft ADO **(number only)**: 17417902 #### How I did it 1. Add missed `&&` so that all protobuf debian packaged can be downloaded to the /tmp folder 2. Add ` --system-site-packages ` to env-python so that the system library can be accessed by virtual environment #### How to verify it Check the dash_api can be imported in env-python3 ``` AzDevOps@46a900cf8477:~$ source env-python3/bin/activate (env-python3) zegan@46a900cf8477:~$ ls bin env-python3 (env-python3) zegan@46a900cf8477:~$ python3 Python 3.8.10 (default, May 26 2023, 14:05:08) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import dash_api >>> ``` --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 2a48616d8537..a91d4bac4af8 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -212,7 +212,7 @@ debs/{{ deb }}{{' '}} # Install protobuf 3.21.12 RUN mkdir -p /tmp/protobuf \ - cd /tmp/protobuf \ + && cd /tmp/protobuf \ && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotobuf-dev_3.21.12-3_amd64.deb \ && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotobuf-lite32_3.21.12-3_amd64.deb \ && wget https://sonicstorage.blob.core.windows.net/public/ubuntu/20.04/libprotobuf32_3.21.12-3_amd64.deb \ @@ -263,7 +263,7 @@ WORKDIR /var/$user # Add az symlink for backwards compatibility RUN mkdir bin && ln -s /usr/bin/az bin/az -RUN python3 -m venv env-python3 +RUN python3 -m venv --system-site-packages env-python3 # Activating a virtualenv. The virtualenv automatically works for RUN, ENV and CMD. ENV VIRTUAL_ENV=env-python3 From 04ffd67fdaf6ee0faba199e18cf848a63511d608 Mon Sep 17 00:00:00 2001 From: Sachin Holla <51310506+sachinholla@users.noreply.github.com> Date: Thu, 10 Aug 2023 00:10:00 +0530 Subject: [PATCH 113/145] Ensure sonic yangs wheel is built before sonic-mgmt-common (#15226) * Enhanced slave.mk to accept python wheels as dependency for a deb target. Dependent wheel names should be specified through the new {deb_name}_WHEEL_DEPENDS variable in the deb's make rules. The wheel will be built and installed in the slave docker before starting the deb build. * Added sonic_yang_models-1.0-py3-none-any.whl as dependency for sonic-mgmt-common.deb. This is required for using the sonic yangs in UMF Signed-off-by: Sachin Holla --- rules/sonic-mgmt-common.mk | 1 + slave.mk | 1 + 2 files changed, 2 insertions(+) diff --git a/rules/sonic-mgmt-common.mk b/rules/sonic-mgmt-common.mk index cde659484df6..41441ab3ee94 100644 --- a/rules/sonic-mgmt-common.mk +++ b/rules/sonic-mgmt-common.mk @@ -5,6 +5,7 @@ SONIC_MGMT_COMMON = sonic-mgmt-common_$(MGMT_COMMON_VERSION)_$(CONFIGURED_ARCH). $(SONIC_MGMT_COMMON)_SRC_PATH = $(SRC_PATH)/sonic-mgmt-common $(SONIC_MGMT_COMMON)_DEPENDS = $(LIBYANG_DEV) $(LIBYANG) $(SONIC_MGMT_COMMON)_RDEPENDS = $(LIBYANG) +$(SONIC_MGMT_COMMON)_WHEEL_DEPENDS = $(SONIC_YANG_MODELS_PY3) SONIC_DPKG_DEBS += $(SONIC_MGMT_COMMON) SONIC_MGMT_COMMON_CODEGEN = sonic-mgmt-common-codegen_$(MGMT_COMMON_VERSION)_$(CONFIGURED_ARCH).deb diff --git a/slave.mk b/slave.mk index 300f6d3ff98b..7603b5f8c453 100644 --- a/slave.mk +++ b/slave.mk @@ -679,6 +679,7 @@ SONIC_TARGET_LIST += $(addprefix $(FILES_PATH)/, $(SONIC_MAKE_FILES)) # $(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # SONIC_MAKE_DEBS += $(SOME_NEW_DEB) $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) \ + $$(addsuffix -install,$$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*_WHEEL_DEPENDS))) \ $$(addprefix $(DEBS_PATH)/,$$($$*_AFTER)) \ $(call dpkg_depend,$(DEBS_PATH)/%.dep) $(HEADER) From 51761149ccd4ca966704c819c3a69aa675599960 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 10 Aug 2023 17:22:23 +0800 Subject: [PATCH 114/145] [submodule] Update submodule sonic-platform-daemons to the latest HEAD automatically (#16079) #### Why I did it src/sonic-platform-daemons ``` * f3c2631 - (HEAD -> master, origin/master, origin/HEAD) Revert pcied enhancements (#392) (28 hours ago) [Ashwin Srinivasan] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 76baca3d7154..f3c26319c423 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 76baca3d71542dbeeeeac6bea45b762abab7166f +Subproject commit f3c26319c423c38c8f8aa16e112c1ea768ea4497 From a86eb95005fafd7dabea02849cb4989205d5767f Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Thu, 10 Aug 2023 17:22:28 +0800 Subject: [PATCH 115/145] [submodule] Update submodule sonic-platform-common to the latest HEAD automatically (#16078) #### Why I did it src/sonic-platform-common ``` * 537095c - (HEAD -> master, origin/master, origin/HEAD) Added new RegBitsFields (#391) (32 hours ago) [Prince George] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index c99d31164175..537095cca2e8 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit c99d31164175bec5f99784bf222d91bf8f2c20c6 +Subproject commit 537095cca2e8074600805915217e091d474b8211 From 97113bae61f4763cf36d5d35b81986523db9e3a5 Mon Sep 17 00:00:00 2001 From: Arun LK <83708154+arunlk-dell@users.noreply.github.com> Date: Fri, 11 Aug 2023 05:57:30 +0530 Subject: [PATCH 116/145] Dell: E3224F platform onboarding (#16002) * Dell: E3224F platform onboarding * Dell: E3224F platform onboarding --- .../Dell-E3224F/buffers.json.j2 | 2 + .../Dell-E3224F/buffers_defaults_t0.j2 | 41 + .../Dell-E3224F/buffers_defaults_t1.j2 | 41 + .../Dell-E3224F/copp_capabilities_config.j2 | 3 + .../Dell-E3224F/copp_platform_config.j2 | 145 ++ .../Dell-E3224F/custom_led.bin | Bin 0 -> 606 bytes .../hx5-e3224f-24x1G+4x10G.config.bcm | 157 ++ .../Dell-E3224F/linkscan_led_fw.bin | Bin 0 -> 6100 bytes .../Dell-E3224F/pg_profile_lookup.ini | 17 + .../Dell-E3224F/port_config.ini | 31 + .../Dell-E3224F/qos.json.j2 | 1 + .../Dell-E3224F/qos_config_t1.j2 | 175 ++ .../Dell-E3224F/sai.profile | 1 + .../Dell-E3224F/sai_preinit_cmd.soc | 2 + device/dell/x86_64-dell_e3224f-r0/default_sku | 1 + .../dell/x86_64-dell_e3224f-r0/init_cfg.json | 13 + .../dell/x86_64-dell_e3224f-r0/installer.conf | 4 + .../x86_64-dell_e3224f-r0/led_proc_init.soc | 7 + .../dell/x86_64-dell_e3224f-r0/platform.json | 281 +++ .../dell/x86_64-dell_e3224f-r0/platform_asic | 1 + .../x86_64-dell_e3224f-r0/plugins/eeprom.py | 22 + .../x86_64-dell_e3224f-r0/plugins/fanutil.py | 71 + .../x86_64-dell_e3224f-r0/plugins/pcie.yaml | 16 + .../x86_64-dell_e3224f-r0/plugins/psuutil.py | 190 ++ .../x86_64-dell_e3224f-r0/plugins/sfputil.py | 198 +++ .../pmon_daemon_control.json | 3 + .../dell/x86_64-dell_e3224f-r0/sensors.conf | 58 + .../system_health_monitoring_config.json | 11 + platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-dell.mk | 6 + .../debian/control | 5 + .../debian/platform-modules-e3224f.init | 39 + .../debian/platform-modules-e3224f.install | 12 + .../debian/platform-modules-e3224f.postinst | 7 + .../sonic-platform-modules-dell/debian/rules | 11 +- .../e3224f/cfg/e3224f-modules.conf | 14 + .../e3224f/modules/Makefile | 2 + .../e3224f/modules/dell_e3224f_platform.c | 1563 +++++++++++++++++ .../e3224f/modules/emc2305.c | 1203 +++++++++++++ .../e3224f/modules/pmbus.h | 425 +++++ .../e3224f/scripts/e3224f_platform.sh | 174 ++ .../e3224f/scripts/mux_controller.sh | 27 + .../e3224f/scripts/platform-modules-e3224f.sh | 6 + .../e3224f/scripts/platform_sensors.py | 162 ++ .../e3224f/scripts/portiocfg.py | 105 ++ .../e3224f/scripts/ports_xcvrd_notify.py | 107 ++ .../e3224f/scripts/sensors | 8 + .../e3224f/setup.py | 1 + .../e3224f/sonic_platform/__init__.py | 8 + .../e3224f/sonic_platform/chassis.py | 442 +++++ .../e3224f/sonic_platform/component.py | 137 ++ .../e3224f/sonic_platform/eeprom.py | 131 ++ .../e3224f/sonic_platform/fan.py | 254 +++ .../e3224f/sonic_platform/fan_drawer.py | 158 ++ .../e3224f/sonic_platform/platform.py | 24 + .../e3224f/sonic_platform/psu.py | 255 +++ .../e3224f/sonic_platform/sfp.py | 343 ++++ .../e3224f/sonic_platform/thermal.py | 163 ++ .../e3224f/sonic_platform/watchdog.py | 207 +++ .../e3224f/systemd/mux-ctrl.service | 13 + .../systemd/platform-modules-e3224f.service | 14 + 61 files changed, 7518 insertions(+), 1 deletion(-) create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers.json.j2 create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t0.j2 create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t1.j2 create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_capabilities_config.j2 create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_platform_config.j2 create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/custom_led.bin create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/hx5-e3224f-24x1G+4x10G.config.bcm create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/linkscan_led_fw.bin create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/pg_profile_lookup.ini create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/port_config.ini create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos.json.j2 create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos_config_t1.j2 create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai.profile create mode 100644 device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai_preinit_cmd.soc create mode 100644 device/dell/x86_64-dell_e3224f-r0/default_sku create mode 100644 device/dell/x86_64-dell_e3224f-r0/init_cfg.json create mode 100644 device/dell/x86_64-dell_e3224f-r0/installer.conf create mode 100644 device/dell/x86_64-dell_e3224f-r0/led_proc_init.soc create mode 100644 device/dell/x86_64-dell_e3224f-r0/platform.json create mode 100644 device/dell/x86_64-dell_e3224f-r0/platform_asic create mode 100644 device/dell/x86_64-dell_e3224f-r0/plugins/eeprom.py create mode 100644 device/dell/x86_64-dell_e3224f-r0/plugins/fanutil.py create mode 100644 device/dell/x86_64-dell_e3224f-r0/plugins/pcie.yaml create mode 100644 device/dell/x86_64-dell_e3224f-r0/plugins/psuutil.py create mode 100644 device/dell/x86_64-dell_e3224f-r0/plugins/sfputil.py create mode 100644 device/dell/x86_64-dell_e3224f-r0/pmon_daemon_control.json create mode 100644 device/dell/x86_64-dell_e3224f-r0/sensors.conf create mode 100644 device/dell/x86_64-dell_e3224f-r0/system_health_monitoring_config.json create mode 100755 platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.init create mode 100644 platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.install create mode 100644 platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.postinst create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/cfg/e3224f-modules.conf create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/modules/dell_e3224f_platform.c create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/modules/emc2305.c create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/modules/pmbus.h create mode 100755 platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/e3224f_platform.sh create mode 100755 platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/mux_controller.sh create mode 100755 platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform-modules-e3224f.sh create mode 100755 platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform_sensors.py create mode 100755 platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/portiocfg.py create mode 100755 platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/ports_xcvrd_notify.py create mode 100755 platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/sensors create mode 120000 platform/broadcom/sonic-platform-modules-dell/e3224f/setup.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/platform.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/sfp.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/watchdog.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/mux-ctrl.service create mode 100644 platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/platform-modules-e3224f.service diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers.json.j2 b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers.json.j2 new file mode 100644 index 000000000000..1083a6210fc9 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't0' %} +{%- include 'buffers_config.j2' %} diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t0.j2 b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..e26d7cdf1c34 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t0.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '5m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {% for port_idx in range(0,24) %} + {% if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{% endif %} + {% endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "8192000", + "type": "ingress", + "mode": "dynamic", + "xoff": "196608" + }, + "egress_lossless_pool": { + "size": "8388608", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"0", + "static_th":"8388608" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t1.j2 b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..c41501e4fb29 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/buffers_defaults_t1.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {% for port_idx in range(0,24) %} + {% if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{% endif %} + {% endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "8192000", + "type": "ingress", + "mode": "dynamic", + "xoff": "196608" + }, + "egress_lossless_pool": { + "size": "8388608", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"0", + "static_th":"8388608" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_capabilities_config.j2 b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_capabilities_config.j2 new file mode 100644 index 000000000000..ba28f2410393 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_capabilities_config.j2 @@ -0,0 +1,3 @@ +{ + "copp_rx_rate":15000 +} diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_platform_config.j2 b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_platform_config.j2 new file mode 100644 index 000000000000..35c0066dc59e --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/copp_platform_config.j2 @@ -0,0 +1,145 @@ +{ + "COPP_GROUP": { + "copp-system-lacp": { + "cir":"250", + "cbs":"250" + }, + "copp-system-udld": { + "cir":"250", + "cbs":"250" + }, + "copp-system-stp": { + "cir":"8000", + "cbs":"8000" + }, + "copp-system-bfd": { + "cir":"750", + "cbs":"750" + }, + "copp-system-lldp": { + "cir":"250", + "cbs":"250" + }, + "copp-system-vrrp": { + "cir":"250", + "cbs":"250" + }, + "copp-system-iccp": { + "cir":"2500", + "cbs":"2500" + }, + "copp-system-ospf": { + "cir":"2500", + "cbs":"2500" + }, + "copp-system-bgp": { + "cir":"5000", + "cbs":"5000" + }, + "copp-system-pim": { + "cir":"2500", + "cbs":"2500" + }, + "copp-system-igmp": { + "cir":"1000", + "cbs":"1000" + }, + "copp-system-suppress": { + "cir":"1500", + "cbs":"1500" + }, + "copp-system-arp": { + "cir":"1500", + "cbs":"1500" + }, + "copp-system-dhcp": { + "cir":"150", + "cbs":"150" + }, + "copp-system-icmp": { + "cir":"500", + "cbs":"500" + }, + "copp-system-ip2me": { + "cir":"3000", + "cbs":"3000" + }, + "copp-system-subnet": { + "cir":"1000", + "cbs":"1000" + }, + "copp-system-mtu": { + "cir":"250", + "cbs":"250" + }, + "copp-system-sflow": { + "cir":"4000", + "cbs":"4000" + } + }, + "SCHEDULER": { + "copp-scheduler-policy@23": { + "pir": "250" + }, + "copp-scheduler-policy@22": { + "pir": "250" + }, + "copp-scheduler-policy@21": { + "pir": "8000" + }, + "copp-scheduler-policy@20": { + "pir": "750" + }, + "copp-scheduler-policy@19": { + "pir": "2500" + }, + "copp-scheduler-policy@18": { + "pir": "250" + }, + "copp-scheduler-policy@17": { + "pir": "250" + }, + "copp-scheduler-policy@16": { + "pir": "2500" + }, + "copp-scheduler-policy@15": { + "pir": "2500" + }, + "copp-scheduler-policy@14": { + "pir": "5000" + }, + "copp-scheduler-policy@13": { + "pir": "2500" + }, + "copp-scheduler-policy@12": { + "pir": "1000" + }, + "copp-scheduler-policy@11": { + "pir": "1500" + }, + "copp-scheduler-policy@10": { + "pir": "1500" + }, + "copp-scheduler-policy@9": { + "pir": "150" + }, + "copp-scheduler-policy@8": { + "pir": "500" + }, + "copp-scheduler-policy@7": { + "pir": "3000" + }, + "copp-scheduler-policy@6": { + "pir": "1000" + }, + "copp-scheduler-policy@4": { + "pir": "250" + }, + "copp-scheduler-policy@3": { + "pir": "4000" + }, + "copp-scheduler-policy@1": { + "pir": "100" + } + } +} diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/custom_led.bin b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/custom_led.bin new file mode 100644 index 0000000000000000000000000000000000000000..631b4712fa28c7bfb63dc04864b96e88166f1939 GIT binary patch literal 606 zcmW-cy>C)s6vm(TUJ#Jd+9I~dEiJqSELU2~hiK6X7kU~(8WTx0K%=E5=B6_PBZkCi zyZEtybTZw#)J8jLV&dp>S#|MGVAjQhXFkvK`#q!2Pv{|SQ;9~Ox~CHw-XQ#_+=;2O zM~c+)$0X!?@@TEh;aub8;Q961hNI)rIAZ;k;?5t_L+sgJHJJ(ta#_u_EH7U#u`6!?JVS@wYzaZkn~KNFSdm zNoRaGL}c-PCpxD2^KPwX)Cv{jh;mvh)hAusPyMM^g98Y&R)?H4JXY82kx>%s-nJ{Z zW9$^9CQ=6uVeOGOAJ_JiWjd&f^|u(HU{)U}8E4|xP{{AQkZLn4i%pyCHr3NRUtUw6 zKF|q`zJ84dihT8@P*2Y@v+G7>QfR;wCakBZVZ^_-mEF6P(gH zz055!Zi{fMBeODy2<0Fzf$^h#+H!Z9Oa7pZm{+83*C3Lx_rGposIGZS^|;VI$*X#V66@wioj7W&gBOLZDL3;78z)R zak*uPkNLrIC0>|F2z5fg%XBW`AKuTfUln@!MnC1-=x_FI6yD{VdA~sM9;=^!PJr1^XAn;d zP<7B%K0M?b;L8&zkqbn(`A+!K$T>di9T@xf4BP7i2^c> zoE8qcJ|6}q5Cs=|4(T)u;*_s<@4CIPTvi3o%C*DKZve{evkP3z0sl$XJN{9ZXOS(OZ>K z^Reg6sZsNgjwqw%<0!d+eVP~7Wz%;BTAUFR(cqk-w0OA_*PurFv;-^6Q}nY6eRb56 zQ=?2oZ?``~rC!T|gBFd5w>fG;ea#qScyJVmELsgPQu+x=YLc340^Q`sx;aWIBex2> zT=Y4aE6~CUtOW!!_6A!1vYl31Q?~;kY7lr0O9U|vQDz7=qP42c2iH`YLo=#X>--zm z{_TUl4cH6DQ@dQM;jpFOr5)BKz`vq=hb36q>!L=kY9kQQ*fX9I8mhhA5{sANIfrFv zE!647=5^Xr`&??VcOBGGVr*T1OSjeBaAEX#3`qi@h5$hre27uDDd z^e1jAWzT+!NZ%u=$!B~u?tO(s5gvxveqFFw;LQ%|BQqoL3D6?KZ8*wVA*EX+zX1EF z)Y*)d0AowMs^3jCHS{5|Z4T|{{?+2OfxVf#&oYfTY9Hp-dH=c0Z&}9EPwwJR@(+>% zA5`t~6|8>W*J*8Ay^zrLpO3OuIMna@{fO*6-t6&qs^$o4L@!pNM&9;NKCms}n|(NQ zu7>}Iq&f00t)0R?7d@g@G^4SX&|dD<);>hV%}uv-p&!$tM(G1PRqbHBoW;^F(>6N9ET9b>`7M${eO)P1Q`gi`&r#_L#+6wSr?UeckVLn@ONW9vf)M zufMl7Xz|*YWAD|LN3OLvoPm~1q)4%Oe-1)0r&x3ny;DcN^i!#o8CQjkI8a09bLgk2 z-x!xs){%)eVbp5H{$r$yU>p;SiN|3Ld3(in_~Y`qe%9)-ZgWALX7;%*jqpO9KZq7c zk3cFZ^;>x!!jugJJqL&MXw{kM<;eCy4d}&-{`o>cc+926SP|n4gDGXUv81Nfj~1al z_$(al+6t$=^*BSf^;vm_>R-DqkI>;Dlsc)@{Tcls)Gu!kOYO*!Iw9%9^kGWSFdvqg z5;V#@ll;GAIB}J+vivF!;wqiIHXKc6BBewJ1`!VGNg*PW^F!(bsks6eQ$j{L6TRcQ zwe-RBUH=G|y#2T)2-gWgX!OeaOGm2O`v!}N2Fzj;O1bDqtW(cRu8Kwl-v-22tKh4- zwr2=K>X5`%Kqw%*Mdl&ORLGdvg(#1AZHJNNHz_D@RZxZ}54pY`*(jW})cNx}xCM6* z;Hj|s$siOZ09LU8CM*+o18^#U{^+SjbtBUy&KAx z%UFA?effC~%lZW7g=8S22A!De$hqs#K1`E{dYnqg5uuKZq35fxMI|z*gYNM_w7Zfw z1VM8C#3`j$PRdc^@L+iu9Jh$64yfKhOt0`1Yn9Sxq-UU~tJ_MmpSzt-w#&@XY{2_> zUQ@%xQK%6pnEfJHLYA;R_HAjwiXKw3qJT_iY4(7N7Ts(ww_y1u>%6%aM$5zNt<-YU zoKHr9nTeRHP*-Eg6h`ztgKh>=9!Udth;<|h;ZC9st3lwv+yiC_nv8n!>5vV=_&1KH6(nd&~%ynB$4Od3r zKx_ab<!p8-mo%To9ZN`Xkv6FDHSapVKHS-lMD-s(%TovQiwk zDMvroZS7xfYWN1xD0;CMclD4m#%ZUYD<6Q=yj;->z?8q-3wz3b)HUbfPW=U4J;z#C zdJ7zX9ziSa+P2iAFGE}Ih1FfG^+(D|d)uMLIbTpTm(EdS0OobAw;EZy*EHwyHGNSb zO3~MU;)tKPf86SH!itg=D%6@0wWbyWt<9`+UO#76H22x)I`{0C>UK=#${?!7&1Mtw%tXVkTW)3 z^gP%cNWD2;6prZ@$4&Tc7UdCg|KPakFpcXs?N=+Kj*ScCMvN!d=OC+=05o81abUSV z_n43*$%$=JT9+#ff#b&blBJ71Tfw>DRM$6MJ!H76ke$ZvaZw^weF^Q~0cm?*-WZC zVpo#=(VWp@jIgBXTgnNhhH=E(V2DyqlWAmaly>y}c?t^C?$5bA|fWx)lk z_21S&$mvLb1l4QYRF%!rLwJm99D zkkUsngEoxb=MMG&)m)7Jtz(OuSt_)Vrx+)nLt8`7s?}nwWi2-lQ%IL^qJ8#fzyTsv zYYK0&4!XWM4>x}gPaHkjh3I;$qSsWH9aUF(JRV#{FV4{XdpRqXBc^QKe&oJgv{TEi z=6OFS&O{ShfSk*@D{ppa&fVJD4?#N8`Z`o@BaZKdH9Iy z?eoCAk!*_Ku0^)e-p(4dBIPI*g8*fCy9+f%0Z$DJu23yfNKHqIiYKs#wqYb-w22$s z_*)^5rEE0j!y6Fgrl`(i6rdhu+51?xK+B#mbw@I(rkNSEg}2Z)pc!$a%?+>(XrPP!eZw=TDF8J>WRW8%2}HfH&0wCChI1scg->ls=GQFiZZcIDt8d&IDk^{oYi7 z`^C(GLL_V5fffS;D$H9M7QY1w4G}4QQQDz4nAnwgd&62%sku5KYIVcrKufttACSK> zok2J)bmDmtE2g>Ae4yn9*=Bwk)5VGdEhV0q)*$TkcN#jWSP{+b#M^wKyBqUTcw8PK zYtU0U9uKtWl-A&1v|?OCe{I4wFUFFJ9B7?Yb3)kPcA)(w%{~Fo@dCuLs-FeQU zp1#lO{U43F5%$8poAUDLt8^Y6tndRSSq9K*fLc{UR%8CP(oV zW{2hd2N_2O^Bg!NrEkn?fL1I$7p2e-@dYERA}M}uD`sX`b7j?N+jUBmw`JwiU{Dwm z7H~tj7H2@d&&s}4)gh&ab2Hn)VMhOyX?(57mAieyK#K)^i<0=wQu;%sRZDnW139R_qY?v{SKIhTL<~|Z zvrU9XWQU|2WR?eO7%I5Dn|0KzI zlgwF!ycWz)XJ=(Tz&8W7viIm6IJ=adod!B7n=KA;5%v|t z_1HHfu@Fbsh<9QO9WTI^qC^8}R8V;*lgFzL@xr@9m`XsHw!7~6DyhQSSW=DObW)4o zKPPqg{W@vD@5Q7Mzh7Xc3O3m1$DM7+sG<0bYBoH5g@ZW;(Sf_znZb)(>cxykTX5sF znGDF;YyQ4&l;j*kzPZoAx0RA9da;zjY(#EdDP5kT1nFXOzH&SHImYHp)Qxtx7|VbU z;HL!OGn}G&Op=cMha_dHDG=V1q|`Y{;vddQu}c$@Gg3fg&tmXB#E>W?XW6G+nvn|f z1nZeugI~7n2GUsxbG|Seg@l;RuChz4g=5lGx?J>b#|f4S=9DyE!@L&KFg&SHZK zwoDoNrlL0MM%)RbmOgy}+z8L6zursm>XR zM}WF)9O{kYbm6h`r(Ehd2o{T(HxoMHtI9dc62bW!{hg5Dgy}pTQzz&OGv+^E#?i*{ zZM13X1uhlUwrbsGUfWtyKCB;x#W9L$;y+Awp?rA`wHGjO0MH5jNz}m*)Q{l_C%?;5 r32LZh7SzipUVi`b`|m0o-h^13!6LsQJYocJBmG@}mEYC*|LFT~Y{;3K literal 0 HcmV?d00001 diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/pg_profile_lookup.ini b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/pg_profile_lookup.ini new file mode 100644 index 000000000000..6d91d03ae684 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 9427 0 50176 1 3584 + 25000 5m 9427 0 50176 1 3584 + 40000 5m 9427 0 50176 1 3584 + 50000 5m 9427 0 50176 1 3584 + 100000 5m 9427 0 50176 1 3584 + 10000 40m 9427 0 50176 1 3584 + 25000 40m 9427 0 50176 1 3584 + 40000 40m 9427 0 50176 1 3584 + 50000 40m 9427 0 50176 1 3584 + 100000 40m 9427 0 50176 1 3584 + 10000 300m 9427 0 50176 1 3584 + 25000 300m 9427 0 50176 1 3584 + 40000 300m 9427 0 50176 1 3584 + 50000 300m 9427 0 50176 1 3584 + 100000 300m 9427 0 50176 1 3584 diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/port_config.ini b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/port_config.ini new file mode 100644 index 000000000000..48fe0d9e2720 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/port_config.ini @@ -0,0 +1,31 @@ +# name lanes alias index speed autoneg +Ethernet0 8 oneGigE1/1 1 1000 1 +Ethernet1 7 oneGigE1/2 2 1000 1 +Ethernet2 6 oneGigE1/3 3 1000 1 +Ethernet3 5 oneGigE1/4 4 1000 1 +Ethernet4 4 oneGigE1/5 5 1000 1 +Ethernet5 3 oneGigE1/6 6 1000 1 +Ethernet6 2 oneGigE1/7 7 1000 1 +Ethernet7 1 oneGigE1/8 8 1000 1 +Ethernet8 16 oneGigE1/9 9 1000 1 +Ethernet9 15 oneGigE1/10 10 1000 1 +Ethernet10 14 oneGigE1/11 11 1000 1 +Ethernet11 13 oneGigE1/12 12 1000 1 +Ethernet12 12 oneGigE1/13 13 1000 1 +Ethernet13 11 oneGigE1/14 14 1000 1 +Ethernet14 10 oneGigE1/15 15 1000 1 +Ethernet15 9 oneGigE1/16 16 1000 1 +Ethernet16 24 oneGigE1/17 17 1000 1 +Ethernet17 23 oneGigE1/18 18 1000 1 +Ethernet18 22 oneGigE1/19 19 1000 1 +Ethernet19 21 oneGigE1/20 20 1000 1 +Ethernet20 20 oneGigE1/21 21 1000 1 +Ethernet21 19 oneGigE1/22 22 1000 1 +Ethernet22 18 oneGigE1/23 23 1000 1 +Ethernet23 17 oneGigE1/24 24 1000 1 +Ethernet24 64 tenGigE1/25 25 10000 0 +Ethernet25 63 tenGigE1/26 26 10000 0 +Ethernet26 62 tenGigE1/27 27 10000 0 +Ethernet27 61 tenGigE1/28 28 10000 0 +Ethernet28 69,70,71,72 hundredGigE1/29 29 100000 0 +Ethernet32 73,74,75,76 hundredGigE1/30 30 100000 0 diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos.json.j2 b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos.json.j2 new file mode 100644 index 000000000000..ee67c6e26221 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config_t1.j2' %} diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos_config_t1.j2 b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos_config_t1.j2 new file mode 100644 index 000000000000..5fe5324a85c1 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/qos_config_t1.j2 @@ -0,0 +1,175 @@ +{%- set PORT_ALL = [] %} +{%- for port in PORT %} + {%- if PORT_ALL.append(port) %}{% endif %} +{%- endfor %} +{%- if PORT_ALL | sort_by_port_index %}{% endif %} + +{%- set port_names_list_all = [] %} +{%- for port in PORT_ALL %} + {%- if port_names_list_all.append(port) %}{% endif %} +{%- endfor %} +{%- set port_names_all = port_names_list_all | join(',') -%} + + +{%- set PORT_ACTIVE = [] %} +{%- if DEVICE_NEIGHBOR is not defined %} + {%- set PORT_ACTIVE = PORT_ALL %} +{%- else %} + {%- for port in DEVICE_NEIGHBOR.keys() %} + {%- if PORT_ACTIVE.append(port) %}{%- endif %} + {%- endfor %} +{%- endif %} +{%- if PORT_ACTIVE | sort_by_port_index %}{% endif %} + +{%- set port_names_list_active = [] %} +{%- for port in PORT_ACTIVE %} + {%- if port_names_list_active.append(port) %}{%- endif %} +{%- endfor %} +{%- set port_names_active = port_names_list_active | join(',') -%} + + +{%- set pfc_to_pg_map_supported_asics = ['mellanox', 'barefoot', 'marvell'] -%} + + +{ +{% if generate_tc_to_pg_map is defined %} + {{- generate_tc_to_pg_map() }} +{% else %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, +{% endif %} + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, +{% if asic_type in pfc_to_pg_map_supported_asics %} + "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "3": "3", + "4": "4" + } + }, +{% endif %} + "PORT_QOS_MAP": { +{% for port in PORT_ACTIVE %} + "{{ port }}": { + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", +{% if asic_type in pfc_to_pg_map_supported_asics %} + "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", +{% endif %} + "pfc_enable" : "3,4" + }{% if not loop.last %},{% endif %} +{% endfor %} + } +} diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai.profile b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai.profile new file mode 100644 index 000000000000..7725e59fcc0f --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/hx5-e3224f-24x1G+4x10G.config.bcm diff --git a/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai_preinit_cmd.soc b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai_preinit_cmd.soc new file mode 100644 index 000000000000..4d62900f898f --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/Dell-E3224F/sai_preinit_cmd.soc @@ -0,0 +1,2 @@ +m0 load 0 0x0 /usr/share/sonic/hwsku/linkscan_led_fw.bin +m0 load 0 0x3800 /usr/share/sonic/hwsku/custom_led.bin diff --git a/device/dell/x86_64-dell_e3224f-r0/default_sku b/device/dell/x86_64-dell_e3224f-r0/default_sku new file mode 100644 index 000000000000..1157285f3a34 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/default_sku @@ -0,0 +1 @@ +Dell-E3224F t1 diff --git a/device/dell/x86_64-dell_e3224f-r0/init_cfg.json b/device/dell/x86_64-dell_e3224f-r0/init_cfg.json new file mode 100644 index 000000000000..dc933239006c --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/init_cfg.json @@ -0,0 +1,13 @@ +{ + "FEATURE": { + "tam": { + "state": "disabled" + }, + "telemetry": { + "state": "disabled" + }, + "nat": { + "state": "disabled" + } + } +} diff --git a/device/dell/x86_64-dell_e3224f-r0/installer.conf b/device/dell/x86_64-dell_e3224f-r0/installer.conf new file mode 100644 index 000000000000..d67012ee4f7c --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +VAR_LOG_SIZE=512 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off irqfixup" diff --git a/device/dell/x86_64-dell_e3224f-r0/led_proc_init.soc b/device/dell/x86_64-dell_e3224f-r0/led_proc_init.soc new file mode 100644 index 000000000000..841e4493c2f2 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/led_proc_init.soc @@ -0,0 +1,7 @@ +# LED microprocessor initialization for Dell E3224F +# +# +#Led0 +#led auto on +m0 load 0 0x3800 /usr/share/sonic/hwsku/custom_led.bin +led start diff --git a/device/dell/x86_64-dell_e3224f-r0/platform.json b/device/dell/x86_64-dell_e3224f-r0/platform.json new file mode 100644 index 000000000000..9a3a631469f6 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/platform.json @@ -0,0 +1,281 @@ +{ + "chassis": { + "name": "E3224F-ON", + "status_led": { + "controllable": true, + "colors": ["green", "blink_green", "yellow", "blink_yellow"] + }, + "thermal_manager" : false, + "components": [ + { + "name": "BIOS" + }, + { + "name": "CPU CPLD" + }, + { + "name": "SYS CPLD" + }, + { + "name": "PORT CPLD" + } + ], + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ], + "fan_drawers":[ + { + "name": "FanTray1", + "status_led": { + "controllable": true, + "colors": ["off", "green", "yellow"] + }, + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray2", + "status_led": { + "controllable": true, + "colors": ["off", "green", "yellow"] + }, + "fans": [ + { + "name": "FanTray2-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray3", + "status_led": { + "controllable": true, + "colors": ["off", "green", "yellow"] + }, + "fans": [ + { + "name": "FanTray3-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU1 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "PSU2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU2 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "thermals": [ + { + "name": "Front Panel PHY Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Middle Fan Tray Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Near Front Panel Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Switch Near Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Switch Rear Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + } + ], + "modules": [], + "sfps": [ + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "QSFP or later" + }, + { + "name": "QSFP or later" + } + ] + }, + "interfaces": {} +} diff --git a/device/dell/x86_64-dell_e3224f-r0/platform_asic b/device/dell/x86_64-dell_e3224f-r0/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/dell/x86_64-dell_e3224f-r0/plugins/eeprom.py b/device/dell/x86_64-dell_e3224f-r0/plugins/eeprom.py new file mode 100644 index 000000000000..be6f1952f03a --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +############################################################################# +# Dell E3224F +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/dell/x86_64-dell_e3224f-r0/plugins/fanutil.py b/device/dell/x86_64-dell_e3224f-r0/plugins/fanutil.py new file mode 100644 index 000000000000..73d171e857cc --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/plugins/fanutil.py @@ -0,0 +1,71 @@ +# +# fanutil.py +# Platform-specific FAN status interface for SONiC +# + +import sys +from sonic_py_common.general import getstatusoutput_noshell + +SENSORS_CMD = ["docker", "exec", "-i", "pmon", "/usr/bin/sensors"] +DOCKER_SENSORS_CMD = "/usr/bin/sensors" + + +try: + from sonic_fan.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanUtil(FanBase): + """Platform-specific FanUtil class""" + _fan_mapping = { + 1 : '0', + 2 : '1', + 3 : '2' + } + + def __init__(self): + FanBase.__init__(self) + + def isDockerEnv(self): + num_docker = open('/proc/self/cgroup', 'r').read().count(":/docker") + if num_docker > 0: + return True + + def get_num_fans(self): + E3224F_MAX_FANTRAYS = 3 + return E3224F_MAX_FANTRAYS + + def get_presence(self, idx): + sysfs_path = "/sys/devices/platform/dell-e3224f-cpld.0/fan" + self._fan_mapping[idx] + "_prs" + return int(open(sysfs_path).read(), 16) + + def get_direction(self, idx): + sysfs_path = "/sys/devices/platform/dell-e3224f-cpld.0/fan" + self._fan_mapping[idx] + "_dir" + return open(sysfs_path).read() + + def get_speed(self, idx): + dockerenv = self.isDockerEnv() + if not dockerenv: + status, cmd_output = getstatusoutput_noshell(SENSORS_CMD) + else: + status, cmd_output = getstatusoutput_noshell(DOCKER_SENSORS_CMD) + if status: + print('Failed to execute sensors command') + sys.exit(0) + fan_id = 'Fan ' + str(idx) + found = False + for line in cmd_output.splitlines(): + if line.startswith('emc2305-i2c-7-2c'): + found = True + if found and line.startswith(fan_id): + return line.split()[3] + return 0.0 + + def get_status(self, idx): + sysfs_path = "/sys/devices/platform/dell-e3224f-cpld.0/fan" + self._fan_mapping[idx] + "_prs" + return int(open(sysfs_path).read(), 16) + + + def set_speed(self, idx): + return False diff --git a/device/dell/x86_64-dell_e3224f-r0/plugins/pcie.yaml b/device/dell/x86_64-dell_e3224f-r0/plugins/pcie.yaml new file mode 100644 index 000000000000..dd8049268567 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/plugins/pcie.yaml @@ -0,0 +1,16 @@ +- bus: '02' + dev: '00' + fn: '0' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' +- bus: '01' + dev: '00' + fn: '0' + id: b371 + name: 'Ethernet controller: Broadcom Limited BCM56371 Switch ASIC (rev 02)' +- bus: '00' + dev: '14' + fn: '0' + id: 19c2 + name: 'SATA controller: Intel Corporation DNV SATA Controller 1 (rev 11)' diff --git a/device/dell/x86_64-dell_e3224f-r0/plugins/psuutil.py b/device/dell/x86_64-dell_e3224f-r0/plugins/psuutil.py new file mode 100644 index 000000000000..14ed58d70115 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/plugins/psuutil.py @@ -0,0 +1,190 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + +import os +import sys +from sonic_py_common.general import getstatusoutput_noshell + +SENSORS_CMD = ["docker", "exec", "-i", "pmon", "/usr/bin/sensors"] +DOCKER_SENSORS_CMD = "/usr/bin/sensors" + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + _psu_mapping = { + 1 : '0', + 2 : '1' + } + + def __init__(self): + PsuBase.__init__(self) + + def isDockerEnv(self): + num_docker = open('/proc/self/cgroup', 'r').read().count(":/docker") + if num_docker > 0: + return True + else: + return False + + def remove_nonnumeric(self, text): + digits='0123456789.' + return ''.join(c for c in text if c in digits) + + def get_cpld_register(self, reg_name): + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + retval = 'ERR' + reg_file = cpld_dir +'/' + reg_name + if (not os.path.isfile(reg_file)): + return retval + + try: + with open(reg_file, 'r') as fd: + retval = fd.read() + except Exception as error: + print("Unable to open ", reg_file, "file !") + + retval = retval.rstrip('\r\n') + return retval + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + E3224F_MAX_PSUS = 2 + return E3224F_MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is\ + faulty + """ + status = 0 + psu_status = self.get_cpld_register('psu'+self._psu_mapping[index]+'_status') + if (psu_status != 'ERR'): + status = int(psu_status, 10) + + presence = self.get_psu_presence(index) + + return (status & presence) + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + status = 0 + psu_presence = self.get_cpld_register('psu'+self._psu_mapping[index]+'_prs') + if (psu_presence != 'ERR'): + status = int(psu_presence, 10) + + return status + + def get_sensor(self): + dockerenv = self.isDockerEnv() + if not dockerenv: + status, cmd_output = getstatusoutput_noshell(SENSORS_CMD) + else: + status, cmd_output = getstatusoutput_noshell(DOCKER_SENSORS_CMD) + if status: + print('Failed to execute sensors command') + sys.exit(0) + return cmd_output + + def get_output_current(self, index): + cmd_output= self.get_sensor() + sensor_name = 'dps460-i2c-10' if index == 1 else 'dps460-i2c-11' + found = False + for line in cmd_output.splitlines(): + if line.startswith(sensor_name): + found = True + if found: + if 'Output Current' in line : + return float(self.remove_nonnumeric(line.split()[2])) + return 0.0 + + def get_output_voltage(self, index): + cmd_output= self.get_sensor() + sensor_name = 'dps460-i2c-10' if index == 1 else 'dps460-i2c-11' + found = False + for line in cmd_output.splitlines(): + if line.startswith(sensor_name): + found = True + if found: + if 'Output Voltage' in line : + return float(self.remove_nonnumeric(line.split()[2])) + return 0.0 + + def get_fan_rpm(self, index, fan_index): + if fan_index > 1 : return 0.0 + cmd_output= self.get_sensor() + sensor_name = 'dps460-i2c-10' if index == 1 else 'dps460-i2c-11' + found = False + for line in cmd_output.splitlines(): + if line.startswith(sensor_name): + found = True + if found: + if 'Fan RPM' in line : + return self.remove_nonnumeric(line.split()[2]) + return 0.0 + + def get_output_power(self, index): + cmd_output= self.get_sensor() + sensor_name = 'dps460-i2c-10' if index == 1 else 'dps460-i2c-11' + found = False + for line in cmd_output.splitlines(): + if line.startswith(sensor_name): + found = True + if found: + if 'Output Power' in line : + return float(self.remove_nonnumeric(line.split()[2])) + return 0.0 + + def get_direction(self, index): + psuid = '0' if index == 1 else '1' + sysfs_path = '/sys/devices/platform/dell-e3224f-cpld.0/psu' + psuid + '_prs' + found_psu = int(open(sysfs_path).read()) + if not found_psu : return '' + bus_no = '10' if index == 1 else '11' + sysfs_path = "/sys/bus/i2c/devices/" + bus_no + "-0056/eeprom" + val = (open(sysfs_path, "rb").read())[0xe1:0xe8] + dir = 'F2B' if 'FORWARD' == val else 'B2F' + return dir + + def get_serial(self, index): + psuid = '0' if index == 1 else '1' + sysfs_path = '/sys/devices/platform/dell-e3224f-cpld.0/psu' + psuid + '_prs' + found_psu = int(open(sysfs_path).read()) + if not found_psu : return '' + bus_no = '10' if index == 1 else '11' + sysfs_path = "/sys/bus/i2c/devices/" + bus_no + "-0056/eeprom" + val = (open(sysfs_path, "rb").read())[0xc4:0xd9] + return val + + def get_model(self, index): + psuid = '0' if index == 1 else '1' + sysfs_path = '/sys/devices/platform/dell-e3224f-cpld.0/psu' + psuid + '_prs' + found_psu = int(open(sysfs_path).read()) + if not found_psu : return '' + bus_no = '10' if index == 1 else '11' + sysfs_path = "/sys/bus/i2c/devices/" + bus_no + "-0056/eeprom" + val = (open(sysfs_path, "rb").read())[0x50:0x62] + return val + + def get_mfr_id(self, index): + psuid = '0' if index == 1 else '1' + sysfs_path = '/sys/devices/platform/dell-e3224f-cpld.0/psu' + psuid + '_prs' + found_psu = int(open(sysfs_path).read()) + return 'DELTA' if found_psu else '' diff --git a/device/dell/x86_64-dell_e3224f-r0/plugins/sfputil.py b/device/dell/x86_64-dell_e3224f-r0/plugins/sfputil.py new file mode 100644 index 000000000000..bccc745a4d68 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/plugins/sfputil.py @@ -0,0 +1,198 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from socket import * + from select import * + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 1 + PORT_END = 30 + PORTS_IN_BLOCK = 30 + SFP_PORT_START = 1 + SFP_PORT_END = 28 + + EEPROM_OFFSET = 14 + + _port_to_eeprom_mapping = {} + _port_i2c_mapping = { + 1: 27, + 2: 28, + 3: 29, + 4: 30, + 5: 31, + 6: 32, + 7: 33, + 8: 34, + 9: 35, + 10: 36, + 11: 37, + 12: 38, + 13: 39, + 14: 40, + 15: 41, + 16: 42, + 17: 43, + 18: 44, + 19: 45, + 20: 46, + 21: 47, + 22: 48, + 23: 49, + 24: 50, + 25: 20, + 26: 21, + 27: 22, + 28: 23, + 29: 24, + 30: 25 + } + port_dict = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self) : + return range(self.SFP_PORT_END+1, self.PORT_END+1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def get_transceiver_status(self): + + try: + sfp_modprs_path = "/sys/devices/platform/dell-e3224f-cpld.0/sfp_modprs" + reg_file = open(sfp_modprs_path) + + except IOError as e: + print ("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + + reg_file.close() + + return int(content, 16) + + + def __init__(self): + + sfpplus_eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + + for x in range(self.SFP_PORT_START, self.PORT_END + 1): + self.port_to_eeprom_mapping[x] = sfpplus_eeprom_path.format(self._port_i2c_mapping[x]) + # Get Transceiver status + self.modprs_register = self.get_transceiver_status + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + if port_num < self.SFP_PORT_START : + return False + port_num -= self.SFP_PORT_START + try: + sfp_modprs_path = "/sys/devices/platform/dell-e3224f-cpld.0/sfp_modprs" + reg_file = open(sfp_modprs_path) + except IOError as e: + print ("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ModPrsL is active low + if (reg_value & mask) == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + return False + + def set_low_power_mode(self, port_num, lpmode): + return False + + def reset(self, port_num): + return False + + def get_transceiver_change_event(self, timeout=0): + + start_time = time.time() + port = self.SFP_PORT_START + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print ('get_transceiver_change_event:Invalid timeout value', timeout) + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print ('get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout) + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + # Check for OIR events and return updated port_dict + reg_value = self.get_transceiver_status + if reg_value != self.modprs_register: + changed_ports = self.modprs_register ^ reg_value + while port >= self.SFP_PORT_START and port <= self.SFP_PORT_END: + + # Mask off the bit corresponding to our port + mask = (1 << (port - self.SFP_PORT_START)) + + if changed_ports & mask: + # ModPrsL is active low + if reg_value & mask == 0: + self.port_dict[port] = '1' + else: + self.port_dict[port] = '0' + + port += 1 + + # Update reg value + self.modprs_register = reg_value + return True, self.port_dict + + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, {} + print ("get_transceiver_change_event: Should not reach here.") + return False, {} diff --git a/device/dell/x86_64-dell_e3224f-r0/pmon_daemon_control.json b/device/dell/x86_64-dell_e3224f-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..4f701c3b3400 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/dell/x86_64-dell_e3224f-r0/sensors.conf b/device/dell/x86_64-dell_e3224f-r0/sensors.conf new file mode 100644 index 000000000000..987b4ad73984 --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/sensors.conf @@ -0,0 +1,58 @@ +# libsensors configuration file for Dell N3248TE +# The i2c bus portion is omit because adapter name +# changes every time when system boot up. + +bus "i2c-7" "i2c-0-mux (chan_id 5)" +bus "i2c-5" "i2c-0-mux (chan_id 3)" +bus "i2c-10" "i2c-5-mux (chan_id 0)" +bus "i2c-11" "i2c-5-mux (chan_id 1)" + +chip "tmp75-i2c-7-49" + label temp1 "Switch Near Temperature" +chip "tmp75-i2c-7-4a" + label temp1 "Switch Rear Temperature" +chip "tmp75-i2c-7-4b" + label temp1 "Front Panel PHY Temperature" +chip "tmp75-i2c-7-4c" + label temp1 "Near Front Panel Temperature" +chip "tmp75-i2c-7-4f" + label temp1 "Middle Fan Tray Temperature" + + +chip "emc2305-i2c-7-2c" + ignore fan4 + ignore fan5 + label fan1 "Fan 1 " + label fan2 "Fan 2 " + label fan3 "Fan 3 " + +chip "dps460-i2c-10-5e" + label power1 "Input Power" + label power2 "Output Power" + label curr1 "Input Current" + label curr2 "Output Current" + label in1 "Input Voltage" + ignore in2 + label in3 "Output Voltage" + label fan1 "Fan RPM" + ignore fan2 + ignore fan3 + ignore temp1 + label temp2 "FAN Airflow Temperature" + label temp3 "FAN Normal Temperature" + + +chip "dps460-i2c-11-5e" + label power1 "Input Power" + label power2 "Output Power" + label curr1 "Input Current" + label curr2 "Output Current" + label in1 "Input Voltage" + ignore in2 + label in3 "Output Voltage" + label fan1 "Fan RPM" + ignore fan2 + ignore fan3 + ignore temp1 + label temp2 "FAN Airflow Temperature" + label temp3 "FAN Normal Temperature" diff --git a/device/dell/x86_64-dell_e3224f-r0/system_health_monitoring_config.json b/device/dell/x86_64-dell_e3224f-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..dc20d412147f --- /dev/null +++ b/device/dell/x86_64-dell_e3224f-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["fan.speed","psu.temperature","psu.voltage","asic"], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault" : "blink_yellow", + "normal" : "green", + "booting": "blink_green" + } +} diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index d4289fd4e2bd..b35e69c77d36 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -20,6 +20,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELL_S6100_PLATFORM_MODULE) \ $(DELL_N3248PXE_PLATFORM_MODULE) \ $(DELL_N3248TE_PLATFORM_MODULE) \ + $(DELL_E3224F_PLATFORM_MODULE) \ $(INGRASYS_S8900_54XC_PLATFORM_MODULE) \ $(INGRASYS_S8900_64XC_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-dell.mk b/platform/broadcom/platform-modules-dell.mk index a9d2a1880b28..900ec881a5f9 100644 --- a/platform/broadcom/platform-modules-dell.mk +++ b/platform/broadcom/platform-modules-dell.mk @@ -13,6 +13,7 @@ DELL_S5248F_PLATFORM_MODULE_VERSION = 1.1 DELL_S5296F_PLATFORM_MODULE_VERSION = 1.1 DELL_N3248PXE_PLATFORM_MODULE_VERSION = 1.1 DELL_N3248TE_PLATFORM_MODULE_VERSION = 1.1 +DELL_E3224F_PLATFORM_MODULE_VERSION = 1.1 export DELL_S6000_PLATFORM_MODULE_VERSION export DELL_Z9100_PLATFORM_MODULE_VERSION @@ -27,6 +28,7 @@ export DELL_S5248F_PLATFORM_MODULE_VERSION export DELL_S5296F_PLATFORM_MODULE_VERSION export DELL_N3248PXE_PLATFORM_MODULE_VERSION export DELL_N3248TE_PLATFORM_MODULE_VERSION +export DELL_E3224F_PLATFORM_MODULE_VERSION DELL_Z9100_PLATFORM_MODULE = platform-modules-z9100_$(DELL_Z9100_PLATFORM_MODULE_VERSION)_amd64.deb $(DELL_Z9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-dell @@ -75,6 +77,10 @@ DELL_N3248TE_PLATFORM_MODULE = platform-modules-n3248te_$(DELL_N3248TE_PLATFORM_ $(DELL_N3248TE_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_n3248te_c3338-r0 $(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_N3248TE_PLATFORM_MODULE))) +DELL_E3224F_PLATFORM_MODULE = platform-modules-e3224f_$(DELL_E3224F_PLATFORM_MODULE_VERSION)_amd64.deb +$(DELL_E3224F_PLATFORM_MODULE)_PLATFORM = x86_64-dell_e3224f-r0 +$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_E3224F_PLATFORM_MODULE))) + DELL_S5296F_PLATFORM_MODULE = platform-modules-s5296f_$(DELL_S5296F_PLATFORM_MODULE_VERSION)_amd64.deb $(DELL_S5296F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_s5296f_c3538-r0 $(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_S5296F_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/control b/platform/broadcom/sonic-platform-modules-dell/debian/control index 7ba69682ed39..d3bc5767be12 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/control +++ b/platform/broadcom/sonic-platform-modules-dell/debian/control @@ -65,6 +65,11 @@ Architecture: amd64 Depends: linux-image-5.10.0-18-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp +Package: platform-modules-e3224f +Architecture: amd64 +Depends: linux-image-5.10.0-18-2-amd64-unsigned +Description: kernel modules for platform devices such as fan, led, sfp + Package: platform-modules-s5296f Architecture: amd64 Depends: linux-image-5.10.0-18-2-amd64-unsigned diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.init b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.init new file mode 100755 index 000000000000..5b0b9597524a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.init @@ -0,0 +1,39 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup S3000 board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + + /usr/local/bin/e3224f_platform.sh init + + echo "done." + ;; + +stop) + /usr/local/bin/e3224f_platform.sh deinit + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-e3224f.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.install new file mode 100644 index 000000000000..95effa8fef8f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.install @@ -0,0 +1,12 @@ +e3224f/scripts/e3224f_platform.sh usr/local/bin +e3224f/scripts/platform_sensors.py usr/local/bin +e3224f/scripts/sensors usr/bin +e3224f/scripts//portiocfg.py usr/local/bin +e3224f/scripts//ports_xcvrd_notify.py usr/local/bin +e3224f/systemd/platform-modules-e3224f.service etc/systemd/system +e3224f/cfg/e3224f-modules.conf etc/modules-load.d +common/dell_i2c_utils.sh usr/local/bin +e3224f/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-dell_e3224f-r0 +common/platform_reboot usr/share/sonic/device/x86_64-dell_e3224f-r0 +common/fw-updater /usr/local/bin +common/onie_mode_set usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.postinst b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.postinst new file mode 100644 index 000000000000..0af6928db1b0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-e3224f.postinst @@ -0,0 +1,7 @@ +# postinst script for E3224F + +# Enable Dell-E3224F-platform-service +depmod -a +systemctl enable platform-modules-e3224f.service +systemctl start platform-modules-e3224f.service +#DEBHELPER# diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/rules b/platform/broadcom/sonic-platform-modules-dell/debian/rules index 0c9b62fa559c..183e9439e0da 100755 --- a/platform/broadcom/sonic-platform-modules-dell/debian/rules +++ b/platform/broadcom/sonic-platform-modules-dell/debian/rules @@ -5,7 +5,7 @@ export INSTALL_MOD_DIR:=extra KVERSION ?= $(shell uname -r) KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= s6000 z9100 s6100 z9264f s5212f s5224f s5232f s5248f z9332f z9432f s5296f n3248pxe n3248te +MODULE_DIRS:= s6000 z9100 s6100 z9264f s5212f s5224f s5232f s5248f z9332f z9432f s5296f n3248pxe n3248te e3224f COMMON_DIR := common %: @@ -85,6 +85,10 @@ override_dh_auto_build: cd $(MOD_SRC_DIR)/$${mod}; \ python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ cd $(MOD_SRC_DIR); \ + elif [ $$mod = "e3224f" ]; then \ + cd $(MOD_SRC_DIR)/$${mod}; \ + python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR); \ fi; \ echo "making man page alias $$mod -> $$mod APIs";\ make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ @@ -187,6 +191,11 @@ override_dh_clean: rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ rm -rf $(MOD_SRC_DIR)/$${mod}/build; \ rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \ + elif [ $$mod = "e3224f" ]; then \ + rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \ + rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/build; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \ fi; \ make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ done); \ diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/cfg/e3224f-modules.conf b/platform/broadcom/sonic-platform-modules-dell/e3224f/cfg/e3224f-modules.conf new file mode 100644 index 000000000000..fac96cee335e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/cfg/e3224f-modules.conf @@ -0,0 +1,14 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +i2c-isch +i2c-ismt +i2c-dev +i2c-mux +i2c-smbus + +i2c-mux-pca954x +dell_e3224f_platform + diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/Makefile b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/Makefile new file mode 100644 index 000000000000..521bb070717c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/Makefile @@ -0,0 +1,2 @@ +obj-m := dell_e3224f_platform.o emc2305.o + diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/dell_e3224f_platform.c b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/dell_e3224f_platform.c new file mode 100644 index 000000000000..4c19f7d38760 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/dell_e3224f_platform.c @@ -0,0 +1,1563 @@ +/* Copyright (c) 2020 Dell Inc. + * dell_e3224f_platform.c - Driver for E3224F switches + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #define PSU_MODULE_BASE_NR 10 + #define FANTRAY_MODULE_BASE_NR 15 + #define SFP_MODULE_BASE_NR 20 + #define SFP_MUX_BASE_NR 8 + #define FANTRAY_MUX_BASE_NR 4 + #define PSU_MUX_BASE_NR 5 + + #define PHY_RESET_REG 0x40 + #define RESET_ALL_PHY 0x7F + #define SYS_CTRL_REG 0x15 + #define POWER_CYCLE_SYS 0x1 + #define CPLD_DEVICE_NUM 3 + #define PF_MUX_DEVICES 3 + #define SYS_MISC_CTRL_REG 0x0B + + #define FAN_0 0 + #define FAN_1 1 + #define FAN_2 2 + + static int get_i2c_adapter_name(void); + + static void device_release(struct device *dev) + { + return; + } + + /* + * E3224F CPLD + */ + + enum cpld_type { + cpu_cpld, + sys_cpld, + port_cpld, + }; + + struct cpld_platform_data { + int reg_addr; + struct i2c_client *client; + }; + + static struct cpld_platform_data e3224f_cpld_platform_data[] = { + [cpu_cpld] = { + .reg_addr = 0x31, + }, + + [sys_cpld] = { + .reg_addr = 0x32, + }, + + [port_cpld] = { + .reg_addr = 0x34, + }, + }; + + static struct platform_device e3224f_cpld = { + .name = "dell-e3224f-cpld", + .id = 0, + .dev = { + .platform_data = e3224f_cpld_platform_data, + .release = device_release + }, + }; + + /* + * E3224F MUX + */ + + struct mux_platform_data { + int parent; + int base_nr; + int reg_addr; + struct i2c_client *cpld; + int no_of_buses; + int mux_offset; + }; + + struct pf_mux { + struct mux_platform_data data; + }; + + static struct mux_platform_data e3224f_mux_platform_data[] = { + { + .parent = SFP_MUX_BASE_NR, + .base_nr = SFP_MODULE_BASE_NR, + .cpld = NULL, + .reg_addr = 0x11, + .no_of_buses = 31, + .mux_offset = 1, + }, + { + .parent = FANTRAY_MUX_BASE_NR, + .base_nr = FANTRAY_MODULE_BASE_NR, + .cpld = NULL, + .reg_addr = 0x13, + .no_of_buses = 3, + .mux_offset = 1, + }, + { + .parent = PSU_MUX_BASE_NR, + .base_nr = PSU_MODULE_BASE_NR, + .cpld = NULL, + .reg_addr = 0x12, + .no_of_buses = 2, + .mux_offset = 1, + }, + }; + + static struct platform_device e3224f_mux[] = { + { + .name = "dell-e3224f-mux", + .id = 0, + .dev = { + .platform_data = &e3224f_mux_platform_data[0], + .release = device_release, + }, + }, + { + .name = "dell-e3224f-mux", + .id = 1, + .dev = { + .platform_data = &e3224f_mux_platform_data[1], + .release = device_release, + }, + }, + { + .name = "dell-e3224f-mux", + .id = 2, + .dev = { + .platform_data = &e3224f_mux_platform_data[2], + .release = device_release, + }, + }, + }; + + static int cpld_reg_write_byte(struct i2c_client *client, u8 regaddr, u8 val) + { + union i2c_smbus_data data; + + data.byte = val; + return client->adapter->algo->smbus_xfer(client->adapter, client->addr, + client->flags, + I2C_SMBUS_WRITE, + regaddr, I2C_SMBUS_BYTE_DATA, &data); + } + + static int mux_select(struct i2c_mux_core *muxc, u32 chan) + { + struct pf_mux *mux = i2c_mux_priv(muxc); + u8 chan_data = chan + mux->data.mux_offset; + + return cpld_reg_write_byte(mux->data.cpld, mux->data.reg_addr, chan_data); + } + + static int __init mux_probe(struct platform_device *pdev) + { + struct i2c_mux_core *muxc; + struct pf_mux *mux; + struct mux_platform_data *pdata; + struct i2c_adapter *parent; + int i, ret; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + return -ENODEV; + } + + mux = devm_kzalloc(&pdev->dev, sizeof(*mux), GFP_KERNEL); + if (!mux) { + return -ENOMEM; + } + + mux->data = *pdata; + + parent = i2c_get_adapter(pdata->parent); + if (!parent) { + dev_err(&pdev->dev, "Parent adapter (%d) not found\n", + pdata->parent); + return -EPROBE_DEFER; + } + + muxc = i2c_mux_alloc(parent, &pdev->dev, pdata->no_of_buses, 0, 0, + mux_select, NULL); + if (!muxc) { + ret = -ENOMEM; + goto alloc_failed; + } + muxc->priv = mux; + + platform_set_drvdata(pdev, muxc); + + for (i = 0; i < pdata->no_of_buses; i++) { + int nr = pdata->base_nr + i; + unsigned int class = 0; + + ret = i2c_mux_add_adapter(muxc, nr, i, class); + if (ret) { + dev_err(&pdev->dev, "Failed to add adapter %d\n", i); + goto add_adapter_failed; + } + } + + return 0; + + add_adapter_failed: + i2c_mux_del_adapters(muxc); + alloc_failed: + i2c_put_adapter(parent); + + return ret; + } + + static int mux_remove(struct platform_device *pdev) + { + struct i2c_mux_core *muxc = platform_get_drvdata(pdev); + + i2c_mux_del_adapters(muxc); + + i2c_put_adapter(muxc->parent); + + return 0; + } + + static struct platform_driver mux_driver = { + .probe = mux_probe, + .remove = mux_remove, + .driver = { + .owner = THIS_MODULE, + .name = "dell-e3224f-mux", + }, + }; + + static ssize_t sfp_modprs_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + int i; + s32 ret = 0; + uint32_t data=0; + struct cpld_platform_data *pdata = dev->platform_data; + + for (i=0;i<=2;i++) { + ret = i2c_smbus_read_byte_data(pdata[port_cpld].client, 0x10+i); + if (ret < 0) + return sprintf(buf, "read error"); + + data = data + ret << (8*i); + //printk(KERN_WARNING "sfp_modprs_show %d %x %x\n",i,ret,data); + } + + return sprintf(buf, "0x%x\n", data); + } + + static ssize_t sfp_txdis_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + int i; + s32 ret = 0; + uint32_t data=0; + struct cpld_platform_data *pdata = dev->platform_data; + + for (i=0;i<=2;i++) { + ret = i2c_smbus_read_byte_data(pdata[port_cpld].client, 0x14+i); + if (ret < 0) + return sprintf(buf, "read error"); + + data = data + (ret << (8*i)); + //printk(KERN_WARNING "sfp_txdis_show %d %x %x\n",i,ret,data); + } + return sprintf(buf, "0x%x\n", (uint32_t)data); + } + + static ssize_t sfp_txdis_store (struct device *dev, struct device_attribute *devattr, const char *buf, size_t size) + { + int i; + s32 ret = 0; + long value=0; + u8 data; + struct cpld_platform_data *pdata = dev->platform_data; + ssize_t status; + + status = kstrtol(buf, 0, &value); + printk(KERN_WARNING "sfp_txdis_store %x\n",value); + if (status == 0) { + + for (i=0;i<=2;i++) { + ret = i2c_smbus_read_byte_data(pdata[port_cpld].client, 0x14+i); + if (ret < 0) + return sprintf(buf, "read error"); + + data = ((value >> (8*i)) & 0xFF); + printk(KERN_WARNING " txdis [%d] read[%x] data[%x]\n",i,ret,data); + + if (ret != data) { + printk(KERN_WARNING " txdis write [%d] \n",i); + status = i2c_smbus_write_byte_data(pdata[port_cpld].client, 0x14+i, data); + if (status < 0) + printk(KERN_WARNING " txdis failed to set [%d] data[%x]\n",i,data); + } + } + status = size; + } + return status; + } + + static ssize_t sfp_rxlos_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + int i; + s32 ret = 0; + uint32_t data=0; + struct cpld_platform_data *pdata = dev->platform_data; + + for (i=0;i<=2;i++) { + ret = i2c_smbus_read_byte_data(pdata[port_cpld].client, 0x18+i); + if (ret < 0) + return sprintf(buf, "read error"); + + data = data + (ret << (8*i)); + printk(KERN_WARNING "sfp_rxlos_show %d %x %x\n",i,ret,data); + } + return sprintf(buf, "0x%x\n", (uint32_t)data); + } + + static ssize_t sfp_txfault_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + int i; + s32 ret = 0; + uint32_t data=0; + struct cpld_platform_data *pdata = dev->platform_data; + + for (i=0;i<=2;i++) { + ret = i2c_smbus_read_byte_data(pdata[port_cpld].client, 0x1C+i); + if (ret < 0) + return sprintf(buf, "read error"); + + data = data + (ret << (8*i)); + printk(KERN_WARNING "sfp_txfault_show %d %x %x\n",i,ret,data); + } + return sprintf(buf, "0x%x\n", (uint32_t)data); + } + + static ssize_t sfpplus_modprs_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x30); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", (u8)ret); + } + + static ssize_t sfpplus_txdis_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x31); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", (u8)ret); + } + + static ssize_t sfpplus_txdis_store (struct device *dev, struct device_attribute *devattr, const char *buf, size_t size) + { + long value; + struct cpld_platform_data *pdata = dev->platform_data; + s32 ret; + u8 data; + ssize_t status; + + status = kstrtol(buf, 0, &value); + if (status == 0) { + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x31); + if (ret < 0) + return ret; + data = (u8)ret & ~(0x0F); + data = data | (value & 0x0F); + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x31, data); + if (ret < 0) + return ret; + + status = size; + } + + return status; + } + + static ssize_t sfpplus_rxlos_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x32); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", (u8)ret); + } + + static ssize_t sfpplus_txfault_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x33); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", (u8)ret); + } + + static ssize_t qsfp_modprs_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x20); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", (u8)ret); + } + + static ssize_t qsfp_rst_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x21); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", (u8)ret); + } + + static ssize_t qsfp_rst_store (struct device *dev, struct device_attribute *devattr, const char *buf, size_t size) + { + long value; + struct cpld_platform_data *pdata = dev->platform_data; + s32 ret; + u8 data; + ssize_t status; + + status = kstrtol(buf, 0, &value); + if (status == 0) { + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x21); + if (ret < 0) + return ret; + data = (u8)ret & ~(0x0F); + data = data | (value & 0x0F); + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x21, data); + if (ret < 0) + return ret; + + status = size; + } + + return status; + } + + static ssize_t qsfp_lpmode_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x22); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", (u8)ret); + } + + static ssize_t qsfp_lpmode_store (struct device *dev, struct device_attribute *devattr, const char *buf, size_t size) + { + long value; + struct cpld_platform_data *pdata = dev->platform_data; + s32 ret; + u8 data; + ssize_t status; + + status = kstrtol(buf, 0, &value); + if (status == 0) { + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x22); + if (ret < 0) + return ret; + data = (u8)ret & ~(0x0F); + data = data | (value & 0x0F); + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x22, data); + if (ret < 0) + return ret; + + status = size; + } + + return status; + } + + static ssize_t reboot_cause_show (struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + u8 data; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x10); + if (ret < 0) + return sprintf(buf, "read error"); + + data = (u8)ret; + return sprintf(buf, "0x%x\n", data); + } + + static ssize_t reboot_cause_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) + { + unsigned long data; + s32 status, ret; + struct cpld_platform_data *pdata = dev->platform_data; + + status = kstrtoul(buf, 0, &data); + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x10, (u8)(data)); + if (ret < 0) + return ret; + return count; + } + + static ssize_t power_reset_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) + { + unsigned long data; + s32 err; + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 10, &data); + if (err) + return err; + + if (data) + { + i2c_smbus_write_byte_data(pdata[sys_cpld].client, SYS_CTRL_REG, (u8)(POWER_CYCLE_SYS)); + } + + return count; + } + + static ssize_t power_reset_show(struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, SYS_CTRL_REG); + if (ret < 0) + return sprintf(buf, "read error"); + + return sprintf(buf, "0x%x\n", ret); + } + + static ssize_t fan_dir_show(struct device *dev, struct device_attribute *devattr, char *buf) + { + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + struct sensor_device_attribute *sa = to_sensor_dev_attr(devattr); + int index = sa->index; + u8 mask = 1 << (index+4); + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0xA); + if (ret < 0) + return sprintf(buf, "read error"); + data = (u8)((ret & mask) >> (index+4)); + + return sprintf(buf, "%s\n", data? "B2F" : "F2B"); +} + +static ssize_t fan_prs_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + struct sensor_device_attribute *sa = to_sensor_dev_attr(devattr); + int index = sa->index; + uint8_t mask = 1 << index; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0xA); + if (ret < 0) + return sprintf(buf, "read error"); + data = (u32)((ret & mask) >> index); + + data = ~data & 0x1; + + return sprintf(buf, "0x%x\n", data); +} + +static ssize_t psu0_prs_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0xC); + if (ret < 0) + return sprintf(buf, "read error"); + + if (!(ret & 0x80)) + data = 1; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t psu1_prs_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0xC); + if (ret < 0) + return sprintf(buf, "read error"); + + if (!(ret & 0x08)) + data = 1; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t psu0_status_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0xC); + if (ret < 0) + return sprintf(buf, "read error"); + + if ((ret & 0x40)) + data = 1; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t psu1_status_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0xC); + if (ret < 0) + return sprintf(buf, "read error"); + + if ((ret & 0x04)) + data = 1; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t fani_led_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + struct sensor_device_attribute *sa = to_sensor_dev_attr(devattr); + int index = sa->index; + uint8_t mask = 3 << (index*2); + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x9); + if (ret < 0) + return sprintf(buf, "read error"); + + data = (u32)(ret & mask) >> (index*2); + + switch (data) + { + case 0: + ret = sprintf(buf, "off\n"); + break; + case 1: + ret = sprintf(buf, "green\n"); + break; + case 2: + ret = sprintf(buf, "amber\n"); + break; + default: + ret = sprintf(buf, "unknown\n"); + } + + return ret; +} + +static ssize_t fani_led_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret; + u8 mask, data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + struct sensor_device_attribute *sa = to_sensor_dev_attr(devattr); + int index = sa->index; + + if (!strncmp(buf, "off", 3)) + { + data = 0; + } + else if (!strncmp(buf, "amber", 5)) + { + data = 2; + } + else if (!strncmp(buf, "green", 5)) + { + data = 1; + } + else + { + return -1; + } + + + mask = ~((uint8_t)(3 << (index*2))); + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x9); + if (ret < 0) + return ret; + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x9, (u8)((ret & mask) | (data << (index * 2)))); + if (ret < 0) + return ret; + + return count; +} + +static ssize_t system_led_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + + data = (u8)(ret & 0x30) >> 4; + + switch (data) + { + case 0: + ret = sprintf(buf, "blink_green\n"); + break; + case 1: + ret = sprintf(buf, "green\n"); + break; + case 2: + ret = sprintf(buf, "yellow\n"); + break; + default: + ret = sprintf(buf, "blink_yellow\n"); + } + + return ret; +} + +static ssize_t system_led_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + if (!strncmp(buf, "blink_green", 11)) + { + data = 0; + } + else if (!strncmp(buf, "green", 5)) + { + data = 1; + } + else if (!strncmp(buf, "yellow", 6)) + { + data = 2; + } + else if (!strncmp(buf, "blink_yellow", 12)) + { + data = 3; + } + else + { + return -1; + } + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return ret; + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x7, (u8)((ret & 0xCF) | (data << 4))); + if (ret < 0) + return ret; + + return count; +} + +static ssize_t watchdog_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "%x\n", data); +} + +static ssize_t watchdog_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret, err; + unsigned long val; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + + data = (u8) val; + if (data) + { + ret = i2c_smbus_write_byte_data(pdata[cpu_cpld].client, 0x7, data); + if (ret < 0) + return ret; + } + + return count; +} + +static ssize_t locator_led_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + + data = (u32)(ret & 0x08) >> 3; + + switch (data) + { + case 0: + ret = sprintf(buf, "off\n"); + break; + case 1: + ret = sprintf(buf, "blink_blue\n"); + break; + default: + ret = sprintf(buf, "invalid\n"); + } + + return ret; +} + +static ssize_t locator_led_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + if (!strncmp(buf, "off", 3)) + { + data = 0; + } + else if (!strncmp(buf, "blink_blue", 10)) + { + data = 1; + } + else + { + return -1; + } + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return ret; + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x7, (u8)((ret & 0xF7) | (data << 3))); + if (ret < 0) + return ret; + + return count; +} + +static ssize_t power_led_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + + data = (u32)(ret & 0x06) >> 1; + + switch (data) + { + case 0: + ret = sprintf(buf, "off\n"); + break; + case 1: + ret = sprintf(buf, "yellow\n"); + break; + case 2: + ret = sprintf(buf, "green\n"); + break; + default: + ret = sprintf(buf, "blink_yellow\n"); + } + + return ret; +} + +static ssize_t power_led_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + if (!strncmp(buf, "off", 3)) + { + data = 0; + } + else if (!strncmp(buf, "yellow", 6)) + { + data = 1; + } + else if (!strncmp(buf, "green", 5)) + { + data = 2; + } + else if (!strncmp(buf, "blink_yellow", 12)) + { + data = 3; + } + else + { + return -1; + } + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return ret; + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x7, (u8)((ret & 0xF9) | (data << 1))); + if (ret < 0) + return ret; + + return count; +} + +static ssize_t primary_led_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + + data = (u32)(ret & 0x1); + + switch (data) + { + case 0: + ret = sprintf(buf, "green\n"); + break; + default: + ret = sprintf(buf, "off\n"); + break; + } + + return ret; +} + +static ssize_t primary_led_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + if (!strncmp(buf, "green", 5)) + { + data = 0; + } + else if (!strncmp(buf, "off", 3)) + { + data = 1; + } + else + { + return -1; + } + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return ret; + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x7, (u8)((ret & 0xFE) | data)); + if (ret < 0) + return ret; + + return count; +} + +static ssize_t fan_led_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + + data = (u8)(ret & 0xC0) >> 6; + + switch (data) + { + case 0: + ret = sprintf(buf, "off\n"); + break; + case 1: + ret = sprintf(buf, "yellow\n"); + break; + case 2: + ret = sprintf(buf, "green\n"); + break; + default: + ret = sprintf(buf, "blink_yellow\n"); + } + + return ret; +} + +static ssize_t fan_led_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + if (!strncmp(buf, "off", 3)) + { + data = 0; + } + else if (!strncmp(buf, "yellow", 6)) + { + data = 1; + } + else if (!strncmp(buf, "green", 5)) + { + data = 2; + } + else if (!strncmp(buf, "blink_yellow", 12)) + { + data = 3; + } + else + { + return -1; + } + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x7); + if (ret < 0) + return ret; + + ret = i2c_smbus_write_byte_data(pdata[sys_cpld].client, 0x7, (u8)((ret & 0x3F) | (data << 6))); + if (ret < 0) + return ret; + + return count; +} + + +static ssize_t power_good_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 pwr_good1 = 0; + u8 pwr_good2 = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, 0xc); + if (ret < 0) + return sprintf(buf, "read error"); + pwr_good1 = ret; + + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, 0xd); + if (ret < 0) + return sprintf(buf, "read error"); + pwr_good2 = ret; + + return sprintf(buf, "0x%x\n", (pwr_good1 == 0xFF && (pwr_good2 & 0x1F) == 0x1F)); +} + +static ssize_t cpu_cpld_mjr_ver_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, 0x1); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "0x%x\n", data); +} + +static ssize_t cpu_cpld_mnr_ver_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, 0x0); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "0x%x\n", data); +} + +static ssize_t sys_cpld_mjr_ver_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x1); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "0x%x\n", data); +} + +static ssize_t sys_cpld_mnr_ver_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[sys_cpld].client, 0x0); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "0x%x\n", data); +} + +static ssize_t port_cpld_mjr_ver_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[port_cpld].client, 0x1); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + printk(KERN_WARNING "port_cpld_mjr_ver_show %d\n",ret); + + return sprintf(buf, "0x%x\n", data); +} + +static ssize_t port_cpld_mnr_ver_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[port_cpld].client, 0x0); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "0x%x\n", data); +} + +static DEVICE_ATTR_RW(sfp_txdis); +static DEVICE_ATTR_RO(sfp_modprs); +static DEVICE_ATTR_RO(sfp_rxlos); +static DEVICE_ATTR_RO(sfp_txfault); +static DEVICE_ATTR_RW(sfpplus_txdis); +static DEVICE_ATTR_RO(sfpplus_modprs); +static DEVICE_ATTR_RO(sfpplus_rxlos); +static DEVICE_ATTR_RO(sfpplus_txfault); +static DEVICE_ATTR_RO(qsfp_modprs); +static DEVICE_ATTR_RW(qsfp_rst); +static DEVICE_ATTR_RW(qsfp_lpmode); +static DEVICE_ATTR_RW(reboot_cause); +static DEVICE_ATTR_RW(power_reset); +static DEVICE_ATTR_RO(psu0_prs); +static DEVICE_ATTR_RO(psu1_prs); +static DEVICE_ATTR_RO(psu0_status); +static DEVICE_ATTR_RO(psu1_status); +static DEVICE_ATTR_RW(system_led); +static DEVICE_ATTR_RW(watchdog); +static DEVICE_ATTR_RW(locator_led); +static DEVICE_ATTR_RW(power_led); +static DEVICE_ATTR_RW(primary_led); +static DEVICE_ATTR_RW(fan_led); +static DEVICE_ATTR_RO(power_good); +static DEVICE_ATTR_RO(cpu_cpld_mjr_ver); +static DEVICE_ATTR_RO(cpu_cpld_mnr_ver); +static DEVICE_ATTR_RO(sys_cpld_mjr_ver); +static DEVICE_ATTR_RO(sys_cpld_mnr_ver); +static DEVICE_ATTR_RO(port_cpld_mjr_ver); +static DEVICE_ATTR_RO(port_cpld_mnr_ver); + +static SENSOR_DEVICE_ATTR(fan0_dir, S_IRUGO, fan_dir_show, NULL, FAN_0); +static SENSOR_DEVICE_ATTR(fan1_dir, S_IRUGO, fan_dir_show, NULL, FAN_1); +static SENSOR_DEVICE_ATTR(fan2_dir, S_IRUGO, fan_dir_show, NULL, FAN_2); +static SENSOR_DEVICE_ATTR(fan0_prs, S_IRUGO, fan_prs_show, NULL, FAN_0); +static SENSOR_DEVICE_ATTR(fan1_prs, S_IRUGO, fan_prs_show, NULL, FAN_1); +static SENSOR_DEVICE_ATTR(fan2_prs, S_IRUGO, fan_prs_show, NULL, FAN_2); +static SENSOR_DEVICE_ATTR(fan0_led, S_IRUGO | S_IWUSR, fani_led_show, fani_led_store, FAN_0); +static SENSOR_DEVICE_ATTR(fan1_led, S_IRUGO | S_IWUSR, fani_led_show, fani_led_store, FAN_1); +static SENSOR_DEVICE_ATTR(fan2_led, S_IRUGO | S_IWUSR, fani_led_show, fani_led_store, FAN_2); + +static struct attribute *e3224f_cpld_attrs[] = { + &dev_attr_sfp_txdis.attr, + &dev_attr_sfp_modprs.attr, + &dev_attr_sfp_rxlos.attr, + &dev_attr_sfp_txfault.attr, + &dev_attr_sfpplus_txdis.attr, + &dev_attr_sfpplus_modprs.attr, + &dev_attr_sfpplus_rxlos.attr, + &dev_attr_sfpplus_txfault.attr, + &dev_attr_qsfp_modprs.attr, + &dev_attr_qsfp_rst.attr, + &dev_attr_qsfp_lpmode.attr, + &dev_attr_reboot_cause.attr, + &dev_attr_power_reset.attr, + &sensor_dev_attr_fan0_dir.dev_attr.attr, + &sensor_dev_attr_fan1_dir.dev_attr.attr, + &sensor_dev_attr_fan2_dir.dev_attr.attr, + &sensor_dev_attr_fan0_prs.dev_attr.attr, + &sensor_dev_attr_fan1_prs.dev_attr.attr, + &sensor_dev_attr_fan2_prs.dev_attr.attr, + &sensor_dev_attr_fan0_led.dev_attr.attr, + &sensor_dev_attr_fan1_led.dev_attr.attr, + &sensor_dev_attr_fan2_led.dev_attr.attr, + &dev_attr_psu0_prs.attr, + &dev_attr_psu1_prs.attr, + &dev_attr_psu0_status.attr, + &dev_attr_psu1_status.attr, + &dev_attr_system_led.attr, + &dev_attr_watchdog.attr, + &dev_attr_locator_led.attr, + &dev_attr_power_led.attr, + &dev_attr_primary_led.attr, + &dev_attr_fan_led.attr, + &dev_attr_power_good.attr, + &dev_attr_cpu_cpld_mjr_ver.attr, + &dev_attr_cpu_cpld_mnr_ver.attr, + &dev_attr_sys_cpld_mjr_ver.attr, + &dev_attr_sys_cpld_mnr_ver.attr, + &dev_attr_port_cpld_mjr_ver.attr, + &dev_attr_port_cpld_mnr_ver.attr, + NULL, +}; + +static struct attribute_group e3224f_cpld_attr_grp = { + .attrs = e3224f_cpld_attrs, +}; + +static int get_ismt_base_nr(void) +{ + struct i2c_adapter *ismt_adap; + static int ismt_base_nr = -1; + + if (ismt_base_nr != -1) { + return ismt_base_nr; + } + for (ismt_base_nr = 0; ismt_base_nr < 2; ismt_base_nr++) { + ismt_adap = i2c_get_adapter(ismt_base_nr); + if (!ismt_adap) { + printk(KERN_WARNING "iSMT adapter (%d) not found\n", ismt_base_nr); + return -ENODEV; + } + if (!strstr(ismt_adap->name, "iSMT adapter")) { + i2c_put_adapter(ismt_adap); + printk("I2C %d adapter is %s\n", ismt_base_nr, ismt_adap->name); + } else { + i2c_put_adapter(ismt_adap); + return ismt_base_nr; + } + } + return -ENODEV; +} + +static int get_port_mux_base_nr(void) +{ + struct i2c_adapter *mux_adap; + static int mux_base_nr = -1; + + if (mux_base_nr != -1) { + return mux_base_nr; + } + for (mux_base_nr = 0; mux_base_nr < 10; mux_base_nr++) { + mux_adap = i2c_get_adapter(mux_base_nr); + if (!mux_adap) { + printk(KERN_WARNING "I2C adapter (%d) not found\n", mux_base_nr); + continue; + } + if (!strstr(mux_adap->name, "mux (chan_id 0)")) { + i2c_put_adapter(mux_adap); + printk("I2C %d adapter is %s\n", mux_base_nr, mux_adap->name); + } else { + i2c_put_adapter(mux_adap); + return mux_base_nr; + } + } + return -ENODEV; +} + +static int __init cpld_probe(struct platform_device *pdev) +{ + struct cpld_platform_data *pdata; + struct i2c_adapter *parent; + int i, cpld_bus, port_cpld_bus; + int ret; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + return -ENODEV; + } + + cpld_bus = get_ismt_base_nr(); + if (cpld_bus < 0) { + return -ENODEV; + } + parent = i2c_get_adapter(cpld_bus); + if (!parent) { + printk(KERN_WARNING "Parent adapter (%d) not found\n", cpld_bus); + return -ENODEV; + } + + for (i = 0; i < (CPLD_DEVICE_NUM - 1); i++) { // cpu and sys cpld + pdata[i].client = i2c_new_dummy_device(parent, pdata[i].reg_addr); + if (!pdata[i].client) { + printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[i].reg_addr); + goto error; + } + } + + // PORT CPLD + port_cpld_bus = get_port_mux_base_nr(); + if (port_cpld_bus < 0) { + return -ENODEV; + } + parent = i2c_get_adapter(port_cpld_bus); + if (!parent) { + printk(KERN_WARNING "Parent adapter (port_cpld) not found\n"); + return -ENODEV; + } + else + { + printk (KERN_WARNING "Parent adapter (port_cpld) FOUND \n"); + } + pdata[port_cpld].client = i2c_new_dummy_device(parent, pdata[port_cpld].reg_addr); + if (!pdata[port_cpld].client) { + printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[port_cpld].reg_addr); + goto error; + } + + ret = sysfs_create_group(&pdev->dev.kobj, &e3224f_cpld_attr_grp); + if (ret) + goto error; + + return 0; + +error: + i--; + for (; i >= 0; i--) { + if (pdata[i].client) { + i2c_unregister_device(pdata[i].client); + } + } + + i2c_put_adapter(parent); + + return -ENODEV; +} + +static int __exit cpld_remove(struct platform_device *pdev) +{ + int i; + struct i2c_adapter *parent = NULL; + struct cpld_platform_data *pdata = pdev->dev.platform_data; + + sysfs_remove_group(&pdev->dev.kobj, &e3224f_cpld_attr_grp); + + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + } else { + for (i = 0; i < CPLD_DEVICE_NUM; i++) { + if (pdata[i].client) { + if (!parent) { + parent = (pdata[i].client)->adapter; + } + i2c_unregister_device(pdata[i].client); + } + } + } + + i2c_put_adapter(parent); + + return 0; +} + +static struct platform_driver cpld_driver = { + .probe = cpld_probe, + .remove = __exit_p(cpld_remove), + .driver = { + .owner = THIS_MODULE, + .name = "dell-e3224f-cpld", + }, +}; + +static struct i2c_board_info sys_board_mux[] = { + { + I2C_BOARD_INFO("pca9548", 0x71) + } +}; + +static int __init dell_e3224f_platform_init(void) +{ + int ret = 0; + struct i2c_adapter *sys_i2c_adap; + struct i2c_client *mux_i2c_cli; + struct cpld_platform_data *cpld_pdata; + struct mux_platform_data *pdata; + int i, sys_i2c_bus; + + printk("dell_e3224f_platform module initialization\n"); + sys_i2c_bus = get_ismt_base_nr(); + if (sys_i2c_bus < 0) { + return -ENODEV; + } + + sys_i2c_adap = i2c_get_adapter(sys_i2c_bus); + mux_i2c_cli = i2c_new_client_device(sys_i2c_adap, sys_board_mux); + if (!mux_i2c_cli) + return PTR_ERR_OR_ZERO(mux_i2c_cli); + + ret = platform_driver_register(&cpld_driver); + if (ret) { + printk(KERN_WARNING "Fail to register cpld driver\n"); + goto error_cpld_driver; + } + + ret = platform_driver_register(&mux_driver); + if (ret) { + printk(KERN_WARNING "Fail to register mux driver\n"); + goto error_mux_driver; + } + + ret = platform_device_register(&e3224f_cpld); + if (ret) { + printk(KERN_WARNING "Fail to create cpld device\n"); + goto error_cpld; + } + + cpld_pdata = e3224f_cpld.dev.platform_data; + + for (i = 0; i < PF_MUX_DEVICES; i++) { + pdata = e3224f_mux[i].dev.platform_data; + pdata->cpld = cpld_pdata[sys_cpld].client; + ret = platform_device_register(&e3224f_mux[i]); + if (ret) { + printk(KERN_WARNING "fail to create mux %d\n", i); + goto error_mux; + } + } + ret = i2c_smbus_write_byte_data(cpld_pdata[sys_cpld].client, PHY_RESET_REG, RESET_ALL_PHY); + if (ret) + goto error_mux; + + /* To enable FAN set FAN_EN bit (Set bit 0 to 1) in SYS_MISC_CTRL: 0x0B by read modify write. */ + ret = i2c_smbus_read_byte_data(cpld_pdata[sys_cpld].client, SYS_MISC_CTRL_REG); + if (ret < 0) + goto error_mux; + ret = i2c_smbus_write_byte_data(cpld_pdata[sys_cpld].client, SYS_MISC_CTRL_REG, (u8)(ret | 0x01)); + if (ret) + goto error_mux; + + return 0; + +error_mux: + i--; + for (; i >= 0; i--) { + platform_device_unregister(&e3224f_mux[i]); + } + platform_device_unregister(&e3224f_cpld); +error_cpld: + platform_driver_unregister(&mux_driver); +error_mux_driver: + platform_driver_unregister(&cpld_driver); +error_cpld_driver: + return ret; +} + +static void __exit dell_e3224f_platform_exit(void) +{ + int i; + + for (i = 0; i < PF_MUX_DEVICES; i++) + platform_device_unregister(&e3224f_mux[i]); + platform_device_unregister(&e3224f_cpld); + platform_driver_unregister(&cpld_driver); + platform_driver_unregister(&mux_driver); +} + +module_init(dell_e3224f_platform_init); +module_exit(dell_e3224f_platform_exit); + +MODULE_DESCRIPTION("DELL E3224F Platform Support"); +MODULE_AUTHOR("Dhanakumar Subramanian "); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/emc2305.c b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/emc2305.c new file mode 100644 index 000000000000..7a3f3351059e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/emc2305.c @@ -0,0 +1,1203 @@ +/* + * emc2305.c - hwmon driver for SMSC EMC2305 fan controller + * (C) Copyright 2013 + * Reinhard Pfau, Guntermann & Drunck GmbH + * + * Based on emc2103 driver by SMSC. + * + * Datasheet available at: + * http://www.smsc.com/Downloads/SMSC/Downloads_Public/Data_Sheets/2305.pdf + * + * Also supports the EMC2303 fan controller which has the same functionality + * and register layout as EMC2305, but supports only up to 3 fans instead of 5. + * + * Also supports EMC2302 (up to 2 fans) and EMC2301 (1 fan) fan controller. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Addresses scanned. + * Listed in the same order as they appear in the EMC2305, EMC2303 data sheets. + * + * Note: these are the I2C adresses which are possible for EMC2305 and EMC2303 + * chips. + * The EMC2302 supports only 0x2e (EMC2302-1) and 0x2f (EMC2302-2). + * The EMC2301 supports only 0x2f. + */ +static const unsigned short i2c_adresses[] = { + 0x2E, + 0x2F, + 0x2C, + 0x2D, + 0x4C, + 0x4D, + I2C_CLIENT_END +}; + +/* + * global registers + */ +enum { + REG_CONFIGURATION = 0x20, + REG_FAN_STATUS = 0x24, + REG_FAN_STALL_STATUS = 0x25, + REG_FAN_SPIN_STATUS = 0x26, + REG_DRIVE_FAIL_STATUS = 0x27, + REG_FAN_INTERRUPT_ENABLE = 0x29, + REG_PWM_POLARITY_CONFIG = 0x2a, + REG_PWM_OUTPUT_CONFIG = 0x2b, + REG_PWM_BASE_FREQ_1 = 0x2c, + REG_PWM_BASE_FREQ_2 = 0x2d, + REG_SOFTWARE_LOCK = 0xef, + REG_PRODUCT_FEATURES = 0xfc, + REG_PRODUCT_ID = 0xfd, + REG_MANUFACTURER_ID = 0xfe, + REG_REVISION = 0xff +}; + +/* + * fan specific registers + */ +enum { + REG_FAN_SETTING = 0x30, + REG_PWM_DIVIDE = 0x31, + REG_FAN_CONFIGURATION_1 = 0x32, + REG_FAN_CONFIGURATION_2 = 0x33, + REG_GAIN = 0x35, + REG_FAN_SPIN_UP_CONFIG = 0x36, + REG_FAN_MAX_STEP = 0x37, + REG_FAN_MINIMUM_DRIVE = 0x38, + REG_FAN_VALID_TACH_COUNT = 0x39, + REG_FAN_DRIVE_FAIL_BAND_LOW = 0x3a, + REG_FAN_DRIVE_FAIL_BAND_HIGH = 0x3b, + REG_TACH_TARGET_LOW = 0x3c, + REG_TACH_TARGET_HIGH = 0x3d, + REG_TACH_READ_HIGH = 0x3e, + REG_TACH_READ_LOW = 0x3f, +}; + +#define SEL_FAN(fan, reg) (reg + fan * 0x10) + +/* + * Factor by equations [2] and [3] from data sheet; valid for fans where the + * number of edges equals (poles * 2 + 1). + */ + +#define EMC2305_TACH_FREQ 32768 /* 32.768KHz */ +#define EMC2305_RPM_CONST_VAL 60 + +#define EMC2305_FAN_CONFIG_RANGE_MASK 0x60 +#define TACH_READING_DEFAULT_VAL 0xFFF8 +#define EMC2305_PERCENT_VAL 100 +#define EMC2305_FAN_SETTING_MAX_VAL 0xff +#define EMC2305_FAN_WATCHDOG_STATUS_MASK 0x80 + +#define FAN_MAX_RPM_SPEED 28600 +#define TACH_VALUE_SHIFT_BITS 3 +#define SPEED_PWM_LEN_STRING 7 + +struct emc2305_fan_data { + bool enabled; + bool valid; + unsigned long last_updated; + bool rpm_control; + uint8_t multiplier; + uint8_t poles; + uint16_t target; + uint16_t tach; + uint16_t rpm_factor; + uint8_t pwm; + uint8_t ranges; + uint8_t edges; +}; + +struct emc2305_data { + struct device *hwmon_dev; + struct mutex update_lock; + int fans; + struct emc2305_fan_data fan[5]; +}; + +/* Fault status registers */ +static const uint8_t emc2305_fault_status_reg[] = { REG_FAN_STATUS, + REG_FAN_STALL_STATUS, + REG_FAN_SPIN_STATUS, + REG_DRIVE_FAIL_STATUS }; + +/* + * @brief Convert speed percentage value to volt. + * @param percent[in] - RPM speed in percent + * Return - corresponding voltage value. + */ +static uint8_t emc2305_speed_percent_to_drv_volt_get(uint8_t percent) +{ + return ((percent * EMC2305_FAN_SETTING_MAX_VAL) / EMC2305_PERCENT_VAL); +} + +/* + * @brief Convert RPM to speed percentage. + * @param max_speed[in] - Max Fan speed. + * @param rpm[in] - RPM value. + * Return - corresponding speed_percent value. + */ +static uint8_t emc2305_rpm_to_speed_percent_get(uint32_t max_speed, long rpm) +{ + return ((rpm * EMC2305_PERCENT_VAL) / max_speed); +} + +/** + * @brief This function calculates the tach count based on the passed parameters. + * @param[in] fan_data - The fan details of the fan + * @param[in] rpm - The speed of the fan in RPM + * @returns tach value in tach counts + */ +uint16_t calculate_tach_count_emc23xx(struct emc2305_fan_data *fan_data, uint32_t rpm) +{ + uint16_t tachval = 0; + + if ((rpm == 0) || (fan_data->poles == 0)) { + return 0; + } + tachval = (((fan_data->edges - 1) * EMC2305_TACH_FREQ * EMC2305_RPM_CONST_VAL * fan_data->multiplier) / + (fan_data->poles * rpm)); + tachval = tachval << TACH_VALUE_SHIFT_BITS; + + return tachval; +} + + +/** + * @brief This function calculates the fan rpm based on the passed parameters. + * @param[in] fan - fan details + * @param[in] tachval - The tach counts of the fan + * @returns speed of the fan in RPM + */ +uint32_t calculate_rpm_emc23xx(struct emc2305_fan_data *fan, uint16_t tachval) +{ + uint32_t speed = 0; + + if ((tachval == 0) || (fan->poles == 0)) { + return 0; + } + + speed = (((fan->edges - 1) * EMC2305_TACH_FREQ * fan->multiplier * EMC2305_RPM_CONST_VAL) + / (tachval * fan->poles)); + + return speed; +} + +static int read_u8_from_i2c(struct i2c_client *client, uint8_t i2c_reg, uint8_t *output) +{ + int status = i2c_smbus_read_byte_data(client, i2c_reg); + if (status < 0) { + dev_warn(&client->dev, "reg 0x%02x, err %d\n", + i2c_reg, status); + } else { + *output = status; + } + return status; +} + +/* Clear the fan fault status in the EMC2305 Controller. + */ +static void emc2305_clear_fan_fault(struct i2c_client *client) +{ + uint8_t buf = 0, index = 0; + int rc = 0; + + for (index = 0; index < sizeof(emc2305_fault_status_reg); index++) { + /* All the status register are Read-On-Clear */ + rc = read_u8_from_i2c(client, emc2305_fault_status_reg[index], &buf); + if (rc < 0) { + return; + } + } +} + +static void read_fan_from_i2c(struct i2c_client *client, uint16_t *output, + uint8_t hi_addr, uint8_t lo_addr) +{ + uint8_t high_byte = 0, lo_byte = 0; + + if (read_u8_from_i2c (client, hi_addr, &high_byte) < 0) + return; + + if (read_u8_from_i2c (client, lo_addr, &lo_byte) < 0) + return; + + *output = (((uint16_t) high_byte << 8) | (lo_byte)); +} + +static void write_fan_target_to_i2c(struct i2c_client *client, int fan, + uint32_t rpm) +{ + struct emc2305_data *data = i2c_get_clientdata (client); + struct emc2305_fan_data *fan_data = &data->fan[fan]; + const uint8_t lo_reg = SEL_FAN (fan, REG_TACH_TARGET_LOW); + const uint8_t hi_reg = SEL_FAN (fan, REG_TACH_TARGET_HIGH); + uint16_t tachval = 0; + uint8_t tach[2] = { 0, 0 }; + + // The Tach Target are in registers 3c/3d, 4c/4d, 5c/5d, 6c/6d & 7c/7d + tachval = calculate_tach_count_emc23xx (fan_data, rpm); + tach[1] = (tachval & 0xff00) >> 8; // High Byte + tach[0] = (tachval & 0xff); // Low Byte + + i2c_smbus_write_byte_data (client, lo_reg, tach[0]); + i2c_smbus_write_byte_data (client, hi_reg, tach[1]); +} + +static void read_fan_config_from_i2c(struct i2c_client *client, int fan) + +{ + struct emc2305_data *data = i2c_get_clientdata(client); + uint8_t conf = 0; + + if (read_u8_from_i2c(client, SEL_FAN(fan, REG_FAN_CONFIGURATION_1), + &conf) < 0) { + return; + } + data->fan[fan].rpm_control = (conf & 0x80) != 0; + data->fan[fan].ranges = ((conf & EMC2305_FAN_CONFIG_RANGE_MASK) >> 5); + data->fan[fan].multiplier = 1 << (data->fan[fan].ranges); + data->fan[fan].poles = ((conf & 0x18) >> 3) + 1; + data->fan[fan].edges = (data->fan[fan].poles * 2) + 1; +} + +static void read_fan_setting(struct i2c_client *client, int fan) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + uint8_t setting = 0; + + if (read_u8_from_i2c(client, SEL_FAN(fan, REG_FAN_SETTING), + &setting) < 0) + return; + + data->fan[fan].pwm = setting; +} + +static void read_fan_data(struct i2c_client *client, int fan_idx) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + + read_fan_from_i2c(client, &data->fan[fan_idx].target, + SEL_FAN(fan_idx, REG_TACH_TARGET_HIGH), + SEL_FAN(fan_idx, REG_TACH_TARGET_LOW)); + + read_fan_from_i2c(client, &data->fan[fan_idx].tach, + SEL_FAN(fan_idx, REG_TACH_READ_HIGH), + SEL_FAN(fan_idx, REG_TACH_READ_LOW)); +} + + static struct emc2305_fan_data * +emc2305_update_fan(struct i2c_client *client, int fan_idx) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + struct emc2305_fan_data *fan_data = &data->fan[fan_idx]; + + mutex_lock(&data->update_lock); + + if (time_after(jiffies, fan_data->last_updated + HZ + HZ / 2) + || !fan_data->valid) { + read_fan_config_from_i2c(client, fan_idx); + read_fan_data(client, fan_idx); + read_fan_setting(client, fan_idx); + fan_data->valid = true; + fan_data->last_updated = jiffies; + } + + mutex_unlock(&data->update_lock); + return fan_data; +} + + static struct emc2305_fan_data * +emc2305_update_device_fan(struct device *dev, struct device_attribute *da) +{ + struct i2c_client *client = to_i2c_client(dev); + int fan_idx = to_sensor_dev_attr(da)->index; + + return emc2305_update_fan(client, fan_idx); +} + +static void read_fan_status(struct device *dev, struct device_attribute *da, bool *fault) +{ + struct i2c_client *client = to_i2c_client(dev); + int fan_idx = to_sensor_dev_attr(da)->index; + uint8_t reg = 0, index = 0; + int rc = 0; + *fault = false; + for (index = 1; index < sizeof(emc2305_fault_status_reg); index++) { + rc = read_u8_from_i2c(client, emc2305_fault_status_reg[index], ®); + if (rc < 0) { + return; + } + *fault = (reg & (1 << fan_idx)) ? true : false; + if (*fault == true) + return; + } + rc = read_u8_from_i2c(client, emc2305_fault_status_reg[0], ®); + if (rc < 0) { + return; + } + *fault = (reg & EMC2305_FAN_WATCHDOG_STATUS_MASK) ? true : false; + return; +} + +/* + * set/ config functions + */ + +/* + * Note: we also update the fan target here, because its value is + * determined in part by the fan clock divider. This follows the principle + * of least surprise; the user doesn't expect the fan target to change just + * because the divider changed. + */ + static int +emc2305_set_fan_div(struct i2c_client *client, int fan_idx, long new_div) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + struct emc2305_fan_data *fan = emc2305_update_fan(client, fan_idx); + const uint8_t reg_conf1 = SEL_FAN(fan_idx, REG_FAN_CONFIGURATION_1); + int new_range_bits, old_div = 8 / fan->multiplier; + int status = 0; + + if (new_div == old_div) /* No change */ + return 0; + + switch (new_div) { + case 1: + new_range_bits = 3; + break; + case 2: + new_range_bits = 2; + break; + case 4: + new_range_bits = 1; + break; + case 8: + new_range_bits = 0; + break; + default: + return -EINVAL; + } + + mutex_lock(&data->update_lock); + + status = i2c_smbus_read_byte_data(client, reg_conf1); + if (status < 0) { + dev_dbg(&client->dev, "reg 0x%02x, err %d\n", + reg_conf1, status); + status = -EIO; + goto exit_unlock; + } + status &= 0x9F; + status |= (new_range_bits << 5); + status = i2c_smbus_write_byte_data(client, reg_conf1, status); + if (status < 0) { + status = -EIO; + goto exit_invalidate; + } + + fan->multiplier = 8 / new_div; + + /* update fan target if high byte is not disabled */ + if ((fan->target & 0x7fff) != 0x7fff) { + uint16_t new_target = (fan->target * old_div) / new_div; + fan->target = min_t(uint16_t, new_target, FAN_MAX_RPM_SPEED); + write_fan_target_to_i2c(client, fan_idx, fan->target); + } + +exit_invalidate: + /* invalidate fan data to force re-read from hardware */ + fan->valid = false; +exit_unlock: + mutex_unlock(&data->update_lock); + return status; +} + + static int +emc2305_set_fan_target(struct i2c_client *client, int fan_idx, long rpm_target) +{ + struct emc2305_data *data = i2c_get_clientdata (client); + struct emc2305_fan_data *fan = emc2305_update_fan (client, fan_idx); + const uint8_t reg_fan_conf1 = SEL_FAN (fan_idx, REG_FAN_CONFIGURATION_1); + int status = 0; + uint8_t conf_reg = 0, speed_percent = 0, reg = 0, setting = 0; + + /* + * Datasheet states 16000 as maximum RPM target + * (table 2.2 and section 4.3) + */ + if (rpm_target < 0) { + return -EINVAL; + } + + mutex_lock (&data->update_lock); + + if ((rpm_target == 0) || (rpm_target > FAN_MAX_RPM_SPEED)) { + rpm_target = FAN_MAX_RPM_SPEED; + } + + if (fan->rpm_control) { + /* RPM mode */ + write_fan_target_to_i2c (client, fan_idx, (uint16_t) rpm_target); + /* Set RPM mode */ + status = read_u8_from_i2c (client, reg_fan_conf1, &conf_reg); + if (status < 0) { + status = -EIO; + } + + fan->rpm_control = true; + conf_reg |= 0x80; + + status = i2c_smbus_write_byte_data (client, reg_fan_conf1, conf_reg); + if (status < 0) { + status = -EIO; + } + + } else { + /* Direct Method */ + /* Set the fan speed */ + speed_percent = emc2305_rpm_to_speed_percent_get (FAN_MAX_RPM_SPEED, rpm_target); + setting = emc2305_speed_percent_to_drv_volt_get (speed_percent); + reg = SEL_FAN (fan_idx, REG_FAN_SETTING); + i2c_smbus_write_byte_data (client, reg, setting); + } + + mutex_unlock (&data->update_lock); + return status; +} + + static int +emc2305_set_pwm_enable(struct i2c_client *client, int fan_idx, long enable) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + struct emc2305_fan_data *fan = emc2305_update_fan(client, fan_idx); + const uint8_t reg_fan_conf1 = SEL_FAN(fan_idx, REG_FAN_CONFIGURATION_1); + int status = 0; + uint8_t conf_reg; + + mutex_lock(&data->update_lock); + switch (enable) { + case 0: + fan->rpm_control = false; + break; + case 3: + fan->rpm_control = true; + break; + default: + status = -EINVAL; + goto exit_unlock; + } + + status = read_u8_from_i2c(client, reg_fan_conf1, &conf_reg); + if (status < 0) { + status = -EIO; + goto exit_unlock; + } + + if (fan->rpm_control) + conf_reg |= 0x80; + else + conf_reg &= ~0x80; + + status = i2c_smbus_write_byte_data(client, reg_fan_conf1, conf_reg); + if (status < 0) + status = -EIO; + +exit_unlock: + mutex_unlock(&data->update_lock); + return status; +} + + static int +emc2305_set_pwm(struct i2c_client *client, int fan_idx, long pwm) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + struct emc2305_fan_data *fan = emc2305_update_fan(client, fan_idx); + const uint8_t reg_fan_setting = SEL_FAN(fan_idx, REG_FAN_SETTING); + int status = 0; + + /* + * Datasheet states 255 as maximum PWM + * (section 5.7) + */ + if ((pwm < 0) || (pwm > 255)) { + return -EINVAL; + } + + fan->pwm = pwm; + + mutex_lock(&data->update_lock); + + status = i2c_smbus_write_byte_data(client, reg_fan_setting, fan->pwm); + + mutex_unlock(&data->update_lock); + return status; +} + + static ssize_t +read_fan_input_target(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + struct emc2305_fan_data *fan = emc2305_update_device_fan(dev, da); + int fan_idx = to_sensor_dev_attr(da)->index; + uint32_t speed = 0; + uint16_t tach_fanstop_mask = 0, fanstop = 0, tachval =0; + uint8_t index = 0, conf = 0, value = 0, range = 0; + + mutex_lock(&data->update_lock); + read_fan_from_i2c(client, &tachval, + SEL_FAN(fan_idx, REG_TACH_READ_HIGH), + SEL_FAN(fan_idx, REG_TACH_READ_LOW)); + + // Get Fan Configuration value + conf = SEL_FAN (fan_idx, REG_FAN_CONFIGURATION_1); + value = i2c_smbus_read_byte_data (client, conf); + + // Get Range from Configuration value + range = ((value & EMC2305_FAN_CONFIG_RANGE_MASK) >> 5); + + switch (range) { + case 0: + fanstop = (uint16_t)0xFFF8; + break; + case 1: + fanstop = (uint16_t)0xFFF0; + break; + case 2: + fanstop = (uint16_t)0xFFE0; + break; + case 3: + fanstop = (uint16_t)0xFFC0; + break; + default: + //shouldn't reach here, as the mask 0x60 + return 0; + } + + // TACH_READING_DEFAULT_VAL: 0xFFF8, tach_fanstop_mask: 0x7 + tach_fanstop_mask = (uint16_t)~TACH_READING_DEFAULT_VAL; + + for (index = 1; index <= range; index++) { + tach_fanstop_mask = (tach_fanstop_mask << 1); + tach_fanstop_mask |= 0x1; + } + + // Mask off the lower bits which are indeterminate + tachval &= ~tach_fanstop_mask; + tachval = tachval >> TACH_VALUE_SHIFT_BITS; + + /* Disable the fan speed in case of fanstop value */ + if (tachval == fanstop) { + speed = 0; + } else { + speed = calculate_rpm_emc23xx(fan, tachval); + } + + mutex_unlock(&data->update_lock); + return snprintf(buf, SPEED_PWM_LEN_STRING, "%d\n", speed); +} + +/* + * sysfs callback functions + * + * Note: + * Naming of the funcs is modelled after the naming scheme described in + * Documentation/hwmon/sysfs-interface: + * + * For a sysfs file _ the functions are named like this: + * the show function: show__ + * the store function: set__ + * For read only (RO) attributes of course only the show func is required. + * + * This convention allows us to define the sysfs attributes by using macros. + */ + static ssize_t +show_fan_input(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client (dev); + int fan_idx = to_sensor_dev_attr (da)->index; + struct emc2305_data *data = i2c_get_clientdata (client); + struct emc2305_fan_data *fan = emc2305_update_fan (client, fan_idx); + uint8_t setting = 0, speed_percent = 0; + uint32_t speed = 0; + + if (fan->rpm_control) { + return read_fan_input_target (dev, da, buf); + } else { + if (read_u8_from_i2c(client, SEL_FAN (fan_idx, REG_FAN_SETTING), &setting) < 0) { + return 0; + } + speed_percent = (setting * EMC2305_PERCENT_VAL) / (EMC2305_FAN_SETTING_MAX_VAL); + speed = (FAN_MAX_RPM_SPEED * speed_percent) / EMC2305_PERCENT_VAL; + return snprintf (buf, SPEED_PWM_LEN_STRING, "%d\n", speed); + } + +} + + static ssize_t +show_fan_fault(struct device *dev, struct device_attribute *da, char *buf) +{ + struct emc2305_fan_data *fan = emc2305_update_device_fan(dev, da); + bool fault; + read_fan_status(dev, da, &fault); + return snprintf(buf, SPEED_PWM_LEN_STRING, "%d\n", fault ? 1 : 0); +} + + static ssize_t +show_fan_div(struct device *dev, struct device_attribute *da, char *buf) +{ + struct emc2305_fan_data *fan = emc2305_update_device_fan(dev, da); + int fan_div = 8 / fan->multiplier; + return snprintf(buf, SPEED_PWM_LEN_STRING, "%d\n", fan_div); +} + + static ssize_t +set_fan_div(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + int fan_idx = to_sensor_dev_attr(da)->index; + long new_div; + int status; + + status = kstrtol(buf, 10, &new_div); + if (status < 0) { + return -EINVAL; + } + + status = emc2305_set_fan_div(client, fan_idx, new_div); + if (status < 0) + return status; + + return count; +} + + static ssize_t +show_fan_target(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client (dev); + int fan_idx = to_sensor_dev_attr (da)->index; + struct emc2305_data *data = i2c_get_clientdata (client); + struct emc2305_fan_data *fan = emc2305_update_fan (client, fan_idx); + uint8_t setting = 0, speed_percent = 0; + uint32_t speed = 0; + + if (fan->rpm_control) { + /* RPM mode */ + return read_fan_input_target (dev, da, buf); + } else { + /* Direct Method */ + if (read_u8_from_i2c(client, SEL_FAN (fan_idx, REG_FAN_SETTING), &setting) < 0) { + return 0; + } + speed_percent = (setting * EMC2305_PERCENT_VAL) / (EMC2305_FAN_SETTING_MAX_VAL); + speed = (FAN_MAX_RPM_SPEED * speed_percent) / EMC2305_PERCENT_VAL; + return snprintf (buf, SPEED_PWM_LEN_STRING, "%d\n", speed); + } +} + +static ssize_t set_fan_target(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + int fan_idx = to_sensor_dev_attr(da)->index; + long rpm_target = 0; + int status = 0; + + status = kstrtol(buf, 10, &rpm_target); + if (status < 0) { + return -EINVAL; + } + + status = emc2305_set_fan_target(client, fan_idx, rpm_target); + if (status < 0) + return status; + + return count; +} + + static ssize_t +show_pwm_enable(struct device *dev, struct device_attribute *da, char *buf) +{ + struct emc2305_fan_data *fan = emc2305_update_device_fan(dev, da); + return snprintf(buf, SPEED_PWM_LEN_STRING, "%d\n", fan->rpm_control ? 3 : 0); +} + +static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + int fan_idx = to_sensor_dev_attr(da)->index; + long new_value; + int status; + + status = kstrtol(buf, 10, &new_value); + if (status < 0) { + return -EINVAL; + } + status = emc2305_set_pwm_enable(client, fan_idx, new_value); + return count; +} + +static ssize_t show_pwm(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct emc2305_fan_data *fan = emc2305_update_device_fan(dev, da); + return snprintf(buf, SPEED_PWM_LEN_STRING, "%d\n", fan->pwm); +} + +static ssize_t set_pwm(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + int fan_idx = to_sensor_dev_attr(da)->index; + unsigned long val = 0; + int ret = 0; + int status = 0; + + ret = kstrtoul(buf, 10, &val); + if (ret) + return ret; + if (val > 255) { + return -EINVAL; + } + + status = emc2305_set_pwm(client, fan_idx, val); + return count; +} + +/* define a read only attribute */ +#define EMC2305_ATTR_RO(_type, _item, _num) \ + SENSOR_ATTR(_type ## _num ## _ ## _item, S_IRUGO, \ + show_## _type ## _ ## _item, NULL, _num - 1) + +/* define a read/write attribute */ +#define EMC2305_ATTR_RW(_type, _item, _num) \ + SENSOR_ATTR(_type ## _num ## _ ## _item, S_IRUGO | S_IWUSR, \ + show_## _type ##_ ## _item, \ + set_## _type ## _ ## _item, _num - 1) + +/* + * TODO: Ugly hack, but temporary as this whole logic needs + * to be rewritten as per standard HWMON sysfs registration + */ + +/* define a read/write attribute */ +#define EMC2305_ATTR_RW2(_type, _num) \ + SENSOR_ATTR(_type ## _num, S_IRUGO | S_IWUSR, \ + show_## _type, set_## _type, _num - 1) + +/* defines the attributes for a single fan */ +#define EMC2305_DEFINE_FAN_ATTRS(_num) \ + static const \ +struct sensor_device_attribute emc2305_attr_fan ## _num[] = { \ + EMC2305_ATTR_RO(fan, input, _num), \ + EMC2305_ATTR_RO(fan, fault, _num), \ + EMC2305_ATTR_RW(fan, div, _num), \ + EMC2305_ATTR_RW(fan, target, _num), \ + EMC2305_ATTR_RW(pwm, enable, _num), \ + EMC2305_ATTR_RW2(pwm, _num) \ +} + +#define EMC2305_NUM_FAN_ATTRS ARRAY_SIZE(emc2305_attr_fan1) + +/* common attributes for EMC2303 and EMC2305 */ +static const struct sensor_device_attribute emc2305_attr_common[] = { +}; + +/* fan attributes for the single fans */ +EMC2305_DEFINE_FAN_ATTRS(1); +EMC2305_DEFINE_FAN_ATTRS(2); +EMC2305_DEFINE_FAN_ATTRS(3); +EMC2305_DEFINE_FAN_ATTRS(4); +EMC2305_DEFINE_FAN_ATTRS(5); +EMC2305_DEFINE_FAN_ATTRS(6); + +/* fan attributes */ +static const struct sensor_device_attribute *emc2305_fan_attrs[] = { + emc2305_attr_fan1, + emc2305_attr_fan2, + emc2305_attr_fan3, + emc2305_attr_fan4, + emc2305_attr_fan5, +}; + +/* + * driver interface + */ + +static int emc2305_remove(struct i2c_client *client) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + int fan_idx, i; + + hwmon_device_unregister(data->hwmon_dev); + + for (fan_idx = 0; fan_idx < data->fans; ++fan_idx) + for (i = 0; i < EMC2305_NUM_FAN_ATTRS; ++i) + device_remove_file( + &client->dev, + &emc2305_fan_attrs[fan_idx][i].dev_attr); + + for (i = 0; i < ARRAY_SIZE(emc2305_attr_common); ++i) + device_remove_file(&client->dev, + &emc2305_attr_common[i].dev_attr); + + kfree(data); + return 0; +} + + +#ifdef CONFIG_OF +/* + * device tree support + */ + +struct of_fan_attribute { + const char *name; + int (*set)(struct i2c_client*, int, long); +}; + +struct of_fan_attribute of_fan_attributes[] = { + {"fan-div", emc2305_set_fan_div}, + {"fan-target", emc2305_set_fan_target}, + {"pwm-enable", emc2305_set_pwm_enable}, + {NULL, NULL} +}; + +static int emc2305_config_of(struct i2c_client *client) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + struct device_node *node; + unsigned int fan_idx; + + if (!client->dev.of_node) + { + return -EINVAL; + } + if (!of_get_next_child(client->dev.of_node, NULL)) + return 0; + + for (fan_idx = 0; fan_idx < data->fans; ++fan_idx) + data->fan[fan_idx].enabled = false; + + for_each_child_of_node(client->dev.of_node, node) { + const __be32 *property; + int len; + struct of_fan_attribute *attr; + + property = of_get_property(node, "reg", &len); + if (!property || len != sizeof(int)) { + dev_err(&client->dev, "invalid reg on %s\n", + node->full_name); + continue; + } + + fan_idx = be32_to_cpup(property); + if (fan_idx >= data->fans) { + dev_err(&client->dev, + "invalid fan index %d on %s\n", + fan_idx, node->full_name); + continue; + } + + data->fan[fan_idx].enabled = true; + + for (attr = of_fan_attributes; attr->name; ++attr) { + int status = 0; + long value; + property = of_get_property(node, attr->name, &len); + if (!property) + continue; + if (len != sizeof(int)) { + dev_err(&client->dev, "invalid %s on %s\n", + attr->name, node->full_name); + continue; + } + value = be32_to_cpup(property); + status = attr->set(client, fan_idx, value); + if (status == -EINVAL) { + dev_err(&client->dev, + "invalid value for %s on %s\n", + attr->name, node->full_name); + } + } + } + + return 0; +} + +#endif + +static void emc2305_device_init(struct i2c_client *client) +{ + int fan_index; + uint16_t rpm = 0; + uint8_t conf = 0; + uint8_t value = 0; + struct emc2305_data *data = i2c_get_clientdata (client); + + /* Clear status registers */ + emc2305_clear_fan_fault (client); + + conf = REG_PWM_OUTPUT_CONFIG; + value = 0x1f; + i2c_smbus_write_byte_data (client, conf, value); + + conf = REG_PWM_BASE_FREQ_1; + value = 0x0f; + i2c_smbus_write_byte_data (client, conf, value); + + conf = REG_PWM_BASE_FREQ_2; + value = 0x3f; + i2c_smbus_write_byte_data (client, conf, value); + + + for (fan_index = 0; fan_index < data->fans; ++fan_index) { + conf = SEL_FAN (fan_index, REG_FAN_CONFIGURATION_1); + value = 0x4b; + i2c_smbus_write_byte_data (client, conf, value); + + conf = SEL_FAN (fan_index, REG_FAN_MAX_STEP); + value = 0x01; + i2c_smbus_write_byte_data (client, conf, value); + + conf = SEL_FAN (fan_index, REG_FAN_VALID_TACH_COUNT); + value = 0xfe; + i2c_smbus_write_byte_data (client, conf, value); + + /* Set default speed (12000 RPM) */ + rpm = 12000; + write_fan_target_to_i2c (client, fan_index, rpm); + + conf = SEL_FAN(fan_index, REG_FAN_SETTING); + value = 0x0; + i2c_smbus_write_byte_data (client, conf, value); + + conf = SEL_FAN (fan_index, REG_FAN_MINIMUM_DRIVE); + value = 0x01; + i2c_smbus_write_byte_data (client, conf, value); + + conf = SEL_FAN(fan_index, REG_FAN_SETTING); + value = 0x0; + i2c_smbus_write_byte_data (client, conf, value); + + /* Change to RPM Mode */ + conf = SEL_FAN (fan_index, REG_FAN_CONFIGURATION_1); + value = i2c_smbus_read_byte_data (client, conf); + value |= 0x80; + i2c_smbus_write_byte_data (client, conf, value); + + conf = SEL_FAN (fan_index, REG_PWM_DIVIDE); + value = 0x0; + i2c_smbus_write_byte_data (client, conf, value); + + conf = SEL_FAN(fan_index, REG_FAN_SETTING); + value = 0x0; + i2c_smbus_write_byte_data (client, conf, value); + + conf = SEL_FAN (fan_index, REG_FAN_CONFIGURATION_1); + value = 0x4b; + i2c_smbus_write_byte_data (client, conf, value); + } + +} + +static void emc2305_get_config(struct i2c_client *client) +{ + int i; + struct emc2305_data *data = i2c_get_clientdata(client); + + for (i = 0; i < data->fans; ++i) { + data->fan[i].enabled = true; + emc2305_update_fan(client, i); + } + +#ifdef CONFIG_OF + emc2305_config_of(client); +#endif + +} + + static int +emc2305_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct emc2305_data *data; + int status; + int i; + int fan_idx; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) + return -EIO; + + data = kzalloc(sizeof(struct emc2305_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + status = i2c_smbus_read_byte_data(client, REG_PRODUCT_ID); + switch (status) { + case 0x34: /* EMC2305 */ + data->fans = 5; + break; + case 0x35: /* EMC2303 */ + data->fans = 3; + break; + case 0x36: /* EMC2302 */ + data->fans = 2; + break; + case 0x37: /* EMC2301 */ + data->fans = 1; + break; + default: + if (status >= 0) { + + status = -EINVAL; + } + goto exit_free; + } + + /* initialise EMC2305 driver */ + emc2305_device_init(client); + + emc2305_get_config(client); + + for (i = 0; i < ARRAY_SIZE(emc2305_attr_common); ++i) { + status = device_create_file(&client->dev, + &emc2305_attr_common[i].dev_attr); + if (status) + goto exit_remove; + } + for (fan_idx = 0; fan_idx < data->fans; ++fan_idx) + for (i = 0; i < EMC2305_NUM_FAN_ATTRS; ++i) { + if (!data->fan[fan_idx].enabled) + continue; + status = device_create_file( + &client->dev, + &emc2305_fan_attrs[fan_idx][i].dev_attr); + if (status) + goto exit_remove_fans; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove_fans; + } + + dev_info(&client->dev, "%s: sensor '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove_fans: + for (fan_idx = 0; fan_idx < data->fans; ++fan_idx) + for (i = 0; i < EMC2305_NUM_FAN_ATTRS; ++i) + device_remove_file( + &client->dev, + &emc2305_fan_attrs[fan_idx][i].dev_attr); + +exit_remove: + for (i = 0; i < ARRAY_SIZE(emc2305_attr_common); ++i) + device_remove_file(&client->dev, + &emc2305_attr_common[i].dev_attr); +exit_free: + kfree(data); + return status; +} + +static const struct i2c_device_id emc2305_id[] = { + { "emc2305", 0 }, + { "emc2303", 0 }, + { "emc2302", 0 }, + { "emc2301", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, emc2305_id); + +/* Return 0 if detection is successful, -ENODEV otherwise */ + static int +emc2305_detect(struct i2c_client *new_client, struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = new_client->adapter; + int manufacturer, product; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) + return -ENODEV; + + manufacturer = + i2c_smbus_read_byte_data(new_client, REG_MANUFACTURER_ID); + if (manufacturer != 0x5D) + return -ENODEV; + + product = i2c_smbus_read_byte_data(new_client, REG_PRODUCT_ID); + + switch (product) { + case 0x34: + strlcpy(info->type, "emc2305", I2C_NAME_SIZE); + break; + case 0x35: + strlcpy(info->type, "emc2303", I2C_NAME_SIZE); + break; + case 0x36: + strlcpy(info->type, "emc2302", I2C_NAME_SIZE); + break; + case 0x37: + strlcpy(info->type, "emc2301", I2C_NAME_SIZE); + break; + default: + return -ENODEV; + } + + return 0; +} + +static struct i2c_driver emc2305_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "emc2305", + }, + .probe = emc2305_probe, + .remove = emc2305_remove, + .id_table = emc2305_id, + /* + .detect = emc2305_detect, + .address_list = i2c_adresses, + */ +}; + +module_i2c_driver(emc2305_driver); + +MODULE_AUTHOR("Reinhard Pfau "); +MODULE_DESCRIPTION("SMSC EMC2305 hwmon driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/pmbus.h b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/pmbus.h new file mode 100644 index 000000000000..521baf6da49a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/modules/pmbus.h @@ -0,0 +1,425 @@ +/* + * pmbus.h - Common defines and structures for PMBus devices + * + * Copyright (c) 2010, 2011 Ericsson AB. + * Copyright (c) 2012 Guenter Roeck + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef PMBUS_H +#define PMBUS_H + +#include +#include + +/* + * Registers + */ +enum pmbus_regs { + PMBUS_PAGE = 0x00, + PMBUS_OPERATION = 0x01, + PMBUS_ON_OFF_CONFIG = 0x02, + PMBUS_CLEAR_FAULTS = 0x03, + PMBUS_PHASE = 0x04, + + PMBUS_CAPABILITY = 0x19, + PMBUS_QUERY = 0x1A, + + PMBUS_VOUT_MODE = 0x20, + PMBUS_VOUT_COMMAND = 0x21, + PMBUS_VOUT_TRIM = 0x22, + PMBUS_VOUT_CAL_OFFSET = 0x23, + PMBUS_VOUT_MAX = 0x24, + PMBUS_VOUT_MARGIN_HIGH = 0x25, + PMBUS_VOUT_MARGIN_LOW = 0x26, + PMBUS_VOUT_TRANSITION_RATE = 0x27, + PMBUS_VOUT_DROOP = 0x28, + PMBUS_VOUT_SCALE_LOOP = 0x29, + PMBUS_VOUT_SCALE_MONITOR = 0x2A, + + PMBUS_COEFFICIENTS = 0x30, + PMBUS_POUT_MAX = 0x31, + + PMBUS_FAN_CONFIG_12 = 0x3A, + PMBUS_FAN_COMMAND_1 = 0x3B, + PMBUS_FAN_COMMAND_2 = 0x3C, + PMBUS_FAN_CONFIG_34 = 0x3D, + PMBUS_FAN_COMMAND_3 = 0x3E, + PMBUS_FAN_COMMAND_4 = 0x3F, + + PMBUS_VOUT_OV_FAULT_LIMIT = 0x40, + PMBUS_VOUT_OV_FAULT_RESPONSE = 0x41, + PMBUS_VOUT_OV_WARN_LIMIT = 0x42, + PMBUS_VOUT_UV_WARN_LIMIT = 0x43, + PMBUS_VOUT_UV_FAULT_LIMIT = 0x44, + PMBUS_VOUT_UV_FAULT_RESPONSE = 0x45, + PMBUS_IOUT_OC_FAULT_LIMIT = 0x46, + PMBUS_IOUT_OC_FAULT_RESPONSE = 0x47, + PMBUS_IOUT_OC_LV_FAULT_LIMIT = 0x48, + PMBUS_IOUT_OC_LV_FAULT_RESPONSE = 0x49, + PMBUS_IOUT_OC_WARN_LIMIT = 0x4A, + PMBUS_IOUT_UC_FAULT_LIMIT = 0x4B, + PMBUS_IOUT_UC_FAULT_RESPONSE = 0x4C, + + PMBUS_OT_FAULT_LIMIT = 0x4F, + PMBUS_OT_FAULT_RESPONSE = 0x50, + PMBUS_OT_WARN_LIMIT = 0x51, + PMBUS_UT_WARN_LIMIT = 0x52, + PMBUS_UT_FAULT_LIMIT = 0x53, + PMBUS_UT_FAULT_RESPONSE = 0x54, + PMBUS_VIN_OV_FAULT_LIMIT = 0x55, + PMBUS_VIN_OV_FAULT_RESPONSE = 0x56, + PMBUS_VIN_OV_WARN_LIMIT = 0x57, + PMBUS_VIN_UV_WARN_LIMIT = 0x58, + PMBUS_VIN_UV_FAULT_LIMIT = 0x59, + + PMBUS_IIN_OC_FAULT_LIMIT = 0x5B, + PMBUS_IIN_OC_WARN_LIMIT = 0x5D, + + PMBUS_POUT_OP_FAULT_LIMIT = 0x68, + PMBUS_POUT_OP_WARN_LIMIT = 0x6A, + PMBUS_PIN_OP_WARN_LIMIT = 0x6B, + + PMBUS_STATUS_BYTE = 0x78, + PMBUS_STATUS_WORD = 0x79, + PMBUS_STATUS_VOUT = 0x7A, + PMBUS_STATUS_IOUT = 0x7B, + PMBUS_STATUS_INPUT = 0x7C, + PMBUS_STATUS_TEMPERATURE = 0x7D, + PMBUS_STATUS_CML = 0x7E, + PMBUS_STATUS_OTHER = 0x7F, + PMBUS_STATUS_MFR_SPECIFIC = 0x80, + PMBUS_STATUS_FAN_12 = 0x81, + PMBUS_STATUS_FAN_34 = 0x82, + + PMBUS_READ_VIN = 0x88, + PMBUS_READ_IIN = 0x89, + PMBUS_READ_VCAP = 0x8A, + PMBUS_READ_VOUT = 0x8B, + PMBUS_READ_IOUT = 0x8C, + PMBUS_READ_TEMPERATURE_1 = 0x8D, + PMBUS_READ_TEMPERATURE_2 = 0x8E, + PMBUS_READ_TEMPERATURE_3 = 0x8F, + PMBUS_READ_FAN_SPEED_1 = 0x90, + PMBUS_READ_FAN_SPEED_2 = 0x91, + PMBUS_READ_FAN_SPEED_3 = 0x92, + PMBUS_READ_FAN_SPEED_4 = 0x93, + PMBUS_READ_DUTY_CYCLE = 0x94, + PMBUS_READ_FREQUENCY = 0x95, + PMBUS_READ_POUT = 0x96, + PMBUS_READ_PIN = 0x97, + + PMBUS_REVISION = 0x98, + PMBUS_MFR_ID = 0x99, + PMBUS_MFR_MODEL = 0x9A, + PMBUS_MFR_REVISION = 0x9B, + PMBUS_MFR_LOCATION = 0x9C, + PMBUS_MFR_DATE = 0x9D, + PMBUS_MFR_SERIAL = 0x9E, + +/* + * Virtual registers. + * Useful to support attributes which are not supported by standard PMBus + * registers but exist as manufacturer specific registers on individual chips. + * Must be mapped to real registers in device specific code. + * + * Semantics: + * Virtual registers are all word size. + * READ registers are read-only; writes are either ignored or return an error. + * RESET registers are read/write. Reading reset registers returns zero + * (used for detection), writing any value causes the associated history to be + * reset. + * Virtual registers have to be handled in device specific driver code. Chip + * driver code returns non-negative register values if a virtual register is + * supported, or a negative error code if not. The chip driver may return + * -ENODATA or any other error code in this case, though an error code other + * than -ENODATA is handled more efficiently and thus preferred. Either case, + * the calling PMBus core code will abort if the chip driver returns an error + * code when reading or writing virtual registers. + */ + PMBUS_VIRT_BASE = 0x100, + PMBUS_VIRT_READ_TEMP_AVG, + PMBUS_VIRT_READ_TEMP_MIN, + PMBUS_VIRT_READ_TEMP_MAX, + PMBUS_VIRT_RESET_TEMP_HISTORY, + PMBUS_VIRT_READ_VIN_AVG, + PMBUS_VIRT_READ_VIN_MIN, + PMBUS_VIRT_READ_VIN_MAX, + PMBUS_VIRT_RESET_VIN_HISTORY, + PMBUS_VIRT_READ_IIN_AVG, + PMBUS_VIRT_READ_IIN_MIN, + PMBUS_VIRT_READ_IIN_MAX, + PMBUS_VIRT_RESET_IIN_HISTORY, + PMBUS_VIRT_READ_PIN_AVG, + PMBUS_VIRT_READ_PIN_MIN, + PMBUS_VIRT_READ_PIN_MAX, + PMBUS_VIRT_RESET_PIN_HISTORY, + PMBUS_VIRT_READ_POUT_AVG, + PMBUS_VIRT_READ_POUT_MIN, + PMBUS_VIRT_READ_POUT_MAX, + PMBUS_VIRT_RESET_POUT_HISTORY, + PMBUS_VIRT_READ_VOUT_AVG, + PMBUS_VIRT_READ_VOUT_MIN, + PMBUS_VIRT_READ_VOUT_MAX, + PMBUS_VIRT_RESET_VOUT_HISTORY, + PMBUS_VIRT_READ_IOUT_AVG, + PMBUS_VIRT_READ_IOUT_MIN, + PMBUS_VIRT_READ_IOUT_MAX, + PMBUS_VIRT_RESET_IOUT_HISTORY, + PMBUS_VIRT_READ_TEMP2_AVG, + PMBUS_VIRT_READ_TEMP2_MIN, + PMBUS_VIRT_READ_TEMP2_MAX, + PMBUS_VIRT_RESET_TEMP2_HISTORY, + + PMBUS_VIRT_READ_VMON, + PMBUS_VIRT_VMON_UV_WARN_LIMIT, + PMBUS_VIRT_VMON_OV_WARN_LIMIT, + PMBUS_VIRT_VMON_UV_FAULT_LIMIT, + PMBUS_VIRT_VMON_OV_FAULT_LIMIT, + PMBUS_VIRT_STATUS_VMON, +}; + +/* + * OPERATION + */ +#define PB_OPERATION_CONTROL_ON BIT(7) + +/* + * CAPABILITY + */ +#define PB_CAPABILITY_SMBALERT BIT(4) +#define PB_CAPABILITY_ERROR_CHECK BIT(7) + +/* + * VOUT_MODE + */ +#define PB_VOUT_MODE_MODE_MASK 0xe0 +#define PB_VOUT_MODE_PARAM_MASK 0x1f + +#define PB_VOUT_MODE_LINEAR 0x00 +#define PB_VOUT_MODE_VID 0x20 +#define PB_VOUT_MODE_DIRECT 0x40 + +/* + * Fan configuration + */ +#define PB_FAN_2_PULSE_MASK (BIT(0) | BIT(1)) +#define PB_FAN_2_RPM BIT(2) +#define PB_FAN_2_INSTALLED BIT(3) +#define PB_FAN_1_PULSE_MASK (BIT(4) | BIT(5)) +#define PB_FAN_1_RPM BIT(6) +#define PB_FAN_1_INSTALLED BIT(7) + +/* + * STATUS_BYTE, STATUS_WORD (lower) + */ +#define PB_STATUS_NONE_ABOVE BIT(0) +#define PB_STATUS_CML BIT(1) +#define PB_STATUS_TEMPERATURE BIT(2) +#define PB_STATUS_VIN_UV BIT(3) +#define PB_STATUS_IOUT_OC BIT(4) +#define PB_STATUS_VOUT_OV BIT(5) +#define PB_STATUS_OFF BIT(6) +#define PB_STATUS_BUSY BIT(7) + +/* + * STATUS_WORD (upper) + */ +#define PB_STATUS_UNKNOWN BIT(8) +#define PB_STATUS_OTHER BIT(9) +#define PB_STATUS_FANS BIT(10) +#define PB_STATUS_POWER_GOOD_N BIT(11) +#define PB_STATUS_WORD_MFR BIT(12) +#define PB_STATUS_INPUT BIT(13) +#define PB_STATUS_IOUT_POUT BIT(14) +#define PB_STATUS_VOUT BIT(15) + +/* + * STATUS_IOUT + */ +#define PB_POUT_OP_WARNING BIT(0) +#define PB_POUT_OP_FAULT BIT(1) +#define PB_POWER_LIMITING BIT(2) +#define PB_CURRENT_SHARE_FAULT BIT(3) +#define PB_IOUT_UC_FAULT BIT(4) +#define PB_IOUT_OC_WARNING BIT(5) +#define PB_IOUT_OC_LV_FAULT BIT(6) +#define PB_IOUT_OC_FAULT BIT(7) + +/* + * STATUS_VOUT, STATUS_INPUT + */ +#define PB_VOLTAGE_UV_FAULT BIT(4) +#define PB_VOLTAGE_UV_WARNING BIT(5) +#define PB_VOLTAGE_OV_WARNING BIT(6) +#define PB_VOLTAGE_OV_FAULT BIT(7) + +/* + * STATUS_INPUT + */ +#define PB_PIN_OP_WARNING BIT(0) +#define PB_IIN_OC_WARNING BIT(1) +#define PB_IIN_OC_FAULT BIT(2) + +/* + * STATUS_TEMPERATURE + */ +#define PB_TEMP_UT_FAULT BIT(4) +#define PB_TEMP_UT_WARNING BIT(5) +#define PB_TEMP_OT_WARNING BIT(6) +#define PB_TEMP_OT_FAULT BIT(7) + +/* + * STATUS_FAN + */ +#define PB_FAN_AIRFLOW_WARNING BIT(0) +#define PB_FAN_AIRFLOW_FAULT BIT(1) +#define PB_FAN_FAN2_SPEED_OVERRIDE BIT(2) +#define PB_FAN_FAN1_SPEED_OVERRIDE BIT(3) +#define PB_FAN_FAN2_WARNING BIT(4) +#define PB_FAN_FAN1_WARNING BIT(5) +#define PB_FAN_FAN2_FAULT BIT(6) +#define PB_FAN_FAN1_FAULT BIT(7) + +/* + * CML_FAULT_STATUS + */ +#define PB_CML_FAULT_OTHER_MEM_LOGIC BIT(0) +#define PB_CML_FAULT_OTHER_COMM BIT(1) +#define PB_CML_FAULT_PROCESSOR BIT(3) +#define PB_CML_FAULT_MEMORY BIT(4) +#define PB_CML_FAULT_PACKET_ERROR BIT(5) +#define PB_CML_FAULT_INVALID_DATA BIT(6) +#define PB_CML_FAULT_INVALID_COMMAND BIT(7) + +enum pmbus_sensor_classes { + PSC_VOLTAGE_IN = 0, + PSC_VOLTAGE_OUT, + PSC_CURRENT_IN, + PSC_CURRENT_OUT, + PSC_POWER, + PSC_TEMPERATURE, + PSC_FAN, + PSC_NUM_CLASSES /* Number of power sensor classes */ +}; + +#define PMBUS_PAGES 32 /* Per PMBus specification */ + +/* Functionality bit mask */ +#define PMBUS_HAVE_VIN BIT(0) +#define PMBUS_HAVE_VCAP BIT(1) +#define PMBUS_HAVE_VOUT BIT(2) +#define PMBUS_HAVE_IIN BIT(3) +#define PMBUS_HAVE_IOUT BIT(4) +#define PMBUS_HAVE_PIN BIT(5) +#define PMBUS_HAVE_POUT BIT(6) +#define PMBUS_HAVE_FAN12 BIT(7) +#define PMBUS_HAVE_FAN34 BIT(8) +#define PMBUS_HAVE_TEMP BIT(9) +#define PMBUS_HAVE_TEMP2 BIT(10) +#define PMBUS_HAVE_TEMP3 BIT(11) +#define PMBUS_HAVE_STATUS_VOUT BIT(12) +#define PMBUS_HAVE_STATUS_IOUT BIT(13) +#define PMBUS_HAVE_STATUS_INPUT BIT(14) +#define PMBUS_HAVE_STATUS_TEMP BIT(15) +#define PMBUS_HAVE_STATUS_FAN12 BIT(16) +#define PMBUS_HAVE_STATUS_FAN34 BIT(17) +#define PMBUS_HAVE_VMON BIT(18) +#define PMBUS_HAVE_STATUS_VMON BIT(19) + +enum pmbus_data_format { linear = 0, direct, vid }; +enum vrm_version { vr11 = 0, vr12 }; + +struct pmbus_driver_info { + int pages; /* Total number of pages */ + enum pmbus_data_format format[PSC_NUM_CLASSES]; + enum vrm_version vrm_version; + /* + * Support one set of coefficients for each sensor type + * Used for chips providing data in direct mode. + */ + int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */ + int b[PSC_NUM_CLASSES]; /* offset */ + int R[PSC_NUM_CLASSES]; /* exponent */ + + u32 func[PMBUS_PAGES]; /* Functionality, per page */ + /* + * The following functions map manufacturing specific register values + * to PMBus standard register values. Specify only if mapping is + * necessary. + * Functions return the register value (read) or zero (write) if + * successful. A return value of -ENODATA indicates that there is no + * manufacturer specific register, but that a standard PMBus register + * may exist. Any other negative return value indicates that the + * register does not exist, and that no attempt should be made to read + * the standard register. + */ + int (*read_byte_data)(struct i2c_client *client, int page, int reg); + int (*read_word_data)(struct i2c_client *client, int page, int reg); + int (*write_word_data)(struct i2c_client *client, int page, int reg, + u16 word); + int (*write_byte)(struct i2c_client *client, int page, u8 value); + /* + * The identify function determines supported PMBus functionality. + * This function is only necessary if a chip driver supports multiple + * chips, and the chip functionality is not pre-determined. + */ + int (*identify)(struct i2c_client *client, + struct pmbus_driver_info *info); + + /* Regulator functionality, if supported by this chip driver. */ + int num_regulators; + const struct regulator_desc *reg_desc; +}; + +/* Regulator ops */ + +extern const struct regulator_ops pmbus_regulator_ops; + +/* Macro for filling in array of struct regulator_desc */ +#define PMBUS_REGULATOR(_name, _id) \ + [_id] = { \ + .name = (_name # _id), \ + .id = (_id), \ + .of_match = of_match_ptr(_name # _id), \ + .regulators_node = of_match_ptr("regulators"), \ + .ops = &pmbus_regulator_ops, \ + .type = REGULATOR_VOLTAGE, \ + .owner = THIS_MODULE, \ + } + +/* Function declarations */ + +void pmbus_clear_cache(struct i2c_client *client); +int pmbus_set_page(struct i2c_client *client, u8 page); +int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg); +int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word); +int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); +int pmbus_write_byte(struct i2c_client *client, int page, u8 value); +int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, + u8 value); +int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, + u8 mask, u8 value); +void pmbus_clear_faults(struct i2c_client *client); +bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg); +bool pmbus_check_word_register(struct i2c_client *client, int page, int reg); +int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id, + struct pmbus_driver_info *info); +int pmbus_do_remove(struct i2c_client *client); +const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client + *client); + +#endif /* PMBUS_H */ \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/e3224f_platform.sh b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/e3224f_platform.sh new file mode 100755 index 000000000000..05af9667fe14 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/e3224f_platform.sh @@ -0,0 +1,174 @@ +#!/bin/bash + +#platform init script for Dell E3224F + +source dell_i2c_utils.sh + +SONIC_VERSION=$(cat /etc/sonic/sonic_version.yml | grep "build_version" | sed -e "s/build_version: //g;s/'//g") +FIRST_BOOT_FILE="/host/image-${SONIC_VERSION}/platform/firsttime" + +#Attach/Detach the system devices +sys_devices() { + case $1 in + "new_device") #syseeprom + i2c_config "echo 24c02 0x50 > /sys/bus/i2c/devices/i2c-2/$1" + #Attach Fan Controller + i2c_config "echo emc2305 0x2c > /sys/bus/i2c/devices/i2c-7/$1" + #Attach temperature monitor + i2c_config "echo tmp75 0x48 > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo tmp75 0x49 > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo tmp75 0x4a > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo tmp75 0x4b > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo tmp75 0x4c > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo tmp75 0x4f > /sys/bus/i2c/devices/i2c-7/$1" + #Attach Fan EEPROM + i2c_config "echo 24c02 0x50 > /sys/bus/i2c/devices/i2c-15/$1" + i2c_config "echo 24c02 0x50 > /sys/bus/i2c/devices/i2c-16/$1" + i2c_config "echo 24c02 0x50 > /sys/bus/i2c/devices/i2c-17/$1" + ;; + "delete_device") i2c_config "echo 0x50 > /sys/bus/i2c/devices/i2c-2/$1" + i2c_config "echo 0x2c > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo 0x48 > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo 0x49 > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo 0x4a > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo 0x4b > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo 0x4c > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo 0x4f > /sys/bus/i2c/devices/i2c-7/$1" + i2c_config "echo 0x50 > /sys/bus/i2c/devices/i2c-15/$1" + i2c_config "echo 0x50 > /sys/bus/i2c/devices/i2c-16/$1" + i2c_config "echo 0x50 > /sys/bus/i2c/devices/i2c-17/$1" + ;; + *) echo "e3224f_platform: main_board_mux : invalid command !" + ;; + esac +} + +#Attach/Detach the SFP modules on PCA9548_2 +switch_board_sfp() { + case $1 in + "new_device") + # SFP ports + for ((i=27;i<=50;i++)); + do + i2c_config "echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-$i/$1" + done + # SFP+ ports + for ((i=20;i<=23;i++)); + do + i2c_config "echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-$i/$1" + done + # QSFP ports + i2c_config "echo optoe1 0x50 > /sys/bus/i2c/devices/i2c-24/$1" + i2c_config "echo optoe1 0x50 > /sys/bus/i2c/devices/i2c-25/$1" + + ;; + "delete_device") + for ((i=20;i<=50;i++)); + do + i2c_config "echo 0x50 > /sys/bus/i2c/devices/i2c-$i/$1" + done + ;; + "media_down") + for ((i=20;i<=23;i++)); + do + # Tx disable for 10G BaseT copper optics + eeprom=/sys/bus/i2c/devices/i2c-$i/$i-0050/eeprom + + # Gen2 or Gen3 copper optics + # Check for F10 encoding (starts with '0f10' or 'df10') at offset 96 and 7 byte size + # and then compare the 'product id' but skip other part of F10 string + f10_encoding=`hexdump -n7 -s96 $eeprom -e'7/1 "%02x"' 2>&1` + if [[ $f10_encoding =~ ^[0d]f10....28....|^[0d]f10....29.... ]]; then + cmd="\x01\x00\x09\x00\x01\x02" + echo -n -e $cmd | dd bs=1 count=6 of=$eeprom seek=506 obs=1 status=none + fi + done + ;; + *) echo "e3224f_platform: switch_board_sfp: invalid command !" + ;; + esac +} + +#Forcibly bring quad-port phy out of reset for 48-1G port functionality + +platform_firmware_versions() { + +FIRMWARE_VERSION_FILE=/var/log/firmware_versions +rm -rf ${FIRMWARE_VERSION_FILE} +# Get BIOS version +echo "BIOS: `dmidecode -s system-version `" > $FIRMWARE_VERSION_FILE +# Get CPU CPLD version +echo "CPU CPLD: $((`cat /sys/devices/platform/dell-e3224f-cpld.0/cpu_cpld_mjr_ver`)).$((`cat /sys/devices/platform/dell-e3224f-cpld.0/cpu_cpld_mnr_ver`))" >> $FIRMWARE_VERSION_FILE +# Get SYS CPLD version +echo "SYS CPLD: $((`cat /sys/devices/platform/dell-e3224f-cpld.0/sys_cpld_mjr_ver`)).$((`cat /sys/devices/platform/dell-e3224f-cpld.0/sys_cpld_mnr_ver`))" >> $FIRMWARE_VERSION_FILE +# Get PORT CPLD version +echo "PORT CPLD: $((`cat /sys/devices/platform/dell-e3224f-cpld.0/port_cpld_mjr_ver`)).$((`cat /sys/devices/platform/dell-e3224f-cpld.0/port_cpld_mnr_ver`))" >> $FIRMWARE_VERSION_FILE + +} + +install_python_api_package() { + device="/usr/share/sonic/device" + platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + + pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl +} + +remove_python_api_package() { + rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null) + if [ $? -eq 0 ]; then + rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null) + fi +} + +get_reboot_cause() { + REBOOT_REASON_FILE="/host/reboot-cause/platform/reboot_reason" + mkdir -p $(dirname $REBOOT_REASON_FILE) + + # Handle First Boot into software version with reboot cause determination support + if [[ ! -e $REBOOT_REASON_FILE ]]; then + echo "0x0" > $REBOOT_REASON_FILE + else + cat /sys/devices/platform/dell-e3224f-cpld.0/reboot_cause > $REBOOT_REASON_FILE + fi + echo "0x0" > /sys/devices/platform/dell-e3224f-cpld.0/reboot_cause +} + + +if [[ "$1" == "init" ]]; then + if [ -f $FIRST_BOOT_FILE ]; then + systemctl enable system-health.service + systemctl start --no-block system-health.service + fi + modprobe i2c-dev + modprobe i2c-mux-pca954x + modprobe pmbus + modprobe emc2305 + modprobe dell_e3224f_platform + + sys_devices "new_device" + get_reboot_cause + switch_board_sfp "new_device" + switch_board_sfp "media_down" + echo 0x00 > /sys/devices/platform/dell-e3224f-cpld.0/sfp_txdis + echo 0xf0 > /sys/devices/platform/dell-e3224f-cpld.0/sfpplus_txdis + echo 0xf3 > /sys/devices/platform/dell-e3224f-cpld.0/qsfp_rst + echo 0x00 > /sys/devices/platform/dell-e3224f-cpld.0/qsfp_lpmode + install_python_api_package + platform_firmware_versions +elif [[ "$1" == "deinit" ]]; then + switch_board_sfp "media_down" + switch_board_sfp "delete_device" + sys_devices "delete_device" + + modprobe -r dell_e3224f_platform + + modprobe -r emc2305 + modprobe -r pmbus + modprobe -r i2c-mux-pca954x + modprobe -r i2c-dev + remove_python_api_package +elif [ "$1" == "media_down" ]; then + switch_board_sfp $1 +else + echo "e3224f_platform : Invalid option !" +fi diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/mux_controller.sh b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/mux_controller.sh new file mode 100755 index 000000000000..f357b1179986 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/mux_controller.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +init_devnum() { + found=0 + for devnum in 0 1; do + devname=`cat /sys/bus/i2c/devices/i2c-${devnum}/name` + # iSMT adapter can be at dff5c000 + echo $devname + if [[ "$devname" == 'SMBus iSMT adapter at '* ]] ; then + found=1 + break + fi + done + + [ $found -eq 0 ] && echo "cannot find iSMT" && exit 0 +} + +init_devnum +while [ 1 ] +do + if [ ! -f /sys/class/i2c-adapter/i2c-${devnum}/${devnum}-0071/idle_state ]; then + sleep 1 + continue + fi + echo -2 > /sys/class/i2c-adapter/i2c-${devnum}/${devnum}-0071/idle_state + break +done diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform-modules-e3224f.sh b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform-modules-e3224f.sh new file mode 100755 index 000000000000..cb6a8b6359e8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform-modules-e3224f.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +function platform-modules-e3224fServicePreStop() +{ + /usr/local/bin/e3224f_platform.sh media_down +} diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform_sensors.py new file mode 100755 index 000000000000..454687e68469 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/platform_sensors.py @@ -0,0 +1,162 @@ +#!/usr/bin/python3 +""" + This provides support for the following objects: + * Onboard temperature sensors + * FAN trays + * PSU +""" + +import subprocess + +output = "" +try: + rc = 0 + output = subprocess.check_output('/usr/bin/sensors', stderr=subprocess.STDOUT, \ + encoding="utf-8").splitlines() + + valid = False + for line in output: + if line.startswith('acpitz') or line.startswith('coretemp'): + valid = True + if valid: + print(line) + if line == '': + valid = False + + print("Onboard Temperature Sensors:") + idx = 0 + for line in output: + if line.startswith('tmp75'): + print('\t' + output[idx+2].split('(')[0]) + idx += 1 + + print("\nFan Trays:") + idx = 0 + found_emc = False + fan_status = [' Normal', ' Abnormal'] + for line in output: + if line.startswith('emc'): + found_emc = True + with open('/sys/devices/platform/dell-e3224f-cpld.0/fan0_prs') as f: + line = f.readline() + present = int(line, 0) + if present: + print('\t' + 'Fan Tray 1:') + with open('/sys/bus/i2c/devices/7-002c/fan1_fault') as f: + line = f.readline() + status = int(line, 0) + print('\t\t' + 'Fan State:' + fan_status[status]) + print('\t\t' + 'Fan Speed:' + (output[idx+2].split('(')[0]).split(':')[1]) + with open('/sys/devices/platform/dell-e3224f-cpld.0/fan0_dir') as f: + line = f.readline() + direction = 'Intake' if line[:-1] == 'B2F' else 'Exhaust' + print('\t\t' + 'Airflow:\t' + direction) + else: + print('\t' + 'Fan Tray 1:\tNot Present') + + with open('/sys/devices/platform/dell-e3224f-cpld.0/fan1_prs') as f: + line = f.readline() + present = int(line, 0) + if present: + print('\t' + 'Fan Tray 2:') + with open('/sys/bus/i2c/devices/7-002c/fan2_fault') as f: + line = f.readline() + status = int(line, 0) + print('\t\t' + 'Fan State:' + fan_status[status]) + print('\t\t' + 'Fan Speed:' + (output[idx+3].split('(')[0]).split(':')[1]) + with open('/sys/devices/platform/dell-e3224f-cpld.0/fan1_dir') as f: + line = f.readline() + direction = 'Intake' if line[:-1] == 'B2F' else 'Exhaust' + print('\t\t' + 'Airflow:\t' + direction) + else: + print('\t' + 'Fan Tray 2:\tNot Present') + + with open('/sys/devices/platform/dell-e3224f-cpld.0/fan2_prs') as f: + line = f.readline() + present = int(line, 0) + if present: + print('\t' + 'Fan Tray 3:') + with open('/sys/bus/i2c/devices/7-002c/fan3_fault') as f: + line = f.readline() + status = int(line, 0) + print('\t\t' + 'Fan State:' + fan_status[status]) + print('\t\t' + 'Fan Speed:' + (output[idx+4].split('(')[0]).split(':')[1]) + with open('/sys/devices/platform/dell-e3224f-cpld.0/fan2_dir') as f: + line = f.readline() + direction = 'Intake' if line[:-1] == 'B2F' else 'Exhaust' + print('\t\t' + 'Airflow:\t' + direction) + else: + print('\t' + 'Fan Tray 3:\tNot Present') + idx += 1 + if not found_emc: + print('\t' + 'Fan Tray 1:\tNot Present') + print('\t' + 'Fan Tray 2:\tNot Present') + print('\t' + 'Fan Tray 3:\tNot Present') + + print('\nPSUs:') + idx = 0 + with open('/sys/devices/platform/dell-e3224f-cpld.0/psu0_prs') as f: + line = f.readline() + found_psu1 = int(line, 0) + if not found_psu1: + print('\tPSU1:\tNot Present') + else: + for line in output: + if line.startswith('dps460-i2c-10'): + with open('/sys/devices/platform/dell-e3224f-cpld.0/psu0_status') as f: + line = f.readline() + status = int(line, 0) + if not status: + print('\tPSU1:\tNot OK') + break + with open('/sys/bus/i2c/devices/10-0056/eeprom', encoding="ISO-8859-1") as f: + line = f.readline() + direction = 'Exhaust' if 'FORWARD' in line else 'Intake' + print('\tPSU1:') + print('\t\t' + output[idx+2].split('(')[0]) + print('\t\t' + output[idx+4].split('(')[0]) + print('\t\t' + output[idx+6].split('(')[0]) + print('\t\t' + output[idx+7].split('(')[0]) + print('\t\t' + output[idx+9].split('(')[0]) + print('\t\t' + output[idx+11].split('(')[0]) + print('\t\t' + output[idx+13].split('(')[0]) + print('\t\t' + output[idx+14].split('(')[0]) + print('\t\t' + output[idx+16].split('(')[0]) + print('\t\t' + output[idx+17].split('(')[0]) + print('\t\t' + 'Airflow:\t\t ' + direction) + idx += 1 + idx = 0 + with open('/sys/devices/platform/dell-e3224f-cpld.0/psu1_prs') as f: + line = f.readline() + found_psu2 = int(line, 0) + if not found_psu2: + print('\tPSU2:\tNot Present') + else: + for line in output: + if line.startswith('dps460-i2c-11'): + with open('/sys/devices/platform/dell-e3224f-cpld.0/psu1_status') as f: + line = f.readline() + status = int(line, 0) + if not status: + print('\tPSU2:\tNot OK') + break + print('\tPSU2:') + with open('/sys/bus/i2c/devices/11-0056/eeprom', encoding="ISO-8859-1") as f: + line = f.readline() + direction = 'Exhaust' if 'FORWARD' in line else 'Intake' + print('\t\t' + output[idx+2].split('(')[0]) + print('\t\t' + output[idx+4].split('(')[0]) + print('\t\t' + output[idx+6].split('(')[0]) + print('\t\t' + output[idx+7].split('(')[0]) + print('\t\t' + output[idx+9].split('(')[0]) + print('\t\t' + output[idx+11].split('(')[0]) + print('\t\t' + output[idx+13].split('(')[0]) + print('\t\t' + output[idx+14].split('(')[0]) + print('\t\t' + output[idx+16].split('(')[0]) + print('\t\t' + output[idx+17].split('(')[0]) + print('\t\t' + 'Airflow:\t\t ' + direction) + idx += 1 + +except subprocess.CalledProcessError as err: + print("Exception when calling get_sonic_error -> %s\n" %(err)) + rc = err.returncode diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/portiocfg.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/portiocfg.py new file mode 100755 index 000000000000..035a75bcc4dc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/portiocfg.py @@ -0,0 +1,105 @@ +#!/usr/bin/python3 +# Copyright (c) 2015 Dell Inc. +# +# 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 +# +# THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT +# LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS +# FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. +# +# See the Apache Version 2.0 License for specific language governing +# permissions and limitations under the License. +#Script to read/write the portio based registers + +import sys +import os +import getopt +import struct + +resource = '/dev/port' + +def usage(): + ''' This is the Usage Method ''' + + print('\t\t portiocfg.py --default') + print('\t\t portiocfg.py --get --offset ') + print('\t\t portiocfg.py --set --val --offset ') + sys.exit(1) + +def portio_reg_read(resource, offset): + fd = os.open(resource, os.O_RDONLY) + if fd < 0: + print('file open failed %s"%resource') + return + if os.lseek(fd, offset, os.SEEK_SET) != offset: + print('lseek failed on %s'%resource) + return + buf = os.read(fd, 1) + reg_val1 = ord(buf) + print('reg value %x'%reg_val1) + os.close(fd) + +def portio_reg_write(resource, offset, val): + fd = os.open(resource, os.O_RDWR) + if fd < 0: + print('file open failed %s"%resource') + return + if os.lseek(fd, offset, os.SEEK_SET) != offset: + print('lseek failed on %s'%resource) + return + ret = os.write(fd, struct.pack('B', val)) + if ret != 1: + print('write failed %d'%ret) + return + os.close(fd) + +def main(argv): + + ''' The main function will read the user input from the + command line argument and process the request ''' + + opts = '' + val = '' + choice = '' + resource = '' + offset = '' + + try: + opts, args = getopt.getopt(argv, "hgs:", \ + ["val=", "offset=", "help", "get", "set"]) + + except getopt.GetoptError: + usage() + + for opt, arg in opts: + + if opt in ('-h', '--help'): + choice = 'help' + + elif opt in ('-g', '--get'): + choice = 'get' + + elif opt in ('-s', '--set'): + choice = 'set' + + elif opt == '--offset': + offset = int(arg, 16) + + elif opt == '--val': + val = int(arg, 16) + + if choice == 'get' and offset != '': + portio_reg_read(resource, offset) + + elif choice == 'set' and offset != '' and val != '': + portio_reg_write(resource, offset, val) + + else: + usage() + +#Calling the main method +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/ports_xcvrd_notify.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/ports_xcvrd_notify.py new file mode 100755 index 000000000000..c791590fb576 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/ports_xcvrd_notify.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 + +""" + port_notify + port notify status change for SONiC +""" + +try: + from datetime import datetime + from swsscommon import swsscommon + from sonic_py_common import daemon_base, logger +except ImportError as e: + raise ImportError (str(e) + " - required module not found") + +# +# Constants ==================================================================== +# + +SYSLOG_IDENTIFIER = "port_notify" + + +STATE_PORT_TABLE = 'PORT_TABLE' + + +RJ45_PORT_START = 0; +RJ45_PORT_END = 47; + +# Global logger class instance +helper_logger = logger.Logger(SYSLOG_IDENTIFIER) + +XCVR_STATE_EMPTY = 0 +XCVR_STATE_ERROR = 1 +XCVR_STATE_INCOMP = 2 +XCVR_STATE_CONFIG = 3 +XCVR_STATE_READY = 4 +XCVR_STATE_TIMEOUT = 5 + +xcvr_state_tbl = { + XCVR_STATE_EMPTY: { "xcvr_state": "N/A", "xcvr_app_status": "down" }, + XCVR_STATE_ERROR: { "xcvr_state": "Error", "xcvr_app_status": "down" }, + XCVR_STATE_INCOMP: { "xcvr_state": "Incompatible", "xcvr_app_status": "up" }, + XCVR_STATE_CONFIG: { "xcvr_state": "Config", "xcvr_app_status": "down" }, + XCVR_STATE_TIMEOUT: { "xcvr_state": "Timeout", "xcvr_app_status": "up" }, + XCVR_STATE_READY: { "xcvr_state": "Ready", "xcvr_app_status": "up" } +} + +# Wait for port init is done +def wait_for_port_init_done(): + # Connect to APPL_DB and subscribe to PORT table notifications + appl_db = daemon_base.db_connect("APPL_DB") + + sel = swsscommon.Select() + sst = swsscommon.SubscriberStateTable(appl_db, swsscommon.APP_PORT_TABLE_NAME) + sel.addSelectable(sst) + + # Make sure this daemon started after all port configured + while True: + (state, c) = sel.select(1000) + if state == swsscommon.Select.TIMEOUT: + continue + if state != swsscommon.Select.OBJECT: + helper_logger.log_warning("sel.select() did not return swsscommon.Select.OBJECT") + continue + + (key, op, fvp) = sst.pop() + + # Wait until PortInitDone + if key in ["PortInitDone"]: + break + +def notify_port_xcvr_status(port_name, app_status_port_tbl, state_port_tbl, flag): + + fvs = swsscommon.FieldValuePairs([("xcvr_status", xcvr_state_tbl[flag]["xcvr_app_status"])]) + tm = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + state_fvs = swsscommon.FieldValuePairs([("xcvr_status", xcvr_state_tbl[flag]["xcvr_state"]), ("xcvr_time", tm)]) + + state_port_tbl.set(port_name, state_fvs) + + app_status_port_tbl.set(port_name, fvs) + + helper_logger.log_notice("Port {} xcvr_app_status change to {}".format(port_name, xcvr_state_tbl[flag]["xcvr_app_status"])) + return True + + +def main(): + helper_logger.log_notice("Start port_notify") + # Connect to APP_DB and create transceiver dom info table + appl_db = daemon_base.db_connect("APPL_DB") + + app_status_port_tbl = swsscommon.ProducerStateTable(appl_db, + swsscommon.APP_PORT_APP_STATUS_TABLE_NAME) + + state_db = daemon_base.db_connect("STATE_DB") + state_port_tbl = swsscommon.Table(state_db, STATE_PORT_TABLE) + + # Wait for PortInitDone + wait_for_port_init_done() + + for port in range(RJ45_PORT_START, RJ45_PORT_END+1): + #print("Ethernet{}".format(port)) + notify_port_xcvr_status("Ethernet{}".format(port), app_status_port_tbl, state_port_tbl, XCVR_STATE_READY) + + helper_logger.log_notice("End port_notify") + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/sensors b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/sensors new file mode 100755 index 000000000000..572b9d45e9e3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/scripts/sensors @@ -0,0 +1,8 @@ +#!/bin/bash +#docker exec -i pmon sensors "$@" +docker exec -i pmon /usr/bin/platform_sensors.py "$@" + +#To probe sensors not part of lm-sensors +#if [ -r /usr/local/bin/platform_sensors.py ]; then +# python /usr/local/bin/platform_sensors.py +#fi diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/setup.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/setup.py new file mode 120000 index 000000000000..4f6de9941d96 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/setup.py @@ -0,0 +1 @@ +../s6100/setup.py \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/__init__.py new file mode 100644 index 000000000000..3e1260e6b854 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/__init__.py @@ -0,0 +1,8 @@ +""" +Module sonic_platform provides the platform dependent population of +platform.py, chassis.py, component.py, sfp.py, thermal.py, psu.py, +fan.py and watchdog.py +""" +__all__ = ["platform", "chassis", "sfp", "eeprom", "component", "thermal", "psu", "fan", "fan_drawer", "watchdog"] +from sonic_platform import * + diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/chassis.py new file mode 100644 index 000000000000..15dddd1b4126 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/chassis.py @@ -0,0 +1,442 @@ +#!/usr/bin/env python + +############################################################################# +# DELLEMC E3224F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + import os + import sys + import time + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.sfp import Sfp + from sonic_platform.eeprom import Eeprom + from sonic_platform.component import Component + from sonic_platform.psu import Psu + from sonic_platform.thermal import Thermal + from sonic_platform.watchdog import Watchdog + from sonic_platform.fan_drawer import FanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +MAX_E3224F_FANTRAY = 3 +MAX_E3224F_FAN = 1 +MAX_E3224F_PSU = 2 +MAX_E3224F_THERMAL = 5 +MAX_E3224F_COMPONENT = 3 # BIOS, CPU CPLD and SYS CPLD + +media_part_num_list = set([ \ +"8T47V","XTY28","MHVPK","GF76J","J6FGD","F1KMV","9DN5J","H4DHD","6MCNV","0WRX0","X7F70","5R2PT","WTRD1","WTRD1","WTRD1","WTRD1","5250G","WTRD1","C5RNH","C5RNH","FTLX8571D3BCL-FC", +"C5RNH","5250G","N8TDR","7D64H","7D64H","RN84N","RN84N","HMTNW","6K3Y6","6K3Y6","TY5FM","50M0R","PGYJT","WP2PP","85Y13","1HCGH","FP9R1","FYD0M","C6Y7M","C6Y7M","V250M","V250M", +"5CWK6","5CWK6","53HVN","53HVN","358VV","358VV","MV799","MV799","YJF03","P9GND","T1KCN","1DXKP","MT7R2","K0T7R","W5G04","7TCDN","7TCDN","7TCDN","7TCDN","7TCDN","V3XJK","0MV31", +"5FVP7","N6KM9","C41MF","77KC3","XW7J0","V4NJV","2XJHY","H93DH","H93DH","F8CG0","F8CG0","F8CG0","119N6","WFMF5","794RX","288F6","1M31V","1M31V","5NP8R","5NP8R","4TC09","4TC09", +"FC6KV","FC6KV","J90VN","J90VN","05RH0","05RH0","YDN52","0C2YV","YDN52","0C2YV","9JT65","D7M6H","6GW14","FYVFW","0VF5H","P4YPY","P4YPY","TCPM2","TCPM2","JNPF8","JNPF8","27GG5", +"27GG5","P8T4W","P8T4W","JR54Y","M6N0J","XJYD0","K44H9","035KG","P7C7N","76V43","3CC35","FN4FC","26FN3","YFNDD","YFNDD","7R9N9","035KG","P7C7N","76V43","3CC35","PLRXPLSCS43811", +"FN4FC","26FN3","YFNDD","YFNDD","7R9N9","G86YJ","V407F","V407F","9KH6T","G86YJ","V407F","9KH6T","2JVDD","D0R73","VXFJY","9X8JP","2JVDD","D0R73","VXFJY","9X8JP","2JVDD","D0R73","VXFJY", +"9X8JP","GMFC5","GMFC5","GMFC5","D7P80","3MFXG","3MFXG","0GWXJ","THPF3","THPF3","THPF3","THPF3","THPF3","PJ62G","3XCX1","JJYKG","RRRTK","16K56","86JM2","K5R6C","7MG2C","WTPPN","9HTT2", +"NKM4F","VXGGG","JC9W6","6MR8M","RP3GV","M5PPJ","XKY55","TKCXT","05J8P","5WGKD","XFDRT","NW8DM","YPKH3","5WGKD","XFDRT","NW8DM","YPKH3","71XXK","MVCX6","0XYP6","HPPVW","3GHRT","71XXK", +"MVCX6","0XYP6","HPPVW","3GHRT","2X5T6","135V2","KD5MV","2X5T6","KD5MV","HHFK0","3YWG7","5CMT2","RCVP5","X5DH4","HHFK0","3YWG7","5CMT2","RCVP5","X5DH4","3YWG7","5CMT2","RCVP5","X5DH4", +"4WJ41","4WJ41","14NV5","14NV5","14NV5","4WGYD","YKMH7","X7CCC","X7CCC","0X9CT","0CY8V","P7D7R","W4GPP","W4GPP","W4GPP","HHHCHC","07RN7","07RN7","0YR96","0YR96","JCYM9","FTLX8571D3BCL", +"DDW0X","VPFDJ","229KM","9FC7D","DDW0X","VPFDJ","6FMR5","J7K20","N3K9W","6FMR5","8R4VM","7VN5T","D9YM8","8R4VM","VYXPW","87TPX","WY6FK","VYXPW","87TPX","WY6FK","WG8C4","N8K82","2DV6Y", +"77C3C","RC0HM","77C3C","RC0HM","JHXTN","3P3PG","92YVM","4VX5M","4VX5M","6RRGD","W4JWV","22V6R","XR11M","9GMDY","JMCWK","TP2F0","6MGDY","78RHK", "C0TP5","0WDNV","FCLF8522P2BTL"\ +]) +class Chassis(ChassisBase): + """ + DELLEMC Platform-specific Chassis class + """ + REBOOT_CAUSE_PATH = "/host/reboot-cause/platform/reboot_reason" + CPLD_DIR = '/sys/devices/platform/dell-e3224f-cpld.0/' + + _global_port_pres_dict = {} + + _sfpp_port_to_i2c_mapping = { + 25: 20, + 26: 21, + 27: 22, + 28: 23, + 29: 24, + 30: 25, + 1: 27, + 2: 28, + 3: 29, + 4: 30, + 5: 31, + 6: 32, + 7: 33, + 8: 34, + 9: 35, + 10: 36, + 11: 37, + 12: 38, + 13: 39, + 14: 40, + 15: 41, + 16: 42, + 17: 43, + 18: 44, + 19: 45, + 20: 46, + 21: 47, + 22: 48, + 23: 49, + 24: 50, + } + SYSTEM_LED_COLORS = { + "green", + "blink_green", + "yellow", + "blink_yellow" + } + + def __init__(self): + ChassisBase.__init__(self) + # sfp.py will read eeprom contents and retrive the eeprom data. + # We pass the eeprom path from chassis.py + self.PORT_START = 1 + self.PORT_END = 30 + self.PORTS_IN_BLOCK = (self.PORT_END + 1) + self.SFP_PORT_START = 1 + self._sfp_port = range(self.SFP_PORT_START, self.PORTS_IN_BLOCK) + eeprom_base = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + for index in range(self.PORT_START, self.PORTS_IN_BLOCK): + eeprom_path = '' + if index in self._sfp_port: + eeprom_path = eeprom_base.format(self._sfpp_port_to_i2c_mapping[index]) + if(index < 29): + port_type = 'SFP' + else: + port_type = 'QSFP' + + sfp_node = Sfp(index, port_type, eeprom_path) + self._sfp_list.append(sfp_node) + + self._eeprom = Eeprom() + self._watchdog = Watchdog() + self._num_sfps = 30 + self._num_fans = MAX_E3224F_FANTRAY * MAX_E3224F_FAN + for k in range(MAX_E3224F_FANTRAY): + fandrawer = FanDrawer(k) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + self._psu_list = [Psu(i) for i in range(MAX_E3224F_PSU)] + self._thermal_list = [Thermal(i) for i in range(MAX_E3224F_THERMAL)] + self._component_list = [Component(i) for i in range(MAX_E3224F_COMPONENT)] + for port_num in self._sfp_port: + # sfp get uses zero-indexing, but port numbers start from 1 + presence = self.get_sfp(port_num-1).get_presence() + self._global_port_pres_dict[port_num] = '1' if presence else '0' + + self._watchdog = Watchdog() + self.status_led_reg = "system_led" + self.locator_led_reg = "locator_led" + self.LOCATOR_LED_ON = "blink_blue" + self.LOCATOR_LED_OFF = self.STATUS_LED_COLOR_OFF + + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_reg_file = self.CPLD_DIR + '/' + reg_name + try: + with open(cpld_reg_file, 'r') as fd: + rv = fd.read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') + + def _set_cpld_register(self, reg_name, value): + # On successful write, returns the value will be written on + # reg_name and on failure returns 'ERR' + rv = 'ERR' + cpld_reg_file = self.CPLD_DIR + '/' + reg_name + + if (not os.path.isfile(cpld_reg_file)): + return rv + + try: + with open(cpld_reg_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception: + rv = 'ERR' + + return rv + + def get_status_led(self): + """ + Gets the current system LED color + + Returns: + A string that represents the supported color + """ + + color = self._get_cpld_register(self.status_led_reg) + + if color not in list(self.SYSTEM_LED_COLORS): + return self.sys_ledcolor + + return color + + def initizalize_system_led(self): + self.sys_ledcolor = "green" + + def set_status_led(self,color): + """ + Set system LED status based on the color type passed in the argument. + Argument: Color to be set + Returns: + bool: True is specified color is set, Otherwise return False + """ + + if color not in list(self.SYSTEM_LED_COLORS): + return False + if(not self._set_cpld_register(self.status_led_reg, color)): + return False + + self.sys_ledcolor = color + return True + +# check for this event change for sfp / do we need to handle timeout/sleep + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + """ + port_dict = {} + change_dict = {} + change_dict['sfp'] = port_dict + while True: + for port_num in self._sfp_port: + # sfp get uses zero-indexing, but port numbers start from 1 + presence = self.get_sfp(port_num-1).get_presence() + if(presence and self._global_port_pres_dict[port_num] == '0'): + self._global_port_pres_dict[port_num] = '1' + port_dict[port_num] = '1' + elif(not presence and self._global_port_pres_dict[port_num] == '1'): + self._global_port_pres_dict[port_num] = '0' + port_dict[port_num] = '0' + + if(len(port_dict) > 0): + return True, change_dict + + time.sleep(0.5) + + + + def get_sfp(self, index): + """ + Retrieves sfp represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 0. + For example, 0 for Ethernet0, 1 for Ethernet4 and so on. + + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + + try: + # The index will start from 0 + sfp = self._sfp_list[index-1] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + return self._eeprom.modelstr() + + def get_presence(self): + """ + Retrieves the presence of the chassis + Returns: + bool: True if chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the chassis + Returns: + string: Model/part number of chassis + """ + return self._eeprom.part_number_str() + + def get_serial(self): + """ + Retrieves the serial number of the chassis (Service tag) + Returns: + string: Serial number of chassis + """ + return self._eeprom.serial_str() + + def get_status(self): + """ + Retrieves the operational status of the chassis + Returns: + bool: A boolean value, True if chassis is operating properly + False if not + """ + return True + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.base_mac_addr('') + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.serial_number_str() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.system_eeprom_info() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + try: + with open(self.REBOOT_CAUSE_PATH) as fd: + reset_reason = int(fd.read(), 16) + except: + return(ChassisBase.REBOOT_CAUSE_NON_HARDWARE, None) + + if (reset_reason & 0x02) : + return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, 'Shutdown by CPU') + elif (reset_reason & 0x04) : + return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, "Failed to boot from configured boot device") + elif (reset_reason & 0x8) : + return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, "Booted from Backup BIOS") + elif (reset_reason & 0x10) : + return(ChassisBase.REBOOT_CAUSE_WATCHDOG, None) + elif (reset_reason & 0x20): + return(ChassisBase.REBOOT_CAUSE_THERMAL_OVERLOAD_CPU) + elif (reset_reason & 0x40) : + return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, 'Warm Reset') + elif (reset_reason & 0x80) : + return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, 'Cold Reset') + elif (reset_reason & 0x01) : + return (ChassisBase.REBOOT_CAUSE_POWER_LOSS, None) + + def get_eeprom(self): + """ + Retrieves the Sys Eeprom instance for the chassis. + Returns : + The instance of the Sys Eeprom + """ + return self._eeprom + + def get_num_fans(self): + """ + Retrives the number of Fans on the chassis. + Returns : + An integer represents the number of Fans on the chassis. + """ + return self._num_fans + + def get_num_sfps(self): + """ + Retrives the numnber of Media on the chassis. + Returns: + An integer represences the number of SFPs on the chassis. + """ + return self._num_sfps + + def get_qualified_media_list(self): + return media_part_num_list + + def set_locator_led(self, color): + """ + Sets the state of the Chassis Locator LED + + Args: + color: A string representing the color with which to set the Chassis Locator LED + + Returns: + bool: True if the Chassis Locator LED state is set successfully, False if not + + """ + if color == self.LOCATOR_LED_ON or color == self.LOCATOR_LED_OFF: + rv = self._set_cpld_register(self.locator_led_reg, color) + if (rv != 'ERR'): + return True + else: + return False + + def get_locator_led(self): + """ + Gets the state of the Chassis Locator LED + + Returns: + LOCATOR_LED_ON or LOCATOR_LED_OFF + """ + loc_led = self._get_cpld_register(self.locator_led_reg) + if (loc_led != 'ERR'): + # Actually driver returns the color code 'blink_blue' + # Returning "blue_blink" to make it common to all platforms output + if (loc_led == self.LOCATOR_LED_ON): + self.LOCATOR_LED_ON = self.STATUS_LED_COLOR_BLUE_BLINK + return self.LOCATOR_LED_ON + else: + return self.LOCATOR_LED_OFF + else: + return self.LOCATOR_LED_OFF + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether Chassis is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + def get_revision(self): + """ + Retrives the hardware revision of the device + + Returns: + string: Revision value of device + """ + return self._eeprom.revision_str() diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/component.py new file mode 100644 index 000000000000..778727d6bc4b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/component.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python + +######################################################################## +# DELLEMC E3224F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, BMC etc.) available in +# the platform +# +######################################################################## + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") +def get_bios_version(): + return subprocess.check_output(['dmidecode', '-s', 'system-version']).strip().decode() + +def get_cpld_version(cpld): + mjr_ver_path = '/sys/devices/platform/dell-e3224f-cpld.0/' + cpld + '_mjr_ver' + mnr_ver_path = '/sys/devices/platform/dell-e3224f-cpld.0/' + cpld + '_mnr_ver' + mjr_ver = subprocess.check_output(['cat', mjr_ver_path]).strip()[2:].decode() + mnr_ver = subprocess.check_output(['cat', mnr_ver_path]).strip()[2:].decode() + return (str(mjr_ver) + '.' + str(mnr_ver)) + +class Component(ComponentBase): + """DellEMC Platform-specific Component class""" + + CHASSIS_COMPONENTS = [ + ['BIOS', + 'Performs initialization of hardware components during booting', + get_bios_version() + ], + ['CPU CPLD', + 'Used for managing the CPU power sequence and CPU states', + get_cpld_version('cpu_cpld') + ], + ['SYS CPLD', + 'Used for managing FAN, PSU, SFP+ modules (25-28) and QSFP modules (29-30)', + get_cpld_version('sys_cpld') + ], + ['PORT CPLD', + 'Used for managing SFP modules (1-24)', + get_cpld_version('port_cpld') + ] + ] + + def __init__(self, component_index=0): + self.index = component_index + self.name = self.CHASSIS_COMPONENTS[self.index][0] + self.description = self.CHASSIS_COMPONENTS[self.index][1] + self.version = self.CHASSIS_COMPONENTS[self.index][2] + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return self.name + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + Returns: + A string containing the firmware version of the component + """ + return self.version + + def install_firmware(self, image_path): + """ + Installs firmware to the component + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install was successful, False if not + """ + return False + + def get_presence(self): + """ + Retrieves the presence of the component + Returns: + bool: True if present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the part number of the component + Returns: + string: Part number of component + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the component + Returns: + string: Serial number of component + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the component + Returns: + bool: True if component is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether component is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/eeprom.py new file mode 100644 index 000000000000..4ee3d12b899e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/eeprom.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python + +############################################################################# +# DellEmc E3224F +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# +try: + import os.path + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self): + self.eeprom_path = None + f = '/sys/class/i2c-adapter/i2c-2/2-0050/eeprom' + if not os.path.exists(f): + return + self.eeprom_path = f + super(Eeprom, self).__init__(self.eeprom_path, 0, '', True) + self.eeprom_tlv_dict = dict() + try: + self.eeprom_data = self.read_eeprom() + except Exception: + self.eeprom_data = "N/A" + raise RuntimeError("Eeprom is not Programmed") + + eeprom = self.eeprom_data + + if not self.is_valid_tlvinfo_header(eeprom): + return + + total_length = ((eeprom[9]) << 8) | (eeprom[10]) + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_length + + while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end: + if not self.is_valid_tlv(eeprom[tlv_index:]): + break + + tlv = eeprom[tlv_index:tlv_index + 2 + + (eeprom[tlv_index + 1])] + code = "0x%02X" % ((tlv[0])) + + + name, value = self.decoder(None, tlv) + + self.eeprom_tlv_dict[code] = value + if (eeprom[tlv_index]) == self._TLV_CODE_CRC_32: + break + + tlv_index += (eeprom[tlv_index+1]) + 2 + + def serial_number_str(self): + """ + Returns the serial number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_SERIAL_NUMBER) + if not is_valid: + return "N/A" + return results[2].decode('ascii') + + def base_mac_addr(self, e): + """ + Returns the base mac address found in the system EEPROM + """ + (is_valid, t) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_MAC_BASE) + if not is_valid or t[1] != 6: + return super(TlvInfoDecoder, self).switchaddrstr(e) + + return ":".join(["{:02x}".format(T) for T in t[2]]).upper() + + def modelstr(self): + """ + Returns the Model name + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_PRODUCT_NAME) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def part_number_str(self): + """ + Returns the part number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_PART_NUMBER) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def serial_str(self): + """ + Returns the servicetag number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_SERVICE_TAG) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def revision_str(self): + """ + Returns the device revision + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_DEVICE_VERSION) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def system_eeprom_info(self): + """ + Returns a dictionary, where keys are the type code defined in + ONIE EEPROM format and values are their corresponding values + found in the system EEPROM. + """ + return self.eeprom_tlv_dict diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan.py new file mode 100644 index 000000000000..620a398c24c7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC E3224F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fans' information which are available in the platform. +# +######################################################################## +try: + import os + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Fan(FanBase): + """DellEMC Platform-specific Fan class""" + + def __init__(self, fantray_index=0, fan_index=0, psu_fan=False, dependency=None): + self.is_psu_fan = psu_fan + + if not self.is_psu_fan: + # API index is starting from 0, DellEMC platform index is + # starting from 1 + self.presence_reg = "fan{}_prs".format(fantray_index) + self.dir_reg = "fan{}_dir".format(fantray_index) + self.rpm_file = "/sys/bus/i2c/devices/7-002c/fan{}_input".format(fantray_index+1) + self.status_file = "/sys/bus/i2c/devices/7-002c/fan{}_fault".format(fantray_index+1) + self.eeprom = "/sys/bus/i2c/devices/{}-0050/eeprom".format(15 + fantray_index) + self.fantray_index = fantray_index + self.fan_index = fan_index + else: + self.psu_index = fan_index - 1 + self.dependancy = dependency + self.presence_reg = "psu{}_prs".format(self.psu_index) + self.status_reg = "psu{}_status".format(self.psu_index) + self.dir_reg = "" + self.dps_hwmon = "/sys/bus/i2c/devices/{}-005e/hwmon/".format(self.psu_index + 10) + self.eeprom = "/sys/bus/i2c/devices/{}-0056/eeprom".format(self.psu_index + 10) + self.fan_index = fan_index + self.max_speed = 0 + + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + try: + with open(cpld_reg_file, 'r')as fd: + buf = fd.read() + except (IOError, AttributeError): + return 'ERR' + return buf.strip('\r\n').lstrip(' ') + + def get_name(self): + """ + Retrieves the name of the device + Returns: + String: The name of the device + """ + if self.is_psu_fan: + return "PSU{} Fan".format(self.psu_index+1) + else: + return "FanTray{}-Fan{}".format(self.fantray_index+1, self.fan_index+1) + + def get_model(self): + """ + Retrieves the part number of the FAN + Returns: + String: Part number of FAN + """ + try: + val = open(self.eeprom, "rb").read()[13:19] + except Exception: + val = None + return val.decode() + + def get_serial(self): + """ + Retrieves the serial number of the FAN + Returns: + String: Serial number of FAN + """ + try: + val = open(self.eeprom, "rb").read()[21:41] + except Exception: + val = None + return val.decode() + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if fan is present, False if not + """ + + presence = self._get_cpld_register(self.presence_reg) + if presence == 'ERR': + return False + if int(presence,0) == 1: + return True + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + if not self.is_psu_fan: + status = open(self.status_file, "rb").read() + if int(status, 0) == 1: + return False + else: + return True + else: + status = self._get_cpld_register(self.status_reg) + if status == 'ERR': + return False + if int(status, 0) == 1: + return True + else: + return False + + def get_direction(self): + """ + Retrieves the fan airfow direction + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + + Notes: + In DellEMC platforms, + - Forward/Exhaust : Air flows from Port side to Fan side. + - Reverse/Intake : Air flows from Fan side to Port side. + """ + if not self.is_psu_fan: + val = self._get_cpld_register(self.dir_reg) + direction = 'exhaust' if val == 'F2B' else 'intake' + if direction == 'ERR': + return None + else: + try: + val = open(self.eeprom, "rb").read()[0xe1:0xe8] + except Exception: + return None + direction = 'exhaust' if val == 'FORWARD' else 'intake' + return direction + + def get_speed(self): + """ + Retrieves the speed of the fan + Returns: + int: percentage of the max fan speed + """ + if self.max_speed == 0: + self.max_speed = 23500 + fan_speed = 0 + try: + if not self.is_psu_fan: + rpm_file = self.rpm_file + else: + dps_dir = self.dps_hwmon + '/' + os.listdir(self.dps_hwmon)[0] + rpm_file = dps_dir + '/' + 'fan1_input' + fan_speed = int(open(rpm_file, "rb").read()) + except Exception: + return None + speed = (100 * fan_speed)//self.max_speed + return speed + + def get_speed_rpm(self): + """ + Retrieves the speed of the fan + Returns: + int: percentage of the max fan speed + """ + fan_speed = 0 + try: + if not self.is_psu_fan: + rpm_file = self.rpm_file + else: + dps_dir = self.dps_hwmon + '/' + os.listdir(self.dps_hwmon)[0] + rpm_file = dps_dir + '/' + 'fan1_input' + fan_speed = int(open(rpm_file, "rb").read()) + except Exception: + return None + return fan_speed + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fan_index + + def is_replaceable(self): + """ + Indicate whether Fan is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + if self.get_presence(): + # The tolerance value is fixed as 20% for all the DellEMC platforms + tolerance = 20 + else: + tolerance = 0 + + return tolerance + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan status LED + Returns: + bool: True if set success, False if fail. + """ + # E3224F has led only on FanTray and not available for seperate fans + return True + + def get_status_led(self): + """ + Gets the current system LED color + + Returns: + A string that represents the supported color + """ + + return None + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + # Return current speed to avoid false thermalctld alarm. + return self.get_speed() + diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..a7619fa70b1f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/fan_drawer.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC E3224F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +E3224F_FANS_PER_FANTRAY = 1 + + +class FanDrawer(FanDrawerBase): + """DellEMC Platform-specific Fan class""" + + FANTRAY_LED_COLORS = { + "off", + "green", + "yellow" + } + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 1-based in DellEMC platforms + self.fantray_led_reg = "fan{}_led".format(fantray_index) + self.fantrayindex = fantray_index + 1 + for i in range(E3224F_FANS_PER_FANTRAY): + self._fan_list.append(Fan(fantray_index, i)) + + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + try: + rv = open(cpld_reg_file, 'r').read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') + + def _set_cpld_register(self, reg_name, value): + # On successful write, returns the value will be written on + # reg_name and on failure returns 'ERR' + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + + try: + with open(cpld_reg_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception: + rv = 'ERR' + + return rv + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex) + + def get_status_led(self): + """ + Gets the current system LED color + + Returns: + A string that represents the supported color + """ + + color = self._get_cpld_register(self.fantray_led_reg) + + #if color not in list(self.FANTRAY_LED_COLORS): + # return self.sys_ledcolor + + return color + + def set_status_led(self,color): + """ + Set system LED status based on the color type passed in the argument. + Argument: Color to be set + Returns: + bool: True is specified color is set, Otherwise return False + """ + + if color not in list(self.FANTRAY_LED_COLORS): + return False + + if(not self._set_cpld_register(self.fantray_led_reg, color)): + return False + + return True + + def get_presence(self): + """ + Retrives the presence of the fan drawer + Returns: + bool: True if fan_tray is present, False if not + """ + return self.get_fan(0).get_presence() + + def get_model(self): + """ + Retrieves the part number of the fan drawer + Returns: + string: Part number of fan drawer + """ + return "NA" + + def get_serial(self): + """ + Retrieves the serial number of the fan drawer + Returns: + string: Serial number of the fan drawer + """ + return "NA" + + def get_status(self): + """ + Retrieves the operational status of the fan drawer + Returns: + bool: True if fan drawer is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fantrayindex + + def is_replaceable(self): + """ + Indicate whether this fan drawer is replaceable. + Returns: + bool: True if it is replaceable, False if not + """ + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return 0.0 diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/platform.py new file mode 100644 index 000000000000..996d94cf5a6e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/platform.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + """ + DELLEMC Platform-specific class + """ + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/psu.py new file mode 100644 index 000000000000..38118f6390cc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/psu.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC E3224F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs' information which are available in the platform +# +######################################################################## + +try: + import os + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Psu(PsuBase): + """DellEMC Platform-specific PSU class""" + + def __init__(self, psu_index): + PsuBase.__init__(self) + self.index = psu_index + 1 # PSU is 1-based in DellEMC platforms + self.psu_presence_reg = "psu{}_prs".format(psu_index) + self.psu_status = "psu{}_status".format(psu_index) + self.eeprom = "/sys/bus/i2c/devices/{}-0056/eeprom".format(10+psu_index) + self.psu_voltage_reg = 'in3_input' + self.psu_current_reg = 'curr2_input' + self.psu_power_reg = 'power2_input' + self.dps_hwmon = "/sys/bus/i2c/devices/{}-005e/hwmon/".format(10 + psu_index) + self.dps_hwmon_exist = os.path.exists(self.dps_hwmon) + self._fan_list.append(Fan(fan_index=self.index, psu_fan=True, dependency=self)) + + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + try: + with open(cpld_reg_file, 'r') as fd: + rv = fd.read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') + + def _get_dps_register(self, reg_name): + try : + dps_dir = self.dps_hwmon + '/' + os.listdir(self.dps_hwmon)[0] + dps_reg_file = dps_dir + '/' + reg_name + with open(dps_reg_file, 'r') as fd: + rv = fd.read() + except (IOError, OSError) : return 'ERR' + return rv + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return "PSU{}".format(self.index) + + def _reload_dps_module(self): + try: + file = "/sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('0x56\n') + except (IOError, OSError): + pass + try: + file = "/sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('0x5e\n') + except (IOError, OSError): + pass + try: + file = "/sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('24c02 0x56\n') + file = "/sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('dps460 0x5e\n') + except (IOError, OSError): + pass + + def get_presence(self): + """ + Retrieves the presence of the Power Supply Unit (PSU) + + Returns: + bool: True if PSU is present, False if not + """ + presence = self._get_cpld_register(self.psu_presence_reg).strip() + if presence == 'ERR': + return False + + status = self.get_status() + if int(presence, 0) and status == False: + return int(presence, 0) + + if not self.dps_hwmon_exist and int(presence, 0): + self.dps_hwmon_exist = os.path.exists(self.dps_hwmon) + if not self.dps_hwmon_exist: + self._reload_dps_module() + if int(presence, 0) == 1: + return True + return False + + def get_model(self): + """ + Retrieves the part number of the PSU + + Returns: + string: Part number of PSU + """ + try: val = open(self.eeprom, "rb").read()[0x50:0x62] + except Exception: + val = None + return val.decode('ascii') + + def get_serial(self): + """ + Retrieves the serial number of the PSU + + Returns: + string: Serial number of PSU + """ + try: val = open(self.eeprom, "rb").read()[0xc4:0xd9] + except Exception: + val = None + return val.decode('ascii') + + def get_revision(self): + """ + Retrieves the serial number of the PSU + + Returns: + string: Serial number of PSU + """ + try: val = open(self.eeprom, "rb").read()[0xc4:0xd9] + except Exception: + val = None + if val != "NA" and len(val) == 23: + return val[-3:] + else: + return "NA" + + def get_status(self): + """ + Retrieves the operational status of the PSU + + Returns: + bool: True if PSU is operating properly, False if not + """ + status = self._get_cpld_register(self.psu_status).strip() + if status == 'ERR' : return False + if int(status, 0) == 1: + return True + return False + + def get_voltage(self): + """ + Retrieves current PSU voltage output + + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + volt_reading = self._get_dps_register(self.psu_voltage_reg) + try: + voltage = int(volt_reading)/1000 + except Exception: + return None + return float(voltage) + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + + Returns: + A float number, electric current in amperes, + e.g. 15.4 + """ + curr_reading = self._get_dps_register(self.psu_current_reg) + try: + current = int(curr_reading)/1000 + except Exception: + return None + return float(current) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + power_reading = self._get_dps_register(self.psu_power_reg) + try: + power = int(power_reading)/(1000*1000) + except Exception: + return None + return float(power) + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + + Returns: + A boolean, True if PSU has stablized its output voltages and + passed all its internal self-tests, False if not. + """ + power_good = self._get_cpld_register(self.psu_status).strip() + if power_good == 'ERR' : return False + return int(power_good, 0) + + def get_mfr_id(self): + """ + Retrives the Manufacturer Id of PSU + + Returns: + A string, the manunfacturer id. + """ + return 'DELTA' + + def get_type(self): + """ + Retrives the Power Type of PSU + + Returns : + A string, PSU power type + """ + try: val = open(self.eeprom, "rb").read()[0xe8:0xea] + except Exception: + return None + return val.decode() + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this PSU is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/sfp.py new file mode 100644 index 000000000000..9b76465f30fe --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/sfp.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python + +############################################################################# +# DELLEMC E3224F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + import os + import struct + import mmap + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +SFP_PORT_START = 1 +SFP_PORT_END = 24 +SFPPLUS_PORT_START = 25 +SFPPLUS_PORT_END = 28 +PORT_END = 30 + +QSFP_INFO_OFFSET = 128 +SFP_INFO_OFFSET = 0 +QSFP_DD_PAGE0 = 0 + +SFP_TYPE_LIST = [ + '0x3' # SFP/SFP+/SFP28 and later +] +QSFP_TYPE_LIST = [ + '0xc', # QSFP + '0xd', # QSFP+ or later + '0x11' # QSFP28 or later +] +QSFP_DD_TYPE_LIST = [ + '0x18' #QSFP_DD Type +] + +class Sfp(SfpOptoeBase): + """ + DELLEMC Platform-specific Sfp class + """ + + _port_to_i2c_mapping = { + 1: 27, + 2: 28, + 3: 29, + 4: 30, + 5: 31, + 6: 32, + 7: 33, + 8: 34, + 9: 35, + 10: 36, + 11: 37, + 12: 38, + 13: 39, + 14: 40, + 15: 41, + 16: 42, + 17: 43, + 18: 44, + 19: 45, + 20: 46, + 21: 47, + 22: 48, + 23: 49, + 24: 50, + 25: 20, + 26: 21, + 27: 22, + 28: 23, + 29: 24, + 30: 25, + } + + def __init__(self, index, sfp_type, eeprom_path): + SfpOptoeBase.__init__(self) + self.sfp_type = sfp_type + self.port_type = sfp_type + self.index = index + self.eeprom_path = eeprom_path + self._initialize_media(delay=False) + + def get_eeprom_path(self): + return self.eeprom_path + + def get_name(self): + if not (self.index >= SFP_PORT_START and self.index <= PORT_END): + return "N/A" + if self.index <= SFP_PORT_END: + return "SFP8" + elif self.index <= SFPPLUS_PORT_END: + return "SFP/SFP+/SFP28" + else: + return "QSFP or later" + + def _initialize_media(self,delay=False): + """ + Initialize the media type and eeprom driver for SFP + """ + if delay: + time.sleep(1) + self._xcvr_api = None + self.get_xcvr_api() + + self.set_media_type() + self.reinit_sfp_driver() + + def set_media_type(self): + """ + Reads optic eeprom byte to determine media type inserted + """ + eeprom_raw = [] + eeprom_raw = self._xcvr_api_factory._get_id() + if eeprom_raw is not None: + eeprom_raw = hex(eeprom_raw) + if eeprom_raw in SFP_TYPE_LIST: + self.sfp_type = 'SFP' + elif eeprom_raw in QSFP_TYPE_LIST: + self.sfp_type = 'QSFP' + elif eeprom_raw in QSFP_DD_TYPE_LIST: + self.sfp_type = 'QSFP_DD' + else: + #Set native port type if EEPROM type is not recognized/readable + self.sfp_type = self.port_type + else: + self.sfp_type = self.port_type + + return self.sfp_type + + def reinit_sfp_driver(self): + """ + Changes the driver based on media type detected + """ + del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self._port_to_i2c_mapping[self.index]) + new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self._port_to_i2c_mapping[self.index]) + driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self._port_to_i2c_mapping[self.index]) + + if not os.path.isfile(driver_path): + print(driver_path, "does not exist") + return False + + try: + with os.fdopen(os.open(driver_path, os.O_RDONLY)) as fd: + driver_name = fd.read() + driver_name = driver_name.rstrip('\r\n') + driver_name = driver_name.lstrip(" ") + + #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. + if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') + time.sleep(0.2) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') + time.sleep(2) + elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') + time.sleep(0.2) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') + time.sleep(2) + elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') + time.sleep(0.2) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') + time.sleep(2) + + except IOError as e: + print("Error: Unable to open file: %s" % str(e)) + return False + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def _get_cpld_register(self, reg): + reg_file = '/sys/devices/platform/dell-e3224f-cpld.0/' + reg + try: + with open(reg_file, 'r') as fd: + rv = fd.read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') + + def _set_cpld_register(self, reg_name, value): + # On successful write, returns the value will be written on + # reg_name and on failure returns 'ERR' + + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + + try: + with open(cpld_reg_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception: + rv = 'ERR' + + return rv + + def get_presence(self): + """ + Retrieves the presence of the sfp + Returns : True if sfp is present and false if it is absent + """ + # Check for invalid port_num + presence = False + if not (self.index >= SFP_PORT_START and self.index <= PORT_END): + return presence + try: + if self.index <= SFP_PORT_END: + bit_mask = 1 << (self.index - SFP_PORT_START) + sfp_mod_prs = self._get_cpld_register('sfp_modprs') + if sfp_mod_prs == 'ERR': + return presence + presence = ((int(sfp_mod_prs, 16) & bit_mask) == 0) + elif self.index <= SFPPLUS_PORT_END: + bit_mask = 1 << (self.index - SFPPLUS_PORT_START) + sfpplus_mod_prs = self._get_cpld_register('sfpplus_modprs') + if sfpplus_mod_prs == 'ERR': + return presence + presence = ((int(sfpplus_mod_prs, 16) & bit_mask) == 0) + else: + bit_mask = (1 << (self.index - (SFPPLUS_PORT_START+4))) + qsfp_mod_prs = self._get_cpld_register('qsfp_modprs') + if qsfp_mod_prs == 'ERR': + return presence + presence = ((int(qsfp_mod_prs, 16) & bit_mask) == 0) + except TypeError: + pass + return presence + + def tx_disable(self, tx_disable): + """ + Enable/Disable the TX disable bit of the optics. + """ + rval = False + if not (self.index >= SFP_PORT_START and self.index <= SFPPLUS_PORT_END): + return rval + if self.sfp_type == 'SFP': + if self.index <= SFP_PORT_END: + sfp_txdis = int(self._get_cpld_register('sfp_txdis'), 16) + if sfp_txdis != 'ERR': + bit_mask = 1 << (self.index - SFP_PORT_START) + sfp_txdis = sfp_txdis | bit_mask if tx_disable \ + else sfp_txdis & ~bit_mask + rval = (self._set_cpld_register('sfp_txdis', sfp_txdis) != 'ERR') + elif self.index <= SFPPLUS_PORT_END: + sfpplus_txdis = int(self._get_cpld_register('sfpplus_txdis'), 16) + if sfpplus_txdis != 'ERR': + bit_mask = 1 << (self.index - SFPPLUS_PORT_START) + sfpplus_txdis = sfpplus_txdis | bit_mask if tx_disable \ + else sfpplus_txdis & ~bit_mask + rval = (self._set_cpld_register('sfpplus_txdis', sfpplus_txdis) != 'ERR') + return rval + + def get_reset_status(self): + """ + Retrives the reset status of SFP + """ + reset_status = False + return reset_status + + def get_lpmode(self): + """ + Retrieves the lpmode(low power mode) of this SFP + """ + lpmode_state = False + return lpmode_state + + def reset(self): + """ + Reset the SFP and returns all user settings to their default state + """ + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode(low power mode) of this SFP + """ + return True + + def get_status(self): + """ + Retrieves the operational status of the device + """ + reset = self.get_reset_status() + return (not reset) + + def get_max_port_power(self): + """ + Retrieves the maximumum power allowed on the port in watts + """ + return 5.0 if self.sfp_type == 'QSFP' else 2.5 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + else: + if not os.path.isfile(self.eeprom_path): + return "EEPROM driver is not attached" + + if self.sfp_type == 'SFP': + offset = SFP_INFO_OFFSET + elif self.sfp_type == 'QSFP': + offset = QSFP_INFO_OFFSET + elif self.sfp_type == 'QSFP_DD': + offset = QSFP_DD_PAGE0 + + try: + with open(self.eeprom_path, mode="rb", buffering=0) as eeprom: + eeprom.seek(offset) + eeprom.read(1) + except OSError as e: + return "EEPROM read failed ({})".format(e.strerror) + + return self.SFP_STATUS_OK diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/thermal.py new file mode 100644 index 000000000000..f9e547e05525 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/thermal.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC E3224F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Thermals' information which are available in the platform +# +######################################################################## + + +try: + import os + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + """DellEMC Platform-specific Thermal class""" + + # [ Sensor-Name, Sensor-ID ] + SENSOR_MAPPING = [ + ['Switch Near Temperature', '7-0049'], + ['Switch Rear Temperature', '7-004a'], + ['Front Panel PHY Temperature', '7-004b'], + ['Near Front Panel Temperature', '7-004c'], + ['Middle Fan Tray Temperature', '7-004f'], + ] + + def __init__(self, thermal_index): + ThermalBase.__init__(self) + self.index = thermal_index + 1 + temp_hwmon = '/sys/bus/i2c/devices/' + self.SENSOR_MAPPING[thermal_index][1] + '/hwmon' + self.temp_file = temp_hwmon + '/' + os.listdir(temp_hwmon)[0] + '/' + 'temp1_input' + + def get_name(self): + """ + Retrieves the name of the thermal + + Returns: + string: The name of the thermal + """ + return self.SENSOR_MAPPING[self.index - 1][0] + + def get_presence(self): + """ + Retrieves the presence of the thermal + + Returns: + bool: True if thermal is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the Thermal + + Returns: + string: Model/part number of Thermal + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the Thermal + + Returns: + string: Serial number of Thermal + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the thermal + + Returns: + A boolean value, True if thermal is operating properly, + False if not + """ + return True + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to + nearest thousandth of one degree Celsius, e.g. 30.125 + """ + temperature = 0.0 + try : + temperature = float(open(self.temp_file).read()) / 1000.0 + except Exception: + pass + return float(temperature) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in + Celsius up to nearest thousandth of one degree Celsius, + e.g. 30.125 + """ + return 75.0 + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in + Celsius up to nearest thousandth of one degree Celsius, + e.g. 30.125 + """ + return 0.0 + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one + degree Celsius, e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if + not + """ + # Thermal threshold values are pre-defined based on HW. + return False + + def set_low_threshold(self, temperature): + """ + Sets the low threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one + degree Celsius, e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if + not + """ + # Thermal threshold values are pre-defined based on HW. + return False + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/watchdog.py new file mode 100644 index 000000000000..15aa40c4eb54 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/sonic_platform/watchdog.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python + +######################################################################## +# +# DELLEMC E3224F +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +try: + import ctypes + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class _timespec(ctypes.Structure): + _fields_ = [ + ('tv_sec', ctypes.c_long), + ('tv_nsec', ctypes.c_long) + ] + + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + TIMERS = [15,20,30,40,50,60,65,70,80,100,120,140,160,180,210,240] + + armed_time = 0 + timeout = 0 + CLOCK_MONOTONIC = 1 + + def __init__(self): + WatchdogBase.__init__(self) + self._librt = ctypes.CDLL('librt.so.1', use_errno=True) + self._clock_gettime = self._librt.clock_gettime + self._clock_gettime.argtypes=[ctypes.c_int, ctypes.POINTER(_timespec)] + self.watchdog_reg = "watchdog" + + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + try: + with open(cpld_reg_file, 'r') as fd: + rv = fd.read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') + + def _set_cpld_register(self, reg_name, value): + # On successful write, returns the value will be written on + # reg_name and on failure returns 'ERR' + + cpld_dir = "/sys/devices/platform/dell-e3224f-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + + try: + with open(cpld_reg_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception: + rv = 'ERR' + + return rv + + def _get_reg_val(self): + value = self._get_cpld_register(self.watchdog_reg).strip() + if value == 'ERR': return False + + return int(value,16) + + def _set_reg_val(self,val): + value = self._set_cpld_register(self.watchdog_reg, val) + return value + + def _get_time(self): + """ + To get clock monotonic time + """ + ts = _timespec() + if self._clock_gettime(self.CLOCK_MONOTONIC, ctypes.pointer(ts)) != 0: + self._errno = ctypes.get_errno() + return 0 + return ts.tv_sec + ts.tv_nsec * 1e-9 + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* + available value. + + Returns: + An integer specifying the *actual* number of seconds the + watchdog was armed with. On failure returns -1. + """ + timer_offset = -1 + for key,timer_seconds in enumerate(self.TIMERS): + if seconds > 0 and seconds <= timer_seconds: + timer_offset = key + seconds = timer_seconds + break + + if timer_offset == -1: + return -1 + + # Extracting 5th to 8th bits for WD timer values + reg_val = self._get_reg_val() + wd_timer_offset = (reg_val >> 4) & 0xF + + if wd_timer_offset != timer_offset: + # Setting 5th to 8th bits + # value from timer_offset + self.disarm() + self._set_reg_val((reg_val & 0x0F) | (timer_offset << 4)) + + if self.is_armed(): + # Setting last bit to WD Timer punch + # Last bit = WD Timer punch + self._set_reg_val(reg_val & 0xFE) + + else: + # Setting 4th bit to enable WD + # 4th bit = Enable WD + reg_val = self._get_reg_val() + self._set_reg_val(reg_val | 0x8) + + self.armed_time = self._get_time() + self.timeout = seconds + return seconds + + def disarm(self): + """ + Disarm the hardware watchdog + + Returns: + A boolean, True if watchdog is disarmed successfully, False + if not + """ + if self.is_armed(): + # Setting 4th bit to disable WD + # 4th bit = Disable WD + reg_val = self._get_reg_val() + self._set_reg_val(reg_val & 0xF7) + + self.armed_time = 0 + self.timeout = 0 + return True + + return False + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + + Returns: + A boolean, True if watchdog is armed, False if not + """ + + # Extracting 4th bit to get WD Enable/Disable status + # 0 - Disabled WD + # 1 - Enabled WD + reg_val = self._get_reg_val() + wd_offset = (reg_val >> 3) & 1 + + return bool(wd_offset) + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds + remaining on the watchdog timer + + Returns: + An integer specifying the number of seconds remaining on + their watchdog timer. If the watchdog is not armed, returns + -1. + + E3224F doesnot have hardware support to show remaining time. + Due to this limitation, this API is implemented in software. + This API would return correct software time difference if it + is called from the process which armed the watchdog timer. + If this API called from any other process, it would return + 0. If the watchdog is not armed, this API would return -1. + """ + if not self.is_armed(): + return -1 + + if self.armed_time > 0 and self.timeout != 0: + cur_time = self._get_time() + + if cur_time <= 0: + return 0 + + diff_time = int(cur_time - self.armed_time) + + if diff_time > self.timeout: + return self.timeout + else: + return self.timeout - diff_time + + return 0 diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/mux-ctrl.service b/platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/mux-ctrl.service new file mode 100644 index 000000000000..20530424d35e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/mux-ctrl.service @@ -0,0 +1,13 @@ +[Unit] +Description=Dell E3224F Platform mux ctrl +Before=pmon.service +After=platform-modules-e3224f.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/mux_controller.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/platform-modules-e3224f.service b/platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/platform-modules-e3224f.service new file mode 100644 index 000000000000..66b90132ecee --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/e3224f/systemd/platform-modules-e3224f.service @@ -0,0 +1,14 @@ +[Unit] +Description=Dell E3224F Platform modules +Before=pmon.service +After=platform-init.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/e3224f_platform.sh init +ExecStop=/usr/local/bin/e3224f_platform.sh deinit +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target From 12d24d572a29c8d427bf879516e68d67db701eac Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Thu, 10 Aug 2023 17:35:43 -0700 Subject: [PATCH 117/145] Updated PG headroom settings for 40g port speed (#16038) --- .../0/pg_profile_lookup.ini | 15 ++++++++++----- .../1/pg_profile_lookup.ini | 15 ++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini index 7eb58931c209..e8289ab03112 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini @@ -1,12 +1,17 @@ # PG lossless profiles. -# speed cable size xon xoff threshold xon_offset +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 100000 300m 1280 2560 110592 0 1280 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 100000 1000m 1280 2560 225280 0 1280 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 100000 2000m 1280 2560 393216 0 1280 400000 2000m 1280 2560 1445888 0 1280 - 100000 80000m 1280 2560 1388544 0 1280 - 400000 80000m 1280 2560 5435392 0 1280 - 100000 120000m 1280 2560 2056192 0 1280 - 400000 120000m 1280 2560 8093696 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini index 7eb58931c209..e8289ab03112 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini @@ -1,12 +1,17 @@ # PG lossless profiles. -# speed cable size xon xoff threshold xon_offset +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 100000 300m 1280 2560 110592 0 1280 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 100000 1000m 1280 2560 225280 0 1280 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 100000 2000m 1280 2560 393216 0 1280 400000 2000m 1280 2560 1445888 0 1280 - 100000 80000m 1280 2560 1388544 0 1280 - 400000 80000m 1280 2560 5435392 0 1280 - 100000 120000m 1280 2560 2056192 0 1280 - 400000 120000m 1280 2560 8093696 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 From eedaa2adbf10869438f22bd0c4fb6df72ebb29c0 Mon Sep 17 00:00:00 2001 From: Aaron Payment Date: Thu, 10 Aug 2023 22:36:18 -0700 Subject: [PATCH 118/145] sonic-buildimage: Fix SAI_API_TUNNEL SAI_STATUS_NOT_SUPPORTED error (#13874) Syncd will abort in handleSaiCreateStatus with 'Encountered failure in create operation, exiting orchagent,SAI API: SAI_API_TUNNEL, status: SAI_STATUS_NOT_SUPPORTED' The fix is to add the following brcm config to prevent the error: sai_tunnel_global_sip_mask_enable=1 bcm_tunnel_term_compatible_mode=1 Signed-off-by: Aaron Payment --- .../Arista-7060DX4-C32/th3-a7060dx4-c32-32x400G.config.bcm | 2 ++ .../x86_64-arista_7060dx4_32/th3-a7060dx4-32-flex.config.bcm | 2 ++ .../Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm | 2 ++ .../Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm | 2 ++ .../x86_64-arista_7060px4_32/th3-a7060px4-32-flex.config.bcm | 2 ++ 5 files changed, 10 insertions(+) diff --git a/device/arista/x86_64-arista_7060dx4_32/Arista-7060DX4-C32/th3-a7060dx4-c32-32x400G.config.bcm b/device/arista/x86_64-arista_7060dx4_32/Arista-7060DX4-C32/th3-a7060dx4-c32-32x400G.config.bcm index 7bd96fed83b8..48f8a3643731 100644 --- a/device/arista/x86_64-arista_7060dx4_32/Arista-7060DX4-C32/th3-a7060dx4-c32-32x400G.config.bcm +++ b/device/arista/x86_64-arista_7060dx4_32/Arista-7060DX4-C32/th3-a7060dx4-c32-32x400G.config.bcm @@ -16,6 +16,8 @@ miim_intr_enable.0=0 module_64ports.0=1 multicast_l2_range.0=511 oversubscribe_mode=1 +sai_tunnel_global_sip_mask_enable=1 +bcm_tunnel_term_compatible_mode=1 parity_correction=1 parity_enable=1 pbmp_xport_xe.0=0x3ffffffffffffffffffffffffffffffffffffffe diff --git a/device/arista/x86_64-arista_7060dx4_32/th3-a7060dx4-32-flex.config.bcm b/device/arista/x86_64-arista_7060dx4_32/th3-a7060dx4-32-flex.config.bcm index 2eae80ff1180..dc75f1acafad 100644 --- a/device/arista/x86_64-arista_7060dx4_32/th3-a7060dx4-32-flex.config.bcm +++ b/device/arista/x86_64-arista_7060dx4_32/th3-a7060dx4-32-flex.config.bcm @@ -16,6 +16,8 @@ miim_intr_enable.0=0 module_64ports.0=1 multicast_l2_range.0=511 oversubscribe_mode=1 +sai_tunnel_global_sip_mask_enable=1 +bcm_tunnel_term_compatible_mode=1 parity_correction=1 parity_enable=1 pbmp_xport_xe.0=0x3ffffffffffffffffffffffffffffffffffffffe diff --git a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm index c429c28bad68..efa670b477a1 100644 --- a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm +++ b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm @@ -20,6 +20,8 @@ miim_intr_enable.0=0 module_64ports.0=1 multicast_l2_range.0=511 oversubscribe_mode=1 +sai_tunnel_global_sip_mask_enable=1 +bcm_tunnel_term_compatible_mode=1 parity_correction=1 parity_enable=1 pbmp_xport_xe.0=0x3ffffffffffffffffffffffffffffffffffffffe diff --git a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm index b23b8abf1377..3cd40c229727 100644 --- a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm +++ b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm @@ -20,6 +20,8 @@ miim_intr_enable.0=0 module_64ports.0=1 multicast_l2_range.0=511 oversubscribe_mode=1 +sai_tunnel_global_sip_mask_enable=1 +bcm_tunnel_term_compatible_mode=1 parity_correction=1 parity_enable=1 pbmp_xport_xe.0=0x3ffffffffffffffffffffffffffffffffffffffe diff --git a/device/arista/x86_64-arista_7060px4_32/th3-a7060px4-32-flex.config.bcm b/device/arista/x86_64-arista_7060px4_32/th3-a7060px4-32-flex.config.bcm index b7018cf7c46f..e25d7db00ec6 100644 --- a/device/arista/x86_64-arista_7060px4_32/th3-a7060px4-32-flex.config.bcm +++ b/device/arista/x86_64-arista_7060px4_32/th3-a7060px4-32-flex.config.bcm @@ -16,6 +16,8 @@ miim_intr_enable.0=0 module_64ports.0=1 multicast_l2_range.0=511 oversubscribe_mode=1 +sai_tunnel_global_sip_mask_enable=1 +bcm_tunnel_term_compatible_mode=1 parity_correction=1 parity_enable=1 pbmp_xport_xe.0=0x3ffffffffffffffffffffffffffffffffffffffe From 0269e60a366730184472da1c3182123047751ce1 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 11 Aug 2023 16:32:43 +0800 Subject: [PATCH 119/145] [submodule] Update submodule sonic-platform-common to the latest HEAD automatically (#16106) #### Why I did it src/sonic-platform-common ``` * ab70e66 - (HEAD -> master, origin/master, origin/HEAD) Add new SSD type support (#390) (21 hours ago) [Junchao-Mellanox] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index 537095cca2e8..ab70e6615ab7 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit 537095cca2e8074600805915217e091d474b8211 +Subproject commit ab70e6615ab72f4d5ca1679224753f000bcf2792 From 519a1e4a9154884c4e3fb0aa79cd6c4ccb6bde53 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Fri, 11 Aug 2023 09:00:46 -0700 Subject: [PATCH 120/145] Update sairedis submodule (#16072) * Update sairedis submodule This submodule update needs to be manually done due to build changes done in the sairedis submodule. Specifically, Debian build profiles are now being used instead of dpkg build targets, and dbgsym packages are being used instead of dbg packages. Because of this, there needs to be changes on the sonic-buildimage side for this. This is a reland of #15720, which was reverted in #15995 due to the RPC package build failing. That failure has since been fixed, and the PR pipeline has been updated to build the RPC package so that this is checked at the PR stage. This submodule update brings in the following changes: ``` 4dbdb21 Fix RPC package build failure due to shell syntax issue (#1268) 588d596 Make sure new binaries replace existing binaries in docker-sonic-vs (#1269) ce8f642 [vs] Use boost join to concatenate switch types in config (#1266) d6055a2 [vslib]: Temporaily map DPU switch type to NVDA_MBF2H536C (#1259) e1cdb4d [CodeQL]: Use dependencies with relevant versions in azp template. (#1262) c08f9a2 [CI]: Fix collect log error in azp template. (#1260) eed856c [CodeQL]: Fix syncd compilation in azp template. (#1261) a3f1f1a Reland 'Make changes to building and packaging sairedis (#1116)' (#1194) ``` Signed-off-by: Saikrishna Arcot * Update sairedis submodule with the fix for the RPC package build Signed-off-by: Saikrishna Arcot --------- Signed-off-by: Saikrishna Arcot --- platform/vs/syncd-vs.mk | 10 +++++----- rules/sairedis.mk | 25 ++++++++++++------------- rules/syncd.mk | 20 ++++++++++---------- src/sonic-sairedis | 2 +- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/platform/vs/syncd-vs.mk b/platform/vs/syncd-vs.mk index 22b34fbcaae3..6ff00a3508b9 100644 --- a/platform/vs/syncd-vs.mk +++ b/platform/vs/syncd-vs.mk @@ -1,10 +1,10 @@ -$(LIBSAIREDIS)_DPKG_TARGET = binary-syncd-vs +$(LIBSAIREDIS)_DEB_BUILD_PROFILES += syncd vs SYNCD_VS = syncd-vs_1.0.0_amd64.deb $(SYNCD_VS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBSAIVS) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS))) -SYNCD_VS_DBG = syncd-vs-dbg_1.0.0_amd64.deb -$(SYNCD_VS_DBG)_DEPENDS += $(SYNCD_VS) -$(SYNCD_VS_DBG)_RDEPENDS += $(SYNCD_VS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS_DBG))) +SYNCD_VS_DBGSYM = syncd-vs-dbgsym_1.0.0_amd64.deb +$(SYNCD_VS_DBGSYM)_DEPENDS += $(SYNCD_VS) +$(SYNCD_VS_DBGSYM)_RDEPENDS += $(SYNCD_VS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS_DBGSYM))) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 73ea1366bb92..163e9b797645 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -4,7 +4,6 @@ LIBSAIREDIS_VERSION = 1.0.0 LIBSAIREDIS_NAME = libsairedis LIBSAIREDIS = $(LIBSAIREDIS_NAME)_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIREDIS)_DPKG_TARGET = binary-sairedis $(LIBSAIREDIS)_SRC_PATH = $(SRC_PATH)/sonic-sairedis $(LIBSAIREDIS)_VERSION = $(LIBSAIREDIS_VERSION) $(LIBSAIREDIS)_NAME = $(LIBSAIREDIS_NAME) @@ -30,20 +29,20 @@ LIBSAIMETADATA_DEV = libsaimetadata-dev_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH $(LIBSAIMETADATA_DEV)_DEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DEV))) -LIBSAIREDIS_DBG = $(LIBSAIREDIS_NAME)-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIREDIS_DBG)_DEPENDS += $(LIBSAIREDIS) -$(LIBSAIREDIS_DBG)_RDEPENDS += $(LIBSAIREDIS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBG))) +LIBSAIREDIS_DBGSYM = $(LIBSAIREDIS_NAME)-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIREDIS_DBGSYM)_DEPENDS += $(LIBSAIREDIS) +$(LIBSAIREDIS_DBGSYM)_RDEPENDS += $(LIBSAIREDIS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBGSYM))) -LIBSAIVS_DBG = libsaivs-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIVS_DBG)_DEPENDS += $(LIBSAIVS) -$(LIBSAIVS_DBG)_RDEPENDS += $(LIBSAIVS) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBG))) +LIBSAIVS_DBGSYM = libsaivs-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIVS_DBGSYM)_DEPENDS += $(LIBSAIVS) +$(LIBSAIVS_DBGSYM)_RDEPENDS += $(LIBSAIVS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBGSYM))) -LIBSAIMETADATA_DBG = libsaimetadata-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBSAIMETADATA_DBG)_DEPENDS += $(LIBSAIMETADATA) -$(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) -$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) +LIBSAIMETADATA_DBGSYM = libsaimetadata-dbgsym_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb +$(LIBSAIMETADATA_DBGSYM)_DEPENDS += $(LIBSAIMETADATA) +$(LIBSAIMETADATA_DBGSYM)_RDEPENDS += $(LIBSAIMETADATA) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBGSYM))) ifeq ($(ENABLE_PY2_MODULES), n) $(LIBSAIREDIS)_DEB_BUILD_PROFILES += nopython2 diff --git a/rules/syncd.mk b/rules/syncd.mk index 6aa3e990843a..2f5cce6cebff 100644 --- a/rules/syncd.mk +++ b/rules/syncd.mk @@ -4,7 +4,7 @@ ifneq ($(CONFIGURED_PLATFORM),vs) SYNCD = syncd_1.0.0_$(CONFIGURED_ARCH).deb $(SYNCD)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) -$(SYNCD)_DPKG_TARGET = binary-syncd +$(SYNCD)_DEB_BUILD_PROFILES += syncd $(SYNCD)_SRC_PATH = $(SRC_PATH)/sonic-sairedis $(SYNCD)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBSAIREDIS) $(SYNCD)_RDEPENDS += $(LIBSWSSCOMMON) @@ -18,19 +18,19 @@ $(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC))) # Inject libthrift build dependency for RPC build $(SYNCD)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBTHRIFT_DEV) -$(SYNCD)_DPKG_TARGET = binary-syncd-rpc +$(SYNCD)_DEB_BUILD_PROFILES += rpc endif -SYNCD_DBG = syncd-dbg_1.0.0_$(CONFIGURED_ARCH).deb -$(SYNCD_DBG)_DEPENDS += $(SYNCD) -$(SYNCD_DBG)_RDEPENDS += $(SYNCD) -$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_DBG))) +SYNCD_DBGSYM = syncd-dbgsym_1.0.0_$(CONFIGURED_ARCH).deb +$(SYNCD_DBGSYM)_DEPENDS += $(SYNCD) +$(SYNCD_DBGSYM)_RDEPENDS += $(SYNCD) +$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_DBGSYM))) ifeq ($(ENABLE_SYNCD_RPC),y) -SYNCD_RPC_DBG = syncd-rpc-dbg_1.0.0_$(CONFIGURED_ARCH).deb -$(SYNCD_RPC_DBG)_DEPENDS += $(SYNCD_RPC) -$(SYNCD_RPC_DBG)_RDEPENDS += $(SYNCD_RPC) -$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBG))) +SYNCD_RPC_DBGSYM = syncd-rpc-dbgsym_1.0.0_$(CONFIGURED_ARCH).deb +$(SYNCD_RPC_DBGSYM)_DEPENDS += $(SYNCD_RPC) +$(SYNCD_RPC_DBGSYM)_RDEPENDS += $(SYNCD_RPC) +$(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBGSYM))) endif ifeq ($(ENABLE_PY2_MODULES), n) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 14a863a6d8f2..eb24302b877a 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 14a863a6d8f2855a7cebf1b7e62bc46dbed76ff6 +Subproject commit eb24302b877a09a6b255bc76dae6e93c85e13acb From 3500f69fdb0faa55d1c2269fe46ff43faad64fab Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Sat, 12 Aug 2023 00:13:53 +0800 Subject: [PATCH 121/145] Revert "[Ufispace][PDDF] Add PDDF support on S9180-32X (#14909)" (#16092) This reverts commit d2b5d774c57a98f714da5c7885466dfeecff4e07. --- .../UFISPACE-S9180-32X/port_config.ini | 35 - .../UFISPACE-S9180-32X/switch-sai.conf | 33 - .../UFISPACE-S9180-32X/switch-tna-sai.conf | 39 - .../x86_64-ufispace_s9180_32x-r0/default_sku | 1 - .../x86_64-ufispace_s9180_32x-r0/fancontrol | 10 - .../installer.conf | 4 - .../x86_64-ufispace_s9180_32x-r0/pcie.yaml | 417 -- .../pddf/pd-plugin.json | 68 - .../pddf/pddf-device.json | 5879 ----------------- .../x86_64-ufispace_s9180_32x-r0/pddf_support | 0 .../platform.json | 547 -- .../platform_asic | 1 - .../pmon_daemon_control.json | 9 - .../x86_64-ufispace_s9180_32x-r0/sensors.conf | 9 - .../system_health_monitoring_config.json | 15 - platform/barefoot/bfn-platform-ufispace.mk | 5 - platform/barefoot/docker-saiserver-bfn.mk | 4 +- platform/barefoot/one-image.mk | 4 +- .../barefoot/platform-modules-ufispace.mk | 14 - platform/barefoot/rules.mk | 6 +- .../sonic-platform-modules-ufispace/LICENSE | 674 -- .../debian/changelog | 5 - .../debian/compat | 1 - .../debian/control | 10 - .../debian/rules | 88 - .../sonic-platform-ufispace-s9180-32x.install | 1 - ...sonic-platform-ufispace-s9180-32x.postinst | 5 - .../s9180-32x/modules/Makefile | 5 - .../s9180-32x/modules/i2c-smbus.c | 423 -- .../x86-64-ufispace-s9180-32x-sys-eeprom.c | 272 - .../service/pddf-platform-init.service | 1 - .../service/platform-swss-restart.service | 13 - .../s9180-32x/sonic_platform/__init__.py | 4 - .../s9180-32x/sonic_platform/chassis.py | 214 - .../s9180-32x/sonic_platform/component.py | 113 - .../s9180-32x/sonic_platform/eeprom.py | 14 - .../s9180-32x/sonic_platform/fan.py | 147 - .../s9180-32x/sonic_platform/fan_drawer.py | 17 - .../s9180-32x/sonic_platform/platform.py | 25 - .../s9180-32x/sonic_platform/psu.py | 38 - .../s9180-32x/sonic_platform/sfp.py | 17 - .../s9180-32x/sonic_platform/thermal.py | 17 - .../s9180-32x/sonic_platform/watchdog.py | 23 - .../s9180-32x/sonic_platform_setup.py | 27 - .../utils/pddf_post_device_create.sh | 93 - .../utils/pddf_post_driver_install.sh | 2 - .../utils/pddf_pre_driver_install.sh | 5 - .../s9180-32x/utils/pddf_switch_svc.py | 55 - .../s9180-32x/utils/platform_swss_restart.sh | 5 - .../s9180-32x/utils/pre_pddf_init.sh | 5 - 50 files changed, 5 insertions(+), 9414 deletions(-) delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf_support delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf delete mode 100644 device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json delete mode 100644 platform/barefoot/bfn-platform-ufispace.mk delete mode 100644 platform/barefoot/platform-modules-ufispace.mk delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/LICENSE delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/changelog delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/compat delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/control delete mode 100755 platform/barefoot/sonic-platform-modules-ufispace/debian/rules delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c delete mode 120000 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py delete mode 100644 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py delete mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh delete mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh delete mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh delete mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py delete mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh delete mode 100755 platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini deleted file mode 100644 index 3012ba99ddc9..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/port_config.ini +++ /dev/null @@ -1,35 +0,0 @@ -# name lanes alias speed autoneg fec index -Ethernet0 0,1,2,3 Ethernet0 100000 off none 0 -Ethernet4 4,5,6,7 Ethernet4 100000 off none 1 -Ethernet8 8,9,10,11 Ethernet8 100000 off none 2 -Ethernet12 12,13,14,15 Ethernet12 100000 off none 3 -Ethernet16 16,17,18,19 Ethernet16 100000 off none 4 -Ethernet20 20,21,22,23 Ethernet20 100000 off none 5 -Ethernet24 24,25,26,27 Ethernet24 100000 off none 6 -Ethernet28 28,29,30,31 Ethernet28 100000 off none 7 -Ethernet32 32,33,34,35 Ethernet32 100000 off none 8 -Ethernet36 36,37,38,39 Ethernet36 100000 off none 9 -Ethernet40 40,41,42,43 Ethernet40 100000 off none 10 -Ethernet44 44,45,46,47 Ethernet44 100000 off none 11 -Ethernet48 48,49,50,51 Ethernet48 100000 off none 12 -Ethernet52 52,53,54,55 Ethernet52 100000 off none 13 -Ethernet56 56,57,58,59 Ethernet56 100000 off none 14 -Ethernet60 60,61,62,63 Ethernet60 100000 off none 15 -Ethernet64 64,65,66,67 Ethernet64 100000 off none 16 -Ethernet68 68,69,70,71 Ethernet68 100000 off none 17 -Ethernet72 72,73,74,75 Ethernet72 100000 off none 18 -Ethernet76 76,77,78,79 Ethernet76 100000 off none 19 -Ethernet80 80,81,82,83 Ethernet80 100000 off none 20 -Ethernet84 84,85,86,87 Ethernet84 100000 off none 21 -Ethernet88 88,89,90,91 Ethernet88 100000 off none 22 -Ethernet92 92,93,94,95 Ethernet92 100000 off none 23 -Ethernet96 96,97,98,99 Ethernet96 100000 off none 24 -Ethernet100 100,101,102,103 Ethernet100 100000 off none 25 -Ethernet104 104,105,106,107 Ethernet104 100000 off none 26 -Ethernet108 108,109,110,111 Ethernet108 100000 off none 27 -Ethernet112 112,113,114,115 Ethernet112 100000 off none 28 -Ethernet116 116,117,118,119 Ethernet116 100000 off none 29 -Ethernet120 120,121,122,123 Ethernet120 100000 off none 30 -Ethernet124 124,125,126,127 Ethernet124 100000 off none 31 -Ethernet128 128 Ethernet128 10000 off none 32 -Ethernet129 129 Ethernet129 10000 off none 33 \ No newline at end of file diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf deleted file mode 100644 index c3a384ed0796..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-sai.conf +++ /dev/null @@ -1,33 +0,0 @@ -{ - "chip_list": [ - { - "id": "asic-0", - "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" - } - ], - "instance": 0, - "p4_program_list": [ - { - "id": "pgm-0", - "instance": 0, - "path": "switch", - "program-name": "switch", - "pd": "lib/tofinopd/switch/libpd.so", - "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", - "table-config": "share/tofinopd/switch/context.json", - "tofino-bin": "share/tofinopd/switch/tofino.bin", - "switchapi": "lib/libswitchapi.so", - "sai": "lib/libsai.so", - "agent0": "lib/platform/x86_64-ufispace_s9180_32x-r0/libpltfm_mgr.so", - "switchapi_port_add": false - } - ] -} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf deleted file mode 100644 index 8cd3c6e3538b..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/UFISPACE-S9180-32X/switch-tna-sai.conf +++ /dev/null @@ -1,39 +0,0 @@ -{ - "chip_list": [ - { - "chip_family": "Tofino", - "sds_fw_path": "share/tofino_sds_fw/avago/firmware", - "instance": 0 - } - ], - "p4_devices": [ - { - "device-id": 0, - "agent0": "lib/platform/x86_64-ufispace_s9180_32x-r0/libpltfm_mgr.so", - "p4_programs": [ - { - "p4_pipelines": [ - { - "p4_pipeline_name": "pipe", - "config": "share/switch/pipe/tofino.bin", - "context": "share/switch/pipe/context.json" - } - ], - "program-name": "switch", - "bfrt-config": "share/switch/bf-rt.json", - "model_json_path" : "share/switch/aug_model.json", - "switchapi_port_add": false, - "non_default_port_ppgs": 5 - } - ] - } - ], - "switch_options": [ - { - "device-id": 0, - "model_json_path": "share/switch/aug_model.json", - "non_default_port_ppgs": 5, - "switchapi_port_add": false - } - ] -} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku b/device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku deleted file mode 100644 index 0effd567eb3a..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku +++ /dev/null @@ -1 +0,0 @@ -UFISPACE-S9180-32X t1 diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol b/device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol deleted file mode 100644 index 1234cd994f3f..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol +++ /dev/null @@ -1,10 +0,0 @@ -# Configuration file generated by pwmconfig, changes will be lost -INTERVAL=10 -DEVPATH= -DEVNAME= -FCTEMPS= -FCFANS= -MINTEMP= -MAXTEMP= -MINSTART= -MINSTOP= diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf deleted file mode 100644 index 8f9944da69a6..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/installer.conf +++ /dev/null @@ -1,4 +0,0 @@ -CONSOLE_PORT=0x3f8 -CONSOLE_DEV=0 -CONSOLE_SPEED=115200 -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="module_blacklist=gpio_ich nomodeset pcie_aspm=off" diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml deleted file mode 100644 index adafbe61e649..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml +++ /dev/null @@ -1,417 +0,0 @@ -- bus: '00' - dev: '00' - fn: '0' - id: 6f00 - name: 'Host bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2 - (rev 03)' -- bus: '00' - dev: '02' - fn: '0' - id: 6f04 - name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI - Express Root Port 2 (rev 03)' -- bus: '00' - dev: '02' - fn: '2' - id: 6f06 - name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI - Express Root Port 2 (rev 03)' -- bus: '00' - dev: '03' - fn: '0' - id: 6f08 - name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI - Express Root Port 3 (rev 03)' -- bus: '00' - dev: '03' - fn: '1' - id: 6f09 - name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI - Express Root Port 3 (rev 03)' -- bus: '00' - dev: '03' - fn: '2' - id: 6f0a - name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI - Express Root Port 3 (rev 03)' -- bus: '00' - dev: '03' - fn: '3' - id: 6f0b - name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI - Express Root Port 3 (rev 03)' -- bus: '00' - dev: '05' - fn: '0' - id: 6f28 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Map/VTd_Misc/System Management (rev 03)' -- bus: '00' - dev: '05' - fn: '1' - id: 6f29 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D IIO Hot Plug (rev 03)' -- bus: '00' - dev: '05' - fn: '2' - id: 6f2a - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D IIO RAS/Control Status/Global Errors (rev 03)' -- bus: '00' - dev: '05' - fn: '4' - id: 6f2c - name: 'PIC: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D I/O APIC (rev - 03)' -- bus: '00' - dev: '14' - fn: '0' - id: 8c31 - name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB - xHCI (rev 05)' -- bus: '00' - dev: 1c - fn: '0' - id: 8c10 - name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express - Root Port #1 (rev d5)' -- bus: '00' - dev: 1f - fn: '0' - id: 8c54 - name: 'ISA bridge: Intel Corporation C224 Series Chipset Family Server Standard - SKU LPC Controller (rev 05)' -- bus: '00' - dev: 1f - fn: '2' - id: 8c02 - name: 'SATA controller: Intel Corporation 8 Series/C220 Series Chipset Family 6-port - SATA Controller 1 [AHCI mode] (rev 05)' -- bus: '00' - dev: 1f - fn: '3' - id: 8c22 - name: 'SMBus: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller - (rev 05)' -- bus: '01' - dev: '00' - fn: '0' - id: 6f50 - name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology - Register DMA Channel 0' -- bus: '01' - dev: '00' - fn: '1' - id: 6f51 - name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology - Register DMA Channel 1' -- bus: '01' - dev: '00' - fn: '2' - id: 6f52 - name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology - Register DMA Channel 2' -- bus: '01' - dev: '00' - fn: '3' - id: 6f53 - name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology - Register DMA Channel 3' -- bus: '02' - dev: '00' - fn: '0' - id: 15ab - name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane' -- bus: '02' - dev: '00' - fn: '1' - id: 15ab - name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane' -- bus: '04' - dev: '00' - fn: '0' - id: '0010' - name: 'Unassigned class [ff00]: Device 1d1c:0010 (rev 10)' -- bus: 08 - dev: '00' - fn: '0' - id: '1533' - name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev - 03)' -- bus: ff - dev: 0b - fn: '0' - id: 6f81 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D R3 QPI Link 0/1 (rev 03)' -- bus: ff - dev: 0b - fn: '1' - id: 6f36 - name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D R3 QPI Link 0/1 (rev 03)' -- bus: ff - dev: 0b - fn: '2' - id: 6f37 - name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D R3 QPI Link 0/1 (rev 03)' -- bus: ff - dev: 0b - fn: '3' - id: 6f76 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D R3 QPI Link Debug (rev 03)' -- bus: ff - dev: 0c - fn: '0' - id: 6fe0 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: 0c - fn: '1' - id: 6fe1 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: 0c - fn: '2' - id: 6fe2 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: 0c - fn: '3' - id: 6fe3 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: 0f - fn: '0' - id: 6ff8 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: 0f - fn: '4' - id: 6ffc - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: 0f - fn: '5' - id: 6ffd - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: 0f - fn: '6' - id: 6ffe - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Caching Agent (rev 03)' -- bus: ff - dev: '10' - fn: '0' - id: 6f1d - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D R2PCIe Agent (rev 03)' -- bus: ff - dev: '10' - fn: '1' - id: 6f34 - name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D R2PCIe Agent (rev 03)' -- bus: ff - dev: '10' - fn: '5' - id: 6f1e - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Ubox (rev 03)' -- bus: ff - dev: '10' - fn: '6' - id: 6f7d - name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Ubox (rev 03)' -- bus: ff - dev: '10' - fn: '7' - id: 6f1f - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Ubox (rev 03)' -- bus: ff - dev: '12' - fn: '0' - id: 6fa0 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Home Agent 0 (rev 03)' -- bus: ff - dev: '12' - fn: '1' - id: 6f30 - name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Home Agent 0 (rev 03)' -- bus: ff - dev: '13' - fn: '0' - id: 6fa8 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' -- bus: ff - dev: '13' - fn: '1' - id: 6f71 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' -- bus: ff - dev: '13' - fn: '2' - id: 6faa - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel Target Address Decoder (rev 03)' -- bus: ff - dev: '13' - fn: '3' - id: 6fab - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel Target Address Decoder (rev 03)' -- bus: ff - dev: '13' - fn: '4' - id: 6fac - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel Target Address Decoder (rev 03)' -- bus: ff - dev: '13' - fn: '5' - id: 6fad - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel Target Address Decoder (rev 03)' -- bus: ff - dev: '13' - fn: '6' - id: 6fae - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D DDRIO Channel 0/1 Broadcast (rev 03)' -- bus: ff - dev: '13' - fn: '7' - id: 6faf - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D DDRIO Global Broadcast (rev 03)' -- bus: ff - dev: '14' - fn: '0' - id: 6fb0 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 0 Thermal Control (rev 03)' -- bus: ff - dev: '14' - fn: '1' - id: 6fb1 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 1 Thermal Control (rev 03)' -- bus: ff - dev: '14' - fn: '2' - id: 6fb2 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 0 Error (rev 03)' -- bus: ff - dev: '14' - fn: '3' - id: 6fb3 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 1 Error (rev 03)' -- bus: ff - dev: '14' - fn: '4' - id: 6fbc - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D DDRIO Channel 0/1 Interface (rev 03)' -- bus: ff - dev: '14' - fn: '5' - id: 6fbd - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D DDRIO Channel 0/1 Interface (rev 03)' -- bus: ff - dev: '14' - fn: '6' - id: 6fbe - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D DDRIO Channel 0/1 Interface (rev 03)' -- bus: ff - dev: '14' - fn: '7' - id: 6fbf - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D DDRIO Channel 0/1 Interface (rev 03)' -- bus: ff - dev: '15' - fn: '0' - id: 6fb4 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 2 Thermal Control (rev 03)' -- bus: ff - dev: '15' - fn: '1' - id: 6fb5 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 3 Thermal Control (rev 03)' -- bus: ff - dev: '15' - fn: '2' - id: 6fb6 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 2 Error (rev 03)' -- bus: ff - dev: '15' - fn: '3' - id: 6fb7 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Memory Controller 0 - Channel 3 Error (rev 03)' -- bus: ff - dev: 1e - fn: '0' - id: 6f98 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Power Control Unit (rev 03)' -- bus: ff - dev: 1e - fn: '1' - id: 6f99 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Power Control Unit (rev 03)' -- bus: ff - dev: 1e - fn: '2' - id: 6f9a - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Power Control Unit (rev 03)' -- bus: ff - dev: 1e - fn: '3' - id: 6fc0 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Power Control Unit (rev 03)' -- bus: ff - dev: 1e - fn: '4' - id: 6f9c - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Power Control Unit (rev 03)' -- bus: ff - dev: 1f - fn: '0' - id: 6f88 - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Power Control Unit (rev 03)' -- bus: ff - dev: 1f - fn: '2' - id: 6f8a - name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon - D Power Control Unit (rev 03)' diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json deleted file mode 100644 index 41b5802fc4a6..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pd-plugin.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - - "XCVR": - { - "xcvr_present": - { - "i2c": - { - "valmap-SFP": {"1":true, "0":false}, - "valmap-QSFP": {"1":true, "0":false} - } - } - }, - "PSU": - { - "psu_present": - { - "i2c": - { - "valmap": { "1":true, "0":false } - }, - "bmc": - { - "valmap": { "0x0280|":true, "0x0180|":false } - } - }, - - "psu_power_good": - { - "i2c": - { - "valmap": { "1": true, "0":false } - }, - "bmc": - { - "valmap": { "0x0280|":true, "0x0180|":false } - } - }, - - "PSU_FAN_MAX_SPEED":"18000" - }, - - "FAN": - { - "direction": - { - "bmc": - { - "valmap": {"0": "UNKNOWN", "1":"INTAKE", "2":"EXHAUST"} - } - }, - - "present": - { - "i2c": - { - "valmap": {"1":true, "0":false} - }, - "bmc": - { - "valmap": { "0x0280|":true, "0x0180|":false } - } - }, - "FAN_R_MAX_SPEED":"22000", - "FAN_F_MAX_SPEED":"22000" - } - -} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json deleted file mode 100644 index b089cb4cb1bd..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json +++ /dev/null @@ -1,5879 +0,0 @@ -{ - "PLATFORM": { - "num_psus": 2, - "num_fantrays": 4, - "num_fans_pertray": 2, - "num_ports": 34, - "num_temps": 9, - "pddf_dev_types": { - "description": "PDDF supported devices", - "CPLD": [ - "i2c_cpld" - ], - "PSU": [ - "psu_eeprom", - "psu_pmbus" - ], - "PORT_MODULE": [ - "pddf_xcvr" - ] - }, - "std_kos": [ - "i2c_i801", - "i2c_dev", - "i2c_mux_pca954x", - "optoe", - "lm75", - "gpio-pca953x" - ], - "pddf_kos": [ - "pddf_client_module", - "pddf_cpld_module", - "pddf_cpld_driver", - "pddf_mux_module", - "pddf_xcvr_module", - "pddf_xcvr_driver_module", - "pddf_psu_driver_module", - "pddf_psu_module", - "pddf_fan_driver_module", - "pddf_fan_module", - "pddf_led_module", - "pddf_gpio_module" - ], - "custom_kos": [ - "x86-64-ufispace-s9180-32x-sys-eeprom" - ] - }, - "SYSTEM": { - "dev_info": { - "device_type": "CPU", - "device_name": "ROOT_COMPLEX", - "device_parent": null - }, - "i2c": { - "CONTROLLERS": [ - { - "dev_name": "i2c-0", - "dev": "SMBUS0" - } - ] - } - }, - "SMBUS0": { - "dev_info": { - "device_type": "SMBUS", - "device_name": "SMBUS0", - "device_parent": "SYSTEM" - }, - "i2c": { - "topo_info": { - "dev_addr": "0x0" - }, - "DEVICES": [ - { - "dev": "EEPROM1" - }, - { - "dev": "MUX1" - }, - { - "dev": "GPIO10" - }, - { - "dev": "TEMP1" - } - ] - } - }, - "EEPROM1": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "EEPROM1", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x51", - "dev_type": "sys_eeprom" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "TEMP1": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP1", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_CPU_BOARD" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x4f", - "dev_type": "tmp75" - }, - "attr_list": [ - { - "attr_name": "temp1_high_crit_threshold", - "drv_attr_name": "temp1_max" - }, - { - "attr_name": "temp1_max_hyst" - }, - { - "attr_name": "temp1_input" - } - ] - } - }, - "TEMP2": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP2", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_BMC" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_BMC", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_BMC", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_BMC", - "field_pos": "16" - } - ] - } - } - }, - "TEMP3": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP3", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_MAC" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC", - "field_pos": "16" - } - ] - } - } - }, - "TEMP4": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP4", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_MAC_Front" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC_Front", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC_Front", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC_Front", - "field_pos": "16" - } - ] - } - } - }, - "TEMP5": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP5", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_MAC_Rear" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC_Rear", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC_Rear", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_MAC_Rear", - "field_pos": "16" - } - ] - } - } - }, - "TEMP6": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP6", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_PSU1_AMB" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU1_AMB", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU1_AMB", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU1_AMB", - "field_pos": "16" - } - ] - } - } - }, - "TEMP7": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP7", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_PSU1_HS" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU1_HS", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU1_HS", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU1_HS", - "field_pos": "16" - } - ] - } - } - }, - "TEMP8": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP8", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_PSU2_AMB" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU2_AMB", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU2_AMB", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU2_AMB", - "field_pos": "16" - } - ] - } - } - }, - "TEMP9": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "TEMP9", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "display_name": "Temp_PSU2_HS" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU2_HS", - "field_pos": "3" - }, - { - "attr_name": "temp1_high_crit_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU2_HS", - "field_pos": "18" - }, - { - "attr_name": "temp1_high_threshold", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU2_HS", - "field_pos": "16" - } - ] - } - } - }, - "MUX1": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX1", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x70", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x1", - "idle_state": "-2" - }, - "channel": [ - { - "chn": "0", - "dev": "MUX2" - }, - { - "chn": "1", - "dev": "MUX3" - }, - { - "chn": "2", - "dev": "MUX4" - }, - { - "chn": "3", - "dev": "MUX5" - }, - { - "chn": "4", - "dev": "GPIO1" - }, - { - "chn": "4", - "dev": "GPIO2" - }, - { - "chn": "4", - "dev": "GPIO3" - }, - { - "chn": "4", - "dev": "GPIO4" - }, - { - "chn": "4", - "dev": "GPIO5" - }, - { - "chn": "5", - "dev": "GPIO6" - }, - { - "chn": "5", - "dev": "GPIO7" - }, - { - "chn": "5", - "dev": "GPIO8" - }, - { - "chn": "5", - "dev": "GPIO9" - }, - { - "chn": "6", - "dev": "MUX6" - } - ] - } - }, - "MUX2": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX2", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x71", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x9", - "idle_state": "-2" - }, - "channel": [ - { - "chn": "0", - "dev": "PORT1" - }, - { - "chn": "1", - "dev": "PORT2" - }, - { - "chn": "2", - "dev": "PORT3" - }, - { - "chn": "3", - "dev": "PORT4" - }, - { - "chn": "4", - "dev": "PORT5" - }, - { - "chn": "5", - "dev": "PORT6" - }, - { - "chn": "6", - "dev": "PORT7" - }, - { - "chn": "7", - "dev": "PORT8" - } - ] - } - }, - "MUX3": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX3", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x71", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x11", - "idle_state": "-2" - }, - "channel": [ - { - "chn": "0", - "dev": "PORT9" - }, - { - "chn": "1", - "dev": "PORT10" - }, - { - "chn": "2", - "dev": "PORT11" - }, - { - "chn": "3", - "dev": "PORT12" - }, - { - "chn": "4", - "dev": "PORT13" - }, - { - "chn": "5", - "dev": "PORT14" - }, - { - "chn": "6", - "dev": "PORT15" - }, - { - "chn": "7", - "dev": "PORT16" - } - ] - } - }, - "MUX4": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX4", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3", - "dev_addr": "0x71", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x19", - "idle_state": "-2" - }, - "channel": [ - { - "chn": "0", - "dev": "PORT17" - }, - { - "chn": "1", - "dev": "PORT18" - }, - { - "chn": "2", - "dev": "PORT19" - }, - { - "chn": "3", - "dev": "PORT20" - }, - { - "chn": "4", - "dev": "PORT21" - }, - { - "chn": "5", - "dev": "PORT22" - }, - { - "chn": "6", - "dev": "PORT23" - }, - { - "chn": "7", - "dev": "PORT24" - } - ] - } - }, - "MUX5": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX5", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x4", - "dev_addr": "0x71", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x21", - "idle_state": "-2" - }, - "channel": [ - { - "chn": "0", - "dev": "PORT25" - }, - { - "chn": "1", - "dev": "PORT26" - }, - { - "chn": "2", - "dev": "PORT27" - }, - { - "chn": "3", - "dev": "PORT28" - }, - { - "chn": "4", - "dev": "PORT29" - }, - { - "chn": "5", - "dev": "PORT30" - }, - { - "chn": "6", - "dev": "PORT31" - }, - { - "chn": "7", - "dev": "PORT32" - } - ] - } - }, - "MUX6": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX6", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x7", - "dev_addr": "0x71", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x29", - "idle_state": "-2" - }, - "channel": [ - { - "chn": "3", - "dev": "CPLD1" - }, - { - "chn": "4", - "dev": "PORT33" - }, - { - "chn": "5", - "dev": "PORT34" - } - ] - } - }, - "GPIO1": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO1", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x5", - "dev_addr": "0x20", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x1f0" - }, - "ports": [ - { - "port_num": "0", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO2": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO2", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x5", - "dev_addr": "0x21", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x1e0" - }, - "ports": [ - { - "port_num": "0", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO3": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO3", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x5", - "dev_addr": "0x22", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x1d0" - }, - "ports": [ - { - "port_num": "0", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO4": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO4", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x5", - "dev_addr": "0x23", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x1c0" - }, - "ports": [ - { - "port_num": "0", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO5": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO5", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x5", - "dev_addr": "0x27", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x1b0" - }, - "ports": [ - { - "port_num": "0", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO6": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO6", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x6", - "dev_addr": "0x20", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x1a0" - }, - "ports": [ - { - "port_num": "0", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO7": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO7", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x6", - "dev_addr": "0x21", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x190" - }, - "ports": [ - { - "port_num": "0", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO8": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO8", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x6", - "dev_addr": "0x22", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x180" - }, - "ports": [ - { - "port_num": "0", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO9": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO9", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x6", - "dev_addr": "0x23", - "dev_type": "pca9555" - }, - "dev_attr": { - "gpio_base": "0x170" - }, - "ports": [ - { - "port_num": "0", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "1", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "2", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "3", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "4", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "5", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "6", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "7", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "8", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "9", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "10", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "11", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "12", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "13", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "14", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - }, - { - "port_num": "15", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "0" - } - ] - } - }, - "GPIO10": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO10", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x77", - "dev_type": "pca9539" - }, - "dev_attr": { - "gpio_base": "0x160" - }, - "ports": [ - { - "port_num": "0", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - } - ] - } - }, - "GPIO11": { - "dev_info": { - "device_type": "GPIO", - "device_name": "GPIO11", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x74", - "dev_type": "pca9539" - }, - "dev_attr": { - "gpio_base": "0x150" - }, - "ports": [ - { - "port_num": "0", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "1", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "2", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "3", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "4", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "5", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "6", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "7", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "8", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "9", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "10", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "11", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "12", - "direction": "in", - "value": "", - "edge": "", - "active_low": "" - }, - { - "port_num": "13", - "direction": "out", - "value": "0", - "edge": "", - "active_low": "" - }, - { - "port_num": "14", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - }, - { - "port_num": "15", - "direction": "out", - "value": "1", - "edge": "", - "active_low": "" - } - ] - } - }, - "CPLD1": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CPLD1", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x30", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - "CPLD2": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CPLD2", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x31", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - "CPLD3": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CPLD3", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x32", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - "PSU1": { - "dev_info": { - "device_type": "PSU", - "device_name": "PSU1", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "dev_idx": "1", - "num_psu_fans": "1" - }, - "i2c": { - "interface": [] - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "psu_present", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "PSU1_PRSNT", - "field_pos": "7" - }, - { - "attr_name": "psu_power_good", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "PSU1_PWROK", - "field_pos": "7" - }, - { - "attr_name": "psu_temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU1_AMB", - "field_pos": "3", - "mult": "1000" - }, - { - "attr_name": "psu_fan1_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Fan_PSU1", - "field_pos": "3" - }, - { - "attr_name": "psu_mfr_id", - "bmc_cmd": "ipmitool fru print 1 | tr -s ' ' | cut -d' ' -f3-5", - "raw": "0", - "field_name": "Manufacturer", - "field_pos": "3", - "delimiter": ":" - }, - { - "attr_name": "psu_model_name", - "bmc_cmd": "ipmitool fru print 1 | tr -s ' ' | cut -d' ' -f3-5", - "raw": "0", - "field_name": "Name", - "field_pos": "3", - "delimiter": ":" - }, - { - "attr_name": "psu_serial_num", - "bmc_cmd": "ipmitool fru print 1 | tr -s ' ' | cut -d' ' -f3-5", - "raw": "0", - "field_name": "Serial", - "field_pos": "3", - "delimiter": ":" - }, - { - "attr_name": "psu_v_out", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "VOUT_PSU1", - "field_pos": "3", - "mult": "1000" - }, - { - "attr_name": "psu_i_out", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "IOUT_PSU1", - "field_pos": "3", - "mult": "1000" - } - ] - } - } - }, - "PSU2": { - "dev_info": { - "device_type": "PSU", - "device_name": "PSU2", - "device_parent": "SMBUS0" - }, - "dev_attr": { - "dev_idx": "2", - "num_psu_fans": "1" - }, - "i2c": { - "interface": [] - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "psu_present", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "PSU2_PRSNT", - "field_pos": "7" - }, - { - "attr_name": "psu_power_good", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "PSU2_PWROK", - "field_pos": "7" - }, - { - "attr_name": "psu_temp1_input", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Temp_PSU2_AMB", - "field_pos": "3", - "mult": "1000" - }, - { - "attr_name": "psu_fan1_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Fan_PSU2", - "field_pos": "3" - }, - { - "attr_name": "psu_mfr_id", - "bmc_cmd": "ipmitool fru print 2 | tr -s ' ' | cut -d' ' -f3-5", - "raw": "0", - "field_name": "Manufacturer", - "field_pos": "3", - "delimiter": ":" - }, - { - "attr_name": "psu_model_name", - "bmc_cmd": "ipmitool fru print 2 | tr -s ' ' | cut -d' ' -f3-5", - "raw": "0", - "field_name": "Name", - "field_pos": "3", - "delimiter": ":" - }, - { - "attr_name": "psu_serial_num", - "bmc_cmd": "ipmitool fru print 2 | tr -s ' ' | cut -d' ' -f3-5", - "raw": "0", - "field_name": "Serial", - "field_pos": "3", - "delimiter": ":" - }, - { - "attr_name": "psu_v_out", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "VOUT_PSU2", - "field_pos": "3", - "mult": "1000" - }, - { - "attr_name": "psu_i_out", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "IOUT_PSU2", - "field_pos": "3", - "mult": "1000" - } - ] - } - } - }, - "FAN-CTRL": { - "dev_info": { - "device_type": "FAN", - "device_name": "FAN-CTRL", - "device_parent": "" - }, - "bmc": { - "ipmitool": { - "attr_list": [ - { - "attr_name": "fan1_present", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Fan1_PRSNT", - "field_pos": "7" - }, - { - "attr_name": "fan2_present", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Fan2_PRSNT", - "field_pos": "7" - }, - { - "attr_name": "fan3_present", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Fan3_PRSNT", - "field_pos": "7" - }, - { - "attr_name": "fan4_present", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "Fan4_PRSNT", - "field_pos": "7" - }, - { - "attr_name": "fan1_f_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_1_F", - "field_pos": "3" - }, - { - "attr_name": "fan1_r_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_1_R", - "field_pos": "3" - }, - { - "attr_name": "fan2_f_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_2_F", - "field_pos": "3" - }, - { - "attr_name": "fan2_r_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_2_R", - "field_pos": "3" - }, - { - "attr_name": "fan3_f_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_3_F", - "field_pos": "3" - }, - { - "attr_name": "fan3_r_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_3_R", - "field_pos": "3" - }, - { - "attr_name": "fan4_f_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_4_F", - "field_pos": "3" - }, - { - "attr_name": "fan4_r_speed_rpm", - "bmc_cmd": "ipmitool sensor", - "raw": "0", - "field_name": "FAN_4_R", - "field_pos": "3" - } - ] - } - } - }, - "PORT1": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT1", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "1" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT1-EEPROM" - }, - { - "itf": "control", - "dev": "PORT1-CTRL" - } - ] - } - }, - "PORT1-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT1-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0a", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT1-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT1-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT2": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT2", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "2" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT2-EEPROM" - }, - { - "itf": "control", - "dev": "PORT2-CTRL" - } - ] - } - }, - "PORT2-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT2-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x09", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT2-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT2-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x09", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT3": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT3", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "3" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT3-EEPROM" - }, - { - "itf": "control", - "dev": "PORT3-CTRL" - } - ] - } - }, - "PORT3-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT3-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0c", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT3-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT3-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT4": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT4", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "4" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT4-EEPROM" - }, - { - "itf": "control", - "dev": "PORT4-CTRL" - } - ] - } - }, - "PORT4-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT4-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT4" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0b", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT4-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT4-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT4" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT5": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT5", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "5" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT5-EEPROM" - }, - { - "itf": "control", - "dev": "PORT5-CTRL" - } - ] - } - }, - "PORT5-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT5-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT5" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0e", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT5-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT5-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT5" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT6": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT6", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "6" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT6-EEPROM" - }, - { - "itf": "control", - "dev": "PORT6-CTRL" - } - ] - } - }, - "PORT6-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT6-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT6" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0d", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT6-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT6-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT6" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT7": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT7", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "7" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT7-EEPROM" - }, - { - "itf": "control", - "dev": "PORT7-CTRL" - } - ] - } - }, - "PORT7-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT7-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT7" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x10", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT7-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT7-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT7" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x10", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT8": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT8", - "device_parent": "MUX2" - }, - "dev_attr": { - "dev_idx": "8" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT8-EEPROM" - }, - { - "itf": "control", - "dev": "PORT8-CTRL" - } - ] - } - }, - "PORT8-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT8-EEPROM", - "device_parent": "MUX2", - "virt_parent": "PORT8" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0f", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT8-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT8-CTRL", - "device_parent": "MUX2", - "virt_parent": "PORT8" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT9": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT9", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "9" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT9-EEPROM" - }, - { - "itf": "control", - "dev": "PORT9-CTRL" - } - ] - } - }, - "PORT9-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT9-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT9" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x12", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT9-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT9-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT9" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x12", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT10": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT10", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "10" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT10-EEPROM" - }, - { - "itf": "control", - "dev": "PORT10-CTRL" - } - ] - } - }, - "PORT10-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT10-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT10" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x11", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT10-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT10-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT10" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x11", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT11": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT11", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "11" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT11-EEPROM" - }, - { - "itf": "control", - "dev": "PORT11-CTRL" - } - ] - } - }, - "PORT11-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT11-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT11" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x14", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT11-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT11-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT11" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x14", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT12": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT12", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "12" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT12-EEPROM" - }, - { - "itf": "control", - "dev": "PORT12-CTRL" - } - ] - } - }, - "PORT12-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT12-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT12" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x13", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT12-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT12-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT12" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x13", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT13": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT13", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "13" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT13-EEPROM" - }, - { - "itf": "control", - "dev": "PORT13-CTRL" - } - ] - } - }, - "PORT13-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT13-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT13" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x16", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT13-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT13-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT13" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x16", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT14": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT14", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "14" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT14-EEPROM" - }, - { - "itf": "control", - "dev": "PORT14-CTRL" - } - ] - } - }, - "PORT14-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT14-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT14" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x15", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT14-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT14-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT14" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x15", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT15": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT15", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "15" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT15-EEPROM" - }, - { - "itf": "control", - "dev": "PORT15-CTRL" - } - ] - } - }, - "PORT15-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT15-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT15" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x18", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT15-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT15-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT15" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x18", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT16": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT16", - "device_parent": "MUX3" - }, - "dev_attr": { - "dev_idx": "16" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT16-EEPROM" - }, - { - "itf": "control", - "dev": "PORT16-CTRL" - } - ] - } - }, - "PORT16-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT16-EEPROM", - "device_parent": "MUX3", - "virt_parent": "PORT16" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x17", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT16-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT16-CTRL", - "device_parent": "MUX3", - "virt_parent": "PORT16" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x17", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x22", - "attr_devname": "GPIO3", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x20", - "attr_devname": "GPIO1", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x22", - "attr_devname": "GPIO8", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x20", - "attr_devname": "GPIO6", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT17": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT17", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "17" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT17-EEPROM" - }, - { - "itf": "control", - "dev": "PORT17-CTRL" - } - ] - } - }, - "PORT17-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT17-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT17" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1a", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT17-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT17-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT17" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT18": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT18", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "18" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT18-EEPROM" - }, - { - "itf": "control", - "dev": "PORT18-CTRL" - } - ] - } - }, - "PORT18-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT18-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT18" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x19", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT18-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT18-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT18" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x19", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT19": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT19", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "19" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT19-EEPROM" - }, - { - "itf": "control", - "dev": "PORT19-CTRL" - } - ] - } - }, - "PORT19-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT19-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT19" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1c", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT19-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT19-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT19" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT20": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT20", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "20" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT20-EEPROM" - }, - { - "itf": "control", - "dev": "PORT20-CTRL" - } - ] - } - }, - "PORT20-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT20-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT20" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1b", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT20-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT20-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT20" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT21": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT21", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "21" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT21-EEPROM" - }, - { - "itf": "control", - "dev": "PORT21-CTRL" - } - ] - } - }, - "PORT21-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT21-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT21" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1e", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT21-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT21-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT21" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT22": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT22", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "22" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT22-EEPROM" - }, - { - "itf": "control", - "dev": "PORT22-CTRL" - } - ] - } - }, - "PORT22-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT22-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT22" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1d", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT22-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT22-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT22" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT23": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT23", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "23" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT23-EEPROM" - }, - { - "itf": "control", - "dev": "PORT23-CTRL" - } - ] - } - }, - "PORT23-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT23-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT23" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x20", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT23-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT23-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT23" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x20", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT24": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT24", - "device_parent": "MUX4" - }, - "dev_attr": { - "dev_idx": "24" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT24-EEPROM" - }, - { - "itf": "control", - "dev": "PORT24-CTRL" - } - ] - } - }, - "PORT24-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT24-EEPROM", - "device_parent": "MUX4", - "virt_parent": "PORT24" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1f", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT24-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT24-CTRL", - "device_parent": "MUX4", - "virt_parent": "PORT24" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT25": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT25", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "25" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT25-EEPROM" - }, - { - "itf": "control", - "dev": "PORT25-CTRL" - } - ] - } - }, - "PORT25-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT25-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT25" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x22", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT25-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT25-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT25" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x22", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x9", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT26": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT26", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "26" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT26-EEPROM" - }, - { - "itf": "control", - "dev": "PORT26-CTRL" - } - ] - } - }, - "PORT26-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT26-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT26" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x21", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT26-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT26-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT26" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x21", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0x8", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT27": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT27", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "27" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT27-EEPROM" - }, - { - "itf": "control", - "dev": "PORT27-CTRL" - } - ] - } - }, - "PORT27-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT27-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT27" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x24", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT27-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT27-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT27" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x24", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0xb", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT28": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT28", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "28" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT28-EEPROM" - }, - { - "itf": "control", - "dev": "PORT28-CTRL" - } - ] - } - }, - "PORT28-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT28-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT28" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x23", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT28-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT28-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT28" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x23", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0xa", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT29": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT29", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "29" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT29-EEPROM" - }, - { - "itf": "control", - "dev": "PORT29-CTRL" - } - ] - } - }, - "PORT29-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT29-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT29" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x26", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT29-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT29-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT29" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x26", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0xd", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT30": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT30", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "30" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT30-EEPROM" - }, - { - "itf": "control", - "dev": "PORT30-CTRL" - } - ] - } - }, - "PORT30-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT30-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT30" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x25", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT30-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT30-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT30" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x25", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0xc", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT31": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT31", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "31" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT31-EEPROM" - }, - { - "itf": "control", - "dev": "PORT31-CTRL" - } - ] - } - }, - "PORT31-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT31-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT31" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x28", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT31-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT31-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT31" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x28", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0xf", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT32": { - "dev_info": { - "device_type": "QSFP", - "device_name": "PORT32", - "device_parent": "MUX5" - }, - "dev_attr": { - "dev_idx": "32" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT32-EEPROM" - }, - { - "itf": "control", - "dev": "PORT32-CTRL" - } - ] - } - }, - "PORT32-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT32-EEPROM", - "device_parent": "MUX5", - "virt_parent": "PORT32" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x27", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT32-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT32-CTRL", - "device_parent": "MUX5", - "virt_parent": "PORT32" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x27", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_intr_status", - "attr_devaddr": "0x23", - "attr_devname": "GPIO4", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x21", - "attr_devname": "GPIO2", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x23", - "attr_devname": "GPIO9", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_lpmode", - "attr_devaddr": "0x21", - "attr_devname": "GPIO7", - "attr_devtype": "gpio", - "attr_offset": "0xe", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - - "PORT33": { - "dev_info": { - "device_type": "SFP", - "device_name": "PORT33", - "device_parent": "MUX6" - }, - "dev_attr": { - "dev_idx": "33" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT33-EEPROM" - }, - { - "itf": "control", - "dev": "PORT33-CTRL" - } - ] - } - }, - "PORT33-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT33", - "device_parent": "MUX6", - "virt_parent": "PORT33" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2d", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT33-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT33-CTRL", - "device_parent": "MUX6", - "virt_parent": "PORT33" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x0", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_rxlos", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x6", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_txfault", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x2", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_txdisable", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x4", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - }, - "PORT34": { - "dev_info": { - "device_type": "SFP", - "device_name": "PORT34", - "device_parent": "MUX6" - }, - "dev_attr": { - "dev_idx": "34" - }, - "i2c": { - "interface": [ - { - "itf": "eeprom", - "dev": "PORT34-EEPROM" - }, - { - "itf": "control", - "dev": "PORT34-CTRL" - } - ] - } - }, - "PORT34-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT34", - "device_parent": "MUX6", - "virt_parent": "PORT34" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2e", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [ - { - "attr_name": "eeprom" - } - ] - } - }, - "PORT34-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT34-CTRL", - "device_parent": "MUX6", - "virt_parent": "PORT34" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [ - { - "attr_name": "xcvr_present", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x1", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_rxlos", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x7", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_txfault", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x3", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - }, - { - "attr_name": "xcvr_txdisable", - "attr_devaddr": "0x27", - "attr_devname": "GPIO5", - "attr_devtype": "gpio", - "attr_offset": "0x5", - "attr_mask": "", - "attr_cmpval": "", - "attr_len": "" - } - ] - } - } -} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf_support b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf_support deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json deleted file mode 100644 index b21674f59f53..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json +++ /dev/null @@ -1,547 +0,0 @@ -{ - "chassis": { - "name": "S9180-32X", - "components": [ - { - "name": "CPLD1" - }, - { - "name": "BIOS" - }, - { - "name": "BMC" - } - ], - "fans": [ - { - "name": "Fantray1_1" - }, - { - "name": "Fantray1_2" - }, - { - "name": "Fantray2_1" - }, - { - "name": "Fantray2_2" - }, - { - "name": "Fantray3_1" - }, - { - "name": "Fantray3_2" - }, - { - "name": "Fantray4_1" - }, - { - "name": "Fantray4_2" - } - ], - "fan_drawers":[ - { - "name": "Fantray1", - "num_fans" : 2, - "fans": [ - { - "name": "Fantray1_1" - }, - { - "name": "Fantray1_2" - } - ] - }, - { - "name": "Fantray2", - "num_fans" : 2, - "fans": [ - { - "name": "Fantray2_1" - }, - { - "name": "Fantray2_2" - } - ] - }, - { - "name": "Fantray3", - "num_fans" : 2, - "fans": [ - { - "name": "Fantray3_1" - }, - { - "name": "Fantray3_2" - } - ] - }, - { - "name": "Fantray4", - "num_fans" : 2, - "fans": [ - { - "name": "Fantray4_1" - }, - { - "name": "Fantray4_2" - } - ] - } - ], - "psus": [ - { - "name": "PSU1", - "fans": [ - { - "name": "PSU1_FAN1" - } - ], - "thermals": [ - { - "name": "PSU1_TEMP1" - } - ] - }, - { - "name": "PSU2", - "fans": [ - { - "name": "PSU2_FAN1" - } - ], - "thermals": [ - { - "name": "PSU2_TEMP1" - } - ] - } - ], - "thermals": [ - { - "name": "Temp_CPU_BOARD" - }, - { - "name": "Temp_BMC" - }, - { - "name": "Temp_MAC" - }, - { - "name": "Temp_MAC_Front" - }, - { - "name": "Temp_MAC_Rear" - } - ], - "sfps": [ - { - "name": "Ethernet0" - }, - { - "name": "Ethernet4" - }, - { - "name": "Ethernet8" - }, - { - "name": "Ethernet12" - }, - { - "name": "Ethernet16" - }, - { - "name": "Ethernet20" - }, - { - "name": "Ethernet24" - }, - { - "name": "Ethernet28" - }, - { - "name": "Ethernet32" - }, - { - "name": "Ethernet36" - }, - { - "name": "Ethernet40" - }, - { - "name": "Ethernet44" - }, - { - "name": "Ethernet48" - }, - { - "name": "Ethernet52" - }, - { - "name": "Ethernet56" - }, - { - "name": "Ethernet60" - }, - { - "name": "Ethernet64" - }, - { - "name": "Ethernet68" - }, - { - "name": "Ethernet72" - }, - { - "name": "Ethernet76" - }, - { - "name": "Ethernet80" - }, - { - "name": "Ethernet84" - }, - { - "name": "Ethernet88" - }, - { - "name": "Ethernet92" - }, - { - "name": "Ethernet96" - }, - { - "name": "Ethernet100" - }, - { - "name": "Ethernet104" - }, - { - "name": "Ethernet108" - }, - { - "name": "Ethernet112" - }, - { - "name": "Ethernet116" - }, - { - "name": "Ethernet120" - }, - { - "name": "Ethernet124" - }, - { - "name": "Ethernet128" - }, - { - "name": "Ethernet129" - } - ] - }, - "interfaces": { - "Ethernet0": { - "index": "0,0,0,0", - "lanes": "1,2,3,4", - "breakout_modes": { - "1x100G": ["Eth0(Port0)"], - "4x25G": ["Eth0/1(Port0)", "Eth0/2(Port0)", "Eth0/3(Port0)", "Eth0/4(Port0)"] - } - }, - - "Ethernet4": { - "index": "1,1,1,1", - "lanes": "5,6,7,8", - "breakout_modes": { - "1x100G": ["Eth1(Port1)"], - "4x25G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"] - } - }, - - "Ethernet8": { - "index": "2,2,2,2", - "lanes": "9,10,11,12", - "breakout_modes": { - "1x100G": ["Eth2(Port2)"], - "4x25G": ["Eth2/1(Port2)", "Eth2/2(Port2)", "Eth2/3(Port2)", "Eth2/4(Port2)"] - } - }, - - "Ethernet12": { - "index": "3,3,3,3", - "lanes": "13,14,15,16", - "breakout_modes": { - "1x100G": ["Eth3(Port3)"], - "4x25G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"] - } - }, - - "Ethernet16": { - "index": "4,4,4,4", - "lanes": "17,18,19,20", - "breakout_modes": { - "1x100G": ["Eth4(Port4)"], - "4x25G": ["Eth4/1(Port4)", "Eth4/2(Port4)", "Eth4/3(Port4)", "Eth4/4(Port4)"] - } - }, - - "Ethernet20": { - "index": "5,5,5,5", - "lanes": ",21,22,23,24", - "breakout_modes": { - "1x100G": ["Eth5(Port5)"], - "4x25G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"] - } - }, - - "Ethernet24": { - "index": "6,6,6,6", - "lanes": "25,26,27,28", - "breakout_modes": { - "1x100G": ["Eth6(Port6)"], - "4x25G": ["Eth6/1(Port6)", "Eth6/2(Port6)", "Eth6/3(Port6)", "Eth6/4(Port6)"] - } - }, - - "Ethernet28": { - "index": "7,7,7,7", - "lanes": "29,30,31,32", - "breakout_modes": { - "1x100G": ["Eth7(Port7)"], - "4x25G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"] - } - }, - - "Ethernet32": { - "index": "8,8,8,8", - "lanes": "33,34,35,36", - "breakout_modes": { - "1x100G": ["Eth8(Port8)"], - "4x25G": ["Eth8/1(Port8)", "Eth8/2(Port8)", "Eth8/3(Port8)", "Eth8/4(Port8)"] - } - }, - - "Ethernet36": { - "index": "9,9,9,9", - "lanes": "37,38,39,40", - "breakout_modes": { - "1x100G": ["Eth9(Port9)"], - "4x25G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"] - } - }, - - "Ethernet40": { - "index": "10,10,10,10", - "lanes": "41,42,43,44", - "breakout_modes": { - "1x100G": ["Eth10(Port10)"], - "4x25G": ["Eth10/1(Port10)", "Eth10/2(Port10)", "Eth10/3(Port10)", "Eth10/4(Port10)"] - } - }, - - "Ethernet44": { - "index": "11,11,11,11", - "lanes": "45,46,47,48", - "breakout_modes": { - "1x100G": ["Eth11(Port11)"], - "4x25G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"] - } - }, - - "Ethernet48": { - "index": "12,12,12,12", - "lanes": "49,50,51,52", - "breakout_modes": { - "1x100G": ["Eth12(Port12)"], - "4x25G": ["Eth12/1(Port12)", "Eth12/2(Port12)", "Eth12/3(Port12)", "Eth12/4(Port12)"] - } - }, - - "Ethernet52": { - "index": "13,13,13,13", - "lanes": "53,54,55,56", - "breakout_modes": { - "1x100G": ["Eth13(Port13)"], - "4x25G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"] - } - }, - - "Ethernet56": { - "index": "14,14,14,14", - "lanes": "57,58,59,60", - "breakout_modes": { - "1x100G": ["Eth14(Port14)"], - "4x25G": ["Eth14/1(Port14)", "Eth14/2(Port14)", "Eth14/3(Port14)", "Eth14/4(Port14)"] - } - }, - - "Ethernet60": { - "index": "15,15,15,15", - "lanes": "61,62,63,64", - "breakout_modes": { - "1x100G": ["Eth15(Port15)"], - "4x25G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"] - } - }, - - "Ethernet64": { - "index": "16,16,16,16", - "lanes": "65,66,67,68", - "breakout_modes": { - "1x100G": ["Eth16(Port16)"], - "4x25G": ["Eth16/1(Port16)", "Eth16/2(Port16)", "Eth16/3(Port16)", "Eth16/4(Port16)"] - } - }, - - "Ethernet68": { - "index": "17,17,17,17", - "lanes": "69,70,71,72", - "breakout_modes": { - "1x100G": ["Eth17(Port17)"], - "4x25G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"] - } - }, - - "Ethernet72": { - "index": "18,18,18,18", - "lanes": "73,74,75,76", - "breakout_modes": { - "1x100G": ["Eth18(Port18)"], - "4x25G": ["Eth18/1(Port18)", "Eth18/2(Port18)", "Eth18/3(Port18)", "Eth18/4(Port18)"] - } - }, - - "Ethernet76": { - "index": "19,19,19,19", - "lanes": "77,78,79,80", - "breakout_modes": { - "1x100G": ["Eth19(Port19)"], - "4x25G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"] - } - }, - - "Ethernet80": { - "index": "20,20,20,20", - "lanes": "81,82,83,84", - "breakout_modes": { - "1x100G": ["Eth20(Port20)"], - "4x25G": ["Eth20/1(Port20)", "Eth20/2(Port20)", "Eth20/3(Port20)", "Eth20/4(Port20)"] - } - }, - - "Ethernet84": { - "index": "21,21,21,21", - "lanes": "85,86,87,88", - "breakout_modes": { - "1x100G": ["Eth21(Port21)"], - "4x25G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"] - } - }, - - "Ethernet88": { - "index": "22,22,22,22", - "lanes": "89,90,91,92", - "breakout_modes": { - "1x100G": ["Eth22(Port22)"], - "4x25G": ["Eth22/1(Port22)", "Eth22/2(Port22)", "Eth22/3(Port22)", "Eth22/4(Port22)"] - } - }, - - "Ethernet92": { - "index": "23,23,23,23", - "lanes": "93,94,95,96", - "breakout_modes": { - "1x100G": ["Eth23(Port23)"], - "4x25G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"] - } - }, - - "Ethernet96": { - "index": "24,24,24,24", - "lanes": "97,98,99,100", - "breakout_modes": { - "1x100G": ["Eth24(Port24)"], - "4x25G": ["Eth24/1(Port24)", "Eth24/2(Port24)", "Eth24/3(Port24)", "Eth24/4(Port24)"] - } - }, - - "Ethernet100": { - "index": "25,25,25,25", - "lanes": "101,102,103,104", - "breakout_modes": { - "1x100G": ["Eth25(Port25)"], - "4x25G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"] - } - }, - - "Ethernet104": { - "index": "26,26,26,26", - "lanes": "105,106,107,108", - "breakout_modes": { - "1x100G": ["Eth26(Port26)"], - "4x25G": ["Eth26/1(Port26)", "Eth26/2(Port26)", "Eth26/3(Port26)", "Eth26/4(Port26)"] - } - }, - - "Ethernet108": { - "index": "27,27,27,27", - "lanes": "109,110,111,112", - "breakout_modes": { - "1x100G": ["Eth27(Port27)"], - "4x25G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"] - } - }, - - "Ethernet112": { - "index": "28,28,28,28", - "lanes": "113,114,115,116", - "breakout_modes": { - "1x100G": ["Eth28(Port28)"], - "4x25G": ["Eth28/1(Port28)", "Eth28/2(Port28)", "Eth28/3(Port28)", "Eth28/4(Port28)"] - } - }, - - "Ethernet116": { - "index": "29,29,29,29", - "lanes": "117,118,119,120", - "breakout_modes": { - "1x100G": ["Eth29(Port29)"], - "4x25G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"] - } - }, - - "Ethernet120": { - "index": "30,30,30,30", - "lanes": "121,122,123,124", - "breakout_modes": { - "1x100G": ["Eth30(Port30)"], - "4x25G": ["Eth30/1(Port30)", "Eth30/2(Port30)", "Eth30/3(Port30)", "Eth30/4(Port30)"] - } - }, - - "Ethernet124": { - "index": "31,31,31,31", - "lanes": "125,126,127,128", - "breakout_modes": { - "1x100G": ["Eth31(Port31)"], - "4x25G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"] - } - }, - - "Ethernet128": { - "index": "32", - "lanes": "129", - "breakout_modes": { - "1x10G": ["Eth32(Port32)"] - } - }, - - "Ethernet129": { - "index": "33", - "lanes": "130", - "breakout_modes": { - "1x10G": ["Eth33(Port33)"] - } - } - } -} - diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic b/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic deleted file mode 100644 index 88d88117928c..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/platform_asic +++ /dev/null @@ -1 +0,0 @@ -barefoot diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json deleted file mode 100644 index e348e0168fa5..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/pmon_daemon_control.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "skip_pcied": false, - "skip_fancontrol": false, - "skip_thermalctld": false, - "skip_ledd": true, - "skip_xcvrd": false, - "skip_psud": false, - "skip_syseepromd": false -} diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf b/device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf deleted file mode 100644 index 7a1c0408810f..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/sensors.conf +++ /dev/null @@ -1,9 +0,0 @@ -# libsensors configuration file - -bus "i2c-0" "I2C I801" -chip "tmp75-i2c-*-4f" - label temp1 "CPU Board Temp" - set temp1_max 70 - set temp1_max_hyst 75 - set temp1_crit 85 - diff --git a/device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json b/device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json deleted file mode 100644 index 6291e81a0621..000000000000 --- a/device/ufispace/x86_64-ufispace_s9180_32x-r0/system_health_monitoring_config.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "services_to_ignore": [], - "devices_to_ignore": [ - "asic", - "psu", - "fan" - ], - "user_defined_checkers": [], - "polling_interval": 60, - "led_color": { - "fault": "yellow", - "normal": "green", - "booting": "blinking_green" - } -} \ No newline at end of file diff --git a/platform/barefoot/bfn-platform-ufispace.mk b/platform/barefoot/bfn-platform-ufispace.mk deleted file mode 100644 index fd3dced686dc..000000000000 --- a/platform/barefoot/bfn-platform-ufispace.mk +++ /dev/null @@ -1,5 +0,0 @@ -BFN_UFISPACE_PLATFORM = bfnplatform-ufispace_1.0.0_amd64.deb -$(BFN_UFISPACE_PLATFORM)_URL = "https://github.com/ufispace-dev/bf_sde_bsp/raw/master/sonic/9.12.0/$(BFN_UFISPACE_PLATFORM)" - -SONIC_ONLINE_DEBS += $(BFN_UFISPACE_PLATFORM) # $(BFN_SAI_DEV) -$(BFN_SAI_DEV)_DEPENDS += $(BFN_UFISPACE_PLATFORM) diff --git a/platform/barefoot/docker-saiserver-bfn.mk b/platform/barefoot/docker-saiserver-bfn.mk index 26abf7c53b5b..dde7e8888a57 100644 --- a/platform/barefoot/docker-saiserver-bfn.mk +++ b/platform/barefoot/docker-saiserver-bfn.mk @@ -12,7 +12,7 @@ SONIC_COPY_FILES += $(SYNCD_INIT_COMMON_SCRIPT) $(DOCKER_SAISERVER_BFN)_DEPENDS += $(SAISERVER) # Install syncd for reuse the config fun #$(DOCKER_SAISERVER_BFN)_DEPENDS += $(SYNCD) -$(DOCKER_SAISERVER_BFN)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) $(LIBTHRIFT_0_14_1) +$(DOCKER_SAISERVER_BFN)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) $(LIBTHRIFT_0_14_1) $(DOCKER_SAISERVER_BFN)_FILES += $(SYNCD_INIT_COMMON_SCRIPT) # Same dependence as ENABLE_SYNCD_RPC @@ -20,7 +20,7 @@ $(DOCKER_SAISERVER_BFN)_DEPENDS += $(LIBSAITHRIFT_DEV) $(LIBTHRIFT_0_14_1_DEV) # Runtime dependency on sai is set only for syncd #$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) -$(DOCKER_SAISERVER_BFN)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) +$(DOCKER_SAISERVER_BFN)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) $(DOCKER_SAISERVER_BFN)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) diff --git a/platform/barefoot/one-image.mk b/platform/barefoot/one-image.mk index b3257e8919ed..798a0d678a0d 100644 --- a/platform/barefoot/one-image.mk +++ b/platform/barefoot/one-image.mk @@ -5,18 +5,16 @@ $(SONIC_ONE_IMAGE)_MACHINE = barefoot $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_INSTALLS += $(BFN_MODULE) $(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR) -$(SONIC_ONE_IMAGE)_INSTALLS += $(PDDF_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_NEWPORT_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_NEWPORT_BF_PLATFORM_MODULE) -$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WNC_OSW1800_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WNC_OSW1800_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9180_32X_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9280_64X_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_QS_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_610_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_710_PLATFORM_MODULE) -$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(UFISPACE_S9180_32X_PLATFORM_MODULE) ifeq ($(INSTALL_DEBUG_TOOLS),y) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES) $(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES)) diff --git a/platform/barefoot/platform-modules-ufispace.mk b/platform/barefoot/platform-modules-ufispace.mk deleted file mode 100644 index 9cdd5ca43ad7..000000000000 --- a/platform/barefoot/platform-modules-ufispace.mk +++ /dev/null @@ -1,14 +0,0 @@ -# Ufispace S9180-32X Platform modules - -UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION = 1.1.0 - -export UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION - -UFISPACE_S9180_32X_PLATFORM_MODULE = sonic-platform-ufispace-s9180-32x_$(UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION)_amd64.deb -$(UFISPACE_S9180_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ufispace -$(UFISPACE_S9180_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) -$(UFISPACE_S9180_32X_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s9180_32x-r0 -SONIC_DPKG_DEBS += $(UFISPACE_S9180_32X_PLATFORM_MODULE) - -$(eval $(call add_extra_package,$(UFISPACE_S9180_32X_PLATFORM_MODULE))) - diff --git a/platform/barefoot/rules.mk b/platform/barefoot/rules.mk index 0a4339ce7161..58f52f5ffd56 100644 --- a/platform/barefoot/rules.mk +++ b/platform/barefoot/rules.mk @@ -6,7 +6,6 @@ include $(PLATFORM_PATH)/platform-modules-bfn-newport.mk include $(PLATFORM_PATH)/platform-modules-wnc-osw1800.mk include $(PLATFORM_PATH)/platform-modules-ingrasys.mk include $(PLATFORM_PATH)/platform-modules-netberg.mk -include $(PLATFORM_PATH)/platform-modules-ufispace.mk include $(PLATFORM_PATH)/bfn-sai.mk include $(PLATFORM_PATH)/docker-syncd-bfn.mk include $(PLATFORM_PATH)/docker-syncd-bfn-rpc.mk @@ -16,7 +15,6 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/bfn-platform.mk #include $(PLATFORM_PATH)/bfn-platform-wnc.mk #include $(PLATFORM_PATH)/bfn-platform-ingrasys.mk -include $(PLATFORM_PATH)/bfn-platform-ufispace.mk include $(PLATFORM_PATH)/bfn-modules.mk include $(PLATFORM_PATH)/docker-saiserver-bfn.mk @@ -25,7 +23,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT) \ # Inject sai into syncd #$(SYNCD)_DEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) -$(SYNCD)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) +$(SYNCD)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) $(SYNCD)_UNINSTALLS += $(BFN_SAI) ifeq ($(ENABLE_SYNCD_RPC),y) @@ -35,6 +33,6 @@ endif # Runtime dependency on sai is set only for syncd #$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) -$(SYNCD)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) +$(SYNCD)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) export SONIC_BUFFER_MODEL=dynamic diff --git a/platform/barefoot/sonic-platform-modules-ufispace/LICENSE b/platform/barefoot/sonic-platform-modules-ufispace/LICENSE deleted file mode 100644 index 9cecc1d4669e..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/changelog b/platform/barefoot/sonic-platform-modules-ufispace/debian/changelog deleted file mode 100644 index 0b4a98329e16..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -sonic-ufispace-platform-modules (1.1.0) unstable; urgency=low - - * Add support for S9180-32X. - - -- Ufispace Tue, 19 Apr 2022 17:10:58 +0800 diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/compat b/platform/barefoot/sonic-platform-modules-ufispace/debian/compat deleted file mode 100644 index ec635144f600..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/debian/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/control b/platform/barefoot/sonic-platform-modules-ufispace/debian/control deleted file mode 100644 index cc98343cf09b..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/debian/control +++ /dev/null @@ -1,10 +0,0 @@ -Source: sonic-ufispace-platform-modules -Section: main -Priority: extra -Maintainer: Leo Lin , Jason Tsai -Build-Depends: debhelper (>= 9), bzip2 -Standards-Version: 1.0.0 - -Package: sonic-platform-ufispace-s9180-32x -Architecture: amd64 -Description: This package contains s9180-32x platform driver utility for SONiC project. diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/rules b/platform/barefoot/sonic-platform-modules-ufispace/debian/rules deleted file mode 100755 index 552cc61f8f44..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/debian/rules +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -include /usr/share/dpkg/pkg-info.mk - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -export INSTALL_MOD_DIR:=extra - -PYTHON3 ?= python3 - -PACKAGE_PRE_NAME := sonic-platform-ufispace -KVERSION ?= $(shell uname -r) -KERNEL_SRC := /lib/modules/$(KVERSION) -MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= s9180-32x -MODULE_DIR := modules -UTILS_DIR := utils -SERVICE_DIR := service -CONF_DIR := conf - -%: - dh $@ --with systemd,python3 --buildsystem=pybuild - -clean: - dh_testdir - dh_testroot - dh_clean - (for mod in $(MODULE_DIRS); do \ - make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ - done) - - - -build: - (for mod in $(MODULE_DIRS); do \ - make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ - cd -; \ - cd $(MOD_SRC_DIR)/$${mod}; \ - if [ -f sonic_platform_setup.py ]; then \ - $(PYTHON3) sonic_platform_setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}; \ - echo "Finished makig whl package for $$mod"; \ - fi; \ - cd -; \ - done) - -binary: binary-arch binary-indep - -binary-arch: - -binary-indep: - dh_testdir - dh_installdirs - (for mod in $(MODULE_DIRS); do \ - dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ - cp $(MOD_SRC_DIR)/$${mod}/$(MODULE_DIR)/*.ko debian/$(PACKAGE_PRE_NAME)-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ - dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} usr/local/bin; \ - cp $(MOD_SRC_DIR)/$${mod}/$(UTILS_DIR)/* debian/$(PACKAGE_PRE_NAME)-$${mod}/usr/local/bin; \ - dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} lib/systemd/system; \ - cp $(MOD_SRC_DIR)/$${mod}/$(SERVICE_DIR)/*.service debian/$(PACKAGE_PRE_NAME)-$${mod}/lib/systemd/system; \ - cd $(MOD_SRC_DIR)/$${mod}; \ - cd -; \ - done) - - # Resuming debhelper scripts - dh_testroot - dh_install - dh_installchangelogs - dh_installdocs - dh_systemd_enable - dh_installinit - dh_systemd_start - dh_link - dh_fixperms - dh_compress - dh_strip - dh_installdeb - dh_gencontrol - dh_md5sums - dh_builddeb - -.PHONY: build binary binary-arch binary-indep clean diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install b/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install deleted file mode 100644 index b6968a0a3a74..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.install +++ /dev/null @@ -1 +0,0 @@ -s9180-32x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-ufispace_s9180_32x-r0/pddf diff --git a/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst b/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst deleted file mode 100644 index c5d8d8f0abc4..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9180-32x.postinst +++ /dev/null @@ -1,5 +0,0 @@ -depmod -a -systemctl enable pddf-platform-init.service -systemctl start pddf-platform-init.service -systemctl enable platform-swss-restart.service -systemctl start --no-block platform-swss-restart.service diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile deleted file mode 100644 index f5b3bc42137e..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -MODULE_NAME = x86-64-ufispace-s9180-32x-sys-eeprom.o i2c-smbus.o -obj-m := $(MODULE_NAME) - -CFLAGS_pddf_custom_sysstatus_module.o := -I$(M)/../../../../pddf/i2c/modules/include -KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c deleted file mode 100644 index 6c4e4dca5673..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/i2c-smbus.c +++ /dev/null @@ -1,423 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * i2c-smbus.c - SMBus extensions to the I2C protocol - * - * Copyright (C) 2008 David Brownell - * Copyright (C) 2010-2019 Jean Delvare - */ - -#define __STDC_WANT_LIB_EXT1__ 1 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int disable_i2c_register_spd = 1; -module_param(disable_i2c_register_spd, int, 0); - -struct i2c_smbus_alert { - struct work_struct alert; - struct i2c_client *ara; /* Alert response address */ -}; - -struct alert_data { - unsigned short addr; - enum i2c_alert_protocol type; - unsigned int data; -}; - -/* If this is the alerting device, notify its driver */ -static int smbus_do_alert(struct device *dev, void *addrp) -{ - struct i2c_client *client = i2c_verify_client(dev); - struct alert_data *data = addrp; - struct i2c_driver *driver; - - if (!client || client->addr != data->addr) - return 0; - if (client->flags & I2C_CLIENT_TEN) - return 0; - - /* - * Drivers should either disable alerts, or provide at least - * a minimal handler. Lock so the driver won't change. - */ - device_lock(dev); - if (client->dev.driver) { - driver = to_i2c_driver(client->dev.driver); - if (driver->alert) - driver->alert(client, data->type, data->data); - else - dev_warn(&client->dev, "no driver alert()!\n"); - } else - dev_dbg(&client->dev, "alert with no driver\n"); - device_unlock(dev); - - /* Stop iterating after we find the device */ - return -EBUSY; -} - -/* - * The alert IRQ handler needs to hand work off to a task which can issue - * SMBus calls, because those sleeping calls can't be made in IRQ context. - */ -static irqreturn_t smbus_alert(int irq, void *d) -{ - struct i2c_smbus_alert *alert = d; - struct i2c_client *ara; - - ara = alert->ara; - - for (;;) { - s32 status; - struct alert_data data; - - /* - * Devices with pending alerts reply in address order, low - * to high, because of slave transmit arbitration. After - * responding, an SMBus device stops asserting SMBALERT#. - * - * Note that SMBus 2.0 reserves 10-bit addresses for future - * use. We neither handle them, nor try to use PEC here. - */ - status = i2c_smbus_read_byte(ara); - if (status < 0) - break; - - data.data = status & 1; - data.addr = status >> 1; - data.type = I2C_PROTOCOL_SMBUS_ALERT; - - dev_dbg(&ara->dev, "SMBALERT# from dev 0x%02x, flag %d\n", - data.addr, data.data); - - /* Notify driver for the device which issued the alert */ - device_for_each_child(&ara->adapter->dev, &data, - smbus_do_alert); - } - - return IRQ_HANDLED; -} - -static void smbalert_work(struct work_struct *work) -{ - struct i2c_smbus_alert *alert; - - alert = container_of(work, struct i2c_smbus_alert, alert); - - smbus_alert(0, alert); - -} - -/* Setup SMBALERT# infrastructure */ -static int smbalert_probe(struct i2c_client *ara, - const struct i2c_device_id *id) -{ - struct i2c_smbus_alert_setup *setup = dev_get_platdata(&ara->dev); - struct i2c_smbus_alert *alert; - struct i2c_adapter *adapter = ara->adapter; - int res, irq; - - alert = devm_kzalloc(&ara->dev, sizeof(struct i2c_smbus_alert), - GFP_KERNEL); - if (!alert) - return -ENOMEM; - - if (setup) { - irq = setup->irq; - } else { - irq = of_irq_get_byname(adapter->dev.of_node, "smbus_alert"); - if (irq <= 0) - return irq; - } - - INIT_WORK(&alert->alert, smbalert_work); - alert->ara = ara; - - if (irq > 0) { - res = devm_request_threaded_irq(&ara->dev, irq, - NULL, smbus_alert, - IRQF_SHARED | IRQF_ONESHOT, - "smbus_alert", alert); - if (res) - return res; - } - - i2c_set_clientdata(ara, alert); - dev_info(&adapter->dev, "supports SMBALERT#\n"); - - return 0; -} - -/* IRQ and memory resources are managed so they are freed automatically */ -static int smbalert_remove(struct i2c_client *ara) -{ - struct i2c_smbus_alert *alert = i2c_get_clientdata(ara); - - cancel_work_sync(&alert->alert); - return 0; -} - -static const struct i2c_device_id smbalert_ids[] = { - { "smbus_alert", 0 }, - { /* LIST END */ } -}; -MODULE_DEVICE_TABLE(i2c, smbalert_ids); - -static struct i2c_driver smbalert_driver = { - .driver = { - .name = "smbus_alert", - }, - .probe = smbalert_probe, - .remove = smbalert_remove, - .id_table = smbalert_ids, -}; - -/** - * i2c_handle_smbus_alert - Handle an SMBus alert - * @ara: the ARA client on the relevant adapter - * Context: can't sleep - * - * Helper function to be called from an I2C bus driver's interrupt - * handler. It will schedule the alert work, in turn calling the - * corresponding I2C device driver's alert function. - * - * It is assumed that ara is a valid i2c client previously returned by - * i2c_new_smbus_alert_device(). - */ -int i2c_handle_smbus_alert(struct i2c_client *ara) -{ - struct i2c_smbus_alert *alert = i2c_get_clientdata(ara); - - return schedule_work(&alert->alert); -} -EXPORT_SYMBOL_GPL(i2c_handle_smbus_alert); - -module_i2c_driver(smbalert_driver); - -#if IS_ENABLED(CONFIG_I2C_SLAVE) -#define SMBUS_HOST_NOTIFY_LEN 3 -struct i2c_slave_host_notify_status { - u8 index; - u8 addr; -}; - -static int i2c_slave_host_notify_cb(struct i2c_client *client, - enum i2c_slave_event event, u8 *val) -{ - struct i2c_slave_host_notify_status *status = client->dev.platform_data; - - switch (event) { - case I2C_SLAVE_WRITE_RECEIVED: - /* We only retrieve the first byte received (addr) - * since there is currently no support to retrieve the data - * parameter from the client. - */ - if (status->index == 0) - status->addr = *val; - if (status->index < U8_MAX) - status->index++; - break; - case I2C_SLAVE_STOP: - if (status->index == SMBUS_HOST_NOTIFY_LEN) - i2c_handle_smbus_host_notify(client->adapter, - status->addr); - fallthrough; - case I2C_SLAVE_WRITE_REQUESTED: - status->index = 0; - break; - case I2C_SLAVE_READ_REQUESTED: - case I2C_SLAVE_READ_PROCESSED: - *val = 0xff; - break; - } - - return 0; -} - -/** - * i2c_new_slave_host_notify_device - get a client for SMBus host-notify support - * @adapter: the target adapter - * Context: can sleep - * - * Setup handling of the SMBus host-notify protocol on a given I2C bus segment. - * - * Handling is done by creating a device and its callback and handling data - * received via the SMBus host-notify address (0x8) - * - * This returns the client, which should be ultimately freed using - * i2c_free_slave_host_notify_device(); or an ERRPTR to indicate an error. - */ -struct i2c_client *i2c_new_slave_host_notify_device(struct i2c_adapter *adapter) -{ - struct i2c_board_info host_notify_board_info = { - I2C_BOARD_INFO("smbus_host_notify", 0x08), - .flags = I2C_CLIENT_SLAVE, - }; - struct i2c_slave_host_notify_status *status; - struct i2c_client *client; - int ret; - - status = kzalloc(sizeof(struct i2c_slave_host_notify_status), - GFP_KERNEL); - if (!status) - return ERR_PTR(-ENOMEM); - - host_notify_board_info.platform_data = status; - - client = i2c_new_client_device(adapter, &host_notify_board_info); - if (IS_ERR(client)) { - kfree(status); - return client; - } - - ret = i2c_slave_register(client, i2c_slave_host_notify_cb); - if (ret) { - i2c_unregister_device(client); - kfree(status); - return ERR_PTR(ret); - } - - return client; -} -EXPORT_SYMBOL_GPL(i2c_new_slave_host_notify_device); - -/** - * i2c_free_slave_host_notify_device - free the client for SMBus host-notify - * support - * @client: the client to free - * Context: can sleep - * - * Free the i2c_client allocated via i2c_new_slave_host_notify_device - */ -void i2c_free_slave_host_notify_device(struct i2c_client *client) -{ - if (IS_ERR_OR_NULL(client)) - return; - - i2c_slave_unregister(client); - kfree(client->dev.platform_data); - i2c_unregister_device(client); -} -EXPORT_SYMBOL_GPL(i2c_free_slave_host_notify_device); -#endif - -/* - * SPD is not part of SMBus but we include it here for convenience as the - * target systems are the same. - * Restrictions to automatic SPD instantiation: - * - Only works if all filled slots have the same memory type - * - Only works for DDR2, DDR3 and DDR4 for now - * - Only works on systems with 1 to 4 memory slots - */ -#if IS_ENABLED(CONFIG_DMI) -void i2c_register_spd(struct i2c_adapter *adap) -{ - int n, slot_count = 0, dimm_count = 0; - u16 handle; - u8 common_mem_type = 0x0, mem_type; - u64 mem_size; - const char *name; - - //disable spd scan to prevent address conflict between spd and sys eeprom - if (disable_i2c_register_spd == 1) { - return; - } - - while ((handle = dmi_memdev_handle(slot_count)) != 0xffff) { - slot_count++; - - /* Skip empty slots */ - mem_size = dmi_memdev_size(handle); - if (!mem_size) - continue; - - /* Skip undefined memory type */ - mem_type = dmi_memdev_type(handle); - if (mem_type <= 0x02) /* Invalid, Other, Unknown */ - continue; - - if (!common_mem_type) { - /* First filled slot */ - common_mem_type = mem_type; - } else { - /* Check that all filled slots have the same type */ - if (mem_type != common_mem_type) { - dev_warn(&adap->dev, - "Different memory types mixed, not instantiating SPD\n"); - return; - } - } - dimm_count++; - } - - /* No useful DMI data, bail out */ - if (!dimm_count) - return; - - dev_info(&adap->dev, "%d/%d memory slots populated (from DMI)\n", - dimm_count, slot_count); - - if (slot_count > 4) { - dev_warn(&adap->dev, - "Systems with more than 4 memory slots not supported yet, not instantiating SPD\n"); - return; - } - - switch (common_mem_type) { - case 0x13: /* DDR2 */ - case 0x18: /* DDR3 */ - case 0x1C: /* LPDDR2 */ - case 0x1D: /* LPDDR3 */ - name = "spd"; - break; - case 0x1A: /* DDR4 */ - case 0x1E: /* LPDDR4 */ - name = "ee1004"; - break; - default: - dev_info(&adap->dev, - "Memory type 0x%02x not supported yet, not instantiating SPD\n", - common_mem_type); - return; - } - - /* - * We don't know in which slots the memory modules are. We could - * try to guess from the slot names, but that would be rather complex - * and unreliable, so better probe all possible addresses until we - * have found all memory modules. - */ - for (n = 0; n < slot_count && dimm_count; n++) { - struct i2c_board_info info; - unsigned short addr_list[2]; - -#ifdef __STDC_LIB_EXT1__ - memset_s(&info, sizeof(struct i2c_board_info), 0, sizeof(struct i2c_board_info)); -#else - memset(&info, 0, sizeof(struct i2c_board_info)); -#endif - strlcpy(info.type, name, I2C_NAME_SIZE); - addr_list[0] = 0x50 + n; - addr_list[1] = I2C_CLIENT_END; - - if (!IS_ERR(i2c_new_scanned_device(adap, &info, addr_list, NULL))) { - dev_info(&adap->dev, - "Successfully instantiated SPD at 0x%hx\n", - addr_list[0]); - dimm_count--; - } - } -} -EXPORT_SYMBOL_GPL(i2c_register_spd); -#endif - -MODULE_AUTHOR("Jean Delvare "); -MODULE_DESCRIPTION("SMBus protocol extensions support"); -MODULE_LICENSE("GPL"); diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c deleted file mode 100644 index f9f7728deb3d..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/modules/x86-64-ufispace-s9180-32x-sys-eeprom.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 1998, 1999 Frodo Looijaard and - * Philip Edelbrock - * Copyright (C) 2003 Greg Kroah-Hartman - * Copyright (C) 2003 IBM Corp. - * Copyright (C) 2004 Jean Delvare - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* enable dev_dbg print out */ -//#define DEBUG - -#define __STDC_WANT_LIB_EXT1__ 1 -#include -#include -#include -#include -#include -#include -#include - -/* Addresses to scan */ -static const unsigned short normal_i2c[] = { /*0x50, 0x51, 0x52, 0x53, 0x54, - 0x55, 0x56, 0x57,*/ I2C_CLIENT_END }; - -/* Size of EEPROM in bytes */ -#define EEPROM_SIZE 512 - -#define SLICE_BITS (6) -#define SLICE_SIZE (1 << SLICE_BITS) -#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) - -/* Each client has this additional data */ -struct eeprom_data { - struct mutex update_lock; - u8 valid; /* bitfield, bit!=0 if slice is valid */ - unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ - u8 data[EEPROM_SIZE]; /* Register values */ -}; - - -static void sys_eeprom_update_client(struct i2c_client *client, u8 slice) -{ - struct eeprom_data *data = i2c_get_clientdata(client); - int i, j; - int ret; - int addr; - - mutex_lock(&data->update_lock); - - if (!(data->valid & (1 << slice)) || - time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { - dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); - - addr = slice << SLICE_BITS; - - ret = i2c_smbus_write_byte_data(client, (u8)((addr >> 8) & 0xFF), (u8)(addr & 0xFF)); - /* select the eeprom address */ - if (ret < 0) { - dev_err(&client->dev, "address set failed\n"); - goto exit; - } - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { - goto exit; - } - - for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { - for (j = i; j < (i+SLICE_SIZE); j++) { - int res; - - res = i2c_smbus_read_byte(client); - if (res < 0) { - goto exit; - } - - data->data[j] = res & 0xFF; - } - } - - data->last_updated[slice] = jiffies; - data->valid |= (1 << slice); - } -exit: - mutex_unlock(&data->update_lock); -} - -static ssize_t sys_eeprom_read(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t off, size_t count) -{ - struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); - struct eeprom_data *data = i2c_get_clientdata(client); - u8 slice; - - if (off > EEPROM_SIZE) { - return 0; - } - if (off + count > EEPROM_SIZE) { - count = EEPROM_SIZE - off; - } - if (count == 0) { - return 0; - } - - /* Only refresh slices which contain requested bytes */ - for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { - sys_eeprom_update_client(client, slice); - } - - memcpy(buf, &data->data[off], count); - - return count; -} - -static ssize_t sys_eeprom_write(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t off, size_t count) -{ - struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); - struct eeprom_data *data = i2c_get_clientdata(client); - int ret; - int i; - u8 cmd; - u16 value16; - - dev_dbg(&client->dev, "sys_eeprom_write off=%d, count=%d\n", (int)off, (int)count); - - if (off > EEPROM_SIZE) { - return 0; - } - if (off + count > EEPROM_SIZE) { - count = EEPROM_SIZE - off; - } - if (count == 0) { - return 0; - } - - mutex_lock(&data->update_lock); - - for(i=0; i < count; i++) { - /* write command */ - cmd = (off >> 8) & 0xff; - value16 = off & 0xff; - value16 |= buf[i] << 8; - ret = i2c_smbus_write_word_data(client, cmd, value16); - - if (ret < 0) { - dev_err(&client->dev, "write address failed at %d \n", (int)off); - goto exit; - } - - off++; - - /* need to wait for write complete */ - udelay(10000); - } -exit: - mutex_unlock(&data->update_lock); - /* force to update client when reading */ - for(i=0; i < SLICE_NUM; i++) { - data->last_updated[i] = 0; - } - - return count; -} - -static struct bin_attribute sys_eeprom_attr = { - .attr = { - .name = "eeprom", - .mode = S_IRUGO | S_IWUSR, - }, - .size = EEPROM_SIZE, - .read = sys_eeprom_read, - .write = sys_eeprom_write, -}; - -/* Return 0 if detection is successful, -ENODEV otherwise */ -static int sys_eeprom_detect(struct i2c_client *client, struct i2c_board_info *info) -{ - struct i2c_adapter *adapter = client->adapter; - - /* EDID EEPROMs are often 24C00 EEPROMs, which answer to all - addresses 0x50-0x57, but we only care about 0x51 and 0x55. So decline - attaching to addresses >= 0x56 on DDC buses */ - if (!(adapter->class & I2C_CLASS_SPD) && client->addr >= 0x56) { - return -ENODEV; - } - - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE) - && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { - return -ENODEV; - } - - strlcpy(info->type, "eeprom", I2C_NAME_SIZE); - - return 0; -} - -static int sys_eeprom_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct eeprom_data *data; - int err; - - if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { - err = -ENOMEM; - goto exit; - } - -#ifdef __STDC_LIB_EXT1__ - memset_s(data->data, EEPROM_SIZE, 0xff, EEPROM_SIZE); -#else - memset(data->data, 0xff, EEPROM_SIZE); -#endif - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - /* create the sysfs eeprom file */ - err = sysfs_create_bin_file(&client->dev.kobj, &sys_eeprom_attr); - if (err) { - goto exit_kfree; - } - - return 0; - -exit_kfree: - kfree(data); -exit: - return err; -} - -static int sys_eeprom_remove(struct i2c_client *client) -{ - sysfs_remove_bin_file(&client->dev.kobj, &sys_eeprom_attr); - kfree(i2c_get_clientdata(client)); - - return 0; -} - -static const struct i2c_device_id sys_eeprom_id[] = { - { "sys_eeprom", 0 }, - { } -}; - -static struct i2c_driver sys_eeprom_driver = { - .driver = { - .name = "sys_eeprom", - }, - .probe = sys_eeprom_probe, - .remove = sys_eeprom_remove, - .id_table = sys_eeprom_id, - - .class = I2C_CLASS_DDC | I2C_CLASS_SPD, - .detect = sys_eeprom_detect, - .address_list = normal_i2c, -}; - -module_i2c_driver(sys_eeprom_driver); - -MODULE_AUTHOR("Jason "); -MODULE_DESCRIPTION("UfiSpace System EEPROM driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service deleted file mode 120000 index 0fd9f25b6c5e..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/pddf-platform-init.service +++ /dev/null @@ -1 +0,0 @@ -../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service deleted file mode 100644 index 323a4b827ccd..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/service/platform-swss-restart.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=SWSS restart service -After=swss.service -DefaultDependencies=no - -[Service] -Type=oneshot -ExecStart=/usr/local/bin/platform_swss_restart.sh -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target - diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py deleted file mode 100644 index 593867d31c9d..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# All the derived classes for PDDF -__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] -from . import platform - diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py deleted file mode 100644 index 017242de4dd6..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/chassis.py +++ /dev/null @@ -1,214 +0,0 @@ -#!/usr/bin/env python - -############################################################################# -# PDDF -# Module contains an implementation of SONiC Chassis API -# -############################################################################# - -try: - import time - import subprocess - from sonic_platform_pddf_base.pddf_chassis import PddfChassis -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -NUM_COMPONENT = 2 - -class Chassis(PddfChassis): - """ - PDDF Platform-specific Chassis class - """ - - STATUS_INSERTED = "1" - STATUS_REMOVED = "0" - port_dict = {} - - def __init__(self, pddf_data=None, pddf_plugin_data=None): - PddfChassis.__init__(self, pddf_data, pddf_plugin_data) - self._initialize_components() - - def _initialize_components(self): - from sonic_platform.component import Component - for index in range(NUM_COMPONENT): - component = Component(index) - self._component_list.append(component) - - # Provide the functions/variables below for which implementation is to be overwritten - def initizalize_system_led(self): - return True - - def get_status_led(self): - return self.get_system_led("SYS_LED") - - def get_system_led(self, led_device_name): - ipmi_cmd_sys_led = "ipmitool raw 0x3c 0x20 0x0" - ipmi_cmd_fantray_led = "ipmitool raw 0x3c 0x21 0x0" - - led_dict = {"SYS_LED": { - "ipmi_cmd": ipmi_cmd_sys_led, - "index": 0}, - "FAN_LED": { - "ipmi_cmd": ipmi_cmd_sys_led, - "index": 1}, - "PSU1_LED": { - "ipmi_cmd": ipmi_cmd_sys_led, - "index": 2}, - "PSU2_LED": { - "ipmi_cmd": ipmi_cmd_sys_led, - "index": 3}, - "FANTRAY1_LED": { - "ipmi_cmd": ipmi_cmd_fantray_led, - "index": 0}, - "FANTRAY2_LED": { - "ipmi_cmd": ipmi_cmd_fantray_led, - "index": 1}, - "FANTRAY3_LED": { - "ipmi_cmd": ipmi_cmd_fantray_led, - "index": 2}, - "FANTRAY4_LED": { - "ipmi_cmd": ipmi_cmd_fantray_led, - "index": 3} - } - color_dict = {0: "off", - 1: "yellow", - 2: "green"} - - if led_device_name not in led_dict.keys(): - status = "[FAILED] " + led_device_name + " is not configured" - return (status) - - ipmi_cmd = led_dict[led_device_name]["ipmi_cmd"] - index = led_dict[led_device_name]["index"] - status, output = subprocess.getstatusoutput(ipmi_cmd) - - if status != 0: - return ("ipmi_cmd error, cmd={}, status={}".format(ipmi_cmd, status)) - - color_raw = int(output.split()[index]) - - if color_raw not in color_dict.keys(): - color = "unknown" - else: - color = color_dict[color_raw] - - return (color) - - def get_change_event(self, timeout=0): - """ - Returns a nested dictionary containing all devices which have - experienced a change at chassis level - Args: - timeout: Timeout in milliseconds (optional). If timeout == 0, - this method will block until a change is detected. - Returns: - (bool, dict): - - bool: True if call successful, False if not; - - dict: A nested dictionary where key is a device type, - value is a dictionary with key:value pairs in the format of - {'device_id':'device_event'}, where device_id is the device ID - for this device and device_event. - The known devices's device_id and device_event was defined as table below. - ----------------------------------------------------------------- - device | device_id | device_event | annotate - ----------------------------------------------------------------- - 'fan' '' '0' Fan removed - '1' Fan inserted - 'sfp' '' '0' Sfp removed - '1' Sfp inserted - '2' I2C bus stuck - '3' Bad eeprom - '4' Unsupported cable - '5' High Temperature - '6' Bad cable - 'voltage' '' '0' Vout normal - '1' Vout abnormal - -------------------------------------------------------------------- - Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'}, - 'voltage':{'U20':'0', 'U21':'1'}} - Indicates that: - fan 0 has been removed, fan 2 has been inserted. - sfp 11 has been removed, sfp 12 has been inserted. - monitored voltage U20 became normal, voltage U21 became abnormal. - Note: For sfp, when event 3-6 happened, the module will not be avalaible, - XCVRD shall stop to read eeprom before SFP recovered from error status. - """ - - change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}} - - start_time = time.time() - forever = False - - if timeout == 0: - forever = True - elif timeout > 0: - timeout = timeout / float(1000) # Convert to secs - else: - print("get_change_event:Invalid timeout value", timeout) - return False, change_event_dict - - end_time = start_time + timeout - if start_time > end_time: - print( - "get_change_event:" "time wrap / invalid timeout value", - timeout, - ) - return False, change_event_dict # Time wrap or possibly incorrect timeout - try: - while timeout >= 0: - # check for sfp - sfp_change_dict = self.get_transceiver_change_event() - # check for fan - # fan_change_dict = self.get_fan_change_event() - # check for voltage - # voltage_change_dict = self.get_voltage_change_event() - - if sfp_change_dict: - change_event_dict["sfp"] = sfp_change_dict - # change_event_dict["fan"] = fan_change_dict - # change_event_dict["voltage"] = voltage_change_dict - return True, change_event_dict - if forever: - time.sleep(1) - else: - timeout = end_time - time.time() - if timeout >= 1: - time.sleep(1) # We poll at 1 second granularity - else: - if timeout > 0: - time.sleep(timeout) - return True, change_event_dict - except Exception as e: - print(e) - print("get_change_event: Should not reach here.") - return False, change_event_dict - - def get_transceiver_change_event(self): - current_port_dict = {} - ret_dict = {} - - # Check for OIR events and return ret_dict - for index in range(self.platform_inventory['num_ports']): - if self._sfp_list[index].get_presence(): - current_port_dict[index] = self.STATUS_INSERTED - else: - current_port_dict[index] = self.STATUS_REMOVED - - if len(self.port_dict) == 0: # first time - self.port_dict = current_port_dict - return {} - - if current_port_dict == self.port_dict: - return {} - - # Update reg value - for index, status in current_port_dict.items(): - if self.port_dict[index] != status: - ret_dict[index] = status - #ret_dict[str(index)] = status - self.port_dict = current_port_dict - for index, status in ret_dict.items(): - if int(status) == 1: - pass - #self._sfp_list[int(index)].check_sfp_optoe_type() - return ret_dict diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py deleted file mode 100644 index 0355e0762144..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/component.py +++ /dev/null @@ -1,113 +0,0 @@ -############################################################################# -# -# Component contains an implementation of SONiC Platform Base API and -# provides the components firmware management function -# -############################################################################# - -try: - import subprocess - from sonic_platform_base.component_base import ComponentBase -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -BMC_CMDS = { - "VER1": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f1", - "VER2": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f2", - "VER3": "echo $((`ipmitool mc info | grep 'Aux Firmware Rev Info' -A 2 | sed -n '2p'` + 0))", -} - -BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" -COMPONENT_LIST= [ - ("BIOS", "Basic Input/Output System"), - ("BMC", "BMC"), - -] - -class Component(ComponentBase): - """Platform-specific Component class""" - - DEVICE_TYPE = "component" - - def __init__(self, component_index=0): - self.index = component_index - self.name = self.get_name() - - def _run_command(self, command): - # Run bash command and print output to stdout - try: - process = subprocess.Popen( - shlex.split(command), stdout=subprocess.PIPE) - while True: - output = process.stdout.readline() - if output == '' and process.poll() is not None: - break - rc = process.poll() - if rc != 0: - return False - except Exception: - return False - return True - - def _get_bios_version(self): - # Retrieves the BIOS firmware version - try: - with open(BIOS_VERSION_PATH, 'r') as fd: - bios_version = fd.read() - return bios_version.strip() - except Exception as e: - return None - - def _get_bmc_version(self): - # Retrieves the BMC firmware version - bmc_ver = dict() - for ver in BMC_CMDS: - status, value = subprocess.getstatusoutput(BMC_CMDS[ver]) - if not status: - bmc_ver[ver] = int(value.rstrip()) - else: - return None - - bmc_version = "{}.{}.{}".format(bmc_ver["VER1"], bmc_ver["VER2"], bmc_ver["VER3"]) - - return bmc_version - - def get_name(self): - """ - Retrieves the name of the component - Returns: - A string containing the name of the component - """ - return COMPONENT_LIST[self.index][0] - - def get_description(self): - """ - Retrieves the description of the component - Returns: - A string containing the description of the component - """ - return COMPONENT_LIST[self.index][1] - - def get_firmware_version(self): - """ - Retrieves the firmware version of module - Returns: - string: The firmware versions of the module - """ - fw_version = None - - if self.name == "BIOS": - fw_version = self._get_bios_version() - elif self.name == "BMC": - fw_version = self._get_bmc_version() - return fw_version - - def install_firmware(self, image_path): - """ - Install firmware to module - Args: - image_path: A string, path to firmware image - Returns: - A boolean, True if install successfully, False if not - """ - raise NotImplementedError diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py deleted file mode 100644 index a87ecc9f6feb..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/eeprom.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python - -try: - from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class Eeprom(PddfEeprom): - - def __init__(self, pddf_data=None, pddf_plugin_data=None): - PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py deleted file mode 100644 index 40bfb40a01a8..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan.py +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/env python - - -try: - from sonic_platform_pddf_base.pddf_fan import PddfFan -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class Fan(PddfFan): - """PDDF Platform-Specific Fan class""" - - def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): - # idx is 0-based - PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) - - # Provide the functions/variables below for which implementation is to be overwritten - # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' - - def get_speed(self): - """ - Retrieves the speed of fan as a percentage of full speed - - Returns: - An integer, the percentage of full fan speed, in the range 0 (off) - to 100 (full speed) - """ - speed_percentage = 0 - if self.is_psu_fan: - attr = "psu_fan{}_speed_rpm".format(self.fan_index) - device = "PSU{}".format(self.fans_psu_index) - max_speed = int(self.plugin_data['PSU']['PSU_FAN_MAX_SPEED']) - else: - if self.fan_index == 1: - pos = "f" - max_speed = int(self.plugin_data['FAN']['FAN_F_MAX_SPEED']) - else: - pos = "r" - max_speed = int(self.plugin_data['FAN']['FAN_R_MAX_SPEED']) - attr = "fan{}_{}_speed_rpm".format(self.fantray_index, pos) - device = "FAN-CTRL" - - output = self.pddf_obj.get_attr_name_output(device, attr) - if not output: - return speed_percentage - - output['status'] = output['status'].rstrip() - if output['status'].isalpha(): - return speed_percentage - else: - speed = int(float(output['status'])) - - speed_percentage = round((speed*100)/max_speed) - - return min(speed_percentage, 100) - - def get_speed_rpm(self): - """ - Retrieves the speed of fan in RPM - - Returns: - An integer, Speed of fan in RPM - """ - rpm_speed = 0 - if self.is_psu_fan: - attr = "psu_fan{}_speed_rpm".format(self.fan_index) - device = "PSU{}".format(self.fans_psu_index) - else: - if self.fan_index == 1: - pos = "f" - else: - pos = "r" - attr = "fan{}_{}_speed_rpm".format(self.fantray_index, pos) - device = "FAN-CTRL" - - output = self.pddf_obj.get_attr_name_output(device, attr) - - if output is None: - return rpm_speed - - output['status'] = output['status'].rstrip() - if output['status'].isalpha(): - return rpm_speed - else: - rpm_speed = int(float(output['status'])) - - return rpm_speed - - def get_direction(self): - """ - Retrieves the direction of fan - Returns: - A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST - depending on fan direction - """ - - return self.FAN_DIRECTION_EXHAUST - - def get_presence(self): - """ - Retrieves the presence of the device - Returns: - bool: True if device is present, False if not - """ - presence = False - if self.is_psu_fan: - attr = "psu_present" - device = "PSU{}".format(self.fans_psu_index) - else: - attr = "fan{}_present".format(self.fantray_index) - device = "FAN-CTRL" - - output = self.pddf_obj.get_attr_name_output(device, attr) - if not output: - return presence - - - mode = output['mode'] - val = output['status'].strip() - vmap = self.plugin_data['FAN']['present'][mode]['valmap'] - - if val in vmap: - presence = vmap[val] - - return presence - - def get_status(self): - """ - Retrieves the operational status of the device - - Returns: - A boolean value, True if device is operating properly, False if not - """ - speed = self.get_speed_rpm() - status = True if (speed != 0) else False - return status - - def get_target_speed(self): - """ - Retrieves the target (expected) speed of the fan - Returns: - An integer, the percentage of full fan speed, in the range 0 (off) - to 100 (full speed) - """ - - return self.get_speed() - diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py deleted file mode 100644 index 3b9bb607f632..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/fan_drawer.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - - -try: - from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class FanDrawer(PddfFanDrawer): - """PDDF Platform-Specific Fan-Drawer class""" - - def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): - # idx is 0-based - PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py deleted file mode 100644 index 406b1179ae1b..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/platform.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python - -############################################################################# -# PDDF -# Module contains an implementation of SONiC Platform Base API and -# provides the platform information -# -############################################################################# - - -try: - from sonic_platform_pddf_base.pddf_platform import PddfPlatform -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class Platform(PddfPlatform): - """ - PDDF Platform-Specific Platform Class - """ - - def __init__(self): - PddfPlatform.__init__(self) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py deleted file mode 100644 index 3d84a4a39c1b..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/psu.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python - - -try: - from sonic_platform_pddf_base.pddf_psu import PddfPsu -except ImportError as e: - raise ImportError (str(e) + "- required module not found") - - -class Psu(PddfPsu): - """PDDF Platform-Specific PSU class""" - - PLATFORM_PSU_CAPACITY = 550 - - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten - def get_maximum_supplied_power(self): - """ - Retrieves the maximum supplied power by PSU (or PSU capacity) - Returns: - A float number, the maximum power output in Watts. - e.g. 1200.1 - """ - return float(self.PLATFORM_PSU_CAPACITY) - - def get_power(self): - """ - Retrieves current energy supplied by PSU - - Returns: - A float number, the power in watts, - e.g. 302.6 - """ - - # power is returned in micro watts - return float(self.get_voltage()*self.get_current()) diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py deleted file mode 100644 index d9b6e491bef4..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/sfp.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - -try: - from sonic_platform_pddf_base.pddf_sfp import PddfSfp -except ImportError as e: - raise ImportError (str(e) + "- required module not found") - - -class Sfp(PddfSfp): - """ - PDDF Platform-Specific Sfp class - """ - - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py deleted file mode 100644 index 77d6ec7ae886..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/thermal.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - - -try: - from sonic_platform_pddf_base.pddf_thermal import PddfThermal -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - - -class Thermal(PddfThermal): - """PDDF Platform-Specific Thermal class""" - - def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py deleted file mode 100644 index 88660b1a1faa..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform/watchdog.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env python - -############################################################################# -# -# Module contains an implementation of platform specific watchdog API's -# -############################################################################# - -try: - from sonic_platform_pddf_base.pddf_watchdog import PddfWatchdog -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -class Watchdog(PddfWatchdog): - """ - PDDF Platform-specific Chassis class - """ - - def __init__(self): - PddfWatchdog.__init__(self) - self.timeout= 180 - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py deleted file mode 100644 index 3661c84a0cd6..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/sonic_platform_setup.py +++ /dev/null @@ -1,27 +0,0 @@ -from setuptools import setup - -setup( - name='sonic-platform', - version='1.0', - description='SONiC platform API implementation on ufispace platform', - license='Apache 2.0', - author='SONiC Team', - author_email='linuxnetdev@microsoft.com', - url='https://github.com/Azure/sonic-buildimage', - maintainer='Leo Lin', - maintainer_email='leo.yt.lin@ufispace.com', - packages=['sonic_platform'], - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Environment :: Plugins', - 'Intended Audience :: Developers', - 'Intended Audience :: Information Technology', - 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: Apache Software License', - 'Natural Language :: English', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Python :: 3.7', - 'Topic :: Utilities', - ], - keywords='sonic SONiC platform PLATFORM', -) diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh deleted file mode 100755 index d54ff14d7151..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_device_create.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - -# init Host GPIO 0x74 -i2cset -f -y -r 0 0x74 4 0x00 -i2cset -f -y -r 0 0x74 5 0x00 -i2cset -f -y -r 0 0x74 2 0x0F -i2cset -f -y -r 0 0x74 3 0xDF -i2cset -f -y -r 0 0x74 6 0x08 -i2cset -f -y -r 0 0x74 7 0x1F - -gpio_base=511 - -# gpio sysfs active_low - ABS Port 0-31 -# gpio 480-511 -start=$((gpio_base-31)) -end=$gpio_base -for (( i=$start; i<=$end; i++ )) -do - echo 1 > /sys/class/gpio/gpio${i}/active_low -done - -# gpio sysfs active_low - Intr Port 0-31 -# gpio 448-479 -start=$((gpio_base-63)) -end=$((gpio_base-32)) -for (( i=$start; i<=$end; i++ )) -do - echo 1 > /sys/class/gpio/gpio${i}/active_low -done - - -# gpio sysfs active_low - SFP Port -# gpio 432-447 -sfp_active_low_array=(1 1 1 1 0 0 1 1 \ - 0 0 0 0 1 1 1 1) -start=$((gpio_base-79)) -end=$((gpio_base-64)) -for (( i=$start; i<=$end; i++ )) -do - echo ${sfp_active_low_array[$((i-start))]} > /sys/class/gpio/gpio${i}/active_low -done - -# gpio sysfs active_low - LP Mode Mode Port 0-31 -# gpio 400-431 -start=$((gpio_base-111)) -end=$((gpio_base-80)) -for (( i=$start; i<=$end; i++ )) -do - echo 0 > /sys/class/gpio/gpio${i}/active_low -done - -# gpio sysfs active_low - RST Mode Port 0-31 -# gpio 368-399 -start=$((gpio_base-143)) -end=$((gpio_base-112)) -for (( i=$start; i<=$end; i++ )) -do - echo 1 > /sys/class/gpio/gpio${i}/active_low - echo 0 > /sys/class/gpio/gpio${i}/value -done - -# init QSFP port name -qsfp_bus_array=(10 9 12 11 14 13 16 15 18 17 \ - 20 19 22 21 24 23 26 25 28 27 \ - 30 29 32 31 34 33 36 35 38 37 \ - 40 39) -for i in {0..31}; -do - echo $((i + 1)) > /sys/bus/i2c/devices/${qsfp_bus_array[i]}-0050/port_name - #echo "echo $((i + 1)) > /sys/bus/i2c/devices/${qsfp_bus_array[i]}-0050/port_name" -done - -# init SFP port name -sfp_bus_array=(45 46) -for i in {0..1}; -do - echo $((i + 33)) > /sys/bus/i2c/devices/${sfp_bus_array[i]}-0050/port_name -done - -# _mac_vdd_init -# vid to mac vdd value mapping -vdd_val_array=( 0.85 0.82 0.77 0.87 0.74 0.84 0.79 0.89 ) -# vid to rov reg value mapping -rov_reg_array=( 0x24 0x21 0x1C 0x26 0x19 0x23 0x1E 0x28 ) - -reg_val=$(eval "i2cget -f -y 44 0x33 0x42 2>/dev/null") -vid=$(($reg_val & 0x7)) -mac_vdd_val=${vdd_val_array[vid]} -rov_reg=${rov_reg_array[vid]} -i2cset -f -y -r 8 0x22 0x21 ${rov_reg} w 2>/dev/null - -echo "PDDF device post-create completed" - diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh deleted file mode 100755 index ed2559977e42..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_post_driver_install.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "PDDF driver post-install completed" diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh deleted file mode 100755 index a82d23333b4f..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_pre_driver_install.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -#rmmod gpio_ich -modprobe -rq i2c_i801 -modprobe -rq i2c_smbus -echo "PDDF driver pre-install completed" diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py deleted file mode 100755 index f2b3645ba6c0..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pddf_switch_svc.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# Script to stop and start the respective platforms default services. -# This will be used while switching the pddf->non-pddf mode and vice versa -import commands - -def check_pddf_support(): - return True - -def stop_platform_svc(): - - ''' - status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py deinit") - if status: - print "platform_utility.py deinit command failed %d"%status - return False - ''' - - # HACK , stop the pddf-platform-init service if it is active - status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") - if status: - print "Stop pddf-platform-init.service along with other platform serives failed %d"%status - return False - - return True - -def start_platform_svc(): - - ''' - status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py init") - if status: - print "platform_utility.py init command failed %d"%status - return False - - return True - ''' - return True - -def start_platform_pddf(): - - status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") - if status: - print "Start pddf-platform-init.service failed %d"%status - return False - - return True - -def stop_platform_pddf(): - - status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") - if status: - print "Stop pddf-platform-init.service failed %d"%status - return False - - return True - diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh deleted file mode 100755 index 2509e36929af..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/platform_swss_restart.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -service swss restart -echo "SWSS service restarted" - diff --git a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh b/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh deleted file mode 100755 index 63a2e205808e..000000000000 --- a/platform/barefoot/sonic-platform-modules-ufispace/s9180-32x/utils/pre_pddf_init.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -#rmmod gpio_ich -modprobe -rq i2c_i801 -modprobe -rq i2c_smbus -echo "Pre PDDF init steps completed successully" From bb8ce50cbe389285ebe9796504d83b9f0a0696e3 Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Fri, 11 Aug 2023 22:01:18 +0530 Subject: [PATCH 122/145] Adding support for extra GPIO chips in the common PDDF driver (#16082) --- .../pddf/i2c/modules/gpio/pddf_gpio_module.c | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/platform/pddf/i2c/modules/gpio/pddf_gpio_module.c b/platform/pddf/i2c/modules/gpio/pddf_gpio_module.c index 30eec5f185f4..3921fcdfb86a 100644 --- a/platform/pddf/i2c/modules/gpio/pddf_gpio_module.c +++ b/platform/pddf/i2c/modules/gpio/pddf_gpio_module.c @@ -16,6 +16,7 @@ * PDDF generic kernle module to create the I2C client for pca955x type of GPIO module */ +#define __STDC_WANT_LIB_EXT1__ 1 #include #include #include @@ -67,13 +68,19 @@ struct i2c_board_info *i2c_get_gpio_board_info(GPIO_DATA* mdata, NEW_DEV_ATTR *d if (strncmp(device_data->dev_type, "pca9554", strlen("pca9554")) == 0 || strncmp(device_data->dev_type, "pca9534", strlen("pca9534")) == 0 || - strncmp(device_data->dev_type, "pca9538", strlen("pca9538")) == 0) + strncmp(device_data->dev_type, "pca9538", strlen("pca9538")) == 0 || + strncmp(device_data->dev_type, "tca6408", strlen("tca6408")) == 0 || + strncmp(device_data->dev_type, "tca9554", strlen("tca9554")) == 0) def_num_gpios = 0x8; else if (strncmp(device_data->dev_type, "pca9555", strlen("pca9555")) == 0 || strncmp(device_data->dev_type, "pca9535", strlen("pca9535")) == 0 || strncmp(device_data->dev_type, "pca9539", strlen("pca9539")) == 0 || - strncmp(device_data->dev_type, "pca9575", strlen("pca9575")) == 0) + strncmp(device_data->dev_type, "pca9575", strlen("pca9575")) == 0 || + strncmp(device_data->dev_type, "tca6416", strlen("tca6416")) == 0 || + strncmp(device_data->dev_type, "tca9539", strlen("tca9539")) == 0) def_num_gpios = 0x10; + else if (strncmp(device_data->dev_type, "tca6424", strlen("tca6424")) == 0) + def_num_gpios = 0x18; else if (strncmp(device_data->dev_type, "pca9698", strlen("pca9698")) == 0 || strncmp(device_data->dev_type, "pca9505", strlen("pca9505")) == 0) def_num_gpios = 0x28; @@ -82,7 +89,7 @@ struct i2c_board_info *i2c_get_gpio_board_info(GPIO_DATA* mdata, NEW_DEV_ATTR *d printk(KERN_ERR "%s: Unknown type of gpio device\n", __FUNCTION__); return NULL; } - + if(mdata->gpio_base == 0) { base = base_gpio_num; base_gpio_num += def_num_gpios; @@ -127,7 +134,7 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * pddf_dbg(GPIO, KERN_ERR "Created %s client: 0x%p\n", device_ptr->i2c_name, (void *)client_ptr); add_device_table(device_ptr->i2c_name, (void*)client_ptr); } - else + else { kfree(board_info); goto free_data; @@ -158,9 +165,18 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * } free_data: + +#ifdef __STDC_LIB_EXT1__ + memset_s(gpio_ptr, sizeof(GPIO_DATA), 0, sizeof(GPIO_DATA)); +#else memset(gpio_ptr, 0, sizeof(GPIO_DATA)); +#endif /*TODO: free the device_ptr->data is dynamically allocated*/ +#ifdef __STDC_LIB_EXT1__ + memset_s(device_ptr, sizeof(NEW_DEV_ATTR), 0 , sizeof(NEW_DEV_ATTR)); +#else memset(device_ptr, 0 , sizeof(NEW_DEV_ATTR)); +#endif return count; } @@ -177,14 +193,14 @@ int __init gpio_data_init(void) pddf_dbg(GPIO, "GPIO_DATA MODULE.. init\n"); device_kobj = get_device_i2c_kobj(); - if(!device_kobj) + if(!device_kobj) return -ENOMEM; gpio_kobj = kobject_create_and_add("gpio", device_kobj); - if(!gpio_kobj) + if(!gpio_kobj) return -ENOMEM; - - + + ret = sysfs_create_group(gpio_kobj, &pddf_clients_data_group); if (ret) { From d50ae1fd09c9e1f2f4b736c4e947c1d8e08ac188 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Fri, 11 Aug 2023 11:51:25 -0700 Subject: [PATCH 123/145] [arista]: Always set sai_tunnel_support on Arista-7260cx3 (#16097) Why I did it To overwrite the default DSCP_TO_TC_MAP for tunnel traffic, the attribute sai_tunnel_support must be set to 1. Before this change, the attribute is set only on dual-tor platform when remap is enabled. This PR is to set the attribute on all Arista-7260cx3 devices. Work item tracking Microsoft ADO 24785776 How I did it Update the config.bcm template for Arista-7260cx3 devices. How to verify it The change is verified by manually rendering the j2 on a T1 testbed. --- .../x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 | 4 ++-- .../Arista-7260CX3-D108C10/config.bcm.j2 | 4 ++-- .../Arista-7260CX3-D108C8/config.bcm.j2 | 4 ++-- .../x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 | 4 ++-- src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 | 4 ++-- .../tests/sample_output/py3/arista7260-t1.config.bcm | 1 + 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 index 97040d332ced..ee67a684bf77 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 @@ -14,8 +14,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = -'sai_tunnel_support=1 -sai_tunnel_underlay_route_mode=1 +'sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} @@ -1049,5 +1048,6 @@ serdes_preemphasis_116=0x103706 serdes_preemphasis_117=0x133c06 {{ mmu_sock }} +sai_tunnel_support=1 {{ IPinIP_sock }} phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C10/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C10/config.bcm.j2 index 019f556edb8f..9ba820196e68 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C10/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C10/config.bcm.j2 @@ -6,8 +6,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = -'sai_tunnel_support=1 -sai_tunnel_underlay_route_mode=1 +'sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} @@ -956,5 +955,6 @@ serdes_preemphasis_130=0x580c serdes_preemphasis_131=0x580c mmu_init_config="MSFT-TH2-Tier0" +sai_tunnel_support=1 {{ IPinIP_sock }} phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 index 1efa8ef69567..70403df33967 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 @@ -6,8 +6,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = -'sai_tunnel_support=1 -sai_tunnel_underlay_route_mode=1 +'sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} @@ -960,5 +959,6 @@ serdes_preemphasis_130=0x580c serdes_preemphasis_131=0x580c mmu_init_config="MSFT-TH2-Tier0" +sai_tunnel_support=1 {{ IPinIP_sock }} phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 index de7cac15435a..464796bf4d72 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 @@ -14,8 +14,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = -'sai_tunnel_support=1 -sai_tunnel_underlay_route_mode=1 +'sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} @@ -1048,5 +1047,6 @@ serdes_preemphasis_116=0x105004 serdes_preemphasis_117=0x105004 {{ mmu_sock }} +sai_tunnel_support=1 {{ IPinIP_sock }} phy_an_lt_msft=1 diff --git a/src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 b/src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 index 61aeb0eff901..8a10ddb91936 100644 --- a/src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 +++ b/src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 @@ -14,8 +14,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = -'sai_tunnel_support=1 -sai_tunnel_underlay_route_mode=1 +'sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} @@ -33,5 +32,6 @@ sai_pfc_dlr_init_capability=1' -%} l3_alpm_hit_skip=1 {{ map_prio }} {{ mmu_sock }} +sai_tunnel_support=1 {{ IPinIP_sock }} {{ pfcwd_sock }} diff --git a/src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm b/src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm index a76c2173f436..c3323f545aa4 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm +++ b/src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm @@ -2,6 +2,7 @@ l3_alpm_hit_skip=1 mmu_init_config="MSFT-TH2-Tier1" +sai_tunnel_support=1 hybrid_pfc_deadlock_enable=1 pfc_deadlock_seq_control=1 From 055fe90d3f2c9708371ff8e118e16057ea30b417 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sat, 12 Aug 2023 02:52:24 +0800 Subject: [PATCH 124/145] [build]: Remove uselses proto package (#16093) Why I did it The protoc-dev isn't used by SONiC, but it was added to the derived package. Work item tracking Microsoft ADO (number only): 17417902 How I did it Remove protoc-dev from protobuf.mk Signed-off-by: Ze Gan --- rules/protobuf.mk | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rules/protobuf.mk b/rules/protobuf.mk index f21d538e2bf1..5e50eac86292 100644 --- a/rules/protobuf.mk +++ b/rules/protobuf.mk @@ -17,10 +17,6 @@ $(eval $(call add_derived_package,$(PROTOBUF),$(PROTOBUF_DEV))) PROTOBUF_LITE = libprotobuf-lite32_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(PROTOBUF),$(PROTOBUF_LITE))) -PROTOC_DEV = libprotoc-dev_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb -$(PROTOC_DEV)_RDEPENDS = $(PROTOBUF) $(PROTOBUF_LITE) -$(eval $(call add_derived_package,$(PROTOBUF),$(PROTOC_DEV))) - PROTOC32 = libprotoc32_$(PROTOBUF_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(PROTOC32)_RDEPENDS = $(PROTOBUF) $(PROTOBUF_LITE) $(eval $(call add_derived_package,$(PROTOBUF),$(PROTOC32))) From 388f5c51fe384973a744490b5fdfe5716a6e545d Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 12 Aug 2023 14:32:27 +0800 Subject: [PATCH 125/145] [submodule] Update submodule sonic-sairedis to the latest HEAD automatically (#16004) #### Why I did it src/sonic-sairedis ``` * eb24302 - (HEAD -> master, origin/master, origin/HEAD) Build both the regular and RPC version when the RPC profile is enabled (#1273) (28 hours ago) [Saikrishna Arcot] * 9e855c2 - [FEC] Adding support for vs testing for SAI_PORT_ATTR_AUTO_NEG_FEC_MODE_OVERRIDE (#1271) (2 days ago) [Sudharsan Dhamal Gopalarathnam] * 4dbdb21 - Fix RPC package build failure due to shell syntax issue (#1268) (10 days ago) [Saikrishna Arcot] * 588d596 - Make sure new binaries replace existing binaries in docker-sonic-vs (#1269) (11 days ago) [Saikrishna Arcot] * ce8f642 - [vs] Use boost join to concatenate switch types in config (#1266) (3 weeks ago) [Kamil Cudnik] * d6055a2 - [vslib]: Temporaily map DPU switch type to NVDA_MBF2H536C (#1259) (4 weeks ago) [prabhataravind] * e1cdb4d - [CodeQL]: Use dependencies with relevant versions in azp template. (#1262) (5 weeks ago) [Nazarii Hnydyn] * c08f9a2 - [CI]: Fix collect log error in azp template. (#1260) (5 weeks ago) [Nazarii Hnydyn] * eed856c - [CodeQL]: Fix syncd compilation in azp template. (#1261) (5 weeks ago) [Nazarii Hnydyn] * a3f1f1a - Reland 'Make changes to building and packaging sairedis (#1116)' (#1194) (6 weeks ago) [Saikrishna Arcot] ``` #### How I did it #### How to verify it #### Description for the changelog From ae48f7db6b1444c3d42f96af1467b3e50cb47fa6 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sat, 12 Aug 2023 14:42:38 +0800 Subject: [PATCH 126/145] [submodule] Update submodule linkmgrd to the latest HEAD automatically (#16121) --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index aa902a3a3ab3..b0adf57655eb 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit aa902a3a3ab346b879f9529b8fed6b5181ba057f +Subproject commit b0adf57655eb1e72316c6f90fe0a2d072322f473 From 2547968d3c3e443f85aa13966317af585fffc063 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sun, 13 Aug 2023 14:54:22 +0800 Subject: [PATCH 127/145] [submodule] Update submodule sonic-swss to the latest HEAD automatically (#16080) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 23cb2e50a23b..72516235b180 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 23cb2e50a23b8aa110208d669eb9b35ea7a448b6 +Subproject commit 72516235b180728389ed3b9bb9e18e9c67c5a283 From 34bad344955541fe560946a545af793172b7451a Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Sun, 13 Aug 2023 14:59:45 +0800 Subject: [PATCH 128/145] [submodule] Update submodule sonic-platform-common to the latest HEAD automatically (#16122) --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index ab70e6615ab7..ae7049cd0ac9 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit ab70e6615ab72f4d5ca1679224753f000bcf2792 +Subproject commit ae7049cd0ac917c7f19f82fa3a5fb1fc231eefbb From ab7c4ee66191ec260aede972074b5d13263ae0c2 Mon Sep 17 00:00:00 2001 From: Zhijian Li Date: Mon, 14 Aug 2023 12:33:19 +0800 Subject: [PATCH 129/145] [Celestica-E1031] Enable CPU watchdog (#16083) Enable CPU watchdog on Celestica-E1031. --- .../platform-modules-haliburton.install | 2 + .../platform-modules-haliburton.postinst | 5 +- .../haliburton/script/cpu_wdt | 89 +++++++++++++++++++ .../haliburton/systemd/cpu_wdt.service | 10 +++ 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 platform/broadcom/sonic-platform-modules-cel/haliburton/script/cpu_wdt create mode 100644 platform/broadcom/sonic-platform-modules-cel/haliburton/systemd/cpu_wdt.service diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install index 6c58afe6d55e..c3d598623ed5 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install @@ -1,5 +1,6 @@ haliburton/cfg/haliburton-modules.conf etc/modules-load.d haliburton/systemd/platform-modules-haliburton.service lib/systemd/system +haliburton/systemd/cpu_wdt.service lib/systemd/system haliburton/script/fancontrol.sh etc/init.d haliburton/script/fancontrol.service lib/systemd/system services/fancontrol/fancontrol usr/local/bin @@ -8,4 +9,5 @@ services/platform_api/platform_api_mgnt.sh usr/local/bin haliburton/script/popmsg.sh usr/local/bin haliburton/script/udev_prefix.sh usr/local/bin haliburton/script/reload_udev.sh usr/local/bin +haliburton/script/cpu_wdt usr/local/bin haliburton/script/50-ttyUSB-C0.rules etc/udev/rules.d diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst index 57ac1be34152..d427f17579f3 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst @@ -3,6 +3,7 @@ depmod -a sudo chmod +x /usr/local/bin/udev_prefix.sh sudo chmod +x /usr/local/bin/popmsg.sh sudo chmod +x /usr/local/bin/reload_udev.sh +sudo chmod +x /usr/local/bin/cpu_wdt /usr/local/bin/platform_api_mgnt.sh install /etc/init.d/fancontrol.sh install @@ -10,6 +11,8 @@ sudo chmod +x /usr/local/bin/reload_udev.sh systemctl enable platform-modules-haliburton.service systemctl enable fancontrol.service +systemctl enable cpu_wdt.service systemctl start platform-modules-haliburton.service -systemctl start fancontrol.service \ No newline at end of file +systemctl start fancontrol.service +systemctl start cpu_wdt.service diff --git a/platform/broadcom/sonic-platform-modules-cel/haliburton/script/cpu_wdt b/platform/broadcom/sonic-platform-modules-cel/haliburton/script/cpu_wdt new file mode 100644 index 000000000000..8eed59013b7d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/haliburton/script/cpu_wdt @@ -0,0 +1,89 @@ +#!/bin/bash + +SYSLOG_IDENTIFIER="cpu_wdt" +CPUWDT_MAIN_TASK_RUNNING_FLAG=true +TIMEOUT=180 +KEEPALIVE=60 + +function log_info() +{ + logger -p info -t ${SYSLOG_IDENTIFIER} "$@" +} + +function usage() +{ + echo "Usage: $0 ACTION [OPTIONS]..." + echo "" + echo "Actions:" + echo " start Start CPU WDT" + echo " stop Stop CPU WDT" + echo "" + echo "Options:" + echo " -h Show this help" + echo " -t WDT timeout period: {30|60|180}, default 180" + echo " -k WDT keep alive period, {1..(timeout-5)}, default 60" + exit 1 +} + +function validate_action() +{ + if [[ "${ACTION}" != "start" && "${ACTION}" != "stop" ]]; then + echo -e "Invalid action: ${ACTION}\n" + usage + fi +} + +function validate_options() +{ + if [[ ${TIMEOUT} != "30" && ${TIMEOUT} != "60" && ${TIMEOUT} != "180" ]]; then + echo -e "Invalid timeout value: ${TIMEOUT}\n" + usage + fi + if [[ ${KEEPALIVE} -le 0 || ${KEEPALIVE} -gt $((TIMEOUT - 5)) ]]; then + echo "Invalid keepalive value: ${KEEPALIVE}" + echo "" + usage + fi +} + +trap 'log_info "Caught SIGHUP - ignoring..."' SIGHUP +trap 'log_info "Caught SIGINT - exiting..."; CPUWDT_MAIN_TASK_RUNNING_FLAG=false' SIGINT +trap 'log_info "Caught SIGTERM - exiting..."; CPUWDT_MAIN_TASK_RUNNING_FLAG=false' SIGTERM + +ACTION=$1 +shift +validate_action + +while getopts "t:k:" OPTION; do + case $OPTION in + t) + TIMEOUT=${OPTARG} + ;; + k) + KEEPALIVE=${OPTARG} + ;; + *) + usage + esac +done + +validate_options + +if [[ "${ACTION}" == "start" ]]; then + # enable + log_info "Enable CPU WDT.." + watchdogutil arm -s "${TIMEOUT}" > /dev/null + log_info "CPU WDT has been enabled with $TIMEOUT seconds timeout" + + # keep alive + log_info "Enable keep alive messaging every $KEEPALIVE seconds" + while [[ ${CPUWDT_MAIN_TASK_RUNNING_FLAG} == "true" ]]; do + watchdogutil arm -s "${TIMEOUT}" > /dev/null + sleep "${KEEPALIVE}" + done + log_info "Keep alive messaging has been disabled" +fi + +log_info "Disable CPU WDT.." +watchdogutil disarm +log_info "CPU WDT has been disabled!" diff --git a/platform/broadcom/sonic-platform-modules-cel/haliburton/systemd/cpu_wdt.service b/platform/broadcom/sonic-platform-modules-cel/haliburton/systemd/cpu_wdt.service new file mode 100644 index 000000000000..51cc537c20b9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/haliburton/systemd/cpu_wdt.service @@ -0,0 +1,10 @@ +[Unit] +Description=CPU WDT +After=platform-modules-haliburton.service +Requires=platform-modules-haliburton.service + +[Service] +ExecStart=-/usr/local/bin/cpu_wdt start + +[Install] +WantedBy=multi-user.target From 7bea886f1d5a15c68e34c12195c927ed42fdf92e Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Mon, 14 Aug 2023 18:32:40 +0800 Subject: [PATCH 130/145] [submodule] Update submodule sonic-utilities to the latest HEAD automatically (#16123) #### Why I did it src/sonic-utilities ``` * 5b492d54 - (HEAD -> master, origin/master, origin/HEAD) [chassis][voq] clear: Fix clear queuecounters to also clear VOQ counters (#2878) (2 days ago) [Patrick MacArthur] ``` #### How I did it #### How to verify it #### Description for the changelog --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index cf346a310a3a..5b492d546ef8 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit cf346a310a3a8981905d57f31987a6c8d9aa5085 +Subproject commit 5b492d546ef8a76cd90c4d15f645df1c730184ae From dfe5ea6e5235cfafe179901a8872b26e6cbf78c3 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 14 Aug 2023 10:00:30 -0700 Subject: [PATCH 131/145] Fix the clean target reporting "Is a directory" error (#16029) ### Why I did it Since directories are being removed, the `-r` flag is required. Fixes #15922 ##### Work item tracking - Microsoft ADO **(number only)**: 24752770 --- slave.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slave.mk b/slave.mk index 7603b5f8c453..2d5d8d840b37 100644 --- a/slave.mk +++ b/slave.mk @@ -1519,7 +1519,7 @@ SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ $(SONIC_SIMPLE_DOCKER_IMAGES) \ $(SONIC_INSTALLERS))) $(SONIC_CLEAN_TARGETS) :: $(TARGET_PATH)/%-clean : .platform - $(Q)rm -f $(TARGET_PATH)/$* target/versions/dockers/$(subst .gz,,$*) + $(Q)rm -rf $(TARGET_PATH)/$* target/versions/dockers/$(subst .gz,,$*) SONIC_CLEAN_STDEB_DEBS = $(addsuffix -clean,$(addprefix $(PYTHON_DEBS_PATH)/, \ $(SONIC_PYTHON_STDEB_DEBS))) From 1acafa48732c2f7f3c519e5b2ff51ee4eae6019f Mon Sep 17 00:00:00 2001 From: Nonodark Huang Date: Tue, 15 Aug 2023 06:56:03 +0800 Subject: [PATCH 132/145] [Ufispace][PDDF] Add PDDF support on S9110-32X, S8901-54XC, S7801-54XS and S6301-56ST (#16017) Why I did it Add PDDF support on following Ufispace platforms with Broadcom ASIC S9110-32X S8901-54XC S7801-54XS S6301-56ST How I did it Add PDDF configuration files, scripts and python files How to verify it Run pddf commands and show commands. Signed-off-by: nonodark --- .../UFISPACE-S6301-56ST/hwsku.json | 221 + .../UFISPACE-S6301-56ST/sai.profile | 1 + .../td3-x2-s6301-56st.config.bcm | 295 + .../custom_led.bin | Bin 0 -> 508 bytes .../x86_64-ufispace_s6301_56st-r0/default_sku | 1 + .../x86_64-ufispace_s6301_56st-r0/fancontrol | 10 + .../installer.conf | 4 + .../led_proc_init.soc | 4 + .../x86_64-ufispace_s6301_56st-r0/pcie.yaml | 178 + .../pddf/pd-plugin.json | 79 + .../pddf/pddf-device.json | 2277 +++++ .../pddf_support | 0 .../platform.json | 651 ++ .../platform_asic | 1 + .../platform_components.json | 10 + .../platform_env.conf | 2 + .../pmon_daemon_control.json | 9 + .../sensors.conf | 1 + .../system_health_monitoring_config.json | 15 + .../UFISPACE-S7801-54XS/hwsku.json | 166 + .../UFISPACE-S7801-54XS/sai.profile | 1 + .../td3-x5-s7801-54xs.config.bcm | 502 ++ .../custom_led.bin | Bin 0 -> 392 bytes .../x86_64-ufispace_s7801_54xs-r0/default_sku | 1 + .../x86_64-ufispace_s7801_54xs-r0/fancontrol | 10 + .../installer.conf | 4 + .../led_proc_init.soc | 3 + .../x86_64-ufispace_s7801_54xs-r0/pcie.yaml | 172 + .../pddf/pd-plugin.json | 97 + .../pddf/pddf-device.json | 7850 +++++++++++++++++ .../pddf_support | 0 .../platform.json | 691 ++ .../platform_asic | 1 + .../platform_components.json | 12 + .../platform_env.conf | 1 + .../pmon_daemon_control.json | 9 + .../sensors.conf | 1 + .../system_health_monitoring_config.json | 15 + .../UFISPACE-S8901-54XC/hwsku.json | 166 + .../UFISPACE-S8901-54XC/sai.profile | 1 + .../td3-x5-s8901-54xc.config.bcm | 502 ++ .../custom_led.bin | Bin 0 -> 392 bytes .../x86_64-ufispace_s8901_54xc-r0/default_sku | 1 + .../x86_64-ufispace_s8901_54xc-r0/fancontrol | 10 + .../installer.conf | 4 + .../led_proc_init.soc | 3 + .../x86_64-ufispace_s8901_54xc-r0/pcie.yaml | 172 + .../pddf/pd-plugin.json | 97 + .../pddf/pddf-device.json | 7850 +++++++++++++++++ .../pddf_support | 0 .../platform.json | 691 ++ .../platform_asic | 1 + .../platform_components.json | 12 + .../platform_env.conf | 1 + .../pmon_daemon_control.json | 9 + .../sensors.conf | 1 + .../system_health_monitoring_config.json | 15 + .../UFISPACE-S9110-32X/hwsku.json | 136 + .../UFISPACE-S9110-32X/sai.profile | 1 + .../td3-x7-s9110-32x.config.bcm | 671 ++ .../custom_led.bin | Bin 0 -> 640 bytes .../x86_64-ufispace_s9110_32x-r0/default_sku | 1 + .../x86_64-ufispace_s9110_32x-r0/fancontrol | 10 + .../installer.conf | 4 + .../led_proc_init.soc | 4 + .../x86_64-ufispace_s9110_32x-r0/pcie.yaml | 172 + .../pddf/pd-plugin.json | 85 + .../pddf/pddf-device-beta.json | 4629 ++++++++++ .../pddf/pddf-device-pvt.json | 4585 ++++++++++ .../pddf/pddf-device.json | 1 + .../x86_64-ufispace_s9110_32x-r0/pddf_support | 0 .../platform-beta.json | 596 ++ .../platform-pvt.json | 590 ++ .../platform.json | 1 + .../platform_asic | 1 + .../platform_components.json | 12 + .../platform_env.conf | 1 + .../pmon_daemon_control.json | 9 + .../x86_64-ufispace_s9110_32x-r0/sensors.conf | 1 + .../system_health_monitoring_config.json | 15 + platform/broadcom/one-image.mk | 6 +- .../broadcom/platform-modules-ufispace.mk | 23 + .../debian/changelog | 24 + .../debian/control | 17 +- .../debian/rules | 4 + ...sonic-platform-ufispace-s6301-56st.install | 1 + ...onic-platform-ufispace-s6301-56st.postinst | 3 + .../sonic-platform-ufispace-s6301-56st.prerm | 2 + ...sonic-platform-ufispace-s7801-54xs.install | 1 + ...onic-platform-ufispace-s7801-54xs.postinst | 3 + .../sonic-platform-ufispace-s7801-54xs.prerm | 2 + ...sonic-platform-ufispace-s8901-54xc.install | 1 + ...onic-platform-ufispace-s8901-54xc.postinst | 3 + .../sonic-platform-ufispace-s8901-54xc.prerm | 2 + .../sonic-platform-ufispace-s9110-32x.install | 1 + ...sonic-platform-ufispace-s9110-32x.postinst | 3 + .../sonic-platform-ufispace-s9110-32x.prerm | 2 + .../s6301-56st/modules/Makefile | 6 + .../modules/x86-64-ufispace-s6301-56st-lpc.c | 829 ++ .../x86-64-ufispace-s6301-56st-sys-eeprom.c | 273 + .../service/pddf-platform-init.service | 1 + .../s6301-56st/sonic_platform/__init__.py | 4 + .../s6301-56st/sonic_platform/chassis.py | 220 + .../s6301-56st/sonic_platform/component.py | 108 + .../s6301-56st/sonic_platform/eeprom.py | 21 + .../s6301-56st/sonic_platform/fan.py | 153 + .../s6301-56st/sonic_platform/fan_drawer.py | 17 + .../s6301-56st/sonic_platform/platform.py | 25 + .../s6301-56st/sonic_platform/psu.py | 67 + .../s6301-56st/sonic_platform/psu_fru.py | 52 + .../s6301-56st/sonic_platform/sfp.py | 40 + .../s6301-56st/sonic_platform/thermal.py | 17 + .../s6301-56st/sonic_platform/watchdog.py | 23 + .../s6301-56st/sonic_platform_setup.py | 27 + .../utils/pddf_post_device_create.sh | 11 + .../utils/pddf_post_driver_install.sh | 2 + .../utils/pddf_pre_driver_install.sh | 11 + .../s6301-56st/utils/pddf_switch_svc.py | 86 + .../s7801-54xs/modules/Makefile | 6 + .../modules/pddf_custom_sysstatus_module.c | 276 + .../modules/x86-64-ufispace-s7801-54xs-cpld.c | 1512 ++++ .../modules/x86-64-ufispace-s7801-54xs-cpld.h | 269 + .../modules/x86-64-ufispace-s7801-54xs-lpc.c | 883 ++ .../x86-64-ufispace-s7801-54xs-sys-eeprom.c | 272 + .../service/pddf-platform-init.service | 1 + .../s7801-54xs/sonic_platform/__init__.py | 4 + .../s7801-54xs/sonic_platform/chassis.py | 193 + .../s7801-54xs/sonic_platform/component.py | 125 + .../s7801-54xs/sonic_platform/eeprom.py | 21 + .../s7801-54xs/sonic_platform/fan.py | 158 + .../s7801-54xs/sonic_platform/fan_drawer.py | 17 + .../s7801-54xs/sonic_platform/platform.py | 25 + .../s7801-54xs/sonic_platform/psu.py | 38 + .../s7801-54xs/sonic_platform/sfp.py | 49 + .../s7801-54xs/sonic_platform/thermal.py | 17 + .../s7801-54xs/sonic_platform_setup.py | 27 + .../utils/pddf_post_device_create.sh | 16 + .../utils/pddf_post_driver_install.sh | 2 + .../utils/pddf_pre_driver_install.sh | 8 + .../s7801-54xs/utils/pddf_switch_svc.py | 50 + .../s7801-54xs/utils/pre_pddf_init.sh | 5 + .../s8901-54xc/modules/Makefile | 6 + .../modules/pddf_custom_sysstatus_module.c | 276 + .../modules/x86-64-ufispace-s8901-54xc-cpld.c | 1512 ++++ .../modules/x86-64-ufispace-s8901-54xc-cpld.h | 269 + .../modules/x86-64-ufispace-s8901-54xc-lpc.c | 883 ++ .../x86-64-ufispace-s8901-54xc-sys-eeprom.c | 272 + .../service/pddf-platform-init.service | 1 + .../s8901-54xc/sonic_platform/__init__.py | 4 + .../s8901-54xc/sonic_platform/chassis.py | 193 + .../s8901-54xc/sonic_platform/component.py | 125 + .../s8901-54xc/sonic_platform/eeprom.py | 21 + .../s8901-54xc/sonic_platform/fan.py | 158 + .../s8901-54xc/sonic_platform/fan_drawer.py | 17 + .../s8901-54xc/sonic_platform/platform.py | 25 + .../s8901-54xc/sonic_platform/psu.py | 38 + .../s8901-54xc/sonic_platform/sfp.py | 49 + .../s8901-54xc/sonic_platform/thermal.py | 17 + .../s8901-54xc/sonic_platform_setup.py | 27 + .../utils/pddf_post_device_create.sh | 16 + .../utils/pddf_post_driver_install.sh | 2 + .../utils/pddf_pre_driver_install.sh | 8 + .../s8901-54xc/utils/pddf_switch_svc.py | 50 + .../s8901-54xc/utils/pre_pddf_init.sh | 5 + .../s9110-32x/modules/Makefile | 6 + .../modules/pddf_custom_sysstatus_module.c | 274 + .../modules/x86-64-ufispace-s9110-32x-cpld.c | 1475 ++++ .../modules/x86-64-ufispace-s9110-32x-cpld.h | 149 + .../modules/x86-64-ufispace-s9110-32x-lpc.c | 981 ++ .../x86-64-ufispace-s9110-32x-sys-eeprom.c | 272 + .../service/pddf-platform-init.service | 1 + .../s9110-32x/sonic_platform/__init__.py | 4 + .../s9110-32x/sonic_platform/chassis.py | 191 + .../s9110-32x/sonic_platform/component.py | 125 + .../s9110-32x/sonic_platform/eeprom.py | 21 + .../s9110-32x/sonic_platform/fan.py | 147 + .../s9110-32x/sonic_platform/fan_drawer.py | 17 + .../s9110-32x/sonic_platform/platform.py | 25 + .../s9110-32x/sonic_platform/psu.py | 38 + .../s9110-32x/sonic_platform/sfp.py | 31 + .../s9110-32x/sonic_platform/thermal.py | 17 + .../s9110-32x/sonic_platform_setup.py | 27 + .../utils/pddf_post_device_create.sh | 14 + .../utils/pddf_post_driver_install.sh | 2 + .../s9110-32x/utils/pddf_pre_device_create.sh | 74 + .../utils/pddf_pre_driver_install.sh | 11 + .../s9110-32x/utils/pddf_switch_svc.py | 86 + 187 files changed, 48381 insertions(+), 2 deletions(-) create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/hwsku.json create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/sai.profile create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/td3-x2-s6301-56st.config.bcm create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/custom_led.bin create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/default_sku create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/fancontrol create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/installer.conf create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/led_proc_init.soc create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/pcie.yaml create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/pddf/pd-plugin.json create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/pddf/pddf-device.json create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/pddf_support create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/platform.json create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/platform_asic create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/platform_components.json create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/platform_env.conf create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/pmon_daemon_control.json create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/sensors.conf create mode 100644 device/ufispace/x86_64-ufispace_s6301_56st-r0/system_health_monitoring_config.json create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/UFISPACE-S7801-54XS/hwsku.json create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/UFISPACE-S7801-54XS/sai.profile create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/UFISPACE-S7801-54XS/td3-x5-s7801-54xs.config.bcm create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/custom_led.bin create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/default_sku create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/fancontrol create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/installer.conf create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/led_proc_init.soc create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/pcie.yaml create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/pddf/pd-plugin.json create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/pddf/pddf-device.json create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/pddf_support create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform.json create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_asic create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_components.json create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_env.conf create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/pmon_daemon_control.json create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/sensors.conf create mode 100644 device/ufispace/x86_64-ufispace_s7801_54xs-r0/system_health_monitoring_config.json create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/hwsku.json create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/sai.profile create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/td3-x5-s8901-54xc.config.bcm create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/custom_led.bin create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/default_sku create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/fancontrol create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/installer.conf create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/led_proc_init.soc create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/pcie.yaml create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/pddf/pd-plugin.json create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/pddf/pddf-device.json create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/pddf_support create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform.json create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_asic create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_components.json create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_env.conf create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/pmon_daemon_control.json create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/sensors.conf create mode 100644 device/ufispace/x86_64-ufispace_s8901_54xc-r0/system_health_monitoring_config.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/hwsku.json create mode 100755 device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/sai.profile create mode 100755 device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/td3-x7-s9110-32x.config.bcm create mode 100755 device/ufispace/x86_64-ufispace_s9110_32x-r0/custom_led.bin create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/default_sku create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/fancontrol create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/installer.conf create mode 100755 device/ufispace/x86_64-ufispace_s9110_32x-r0/led_proc_init.soc create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/pcie.yaml create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pd-plugin.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device-beta.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device-pvt.json create mode 120000 device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf_support create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-beta.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-pvt.json create mode 120000 device/ufispace/x86_64-ufispace_s9110_32x-r0/platform.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_asic create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_components.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_env.conf create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/pmon_daemon_control.json create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/sensors.conf create mode 100644 device/ufispace/x86_64-ufispace_s9110_32x-r0/system_health_monitoring_config.json create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.install create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.postinst create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.prerm create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.install create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.postinst create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.prerm create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.install create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.postinst create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.prerm create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.install create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.postinst create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.prerm create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-lpc.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-sys-eeprom.c create mode 120000 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/service/pddf-platform-init.service create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/platform.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu_fru.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/sfp.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/watchdog.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform_setup.py create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_device_create.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_driver_install.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_pre_driver_install.sh create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_switch_svc.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/pddf_custom_sysstatus_module.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.h create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-lpc.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-sys-eeprom.c create mode 120000 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/service/pddf-platform-init.service create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/platform.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/sfp.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform_setup.py create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_device_create.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_driver_install.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_pre_driver_install.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_switch_svc.py create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pre_pddf_init.sh create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/pddf_custom_sysstatus_module.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.h create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-lpc.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-sys-eeprom.c create mode 120000 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/service/pddf-platform-init.service create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/platform.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/sfp.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform_setup.py create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_device_create.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_driver_install.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_pre_driver_install.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_switch_svc.py create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pre_pddf_init.sh create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/pddf_custom_sysstatus_module.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.h create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-lpc.c create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-sys-eeprom.c create mode 120000 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/service/pddf-platform-init.service create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/platform.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/sfp.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform_setup.py create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_device_create.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_driver_install.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_device_create.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_driver_install.sh create mode 100755 platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_switch_svc.py diff --git a/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/hwsku.json b/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/hwsku.json new file mode 100644 index 000000000000..4f341c2eddce --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/hwsku.json @@ -0,0 +1,221 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet1": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet2": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet3": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet4": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet5": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet6": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet7": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet8": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet9": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet10": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet11": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet12": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet13": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet14": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet15": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet16": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet17": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet18": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet19": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet20": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet21": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet22": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet23": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet24": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet25": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet26": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet27": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet28": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet29": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet30": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet31": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet32": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet33": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet34": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet35": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet36": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet37": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet38": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet39": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet40": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet41": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet42": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet43": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet44": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet45": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet46": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet47": { + "default_brkout_mode": "1x1G", + "autoneg": "on" + }, + "Ethernet48": { + "default_brkout_mode": "1x10G" + }, + "Ethernet49": { + "default_brkout_mode": "1x10G" + }, + "Ethernet50": { + "default_brkout_mode": "1x10G" + }, + "Ethernet51": { + "default_brkout_mode": "1x10G" + }, + "Ethernet52": { + "default_brkout_mode": "1x10G" + }, + "Ethernet53": { + "default_brkout_mode": "1x10G" + }, + "Ethernet54": { + "default_brkout_mode": "1x10G" + }, + "Ethernet55": { + "default_brkout_mode": "1x10G" + } + } +} + diff --git a/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/sai.profile b/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/sai.profile new file mode 100644 index 000000000000..33b427a78fce --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-x2-s6301-56st.config.bcm diff --git a/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/td3-x2-s6301-56st.config.bcm b/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/td3-x2-s6301-56st.config.bcm new file mode 100644 index 000000000000..7bf91509ca39 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s6301_56st-r0/UFISPACE-S6301-56ST/td3-x2-s6301-56st.config.bcm @@ -0,0 +1,295 @@ +# r2, 20230713 + +sram_scan_enable=0 +stable_size=0x5500000 +tdma_timeout_usec=15000000 +tslam_timeout_usec=15000000 +sai_mdio_access_clause22=1 +sai_verify_incoming_chksum=0 +robust_hash_disable_egress_vlan=1 +robust_hash_disable_mpls=1 +robust_hash_disable_vlan=1 +port_flex_enable=1 +arl_clean_timeout_usec=15000000 +asf_mem_profile=0 +bcm_num_cos=9 +bcm_stat_flags=1 +bcm_stat_jumbo=9236 +cdma_timeout_usec=15000000 +disable_pcie_firmware_check=1 +dma_desc_timeout_usec=15000000 +fpem_mem_entries=0 +higig2_hdr_mode=1 +ifp_inports_support_enable=1 +ipv6_lpm_128b_enable=1 +l2xmsg_mode=1 +l2_mem_entries=65536 +l3_mem_entries=32768 +max_vp_lags=0 +mem_scan_enable=1 +miim_intr_enable=0 +module_64ports=1 +multicast_l2_range=4095 +multicast_l3_range=0 +os=unix + +# global setting + +pbmp_xport_xe=0x1fe00000000000000 +pbmp_xport_ge=0x00001fffffffffffe + +phy_chain_tx_lane_map_physical{25}=0x2310 +phy_chain_rx_lane_map_physical{25}=0x2310 + +phy_chain_tx_lane_map_physical{41}=0x3102 +phy_chain_rx_lane_map_physical{41}=0x3102 + +port_gmii_mode_25=1 +port_gmii_mode_26=1 +port_gmii_mode_27=1 +port_gmii_mode_28=1 +port_gmii_mode_29=1 +port_gmii_mode_30=1 +port_gmii_mode_31=1 +port_gmii_mode_32=1 + +port_gmii_mode_33=1 +port_gmii_mode_34=1 +port_gmii_mode_35=1 +port_gmii_mode_36=1 +port_gmii_mode_37=1 +port_gmii_mode_38=1 +port_gmii_mode_39=1 +port_gmii_mode_40=1 + +port_gmii_mode_41=1 +port_gmii_mode_42=1 +port_gmii_mode_43=1 +port_gmii_mode_44=1 +port_gmii_mode_45=1 +port_gmii_mode_46=1 +port_gmii_mode_47=1 +port_gmii_mode_48=1 + +# GPHY0 +portmap_1=1:1 +portmap_2=2:1 +portmap_3=3:1 +portmap_4=4:1 + +# GPHY1 +portmap_5=5:1 +portmap_6=6:1 +portmap_7=7:1 +portmap_8=8:1 + +# GPHY2 +portmap_9=9:1 +portmap_10=10:1 +portmap_11=11:1 +portmap_12=12:1 + +# GPHY3 +portmap_13=13:1 +portmap_14=14:1 +portmap_15=15:1 +portmap_16=16:1 + +# GPHY4 +portmap_17=17:1 +portmap_18=18:1 +portmap_19=19:1 +portmap_20=20:1 + +# GPHY5 +portmap_21=21:1 +portmap_22=22:1 +portmap_23=23:1 +portmap_24=24:1 + +phy_port_primary_and_offset_1.0=0x0100 +phy_port_primary_and_offset_2.0=0x0101 +phy_port_primary_and_offset_3.0=0x0102 +phy_port_primary_and_offset_4.0=0x0103 +phy_port_primary_and_offset_5.0=0x0104 +phy_port_primary_and_offset_6.0=0x0105 +phy_port_primary_and_offset_7.0=0x0106 +phy_port_primary_and_offset_8.0=0x0107 + +phy_port_primary_and_offset_9.0=0x0900 +phy_port_primary_and_offset_10.0=0x0901 +phy_port_primary_and_offset_11.0=0x0902 +phy_port_primary_and_offset_12.0=0x0903 +phy_port_primary_and_offset_13.0=0x0904 +phy_port_primary_and_offset_14.0=0x0905 +phy_port_primary_and_offset_15.0=0x0906 +phy_port_primary_and_offset_16.0=0x0907 + +phy_port_primary_and_offset_17.0=0x1100 +phy_port_primary_and_offset_18.0=0x1101 +phy_port_primary_and_offset_19.0=0x1102 +phy_port_primary_and_offset_20.0=0x1103 +phy_port_primary_and_offset_21.0=0x1104 +phy_port_primary_and_offset_22.0=0x1105 +phy_port_primary_and_offset_23.0=0x1106 +phy_port_primary_and_offset_24.0=0x1107 + +# Comment out configuration on PHY ports + +# MCQ 0 - QSGMII +portmap_25=25:1 +portmap_26=26:1 +portmap_27=27:1 +portmap_28=28:1 +portmap_29=29:1 +portmap_30=30:1 +portmap_31=31:1 +portmap_32=32:1 + +# 54182_1 PHY ADDR 0x1-0x8 +port_phy_addr_25=0x01 +port_phy_addr_26=0x02 +port_phy_addr_27=0x03 +port_phy_addr_28=0x04 +port_phy_addr_29=0x05 +port_phy_addr_30=0x06 +port_phy_addr_31=0x07 +port_phy_addr_32=0x08 +phy_port_primary_and_offset_25.0=0x1900 +phy_port_primary_and_offset_26.0=0x1901 +phy_port_primary_and_offset_27.0=0x1902 +phy_port_primary_and_offset_28.0=0x1903 +phy_port_primary_and_offset_29.0=0x1904 +phy_port_primary_and_offset_30.0=0x1905 +phy_port_primary_and_offset_31.0=0x1906 +phy_port_primary_and_offset_32.0=0x1907 + +# MCQ 1 - QSGMII +portmap_33=33:1 +portmap_34=34:1 +portmap_35=35:1 +portmap_36=36:1 +portmap_37=37:1 +portmap_38=38:1 +portmap_39=39:1 +portmap_40=40:1 + +# 54182_2 PHY ADDR 0x21-0x28 +port_phy_addr_33=0x21 +port_phy_addr_34=0x22 +port_phy_addr_35=0x23 +port_phy_addr_36=0x24 +port_phy_addr_37=0x25 +port_phy_addr_38=0x26 +port_phy_addr_39=0x27 +port_phy_addr_40=0x28 + +phy_port_primary_and_offset_33.0=0x2100 +phy_port_primary_and_offset_34.0=0x2101 +phy_port_primary_and_offset_35.0=0x2102 +phy_port_primary_and_offset_36.0=0x2103 +phy_port_primary_and_offset_37.0=0x2104 +phy_port_primary_and_offset_38.0=0x2105 +phy_port_primary_and_offset_39.0=0x2106 +phy_port_primary_and_offset_40.0=0x2107 + +# MCQ2-2L 50182 +portmap_41=41:1 +portmap_42=42:1 +portmap_43=43:1 +portmap_44=44:1 +portmap_45=45:1 +portmap_46=46:1 +portmap_47=47:1 +portmap_48=48:1 + +# 54182_3 PHY ADDR 0x41-0x48 +port_phy_addr_41=0x41 +port_phy_addr_42=0x42 +port_phy_addr_43=0x43 +port_phy_addr_44=0x44 +port_phy_addr_45=0x45 +port_phy_addr_46=0x46 +port_phy_addr_47=0x47 +port_phy_addr_48=0x48 + +phy_port_primary_and_offset_41.0=0x2900 +phy_port_primary_and_offset_42.0=0x2901 +phy_port_primary_and_offset_43.0=0x2902 +phy_port_primary_and_offset_44.0=0x2903 +phy_port_primary_and_offset_45.0=0x2904 +phy_port_primary_and_offset_46.0=0x2905 +phy_port_primary_and_offset_47.0=0x2906 +phy_port_primary_and_offset_48.0=0x2907 + +# TSCF SFP +portmap_57=57:10 +portmap_58=58:10 +portmap_59=59:10 +portmap_60=60:10 + +portmap_61=61:10 +portmap_62=62:10 +portmap_63=63:10 +portmap_64=64:10 + + +dport_map_enable=1 + +dport_map_port_25=1 +dport_map_port_26=2 +dport_map_port_27=3 +dport_map_port_28=4 +dport_map_port_29=5 +dport_map_port_30=6 +dport_map_port_31=7 +dport_map_port_32=8 +dport_map_port_33=9 +dport_map_port_34=10 +dport_map_port_35=11 +dport_map_port_36=12 +dport_map_port_37=13 +dport_map_port_38=14 +dport_map_port_39=15 +dport_map_port_40=16 +dport_map_port_41=17 +dport_map_port_42=18 +dport_map_port_43=19 +dport_map_port_44=20 +dport_map_port_45=21 +dport_map_port_46=22 +dport_map_port_47=23 +dport_map_port_48=24 +dport_map_port_1=25 +dport_map_port_2=26 +dport_map_port_3=27 +dport_map_port_4=28 +dport_map_port_5=29 +dport_map_port_6=30 +dport_map_port_7=31 +dport_map_port_8=32 +dport_map_port_9=33 +dport_map_port_10=34 +dport_map_port_11=35 +dport_map_port_12=36 +dport_map_port_13=37 +dport_map_port_14=38 +dport_map_port_15=39 +dport_map_port_16=40 +dport_map_port_17=41 +dport_map_port_18=42 +dport_map_port_19=43 +dport_map_port_20=44 +dport_map_port_21=45 +dport_map_port_22=46 +dport_map_port_23=47 +dport_map_port_24=48 +dport_map_port_57=49 +dport_map_port_58=50 +dport_map_port_59=51 +dport_map_port_60=52 +dport_map_port_64=53 +dport_map_port_63=54 +dport_map_port_62=55 +dport_map_port_61=56 + diff --git a/device/ufispace/x86_64-ufispace_s6301_56st-r0/custom_led.bin b/device/ufispace/x86_64-ufispace_s6301_56st-r0/custom_led.bin new file mode 100644 index 0000000000000000000000000000000000000000..cb3a607afed6ff3e71a02cd9c8d2201734c8fd0f GIT binary patch literal 508 zcmW;Gy)OfC90u^;uXnwpN>9BNr}(v$7Hz#m)LS)t6B0`$h9ZvX2LA*mraB_QL~J5y z8a5VxL5T}uxx`?wH2wh|hR^UU&-0XT*J+s+X_m@2yM;aa37xSW^JSHVrWX!L6RC8b zBymKkG`DhO=eB~EMHcUPykLrXys}Ay8L7m?Jng9wn~9_nw!an2$2<4QnzLrI89q2R zd0kZd1FzercWpzhdp=kFHW!+cAr_TOJEnhagFNX9C#6bg_-k_6{FFH^F>AIg$wN-; z;gRd!q+8cUWW9bkkl-PXM=a7LEOK=R!~ue{^j_4G+K4u+C2~O?lS)rT9#u;< z&L(+`xRE7cD8|?4Us|B3k@?RbpFTs5Id4*7;x11obU{~CzSqYXOEAXbFaZ6~2Qi33 zFZ4hJx}gig5CQ?6&;jibgf`Hj6ONcmfHFX`q5M*rf0=P)+YHp`t{hvQAh6X)zO=%to=|kej&P%6}R5rOW2lIQx;11 z9wl^>T3`|<=q9~nMXR)>qqLjmY5tUVyf0l{Ha~@AKs$2h?$>WE;_z!}cbL<<+V#1*a) TWAz`+Z9Cky%WeDIcF1jiGL0/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU1-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU1-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x50", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x1", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x10", + "attr_cmpval":"0x10", + "attr_len":"1" + } + ] + } + }, + "PSU2": { + "dev_info": { + "device_type": "PSU", + "device_name": "PSU2", + "device_parent": "MUX1" + }, + "dev_attr": { + "dev_idx": "2", + "num_psu_fans": "1" + }, + "i2c": { + "interface": [ + { "itf":"eeprom", "dev":"PSU2-EEPROM" } + ] + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "psu_temp1_input", + "bmc_cmd": "ipmitool sdr -c get PSU1_TEMP1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_TEMP1", + "field_pos": "2", + "mult": "1000", + "separator": "," + }, + { + "attr_name": "psu_fan1_speed_rpm", + "bmc_cmd": "ipmitool sdr -c get PSU1_FAN1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_FAN1", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "psu_v_out", + "bmc_cmd": "ipmitool sdr -c get PSU1_VOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_VOUT", + "field_pos": "2", + "mult": "1000", + "separator": "," + }, + { + "attr_name": "psu_i_out", + "bmc_cmd": "ipmitool sdr -c get PSU1_IOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_IOUT", + "field_pos": "2", + "mult": "1000", + "separator": "," + }, + { + "attr_name": "psu_mfr_id", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU2-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU2-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x51", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x2", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x20", + "attr_cmpval":"0x20", + "attr_len":"1" + } + ] + } + }, + "FAN-CTRL": { + "dev_info": { + "device_type": "FAN", + "device_name": "FAN-CTRL", + "device_parent": "" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "fan1_present", + "bmc_cmd": "ipmitool sdr -c get FAN0_PRSNT_L", + "raw": "0", + "field_name": "FAN0_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan2_present", + "bmc_cmd": "ipmitool sdr -c get FAN1_PRSNT_L", + "raw": "0", + "field_name": "FAN1_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan3_present", + "bmc_cmd": "ipmitool sdr -c get FAN2_PRSNT_L", + "raw": "0", + "field_name": "FAN2_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan4_present", + "bmc_cmd": "ipmitool sdr -c get FAN3_PRSNT_L", + "raw": "0", + "field_name": "FAN3_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan5_present", + "bmc_cmd": "ipmitool sdr -c get FAN4_PRSNT_L", + "raw": "0", + "field_name": "FAN4_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan1_input", + "bmc_cmd": "ipmitool sdr -c get FAN0_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN0_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan2_input", + "bmc_cmd": "ipmitool sdr -c get FAN1_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN1_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan3_input", + "bmc_cmd": "ipmitool sdr -c get FAN2_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN2_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan4_input", + "bmc_cmd": "ipmitool sdr -c get FAN3_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN3_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan5_input", + "bmc_cmd": "ipmitool sdr -c get FAN4_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN4_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan1_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan2_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan3_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f3", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan4_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f4", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan5_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f5", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "SYNC_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "DIAG_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "off", + "bits": "3:2", + "descr": "Off", + "value": "0x1;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + } + ] + } + }, + "SYS_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "SYS_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "off", + "bits": "7:6", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + } + ] + } + }, + "FAN_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "FAN_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + } + ] + } + }, + "PSU1_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "PSU2_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "1", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "7", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "ID_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "LOC_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "blue", + "bits": "3:1", + "descr": "Blue", + "value": "0x04;0x05", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "blue_blink", + "bits": "3:1", + "descr": "Blue Blinking", + "value": "0x06;0x07", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "off", + "bits": "3:2", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + } + ] + } + }, + "PORT1": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT1", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "1" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT1-EEPROM" + }, + { + "itf": "control", + "dev": "PORT1-CTRL" + } + ] + } + }, + "PORT1-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1a", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT1-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT2": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT2", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "2" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT2-EEPROM" + }, + { + "itf": "control", + "dev": "PORT2-CTRL" + } + ] + } + }, + "PORT2-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1b", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT2-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT3": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT3", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "3" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT3-EEPROM" + }, + { + "itf": "control", + "dev": "PORT3-CTRL" + } + ] + } + }, + "PORT3-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1c", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT3-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT4": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT4", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "4" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT4-EEPROM" + }, + { + "itf": "control", + "dev": "PORT4-CTRL" + } + ] + } + }, + "PORT4-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1d", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT4-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT5": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT5", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "5" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT5-EEPROM" + }, + { + "itf": "control", + "dev": "PORT5-CTRL" + } + ] + } + }, + "PORT5-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1e", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT5-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT6": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT6", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "6" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT6-EEPROM" + }, + { + "itf": "control", + "dev": "PORT6-CTRL" + } + ] + } + }, + "PORT6-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1f", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT6-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT7": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT7", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "7" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT7-EEPROM" + }, + { + "itf": "control", + "dev": "PORT7-CTRL" + } + ] + } + }, + "PORT7-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT7-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT8": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT8", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "8" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT8-EEPROM" + }, + { + "itf": "control", + "dev": "PORT8-CTRL" + } + ] + } + }, + "PORT8-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT8-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT9": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT9", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "9" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT9-EEPROM" + }, + { + "itf": "control", + "dev": "PORT9-CTRL" + } + ] + } + }, + "PORT9-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT9-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT10": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT10", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "10" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT10-EEPROM" + }, + { + "itf": "control", + "dev": "PORT10-CTRL" + } + ] + } + }, + "PORT10-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT10-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT11": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT11", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "11" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT11-EEPROM" + }, + { + "itf": "control", + "dev": "PORT11-CTRL" + } + ] + } + }, + "PORT11-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT11-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT12": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT12", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "12" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT12-EEPROM" + }, + { + "itf": "control", + "dev": "PORT12-CTRL" + } + ] + } + }, + "PORT12-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT12-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT13": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT13", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "13" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT13-EEPROM" + }, + { + "itf": "control", + "dev": "PORT13-CTRL" + } + ] + } + }, + "PORT13-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT13-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT14": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT14", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "14" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT14-EEPROM" + }, + { + "itf": "control", + "dev": "PORT14-CTRL" + } + ] + } + }, + "PORT14-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT14-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT15": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT15", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "15" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT15-EEPROM" + }, + { + "itf": "control", + "dev": "PORT15-CTRL" + } + ] + } + }, + "PORT15-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT15-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT16": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT16", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "16" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT16-EEPROM" + }, + { + "itf": "control", + "dev": "PORT16-CTRL" + } + ] + } + }, + "PORT16-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT16-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT17": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT17", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "17" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT17-EEPROM" + }, + { + "itf": "control", + "dev": "PORT17-CTRL" + } + ] + } + }, + "PORT17-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2a", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT17-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT18": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT18", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "18" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT18-EEPROM" + }, + { + "itf": "control", + "dev": "PORT18-CTRL" + } + ] + } + }, + "PORT18-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2b", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT18-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT19": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT19", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "19" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT19-EEPROM" + }, + { + "itf": "control", + "dev": "PORT19-CTRL" + } + ] + } + }, + "PORT19-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2c", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT19-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT20": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT20", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "20" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT20-EEPROM" + }, + { + "itf": "control", + "dev": "PORT20-CTRL" + } + ] + } + }, + "PORT20-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2d", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT20-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT21": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT21", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "21" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT21-EEPROM" + }, + { + "itf": "control", + "dev": "PORT21-CTRL" + } + ] + } + }, + "PORT21-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2e", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT21-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT22": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT22", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "22" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT22-EEPROM" + }, + { + "itf": "control", + "dev": "PORT22-CTRL" + } + ] + } + }, + "PORT22-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2f", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT22-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT23": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT23", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "23" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT23-EEPROM" + }, + { + "itf": "control", + "dev": "PORT23-CTRL" + } + ] + } + }, + "PORT23-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT23-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT24": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT24", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "24" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT24-EEPROM" + }, + { + "itf": "control", + "dev": "PORT24-CTRL" + } + ] + } + }, + "PORT24-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT24-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT25": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT25", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "25" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT25-EEPROM" + }, + { + "itf": "control", + "dev": "PORT25-CTRL" + } + ] + } + }, + "PORT25-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x32", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT25-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x32", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT26": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT26", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "26" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT26-EEPROM" + }, + { + "itf": "control", + "dev": "PORT26-CTRL" + } + ] + } + }, + "PORT26-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT26-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT27": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT27", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "27" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT27-EEPROM" + }, + { + "itf": "control", + "dev": "PORT27-CTRL" + } + ] + } + }, + "PORT27-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x34", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT27-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x34", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT28": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT28", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "28" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT28-EEPROM" + }, + { + "itf": "control", + "dev": "PORT28-CTRL" + } + ] + } + }, + "PORT28-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x35", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT28-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x35", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT29": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT29", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "29" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT29-EEPROM" + }, + { + "itf": "control", + "dev": "PORT29-CTRL" + } + ] + } + }, + "PORT29-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x36", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT29-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x36", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT30": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT30", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "30" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT30-EEPROM" + }, + { + "itf": "control", + "dev": "PORT30-CTRL" + } + ] + } + }, + "PORT30-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x37", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT30-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x37", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT31": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT31", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "31" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT31-EEPROM" + }, + { + "itf": "control", + "dev": "PORT31-CTRL" + } + ] + } + }, + "PORT31-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x38", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT31-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x38", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT32": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT32", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "32" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT32-EEPROM" + }, + { + "itf": "control", + "dev": "PORT32-CTRL" + } + ] + } + }, + "PORT32-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x39", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT32-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x39", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT33": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT33", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "33" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT33-EEPROM" + }, + { + "itf": "control", + "dev": "PORT33-CTRL" + } + ] + } + }, + "PORT33-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT33-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3a", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT33-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT33-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT34": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT34", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "34" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT34-EEPROM" + }, + { + "itf": "control", + "dev": "PORT34-CTRL" + } + ] + } + }, + "PORT34-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT34-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT34" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3b", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT34-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT34-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT34" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT35": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT35", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "35" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT35-EEPROM" + }, + { + "itf": "control", + "dev": "PORT35-CTRL" + } + ] + } + }, + "PORT35-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT35-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT35" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3c", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT35-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT35-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT35" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT36": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT36", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "36" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT36-EEPROM" + }, + { + "itf": "control", + "dev": "PORT36-CTRL" + } + ] + } + }, + "PORT36-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT36-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT36" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3d", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT36-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT36-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT36" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT37": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT37", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "37" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT37-EEPROM" + }, + { + "itf": "control", + "dev": "PORT37-CTRL" + } + ] + } + }, + "PORT37-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT37-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT37" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3e", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT37-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT37-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT37" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT38": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT38", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "38" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT38-EEPROM" + }, + { + "itf": "control", + "dev": "PORT38-CTRL" + } + ] + } + }, + "PORT38-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT38-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT38" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3f", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT38-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT38-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT38" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT39": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT39", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "39" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT39-EEPROM" + }, + { + "itf": "control", + "dev": "PORT39-CTRL" + } + ] + } + }, + "PORT39-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT39-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT39" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x40", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT39-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT39-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT39" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x40", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT40": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT40", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "40" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT40-EEPROM" + }, + { + "itf": "control", + "dev": "PORT40-CTRL" + } + ] + } + }, + "PORT40-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT40-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT40" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x41", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT40-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT40-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT40" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x41", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT41": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT41", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "41" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT41-EEPROM" + }, + { + "itf": "control", + "dev": "PORT41-CTRL" + } + ] + } + }, + "PORT41-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT41-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT41" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x42", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT41-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT41-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT41" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x42", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT42": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT42", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "42" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT42-EEPROM" + }, + { + "itf": "control", + "dev": "PORT42-CTRL" + } + ] + } + }, + "PORT42-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT42-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT42" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x43", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT42-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT42-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT42" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x43", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT43": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT43", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "43" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT43-EEPROM" + }, + { + "itf": "control", + "dev": "PORT43-CTRL" + } + ] + } + }, + "PORT43-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT43-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT43" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x44", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT43-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT43-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT43" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x44", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT44": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT44", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "44" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT44-EEPROM" + }, + { + "itf": "control", + "dev": "PORT44-CTRL" + } + ] + } + }, + "PORT44-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT44-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT44" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x45", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT44-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT44-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT44" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x45", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT45": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT45", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "45" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT45-EEPROM" + }, + { + "itf": "control", + "dev": "PORT45-CTRL" + } + ] + } + }, + "PORT45-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT45-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT45" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x46", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT45-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT45-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT45" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x46", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT46": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT46", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "46" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT46-EEPROM" + }, + { + "itf": "control", + "dev": "PORT46-CTRL" + } + ] + } + }, + "PORT46-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT46-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT46" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x47", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT46-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT46-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT46" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x47", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT47": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT47", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "47" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT47-EEPROM" + }, + { + "itf": "control", + "dev": "PORT47-CTRL" + } + ] + } + }, + "PORT47-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT47-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT47" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x48", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT47-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT47-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT47" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x48", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT48": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT48", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "48" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT48-EEPROM" + }, + { + "itf": "control", + "dev": "PORT48-CTRL" + } + ] + } + }, + "PORT48-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT48-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT48" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x49", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT48-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT48-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT48" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x49", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT49": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT49", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "49" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT49-EEPROM" + }, + { + "itf": "control", + "dev": "PORT49-CTRL" + } + ] + } + }, + "PORT49-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT49-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT49" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4a", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT49-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT49-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT49" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT50": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT50", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "50" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT50-EEPROM" + }, + { + "itf": "control", + "dev": "PORT50-CTRL" + } + ] + } + }, + "PORT50-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT50-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT50" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4b", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT50-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT50-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT50" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT51": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT51", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "51" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT51-EEPROM" + }, + { + "itf": "control", + "dev": "PORT51-CTRL" + } + ] + } + }, + "PORT51-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT51-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT51" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4c", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT51-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT51-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT51" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT52": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT52", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "52" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT52-EEPROM" + }, + { + "itf": "control", + "dev": "PORT52-CTRL" + } + ] + } + }, + "PORT52-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT52-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT52" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4d", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT52-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT52-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT52" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT53": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT53", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "53" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT53-EEPROM" + }, + { + "itf": "control", + "dev": "PORT53-CTRL" + } + ] + } + }, + "PORT53-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT53-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT53" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4e", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT53-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT53-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT53" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT54": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT54", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "54" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT54-EEPROM" + }, + { + "itf": "control", + "dev": "PORT54-CTRL" + } + ] + } + }, + "PORT54-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT54-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT54" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4f", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT54-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT54-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT54" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + } +} diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/pddf_support b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform.json b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform.json new file mode 100644 index 000000000000..7800ce50ddc2 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform.json @@ -0,0 +1,691 @@ +{ + "chassis": { + "name": "S7801-54XS", + "components": [ + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + }, + { + "name": "BIOS" + }, + { + "name": "BMC" + } + ], + "fans": [ + { + "name": "Fan_1" + }, + { + "name": "Fan_2" + }, + { + "name": "Fan_3" + }, + { + "name": "Fan_4" + }, + { + "name": "Fan_5" + } + ], + "fan_drawers":[ + { + "name": "Fantray1", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_1" + } + ] + }, + { + "name": "Fantray2", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_2" + } + ] + }, + { + "name": "Fantray3", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_3" + } + ] + }, + { + "name": "Fantray4", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_4" + } + ] + }, + { + "name": "Fantray5", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_5" + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "fans": [ + { + "name": "PSU1_FAN1" + } + ], + "thermals": [ + { + "name": "PSU1_TEMP1" + } + ] + }, + { + "name": "PSU2", + "fans": [ + { + "name": "PSU2_FAN1" + } + ], + "thermals": [ + { + "name": "PSU2_TEMP1" + } + ] + } + ], + "thermals": [ + { + "name": "TEMP_MAC" + }, + { + "name": "TEMP_ENV_MACCASE" + }, + { + "name": "TEMP_ENV_PSUCASE" + }, + { + "name": "TEMP_ENV_FANCONN" + }, + { + "name": "TEMP_ENV_FANCARD" + }, + { + "name": "TEMP_ENV_BMC" + }, + { + "name": "PSU-0-Thermal" + }, + { + "name": "PSU-1-Thermal" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet1" + }, + { + "name": "Ethernet2" + }, + { + "name": "Ethernet3" + }, + { + "name": "Ethernet4" + }, + { + "name": "Ethernet5" + }, + { + "name": "Ethernet6" + }, + { + "name": "Ethernet7" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet9" + }, + { + "name": "Ethernet10" + }, + { + "name": "Ethernet11" + }, + { + "name": "Ethernet12" + }, + { + "name": "Ethernet13" + }, + { + "name": "Ethernet14" + }, + { + "name": "Ethernet15" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet17" + }, + { + "name": "Ethernet18" + }, + { + "name": "Ethernet19" + }, + { + "name": "Ethernet20" + }, + { + "name": "Ethernet21" + }, + { + "name": "Ethernet22" + }, + { + "name": "Ethernet23" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet25" + }, + { + "name": "Ethernet26" + }, + { + "name": "Ethernet27" + }, + { + "name": "Ethernet28" + }, + { + "name": "Ethernet29" + }, + { + "name": "Ethernet30" + }, + { + "name": "Ethernet31" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet33" + }, + { + "name": "Ethernet34" + }, + { + "name": "Ethernet35" + }, + { + "name": "Ethernet36" + }, + { + "name": "Ethernet37" + }, + { + "name": "Ethernet38" + }, + { + "name": "Ethernet39" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet41" + }, + { + "name": "Ethernet42" + }, + { + "name": "Ethernet43" + }, + { + "name": "Ethernet44" + }, + { + "name": "Ethernet45" + }, + { + "name": "Ethernet46" + }, + { + "name": "Ethernet47" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet52" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet60" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet68" + }, + { + "name": "Ethernet72" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0", + "lanes": "1", + "breakout_modes": { + "1x10G" : [ "Eth0(Port0)" ] + } + }, + "Ethernet1": { + "index": "1", + "lanes": "2", + "breakout_modes": { + "1x10G" : [ "Eth1(Port1)" ] + } + }, + "Ethernet2": { + "index": "2", + "lanes": "3", + "breakout_modes": { + "1x10G" : [ "Eth2(Port2)" ] + } + }, + "Ethernet3": { + "index": "3", + "lanes": "4", + "breakout_modes": { + "1x10G" : [ "Eth3(Port3)" ] + } + }, + "Ethernet4": { + "index": "4", + "lanes": "5", + "breakout_modes": { + "1x10G" : [ "Eth4(Port4)" ] + } + }, + "Ethernet5": { + "index": "5", + "lanes": "6", + "breakout_modes": { + "1x10G" : [ "Eth5(Port5)" ] + } + }, + "Ethernet6": { + "index": "6", + "lanes": "7", + "breakout_modes": { + "1x10G" : [ "Eth6(Port6)" ] + } + }, + "Ethernet7": { + "index": "7", + "lanes": "8", + "breakout_modes": { + "1x10G" : [ "Eth7(Port7)" ] + } + }, + "Ethernet8": { + "index": "8", + "lanes": "9", + "breakout_modes": { + "1x10G" : [ "Eth8(Port8)" ] + } + }, + "Ethernet9": { + "index": "9", + "lanes": "10", + "breakout_modes": { + "1x10G" : [ "Eth9(Port9)" ] + } + }, + "Ethernet10": { + "index": "10", + "lanes": "11", + "breakout_modes": { + "1x10G" : [ "Eth10(Port10)" ] + } + }, + "Ethernet11": { + "index": "11", + "lanes": "12", + "breakout_modes": { + "1x10G" : [ "Eth11(Port11)" ] + } + }, + "Ethernet12": { + "index": "12", + "lanes": "13", + "breakout_modes": { + "1x10G" : [ "Eth12(Port12)" ] + } + }, + "Ethernet13": { + "index": "13", + "lanes": "14", + "breakout_modes": { + "1x10G" : [ "Eth13(Port13)" ] + } + }, + "Ethernet14": { + "index": "14", + "lanes": "15", + "breakout_modes": { + "1x10G" : [ "Eth14(Port14)" ] + } + }, + "Ethernet15": { + "index": "15", + "lanes": "16", + "breakout_modes": { + "1x10G" : [ "Eth15(Port15)" ] + } + }, + "Ethernet16": { + "index": "16", + "lanes": "17", + "breakout_modes": { + "1x10G" : [ "Eth16(Port16)" ] + } + }, + "Ethernet17": { + "index": "17", + "lanes": "18", + "breakout_modes": { + "1x10G" : [ "Eth17(Port17)" ] + } + }, + "Ethernet18": { + "index": "18", + "lanes": "19", + "breakout_modes": { + "1x10G" : [ "Eth18(Port18)" ] + } + }, + "Ethernet19": { + "index": "19", + "lanes": "20", + "breakout_modes": { + "1x10G" : [ "Eth19(Port19)" ] + } + }, + "Ethernet20": { + "index": "20", + "lanes": "21", + "breakout_modes": { + "1x10G" : [ "Eth20(Port20)" ] + } + }, + "Ethernet21": { + "index": "21", + "lanes": "22", + "breakout_modes": { + "1x10G" : [ "Eth21(Port21)" ] + } + }, + "Ethernet22": { + "index": "22", + "lanes": "23", + "breakout_modes": { + "1x10G" : [ "Eth22(Port22)" ] + } + }, + "Ethernet23": { + "index": "23", + "lanes": "24", + "breakout_modes": { + "1x10G" : [ "Eth23(Port23)" ] + } + }, + "Ethernet24": { + "index": "24", + "lanes": "25", + "breakout_modes": { + "1x10G" : [ "Eth24(Port24)" ] + } + }, + "Ethernet25": { + "index": "25", + "lanes": "26", + "breakout_modes": { + "1x10G" : [ "Eth25(Port25)" ] + } + }, + "Ethernet26": { + "index": "26", + "lanes": "27", + "breakout_modes": { + "1x10G" : [ "Eth26(Port26)" ] + } + }, + "Ethernet27": { + "index": "27", + "lanes": "28", + "breakout_modes": { + "1x10G" : [ "Eth27(Port27)" ] + } + }, + "Ethernet28": { + "index": "28", + "lanes": "41", + "breakout_modes": { + "1x10G" : [ "Eth28(Port28)" ] + } + }, + "Ethernet29": { + "index": "29", + "lanes": "42", + "breakout_modes": { + "1x10G" : [ "Eth29(Port29)" ] + } + }, + "Ethernet30": { + "index": "30", + "lanes": "43", + "breakout_modes": { + "1x10G" : [ "Eth30(Port30)" ] + } + }, + "Ethernet31": { + "index": "31", + "lanes": "44", + "breakout_modes": { + "1x10G" : [ "Eth31(Port31)" ] + } + }, + "Ethernet32": { + "index": "32", + "lanes": "61", + "breakout_modes": { + "1x10G" : [ "Eth32(Port32)" ] + } + }, + "Ethernet33": { + "index": "33", + "lanes": "62", + "breakout_modes": { + "1x10G" : [ "Eth33(Port33)" ] + } + }, + "Ethernet34": { + "index": "34", + "lanes": "63", + "breakout_modes": { + "1x10G" : [ "Eth34(Port34)" ] + } + }, + "Ethernet35": { + "index": "35", + "lanes": "64", + "breakout_modes": { + "1x10G" : [ "Eth35(Port35)" ] + } + }, + "Ethernet36": { + "index": "36", + "lanes": "65", + "breakout_modes": { + "1x10G" : [ "Eth36(Port36)" ] + } + }, + "Ethernet37": { + "index": "37", + "lanes": "66", + "breakout_modes": { + "1x10G" : [ "Eth37(Port37)" ] + } + }, + "Ethernet38": { + "index": "38", + "lanes": "67", + "breakout_modes": { + "1x10G" : [ "Eth38(Port38)" ] + } + }, + "Ethernet39": { + "index": "39", + "lanes": "68", + "breakout_modes": { + "1x10G" : [ "Eth39(Port39)" ] + } + }, + "Ethernet40": { + "index": "40", + "lanes": "69", + "breakout_modes": { + "1x10G" : [ "Eth40(Port40)" ] + } + }, + "Ethernet41": { + "index": "41", + "lanes": "70", + "breakout_modes": { + "1x10G" : [ "Eth41(Port41)" ] + } + }, + "Ethernet42": { + "index": "42", + "lanes": "71", + "breakout_modes": { + "1x10G" : [ "Eth42(Port42)" ] + } + }, + "Ethernet43": { + "index": "43", + "lanes": "72", + "breakout_modes": { + "1x10G" : [ "Eth43(Port43)" ] + } + }, + "Ethernet44": { + "index": "44", + "lanes": "73", + "breakout_modes": { + "1x10G" : [ "Eth44(Port44)" ] + } + }, + "Ethernet45": { + "index": "45", + "lanes": "74", + "breakout_modes": { + "1x10G" : [ "Eth45(Port45)" ] + } + }, + "Ethernet46": { + "index": "46", + "lanes": "75", + "breakout_modes": { + "1x10G" : [ "Eth46(Port46)" ] + } + }, + "Ethernet47": { + "index": "47", + "lanes": "76", + "breakout_modes": { + "1x10G" : [ "Eth47(Port47)" ] + } + }, + "Ethernet48": { + "index": "48,48,48,48", + "lanes": "37,38,39,40", + "breakout_modes": { + "1x100G[40G]" : [ "Eth48(Port48)" ] + } + }, + "Ethernet52": { + "index": "49,49,49,49", + "lanes": "33,34,35,36", + "breakout_modes": { + "1x100G[40G]" : [ "Eth49(Port49)" ] + } + }, + "Ethernet56": { + "index": "50,50,50,50", + "lanes": "45,46,47,48", + "breakout_modes": { + "1x100G[40G]" : [ "Eth50(Port50)" ] + } + }, + "Ethernet60": { + "index": "51,51,51,51", + "lanes": "49,50,51,52", + "breakout_modes": { + "1x100G[40G]" : [ "Eth51(Port51)" ] + } + }, + "Ethernet64": { + "index": "52,52,52,52", + "lanes": "53,54,55,56", + "breakout_modes": { + "1x100G[40G]": ["Eth52(Port52)"], + "2x50G": ["Eth52/1(Port52)", "Eth52/2(Port52)"], + "4x25G": ["Eth52/1(Port52)", "Eth52/2(Port52)", "Eth52/3(Port52)", "Eth52/4(Port52)"], + "4x10G": ["Eth52/1(Port52)", "Eth52/2(Port52)", "Eth52/3(Port52)", "Eth52/4(Port52)"] + } + }, + "Ethernet68": { + "index": "53,53,53,53", + "lanes": "57,58,59,60", + "breakout_modes": { + "1x100G[40G]": ["Eth53(Port53)"], + "2x50G": ["Eth53/1(Port53)", "Eth53/2(Port53)"], + "4x25G": ["Eth53/1(Port53)", "Eth53/2(Port53)", "Eth53/3(Port53)", "Eth53/4(Port53)"], + "4x10G": ["Eth53/1(Port53)", "Eth53/2(Port53)", "Eth53/3(Port53)", "Eth53/4(Port53)"] + } + } + } +} + diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_asic b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_components.json b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_components.json new file mode 100644 index 000000000000..5ab2d23557f3 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_components.json @@ -0,0 +1,12 @@ +{ + "chassis": { + "x86_64-ufispace_s7801_54xs-r0": { + "component": { + "CPLD1": { }, + "CPLD2": { }, + "BIOS": { }, + "BMC": {} + } + } + } +} diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_env.conf b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_env.conf new file mode 100644 index 000000000000..77fd88ac3678 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/platform_env.conf @@ -0,0 +1 @@ +SYNCD_SHM_SIZE=256m diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/pmon_daemon_control.json b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..e348e0168fa5 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/pmon_daemon_control.json @@ -0,0 +1,9 @@ +{ + "skip_pcied": false, + "skip_fancontrol": false, + "skip_thermalctld": false, + "skip_ledd": true, + "skip_xcvrd": false, + "skip_psud": false, + "skip_syseepromd": false +} diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/sensors.conf b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/sensors.conf new file mode 100644 index 000000000000..b1a69433405b --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/sensors.conf @@ -0,0 +1 @@ +# libsensors configuration file diff --git a/device/ufispace/x86_64-ufispace_s7801_54xs-r0/system_health_monitoring_config.json b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..467d81304de0 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s7801_54xs-r0/system_health_monitoring_config.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu", + "fan" + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "yellow", + "normal": "green", + "booting": "green_blink" + } +} diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/hwsku.json b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/hwsku.json new file mode 100644 index 000000000000..041ad2b5df26 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/hwsku.json @@ -0,0 +1,166 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet1": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet2": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet3": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet4": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet5": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet6": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet7": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet8": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet9": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet10": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet11": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet12": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet13": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet14": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet15": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet16": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet17": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet18": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet19": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet20": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet21": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet22": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet23": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet24": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet25": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet26": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet27": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet28": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet29": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet30": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet31": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet32": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet33": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet34": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet35": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet36": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet37": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet38": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet39": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet40": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet41": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet42": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet43": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet44": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet45": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet46": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet47": { + "default_brkout_mode": "1x25G[10G]" + }, + "Ethernet48": { + "default_brkout_mode": "1x100G[40G]" + }, + "Ethernet52": { + "default_brkout_mode": "1x100G[40G]" + }, + "Ethernet56": { + "default_brkout_mode": "1x100G[40G]" + }, + "Ethernet60": { + "default_brkout_mode": "1x100G[40G]" + }, + "Ethernet64": { + "default_brkout_mode": "1x100G[40G]" + }, + "Ethernet68": { + "default_brkout_mode": "1x100G[40G]" + } + } +} diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/sai.profile b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/sai.profile new file mode 100644 index 000000000000..39a5f795f1a3 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-x5-s8901-54xc.config.bcm \ No newline at end of file diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/td3-x5-s8901-54xc.config.bcm b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/td3-x5-s8901-54xc.config.bcm new file mode 100644 index 000000000000..37d9d8ec80d9 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/UFISPACE-S8901-54XC/td3-x5-s8901-54xc.config.bcm @@ -0,0 +1,502 @@ +# cfg version: r2, 20230515 + +pbmp_xport_xe=0x7fffffffffffffffdfffffffffffffffe + + +#FC 0 +phy_chain_tx_polarity_flip_physical{1}=0x0 +phy_chain_tx_polarity_flip_physical{2}=0x0 +phy_chain_tx_polarity_flip_physical{3}=0x0 +phy_chain_tx_polarity_flip_physical{4}=0x0 + +phy_chain_rx_polarity_flip_physical{1}=0x0 +phy_chain_rx_polarity_flip_physical{2}=0x0 +phy_chain_rx_polarity_flip_physical{3}=0x0 +phy_chain_rx_polarity_flip_physical{4}=0x0 + +phy_chain_tx_lane_map_physical{1.0}=0x0123 +phy_chain_rx_lane_map_physical{1.0}=0x0123 + +#FC 1 +phy_chain_tx_polarity_flip_physical{5}=0x0 +phy_chain_tx_polarity_flip_physical{6}=0x0 +phy_chain_tx_polarity_flip_physical{7}=0x0 +phy_chain_tx_polarity_flip_physical{8}=0x0 + +phy_chain_rx_polarity_flip_physical{5}=0x1 +phy_chain_rx_polarity_flip_physical{6}=0x1 +phy_chain_rx_polarity_flip_physical{7}=0x1 +phy_chain_rx_polarity_flip_physical{8}=0x1 + +phy_chain_tx_lane_map_physical{5.0}=0x0123 +phy_chain_rx_lane_map_physical{5.0}=0x0123 + +#FC 2 +phy_chain_tx_polarity_flip_physical{9}=0x0 +phy_chain_tx_polarity_flip_physical{10}=0x0 +phy_chain_tx_polarity_flip_physical{11}=0x0 +phy_chain_tx_polarity_flip_physical{12}=0x0 + +phy_chain_rx_polarity_flip_physical{9}=0x1 +phy_chain_rx_polarity_flip_physical{10}=0x1 +phy_chain_rx_polarity_flip_physical{11}=0x1 +phy_chain_rx_polarity_flip_physical{12}=0x1 + +phy_chain_tx_lane_map_physical{9.0}=0x0123 +phy_chain_rx_lane_map_physical{9.0}=0x0123 + +#FC 3 +phy_chain_tx_polarity_flip_physical{13}=0x0 +phy_chain_tx_polarity_flip_physical{14}=0x0 +phy_chain_tx_polarity_flip_physical{15}=0x0 +phy_chain_tx_polarity_flip_physical{16}=0x0 + +phy_chain_rx_polarity_flip_physical{13}=0x1 +phy_chain_rx_polarity_flip_physical{14}=0x1 +phy_chain_rx_polarity_flip_physical{15}=0x1 +phy_chain_rx_polarity_flip_physical{16}=0x1 + +phy_chain_tx_lane_map_physical{13.0}=0x0123 +phy_chain_rx_lane_map_physical{13.0}=0x0123 + +#FC 4 +phy_chain_tx_polarity_flip_physical{17}=0x0 +phy_chain_tx_polarity_flip_physical{18}=0x0 +phy_chain_tx_polarity_flip_physical{19}=0x0 +phy_chain_tx_polarity_flip_physical{20}=0x0 + +phy_chain_rx_polarity_flip_physical{17}=0x0 +phy_chain_rx_polarity_flip_physical{18}=0x0 +phy_chain_rx_polarity_flip_physical{19}=0x0 +phy_chain_rx_polarity_flip_physical{20}=0x0 + +phy_chain_tx_lane_map_physical{17.0}=0x0123 +phy_chain_rx_lane_map_physical{17.0}=0x0123 + +#FC 5 +phy_chain_tx_polarity_flip_physical{21}=0x0 +phy_chain_tx_polarity_flip_physical{22}=0x0 +phy_chain_tx_polarity_flip_physical{23}=0x0 +phy_chain_tx_polarity_flip_physical{24}=0x0 + +phy_chain_rx_polarity_flip_physical{21}=0x1 +phy_chain_rx_polarity_flip_physical{22}=0x1 +phy_chain_rx_polarity_flip_physical{23}=0x1 +phy_chain_rx_polarity_flip_physical{24}=0x1 + +phy_chain_tx_lane_map_physical{21.0}=0x0123 +phy_chain_rx_lane_map_physical{21.0}=0x0123 + +#FC 6 +phy_chain_tx_polarity_flip_physical{25}=0x0 +phy_chain_tx_polarity_flip_physical{26}=0x0 +phy_chain_tx_polarity_flip_physical{27}=0x0 +phy_chain_tx_polarity_flip_physical{28}=0x0 + +phy_chain_rx_polarity_flip_physical{25}=0x1 +phy_chain_rx_polarity_flip_physical{26}=0x1 +phy_chain_rx_polarity_flip_physical{27}=0x1 +phy_chain_rx_polarity_flip_physical{28}=0x1 + +phy_chain_tx_lane_map_physical{25.0}=0x0123 +phy_chain_rx_lane_map_physical{25.0}=0x0123 + +#FC 7 not use +phy_chain_tx_polarity_flip_physical{29}=0x0 +phy_chain_tx_polarity_flip_physical{30}=0x0 +phy_chain_tx_polarity_flip_physical{31}=0x0 +phy_chain_tx_polarity_flip_physical{32}=0x0 + +phy_chain_rx_polarity_flip_physical{29}=0x0 +phy_chain_rx_polarity_flip_physical{30}=0x0 +phy_chain_rx_polarity_flip_physical{31}=0x0 +phy_chain_rx_polarity_flip_physical{32}=0x0 + +phy_chain_tx_lane_map_physical{29.0}=0x0123 +phy_chain_rx_lane_map_physical{29.0}=0x0123 + +#FC 8 +phy_chain_tx_polarity_flip_physical{33}=0x1 +phy_chain_tx_polarity_flip_physical{34}=0x0 +phy_chain_tx_polarity_flip_physical{35}=0x1 +phy_chain_tx_polarity_flip_physical{36}=0x1 + +phy_chain_rx_polarity_flip_physical{33}=0x0 +phy_chain_rx_polarity_flip_physical{34}=0x0 +phy_chain_rx_polarity_flip_physical{35}=0x1 +phy_chain_rx_polarity_flip_physical{36}=0x0 + +phy_chain_tx_lane_map_physical{33.0}=0x3120 +phy_chain_rx_lane_map_physical{33.0}=0x0213 + +#FC 9 +phy_chain_tx_polarity_flip_physical{37}=0x0 +phy_chain_tx_polarity_flip_physical{38}=0x0 +phy_chain_tx_polarity_flip_physical{39}=0x1 +phy_chain_tx_polarity_flip_physical{40}=0x1 + +phy_chain_rx_polarity_flip_physical{37}=0x1 +phy_chain_rx_polarity_flip_physical{38}=0x1 +phy_chain_rx_polarity_flip_physical{39}=0x0 +phy_chain_rx_polarity_flip_physical{40}=0x0 + +phy_chain_tx_lane_map_physical{37.0}=0x2031 +phy_chain_rx_lane_map_physical{37.0}=0x1302 + +#FC 10 +phy_chain_tx_polarity_flip_physical{41}=0x0 +phy_chain_tx_polarity_flip_physical{42}=0x0 +phy_chain_tx_polarity_flip_physical{43}=0x0 +phy_chain_tx_polarity_flip_physical{44}=0x0 + +phy_chain_rx_polarity_flip_physical{41}=0x1 +phy_chain_rx_polarity_flip_physical{42}=0x1 +phy_chain_rx_polarity_flip_physical{43}=0x1 +phy_chain_rx_polarity_flip_physical{44}=0x1 + +phy_chain_tx_lane_map_physical{41.0}=0x3210 +phy_chain_rx_lane_map_physical{41.0}=0x0123 + +#FC 11 +phy_chain_tx_polarity_flip_physical{45}=0x0 +phy_chain_tx_polarity_flip_physical{46}=0x0 +phy_chain_tx_polarity_flip_physical{47}=0x1 +phy_chain_tx_polarity_flip_physical{48}=0x1 + +phy_chain_rx_polarity_flip_physical{45}=0x0 +phy_chain_rx_polarity_flip_physical{46}=0x0 +phy_chain_rx_polarity_flip_physical{47}=0x0 +phy_chain_rx_polarity_flip_physical{48}=0x1 + +phy_chain_tx_lane_map_physical{45.0}=0x3120 +phy_chain_rx_lane_map_physical{45.0}=0x2130 + +#FC 12 +phy_chain_tx_polarity_flip_physical{49}=0x1 +phy_chain_tx_polarity_flip_physical{50}=0x0 +phy_chain_tx_polarity_flip_physical{51}=0x0 +phy_chain_tx_polarity_flip_physical{52}=0x1 + +phy_chain_rx_polarity_flip_physical{49}=0x0 +phy_chain_rx_polarity_flip_physical{50}=0x1 +phy_chain_rx_polarity_flip_physical{51}=0x1 +phy_chain_rx_polarity_flip_physical{52}=0x0 + +phy_chain_tx_lane_map_physical{49.0}=0x3201 +phy_chain_rx_lane_map_physical{49.0}=0x1023 + +#FC 13 +phy_chain_tx_polarity_flip_physical{53}=0x0 +phy_chain_tx_polarity_flip_physical{54}=0x0 +phy_chain_tx_polarity_flip_physical{55}=0x1 +phy_chain_tx_polarity_flip_physical{56}=0x1 + +phy_chain_rx_polarity_flip_physical{53}=0x0 +phy_chain_rx_polarity_flip_physical{54}=0x0 +phy_chain_rx_polarity_flip_physical{55}=0x0 +phy_chain_rx_polarity_flip_physical{56}=0x1 + +phy_chain_tx_lane_map_physical{53.0}=0x3120 +phy_chain_rx_lane_map_physical{53.0}=0x2130 + +#FC 14 +phy_chain_tx_polarity_flip_physical{57}=0x1 +phy_chain_tx_polarity_flip_physical{58}=0x0 +phy_chain_tx_polarity_flip_physical{59}=0x0 +phy_chain_tx_polarity_flip_physical{60}=0x1 + +phy_chain_rx_polarity_flip_physical{57}=0x0 +phy_chain_rx_polarity_flip_physical{58}=0x1 +phy_chain_rx_polarity_flip_physical{59}=0x1 +phy_chain_rx_polarity_flip_physical{60}=0x0 + +phy_chain_tx_lane_map_physical{57.0}=0x3201 +phy_chain_rx_lane_map_physical{57.0}=0x1023 + +#FC 15 +phy_chain_tx_polarity_flip_physical{61}=0x0 +phy_chain_tx_polarity_flip_physical{62}=0x0 +phy_chain_tx_polarity_flip_physical{63}=0x0 +phy_chain_tx_polarity_flip_physical{64}=0x0 + +phy_chain_rx_polarity_flip_physical{61}=0x0 +phy_chain_rx_polarity_flip_physical{62}=0x0 +phy_chain_rx_polarity_flip_physical{63}=0x0 +phy_chain_rx_polarity_flip_physical{64}=0x0 + +phy_chain_tx_lane_map_physical{61.0}=0x3210 +phy_chain_rx_lane_map_physical{61.0}=0x3210 + +#FC 16 +phy_chain_tx_polarity_flip_physical{65}=0x0 +phy_chain_tx_polarity_flip_physical{66}=0x0 +phy_chain_tx_polarity_flip_physical{67}=0x0 +phy_chain_tx_polarity_flip_physical{68}=0x0 + +phy_chain_rx_polarity_flip_physical{65}=0x1 +phy_chain_rx_polarity_flip_physical{66}=0x1 +phy_chain_rx_polarity_flip_physical{67}=0x1 +phy_chain_rx_polarity_flip_physical{68}=0x1 + +phy_chain_tx_lane_map_physical{65.0}=0x3210 +phy_chain_rx_lane_map_physical{65.0}=0x3210 + +#FC 17 +phy_chain_tx_polarity_flip_physical{69}=0x0 +phy_chain_tx_polarity_flip_physical{70}=0x0 +phy_chain_tx_polarity_flip_physical{71}=0x0 +phy_chain_tx_polarity_flip_physical{72}=0x0 + +phy_chain_rx_polarity_flip_physical{69}=0x1 +phy_chain_rx_polarity_flip_physical{70}=0x1 +phy_chain_rx_polarity_flip_physical{71}=0x1 +phy_chain_rx_polarity_flip_physical{72}=0x1 + +phy_chain_tx_lane_map_physical{69.0}=0x3210 +phy_chain_rx_lane_map_physical{69.0}=0x3210 + +#FC 18 +phy_chain_tx_polarity_flip_physical{73}=0x0 +phy_chain_tx_polarity_flip_physical{74}=0x0 +phy_chain_tx_polarity_flip_physical{75}=0x0 +phy_chain_tx_polarity_flip_physical{76}=0x0 + +phy_chain_rx_polarity_flip_physical{73}=0x1 +phy_chain_rx_polarity_flip_physical{74}=0x1 +phy_chain_rx_polarity_flip_physical{75}=0x1 +phy_chain_rx_polarity_flip_physical{76}=0x1 + +phy_chain_tx_lane_map_physical{73.0}=0x3210 +phy_chain_rx_lane_map_physical{73.0}=0x3210 + +#FC 19 not use +phy_chain_tx_polarity_flip_physical{77}=0x0 +phy_chain_tx_polarity_flip_physical{78}=0x0 +phy_chain_tx_polarity_flip_physical{79}=0x0 +phy_chain_tx_polarity_flip_physical{80}=0x0 + +phy_chain_rx_polarity_flip_physical{77}=0x0 +phy_chain_rx_polarity_flip_physical{78}=0x0 +phy_chain_rx_polarity_flip_physical{79}=0x0 +phy_chain_rx_polarity_flip_physical{80}=0x0 + +phy_chain_tx_lane_map_physical{77.0}=0x3210 +phy_chain_rx_lane_map_physical{77.0}=0x3210 + + +#FC0 sfp28 port 0-3 +portmap_1=1:25 +portmap_2=2:25 +portmap_3=3:25 +portmap_4=4:25 + +#FC1 sfp28 port 4-7 +portmap_5=5:25 +portmap_6=6:25 +portmap_7=7:25 +portmap_8=8:25 + +#FC2 sfp28 port 8-11 +portmap_9=9:25 +portmap_10=10:25 +portmap_11=11:25 +portmap_12=12:25 + +#FC3 sfp28 port 12-15 +portmap_13=13:25 +portmap_14=14:25 +portmap_15=15:25 +portmap_16=16:25 + +#FC4 sfp28 port 16-19 +portmap_17=17:25 +portmap_18=18:25 +portmap_19=19:25 +portmap_20=20:25 + +#FC5 sfp28 port 20-23 +portmap_21=21:25 +portmap_22=22:25 +portmap_23=23:25 +portmap_24=24:25 + +#FC6 sfp28 port 24-27 +portmap_25=25:25 +portmap_26=26:25 +portmap_27=27:25 +portmap_28=28:25 + +#FC7 not use + +#FC10 sfp28 port 28-31 +portmap_33=41:25 +portmap_34=42:25 +portmap_35=43:25 +portmap_36=44:25 + +#FC15 sfp28 port 32-35 +portmap_37=61:25 +portmap_38=62:25 +portmap_39=63:25 +portmap_40=64:25 + +#FC16 sfp28 port 36-39 +portmap_41=65:25 +portmap_42=66:25 +portmap_43=67:25 +portmap_44=68:25 + +#FC17 sfp28 port 40-43 +portmap_45=69:25 +portmap_46=70:25 +portmap_47=71:25 +portmap_48=72:25 + +#FC18 sfp28 port 44-47 +portmap_49=73:25 +portmap_50=74:25 +portmap_51=75:25 +portmap_52=76:25 + +#FC9 qsfp port 48 +portmap_29=37:100 + +#FC8 qsfp port 49 +portmap_30=33:100 + +#FC11 qsfp port 50 +portmap_53=45:100 + +#FC12 qsfp port 51 +portmap_54=49:100 + +#FC13 qsfp port 52 +portmap_55=53:100 + +#FC14 qsfp port 53 +portmap_59=57:100 + +#FC19 not use + +# dport +dport_map_enable=1 + +dport_map_port_1=1 +dport_map_port_2=2 +dport_map_port_3=3 +dport_map_port_4=4 +dport_map_port_5=5 +dport_map_port_6=6 +dport_map_port_7=7 +dport_map_port_8=8 +dport_map_port_9=9 +dport_map_port_10=10 +dport_map_port_11=11 +dport_map_port_12=12 +dport_map_port_13=13 +dport_map_port_14=14 +dport_map_port_15=15 +dport_map_port_16=16 +dport_map_port_17=17 +dport_map_port_18=18 +dport_map_port_19=19 +dport_map_port_20=20 +dport_map_port_21=21 +dport_map_port_22=22 +dport_map_port_23=23 +dport_map_port_24=24 +dport_map_port_25=25 +dport_map_port_26=26 +dport_map_port_27=27 +dport_map_port_28=28 +dport_map_port_33=29 +dport_map_port_34=30 +dport_map_port_35=31 +dport_map_port_36=32 +dport_map_port_37=33 +dport_map_port_38=34 +dport_map_port_39=35 +dport_map_port_40=36 +dport_map_port_41=37 +dport_map_port_42=38 +dport_map_port_43=39 +dport_map_port_44=40 +dport_map_port_45=41 +dport_map_port_46=42 +dport_map_port_47=43 +dport_map_port_48=44 +dport_map_port_49=45 +dport_map_port_50=46 +dport_map_port_51=47 +dport_map_port_52=48 +dport_map_port_29=49 +dport_map_port_30=50 +dport_map_port_53=51 +dport_map_port_54=52 +dport_map_port_55=53 +dport_map_port_59=54 + +# cfg for timing +ptp_bs_fref_0=50000000 +ptp_bs_fref_1=50000000 + +port_flex_enable=1 +oversubscribe_mode=1 +core_clock_frequency=1525 + +#25G,10G and 1G support +serdes_10g_at_25g_vco=1 +serdes_1000x_at_25g_vco=1 + +l2xmsg_mode=1 +l2xmsg_hostbuf_size=16384 +module_64ports=0 + +#Interrupts and Parity +max_vp_lags=0 +schan_intr_enable=0 +tdma_timeout_usec=5000000 +stable_size=0x5500000 + +#Default L3 profile +l2_mem_entries=40960 +l3_alpm_enable=2 +l3_alpm_ipv6_128b_bkt_rsvd=1 +l3_mem_entries=40960 + +#Tunnels +use_all_splithorizon_groups=1 +sai_tunnel_support=1 +bcm_tunnel_term_compatible_mode=1 + +#RIOT Enable +riot_enable=1 +riot_overlay_l3_intf_mem_size=8192 +riot_overlay_l3_egress_mem_size=32768 +l3_ecmp_levels=2 +riot_overlay_ecmp_resilient_hash_size=16384 +pfc_deadlock_seq_control=1 + +mem_cache_enable=0 +ifp_inports_support_enable=1 +ipv6_lpm_128b_enable=0x1 +l3_max_ecmp_mode=1 +lpm_scaling_enable=0 +bcm_num_cos=10 +default_cpu_tx_queue=9 +mmu_lossless=0 +host_as_route_disable=1 +sai_fast_convergence_support=1 +flow_init_mode=1 +sai_interface_type_auto_detect=0 +mpls_mem_entries=16384 +vlan_xlate_1_mem_entries=65536 +vlan_xlate_2_mem_entries=16384 +sai_nbr_bcast_ifp_optimized=1 +sai_brcm_sonic_acl_enhancements=1 + +# Reduced Trap Group QSET for BRCM Sonic +sai_brcm_sonic_trap_group=1 +l2_entry_used_as_my_station=1 +multi_hash_recurse_depth_l3=2 + diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/custom_led.bin b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/custom_led.bin new file mode 100644 index 0000000000000000000000000000000000000000..af49a6baba156c23cb95a4bc6bf55c4a2073107a GIT binary patch literal 392 zcmZ9ONcmfHFX`q5M*rf0=P)+YHp`t{hvQAh6X)zO=%to=|kej&P%6}R5rOW2lIQx;11 z9wl^>T3`|<=q9~nMXR)>qqLjmY5tUVyf0l{Ha~@AKs$2h?$>WE;_z!}cbL<<+V#1*a) TWAz`+Z9Cky%WeDIcF1jiGL0/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU1-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU1-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x50", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x1", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x10", + "attr_cmpval":"0x10", + "attr_len":"1" + } + ] + } + }, + "PSU2": { + "dev_info": { + "device_type": "PSU", + "device_name": "PSU2", + "device_parent": "MUX1" + }, + "dev_attr": { + "dev_idx": "2", + "num_psu_fans": "1" + }, + "i2c": { + "interface": [ + { "itf":"eeprom", "dev":"PSU2-EEPROM" } + ] + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "psu_temp1_input", + "bmc_cmd": "ipmitool sdr -c get PSU1_TEMP1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_TEMP1", + "field_pos": "2", + "mult": "1000", + "separator": "," + }, + { + "attr_name": "psu_fan1_speed_rpm", + "bmc_cmd": "ipmitool sdr -c get PSU1_FAN1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_FAN1", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "psu_v_out", + "bmc_cmd": "ipmitool sdr -c get PSU1_VOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_VOUT", + "field_pos": "2", + "mult": "1000", + "separator": "," + }, + { + "attr_name": "psu_i_out", + "bmc_cmd": "ipmitool sdr -c get PSU1_IOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "PSU1_IOUT", + "field_pos": "2", + "mult": "1000", + "separator": "," + }, + { + "attr_name": "psu_mfr_id", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU2-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU2-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x51", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x2", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x20", + "attr_cmpval":"0x20", + "attr_len":"1" + } + ] + } + }, + "FAN-CTRL": { + "dev_info": { + "device_type": "FAN", + "device_name": "FAN-CTRL", + "device_parent": "" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "fan1_present", + "bmc_cmd": "ipmitool sdr -c get FAN0_PRSNT_L", + "raw": "0", + "field_name": "FAN0_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan2_present", + "bmc_cmd": "ipmitool sdr -c get FAN1_PRSNT_L", + "raw": "0", + "field_name": "FAN1_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan3_present", + "bmc_cmd": "ipmitool sdr -c get FAN2_PRSNT_L", + "raw": "0", + "field_name": "FAN2_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan4_present", + "bmc_cmd": "ipmitool sdr -c get FAN3_PRSNT_L", + "raw": "0", + "field_name": "FAN3_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan5_present", + "bmc_cmd": "ipmitool sdr -c get FAN4_PRSNT_L", + "raw": "0", + "field_name": "FAN4_PRSNT_L", + "field_pos": "5", + "separator": "," + }, + { + "attr_name": "fan1_input", + "bmc_cmd": "ipmitool sdr -c get FAN0_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN0_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan2_input", + "bmc_cmd": "ipmitool sdr -c get FAN1_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN1_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan3_input", + "bmc_cmd": "ipmitool sdr -c get FAN2_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN2_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan4_input", + "bmc_cmd": "ipmitool sdr -c get FAN3_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN3_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan5_input", + "bmc_cmd": "ipmitool sdr -c get FAN4_RPM | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "field_name": "FAN4_RPM", + "field_pos": "2", + "separator": "," + }, + { + "attr_name": "fan1_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan2_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan3_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f3", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan4_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f4", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan5_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f5", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "SYNC_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "DIAG_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + }, + { + "attr_name": "off", + "bits": "3:2", + "descr": "Off", + "value": "0x1;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x82" + } + ] + } + }, + "SYS_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "SYS_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "off", + "bits": "7:6", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + } + ] + } + }, + "FAN_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "FAN_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + } + ] + } + }, + "PSU1_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "PSU2_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "1", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "7", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "ID_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "LOC_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "blue", + "bits": "3:1", + "descr": "Blue", + "value": "0x04;0x05", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "blue_blink", + "bits": "3:1", + "descr": "Blue Blinking", + "value": "0x06;0x07", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "off", + "bits": "3:2", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + } + ] + } + }, + "PORT1": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT1", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "1" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT1-EEPROM" + }, + { + "itf": "control", + "dev": "PORT1-CTRL" + } + ] + } + }, + "PORT1-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1a", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT1-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT2": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT2", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "2" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT2-EEPROM" + }, + { + "itf": "control", + "dev": "PORT2-CTRL" + } + ] + } + }, + "PORT2-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1b", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT2-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT3": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT3", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "3" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT3-EEPROM" + }, + { + "itf": "control", + "dev": "PORT3-CTRL" + } + ] + } + }, + "PORT3-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1c", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT3-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT4": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT4", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "4" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT4-EEPROM" + }, + { + "itf": "control", + "dev": "PORT4-CTRL" + } + ] + } + }, + "PORT4-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1d", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT4-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT5": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT5", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "5" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT5-EEPROM" + }, + { + "itf": "control", + "dev": "PORT5-CTRL" + } + ] + } + }, + "PORT5-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1e", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT5-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT6": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT6", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "6" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT6-EEPROM" + }, + { + "itf": "control", + "dev": "PORT6-CTRL" + } + ] + } + }, + "PORT6-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1f", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT6-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT7": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT7", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "7" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT7-EEPROM" + }, + { + "itf": "control", + "dev": "PORT7-CTRL" + } + ] + } + }, + "PORT7-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT7-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT8": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT8", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "8" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT8-EEPROM" + }, + { + "itf": "control", + "dev": "PORT8-CTRL" + } + ] + } + }, + "PORT8-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT8-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x70", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT9": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT9", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "9" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT9-EEPROM" + }, + { + "itf": "control", + "dev": "PORT9-CTRL" + } + ] + } + }, + "PORT9-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT9-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT10": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT10", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "10" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT10-EEPROM" + }, + { + "itf": "control", + "dev": "PORT10-CTRL" + } + ] + } + }, + "PORT10-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT10-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT11": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT11", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "11" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT11-EEPROM" + }, + { + "itf": "control", + "dev": "PORT11-CTRL" + } + ] + } + }, + "PORT11-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT11-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT12": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT12", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "12" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT12-EEPROM" + }, + { + "itf": "control", + "dev": "PORT12-CTRL" + } + ] + } + }, + "PORT12-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT12-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT13": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT13", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "13" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT13-EEPROM" + }, + { + "itf": "control", + "dev": "PORT13-CTRL" + } + ] + } + }, + "PORT13-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT13-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT14": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT14", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "14" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT14-EEPROM" + }, + { + "itf": "control", + "dev": "PORT14-CTRL" + } + ] + } + }, + "PORT14-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT14-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT15": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT15", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "15" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT15-EEPROM" + }, + { + "itf": "control", + "dev": "PORT15-CTRL" + } + ] + } + }, + "PORT15-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT15-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT16": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT16", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "16" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT16-EEPROM" + }, + { + "itf": "control", + "dev": "PORT16-CTRL" + } + ] + } + }, + "PORT16-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT16-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x71", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT17": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT17", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "17" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT17-EEPROM" + }, + { + "itf": "control", + "dev": "PORT17-CTRL" + } + ] + } + }, + "PORT17-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2a", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT17-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT18": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT18", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "18" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT18-EEPROM" + }, + { + "itf": "control", + "dev": "PORT18-CTRL" + } + ] + } + }, + "PORT18-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2b", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT18-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT19": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT19", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "19" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT19-EEPROM" + }, + { + "itf": "control", + "dev": "PORT19-CTRL" + } + ] + } + }, + "PORT19-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2c", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT19-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT20": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT20", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "20" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT20-EEPROM" + }, + { + "itf": "control", + "dev": "PORT20-CTRL" + } + ] + } + }, + "PORT20-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2d", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT20-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT21": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT21", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "21" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT21-EEPROM" + }, + { + "itf": "control", + "dev": "PORT21-CTRL" + } + ] + } + }, + "PORT21-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2e", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT21-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT22": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT22", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "22" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT22-EEPROM" + }, + { + "itf": "control", + "dev": "PORT22-CTRL" + } + ] + } + }, + "PORT22-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2f", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT22-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT23": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT23", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "23" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT23-EEPROM" + }, + { + "itf": "control", + "dev": "PORT23-CTRL" + } + ] + } + }, + "PORT23-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT23-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT24": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT24", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "24" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT24-EEPROM" + }, + { + "itf": "control", + "dev": "PORT24-CTRL" + } + ] + } + }, + "PORT24-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT24-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x72", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT25": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT25", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "25" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT25-EEPROM" + }, + { + "itf": "control", + "dev": "PORT25-CTRL" + } + ] + } + }, + "PORT25-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x32", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT25-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x32", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT26": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT26", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "26" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT26-EEPROM" + }, + { + "itf": "control", + "dev": "PORT26-CTRL" + } + ] + } + }, + "PORT26-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT26-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT27": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT27", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "27" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT27-EEPROM" + }, + { + "itf": "control", + "dev": "PORT27-CTRL" + } + ] + } + }, + "PORT27-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x34", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT27-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x34", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT28": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT28", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "28" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT28-EEPROM" + }, + { + "itf": "control", + "dev": "PORT28-CTRL" + } + ] + } + }, + "PORT28-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x35", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT28-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x35", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT29": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT29", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "29" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT29-EEPROM" + }, + { + "itf": "control", + "dev": "PORT29-CTRL" + } + ] + } + }, + "PORT29-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x36", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT29-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x36", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT30": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT30", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "30" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT30-EEPROM" + }, + { + "itf": "control", + "dev": "PORT30-CTRL" + } + ] + } + }, + "PORT30-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x37", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT30-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x37", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT31": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT31", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "31" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT31-EEPROM" + }, + { + "itf": "control", + "dev": "PORT31-CTRL" + } + ] + } + }, + "PORT31-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x38", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT31-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x38", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT32": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT32", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "32" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT32-EEPROM" + }, + { + "itf": "control", + "dev": "PORT32-CTRL" + } + ] + } + }, + "PORT32-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-EEPROM", + "device_parent": "MUX7", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x39", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT32-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x39", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x49", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x73", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT33": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT33", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "33" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT33-EEPROM" + }, + { + "itf": "control", + "dev": "PORT33-CTRL" + } + ] + } + }, + "PORT33-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT33-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3a", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT33-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT33-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT34": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT34", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "34" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT34-EEPROM" + }, + { + "itf": "control", + "dev": "PORT34-CTRL" + } + ] + } + }, + "PORT34-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT34-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT34" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3b", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT34-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT34-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT34" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT35": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT35", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "35" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT35-EEPROM" + }, + { + "itf": "control", + "dev": "PORT35-CTRL" + } + ] + } + }, + "PORT35-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT35-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT35" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3c", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT35-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT35-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT35" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT36": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT36", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "36" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT36-EEPROM" + }, + { + "itf": "control", + "dev": "PORT36-CTRL" + } + ] + } + }, + "PORT36-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT36-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT36" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3d", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT36-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT36-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT36" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT37": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT37", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "37" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT37-EEPROM" + }, + { + "itf": "control", + "dev": "PORT37-CTRL" + } + ] + } + }, + "PORT37-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT37-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT37" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3e", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT37-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT37-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT37" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT38": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT38", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "38" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT38-EEPROM" + }, + { + "itf": "control", + "dev": "PORT38-CTRL" + } + ] + } + }, + "PORT38-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT38-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT38" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3f", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT38-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT38-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT38" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x3f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT39": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT39", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "39" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT39-EEPROM" + }, + { + "itf": "control", + "dev": "PORT39-CTRL" + } + ] + } + }, + "PORT39-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT39-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT39" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x40", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT39-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT39-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT39" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x40", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT40": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT40", + "device_parent": "MUX8" + }, + "dev_attr": { + "dev_idx": "40" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT40-EEPROM" + }, + { + "itf": "control", + "dev": "PORT40-CTRL" + } + ] + } + }, + "PORT40-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT40-EEPROM", + "device_parent": "MUX8", + "virt_parent": "PORT40" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x41", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT40-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT40-CTRL", + "device_parent": "MUX8", + "virt_parent": "PORT40" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x41", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4a", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x74", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT41": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT41", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "41" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT41-EEPROM" + }, + { + "itf": "control", + "dev": "PORT41-CTRL" + } + ] + } + }, + "PORT41-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT41-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT41" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x42", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT41-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT41-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT41" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x42", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT42": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT42", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "42" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT42-EEPROM" + }, + { + "itf": "control", + "dev": "PORT42-CTRL" + } + ] + } + }, + "PORT42-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT42-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT42" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x43", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT42-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT42-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT42" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x43", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT43": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT43", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "43" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT43-EEPROM" + }, + { + "itf": "control", + "dev": "PORT43-CTRL" + } + ] + } + }, + "PORT43-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT43-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT43" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x44", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT43-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT43-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT43" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x44", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT44": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT44", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "44" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT44-EEPROM" + }, + { + "itf": "control", + "dev": "PORT44-CTRL" + } + ] + } + }, + "PORT44-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT44-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT44" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x45", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT44-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT44-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT44" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x45", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT45": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT45", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "45" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT45-EEPROM" + }, + { + "itf": "control", + "dev": "PORT45-CTRL" + } + ] + } + }, + "PORT45-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT45-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT45" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x46", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT45-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT45-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT45" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x46", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT46": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT46", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "46" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT46-EEPROM" + }, + { + "itf": "control", + "dev": "PORT46-CTRL" + } + ] + } + }, + "PORT46-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT46-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT46" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x47", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT46-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT46-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT46" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x47", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT47": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT47", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "47" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT47-EEPROM" + }, + { + "itf": "control", + "dev": "PORT47-CTRL" + } + ] + } + }, + "PORT47-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT47-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT47" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x48", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT47-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT47-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT47" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x48", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT48": { + "dev_info": { + "device_type": "SFP28", + "device_name": "PORT48", + "device_parent": "MUX9" + }, + "dev_attr": { + "dev_idx": "48" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT48-EEPROM" + }, + { + "itf": "control", + "dev": "PORT48-CTRL" + } + ] + } + }, + "PORT48-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT48-EEPROM", + "device_parent": "MUX9", + "virt_parent": "PORT48" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x49", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT48-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT48-CTRL", + "device_parent": "MUX9", + "virt_parent": "PORT48" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x49", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0x7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x4b", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x75", + "attr_mask": "0x7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT49": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT49", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "49" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT49-EEPROM" + }, + { + "itf": "control", + "dev": "PORT49-CTRL" + } + ] + } + }, + "PORT49-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT49-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT49" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4a", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT49-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT49-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT49" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4a", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT50": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT50", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "50" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT50-EEPROM" + }, + { + "itf": "control", + "dev": "PORT50-CTRL" + } + ] + } + }, + "PORT50-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT50-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT50" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4b", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT50-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT50-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT50" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4b", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT51": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT51", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "51" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT51-EEPROM" + }, + { + "itf": "control", + "dev": "PORT51-CTRL" + } + ] + } + }, + "PORT51-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT51-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT51" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4c", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT51-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT51-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT51" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4c", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT52": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT52", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "52" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT52-EEPROM" + }, + { + "itf": "control", + "dev": "PORT52-CTRL" + } + ] + } + }, + "PORT52-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT52-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT52" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4d", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT52-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT52-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT52" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4d", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT53": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT53", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "53" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT53-EEPROM" + }, + { + "itf": "control", + "dev": "PORT53-CTRL" + } + ] + } + }, + "PORT53-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT53-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT53" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4e", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT53-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT53-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT53" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4e", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT54": { + "dev_info": { + "device_type": "QSFP28", + "device_name": "PORT54", + "device_parent": "MUX10" + }, + "dev_attr": { + "dev_idx": "54" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT54-EEPROM" + }, + { + "itf": "control", + "dev": "PORT54-CTRL" + } + ] + } + }, + "PORT54-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT54-EEPROM", + "device_parent": "MUX10", + "virt_parent": "PORT54" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4f", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT54-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT54-CTRL", + "device_parent": "MUX10", + "virt_parent": "PORT54" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x4f", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x76", + "attr_mask": "0x5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x77", + "attr_mask": "0x5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + } +} diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/pddf_support b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform.json b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform.json new file mode 100644 index 000000000000..3db26c98428e --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform.json @@ -0,0 +1,691 @@ +{ + "chassis": { + "name": "S8901-54XC", + "components": [ + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + }, + { + "name": "BIOS" + }, + { + "name": "BMC" + } + ], + "fans": [ + { + "name": "Fan_1" + }, + { + "name": "Fan_2" + }, + { + "name": "Fan_3" + }, + { + "name": "Fan_4" + }, + { + "name": "Fan_5" + } + ], + "fan_drawers":[ + { + "name": "Fantray1", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_1" + } + ] + }, + { + "name": "Fantray2", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_2" + } + ] + }, + { + "name": "Fantray3", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_3" + } + ] + }, + { + "name": "Fantray4", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_4" + } + ] + }, + { + "name": "Fantray5", + "num_fans" : 1, + "fans": [ + { + "name": "Fan_5" + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "fans": [ + { + "name": "PSU1_FAN1" + } + ], + "thermals": [ + { + "name": "PSU1_TEMP1" + } + ] + }, + { + "name": "PSU2", + "fans": [ + { + "name": "PSU2_FAN1" + } + ], + "thermals": [ + { + "name": "PSU2_TEMP1" + } + ] + } + ], + "thermals": [ + { + "name": "TEMP_MAC" + }, + { + "name": "TEMP_ENV_MACCASE" + }, + { + "name": "TEMP_ENV_PSUCASE" + }, + { + "name": "TEMP_ENV_FANCONN" + }, + { + "name": "TEMP_ENV_FANCARD" + }, + { + "name": "TEMP_ENV_BMC" + }, + { + "name": "PSU-0-Thermal" + }, + { + "name": "PSU-1-Thermal" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet1" + }, + { + "name": "Ethernet2" + }, + { + "name": "Ethernet3" + }, + { + "name": "Ethernet4" + }, + { + "name": "Ethernet5" + }, + { + "name": "Ethernet6" + }, + { + "name": "Ethernet7" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet9" + }, + { + "name": "Ethernet10" + }, + { + "name": "Ethernet11" + }, + { + "name": "Ethernet12" + }, + { + "name": "Ethernet13" + }, + { + "name": "Ethernet14" + }, + { + "name": "Ethernet15" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet17" + }, + { + "name": "Ethernet18" + }, + { + "name": "Ethernet19" + }, + { + "name": "Ethernet20" + }, + { + "name": "Ethernet21" + }, + { + "name": "Ethernet22" + }, + { + "name": "Ethernet23" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet25" + }, + { + "name": "Ethernet26" + }, + { + "name": "Ethernet27" + }, + { + "name": "Ethernet28" + }, + { + "name": "Ethernet29" + }, + { + "name": "Ethernet30" + }, + { + "name": "Ethernet31" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet33" + }, + { + "name": "Ethernet34" + }, + { + "name": "Ethernet35" + }, + { + "name": "Ethernet36" + }, + { + "name": "Ethernet37" + }, + { + "name": "Ethernet38" + }, + { + "name": "Ethernet39" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet41" + }, + { + "name": "Ethernet42" + }, + { + "name": "Ethernet43" + }, + { + "name": "Ethernet44" + }, + { + "name": "Ethernet45" + }, + { + "name": "Ethernet46" + }, + { + "name": "Ethernet47" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet52" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet60" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet68" + }, + { + "name": "Ethernet72" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0", + "lanes": "1", + "breakout_modes": { + "1x25G[10G]" : [ "Eth0(Port0)" ] + } + }, + "Ethernet1": { + "index": "1", + "lanes": "2", + "breakout_modes": { + "1x25G[10G]" : [ "Eth1(Port1)" ] + } + }, + "Ethernet2": { + "index": "2", + "lanes": "3", + "breakout_modes": { + "1x25G[10G]" : [ "Eth2(Port2)" ] + } + }, + "Ethernet3": { + "index": "3", + "lanes": "4", + "breakout_modes": { + "1x25G[10G]" : [ "Eth3(Port3)" ] + } + }, + "Ethernet4": { + "index": "4", + "lanes": "5", + "breakout_modes": { + "1x25G[10G]" : [ "Eth4(Port4)" ] + } + }, + "Ethernet5": { + "index": "5", + "lanes": "6", + "breakout_modes": { + "1x25G[10G]" : [ "Eth5(Port5)" ] + } + }, + "Ethernet6": { + "index": "6", + "lanes": "7", + "breakout_modes": { + "1x25G[10G]" : [ "Eth6(Port6)" ] + } + }, + "Ethernet7": { + "index": "7", + "lanes": "8", + "breakout_modes": { + "1x25G[10G]" : [ "Eth7(Port7)" ] + } + }, + "Ethernet8": { + "index": "8", + "lanes": "9", + "breakout_modes": { + "1x25G[10G]" : [ "Eth8(Port8)" ] + } + }, + "Ethernet9": { + "index": "9", + "lanes": "10", + "breakout_modes": { + "1x25G[10G]" : [ "Eth9(Port9)" ] + } + }, + "Ethernet10": { + "index": "10", + "lanes": "11", + "breakout_modes": { + "1x25G[10G]" : [ "Eth10(Port10)" ] + } + }, + "Ethernet11": { + "index": "11", + "lanes": "12", + "breakout_modes": { + "1x25G[10G]" : [ "Eth11(Port11)" ] + } + }, + "Ethernet12": { + "index": "12", + "lanes": "13", + "breakout_modes": { + "1x25G[10G]" : [ "Eth12(Port12)" ] + } + }, + "Ethernet13": { + "index": "13", + "lanes": "14", + "breakout_modes": { + "1x25G[10G]" : [ "Eth13(Port13)" ] + } + }, + "Ethernet14": { + "index": "14", + "lanes": "15", + "breakout_modes": { + "1x25G[10G]" : [ "Eth14(Port14)" ] + } + }, + "Ethernet15": { + "index": "15", + "lanes": "16", + "breakout_modes": { + "1x25G[10G]" : [ "Eth15(Port15)" ] + } + }, + "Ethernet16": { + "index": "16", + "lanes": "17", + "breakout_modes": { + "1x25G[10G]" : [ "Eth16(Port16)" ] + } + }, + "Ethernet17": { + "index": "17", + "lanes": "18", + "breakout_modes": { + "1x25G[10G]" : [ "Eth17(Port17)" ] + } + }, + "Ethernet18": { + "index": "18", + "lanes": "19", + "breakout_modes": { + "1x25G[10G]" : [ "Eth18(Port18)" ] + } + }, + "Ethernet19": { + "index": "19", + "lanes": "20", + "breakout_modes": { + "1x25G[10G]" : [ "Eth19(Port19)" ] + } + }, + "Ethernet20": { + "index": "20", + "lanes": "21", + "breakout_modes": { + "1x25G[10G]" : [ "Eth20(Port20)" ] + } + }, + "Ethernet21": { + "index": "21", + "lanes": "22", + "breakout_modes": { + "1x25G[10G]" : [ "Eth21(Port21)" ] + } + }, + "Ethernet22": { + "index": "22", + "lanes": "23", + "breakout_modes": { + "1x25G[10G]" : [ "Eth22(Port22)" ] + } + }, + "Ethernet23": { + "index": "23", + "lanes": "24", + "breakout_modes": { + "1x25G[10G]" : [ "Eth23(Port23)" ] + } + }, + "Ethernet24": { + "index": "24", + "lanes": "25", + "breakout_modes": { + "1x25G[10G]" : [ "Eth24(Port24)" ] + } + }, + "Ethernet25": { + "index": "25", + "lanes": "26", + "breakout_modes": { + "1x25G[10G]" : [ "Eth25(Port25)" ] + } + }, + "Ethernet26": { + "index": "26", + "lanes": "27", + "breakout_modes": { + "1x25G[10G]" : [ "Eth26(Port26)" ] + } + }, + "Ethernet27": { + "index": "27", + "lanes": "28", + "breakout_modes": { + "1x25G[10G]" : [ "Eth27(Port27)" ] + } + }, + "Ethernet28": { + "index": "28", + "lanes": "41", + "breakout_modes": { + "1x25G[10G]" : [ "Eth28(Port28)" ] + } + }, + "Ethernet29": { + "index": "29", + "lanes": "42", + "breakout_modes": { + "1x25G[10G]" : [ "Eth29(Port29)" ] + } + }, + "Ethernet30": { + "index": "30", + "lanes": "43", + "breakout_modes": { + "1x25G[10G]" : [ "Eth30(Port30)" ] + } + }, + "Ethernet31": { + "index": "31", + "lanes": "44", + "breakout_modes": { + "1x25G[10G]" : [ "Eth31(Port31)" ] + } + }, + "Ethernet32": { + "index": "32", + "lanes": "61", + "breakout_modes": { + "1x25G[10G]" : [ "Eth32(Port32)" ] + } + }, + "Ethernet33": { + "index": "33", + "lanes": "62", + "breakout_modes": { + "1x25G[10G]" : [ "Eth33(Port33)" ] + } + }, + "Ethernet34": { + "index": "34", + "lanes": "63", + "breakout_modes": { + "1x25G[10G]" : [ "Eth34(Port34)" ] + } + }, + "Ethernet35": { + "index": "35", + "lanes": "64", + "breakout_modes": { + "1x25G[10G]" : [ "Eth35(Port35)" ] + } + }, + "Ethernet36": { + "index": "36", + "lanes": "65", + "breakout_modes": { + "1x25G[10G]" : [ "Eth36(Port36)" ] + } + }, + "Ethernet37": { + "index": "37", + "lanes": "66", + "breakout_modes": { + "1x25G[10G]" : [ "Eth37(Port37)" ] + } + }, + "Ethernet38": { + "index": "38", + "lanes": "67", + "breakout_modes": { + "1x25G[10G]" : [ "Eth38(Port38)" ] + } + }, + "Ethernet39": { + "index": "39", + "lanes": "68", + "breakout_modes": { + "1x25G[10G]" : [ "Eth39(Port39)" ] + } + }, + "Ethernet40": { + "index": "40", + "lanes": "69", + "breakout_modes": { + "1x25G[10G]" : [ "Eth40(Port40)" ] + } + }, + "Ethernet41": { + "index": "41", + "lanes": "70", + "breakout_modes": { + "1x25G[10G]" : [ "Eth41(Port41)" ] + } + }, + "Ethernet42": { + "index": "42", + "lanes": "71", + "breakout_modes": { + "1x25G[10G]" : [ "Eth42(Port42)" ] + } + }, + "Ethernet43": { + "index": "43", + "lanes": "72", + "breakout_modes": { + "1x25G[10G]" : [ "Eth43(Port43)" ] + } + }, + "Ethernet44": { + "index": "44", + "lanes": "73", + "breakout_modes": { + "1x25G[10G]" : [ "Eth44(Port44)" ] + } + }, + "Ethernet45": { + "index": "45", + "lanes": "74", + "breakout_modes": { + "1x25G[10G]" : [ "Eth45(Port45)" ] + } + }, + "Ethernet46": { + "index": "46", + "lanes": "75", + "breakout_modes": { + "1x25G[10G]" : [ "Eth46(Port46)" ] + } + }, + "Ethernet47": { + "index": "47", + "lanes": "76", + "breakout_modes": { + "1x25G[10G]" : [ "Eth47(Port47)" ] + } + }, + "Ethernet48": { + "index": "48,48,48,48", + "lanes": "37,38,39,40", + "breakout_modes": { + "1x100G[40G]" : [ "Eth48(Port48)" ] + } + }, + "Ethernet52": { + "index": "49,49,49,49", + "lanes": "33,34,35,36", + "breakout_modes": { + "1x100G[40G]" : [ "Eth49(Port49)" ] + } + }, + "Ethernet56": { + "index": "50,50,50,50", + "lanes": "45,46,47,48", + "breakout_modes": { + "1x100G[40G]" : [ "Eth50(Port50)" ] + } + }, + "Ethernet60": { + "index": "51,51,51,51", + "lanes": "49,50,51,52", + "breakout_modes": { + "1x100G[40G]" : [ "Eth51(Port51)" ] + } + }, + "Ethernet64": { + "index": "52,52,52,52", + "lanes": "53,54,55,56", + "breakout_modes": { + "1x100G[40G]" : [ "Eth52(Port52)" ], + "2x50G": ["Eth52/1(Port52)", "Eth52/2(Port52)"], + "4x25G": ["Eth52/1(Port52)", "Eth52/2(Port52)", "Eth52/3(Port52)", "Eth52/4(Port52)"], + "4x10G": ["Eth52/1(Port52)", "Eth52/2(Port52)", "Eth52/3(Port52)", "Eth52/4(Port52)"] + } + }, + "Ethernet68": { + "index": "53,53,53,53", + "lanes": "57,58,59,60", + "breakout_modes": { + "1x100G[40G]" : [ "Eth53(Port53)" ], + "2x50G": ["Eth53/1(Port53)", "Eth53/2(Port53)"], + "4x25G": ["Eth53/1(Port53)", "Eth53/2(Port53)", "Eth53/3(Port53)", "Eth53/4(Port53)"], + "4x10G": ["Eth53/1(Port53)", "Eth53/2(Port53)", "Eth53/3(Port53)", "Eth53/4(Port53)"] + } + } + } +} + diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_asic b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_components.json b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_components.json new file mode 100644 index 000000000000..d122f45806c0 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_components.json @@ -0,0 +1,12 @@ +{ + "chassis": { + "x86_64-ufispace_s8901_54xc-r0": { + "component": { + "CPLD1": { }, + "CPLD2": { }, + "BIOS": { }, + "BMC": {} + } + } + } +} diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_env.conf b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_env.conf new file mode 100644 index 000000000000..77fd88ac3678 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/platform_env.conf @@ -0,0 +1 @@ +SYNCD_SHM_SIZE=256m diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/pmon_daemon_control.json b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..e348e0168fa5 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/pmon_daemon_control.json @@ -0,0 +1,9 @@ +{ + "skip_pcied": false, + "skip_fancontrol": false, + "skip_thermalctld": false, + "skip_ledd": true, + "skip_xcvrd": false, + "skip_psud": false, + "skip_syseepromd": false +} diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/sensors.conf b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/sensors.conf new file mode 100644 index 000000000000..b1a69433405b --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/sensors.conf @@ -0,0 +1 @@ +# libsensors configuration file diff --git a/device/ufispace/x86_64-ufispace_s8901_54xc-r0/system_health_monitoring_config.json b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..467d81304de0 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s8901_54xc-r0/system_health_monitoring_config.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu", + "fan" + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "yellow", + "normal": "green", + "booting": "green_blink" + } +} diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/hwsku.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/hwsku.json new file mode 100644 index 000000000000..52ee4d8e9daa --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/hwsku.json @@ -0,0 +1,136 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet4": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet8": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet12": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet16": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet20": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet24": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet28": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet32": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet36": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet40": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet44": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet48": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet52": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet56": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet60": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet64": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet68": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet72": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet76": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet80": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet84": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet88": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet92": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet96": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet100": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet104": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet108": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet112": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet116": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet120": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet124": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet128": { + "default_brkout_mode": "1x10G" + } + } +} + diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/sai.profile b/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/sai.profile new file mode 100755 index 000000000000..f602ed298f70 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-x7-s9110-32x.config.bcm diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/td3-x7-s9110-32x.config.bcm b/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/td3-x7-s9110-32x.config.bcm new file mode 100755 index 000000000000..94e9aa183a45 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/UFISPACE-S9110-32X/td3-x7-s9110-32x.config.bcm @@ -0,0 +1,671 @@ +# cfg version: r2, 20230713 + +pbmp_xport_xe=0xFFFFFFFFFFFFFFFFFfffffffffffffffe + +# Software config lane swaps + +#FC0 QSFP port 0 +phy_chain_rx_lane_map_physical{1}=0x2310 +phy_chain_tx_lane_map_physical{1}=0x0132 + +#FC1 QSFP port 1 +phy_chain_rx_lane_map_physical{5}=0x3120 +phy_chain_tx_lane_map_physical{5}=0x1203 + +#FC2 QSFP port 2 +phy_chain_rx_lane_map_physical{9}=0x2310 +phy_chain_tx_lane_map_physical{9}=0x0213 + +#FC3 QSFP port 3 +phy_chain_rx_lane_map_physical{13}=0x3120 +phy_chain_tx_lane_map_physical{13}=0x1203 + +#FC4 QSFP port 4 +phy_chain_rx_lane_map_physical{17}=0x2310 +phy_chain_tx_lane_map_physical{17}=0x0132 + +#FC5 QSFP port 5 +phy_chain_rx_lane_map_physical{21}=0x3120 +phy_chain_tx_lane_map_physical{21}=0x1203 + +#FC6 QSFP port 6 +phy_chain_rx_lane_map_physical{25}=0x2310 +phy_chain_tx_lane_map_physical{25}=0x0132 + +#FC7 QSFP port 7 +phy_chain_rx_lane_map_physical{29}=0x3120 +phy_chain_tx_lane_map_physical{29}=0x1203 + +#FC8 QSFP port 8 +phy_chain_rx_lane_map_physical{33}=0x2310 +phy_chain_tx_lane_map_physical{33}=0x0132 + +#FC9 QSFP port 9 +phy_chain_rx_lane_map_physical{37}=0x3120 +phy_chain_tx_lane_map_physical{37}=0x1203 + +#FC10 QSFP port 10 +phy_chain_rx_lane_map_physical{41}=0x2310 +phy_chain_tx_lane_map_physical{41}=0x0132 + +#FC11 QSFP port 11 +phy_chain_rx_lane_map_physical{45}=0x3120 +phy_chain_tx_lane_map_physical{45}=0x1203 + +#FC12 QSFP port 12 +phy_chain_rx_lane_map_physical{49}=0x1320 +phy_chain_tx_lane_map_physical{49}=0x0231 + +#FC13 QSFP port 13 +phy_chain_rx_lane_map_physical{53}=0x3120 +phy_chain_tx_lane_map_physical{53}=0x1203 + +#FC14 QSFP port 14 +phy_chain_rx_lane_map_physical{57}=0x2310 +phy_chain_tx_lane_map_physical{57}=0x0132 + +#FC15 QSFP port 15 +phy_chain_rx_lane_map_physical{61}=0x3120 +phy_chain_tx_lane_map_physical{61}=0x1203 + +#FC16 QSFP port 17 +phy_chain_rx_lane_map_physical{65}=0x3021 +phy_chain_tx_lane_map_physical{65}=0x0312 + +#FC17 QSFP port 16 +phy_chain_rx_lane_map_physical{69}=0x1032 +phy_chain_tx_lane_map_physical{69}=0x3201 + +#FC18 QSFP port 19 +phy_chain_rx_lane_map_physical{73}=0x3021 +phy_chain_tx_lane_map_physical{73}=0x1302 + +#FC19 QSFP port 18 +phy_chain_rx_lane_map_physical{77}=0x2013 +phy_chain_tx_lane_map_physical{77}=0x3210 + +#FC20 QSFP port 21 +phy_chain_rx_lane_map_physical{81}=0x3021 +phy_chain_tx_lane_map_physical{81}=0x1302 + +#FC21 QSFP port 20 +phy_chain_rx_lane_map_physical{85}=0x2031 +phy_chain_tx_lane_map_physical{85}=0x3201 + +#FC22 QSFP port 23 +phy_chain_rx_lane_map_physical{89}=0x3021 +phy_chain_tx_lane_map_physical{89}=0x1302 + +#FC23 QSFP port 22 +phy_chain_rx_lane_map_physical{93}=0x2031 +phy_chain_tx_lane_map_physical{93}=0x3201 + +#FC24 QSFP port 25 +phy_chain_rx_lane_map_physical{97}=0x3021 +phy_chain_tx_lane_map_physical{97}=0x1302 + +#FC25 QSFP port 24 +phy_chain_rx_lane_map_physical{101}=0x2031 +phy_chain_tx_lane_map_physical{101}=0x1302 + +#FC26 QSFP port 27 +phy_chain_rx_lane_map_physical{105}=0x3021 +phy_chain_tx_lane_map_physical{105}=0x1302 + +#FC27 QSFP port 26 +phy_chain_rx_lane_map_physical{109}=0x2031 +phy_chain_tx_lane_map_physical{109}=0x1302 + +#FC28 QSFP port 29 +phy_chain_rx_lane_map_physical{113}=0x2031 +phy_chain_tx_lane_map_physical{113}=0x1302 + +#FC29 QSFP port 28 +phy_chain_rx_lane_map_physical{117}=0x2031 +phy_chain_tx_lane_map_physical{117}=0x1302 + +#FC30 QSFP port 31 +phy_chain_rx_lane_map_physical{121}=0x2031 +phy_chain_tx_lane_map_physical{121}=0x1302 + +#FC31 QSFP port 30 +phy_chain_rx_lane_map_physical{125}=0x2031 +phy_chain_tx_lane_map_physical{125}=0x3201 + +#MC management port (front port) +phy_chain_rx_lane_map_physical{129}=0x3210 +phy_chain_tx_lane_map_physical{129}=0x3210 + + +####### Polarity flips after lane swaps ###### + +#FC0 QSFP port 0 +phy_chain_rx_polarity_flip_physical{1}=0x1 +phy_chain_rx_polarity_flip_physical{2}=0x0 +phy_chain_rx_polarity_flip_physical{3}=0x0 +phy_chain_rx_polarity_flip_physical{4}=0x1 + +phy_chain_tx_polarity_flip_physical{1}=0x1 +phy_chain_tx_polarity_flip_physical{2}=0x0 +phy_chain_tx_polarity_flip_physical{3}=0x0 +phy_chain_tx_polarity_flip_physical{4}=0x1 + +#FC1 QSFP port 1 +phy_chain_rx_polarity_flip_physical{5}=0x0 +phy_chain_rx_polarity_flip_physical{6}=0x0 +phy_chain_rx_polarity_flip_physical{7}=0x1 +phy_chain_rx_polarity_flip_physical{8}=0x1 + +phy_chain_tx_polarity_flip_physical{5}=0x0 +phy_chain_tx_polarity_flip_physical{6}=0x1 +phy_chain_tx_polarity_flip_physical{7}=0x1 +phy_chain_tx_polarity_flip_physical{8}=0x1 + +#FC2 QSFP port 2 +phy_chain_rx_polarity_flip_physical{9}=0x1 +phy_chain_rx_polarity_flip_physical{10}=0x0 +phy_chain_rx_polarity_flip_physical{11}=0x0 +phy_chain_rx_polarity_flip_physical{12}=0x1 + +phy_chain_tx_polarity_flip_physical{9}=0x0 +phy_chain_tx_polarity_flip_physical{10}=0x1 +phy_chain_tx_polarity_flip_physical{11}=0x1 +phy_chain_tx_polarity_flip_physical{12}=0x0 + +#FC3 QSFP port 3 +phy_chain_rx_polarity_flip_physical{13}=0x0 +phy_chain_rx_polarity_flip_physical{14}=0x0 +phy_chain_rx_polarity_flip_physical{15}=0x1 +phy_chain_rx_polarity_flip_physical{16}=0x1 + +phy_chain_tx_polarity_flip_physical{13}=0x0 +phy_chain_tx_polarity_flip_physical{14}=0x1 +phy_chain_tx_polarity_flip_physical{15}=0x1 +phy_chain_tx_polarity_flip_physical{16}=0x1 + +#FC4 QSFP port 4 +phy_chain_rx_polarity_flip_physical{17}=0x1 +phy_chain_rx_polarity_flip_physical{18}=0x0 +phy_chain_rx_polarity_flip_physical{19}=0x0 +phy_chain_rx_polarity_flip_physical{20}=0x1 + +phy_chain_tx_polarity_flip_physical{17}=0x0 +phy_chain_tx_polarity_flip_physical{18}=0x0 +phy_chain_tx_polarity_flip_physical{19}=0x1 +phy_chain_tx_polarity_flip_physical{20}=0x1 + +#FC5 QSFP port 5 +phy_chain_rx_polarity_flip_physical{21}=0x0 +phy_chain_rx_polarity_flip_physical{22}=0x0 +phy_chain_rx_polarity_flip_physical{23}=0x1 +phy_chain_rx_polarity_flip_physical{24}=0x1 + +phy_chain_tx_polarity_flip_physical{21}=0x0 +phy_chain_tx_polarity_flip_physical{22}=0x1 +phy_chain_tx_polarity_flip_physical{23}=0x1 +phy_chain_tx_polarity_flip_physical{24}=0x1 + +#FC6 QSFP port 6 +phy_chain_rx_polarity_flip_physical{25}=0x0 +phy_chain_rx_polarity_flip_physical{26}=0x1 +phy_chain_rx_polarity_flip_physical{27}=0x1 +phy_chain_rx_polarity_flip_physical{28}=0x0 + +phy_chain_tx_polarity_flip_physical{25}=0x1 +phy_chain_tx_polarity_flip_physical{26}=0x0 +phy_chain_tx_polarity_flip_physical{27}=0x0 +phy_chain_tx_polarity_flip_physical{28}=0x0 + +#FC7 QSFP port 7 +phy_chain_rx_polarity_flip_physical{29}=0x1 +phy_chain_rx_polarity_flip_physical{30}=0x1 +phy_chain_rx_polarity_flip_physical{31}=0x0 +phy_chain_rx_polarity_flip_physical{32}=0x0 + +phy_chain_tx_polarity_flip_physical{29}=0x0 +phy_chain_tx_polarity_flip_physical{30}=0x1 +phy_chain_tx_polarity_flip_physical{31}=0x1 +phy_chain_tx_polarity_flip_physical{32}=0x1 + +#FC8 QSFP port 8 +phy_chain_rx_polarity_flip_physical{33}=0x0 +phy_chain_rx_polarity_flip_physical{34}=0x1 +phy_chain_rx_polarity_flip_physical{35}=0x1 +phy_chain_rx_polarity_flip_physical{36}=0x0 + +phy_chain_tx_polarity_flip_physical{33}=0x0 +phy_chain_tx_polarity_flip_physical{34}=0x0 +phy_chain_tx_polarity_flip_physical{35}=0x1 +phy_chain_tx_polarity_flip_physical{36}=0x1 + +#FC9 QSFP port 9 +phy_chain_rx_polarity_flip_physical{37}=0x1 +phy_chain_rx_polarity_flip_physical{38}=0x1 +phy_chain_rx_polarity_flip_physical{39}=0x0 +phy_chain_rx_polarity_flip_physical{40}=0x0 + +phy_chain_tx_polarity_flip_physical{37}=0x0 +phy_chain_tx_polarity_flip_physical{38}=0x1 +phy_chain_tx_polarity_flip_physical{39}=0x1 +phy_chain_tx_polarity_flip_physical{40}=0x1 + +#FC10 QSFP port 10 +phy_chain_rx_polarity_flip_physical{41}=0x0 +phy_chain_rx_polarity_flip_physical{42}=0x1 +phy_chain_rx_polarity_flip_physical{43}=0x1 +phy_chain_rx_polarity_flip_physical{44}=0x0 + +phy_chain_tx_polarity_flip_physical{41}=0x1 +phy_chain_tx_polarity_flip_physical{42}=0x0 +phy_chain_tx_polarity_flip_physical{43}=0x0 +phy_chain_tx_polarity_flip_physical{44}=0x1 + +#FC11 QSFP port 11 +phy_chain_rx_polarity_flip_physical{45}=0x1 +phy_chain_rx_polarity_flip_physical{46}=0x1 +phy_chain_rx_polarity_flip_physical{47}=0x0 +phy_chain_rx_polarity_flip_physical{48}=0x0 + +phy_chain_tx_polarity_flip_physical{45}=0x0 +phy_chain_tx_polarity_flip_physical{46}=0x1 +phy_chain_tx_polarity_flip_physical{47}=0x1 +phy_chain_tx_polarity_flip_physical{48}=0x1 + +#FC12 QSFP port 12 +phy_chain_rx_polarity_flip_physical{49}=0x0 +phy_chain_rx_polarity_flip_physical{50}=0x0 +phy_chain_rx_polarity_flip_physical{51}=0x1 +phy_chain_rx_polarity_flip_physical{52}=0x1 + +phy_chain_tx_polarity_flip_physical{49}=0x1 +phy_chain_tx_polarity_flip_physical{50}=0x0 +phy_chain_tx_polarity_flip_physical{51}=0x0 +phy_chain_tx_polarity_flip_physical{52}=0x1 + +#FC13 QSFP port 13 +phy_chain_rx_polarity_flip_physical{53}=0x0 +phy_chain_rx_polarity_flip_physical{54}=0x0 +phy_chain_rx_polarity_flip_physical{55}=0x1 +phy_chain_rx_polarity_flip_physical{56}=0x1 + +phy_chain_tx_polarity_flip_physical{53}=0x1 +phy_chain_tx_polarity_flip_physical{54}=0x0 +phy_chain_tx_polarity_flip_physical{55}=0x0 +phy_chain_tx_polarity_flip_physical{56}=0x0 + +#FC14 QSFP port 14 +phy_chain_rx_polarity_flip_physical{57}=0x1 +phy_chain_rx_polarity_flip_physical{58}=0x0 +phy_chain_rx_polarity_flip_physical{59}=0x0 +phy_chain_rx_polarity_flip_physical{60}=0x1 + +phy_chain_tx_polarity_flip_physical{57}=0x1 +phy_chain_tx_polarity_flip_physical{58}=0x1 +phy_chain_tx_polarity_flip_physical{59}=0x1 +phy_chain_tx_polarity_flip_physical{60}=0x0 + +#FC15 QSFP port 15 +phy_chain_rx_polarity_flip_physical{61}=0x0 +phy_chain_rx_polarity_flip_physical{62}=0x0 +phy_chain_rx_polarity_flip_physical{63}=0x1 +phy_chain_rx_polarity_flip_physical{64}=0x1 + +phy_chain_tx_polarity_flip_physical{61}=0x1 +phy_chain_tx_polarity_flip_physical{62}=0x0 +phy_chain_tx_polarity_flip_physical{63}=0x0 +phy_chain_tx_polarity_flip_physical{64}=0x0 + +#FC16 QSFP port 17 +phy_chain_rx_polarity_flip_physical{65}=0x1 +phy_chain_rx_polarity_flip_physical{66}=0x1 +phy_chain_rx_polarity_flip_physical{67}=0x0 +phy_chain_rx_polarity_flip_physical{68}=0x0 + +phy_chain_tx_polarity_flip_physical{65}=0x1 +phy_chain_tx_polarity_flip_physical{66}=0x0 +phy_chain_tx_polarity_flip_physical{67}=0x0 +phy_chain_tx_polarity_flip_physical{68}=0x0 + +#FC17 QSFP port 16 +phy_chain_rx_polarity_flip_physical{69}=0x1 +phy_chain_rx_polarity_flip_physical{70}=0x0 +phy_chain_rx_polarity_flip_physical{71}=0x1 +phy_chain_rx_polarity_flip_physical{72}=0x1 + +phy_chain_tx_polarity_flip_physical{69}=0x1 +phy_chain_tx_polarity_flip_physical{70}=0x0 +phy_chain_tx_polarity_flip_physical{71}=0x0 +phy_chain_tx_polarity_flip_physical{72}=0x0 + +#FC18 QSFP port 19 +phy_chain_rx_polarity_flip_physical{73}=0x1 +phy_chain_rx_polarity_flip_physical{74}=0x1 +phy_chain_rx_polarity_flip_physical{75}=0x0 +phy_chain_rx_polarity_flip_physical{76}=0x0 + +phy_chain_tx_polarity_flip_physical{73}=0x1 +phy_chain_tx_polarity_flip_physical{74}=0x1 +phy_chain_tx_polarity_flip_physical{75}=0x0 +phy_chain_tx_polarity_flip_physical{76}=0x1 + +#FC19 QSFP port 18 +phy_chain_rx_polarity_flip_physical{77}=0x0 +phy_chain_rx_polarity_flip_physical{78}=0x0 +phy_chain_rx_polarity_flip_physical{79}=0x1 +phy_chain_rx_polarity_flip_physical{80}=0x1 + +phy_chain_tx_polarity_flip_physical{77}=0x0 +phy_chain_tx_polarity_flip_physical{78}=0x0 +phy_chain_tx_polarity_flip_physical{79}=0x0 +phy_chain_tx_polarity_flip_physical{80}=0x0 + +#FC20 QSFP port 21 +phy_chain_rx_polarity_flip_physical{81}=0x1 +phy_chain_rx_polarity_flip_physical{82}=0x1 +phy_chain_rx_polarity_flip_physical{83}=0x0 +phy_chain_rx_polarity_flip_physical{84}=0x0 + +phy_chain_tx_polarity_flip_physical{81}=0x1 +phy_chain_tx_polarity_flip_physical{82}=0x1 +phy_chain_tx_polarity_flip_physical{83}=0x0 +phy_chain_tx_polarity_flip_physical{84}=0x1 + +#FC21 QSFP port 20 +phy_chain_rx_polarity_flip_physical{85}=0x0 +phy_chain_rx_polarity_flip_physical{86}=0x1 +phy_chain_rx_polarity_flip_physical{87}=0x1 +phy_chain_rx_polarity_flip_physical{88}=0x0 + +phy_chain_tx_polarity_flip_physical{85}=0x0 +phy_chain_tx_polarity_flip_physical{86}=0x0 +phy_chain_tx_polarity_flip_physical{87}=0x1 +phy_chain_tx_polarity_flip_physical{88}=0x0 + +#FC22 QSFP port 23 +phy_chain_rx_polarity_flip_physical{89}=0x1 +phy_chain_rx_polarity_flip_physical{90}=0x1 +phy_chain_rx_polarity_flip_physical{91}=0x0 +phy_chain_rx_polarity_flip_physical{92}=0x0 + +phy_chain_tx_polarity_flip_physical{89}=0x1 +phy_chain_tx_polarity_flip_physical{90}=0x1 +phy_chain_tx_polarity_flip_physical{91}=0x0 +phy_chain_tx_polarity_flip_physical{92}=0x1 + +#FC23 QSFP port 22 +phy_chain_rx_polarity_flip_physical{93}=0x0 +phy_chain_rx_polarity_flip_physical{94}=0x1 +phy_chain_rx_polarity_flip_physical{95}=0x1 +phy_chain_rx_polarity_flip_physical{96}=0x0 + +phy_chain_tx_polarity_flip_physical{93}=0x0 +phy_chain_tx_polarity_flip_physical{94}=0x1 +phy_chain_tx_polarity_flip_physical{95}=0x1 +phy_chain_tx_polarity_flip_physical{96}=0x0 + +#FC24 QSFP port 25 +phy_chain_rx_polarity_flip_physical{97}=0x1 +phy_chain_rx_polarity_flip_physical{98}=0x1 +phy_chain_rx_polarity_flip_physical{99}=0x0 +phy_chain_rx_polarity_flip_physical{100}=0x0 + +phy_chain_tx_polarity_flip_physical{97}=0x1 +phy_chain_tx_polarity_flip_physical{98}=0x1 +phy_chain_tx_polarity_flip_physical{99}=0x0 +phy_chain_tx_polarity_flip_physical{100}=0x1 + +#FC25 QSFP port 24 +phy_chain_rx_polarity_flip_physical{101}=0x0 +phy_chain_rx_polarity_flip_physical{102}=0x1 +phy_chain_rx_polarity_flip_physical{103}=0x1 +phy_chain_rx_polarity_flip_physical{104}=0x0 + +phy_chain_tx_polarity_flip_physical{101}=0x1 +phy_chain_tx_polarity_flip_physical{102}=0x0 +phy_chain_tx_polarity_flip_physical{103}=0x0 +phy_chain_tx_polarity_flip_physical{104}=0x1 + +#FC26 QSFP port 27 +phy_chain_rx_polarity_flip_physical{105}=0x0 +phy_chain_rx_polarity_flip_physical{106}=0x0 +phy_chain_rx_polarity_flip_physical{107}=0x1 +phy_chain_rx_polarity_flip_physical{108}=0x1 + +phy_chain_tx_polarity_flip_physical{105}=0x1 +phy_chain_tx_polarity_flip_physical{106}=0x1 +phy_chain_tx_polarity_flip_physical{107}=0x0 +phy_chain_tx_polarity_flip_physical{108}=0x1 + +#FC27 QSFP port 26 +phy_chain_rx_polarity_flip_physical{109}=0x1 +phy_chain_rx_polarity_flip_physical{110}=0x0 +phy_chain_rx_polarity_flip_physical{111}=0x0 +phy_chain_rx_polarity_flip_physical{112}=0x1 + +phy_chain_tx_polarity_flip_physical{109}=0x1 +phy_chain_tx_polarity_flip_physical{110}=0x0 +phy_chain_tx_polarity_flip_physical{111}=0x0 +phy_chain_tx_polarity_flip_physical{112}=0x0 + +#FC28 QSFP port 29 +phy_chain_rx_polarity_flip_physical{113}=0x0 +phy_chain_rx_polarity_flip_physical{114}=0x1 +phy_chain_rx_polarity_flip_physical{115}=0x1 +phy_chain_rx_polarity_flip_physical{116}=0x0 + +phy_chain_tx_polarity_flip_physical{113}=0x1 +phy_chain_tx_polarity_flip_physical{114}=0x1 +phy_chain_tx_polarity_flip_physical{115}=0x0 +phy_chain_tx_polarity_flip_physical{116}=0x1 + +#FC29 QSFP port 28 +phy_chain_rx_polarity_flip_physical{117}=0x1 +phy_chain_rx_polarity_flip_physical{118}=0x0 +phy_chain_rx_polarity_flip_physical{119}=0x0 +phy_chain_rx_polarity_flip_physical{120}=0x1 + +phy_chain_tx_polarity_flip_physical{117}=0x1 +phy_chain_tx_polarity_flip_physical{118}=0x0 +phy_chain_tx_polarity_flip_physical{119}=0x0 +phy_chain_tx_polarity_flip_physical{120}=0x1 + +#FC30 QSFP port 31 +phy_chain_rx_polarity_flip_physical{121}=0x1 +phy_chain_rx_polarity_flip_physical{122}=0x1 +phy_chain_rx_polarity_flip_physical{123}=0x0 +phy_chain_rx_polarity_flip_physical{124}=0x0 + +phy_chain_tx_polarity_flip_physical{121}=0x1 +phy_chain_tx_polarity_flip_physical{122}=0x1 +phy_chain_tx_polarity_flip_physical{123}=0x0 +phy_chain_tx_polarity_flip_physical{124}=0x1 + +#FC31 QSFP port 30 +phy_chain_rx_polarity_flip_physical{125}=0x1 +phy_chain_rx_polarity_flip_physical{126}=0x0 +phy_chain_rx_polarity_flip_physical{127}=0x0 +phy_chain_rx_polarity_flip_physical{128}=0x1 + +phy_chain_tx_polarity_flip_physical{125}=0x0 +phy_chain_tx_polarity_flip_physical{126}=0x0 +phy_chain_tx_polarity_flip_physical{127}=0x1 +phy_chain_tx_polarity_flip_physical{128}=0x0 + +#MC +phy_chain_rx_polarity_flip_physical{129}=0x0 +phy_chain_rx_polarity_flip_physical{130}=0x0 +phy_chain_rx_polarity_flip_physical{131}=0x0 +phy_chain_rx_polarity_flip_physical{132}=0x0 + +phy_chain_tx_polarity_flip_physical{129}=0x0 +phy_chain_tx_polarity_flip_physical{130}=0x0 +phy_chain_tx_polarity_flip_physical{131}=0x0 +phy_chain_tx_polarity_flip_physical{132}=0x0 + + +#Portmap setting +#FC0 QSFP port 0 +portmap_1=1:100 + +#FC1 QSFP port 1 +portmap_5=5:100 + +#FC2 QSFP port 2 +portmap_9=9:100 + +#FC3 QSFP port 3 +portmap_13=13:100 + +#FC4 QSFP port 4 +portmap_17=17:100 + +#FC5 QSFP port 5 +portmap_21=21:100 + +#FC6 QSFP port 6 +portmap_25=25:100 + +#FC7 QSFP port 7 +portmap_29=29:100 + +#FC8 QSFP port 8 +portmap_33=33:100 + +#FC9 QSFP port 9 +portmap_37=37:100 + +#FC10 QSFP port 10 +portmap_41=41:100 + +#FC11 QSFP port 11 +portmap_45=45:100 + +#FC12 QSFP port 12 +portmap_49=49:100 + +#FC13 QSFP port 13 +portmap_53=53:100 + +#FC14 QSFP port 14 +portmap_57=57:100 + +#FC15 QSFP port 15 +portmap_61=61:100 + +#MC port 66 - management port (front port) +portmap_66=129:10:m + + +#FC16 QSFP port 17 +portmap_67=65:100 + +#FC17 QSFP port 16 +portmap_71=69:100 + +#FC18 QSFP port 19 +portmap_75=73:100 + +#FC19 QSFP port 18 +portmap_79=77:100 + +#FC20 QSFP port 21 +portmap_83=81:100 + +#FC21 QSFP port 20 +portmap_87=85:100 + +#FC22 QSFP port 23 +portmap_91=89:100 + +#FC23 QSFP port 22 +portmap_95=93:100 + +#FC24 QSFP port 25 +portmap_99=97:100 + +#FC25 QSFP port 24 +portmap_103=101:100 + +#FC26 QSFP port 27 +portmap_107=105:100 + +#FC27 QSFP port 26 +portmap_111=109:100 + +#FC28 QSFP port 29 +portmap_115=113:100 + +#FC29 QSFP port 28 +portmap_119=117:100 + +#FC30 QSFP port 31 +portmap_123=121:100 + +#FC31 QSFP port 30 +portmap_127=125:100 + + +dport_map_enable=1 + +dport_map_port_1=1 +dport_map_port_5=2 +dport_map_port_9=3 +dport_map_port_13=4 +dport_map_port_17=5 +dport_map_port_21=6 +dport_map_port_25=7 +dport_map_port_29=8 +dport_map_port_33=9 +dport_map_port_37=10 +dport_map_port_41=11 +dport_map_port_45=12 +dport_map_port_49=13 +dport_map_port_53=14 +dport_map_port_57=15 +dport_map_port_61=16 +dport_map_port_71=17 +dport_map_port_67=18 +dport_map_port_79=19 +dport_map_port_75=20 +dport_map_port_87=21 +dport_map_port_83=22 +dport_map_port_95=23 +dport_map_port_91=24 +dport_map_port_103=25 +dport_map_port_99=26 +dport_map_port_111=27 +dport_map_port_107=28 +dport_map_port_119=29 +dport_map_port_115=30 +dport_map_port_127=31 +dport_map_port_123=32 +dport_map_port_66=33 + + +core_clock_frequency=1525 +dpp_clock_ratio=2:3 +oversubscribe_mode=1 +parity_enable=0 +mem_cache_enable=0 +l2_mem_entries=32768 +l3_mem_entries=16384 +fpem_mem_entries=131072 +l2xmsg_mode=1 +bcm_num_cos=10 +bcm_stat_interval=2000000 +cdma_timeout_usec=3000000 +ipv6_lpm_128b_enable=0x1 +l3_max_ecmp_mode=1 +lpm_scaling_enable=0 +max_vp_lags=0 +miim_intr_enable=0 +module_64ports=1 +schan_intr_enable=0 +stable_size=0x5500000 +tdma_timeout_usec=3000000 +skip_L2_USER_ENTRY=0 +bcm_tunnel_term_compatible_mode=1 +ifp_inports_support_enable=1 +port_flex_enable=1 + + diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/custom_led.bin b/device/ufispace/x86_64-ufispace_s9110_32x-r0/custom_led.bin new file mode 100755 index 0000000000000000000000000000000000000000..82315db109edeb939dfa87e5a89513c04c7b097a GIT binary patch literal 640 zcmY+%F-rnb00;2*^cqAO8XBY;?oNY{hKitw=hbTK!tMf`uD|$7kw0@h;_M7_qmTr12{H!_hl*xFBNlj36;+NuaoWyC| zaitAyVkdTT<9xpA+4yNs2r1^}aJGcA0?u5VZQyJRXZtu?z}X_smT|U*vl7lWakh)I tL!6!9>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU1-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU1-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x5a", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x1", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x10", + "attr_cmpval":"0x10", + "attr_len":"1" + } + ] + } + }, + "PSU2": { + "dev_info": { + "device_type": "PSU", + "device_name": "PSU2", + "device_parent": "MUX1" + }, + "dev_attr": { + "dev_idx": "2", + "num_psu_fans": "1" + }, + "i2c": { + "interface": [ + { "itf":"eeprom", "dev":"PSU2-EEPROM" } + ] + }, + "bmc": { + "ipmitool": { + "attr_list": + [ + { + "attr_name": "psu_v_out", + "bmc_cmd": "ipmitool sdr get -c PSU1_VOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_VOUT", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_i_out", + "bmc_cmd": "ipmitool sdr get -c PSU1_IOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_IOUT", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_temp1_input", + "bmc_cmd": "ipmitool sdr get -c PSU1_TEMP1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_TEMP1", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_fan1_speed_rpm", + "bmc_cmd": "ipmitool sdr get -c PSU1_FAN1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_FAN1", + "field_pos": "2" + }, + { + "attr_name": "psu_mfr_id", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU2-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU2-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x5b", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x2", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x20", + "attr_cmpval":"0x20", + "attr_len":"1" + } + ] + } + }, + "FAN-CTRL": { + "dev_info": { + "device_type": "FAN", + "device_name": "FAN-CTRL", + "device_parent": "" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "fan1_present", + "bmc_cmd": "ipmitool sdr get -c FAN0_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN0_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan2_present", + "bmc_cmd": "ipmitool sdr get -c FAN0_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN0_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan3_present", + "bmc_cmd": "ipmitool sdr get -c FAN1_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN1_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan4_present", + "bmc_cmd": "ipmitool sdr get -c FAN1_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN1_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan5_present", + "bmc_cmd": "ipmitool sdr get -c FAN2_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN2_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan6_present", + "bmc_cmd": "ipmitool sdr get -c FAN2_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN2_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan7_present", + "bmc_cmd": "ipmitool sdr get -c FAN3_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN3_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan8_present", + "bmc_cmd": "ipmitool sdr get -c FAN3_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN3_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan1_input", + "bmc_cmd": "ipmitool sdr get -c FAN0_RPM_F | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN0_RPM_F", + "field_pos": "2" + }, + { + "attr_name": "fan2_input", + "bmc_cmd": "ipmitool sdr get -c FAN0_RPM_R | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN0_RPM_R", + "field_pos": "2" + }, + { + "attr_name": "fan3_input", + "bmc_cmd": "ipmitool sdr get -c FAN1_RPM_F | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN1_RPM_F", + "field_pos": "2" + }, + { + "attr_name": "fan4_input", + "bmc_cmd": "ipmitool sdr get -c FAN1_RPM_R | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN1_RPM_R", + "field_pos": "2" + }, + { + "attr_name": "fan5_input", + "bmc_cmd": "ipmitool sdr get -c FAN2_RPM_F | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN2_RPM_F", + "field_pos": "2" + }, + { + "attr_name": "fan6_input", + "bmc_cmd": "ipmitool sdr get -c FAN2_RPM_R | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN2_RPM_R", + "field_pos": "2" + }, + { + "attr_name": "fan7_input", + "bmc_cmd": "ipmitool sdr get -c FAN3_RPM_F | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN3_RPM_F", + "field_pos": "2" + }, + { + "attr_name": "fan8_input", + "bmc_cmd": "ipmitool sdr get -c FAN3_RPM_R | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN3_RPM_R", + "field_pos": "2" + }, + { + "attr_name": "fan1_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan2_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan3_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan4_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan5_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f3", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan6_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f3", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan7_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f4", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan8_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f4", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "SYS_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "SYS_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "off", + "bits": "7:6", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + } + ] + } + }, + "FAN_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "FAN_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + } + ] + } + }, + "PSU1_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "PSU2_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "1", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "7", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "ID_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "LOC_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "blue", + "bits": "3:1", + "descr": "Blue", + "value": "0x04;0x05", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "blue_blink", + "bits": "3:1", + "descr": "Blue Blinking", + "value": "0x06;0x07", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "off", + "bits": "3:2", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + } + ] + } + }, + "PORT1": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT1", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "1" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT1-EEPROM" + }, + { + "itf": "control", + "dev": "PORT1-CTRL" + } + ] + } + }, + "PORT1-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x12", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT1-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x12", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT2": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT2", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "2" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT2-EEPROM" + }, + { + "itf": "control", + "dev": "PORT2-CTRL" + } + ] + } + }, + "PORT2-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x13", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT2-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x13", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT3": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT3", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "3" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT3-EEPROM" + }, + { + "itf": "control", + "dev": "PORT3-CTRL" + } + ] + } + }, + "PORT3-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x14", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT3-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x14", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT4": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT4", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "4" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT4-EEPROM" + }, + { + "itf": "control", + "dev": "PORT4-CTRL" + } + ] + } + }, + "PORT4-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x15", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT4-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x15", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT5": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT5", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "5" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT5-EEPROM" + }, + { + "itf": "control", + "dev": "PORT5-CTRL" + } + ] + } + }, + "PORT5-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x16", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT5-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x16", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT6": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT6", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "6" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT6-EEPROM" + }, + { + "itf": "control", + "dev": "PORT6-CTRL" + } + ] + } + }, + "PORT6-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x17", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT6-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x17", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT7": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT7", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "7" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT7-EEPROM" + }, + { + "itf": "control", + "dev": "PORT7-CTRL" + } + ] + } + }, + "PORT7-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x18", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT7-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x18", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT8": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT8", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "8" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT8-EEPROM" + }, + { + "itf": "control", + "dev": "PORT8-CTRL" + } + ] + } + }, + "PORT8-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x19", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT8-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x19", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT9": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT9", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "9" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT9-EEPROM" + }, + { + "itf": "control", + "dev": "PORT9-CTRL" + } + ] + } + }, + "PORT9-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1A", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT9-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1A", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT10": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT10", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "10" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT10-EEPROM" + }, + { + "itf": "control", + "dev": "PORT10-CTRL" + } + ] + } + }, + "PORT10-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1B", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT10-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1B", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT11": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT11", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "11" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT11-EEPROM" + }, + { + "itf": "control", + "dev": "PORT11-CTRL" + } + ] + } + }, + "PORT11-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1C", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT11-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1C", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT12": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT12", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "12" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT12-EEPROM" + }, + { + "itf": "control", + "dev": "PORT12-CTRL" + } + ] + } + }, + "PORT12-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1D", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT12-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1D", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT13": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT13", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "13" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT13-EEPROM" + }, + { + "itf": "control", + "dev": "PORT13-CTRL" + } + ] + } + }, + "PORT13-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1E", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT13-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1E", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT14": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT14", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "14" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT14-EEPROM" + }, + { + "itf": "control", + "dev": "PORT14-CTRL" + } + ] + } + }, + "PORT14-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1F", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT14-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1F", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT15": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT15", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "15" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT15-EEPROM" + }, + { + "itf": "control", + "dev": "PORT15-CTRL" + } + ] + } + }, + "PORT15-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT15-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT16": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT16", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "16" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT16-EEPROM" + }, + { + "itf": "control", + "dev": "PORT16-CTRL" + } + ] + } + }, + "PORT16-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT16-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT17": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT17", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "17" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT17-EEPROM" + }, + { + "itf": "control", + "dev": "PORT17-CTRL" + } + ] + } + }, + "PORT17-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT17-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT18": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT18", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "18" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT18-EEPROM" + }, + { + "itf": "control", + "dev": "PORT18-CTRL" + } + ] + } + }, + "PORT18-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT18-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT19": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT19", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "19" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT19-EEPROM" + }, + { + "itf": "control", + "dev": "PORT19-CTRL" + } + ] + } + }, + "PORT19-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT19-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT20": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT20", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "20" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT20-EEPROM" + }, + { + "itf": "control", + "dev": "PORT20-CTRL" + } + ] + } + }, + "PORT20-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT20-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT21": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT21", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "21" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT21-EEPROM" + }, + { + "itf": "control", + "dev": "PORT21-CTRL" + } + ] + } + }, + "PORT21-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT21-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT22": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT22", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "22" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT22-EEPROM" + }, + { + "itf": "control", + "dev": "PORT22-CTRL" + } + ] + } + }, + "PORT22-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT22-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT23": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT23", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "23" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT23-EEPROM" + }, + { + "itf": "control", + "dev": "PORT23-CTRL" + } + ] + } + }, + "PORT23-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT23-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT24": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT24", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "24" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT24-EEPROM" + }, + { + "itf": "control", + "dev": "PORT24-CTRL" + } + ] + } + }, + "PORT24-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT24-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT25": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT25", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "25" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT25-EEPROM" + }, + { + "itf": "control", + "dev": "PORT25-CTRL" + } + ] + } + }, + "PORT25-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2A", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT25-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2A", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT26": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT26", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "26" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT26-EEPROM" + }, + { + "itf": "control", + "dev": "PORT26-CTRL" + } + ] + } + }, + "PORT26-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2B", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT26-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2B", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT27": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT27", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "27" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT27-EEPROM" + }, + { + "itf": "control", + "dev": "PORT27-CTRL" + } + ] + } + }, + "PORT27-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2C", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT27-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2C", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT28": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT28", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "28" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT28-EEPROM" + }, + { + "itf": "control", + "dev": "PORT28-CTRL" + } + ] + } + }, + "PORT28-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2D", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT28-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2D", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT29": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT29", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "29" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT29-EEPROM" + }, + { + "itf": "control", + "dev": "PORT29-CTRL" + } + ] + } + }, + "PORT29-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2E", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT29-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2E", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT30": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT30", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "30" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT30-EEPROM" + }, + { + "itf": "control", + "dev": "PORT30-CTRL" + } + ] + } + }, + "PORT30-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2F", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT30-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2F", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT31": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT31", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "31" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT31-EEPROM" + }, + { + "itf": "control", + "dev": "PORT31-CTRL" + } + ] + } + }, + "PORT31-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT31-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT32": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT32", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "32" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT32-EEPROM" + }, + { + "itf": "control", + "dev": "PORT32-CTRL" + } + ] + } + }, + "PORT32-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT32-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT33": { + "dev_info": { + "device_type": "SFP", + "device_name": "PORT33", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "33" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT33-EEPROM" + }, + { + "itf": "control", + "dev": "PORT33-CTRL" + } + ] + } + }, + "PORT33-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT33", + "device_parent": "MUX7", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT33-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT33-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x18", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x19", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x1A", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + } + +} diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device-pvt.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device-pvt.json new file mode 100644 index 000000000000..4f86b045c858 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device-pvt.json @@ -0,0 +1,4585 @@ +{ + "PLATFORM": { + "num_psus": 2, + "num_fantrays": 3, + "num_fans_pertray": 2, + "num_ports": 33, + "num_temps": 7, + "pddf_dev_types": { + "description": "PDDF supported devices", + "CPLD": [ + "i2c_cpld" + ], + "PSU": [ + "psu_eeprom", + "psu_pmbus" + ], + "PORT_MODULE": [ + "pddf_xcvr" + ] + }, + "std_kos": [ + "i2c_i801", + "i2c-ismt", + "i2c_dev", + "i2c_mux_pca954x", + "optoe" + ], + "pddf_kos": [ + "pddf_client_module", + "pddf_cpld_module", + "pddf_cpld_driver", + "pddf_mux_module", + "pddf_xcvr_module", + "pddf_xcvr_driver_module", + "pddf_psu_driver_module", + "pddf_psu_module", + "pddf_fan_driver_module", + "pddf_fan_module", + "pddf_led_module" + ], + "custom_kos": [ + "x86-64-ufispace-s9110-32x-lpc", + "x86-64-ufispace-s9110-32x-sys-eeprom", + "pddf_custom_sysstatus_module" + ] + }, + "SYSTEM": { + "dev_info": { + "device_type": "CPU", + "device_name": "ROOT_COMPLEX", + "device_parent": null + }, + "i2c": { + "CONTROLLERS": [ + { + "dev_name": "i2c-1", + "dev": "SMBUS1" + }, + { + "dev_name": "i2c-0", + "dev": "SMBUS0" + } + ] + } + }, + "SMBUS1": { + "dev_info": { + "device_type": "SMBUS", "device_name": "SMBUS1", "device_parent": "SYSTEM" + }, + "i2c": { + "topo_info": { + "dev_addr": "0x1" + }, + "DEVICES": [ + { + "dev": "EEPROM1" + }, + { + "dev": "MUX1" + } + ] + } + }, + "EEPROM1": { + "dev_info": { + "device_type": "EEPROM", + "device_name": "EEPROM1", + "device_parent": "SMBUS1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1", + "dev_addr": "0x57", + "dev_type": "sys_eeprom" + }, + "dev_attr": { + "access_mode": "BLOCK" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "MUX1": { + "dev_info": { "device_type": "MUX", "device_name": "MUX1", "device_parent": "SMBUS1"}, + "i2c": { + "topo_info": { + "parent_bus": "0x1", + "dev_addr": "0x70", + "dev_type": "pca9548" + }, + "dev_attr": { + "virt_bus": "0x2", + "idle_state": "-2" + }, + "channel": [ + { + "chn": "0", + "dev": "CPLD1" + }, + { + "chn": "0", + "dev": "CPLD2" + }, + { + "chn": "0", + "dev": "PSU1" + }, + { + "chn": "0", + "dev": "PSU2" + } + ] + } + }, + "CPLD1": { + "dev_info": { + "device_type": "CPLD", + "device_name": "CPLD1", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x30", + "dev_type": "i2c_cpld" + }, + "dev_attr": {} + } + }, + "CPLD2": { + "dev_info": { + "device_type": "CPLD", + "device_name": "CPLD2", + "device_parent": "MUX1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x31", + "dev_type": "i2c_cpld" + }, + "dev_attr": {} + } + }, + "SMBUS0": { + "dev_info": { + "device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM" + }, + "i2c": { + "topo_info": { + "dev_addr": "0x0" + }, + "DEVICES": [ + { + "dev": "MUX2" + } + ] + } + }, + "MUX2": { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x72", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0xa", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"MUX3" }, + { "chn":"1", "dev":"MUX4" }, + { "chn":"2", "dev":"MUX5" }, + { "chn":"3", "dev":"MUX6" }, + { "chn":"4", "dev":"MUX7" } + ] + } + }, + "MUX3": { + "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"MUX2"}, + "i2c": { + "topo_info": { "parent_bus":"0xa", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x12", "idle_state":"-2"}, + "channel": [ + { "chn":"0", "dev":"PORT1" }, + { "chn":"1", "dev":"PORT2" }, + { "chn":"2", "dev":"PORT3" }, + { "chn":"3", "dev":"PORT4" }, + { "chn":"4", "dev":"PORT5" }, + { "chn":"5", "dev":"PORT6" }, + { "chn":"6", "dev":"PORT7" }, + { "chn":"7", "dev":"PORT8" } + ] + } + }, + "MUX4": { + "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"MUX2"}, + "i2c": { + "topo_info": { "parent_bus":"0xb", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x1a", "idle_state":"-2"}, + "channel": [ + { "chn":"0", "dev":"PORT9" }, + { "chn":"1", "dev":"PORT10" }, + { "chn":"2", "dev":"PORT11" }, + { "chn":"3", "dev":"PORT12" }, + { "chn":"4", "dev":"PORT13" }, + { "chn":"5", "dev":"PORT14" }, + { "chn":"6", "dev":"PORT15" }, + { "chn":"7", "dev":"PORT16" } + ] + } + }, + "MUX5": { + "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"MUX2"}, + "i2c": { + "topo_info": { "parent_bus":"0xc", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x22", "idle_state":"-2"}, + "channel": [ + { "chn":"0", "dev":"PORT17" }, + { "chn":"1", "dev":"PORT18" }, + { "chn":"2", "dev":"PORT19" }, + { "chn":"3", "dev":"PORT20" }, + { "chn":"4", "dev":"PORT21" }, + { "chn":"5", "dev":"PORT22" }, + { "chn":"6", "dev":"PORT23" }, + { "chn":"7", "dev":"PORT24" } + ] + } + }, + "MUX6": { + "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"MUX2"}, + "i2c": { + "topo_info": { "parent_bus":"0xd", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x2a", "idle_state":"-2"}, + "channel": [ + { "chn":"0", "dev":"PORT25" }, + { "chn":"1", "dev":"PORT26" }, + { "chn":"2", "dev":"PORT27" }, + { "chn":"3", "dev":"PORT28" }, + { "chn":"4", "dev":"PORT29" }, + { "chn":"5", "dev":"PORT30" }, + { "chn":"6", "dev":"PORT31" }, + { "chn":"7", "dev":"PORT32" } + ] + } + }, + "MUX7": { + "dev_info": { "device_type":"MUX", "device_name":"MUX7", "device_parent":"MUX2"}, + "i2c": { + "topo_info": { "parent_bus":"0xe", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x32", "idle_state":"-2"}, + "channel": [ + { "chn":"1", "dev":"PORT33" } + ] + } + }, + "TEMP1": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP1", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "TEMP_MAC" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sdr get -c TEMP_MAC", + "raw": "0", + "separator": ",", + "field_name": "TEMP_MAC", + "field_pos": "2" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_MAC", + "raw": "0", + "separator": ",", + "field_name": "TEMP_MAC", + "field_pos": "13" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_MAC", + "raw": "0", + "separator": ",", + "field_name": "TEMP_MAC", + "field_pos": "12" + } + ] + } + } + }, + "TEMP2": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP2", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "TEMP_ENV_MACCASE" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_MACCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_MACCASE", + "field_pos": "2" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_MACCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_MACCASE", + "field_pos": "13" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_MACCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_MACCASE", + "field_pos": "12" + } + ] + } + } + }, + "TEMP3": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP3", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "TEMP_ENV_SSDCASE" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_SSDCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_SSDCASE", + "field_pos": "2" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_SSDCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_SSDCASE", + "field_pos": "13" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_SSDCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_SSDCASE", + "field_pos": "12" + } + ] + } + } + }, + "TEMP4": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP4", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "TEMP_ENV_PSUCASE" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_PSUCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_PSUCASE", + "field_pos": "2" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_PSUCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_PSUCASE", + "field_pos": "13" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_PSUCASE", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_PSUCASE", + "field_pos": "12" + } + ] + } + } + }, + "TEMP5": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP5", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "TEMP_ENV_BMC" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_BMC", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_BMC", + "field_pos": "2" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_BMC", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_BMC", + "field_pos": "13" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sdr get -c TEMP_ENV_BMC", + "raw": "0", + "separator": ",", + "field_name": "TEMP_ENV_BMC", + "field_pos": "12" + } + ] + } + } + }, + "TEMP6": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP6", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "TEMP_PSU0_TEMP1" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sdr get -c PSU0_TEMP1 | sed -e 's/,,/,0,/g' -e 's/,,/,0,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU0_TEMP1", + "field_pos": "2" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sdr get -c PSU0_TEMP1", + "raw": "0", + "separator": ",", + "field_name": "PSU0_TEMP1", + "field_pos": "13" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sdr get -c PSU0_TEMP1", + "raw": "0", + "separator": ",", + "field_name": "PSU0_TEMP1", + "field_pos": "12" + } + ] + } + } + }, + "TEMP7": { + "dev_info": { + "device_type": "TEMP_SENSOR", + "device_name": "TEMP7", + "device_parent": "SMBUS0" + }, + "dev_attr": { + "display_name": "TEMP_PSU1_TEMP1" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "temp1_input", + "bmc_cmd": "ipmitool sdr get -c PSU1_TEMP1 | sed -e 's/,,/,0,/g' -e 's/,,/,0,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_TEMP1", + "field_pos": "2" + }, + { + "attr_name": "temp1_high_threshold", + "bmc_cmd": "ipmitool sdr get -c PSU1_TEMP1", + "raw": "0", + "separator": ",", + "field_name": "PSU1_TEMP1", + "field_pos": "13" + }, + { + "attr_name": "temp1_high_crit_threshold", + "bmc_cmd": "ipmitool sdr get -c PSU1_TEMP1", + "raw": "0", + "separator": ",", + "field_name": "PSU1_TEMP1", + "field_pos": "12" + } + ] + } + } + }, + "SYSSTATUS": { + "dev_info": { + "device_type": "SYSSTAT", + "device_name": "SYSSTATUS" + }, + "dev_attr": {}, + "attr_list": + [ + { + "attr_name": "board_sku_id", + "attr_devaddr": "0x30", + "attr_offset": "0x0", + "attr_mask": "0xff", + "attr_len": "0x1" + }, + { + "attr_name": "board_hw_id", + "attr_devaddr": "0x30", + "attr_offset": "0x1", + "attr_mask": "0x03", + "attr_len": "0x1" + }, + { + "attr_name": "board_deph_id", + "attr_devaddr": "0x30", + "attr_offset": "0x1", + "attr_mask": "0x4", + "attr_len": "0x1" + }, + { + "attr_name": "board_build_id", + "attr_devaddr": "0x30", + "attr_offset": "0x1", + "attr_mask": "0x18", + "attr_len": "0x1" + }, + { + "attr_name": "cpld1_major_ver", + "attr_devaddr": "0x30", + "attr_offset": "0x2", + "attr_mask": "0xc0", + "attr_len": "0x1" + }, + { + "attr_name": "cpld1_minor_ver", + "attr_devaddr": "0x30", + "attr_offset": "0x2", + "attr_mask": "0x3f", + "attr_len": "0x1" + }, + { + "attr_name": "cpld1_build", + "attr_devaddr": "0x30", + "attr_offset": "0x4", + "attr_mask": "0xff", + "attr_len": "0x1" + }, + { + "attr_name": "cpld2_major_ver", + "attr_devaddr": "0x31", + "attr_offset": "0x2", + "attr_mask": "0xc0", + "attr_len": "0x1" + }, + { + "attr_name": "cpld2_minor_ver", + "attr_devaddr": "0x31", + "attr_offset": "0x2", + "attr_mask": "0x3f", + "attr_len": "0x1" + }, + { + "attr_name": "cpld2_build", + "attr_devaddr": "0x31", + "attr_offset": "0x4", + "attr_mask": "0xff", + "attr_len": "0x1" + }, + { + "attr_name": "psu_status", + "attr_devaddr": "0x30", + "attr_offset": "0x51", + "attr_mask": "0xff", + "attr_len": "0x1" + }, + { + "attr_name": "system_led_psu", + "attr_devaddr": "0x30", + "attr_offset": "0x80", + "attr_mask": "0xff", + "attr_len": "0x1" + }, + { + "attr_name": "system_led_sys", + "attr_devaddr": "0x30", + "attr_offset": "0x81", + "attr_mask": "0xff", + "attr_len": "0x1" + }, + { + "attr_name": "system_led_fan", + "attr_devaddr": "0x30", + "attr_offset": "0x83", + "attr_mask": "0xff", + "attr_len": "0x1" + }, + { + "attr_name": "system_led_id", + "attr_devaddr": "0x30", + "attr_offset": "0x84", + "attr_mask": "0xff", + "attr_len": "0x1" + } + ] + }, + "PSU1": { + "dev_info": { + "device_type": "PSU", + "device_name": "PSU1", + "device_parent": "MUX1" + }, + "dev_attr": { + "dev_idx": "1", + "num_psu_fans": "1" + }, + "i2c": { + "interface": [ + { "itf":"eeprom", "dev":"PSU1-EEPROM" } + ] + }, + "bmc": { + "ipmitool": { + "attr_list": + [ + { + "attr_name": "psu_v_out", + "bmc_cmd": "ipmitool sdr get -c PSU0_VOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU0_VOUT", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_i_out", + "bmc_cmd": "ipmitool sdr get -c PSU0_IOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU0_IOUT", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_temp1_input", + "bmc_cmd": "ipmitool sdr get -c PSU0_TEMP1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU0_TEMP1", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_fan1_speed_rpm", + "bmc_cmd": "ipmitool sdr get -c PSU0_FAN1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU0_FAN1", + "field_pos": "2" + }, + { + "attr_name": "psu_mfr_id", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 1 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU1-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU1-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x5a", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x1", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x10", + "attr_cmpval":"0x10", + "attr_len":"1" + } + ] + } + }, + "PSU2": { + "dev_info": { + "device_type": "PSU", + "device_name": "PSU2", + "device_parent": "MUX1" + }, + "dev_attr": { + "dev_idx": "2", + "num_psu_fans": "1" + }, + "i2c": { + "interface": [ + { "itf":"eeprom", "dev":"PSU2-EEPROM" } + ] + }, + "bmc": { + "ipmitool": { + "attr_list": + [ + { + "attr_name": "psu_v_out", + "bmc_cmd": "ipmitool sdr get -c PSU1_VOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_VOUT", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_i_out", + "bmc_cmd": "ipmitool sdr get -c PSU1_IOUT | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_IOUT", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_temp1_input", + "bmc_cmd": "ipmitool sdr get -c PSU1_TEMP1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_TEMP1", + "field_pos": "2", + "mult": "1000" + }, + { + "attr_name": "psu_fan1_speed_rpm", + "bmc_cmd": "ipmitool sdr get -c PSU1_FAN1 | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "PSU1_FAN1", + "field_pos": "2" + }, + { + "attr_name": "psu_mfr_id", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Manufacturer') && echo $_rv || echo 'Manufacturer : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Manufacturer", + "field_pos": "2" + }, + { + "attr_name": "psu_model_name", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Name') && echo $_rv || echo 'Name : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Name", + "field_pos": "2" + }, + { + "attr_name": "psu_serial_num", + "bmc_cmd": "_rv=$(ipmitool fru print 2 2>/dev/null | tr -s ' ' | cut -d' ' -f3-5 | grep 'Serial') && echo $_rv || echo 'Serial : N/A'", + "raw": "0", + "separator": ":", + "field_name": "Serial", + "field_pos": "2" + }, + { + "attr_name": "psu_fan_dir", + "bmc_cmd": "ipmitool raw 0x3c 0x30 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "PSU2-EEPROM": { + "dev_info": { + "device_type": "PSU-EEPROM", + "device_name": "PSU2-EEPROM", + "device_parent": "MUX1", + "virt_parent": "PSU2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2", + "dev_addr": "0x5b", + "dev_type": "psu_eeprom" + }, + "attr_list": [ + { + "attr_name":"psu_present", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x2", + "attr_cmpval":"0x0", + "attr_len":"1" + }, + { + "attr_name":"psu_power_good", + "attr_devaddr":"0x30", + "attr_devtype":"cpld", + "attr_offset":"0x51", + "attr_mask":"0x20", + "attr_cmpval":"0x20", + "attr_len":"1" + } + ] + } + }, + "FAN-CTRL": { + "dev_info": { + "device_type": "FAN", + "device_name": "FAN-CTRL", + "device_parent": "" + }, + "bmc": { + "ipmitool": { + "attr_list": [ + { + "attr_name": "fan1_present", + "bmc_cmd": "ipmitool sdr get -c FAN0_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN0_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan2_present", + "bmc_cmd": "ipmitool sdr get -c FAN0_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN0_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan3_present", + "bmc_cmd": "ipmitool sdr get -c FAN1_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN1_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan4_present", + "bmc_cmd": "ipmitool sdr get -c FAN1_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN1_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan5_present", + "bmc_cmd": "ipmitool sdr get -c FAN2_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN2_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan6_present", + "bmc_cmd": "ipmitool sdr get -c FAN2_PRSNT_L", + "raw": "0", + "separator": ",", + "field_name": "FAN2_PRSNT_L", + "field_pos": "5" + }, + { + "attr_name": "fan1_input", + "bmc_cmd": "ipmitool sdr get -c FAN0_RPM_F | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN0_RPM_F", + "field_pos": "2" + }, + { + "attr_name": "fan2_input", + "bmc_cmd": "ipmitool sdr get -c FAN0_RPM_R | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN0_RPM_R", + "field_pos": "2" + }, + { + "attr_name": "fan3_input", + "bmc_cmd": "ipmitool sdr get -c FAN1_RPM_F | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN1_RPM_F", + "field_pos": "2" + }, + { + "attr_name": "fan4_input", + "bmc_cmd": "ipmitool sdr get -c FAN1_RPM_R | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN1_RPM_R", + "field_pos": "2" + }, + { + "attr_name": "fan5_input", + "bmc_cmd": "ipmitool sdr get -c FAN2_RPM_F | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN2_RPM_F", + "field_pos": "2" + }, + { + "attr_name": "fan6_input", + "bmc_cmd": "ipmitool sdr get -c FAN2_RPM_R | sed -e 's/,,/,N\\/A,/g' -e 's/,,/,N\\/A,/g'", + "raw": "0", + "separator": ",", + "field_name": "FAN2_RPM_R", + "field_pos": "2" + }, + { + "attr_name": "fan1_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan2_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f1", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan3_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan4_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f2", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan5_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f3", + "raw": "1", + "type": "raw" + }, + { + "attr_name": "fan6_direction", + "bmc_cmd": "ipmitool raw 0x3c 0x31 0x0 | xargs | cut -d' ' -f3", + "raw": "1", + "type": "raw" + } + ] + } + } + }, + "SYS_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "SYS_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + }, + { + "attr_name": "off", + "bits": "7:6", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x81" + } + ] + } + }, + "FAN_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "FAN_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x83" + } + ] + } + }, + "PSU1_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "0", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "3:0", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "3:0", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "3:0", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "3:0", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "3", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "PSU2_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "PSU_LED" + }, + "dev_attr": { + "index": "1", + "flag": "ro" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "green", + "bits": "7:4", + "descr": "Green", + "value": "0x09;0x0b", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "green_blink", + "bits": "7:4", + "descr": "Green Blinking", + "value": "0x0d;0x0f", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow", + "bits": "7:4", + "descr": "Yellow", + "value": "0x08;0x0a", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "yellow_blink", + "bits": "7:4", + "descr": "Yellow Blinking", + "value": "0x0c;0x0e", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + }, + { + "attr_name": "off", + "bits": "7", + "descr": "Off", + "value": "0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x80" + } + ] + } + }, + "ID_LED": { + "dev_info": { + "device_type": "LED", + "device_name": "LOC_LED" + }, + "dev_attr": { + "index": "0", + "flag": "rw" + }, + "i2c": { + "attr_list": [ + { + "attr_name": "blue", + "bits": "3:1", + "descr": "Blue", + "value": "0x04;0x05", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "blue_blink", + "bits": "3:1", + "descr": "Blue Blinking", + "value": "0x06;0x07", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + }, + { + "attr_name": "off", + "bits": "3:2", + "descr": "Off", + "value": "0x01;0x0", + "swpld_addr": "0x30", + "swpld_addr_offset": "0x84" + } + ] + } + }, + "PORT1": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT1", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "1" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT1-EEPROM" + }, + { + "itf": "control", + "dev": "PORT1-CTRL" + } + ] + } + }, + "PORT1-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x12", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT1-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT1-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT1" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x12", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT2": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT2", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "2" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT2-EEPROM" + }, + { + "itf": "control", + "dev": "PORT2-CTRL" + } + ] + } + }, + "PORT2-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x13", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT2-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT2-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT2" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x13", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT3": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT3", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "3" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT3-EEPROM" + }, + { + "itf": "control", + "dev": "PORT3-CTRL" + } + ] + } + }, + "PORT3-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x14", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT3-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT3-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT3" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x14", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT4": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT4", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "4" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT4-EEPROM" + }, + { + "itf": "control", + "dev": "PORT4-CTRL" + } + ] + } + }, + "PORT4-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x15", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT4-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT4-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT4" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x15", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT5": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT5", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "5" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT5-EEPROM" + }, + { + "itf": "control", + "dev": "PORT5-CTRL" + } + ] + } + }, + "PORT5-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x16", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT5-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT5-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT5" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x16", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT6": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT6", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "6" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT6-EEPROM" + }, + { + "itf": "control", + "dev": "PORT6-CTRL" + } + ] + } + }, + "PORT6-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x17", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT6-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT6-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT6" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x17", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT7": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT7", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "7" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT7-EEPROM" + }, + { + "itf": "control", + "dev": "PORT7-CTRL" + } + ] + } + }, + "PORT7-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x18", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT7-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT7-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT7" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x18", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT8": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT8", + "device_parent": "MUX3" + }, + "dev_attr": { + "dev_idx": "8" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT8-EEPROM" + }, + { + "itf": "control", + "dev": "PORT8-CTRL" + } + ] + } + }, + "PORT8-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-EEPROM", + "device_parent": "MUX3", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x19", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT8-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT8-CTRL", + "device_parent": "MUX3", + "virt_parent": "PORT8" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x19", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x14", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x10", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x40", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x44", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT9": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT9", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "9" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT9-EEPROM" + }, + { + "itf": "control", + "dev": "PORT9-CTRL" + } + ] + } + }, + "PORT9-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1A", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT9-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT9-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT9" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1A", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT10": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT10", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "10" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT10-EEPROM" + }, + { + "itf": "control", + "dev": "PORT10-CTRL" + } + ] + } + }, + "PORT10-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1B", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT10-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT10-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT10" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1B", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT11": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT11", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "11" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT11-EEPROM" + }, + { + "itf": "control", + "dev": "PORT11-CTRL" + } + ] + } + }, + "PORT11-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1C", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT11-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT11-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT11" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1C", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT12": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT12", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "12" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT12-EEPROM" + }, + { + "itf": "control", + "dev": "PORT12-CTRL" + } + ] + } + }, + "PORT12-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1D", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT12-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT12-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT12" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1D", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT13": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT13", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "13" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT13-EEPROM" + }, + { + "itf": "control", + "dev": "PORT13-CTRL" + } + ] + } + }, + "PORT13-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1E", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT13-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT13-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT13" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1E", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT14": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT14", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "14" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT14-EEPROM" + }, + { + "itf": "control", + "dev": "PORT14-CTRL" + } + ] + } + }, + "PORT14-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1F", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT14-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT14-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT14" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x1F", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT15": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT15", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "15" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT15-EEPROM" + }, + { + "itf": "control", + "dev": "PORT15-CTRL" + } + ] + } + }, + "PORT15-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT15-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT15-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT15" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x20", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT16": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT16", + "device_parent": "MUX4" + }, + "dev_attr": { + "dev_idx": "16" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT16-EEPROM" + }, + { + "itf": "control", + "dev": "PORT16-CTRL" + } + ] + } + }, + "PORT16-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-EEPROM", + "device_parent": "MUX4", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT16-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT16-CTRL", + "device_parent": "MUX4", + "virt_parent": "PORT16" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x21", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x15", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x11", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x41", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x45", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT17": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT17", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "17" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT17-EEPROM" + }, + { + "itf": "control", + "dev": "PORT17-CTRL" + } + ] + } + }, + "PORT17-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT17-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT17-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT17" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x22", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT18": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT18", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "18" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT18-EEPROM" + }, + { + "itf": "control", + "dev": "PORT18-CTRL" + } + ] + } + }, + "PORT18-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT18-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT18-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT18" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x23", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT19": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT19", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "19" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT19-EEPROM" + }, + { + "itf": "control", + "dev": "PORT19-CTRL" + } + ] + } + }, + "PORT19-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT19-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT19-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT19" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x24", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT20": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT20", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "20" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT20-EEPROM" + }, + { + "itf": "control", + "dev": "PORT20-CTRL" + } + ] + } + }, + "PORT20-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT20-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT20-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT20" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x25", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT21": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT21", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "21" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT21-EEPROM" + }, + { + "itf": "control", + "dev": "PORT21-CTRL" + } + ] + } + }, + "PORT21-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT21-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT21-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT21" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x26", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT22": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT22", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "22" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT22-EEPROM" + }, + { + "itf": "control", + "dev": "PORT22-CTRL" + } + ] + } + }, + "PORT22-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT22-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT22-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT22" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x27", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT23": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT23", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "23" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT23-EEPROM" + }, + { + "itf": "control", + "dev": "PORT23-CTRL" + } + ] + } + }, + "PORT23-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT23-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT23-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT23" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x28", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT24": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT24", + "device_parent": "MUX5" + }, + "dev_attr": { + "dev_idx": "24" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT24-EEPROM" + }, + { + "itf": "control", + "dev": "PORT24-CTRL" + } + ] + } + }, + "PORT24-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-EEPROM", + "device_parent": "MUX5", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT24-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT24-CTRL", + "device_parent": "MUX5", + "virt_parent": "PORT24" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x29", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x16", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x12", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x42", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x46", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT25": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT25", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "25" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT25-EEPROM" + }, + { + "itf": "control", + "dev": "PORT25-CTRL" + } + ] + } + }, + "PORT25-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2A", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT25-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT25-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT25" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2A", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "0", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "0", + "attr_cmpval": "0x1", + "attr_len": "1" + } + ] + } + }, + "PORT26": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT26", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "26" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT26-EEPROM" + }, + { + "itf": "control", + "dev": "PORT26-CTRL" + } + ] + } + }, + "PORT26-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2B", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT26-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT26-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT26" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2B", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + }, + "PORT27": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT27", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "27" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT27-EEPROM" + }, + { + "itf": "control", + "dev": "PORT27-CTRL" + } + ] + } + }, + "PORT27-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2C", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT27-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT27-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT27" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2C", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "2", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "2", + "attr_cmpval": "0x4", + "attr_len": "1" + } + ] + } + }, + "PORT28": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT28", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "28" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT28-EEPROM" + }, + { + "itf": "control", + "dev": "PORT28-CTRL" + } + ] + } + }, + "PORT28-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2D", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT28-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT28-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT28" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2D", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "3", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "3", + "attr_cmpval": "0x8", + "attr_len": "1" + } + ] + } + }, + "PORT29": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT29", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "29" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT29-EEPROM" + }, + { + "itf": "control", + "dev": "PORT29-CTRL" + } + ] + } + }, + "PORT29-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2E", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT29-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT29-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT29" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2E", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "4", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "4", + "attr_cmpval": "0x10", + "attr_len": "1" + } + ] + } + }, + "PORT30": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT30", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "30" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT30-EEPROM" + }, + { + "itf": "control", + "dev": "PORT30-CTRL" + } + ] + } + }, + "PORT30-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2F", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT30-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT30-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT30" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x2F", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "5", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "5", + "attr_cmpval": "0x20", + "attr_len": "1" + } + ] + } + }, + "PORT31": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT31", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "31" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT31-EEPROM" + }, + { + "itf": "control", + "dev": "PORT31-CTRL" + } + ] + } + }, + "PORT31-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT31-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT31-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT31" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x30", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "6", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "6", + "attr_cmpval": "0x40", + "attr_len": "1" + } + ] + } + }, + "PORT32": { + "dev_info": { + "device_type": "QSFP", + "device_name": "PORT32", + "device_parent": "MUX6" + }, + "dev_attr": { + "dev_idx": "32" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT32-EEPROM" + }, + { + "itf": "control", + "dev": "PORT32-CTRL" + } + ] + } + }, + "PORT32-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-EEPROM", + "device_parent": "MUX6", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x50", + "dev_type": "optoe1" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT32-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT32-CTRL", + "device_parent": "MUX6", + "virt_parent": "PORT32" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x31", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_intr_status", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x17", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x13", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_reset", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x43", + "attr_mask": "7", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_lpmode", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x47", + "attr_mask": "7", + "attr_cmpval": "0x80", + "attr_len": "1" + } + ] + } + }, + "PORT33": { + "dev_info": { + "device_type": "SFP", + "device_name": "PORT33", + "device_parent": "MUX7" + }, + "dev_attr": { + "dev_idx": "33" + }, + "i2c": { + "interface": [ + { + "itf": "eeprom", + "dev": "PORT33-EEPROM" + }, + { + "itf": "control", + "dev": "PORT33-CTRL" + } + ] + } + }, + "PORT33-EEPROM": { + "dev_info": { + "device_type": "", + "device_name": "PORT33", + "device_parent": "MUX7", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x50", + "dev_type": "optoe2" + }, + "attr_list": [ + { + "attr_name": "eeprom" + } + ] + } + }, + "PORT33-CTRL": { + "dev_info": { + "device_type": "", + "device_name": "PORT33-CTRL", + "device_parent": "MUX7", + "virt_parent": "PORT33" + }, + "i2c": { + "topo_info": { + "parent_bus": "0x33", + "dev_addr": "0x53", + "dev_type": "pddf_xcvr" + }, + "attr_list": [ + { + "attr_name": "xcvr_present", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x18", + "attr_mask": "1", + "attr_cmpval": "0x0", + "attr_len": "1" + }, + { + "attr_name": "xcvr_rxlos", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x19", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txfault", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x1A", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + }, + { + "attr_name": "xcvr_txdisable", + "attr_devaddr": "0x31", + "attr_devname": "CPLD2", + "attr_devtype": "cpld", + "attr_offset": "0x48", + "attr_mask": "1", + "attr_cmpval": "0x2", + "attr_len": "1" + } + ] + } + } + +} diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device.json new file mode 120000 index 000000000000..28f5a100186a --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf/pddf-device.json @@ -0,0 +1 @@ +pddf-device-pvt.json \ No newline at end of file diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf_support b/device/ufispace/x86_64-ufispace_s9110_32x-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-beta.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-beta.json new file mode 100644 index 000000000000..717adf878d7e --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-beta.json @@ -0,0 +1,596 @@ +{ + "chassis": { + "name": "S9110-32X", + "components": [ + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + }, + { + "name": "BIOS" + }, + { + "name": "BMC" + } + ], + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + }, + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + }, + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + }, + { + "name": "Fantray4_1" + }, + { + "name": "Fantray4_2" + } + ], + "fan_drawers":[ + { + "name": "Fantray1", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + } + ] + }, + { + "name": "Fantray2", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + } + ] + }, + { + "name": "Fantray3", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "fans": [ + { + "name": "PSU1_FAN1" + } + ], + "thermals": [ + { + "name": "PSU1_TEMP1" + } + ] + }, + { + "name": "PSU2", + "fans": [ + { + "name": "PSU2_FAN1" + } + ], + "thermals": [ + { + "name": "PSU2_TEMP1" + } + ] + } + ], + "thermals": [ + { + "name": "TEMP_MAC" + }, + { + "name": "TEMP_ENV_MACCASE" + }, + { + "name": "TEMP_ENV_SSDCASE" + }, + { + "name": "TEMP_ENV_PSUCASE" + }, + { + "name": "TEMP_ENV_BMC" + }, + { + "name": "TEMP_PSU0_TEMP1" + }, + { + "name": "TEMP_PSU1_TEMP1" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet4" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet12" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet20" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet28" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet36" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet44" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet52" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet60" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet68" + }, + { + "name": "Ethernet72" + }, + { + "name": "Ethernet76" + }, + { + "name": "Ethernet80" + }, + { + "name": "Ethernet84" + }, + { + "name": "Ethernet88" + }, + { + "name": "Ethernet92" + }, + { + "name": "Ethernet96" + }, + { + "name": "Ethernet100" + }, + { + "name": "Ethernet104" + }, + { + "name": "Ethernet108" + }, + { + "name": "Ethernet112" + }, + { + "name": "Ethernet116" + }, + { + "name": "Ethernet120" + }, + { + "name": "Ethernet124" + }, + { + "name": "Ethernet128" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0,0,0,0", + "lanes": "1,2,3,4", + "breakout_modes": { + "1x100G[40G]": ["Eth0(Port0)"], + "2x50G": ["Eth0/1(Port0)", "Eth0/2(Port0)"], + "4x25G": ["Eth0/1(Port0)", "Eth0/2(Port0)", "Eth0/3(Port0)", "Eth0/4(Port0)"], + "4x10G": ["Eth0/1(Port0)", "Eth0/2(Port0)", "Eth0/3(Port0)", "Eth0/4(Port0)"] + } + }, + + "Ethernet4": { + "index": "1,1,1,1", + "lanes": "5,6,7,8", + "breakout_modes": { + "1x100G[40G]": ["Eth1(Port1)"], + "2x50G": ["Eth1/1(Port1)", "Eth1/2(Port1)"], + "4x25G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"], + "4x10G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"] + } + }, + + "Ethernet8": { + "index": "2,2,2,2", + "lanes": "9,10,11,12", + "breakout_modes": { + "1x100G[40G]": ["Eth2(Port2)"], + "2x50G": ["Eth2/1(Port2)", "Eth2/2(Port2)"], + "4x25G": ["Eth2/1(Port2)", "Eth2/2(Port2)", "Eth2/3(Port2)", "Eth2/4(Port2)"], + "4x10G": ["Eth2/1(Port2)", "Eth2/2(Port2)", "Eth2/3(Port2)", "Eth2/4(Port2)"] + } + }, + + "Ethernet12": { + "index": "3,3,3,3", + "lanes": "13,14,15,16", + "breakout_modes": { + "1x100G[40G]": ["Eth3(Port3)"], + "2x50G": ["Eth3/1(Port3)", "Eth3/2(Port3)"], + "4x25G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"], + "4x10G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"] + } + }, + + "Ethernet16": { + "index": "4,4,4,4", + "lanes": "17,18,19,20", + "breakout_modes": { + "1x100G[40G]": ["Eth4(Port4)"], + "2x50G": ["Eth4/1(Port4)", "Eth4/2(Port4)"], + "4x25G": ["Eth4/1(Port4)", "Eth4/2(Port4)", "Eth4/3(Port4)", "Eth4/4(Port4)"], + "4x10G": ["Eth4/1(Port4)", "Eth4/2(Port4)", "Eth4/3(Port4)", "Eth4/4(Port4)"] + } + }, + + "Ethernet20": { + "index": "5,5,5,5", + "lanes": "21,22,23,24", + "breakout_modes": { + "1x100G[40G]": ["Eth5(Port5)"], + "2x50G": ["Eth5/1(Port5)", "Eth5/2(Port5)"], + "4x25G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"], + "4x10G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"] + } + }, + + "Ethernet24": { + "index": "6,6,6,6", + "lanes": "25,26,27,28", + "breakout_modes": { + "1x100G[40G]": ["Eth6(Port6)"], + "2x50G": ["Eth6/1(Port6)", "Eth6/2(Port6)"], + "4x25G": ["Eth6/1(Port6)", "Eth6/2(Port6)", "Eth6/3(Port6)", "Eth6/4(Port6)"], + "4x10G": ["Eth6/1(Port6)", "Eth6/2(Port6)", "Eth6/3(Port6)", "Eth6/4(Port6)"] + } + }, + + "Ethernet28": { + "index": "7,7,7,7", + "lanes": "29,30,31,32", + "breakout_modes": { + "1x100G[40G]": ["Eth7(Port7)"], + "2x50G": ["Eth7/1(Port7)", "Eth7/2(Port7)"], + "4x25G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"], + "4x10G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"] + } + }, + + "Ethernet32": { + "index": "8,8,8,8", + "lanes": "33,34,35,36", + "breakout_modes": { + "1x100G[40G]": ["Eth8(Port8)"], + "2x50G": ["Eth8/1(Port8)", "Eth8/2(Port8)"], + "4x25G": ["Eth8/1(Port8)", "Eth8/2(Port8)", "Eth8/3(Port8)", "Eth8/4(Port8)"], + "4x10G": ["Eth8/1(Port8)", "Eth8/2(Port8)", "Eth8/3(Port8)", "Eth8/4(Port8)"] + } + }, + + "Ethernet36": { + "index": "9,9,9,9", + "lanes": "37,38,39,40", + "breakout_modes": { + "1x100G[40G]": ["Eth9(Port9)"], + "2x50G": ["Eth9/1(Port9)", "Eth9/2(Port9)"], + "4x25G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"], + "4x10G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"] + } + }, + + "Ethernet40": { + "index": "10,10,10,10", + "lanes": "41,42,43,44", + "breakout_modes": { + "1x100G[40G]": ["Eth10(Port10)"], + "2x50G": ["Eth10/1(Port10)", "Eth10/2(Port10)"], + "4x25G": ["Eth10/1(Port10)", "Eth10/2(Port10)", "Eth10/3(Port10)", "Eth10/4(Port10)"], + "4x10G": ["Eth10/1(Port10)", "Eth10/2(Port10)", "Eth10/3(Port10)", "Eth10/4(Port10)"] + } + }, + + "Ethernet44": { + "index": "11,11,11,11", + "lanes": "45,46,47,48", + "breakout_modes": { + "1x100G[40G]": ["Eth11(Port11)"], + "2x50G": ["Eth11/1(Port11)", "Eth11/2(Port11)"], + "4x25G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"], + "4x10G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"] + } + }, + + "Ethernet48": { + "index": "12,12,12,12", + "lanes": "49,50,51,52", + "breakout_modes": { + "1x100G[40G]": ["Eth12(Port12)"], + "2x50G": ["Eth12/1(Port12)", "Eth12/2(Port12)"], + "4x25G": ["Eth12/1(Port12)", "Eth12/2(Port12)", "Eth12/3(Port12)", "Eth12/4(Port12)"], + "4x10G": ["Eth12/1(Port12)", "Eth12/2(Port12)", "Eth12/3(Port12)", "Eth12/4(Port12)"] + } + }, + + "Ethernet52": { + "index": "13,13,13,13", + "lanes": "53,54,55,56", + "breakout_modes": { + "1x100G[40G]": ["Eth13(Port13)"], + "2x50G": ["Eth13/1(Port13)", "Eth13/2(Port13)"], + "4x25G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"], + "4x10G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"] + } + }, + + "Ethernet56": { + "index": "14,14,14,14", + "lanes": "57,58,59,60", + "breakout_modes": { + "1x100G[40G]": ["Eth14(Port14)"], + "2x50G": ["Eth14/1(Port14)", "Eth14/2(Port14)"], + "4x25G": ["Eth14/1(Port14)", "Eth14/2(Port14)", "Eth14/3(Port14)", "Eth14/4(Port14)"], + "4x10G": ["Eth14/1(Port14)", "Eth14/2(Port14)", "Eth14/3(Port14)", "Eth14/4(Port14)"] + } + }, + + "Ethernet60": { + "index": "15,15,15,15", + "lanes": "61,62,63,64", + "breakout_modes": { + "1x100G[40G]": ["Eth15(Port15)"], + "2x50G": ["Eth15/1(Port15)", "Eth15/2(Port15)"], + "4x25G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"], + "4x10G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"] + } + }, + + "Ethernet64": { + "index": "16,16,16,16", + "lanes": "69,70,71,72", + "breakout_modes": { + "1x100G[40G]": ["Eth16(Port16)"], + "2x50G": ["Eth16/1(Port16)", "Eth16/2(Port16)"], + "4x25G": ["Eth16/1(Port16)", "Eth16/2(Port16)", "Eth16/3(Port16)", "Eth16/4(Port16)"], + "4x10G": ["Eth16/1(Port16)", "Eth16/2(Port16)", "Eth16/3(Port16)", "Eth16/4(Port16)"] + } + }, + + "Ethernet68": { + "index": "17,17,17,17", + "lanes": "65,66,67,68", + "breakout_modes": { + "1x100G[40G]": ["Eth17(Port17)"], + "2x50G": ["Eth17/1(Port17)", "Eth17/2(Port17)"], + "4x25G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"], + "4x10G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"] + } + }, + + "Ethernet72": { + "index": "18,18,18,18", + "lanes": "77,78,79,80", + "breakout_modes": { + "1x100G[40G]": ["Eth18(Port18)"], + "2x50G": ["Eth18/1(Port18)", "Eth18/2(Port18)"], + "4x25G": ["Eth18/1(Port18)", "Eth18/2(Port18)", "Eth18/3(Port18)", "Eth18/4(Port18)"], + "4x10G": ["Eth18/1(Port18)", "Eth18/2(Port18)", "Eth18/3(Port18)", "Eth18/4(Port18)"] + } + }, + + "Ethernet76": { + "index": "19,19,19,19", + "lanes": "73,74,75,76", + "breakout_modes": { + "1x100G[40G]": ["Eth19(Port19)"], + "2x50G": ["Eth19/1(Port19)", "Eth19/2(Port19)"], + "4x25G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"], + "4x10G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"] + } + }, + + "Ethernet80": { + "index": "20,20,20,20", + "lanes": "85,86,87,88", + "breakout_modes": { + "1x100G[40G]": ["Eth20(Port20)"], + "2x50G": ["Eth20/1(Port20)", "Eth20/2(Port20)"], + "4x25G": ["Eth20/1(Port20)", "Eth20/2(Port20)", "Eth20/3(Port20)", "Eth20/4(Port20)"], + "4x10G": ["Eth20/1(Port20)", "Eth20/2(Port20)", "Eth20/3(Port20)", "Eth20/4(Port20)"] + } + }, + + "Ethernet84": { + "index": "21,21,21,21", + "lanes": "81,82,83,84", + "breakout_modes": { + "1x100G[40G]": ["Eth21(Port21)"], + "2x50G": ["Eth21/1(Port21)", "Eth21/2(Port21)"], + "4x25G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"], + "4x10G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"] + } + }, + + "Ethernet88": { + "index": "22,22,22,22", + "lanes": "93,94,95,96", + "breakout_modes": { + "1x100G[40G]": ["Eth22(Port22)"], + "2x50G": ["Eth22/1(Port22)", "Eth22/2(Port22)"], + "4x25G": ["Eth22/1(Port22)", "Eth22/2(Port22)", "Eth22/3(Port22)", "Eth22/4(Port22)"], + "4x10G": ["Eth22/1(Port22)", "Eth22/2(Port22)", "Eth22/3(Port22)", "Eth22/4(Port22)"] + } + }, + + "Ethernet92": { + "index": "23,23,23,23", + "lanes": "89,90,91,92", + "breakout_modes": { + "1x100G[40G]": ["Eth23(Port23)"], + "2x50G": ["Eth23/1(Port23)", "Eth23/2(Port23)"], + "4x25G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"], + "4x10G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"] + } + }, + + "Ethernet96": { + "index": "24,24,24,24", + "lanes": "101,102,103,104", + "breakout_modes": { + "1x100G[40G]": ["Eth24(Port24)"], + "2x50G": ["Eth24/1(Port24)", "Eth24/2(Port24)"], + "4x25G": ["Eth24/1(Port24)", "Eth24/2(Port24)", "Eth24/3(Port24)", "Eth24/4(Port24)"], + "4x10G": ["Eth24/1(Port24)", "Eth24/2(Port24)", "Eth24/3(Port24)", "Eth24/4(Port24)"] + } + }, + + "Ethernet100": { + "index": "25,25,25,25", + "lanes": "97,98,99,100", + "breakout_modes": { + "1x100G[40G]": ["Eth25(Port25)"], + "2x50G": ["Eth25/1(Port25)", "Eth25/2(Port25)"], + "4x25G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"], + "4x10G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"] + } + }, + + "Ethernet104": { + "index": "26,26,26,26", + "lanes": "109,110,111,112", + "breakout_modes": { + "1x100G[40G]": ["Eth26(Port26)"], + "2x50G": ["Eth26/1(Port26)", "Eth26/2(Port26)"], + "4x25G": ["Eth26/1(Port26)", "Eth26/2(Port26)", "Eth26/3(Port26)", "Eth26/4(Port26)"], + "4x10G": ["Eth26/1(Port26)", "Eth26/2(Port26)", "Eth26/3(Port26)", "Eth26/4(Port26)"] + } + }, + + "Ethernet108": { + "index": "27,27,27,27", + "lanes": "105,106,107,108", + "breakout_modes": { + "1x100G[40G]": ["Eth27(Port27)"], + "2x50G": ["Eth27/1(Port27)", "Eth27/2(Port27)"], + "4x25G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"], + "4x10G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"] + } + }, + + "Ethernet112": { + "index": "28,28,28,28", + "lanes": "117,118,119,120", + "breakout_modes": { + "1x100G[40G]": ["Eth28(Port28)"], + "2x50G": ["Eth28/1(Port28)", "Eth28/2(Port28)"], + "4x25G": ["Eth28/1(Port28)", "Eth28/2(Port28)", "Eth28/3(Port28)", "Eth28/4(Port28)"], + "4x10G": ["Eth28/1(Port28)", "Eth28/2(Port28)", "Eth28/3(Port28)", "Eth28/4(Port28)"] + } + }, + + "Ethernet116": { + "index": "29,29,29,29", + "lanes": "113,114,115,116", + "breakout_modes": { + "1x100G[40G]": ["Eth29(Port29)"], + "2x50G": ["Eth29/1(Port29)", "Eth29/2(Port29)"], + "4x25G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"], + "4x10G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"] + } + }, + + "Ethernet120": { + "index": "30,30,30,30", + "lanes": "125,126,127,128", + "breakout_modes": { + "1x100G[40G]": ["Eth30(Port30)"], + "2x50G": ["Eth30/1(Port30)", "Eth30/2(Port30)"], + "4x25G": ["Eth30/1(Port30)", "Eth30/2(Port30)", "Eth30/3(Port30)", "Eth30/4(Port30)"], + "4x10G": ["Eth30/1(Port30)", "Eth30/2(Port30)", "Eth30/3(Port30)", "Eth30/4(Port30)"] + } + }, + + "Ethernet124": { + "index": "31,31,31,31", + "lanes": "121,122,123,124", + "breakout_modes": { + "1x100G[40G]": ["Eth31(Port31)"], + "2x50G": ["Eth31/1(Port31)", "Eth31/2(Port31)"], + "4x25G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"], + "4x10G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"] + } + }, + "Ethernet128": { + "index": "32", + "lanes": "129", + "breakout_modes": { + "1x10G": ["Eth32(Port32)"] + } + } + } +} + diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-pvt.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-pvt.json new file mode 100644 index 000000000000..6114bf5ef460 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform-pvt.json @@ -0,0 +1,590 @@ +{ + "chassis": { + "name": "S9110-32X", + "components": [ + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + }, + { + "name": "BIOS" + }, + { + "name": "BMC" + } + ], + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + }, + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + }, + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + } + ], + "fan_drawers":[ + { + "name": "Fantray1", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + } + ] + }, + { + "name": "Fantray2", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + } + ] + }, + { + "name": "Fantray3", + "num_fans" : 2, + "fans": [ + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "fans": [ + { + "name": "PSU1_FAN1" + } + ], + "thermals": [ + { + "name": "PSU1_TEMP1" + } + ] + }, + { + "name": "PSU2", + "fans": [ + { + "name": "PSU2_FAN1" + } + ], + "thermals": [ + { + "name": "PSU2_TEMP1" + } + ] + } + ], + "thermals": [ + { + "name": "TEMP_MAC" + }, + { + "name": "TEMP_ENV_MACCASE" + }, + { + "name": "TEMP_ENV_SSDCASE" + }, + { + "name": "TEMP_ENV_PSUCASE" + }, + { + "name": "TEMP_ENV_BMC" + }, + { + "name": "TEMP_PSU0_TEMP1" + }, + { + "name": "TEMP_PSU1_TEMP1" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet4" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet12" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet20" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet28" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet36" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet44" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet52" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet60" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet68" + }, + { + "name": "Ethernet72" + }, + { + "name": "Ethernet76" + }, + { + "name": "Ethernet80" + }, + { + "name": "Ethernet84" + }, + { + "name": "Ethernet88" + }, + { + "name": "Ethernet92" + }, + { + "name": "Ethernet96" + }, + { + "name": "Ethernet100" + }, + { + "name": "Ethernet104" + }, + { + "name": "Ethernet108" + }, + { + "name": "Ethernet112" + }, + { + "name": "Ethernet116" + }, + { + "name": "Ethernet120" + }, + { + "name": "Ethernet124" + }, + { + "name": "Ethernet128" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0,0,0,0", + "lanes": "1,2,3,4", + "breakout_modes": { + "1x100G[40G]": ["Eth0(Port0)"], + "2x50G": ["Eth0/1(Port0)", "Eth0/2(Port0)"], + "4x25G": ["Eth0/1(Port0)", "Eth0/2(Port0)", "Eth0/3(Port0)", "Eth0/4(Port0)"], + "4x10G": ["Eth0/1(Port0)", "Eth0/2(Port0)", "Eth0/3(Port0)", "Eth0/4(Port0)"] + } + }, + + "Ethernet4": { + "index": "1,1,1,1", + "lanes": "5,6,7,8", + "breakout_modes": { + "1x100G[40G]": ["Eth1(Port1)"], + "2x50G": ["Eth1/1(Port1)", "Eth1/2(Port1)"], + "4x25G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"], + "4x10G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"] + } + }, + + "Ethernet8": { + "index": "2,2,2,2", + "lanes": "9,10,11,12", + "breakout_modes": { + "1x100G[40G]": ["Eth2(Port2)"], + "2x50G": ["Eth2/1(Port2)", "Eth2/2(Port2)"], + "4x25G": ["Eth2/1(Port2)", "Eth2/2(Port2)", "Eth2/3(Port2)", "Eth2/4(Port2)"], + "4x10G": ["Eth2/1(Port2)", "Eth2/2(Port2)", "Eth2/3(Port2)", "Eth2/4(Port2)"] + } + }, + + "Ethernet12": { + "index": "3,3,3,3", + "lanes": "13,14,15,16", + "breakout_modes": { + "1x100G[40G]": ["Eth3(Port3)"], + "2x50G": ["Eth3/1(Port3)", "Eth3/2(Port3)"], + "4x25G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"], + "4x10G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"] + } + }, + + "Ethernet16": { + "index": "4,4,4,4", + "lanes": "17,18,19,20", + "breakout_modes": { + "1x100G[40G]": ["Eth4(Port4)"], + "2x50G": ["Eth4/1(Port4)", "Eth4/2(Port4)"], + "4x25G": ["Eth4/1(Port4)", "Eth4/2(Port4)", "Eth4/3(Port4)", "Eth4/4(Port4)"], + "4x10G": ["Eth4/1(Port4)", "Eth4/2(Port4)", "Eth4/3(Port4)", "Eth4/4(Port4)"] + } + }, + + "Ethernet20": { + "index": "5,5,5,5", + "lanes": "21,22,23,24", + "breakout_modes": { + "1x100G[40G]": ["Eth5(Port5)"], + "2x50G": ["Eth5/1(Port5)", "Eth5/2(Port5)"], + "4x25G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"], + "4x10G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"] + } + }, + + "Ethernet24": { + "index": "6,6,6,6", + "lanes": "25,26,27,28", + "breakout_modes": { + "1x100G[40G]": ["Eth6(Port6)"], + "2x50G": ["Eth6/1(Port6)", "Eth6/2(Port6)"], + "4x25G": ["Eth6/1(Port6)", "Eth6/2(Port6)", "Eth6/3(Port6)", "Eth6/4(Port6)"], + "4x10G": ["Eth6/1(Port6)", "Eth6/2(Port6)", "Eth6/3(Port6)", "Eth6/4(Port6)"] + } + }, + + "Ethernet28": { + "index": "7,7,7,7", + "lanes": "29,30,31,32", + "breakout_modes": { + "1x100G[40G]": ["Eth7(Port7)"], + "2x50G": ["Eth7/1(Port7)", "Eth7/2(Port7)"], + "4x25G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"], + "4x10G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"] + } + }, + + "Ethernet32": { + "index": "8,8,8,8", + "lanes": "33,34,35,36", + "breakout_modes": { + "1x100G[40G]": ["Eth8(Port8)"], + "2x50G": ["Eth8/1(Port8)", "Eth8/2(Port8)"], + "4x25G": ["Eth8/1(Port8)", "Eth8/2(Port8)", "Eth8/3(Port8)", "Eth8/4(Port8)"], + "4x10G": ["Eth8/1(Port8)", "Eth8/2(Port8)", "Eth8/3(Port8)", "Eth8/4(Port8)"] + } + }, + + "Ethernet36": { + "index": "9,9,9,9", + "lanes": "37,38,39,40", + "breakout_modes": { + "1x100G[40G]": ["Eth9(Port9)"], + "2x50G": ["Eth9/1(Port9)", "Eth9/2(Port9)"], + "4x25G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"], + "4x10G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"] + } + }, + + "Ethernet40": { + "index": "10,10,10,10", + "lanes": "41,42,43,44", + "breakout_modes": { + "1x100G[40G]": ["Eth10(Port10)"], + "2x50G": ["Eth10/1(Port10)", "Eth10/2(Port10)"], + "4x25G": ["Eth10/1(Port10)", "Eth10/2(Port10)", "Eth10/3(Port10)", "Eth10/4(Port10)"], + "4x10G": ["Eth10/1(Port10)", "Eth10/2(Port10)", "Eth10/3(Port10)", "Eth10/4(Port10)"] + } + }, + + "Ethernet44": { + "index": "11,11,11,11", + "lanes": "45,46,47,48", + "breakout_modes": { + "1x100G[40G]": ["Eth11(Port11)"], + "2x50G": ["Eth11/1(Port11)", "Eth11/2(Port11)"], + "4x25G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"], + "4x10G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"] + } + }, + + "Ethernet48": { + "index": "12,12,12,12", + "lanes": "49,50,51,52", + "breakout_modes": { + "1x100G[40G]": ["Eth12(Port12)"], + "2x50G": ["Eth12/1(Port12)", "Eth12/2(Port12)"], + "4x25G": ["Eth12/1(Port12)", "Eth12/2(Port12)", "Eth12/3(Port12)", "Eth12/4(Port12)"], + "4x10G": ["Eth12/1(Port12)", "Eth12/2(Port12)", "Eth12/3(Port12)", "Eth12/4(Port12)"] + } + }, + + "Ethernet52": { + "index": "13,13,13,13", + "lanes": "53,54,55,56", + "breakout_modes": { + "1x100G[40G]": ["Eth13(Port13)"], + "2x50G": ["Eth13/1(Port13)", "Eth13/2(Port13)"], + "4x25G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"], + "4x10G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"] + } + }, + + "Ethernet56": { + "index": "14,14,14,14", + "lanes": "57,58,59,60", + "breakout_modes": { + "1x100G[40G]": ["Eth14(Port14)"], + "2x50G": ["Eth14/1(Port14)", "Eth14/2(Port14)"], + "4x25G": ["Eth14/1(Port14)", "Eth14/2(Port14)", "Eth14/3(Port14)", "Eth14/4(Port14)"], + "4x10G": ["Eth14/1(Port14)", "Eth14/2(Port14)", "Eth14/3(Port14)", "Eth14/4(Port14)"] + } + }, + + "Ethernet60": { + "index": "15,15,15,15", + "lanes": "61,62,63,64", + "breakout_modes": { + "1x100G[40G]": ["Eth15(Port15)"], + "2x50G": ["Eth15/1(Port15)", "Eth15/2(Port15)"], + "4x25G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"], + "4x10G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"] + } + }, + + "Ethernet64": { + "index": "16,16,16,16", + "lanes": "69,70,71,72", + "breakout_modes": { + "1x100G[40G]": ["Eth16(Port16)"], + "2x50G": ["Eth16/1(Port16)", "Eth16/2(Port16)"], + "4x25G": ["Eth16/1(Port16)", "Eth16/2(Port16)", "Eth16/3(Port16)", "Eth16/4(Port16)"], + "4x10G": ["Eth16/1(Port16)", "Eth16/2(Port16)", "Eth16/3(Port16)", "Eth16/4(Port16)"] + } + }, + + "Ethernet68": { + "index": "17,17,17,17", + "lanes": "65,66,67,68", + "breakout_modes": { + "1x100G[40G]": ["Eth17(Port17)"], + "2x50G": ["Eth17/1(Port17)", "Eth17/2(Port17)"], + "4x25G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"], + "4x10G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"] + } + }, + + "Ethernet72": { + "index": "18,18,18,18", + "lanes": "77,78,79,80", + "breakout_modes": { + "1x100G[40G]": ["Eth18(Port18)"], + "2x50G": ["Eth18/1(Port18)", "Eth18/2(Port18)"], + "4x25G": ["Eth18/1(Port18)", "Eth18/2(Port18)", "Eth18/3(Port18)", "Eth18/4(Port18)"], + "4x10G": ["Eth18/1(Port18)", "Eth18/2(Port18)", "Eth18/3(Port18)", "Eth18/4(Port18)"] + } + }, + + "Ethernet76": { + "index": "19,19,19,19", + "lanes": "73,74,75,76", + "breakout_modes": { + "1x100G[40G]": ["Eth19(Port19)"], + "2x50G": ["Eth19/1(Port19)", "Eth19/2(Port19)"], + "4x25G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"], + "4x10G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"] + } + }, + + "Ethernet80": { + "index": "20,20,20,20", + "lanes": "85,86,87,88", + "breakout_modes": { + "1x100G[40G]": ["Eth20(Port20)"], + "2x50G": ["Eth20/1(Port20)", "Eth20/2(Port20)"], + "4x25G": ["Eth20/1(Port20)", "Eth20/2(Port20)", "Eth20/3(Port20)", "Eth20/4(Port20)"], + "4x10G": ["Eth20/1(Port20)", "Eth20/2(Port20)", "Eth20/3(Port20)", "Eth20/4(Port20)"] + } + }, + + "Ethernet84": { + "index": "21,21,21,21", + "lanes": "81,82,83,84", + "breakout_modes": { + "1x100G[40G]": ["Eth21(Port21)"], + "2x50G": ["Eth21/1(Port21)", "Eth21/2(Port21)"], + "4x25G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"], + "4x10G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"] + } + }, + + "Ethernet88": { + "index": "22,22,22,22", + "lanes": "93,94,95,96", + "breakout_modes": { + "1x100G[40G]": ["Eth22(Port22)"], + "2x50G": ["Eth22/1(Port22)", "Eth22/2(Port22)"], + "4x25G": ["Eth22/1(Port22)", "Eth22/2(Port22)", "Eth22/3(Port22)", "Eth22/4(Port22)"], + "4x10G": ["Eth22/1(Port22)", "Eth22/2(Port22)", "Eth22/3(Port22)", "Eth22/4(Port22)"] + } + }, + + "Ethernet92": { + "index": "23,23,23,23", + "lanes": "89,90,91,92", + "breakout_modes": { + "1x100G[40G]": ["Eth23(Port23)"], + "2x50G": ["Eth23/1(Port23)", "Eth23/2(Port23)"], + "4x25G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"], + "4x10G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"] + } + }, + + "Ethernet96": { + "index": "24,24,24,24", + "lanes": "101,102,103,104", + "breakout_modes": { + "1x100G[40G]": ["Eth24(Port24)"], + "2x50G": ["Eth24/1(Port24)", "Eth24/2(Port24)"], + "4x25G": ["Eth24/1(Port24)", "Eth24/2(Port24)", "Eth24/3(Port24)", "Eth24/4(Port24)"], + "4x10G": ["Eth24/1(Port24)", "Eth24/2(Port24)", "Eth24/3(Port24)", "Eth24/4(Port24)"] + } + }, + + "Ethernet100": { + "index": "25,25,25,25", + "lanes": "97,98,99,100", + "breakout_modes": { + "1x100G[40G]": ["Eth25(Port25)"], + "2x50G": ["Eth25/1(Port25)", "Eth25/2(Port25)"], + "4x25G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"], + "4x10G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"] + } + }, + + "Ethernet104": { + "index": "26,26,26,26", + "lanes": "109,110,111,112", + "breakout_modes": { + "1x100G[40G]": ["Eth26(Port26)"], + "2x50G": ["Eth26/1(Port26)", "Eth26/2(Port26)"], + "4x25G": ["Eth26/1(Port26)", "Eth26/2(Port26)", "Eth26/3(Port26)", "Eth26/4(Port26)"], + "4x10G": ["Eth26/1(Port26)", "Eth26/2(Port26)", "Eth26/3(Port26)", "Eth26/4(Port26)"] + } + }, + + "Ethernet108": { + "index": "27,27,27,27", + "lanes": "105,106,107,108", + "breakout_modes": { + "1x100G[40G]": ["Eth27(Port27)"], + "2x50G": ["Eth27/1(Port27)", "Eth27/2(Port27)"], + "4x25G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"], + "4x10G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"] + } + }, + + "Ethernet112": { + "index": "28,28,28,28", + "lanes": "117,118,119,120", + "breakout_modes": { + "1x100G[40G]": ["Eth28(Port28)"], + "2x50G": ["Eth28/1(Port28)", "Eth28/2(Port28)"], + "4x25G": ["Eth28/1(Port28)", "Eth28/2(Port28)", "Eth28/3(Port28)", "Eth28/4(Port28)"], + "4x10G": ["Eth28/1(Port28)", "Eth28/2(Port28)", "Eth28/3(Port28)", "Eth28/4(Port28)"] + } + }, + + "Ethernet116": { + "index": "29,29,29,29", + "lanes": "113,114,115,116", + "breakout_modes": { + "1x100G[40G]": ["Eth29(Port29)"], + "2x50G": ["Eth29/1(Port29)", "Eth29/2(Port29)"], + "4x25G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"], + "4x10G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"] + } + }, + + "Ethernet120": { + "index": "30,30,30,30", + "lanes": "125,126,127,128", + "breakout_modes": { + "1x100G[40G]": ["Eth30(Port30)"], + "2x50G": ["Eth30/1(Port30)", "Eth30/2(Port30)"], + "4x25G": ["Eth30/1(Port30)", "Eth30/2(Port30)", "Eth30/3(Port30)", "Eth30/4(Port30)"], + "4x10G": ["Eth30/1(Port30)", "Eth30/2(Port30)", "Eth30/3(Port30)", "Eth30/4(Port30)"] + } + }, + + "Ethernet124": { + "index": "31,31,31,31", + "lanes": "121,122,123,124", + "breakout_modes": { + "1x100G[40G]": ["Eth31(Port31)"], + "2x50G": ["Eth31/1(Port31)", "Eth31/2(Port31)"], + "4x25G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"], + "4x10G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"] + } + }, + "Ethernet128": { + "index": "32", + "lanes": "129", + "breakout_modes": { + "1x10G": ["Eth32(Port32)"] + } + } + } +} + diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform.json new file mode 120000 index 000000000000..bb59660c3c3a --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform.json @@ -0,0 +1 @@ +platform-pvt.json \ No newline at end of file diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_asic b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_components.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_components.json new file mode 100644 index 000000000000..a5bb2093cbaa --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_components.json @@ -0,0 +1,12 @@ +{ + "chassis": { + "x86_64-ufispace_s9110_32x-r0": { + "component": { + "CPLD1": { }, + "CPLD2": { }, + "BIOS": { }, + "BMC": {} + } + } + } +} diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_env.conf b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_env.conf new file mode 100644 index 000000000000..77fd88ac3678 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/platform_env.conf @@ -0,0 +1 @@ +SYNCD_SHM_SIZE=256m diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/pmon_daemon_control.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..e348e0168fa5 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/pmon_daemon_control.json @@ -0,0 +1,9 @@ +{ + "skip_pcied": false, + "skip_fancontrol": false, + "skip_thermalctld": false, + "skip_ledd": true, + "skip_xcvrd": false, + "skip_psud": false, + "skip_syseepromd": false +} diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/sensors.conf b/device/ufispace/x86_64-ufispace_s9110_32x-r0/sensors.conf new file mode 100644 index 000000000000..29e3604b4127 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/sensors.conf @@ -0,0 +1 @@ +# libsensors configuration file \ No newline at end of file diff --git a/device/ufispace/x86_64-ufispace_s9110_32x-r0/system_health_monitoring_config.json b/device/ufispace/x86_64-ufispace_s9110_32x-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..43816ab55169 --- /dev/null +++ b/device/ufispace/x86_64-ufispace_s9110_32x-r0/system_health_monitoring_config.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu", + "fan" + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "yellow_blink", + "normal": "green", + "booting": "green_blink" + } +} \ No newline at end of file diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index b35e69c77d36..c9660299ed7e 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -82,7 +82,11 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(NOKIA_IXR7250_PLATFORM_MODULE) \ $(TENCENT_TCS8400_PLATFORM_MODULE) \ $(TENCENT_TCS9400_PLATFORM_MODULE) \ - $(UFISPACE_S9300_32D_PLATFORM_MODULE) + $(UFISPACE_S9300_32D_PLATFORM_MODULE) \ + $(UFISPACE_S9110_32X_PLATFORM_MODULE) \ + $(UFISPACE_S8901_54XC_PLATFORM_MODULE) \ + $(UFISPACE_S7801_54XS_PLATFORM_MODULE) \ + $(UFISPACE_S6301_56ST_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_BUILD_INSTALLS = $(BRCM_OPENNSL_KERNEL) $(BRCM_DNX_OPENNSL_KERNEL) ifeq ($(INSTALL_DEBUG_TOOLS),y) diff --git a/platform/broadcom/platform-modules-ufispace.mk b/platform/broadcom/platform-modules-ufispace.mk index 1e0c4638c9de..3fc5f6e72fec 100644 --- a/platform/broadcom/platform-modules-ufispace.mk +++ b/platform/broadcom/platform-modules-ufispace.mk @@ -1,8 +1,16 @@ # UfiSpace Platform modules UFISPACE_S9300_32D_PLATFORM_MODULE_VERSION = 1.0.0 +UFISPACE_S9110_32X_PLATFORM_MODULE_VERSION = 1.0.0 +UFISPACE_S8901_54XC_PLATFORM_MODULE_VERSION = 1.0.0 +UFISPACE_S7801_54XS_PLATFORM_MODULE_VERSION = 1.0.0 +UFISPACE_S6301_56ST_PLATFORM_MODULE_VERSION = 1.0.0 export UFISPACE_S9300_32D_PLATFORM_MODULE_VERSION +export UFISPACE_S9110_32X_PLATFORM_MODULE_VERSION +export UFISPACE_S8901_54XC_PLATFORM_MODULE_VERSION +export UFISPACE_S7801_54XS_PLATFORM_MODULE_VERSION +export UFISPACE_S6301_56ST_PLATFORM_MODULE_VERSION UFISPACE_S9300_32D_PLATFORM_MODULE = sonic-platform-ufispace-s9300-32d_$(UFISPACE_S9300_32D_PLATFORM_MODULE_VERSION)_amd64.deb $(UFISPACE_S9300_32D_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ufispace @@ -10,3 +18,18 @@ $(UFISPACE_S9300_32D_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADER $(UFISPACE_S9300_32D_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s9300_32d-r0 SONIC_DPKG_DEBS += $(UFISPACE_S9300_32D_PLATFORM_MODULE) +UFISPACE_S9110_32X_PLATFORM_MODULE = sonic-platform-ufispace-s9110-32x_$(UFISPACE_S9110_32X_PLATFORM_MODULE_VERSION)_amd64.deb +$(UFISPACE_S9110_32X_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s9110_32x-r0 +$(eval $(call add_extra_package,$(UFISPACE_S9300_32D_PLATFORM_MODULE),$(UFISPACE_S9110_32X_PLATFORM_MODULE))) + +UFISPACE_S8901_54XC_PLATFORM_MODULE = sonic-platform-ufispace-s8901-54xc_$(UFISPACE_S8901_54XC_PLATFORM_MODULE_VERSION)_amd64.deb +$(UFISPACE_S8901_54XC_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s8901_54xc-r0 +$(eval $(call add_extra_package,$(UFISPACE_S9300_32D_PLATFORM_MODULE),$(UFISPACE_S8901_54XC_PLATFORM_MODULE))) + +UFISPACE_S7801_54XS_PLATFORM_MODULE = sonic-platform-ufispace-s7801-54xs_$(UFISPACE_S7801_54XS_PLATFORM_MODULE_VERSION)_amd64.deb +$(UFISPACE_S7801_54XS_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s7801_54xs-r0 +$(eval $(call add_extra_package,$(UFISPACE_S9300_32D_PLATFORM_MODULE),$(UFISPACE_S7801_54XS_PLATFORM_MODULE))) + +UFISPACE_S6301_56ST_PLATFORM_MODULE = sonic-platform-ufispace-s6301-56st_$(UFISPACE_S6301_56ST_PLATFORM_MODULE_VERSION)_amd64.deb +$(UFISPACE_S6301_56ST_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s6301_56st-r0 +$(eval $(call add_extra_package,$(UFISPACE_S9300_32D_PLATFORM_MODULE),$(UFISPACE_S6301_56ST_PLATFORM_MODULE))) \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/changelog b/platform/broadcom/sonic-platform-modules-ufispace/debian/changelog index a4e712e2a1aa..029c0374df67 100644 --- a/platform/broadcom/sonic-platform-modules-ufispace/debian/changelog +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/changelog @@ -1,3 +1,27 @@ +sonic-ufispace-platform-modules (1.0.0) unstable; urgency=low + + * Add support for S6301-56ST + + -- Ufispace Thu, 27 Jul 2023 15:50:23 +0800 + +sonic-ufispace-platform-modules (1.0.0) unstable; urgency=low + + * Add support for S7801-54XS + + -- Ufispace Thu, 27 Jul 2023 11:49:07 +0800 + +sonic-ufispace-platform-modules (1.0.0) unstable; urgency=low + + * Add support for S8901-54XC + + -- Ufispace Thu, 27 Jul 2023 11:12:21 +0800 + +sonic-ufispace-platform-modules (1.0.0) unstable; urgency=low + + * Add support for S9110-32X. + + -- Ufispace Wed, 26 Jul 2023 18:03:14 +0800 + sonic-ufispace-platform-modules (1.0.0) unstable; urgency=low * Add support for S9300-32D. diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/control b/platform/broadcom/sonic-platform-modules-ufispace/debian/control index afee144752e2..798179f6e394 100644 --- a/platform/broadcom/sonic-platform-modules-ufispace/debian/control +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/control @@ -1,7 +1,7 @@ Source: sonic-ufispace-platform-modules Section: main Priority: extra -Maintainer: Leo Lin +Maintainer: Leo Lin , Nonodark Huang , Jason Tsai Build-Depends: debhelper (>= 9), bzip2 Standards-Version: 1.0.0 @@ -9,3 +9,18 @@ Package: sonic-platform-ufispace-s9300-32d Architecture: amd64 Description: This package contains s9300-32d platform driver utility for SONiC project. +Package: sonic-platform-ufispace-s9110-32x +Architecture: amd64 +Description: This package contains s9110-32x platform driver utility for SONiC project. + +Package: sonic-platform-ufispace-s8901-54xc +Architecture: amd64 +Description: This package contains s8901-54xc platform driver utility for SONiC project. + +Package: sonic-platform-ufispace-s7801-54xs +Architecture: amd64 +Description: This package contains s7801-54xs platform driver utility for SONiC project. + +Package: sonic-platform-ufispace-s6301-56st +Architecture: amd64 +Description: This package contains s6301-56st platform driver utility for SONiC project. \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/rules b/platform/broadcom/sonic-platform-modules-ufispace/debian/rules index 78a77f9b5b69..d36b48dbc53c 100755 --- a/platform/broadcom/sonic-platform-modules-ufispace/debian/rules +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/rules @@ -20,6 +20,10 @@ KVERSION ?= $(shell uname -r) KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) MODULE_DIRS:= s9300-32d +MODULE_DIRS += s9110-32x +MODULE_DIRS += s8901-54xc +MODULE_DIRS += s7801-54xs +MODULE_DIRS += s6301-56st MODULE_DIR := modules UTILS_DIR := utils SERVICE_DIR := service diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.install b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.install new file mode 100644 index 000000000000..869c48e4a1ea --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.install @@ -0,0 +1 @@ +s6301-56st/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-ufispace_s6301_56st-r0/pddf diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.postinst b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.postinst new file mode 100644 index 000000000000..01666039ca26 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.postinst @@ -0,0 +1,3 @@ +depmod -a +systemctl enable pddf-platform-init.service +systemctl start pddf-platform-init.service diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.prerm b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.prerm new file mode 100644 index 000000000000..f9fe8c017ab0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s6301-56st.prerm @@ -0,0 +1,2 @@ +systemctl stop pddf-platform-init.service +systemctl disable pddf-platform-init.service diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.install b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.install new file mode 100644 index 000000000000..3c1b791bbf56 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.install @@ -0,0 +1 @@ +s7801-54xs/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-ufispace_s7801_54xs-r0/pddf diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.postinst b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.postinst new file mode 100644 index 000000000000..01666039ca26 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.postinst @@ -0,0 +1,3 @@ +depmod -a +systemctl enable pddf-platform-init.service +systemctl start pddf-platform-init.service diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.prerm b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.prerm new file mode 100644 index 000000000000..4b887ab38a28 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s7801-54xs.prerm @@ -0,0 +1,2 @@ +systemctl stop pddf-platform-init.service +systemctl disable pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.install b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.install new file mode 100644 index 000000000000..685e023830d3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.install @@ -0,0 +1 @@ +s8901-54xc/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-ufispace_s8901_54xc-r0/pddf diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.postinst b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.postinst new file mode 100644 index 000000000000..01666039ca26 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.postinst @@ -0,0 +1,3 @@ +depmod -a +systemctl enable pddf-platform-init.service +systemctl start pddf-platform-init.service diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.prerm b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.prerm new file mode 100644 index 000000000000..4b887ab38a28 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s8901-54xc.prerm @@ -0,0 +1,2 @@ +systemctl stop pddf-platform-init.service +systemctl disable pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.install b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.install new file mode 100644 index 000000000000..6982e6b1965d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.install @@ -0,0 +1 @@ +s9110-32x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-ufispace_s9110_32x-r0/pddf diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.postinst b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.postinst new file mode 100644 index 000000000000..01666039ca26 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.postinst @@ -0,0 +1,3 @@ +depmod -a +systemctl enable pddf-platform-init.service +systemctl start pddf-platform-init.service diff --git a/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.prerm b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.prerm new file mode 100644 index 000000000000..4b887ab38a28 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/debian/sonic-platform-ufispace-s9110-32x.prerm @@ -0,0 +1,2 @@ +systemctl stop pddf-platform-init.service +systemctl disable pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/Makefile b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/Makefile new file mode 100644 index 000000000000..7c2273d0063b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/Makefile @@ -0,0 +1,6 @@ + +MODULE_NAME = x86-64-ufispace-s6301-56st-sys-eeprom.o x86-64-ufispace-s6301-56st-lpc.o +obj-m := $(MODULE_NAME) + +CFLAGS_pddf_custom_sysstatus_module.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-lpc.c b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-lpc.c new file mode 100644 index 000000000000..9b42c8f2b88f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-lpc.c @@ -0,0 +1,829 @@ +/* + * A lpc driver for the ufispace_s6301_56st + * + * Copyright (C) 2017-2020 UfiSpace Technology Corporation. + * Jason Tsai + * Leo Lin + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include +#include + +#define BSP_LOG_R(fmt, args...) \ + _bsp_log (LOG_READ, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_LOG_W(fmt, args...) \ + _bsp_log (LOG_WRITE, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) + +#define BSP_PR(level, fmt, args...) _bsp_log (LOG_SYS, level "[BSP]" fmt "\r\n", ##args) +#define DRIVER_NAME "x86_64_ufispace_s6301_56st_lpc" + +/* LPC registers */ + +#define REG_BASE_CPU 0x600 +#define REG_BASE_MB 0x700 + +//MB CPLD +#define REG_MB_BRD_ID_0 (REG_BASE_MB + 0x00) +#define REG_MB_BRD_ID_1 (REG_BASE_MB + 0x01) +#define REG_MB_CPLD_VERSION (REG_BASE_MB + 0x02) +#define REG_MB_CPLD_BUILD (REG_BASE_MB + 0x04) +#define REG_MB_EXTEND_ID (REG_BASE_MB + 0x06) +#define REG_MB_MUX_RESET (REG_BASE_MB + 0x43) +#define REG_MB_FAN_STATUS (REG_BASE_MB + 0x55) +#define REG_MB_PSU_STATUS (REG_BASE_MB + 0x59) +#define REG_MB_PORT_LED_CLR (REG_BASE_MB + 0x80) +#define REG_MB_SYS_LED_CTRL_1 (REG_BASE_MB + 0x81) +#define REG_MB_SYS_LED_STATUS_1 (REG_BASE_MB + 0x82) +#define REG_MB_SYS_LED_STATUS_2 (REG_BASE_MB + 0x83) +#define REG_MB_SYS_LED_STATUS_3 (REG_BASE_MB + 0x84) + +#define MASK_ALL (0xFF) + +#define MDELAY_LPC (5) +#define MDELAY_RESET_INTERVAL (100) +#define MDELAY_RESET_FINISH (500) + +#define MULTIBIT_SET(addr, mask, value) (((addr)&((0xff)^(mask)))|((value)&(mask))) + + +/* LPC sysfs attributes index */ +enum lpc_sysfs_attributes { + //MB CPLD + ATT_MB_BRD_ID_0, + ATT_MB_BRD_ID_1, + ATT_MB_CPLD_1_VERSION, + ATT_MB_CPLD_1_VERSION_H, + ATT_MB_BRD_SKU_ID, + ATT_MB_BRD_HW_ID, + ATT_MB_BRD_ID_TYPE, + ATT_MB_BRD_BUILD_ID, + ATT_MB_BRD_DEPH_ID, + ATT_MB_BRD_EXT_ID, + ATT_MB_MUX_RESET, + ATT_MB_FAN_STATUS, + ATT_MB_PSU_STATUS, + ATT_MB_PORT_LED_CLR, + ATT_MB_LED_SYS, + ATT_MB_LED_ID, + ATT_MB_LED_POE, + ATT_MB_LED_SPD, + ATT_MB_LED_FAN, + ATT_MB_LED_LNK, + ATT_MB_LED_PWR0, + ATT_MB_LED_PWR1, + //BSP + ATT_BSP_VERSION, + ATT_BSP_DEBUG, + ATT_BSP_PR_INFO, + ATT_BSP_PR_ERR, + ATT_BSP_REG, + ATT_BSP_REG_VALUE, + ATT_BSP_GPIO_MAX, + ATT_MAX +}; + +enum bases { + BASE_DEC, + BASE_HEX, + BASE_NONE + +}; + +enum bsp_log_types { + LOG_NONE, + LOG_RW, + LOG_READ, + LOG_WRITE, + LOG_SYS +}; + +enum bsp_log_ctrl { + LOG_DISABLE, + LOG_ENABLE +}; + +struct lpc_data_s { + struct mutex access_lock; +}; + +struct lpc_data_s *lpc_data; +char bsp_version[16]; +char bsp_debug[32]; +char bsp_reg[8]="0x0"; +u8 enable_log_read=LOG_DISABLE; +u8 enable_log_write=LOG_DISABLE; +u8 enable_log_sys=LOG_ENABLE; + +/* mask len and shift */ +static void _get_len_shift(u8 mask, u8 *len, u8 *shift) +{ + int i; + bool found=false; + *len=0; + *shift=0; + + for(i=0; i<8; ++i) { + if(mask & 1) { + *len = *len + 1; + if(!found) { + *shift = i; + found = true; + } + } + mask >>= 1; + } +} + +/* reg mask and shift */ +static u8 _mask_shift(u8 val, u8 mask) +{ + u8 shift=0; + u8 len; + + _get_len_shift(mask, &len, &shift); + + return (val & mask) >> shift; +} + +static u8 _bit_operation(u8 reg_val, u8 bit, u8 bit_val) +{ + if(bit_val == 0) + reg_val = reg_val & ~(1 << bit); + else + reg_val = reg_val | (1 << bit); + return reg_val; +} + +static int _bsp_log(u8 log_type, char *fmt, ...) +{ + if((log_type==LOG_READ && enable_log_read) || + (log_type==LOG_WRITE && enable_log_write) || + (log_type==LOG_SYS && enable_log_sys) ) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk(fmt, args); + va_end(args); + + return r; + } else { + return 0; + } +} + +static int _config_bsp_log(u8 log_type) +{ + switch(log_type) { + case LOG_NONE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_RW: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_ENABLE; + break; + case LOG_READ: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_WRITE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_ENABLE; + break; + default: + return -EINVAL; + } + return 0; +} + +/* get lpc register value */ +static u8 _read_lpc_reg(u16 reg, u8 mask) +{ + u8 reg_val=0x0, reg_mk_shf_val=0x0; + + mutex_lock(&lpc_data->access_lock); + reg_val = inb(reg); + mutex_unlock(&lpc_data->access_lock); + + reg_mk_shf_val = _mask_shift(reg_val, mask); + + BSP_LOG_R("reg=0x%03x, reg_val=0x%02x, mask=0x%02x, reg_mk_shf_val=0x%02x", reg, reg_val, mask, reg_mk_shf_val); + + return reg_mk_shf_val; +} + +/* get lpc register value */ +static ssize_t read_lpc_reg(u16 reg, u8 mask, u8 base, char *buf) +{ + u8 reg_val; + int len=0; + + reg_val = _read_lpc_reg(reg, mask); + if(base == BASE_HEX) { + len=sprintf(buf, "0x%02x\n", reg_val); + } else { + len=sprintf(buf,"%d\n", reg_val); + } + + return len; +} + +/* set lpc register value */ +static ssize_t write_lpc_reg(u16 reg, u8 mask, const char *buf, size_t count) +{ + u8 reg_val, reg_val_now, shift, mask_len; + + if(kstrtou8(buf, 0, ®_val) < 0) + return -EINVAL; + + _get_len_shift(mask, &mask_len, &shift); + + // set signal bit + if(mask_len == 1) { + reg_val_now = _read_lpc_reg(reg, MASK_ALL); + reg_val = _bit_operation(reg_val_now, shift, reg_val); + // set multi bit + } else if (mask_len > 1) { + reg_val_now = _read_lpc_reg(reg, MASK_ALL); + reg_val = MULTIBIT_SET(reg_val_now, mask, reg_val<access_lock); + + outb(reg_val, reg); + mdelay(MDELAY_LPC); + + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x, mask=0x%02x", reg, reg_val, mask); + + return count; +} + +/* get bsp value */ +static ssize_t read_bsp(char *buf, char *str) +{ + ssize_t len=0; + + mutex_lock(&lpc_data->access_lock); + len=sprintf(buf, "%s", str); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_R("reg_val=%s", str); + + return len; +} + +/* set bsp value */ +static ssize_t write_bsp(const char *buf, char *str, size_t str_len, size_t count) +{ + mutex_lock(&lpc_data->access_lock); + snprintf(str, str_len, "%s", buf); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg_val=%s", str); + + return count; +} + +/* get mb cpld version in human readable format */ +static ssize_t read_mb_cpld_1_version_h(struct device *dev, + struct device_attribute *da, char *buf) +{ + ssize_t len=0; + u16 reg = REG_MB_CPLD_VERSION; + u8 mask = MASK_ALL; + u8 mask_major = 0b11000000; + u8 mask_minor = 0b00111111; + u8 reg_val; + u8 major, minor, build; + + mutex_lock(&lpc_data->access_lock); + reg_val = _mask_shift(inb(reg), mask); + mutex_unlock(&lpc_data->access_lock); + major = _mask_shift(reg_val, mask_major); + minor = _mask_shift(reg_val, mask_minor); + BSP_LOG_R("reg=0x%03x, reg_val=0x%02x", reg, reg_val); + + reg = REG_MB_CPLD_BUILD; + mutex_lock(&lpc_data->access_lock); + reg_val = _mask_shift(inb(reg), mask); + mutex_unlock(&lpc_data->access_lock); + build = reg_val; + BSP_LOG_R("reg=0x%03x, reg_val=0x%02x", reg, reg_val); + + len=sprintf(buf, "%d.%02d.%03d\n", major, minor, build); + return len; +} + +/* set mb_mux_reset register value */ +static ssize_t write_mb_mux_reset(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + u8 val = 0; + u8 reg_val = 0; + static int mux_reset_flag = 0; + + if(kstrtou8(buf, 0, &val) < 0) + return -EINVAL; + + if(mux_reset_flag == 0) { + if(val == 0) { + mutex_lock(&lpc_data->access_lock); + mux_reset_flag = 1; + printk(KERN_INFO "i2c mux reset is triggered...\n"); + reg_val = inb(REG_MB_MUX_RESET); + outb((reg_val & 0b11111000), REG_MB_MUX_RESET); + mdelay(100); + outb((reg_val | 0b00000111), REG_MB_MUX_RESET); + mdelay(500); + mux_reset_flag = 0; + mutex_unlock(&lpc_data->access_lock); + } else { + return -EINVAL; + } + } else { + printk(KERN_INFO "i2c mux is resetting... (ignore)\n"); + mutex_lock(&lpc_data->access_lock); + mutex_unlock(&lpc_data->access_lock); + } + + return count; +} + +/* get lpc register value */ +static ssize_t read_lpc_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_ALL; + u8 base = BASE_DEC; + + switch (attr->index) { + //MB CPLD + case ATT_MB_BRD_ID_0: + reg = REG_MB_BRD_ID_0; + break; + case ATT_MB_BRD_ID_1: + reg = REG_MB_BRD_ID_1; + break; + case ATT_MB_CPLD_1_VERSION: + reg = REG_MB_CPLD_VERSION; + break; + case ATT_MB_BRD_SKU_ID: + reg = REG_MB_BRD_ID_0; + mask = 0xFF; + break; + case ATT_MB_BRD_HW_ID: + reg = REG_MB_BRD_ID_1; + mask = 0x3; + break; + case ATT_MB_BRD_ID_TYPE: + reg = REG_MB_BRD_ID_1; + mask = 0x80; + break; + case ATT_MB_BRD_BUILD_ID: + reg = REG_MB_BRD_ID_1; + mask = 0x18; + break; + case ATT_MB_BRD_DEPH_ID: + reg = REG_MB_BRD_ID_1; + mask = 0x4; + break; + case ATT_MB_BRD_EXT_ID: + reg = REG_MB_EXTEND_ID; + mask = 0x07; + break; + case ATT_MB_MUX_RESET: + reg = REG_MB_MUX_RESET; + mask = 0x07; + base = BASE_HEX; + break; + case ATT_MB_FAN_STATUS: + reg = REG_MB_FAN_STATUS; + base = BASE_HEX; + break; + case ATT_MB_PSU_STATUS: + reg = REG_MB_PSU_STATUS; + base = BASE_HEX; + break; + case ATT_MB_PORT_LED_CLR: + reg = REG_MB_PORT_LED_CLR; + mask = 0x1; + base = BASE_HEX; + break; + case ATT_MB_LED_SYS: + reg = REG_MB_SYS_LED_CTRL_1; + mask = 0xF0; + base = BASE_HEX; + break; + case ATT_MB_LED_ID: + reg = REG_MB_SYS_LED_CTRL_1; + mask = 0xF; + base = BASE_HEX; + break; + case ATT_MB_LED_POE: + reg = REG_MB_SYS_LED_STATUS_1; + mask = 0xF0; + base = BASE_HEX; + break; + case ATT_MB_LED_SPD: + reg = REG_MB_SYS_LED_STATUS_1; + mask = 0xF; + base = BASE_HEX; + break; + case ATT_MB_LED_FAN: + reg = REG_MB_SYS_LED_STATUS_2; + mask = 0xF0; + base = BASE_HEX; + break; + case ATT_MB_LED_LNK: + reg = REG_MB_SYS_LED_STATUS_2; + mask = 0xF; + base = BASE_HEX; + break; + case ATT_MB_LED_PWR1: + reg = REG_MB_SYS_LED_STATUS_3; + mask = 0xF0; + base = BASE_HEX; + break; + case ATT_MB_LED_PWR0: + reg = REG_MB_SYS_LED_STATUS_3; + mask = 0xF; + base = BASE_HEX; + break; + //BSP + case ATT_BSP_REG_VALUE: + if (kstrtou16(bsp_reg, 0, ®) < 0) + return -EINVAL; + + mask = MASK_ALL; + break; + default: + return -EINVAL; + } + return read_lpc_reg(reg, mask, base, buf); +} + +/* set lpc register value */ +static ssize_t write_lpc_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_ALL; + + switch (attr->index) { + case ATT_MB_PORT_LED_CLR: + reg = REG_MB_PORT_LED_CLR; + mask = 0x1; + break; + case ATT_MB_LED_SYS: + reg = REG_MB_SYS_LED_CTRL_1; + mask = 0xF0; + break; + case ATT_MB_LED_ID: + reg = REG_MB_SYS_LED_CTRL_1; + mask = 0xF; + break; + default: + return -EINVAL; + } + return write_lpc_reg(reg, mask, buf, count); +} + +/* get bsp parameter value */ +static ssize_t read_bsp_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + str_len = sizeof(bsp_version); + break; + case ATT_BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(bsp_debug); + break; + case ATT_BSP_REG: + str = bsp_reg; + str_len = sizeof(bsp_reg); + break; + default: + return -EINVAL; + } + return read_bsp(buf, str); +} + +/* set bsp parameter value */ +static ssize_t write_bsp_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + u16 reg = 0; + u8 bsp_debug_u8 = 0; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + str_len = sizeof(str); + break; + case ATT_BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(str); + break; + case ATT_BSP_REG: + if(kstrtou16(buf, 0, ®) < 0) + return -EINVAL; + + str = bsp_reg; + str_len = sizeof(str); + break; + default: + return -EINVAL; + } + + if(attr->index == ATT_BSP_DEBUG) { + if(kstrtou8(buf, 0, &bsp_debug_u8) < 0) { + return -EINVAL; + } else if (_config_bsp_log(bsp_debug_u8) < 0) { + return -EINVAL; + } + } + + return write_bsp(buf, str, str_len, count); +} + +static ssize_t write_bsp_pr_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len = strlen(buf); + + if(str_len <= 0) + return str_len; + + switch (attr->index) { + case ATT_BSP_PR_INFO: + BSP_PR(KERN_INFO, "%s", buf); + break; + case ATT_BSP_PR_ERR: + BSP_PR(KERN_ERR, "%s", buf); + break; + default: + return -EINVAL; + } + + return str_len; +} + +/* get gpio max value */ +static ssize_t read_gpio_max_callback(struct device *dev, + struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + if (attr->index == ATT_BSP_GPIO_MAX) { + return sprintf(buf, "%d\n", ARCH_NR_GPIOS-1); + } + return -1; +} + +//SENSOR_DEVICE_ATTR - MB +static SENSOR_DEVICE_ATTR(board_id_0, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_ID_0); +static SENSOR_DEVICE_ATTR(board_id_1, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_ID_1); +static SENSOR_DEVICE_ATTR(mb_cpld_1_version, S_IRUGO, read_lpc_callback, NULL, ATT_MB_CPLD_1_VERSION); +static SENSOR_DEVICE_ATTR(mb_cpld_1_version_h, S_IRUGO, read_mb_cpld_1_version_h, NULL, ATT_MB_CPLD_1_VERSION_H); +static SENSOR_DEVICE_ATTR(board_sku_id, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_SKU_ID); +static SENSOR_DEVICE_ATTR(board_hw_id, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_HW_ID); +static SENSOR_DEVICE_ATTR(board_id_type, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_ID_TYPE); +static SENSOR_DEVICE_ATTR(board_build_id, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_BUILD_ID); +static SENSOR_DEVICE_ATTR(board_deph_id, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_DEPH_ID); +static SENSOR_DEVICE_ATTR(board_ext_id, S_IRUGO, read_lpc_callback, NULL, ATT_MB_BRD_EXT_ID); +static SENSOR_DEVICE_ATTR(mux_reset, S_IRUGO | S_IWUSR, read_lpc_callback, write_mb_mux_reset, ATT_MB_MUX_RESET); +static SENSOR_DEVICE_ATTR(fan_status, S_IRUGO, read_lpc_callback, NULL, ATT_MB_FAN_STATUS); +static SENSOR_DEVICE_ATTR(psu_status, S_IRUGO, read_lpc_callback, NULL, ATT_MB_PSU_STATUS); +static SENSOR_DEVICE_ATTR(port_led_clear, S_IRUGO | S_IWUSR, read_lpc_callback, write_lpc_callback, ATT_MB_PORT_LED_CLR); +static SENSOR_DEVICE_ATTR(led_sys, S_IRUGO | S_IWUSR, read_lpc_callback, write_lpc_callback, ATT_MB_LED_SYS); +static SENSOR_DEVICE_ATTR(led_id, S_IRUGO | S_IWUSR, read_lpc_callback, write_lpc_callback, ATT_MB_LED_ID); +static SENSOR_DEVICE_ATTR(led_poe, S_IRUGO, read_lpc_callback, NULL, ATT_MB_LED_POE); +static SENSOR_DEVICE_ATTR(led_spd, S_IRUGO, read_lpc_callback, NULL, ATT_MB_LED_SPD); +static SENSOR_DEVICE_ATTR(led_fan, S_IRUGO, read_lpc_callback, NULL, ATT_MB_LED_FAN); +static SENSOR_DEVICE_ATTR(led_lnk, S_IRUGO, read_lpc_callback, NULL, ATT_MB_LED_LNK); +static SENSOR_DEVICE_ATTR(led_pwr1, S_IRUGO, read_lpc_callback, NULL, ATT_MB_LED_PWR1); +static SENSOR_DEVICE_ATTR(led_pwr0, S_IRUGO, read_lpc_callback, NULL, ATT_MB_LED_PWR0); + +//SENSOR_DEVICE_ATTR - BSP +static SENSOR_DEVICE_ATTR(bsp_version , S_IRUGO | S_IWUSR, read_bsp_callback, write_bsp_callback, ATT_BSP_VERSION); +static SENSOR_DEVICE_ATTR(bsp_debug , S_IRUGO | S_IWUSR, read_bsp_callback, write_bsp_callback, ATT_BSP_DEBUG); +static SENSOR_DEVICE_ATTR(bsp_pr_info , S_IWUSR , NULL , write_bsp_pr_callback, ATT_BSP_PR_INFO); +static SENSOR_DEVICE_ATTR(bsp_pr_err , S_IWUSR , NULL , write_bsp_pr_callback, ATT_BSP_PR_ERR); +static SENSOR_DEVICE_ATTR(bsp_reg , S_IRUGO | S_IWUSR, read_lpc_callback, write_bsp_callback, ATT_BSP_REG); +static SENSOR_DEVICE_ATTR(bsp_reg_value, S_IRUGO , read_lpc_callback, NULL, ATT_BSP_REG_VALUE); +static SENSOR_DEVICE_ATTR(bsp_gpio_max, S_IRUGO , read_gpio_max_callback, NULL, ATT_BSP_GPIO_MAX); + + +static struct attribute *mb_cpld_attrs[] = { + &sensor_dev_attr_board_id_0.dev_attr.attr, + &sensor_dev_attr_board_id_1.dev_attr.attr, + &sensor_dev_attr_mb_cpld_1_version.dev_attr.attr, + &sensor_dev_attr_mb_cpld_1_version_h.dev_attr.attr, + &sensor_dev_attr_board_sku_id.dev_attr.attr, + &sensor_dev_attr_board_hw_id.dev_attr.attr, + &sensor_dev_attr_board_id_type.dev_attr.attr, + &sensor_dev_attr_board_build_id.dev_attr.attr, + &sensor_dev_attr_board_deph_id.dev_attr.attr, + &sensor_dev_attr_board_ext_id.dev_attr.attr, + &sensor_dev_attr_mux_reset.dev_attr.attr, + &sensor_dev_attr_fan_status.dev_attr.attr, + &sensor_dev_attr_psu_status.dev_attr.attr, + &sensor_dev_attr_port_led_clear.dev_attr.attr, + &sensor_dev_attr_led_sys.dev_attr.attr, + &sensor_dev_attr_led_id.dev_attr.attr, + &sensor_dev_attr_led_poe.dev_attr.attr, + &sensor_dev_attr_led_spd.dev_attr.attr, + &sensor_dev_attr_led_fan.dev_attr.attr, + &sensor_dev_attr_led_lnk.dev_attr.attr, + &sensor_dev_attr_led_pwr0.dev_attr.attr, + &sensor_dev_attr_led_pwr1.dev_attr.attr, + NULL, +}; + +static struct attribute *bsp_attrs[] = { + &sensor_dev_attr_bsp_version.dev_attr.attr, + &sensor_dev_attr_bsp_debug.dev_attr.attr, + &sensor_dev_attr_bsp_pr_info.dev_attr.attr, + &sensor_dev_attr_bsp_pr_err.dev_attr.attr, + &sensor_dev_attr_bsp_reg.dev_attr.attr, + &sensor_dev_attr_bsp_reg_value.dev_attr.attr, + &sensor_dev_attr_bsp_gpio_max.dev_attr.attr, + NULL, +}; + +static struct attribute_group mb_cpld_attr_grp = { + .name = "mb_cpld", + .attrs = mb_cpld_attrs, +}; + +static struct attribute_group bsp_attr_grp = { + .name = "bsp", + .attrs = bsp_attrs, +}; + +static void lpc_dev_release( struct device * dev) +{ + return; +} + +static struct platform_device lpc_dev = { + .name = DRIVER_NAME, + .id = -1, + .dev = { + .release = lpc_dev_release, + } +}; + +static int lpc_drv_probe(struct platform_device *pdev) +{ + int i = 0, grp_num = 2; + int err[5] = {0}; + struct attribute_group *grp; + + lpc_data = devm_kzalloc(&pdev->dev, sizeof(struct lpc_data_s), + GFP_KERNEL); + if(!lpc_data) + return -ENOMEM; + + mutex_init(&lpc_data->access_lock); + + for (i=0; idev.kobj, grp); + if(err[i]) { + printk(KERN_ERR "Cannot create sysfs for group %s\n", grp->name); + goto exit; + } else { + continue; + } + } + + return 0; + +exit: + for (i=0; idev.kobj, grp); + if(!err[i]) { + //remove previous successful cases + continue; + } else { + //remove first failed case, then return + return err[i]; + } + } + return 0; +} + +static int lpc_drv_remove(struct platform_device *pdev) +{ + sysfs_remove_group(&pdev->dev.kobj, &mb_cpld_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &bsp_attr_grp); + + return 0; +} + +static struct platform_driver lpc_drv = { + .probe = lpc_drv_probe, + .remove = __exit_p(lpc_drv_remove), + .driver = { + .name = DRIVER_NAME, + }, +}; + +int lpc_init(void) +{ + int err = 0; + + err = platform_driver_register(&lpc_drv); + if(err) { + printk(KERN_ERR "%s(#%d): platform_driver_register failed(%d)\n", + __func__, __LINE__, err); + + return err; + } + + err = platform_device_register(&lpc_dev); + if(err) { + printk(KERN_ERR "%s(#%d): platform_device_register failed(%d)\n", + __func__, __LINE__, err); + platform_driver_unregister(&lpc_drv); + return err; + } + + return err; +} + +void lpc_exit(void) +{ + platform_driver_unregister(&lpc_drv); + platform_device_unregister(&lpc_dev); +} + +MODULE_AUTHOR("Leo Lin "); +MODULE_DESCRIPTION("x86_64_ufispace_s6301_56st_lpc driver"); +MODULE_LICENSE("GPL"); + +module_init(lpc_init); +module_exit(lpc_exit); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-sys-eeprom.c b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-sys-eeprom.c new file mode 100644 index 000000000000..5c6dec193ef6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/modules/x86-64-ufispace-s6301-56st-sys-eeprom.c @@ -0,0 +1,273 @@ +/* + * Copyright (C) 1998, 1999 Frodo Looijaard and + * Philip Edelbrock + * Copyright (C) 2003 Greg Kroah-Hartman + * Copyright (C) 2003 IBM Corp. + * Copyright (C) 2004 Jean Delvare + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* enable dev_dbg print out */ +//#define DEBUG + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { /*0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57,*/ I2C_CLIENT_END }; + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 512 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void sys_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, (u8)((addr >> 8) & 0xFF), (u8)(addr & 0xFF)); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t sys_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + sys_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static ssize_t sys_eeprom_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + int ret; + int i; + u8 cmd; + u16 value16; + + dev_dbg(&client->dev, "sys_eeprom_write off=%d, count=%d\n", (int)off, (int)count); + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + mutex_lock(&data->update_lock); + + for(i=0; i < count; i++) { + /* write command */ + cmd = (off >> 8) & 0xff; + value16 = off & 0xff; + value16 |= buf[i] << 8; + ret = i2c_smbus_write_word_data(client, cmd, value16); + + if (ret < 0) { + dev_err(&client->dev, "write address failed at %d \n", (int)off); + goto exit; + } + + off++; + + /* need to wait for write complete */ + udelay(10000); + } +exit: + mutex_unlock(&data->update_lock); + /* force to update client when reading */ + for(i=0; i < SLICE_NUM; i++) { + data->last_updated[i] = 0; + } + + return count; +} + +static struct bin_attribute sys_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO | S_IWUSR, + }, + .size = EEPROM_SIZE, + .read = sys_eeprom_read, + .write = sys_eeprom_write, +}; + +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int sys_eeprom_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = client->adapter; + + /* EDID EEPROMs are often 24C00 EEPROMs, which answer to all + addresses 0x50-0x57, but we only care about 0x51 and 0x55. So decline + attaching to addresses >= 0x56 on DDC buses */ + if (!(adapter->class & I2C_CLASS_SPD) && client->addr >= 0x56) { + return -ENODEV; + } + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE) + && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { + return -ENODEV; + } + + strlcpy(info->type, "eeprom", I2C_NAME_SIZE); + + return 0; +} + +static int sys_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + +#ifdef __STDC_LIB_EXT1__ + memset_s(data->data, EEPROM_SIZE, 0xff, EEPROM_SIZE); +#else + memset(data->data, 0xff, EEPROM_SIZE); +#endif + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &sys_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int sys_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &sys_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id sys_eeprom_id[] = { + { "sys_eeprom", 0 }, + { } +}; + +static struct i2c_driver sys_eeprom_driver = { + .driver = { + .name = "sys_eeprom", + }, + .probe = sys_eeprom_probe, + .remove = sys_eeprom_remove, + .id_table = sys_eeprom_id, + + .class = I2C_CLASS_DDC | I2C_CLASS_SPD, + .detect = sys_eeprom_detect, + .address_list = normal_i2c, +}; + +module_i2c_driver(sys_eeprom_driver); + +MODULE_AUTHOR("Leo Lin "); +MODULE_DESCRIPTION("UfiSpace System EEPROM driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/__init__.py new file mode 100644 index 000000000000..593867d31c9d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/__init__.py @@ -0,0 +1,4 @@ +# All the derived classes for PDDF +__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] +from . import platform + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/chassis.py new file mode 100644 index 000000000000..ab3e44f74432 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/chassis.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Chassis API +# +############################################################################# + +try: + import time + from sonic_platform_pddf_base.pddf_chassis import PddfChassis + from sonic_py_common import device_info +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_COMPONENT = 2 + +class Chassis(PddfChassis): + """ + PDDF Platform-specific Chassis class + """ + + port_dict = {} + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfChassis.__init__(self, pddf_data, pddf_plugin_data) + self._initialize_components() + + def _initialize_components(self): + from sonic_platform.component import Component + for index in range(NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + return device_info.get_platform() + + def initizalize_system_led(self): + return True + + def get_status_led(self): + return self.get_system_led("SYS_LED") + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + Returns: + (bool, dict): + - bool: True if call successful, False if not; + - dict: A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, where device_id is the device ID + for this device and device_event. + The known devices's device_id and device_event was defined as table below. + ----------------------------------------------------------------- + device | device_id | device_event | annotate + ----------------------------------------------------------------- + 'sfp' '' '0' Sfp removed + '1' Sfp inserted + '2' I2C bus stuck + '3' Bad eeprom + '4' Unsupported cable + '5' High Temperature + '6' Bad cable + -------------------------------------------------------------------- + Ex. 'sfp':{'11':'0', '12':'1'}, + Indicates that: + sfp 11 has been removed, sfp 12 has been inserted. + Note: For sfp, when event 3-6 happened, the module will not be avalaible, + XCVRD shall stop to read eeprom before SFP recovered from error status. + """ + + change_event_dict = {"sfp": {}} + + start_time = time.time() + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_change_event:Invalid timeout value", timeout) + return False, change_event_dict + + end_time = start_time + timeout + if start_time > end_time: + print( + "get_change_event:" "time wrap / invalid timeout value", + timeout, + ) + return False, change_event_dict # Time wrap or possibly incorrect timeout + try: + while timeout >= 0: + # check for sfp + sfp_change_dict = self.get_transceiver_change_event() + + if sfp_change_dict: + change_event_dict["sfp"] = sfp_change_dict + return True, change_event_dict + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_event_dict + except Exception as e: + print(e) + print("get_change_event: Should not reach here.") + return False, change_event_dict + + def get_transceiver_change_event(self, timeout=0): + current_port_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index in range(self.platform_inventory['num_ports']): + if self._sfp_list[index].get_presence(): + current_port_dict[index] = self.plugin_data['XCVR']['plug_status']['inserted'] + else: + current_port_dict[index] = self.plugin_data['XCVR']['plug_status']['removed'] + + if len(self.port_dict) == 0: # first time + self.port_dict = current_port_dict + return {} + + if current_port_dict == self.port_dict: + return {} + + # Update reg value + for index, status in current_port_dict.items(): + if self.port_dict[index] != status: + ret_dict[index] = status + #ret_dict[str(index)] = status + self.port_dict = current_port_dict + for index, status in ret_dict.items(): + if int(status) == 1: + pass + #self._sfp_list[int(index)].check_sfp_optoe_type() + return ret_dict + + def get_sfp(self, index): + """ + Retrieves sfp represented by (1-based) index + + Args: + index: An integer, the index (1-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 1. + For example, 1 for Ethernet0, 2 for Ethernet4 and so on. + + Returns: + An object derived from SfpBase representing the specified sfp + """ + sfp = None + + try: + # The index will start from 1 + # sfputil already convert to physical port index according to config + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + def set_system_led(self, led_device_name, color): + """ + Sets the color of an System LED device + Args: + led_device_name: a pre-defined LED device name list used in pddf-device.json. + color: A string representing the color with which to set a LED + Returns: + bool: True if the LED state is set successfully, False if not + """ + + if led_device_name in self.plugin_data['LED']['capability']['rw']: + result, msg = self.pddf_obj.set_system_led_color(led_device_name, color) + if not result and msg: + print(msg) + return (result) + else: + print("Not Support") + return False + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = self.plugin_data['REBOOT_CAUSE']['reboot_cause_file'] + + try: + with open(reboot_cause_path, 'r', errors='replace') as fd: + data = fd.read() + sw_reboot_cause = data.strip() + except IOError: + sw_reboot_cause = "Unknown" + + return ('REBOOT_CAUSE_NON_HARDWARE', sw_reboot_cause) \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/component.py new file mode 100644 index 000000000000..c0b7816d4a82 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/component.py @@ -0,0 +1,108 @@ +############################################################################# +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_SYSFS = { + "CPLD1": "/sys/devices/platform/x86_64_ufispace_s6301_56st_lpc/mb_cpld/mb_cpld_1_version_h", +} + +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("CPLD1", "CPLD 1"), + ("BIOS", "Basic Input/Output System"), +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + self.index = component_index + self.name = self.get_name() + + def _run_command(self, command): + # Run bash command and print output to stdout + try: + process = subprocess.Popen( + shlex.split(command), stdout=subprocess.PIPE) + while True: + output = process.stdout.readline() + if output == '' and process.poll() is not None: + break + rc = process.poll() + if rc != 0: + return False + except Exception: + return False + return True + + def _get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def _get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name in CPLD_SYSFS: + cmd = "cat {}".format(CPLD_SYSFS[cpld_name]) + status, value = subprocess.getstatusoutput(cmd) + if not status: + cpld_version[cpld_name] = value.rstrip() + + return cpld_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self._get_bios_version() + elif "CPLD" in self.name: + cpld_version = self._get_cpld_version() + fw_version = cpld_version.get(self.name) + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/eeprom.py new file mode 100644 index 000000000000..90ab1c779a48 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(PddfEeprom): + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + + def platform_name_str(self): + (is_valid, results) = self.get_tlv_field(self.eeprom_data, self._TLV_CODE_PLATFORM_NAME) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan.py new file mode 100644 index 000000000000..2eadfd0a465a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python + +import os + +try: + from sonic_platform_pddf_base.pddf_fan import PddfFan + from sonic_platform.psu_fru import PsuFru +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Fan(PddfFan): + """PDDF Platform-Specific Fan class""" + + def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): + # idx is 0-based + PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten + # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed_percentage = 0 + if self.is_psu_fan: + max_speed = int(self.plugin_data['PSU']['PSU_FAN_MAX_SPEED']) + else: + max_speed = int(self.plugin_data['FAN']['FAN_MAX_SPEED']) + + speed = int(self.get_speed_rpm()) + + + speed_percentage = round((speed*100)/max_speed) + return min(speed_percentage, 100) + + def get_speed_rpm(self): + """ + Retrieves the speed of fan in RPM + + Returns: + An integer, Speed of fan in RPM + """ + rpm_speed = 0 + if self.is_psu_fan: + attr = "psu_fan{}_speed_rpm".format(self.fan_index) + device = "PSU{}".format(self.fans_psu_index) + output = self.pddf_obj.get_attr_name_output(device, attr) + if output is None: + return rpm_speed + + output['status'] = output['status'].rstrip() + if output['status'].isalpha(): + return rpm_speed + else: + rpm_speed = int(float(output['status'])) + else: + ucd_path = "/sys/bus/i2c/devices/5-0034/hwmon/" + if os.path.exists(ucd_path): + hwmon_dir = os.listdir(ucd_path) + with open("{}/{}/temp{}_input".format(ucd_path, hwmon_dir[0], self.fantray_index), "rb") as f: + rpm_speed = int(f.read().strip()) + + return rpm_speed + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + direction = self.FAN_DIRECTION_NOT_APPLICABLE + if self.is_psu_fan: + psu_fru = PsuFru(self.fans_psu_index) + if psu_fru.mfr_id == "not available": + return direction + for dev in self.plugin_data['PSU']['psu_support_list']: + if dev['Mfr_id'] == psu_fru.mfr_id and dev['Model'] == psu_fru.model: + dir = dev['Dir'] + break + else: + attr = "fan{}_direction".format(self.fantray_index) + device = "FAN-CTRL" + output = self.pddf_obj.get_attr_name_output(device, attr) + if not output: + return direction + mode = output['mode'] + val = output['status'].strip() + vmap = self.plugin_data['FAN']['direction'][mode]['valmap'] + if val in vmap: + dir = vmap[val] + + return dir + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + presence = False + if self.is_psu_fan: + attr = "psu_present" + device = "PSU{}".format(self.fans_psu_index) + else: + attr = "fan{}_present".format(self.fantray_index) + device = "FAN-CTRL" + + output = self.pddf_obj.get_attr_name_output(device, attr) + if not output: + return presence + + + mode = output['mode'] + val = output['status'].strip() + vmap = self.plugin_data['FAN']['present'][mode]['valmap'] + + if val in vmap: + presence = vmap[val] + + return presence + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + + return self.get_speed() + + def set_speed(self, speed): + """ + Sets the fan speed + + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + + Returns: + A boolean, True if speed is set successfully, False if not + """ + + print("Setting Fan speed is not allowed") + return False + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/platform.py new file mode 100644 index 000000000000..406b1179ae1b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/platform.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + + +try: + from sonic_platform_pddf_base.pddf_platform import PddfPlatform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PddfPlatform): + """ + PDDF Platform-Specific Platform Class + """ + + def __init__(self): + PddfPlatform.__init__(self) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu.py new file mode 100644 index 000000000000..008aa600cdf8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_psu import PddfPsu + from sonic_platform.psu_fru import PsuFru +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Psu(PddfPsu): + """PDDF Platform-Specific PSU class""" + + PLATFORM_PSU_CAPACITY = 750 + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) + self.psu_fru = PsuFru(self.psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU (or PSU capacity) + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(self.PLATFORM_PSU_CAPACITY) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + + # power is returned in micro watts + return round(float(self.get_voltage()*self.get_current()), 2) + + def get_mfr_id(self): + """ + Retrieves the manufacturer's name (or id) of the device + + Returns: + string: Manufacturer's id of device + """ + return self.psu_fru.mfr_id.rstrip() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + return self.psu_fru.model.rstrip() + + def get_serial(self): + """ + Retrieves the serial number of the device + + Returns: + string: Serial number of device + """ + return self.psu_fru.serial.rstrip() diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu_fru.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu_fru.py new file mode 100644 index 000000000000..7f640352be7f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/psu_fru.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +class PsuFru: + """PSU FRU class""" + eeprom = "" + mfr_id = "not available" + model = "not available" + serial = "not available" + + def __init__(self, psu_index): + self.psu_index = psu_index + self.eeprom = "/sys/bus/i2c/devices/2-00{}/eeprom".format(49 + psu_index) + self._parse_fru_eeprom() + + def _parse_fru_eeprom(self): + """ + Parsing eeprom fru content of PSU + """ + try: + with open(self.eeprom, 'rb') as eeprom: + data = eeprom.read() + + # check if dummy content + if data[0] == 0xff: + return + + i = 11 + + data_len = (data[i]&0x3f) + i += 1 + self.mfr_id = data[i:i+data_len].decode('utf-8') + i += data_len + + data_len = (data[i]&0x3f) + i += 1 + i += data_len + + data_len = (data[i]&0x3f) + i += 1 + self.model = data[i:i+data_len].decode('utf-8') + i += data_len + + data_len = (data[i]&0x3f) + i += 1 + i += data_len + + data_len = (data[i]&0x3f) + i += 1 + self.serial = data[i:i+data_len].decode('utf-8') + except Exception as e: + return + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/sfp.py new file mode 100644 index 000000000000..22229484ae60 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/sfp.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_sfp import PddfSfp +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Sfp(PddfSfp): + """ + PDDF Platform-Specific Sfp class + """ + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data) + self.index = index + + # Provide the functions/variables below for which implementation is to be overwritten + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + + return self.SFP_STATUS_OK + + def get_lpmode(self): + return False + + def set_lpmode(self, lpmode): + return False + + def reset(self): + return False diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/thermal.py new file mode 100644 index 000000000000..77d6ec7ae886 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/thermal.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_thermal import PddfThermal +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + + +class Thermal(PddfThermal): + """PDDF Platform-Specific Thermal class""" + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/watchdog.py new file mode 100644 index 000000000000..88660b1a1faa --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform/watchdog.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of platform specific watchdog API's +# +############################################################################# + +try: + from sonic_platform_pddf_base.pddf_watchdog import PddfWatchdog +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Watchdog(PddfWatchdog): + """ + PDDF Platform-specific Chassis class + """ + + def __init__(self): + PddfWatchdog.__init__(self) + self.timeout= 180 + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform_setup.py new file mode 100644 index 000000000000..3661c84a0cd6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/sonic_platform_setup.py @@ -0,0 +1,27 @@ +from setuptools import setup + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on ufispace platform', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='Leo Lin', + maintainer_email='leo.yt.lin@ufispace.com', + packages=['sonic_platform'], + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_device_create.sh b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_device_create.sh new file mode 100755 index 000000000000..5905a4e14b9b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_device_create.sh @@ -0,0 +1,11 @@ +#!/bin/bash +echo "Reset port led" +echo 0 > /sys/devices/platform/x86_64_ufispace_s6301_56st_lpc//mb_cpld/port_led_clear +sleep 0.5 +echo 1 > /sys/devices/platform/x86_64_ufispace_s6301_56st_lpc//mb_cpld/port_led_clear + +curr_led=$(pddf_ledutil getstatusled SYS_LED) +pddf_ledutil setstatusled SYS_LED green +echo "Set System $curr_led to green" + +echo "PDDF device post-create completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_driver_install.sh new file mode 100755 index 000000000000..ed2559977e42 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_post_driver_install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "PDDF driver post-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_pre_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_pre_driver_install.sh new file mode 100755 index 000000000000..187943061e6c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_pre_driver_install.sh @@ -0,0 +1,11 @@ +#!/bin/bash +#rmmod gpio_ich +if [ ! -f /tmp/._pddf_pre_driver_init_completion ]; then + # make sure igb/i40e init in correct order + rmmod i2c-i801 + rmmod i2c_ismt + modprobe -r i2c-i801 + modprobe -r i2c_ismt + date > /tmp/._pddf_pre_driver_init_completion +fi +echo "PDDF driver pre-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_switch_svc.py b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_switch_svc.py new file mode 100644 index 000000000000..88c1a3b3e572 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s6301-56st/utils/pddf_switch_svc.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# Script to stop and start the respective platforms default services. +# This will be used while switching the pddf->non-pddf mode and vice versa +import commands + +def check_pddf_support(): + return True + +def stop_platform_svc(): + + ''' + status, output = commands.getstatusoutput("systemctl stop s6301-56st-platform-monitor-fan.service") + if status: + print "Stop s6301-56st-platform-fan.service failed %d"%status + return False + + status, output = commands.getstatusoutput("systemctl stop s6301-56st-platform-monitor-psu.service") + if status: + print "Stop s6301-56st-platform-psu.service failed %d"%status + return False + + status, output = commands.getstatusoutput("systemctl stop s6301-56st-platform-monitor.service") + if status: + print "Stop s6301-56st-platform-init.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl disable s6301-56st-platform-monitor.service") + if status: + print "Disable s6301-56st-platform-monitor.service failed %d"%status + return False + ''' + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py deinit") + if status: + print "platform_utility.py deinit command failed %d"%status + return False + + # HACK , stop the pddf-platform-init service if it is active + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service along with other platform serives failed %d"%status + return False + + return True + +def start_platform_svc(): + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py init") + if status: + print "platform_utility.py init command failed %d"%status + return False + + ''' + status, output = commands.getstatusoutput("systemctl enable s6301-56st-platform-monitor.service") + if status: + print "Enable s6301-56st-platform-monitor.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl start s6301-56st-platform-monitor-fan.service") + if status: + print "Start s6301-56st-platform-monitor-fan.service failed %d"%status + return False + + status, output = commands.getstatusoutput("systemctl start s6301-56st-platform-monitor-psu.service") + if status: + print "Start s6301-56st-platform-monitor-psu.service failed %d"%status + return False + ''' + return True + +def start_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") + if status: + print "Start pddf-platform-init.service failed %d"%status + return False + + return True + +def stop_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service failed %d"%status + return False + + return True + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/Makefile b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/Makefile new file mode 100644 index 000000000000..f399cd24e23a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/Makefile @@ -0,0 +1,6 @@ + +MODULE_NAME = x86-64-ufispace-s7801-54xs-cpld.o x86-64-ufispace-s7801-54xs-sys-eeprom.o x86-64-ufispace-s7801-54xs-lpc.o pddf_custom_sysstatus_module.o +obj-m := $(MODULE_NAME) + +CFLAGS_pddf_custom_sysstatus_module.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/pddf_custom_sysstatus_module.c b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/pddf_custom_sysstatus_module.c new file mode 100644 index 000000000000..b50bb428000a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/pddf_custom_sysstatus_module.c @@ -0,0 +1,276 @@ +/* + * Copyright 2019 Broadcom. + * The term ��Broadcom�� refers to Broadcom Inc. and/or its subsidiaries. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * A pddf kernel module for system status registers + */ + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../../pddf/i2c/modules/include/pddf_client_defs.h" +#include "../../../../pddf/i2c/modules/include/pddf_sysstatus_defs.h" + + +SYSSTATUS_DATA sysstatus_data = {0}; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf); +ssize_t store_sysstatus_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + + +PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, + (void*)&sysstatus_data.sysstatus_addr_attr.aname, NULL); +PDDF_DATA_ATTR(attr_devaddr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.devaddr , NULL); +PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.offset, NULL); +PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.mask , NULL); +PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.len , NULL); +PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&sysstatus_data, NULL); + + + +static struct attribute *sysstatus_addr_attributes[] = { + &attr_attr_name.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + NULL +}; + +PDDF_DATA_ATTR(board_sku_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_hw_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_deph_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_build_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_major_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_minor_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_build , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_major_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_minor_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_build , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(psu_status , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_psu , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_sys , S_IWUSR|S_IRUGO, show_sysstatus_data, store_sysstatus_data, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_sync, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_fan , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_id , S_IWUSR|S_IRUGO, show_sysstatus_data, store_sysstatus_data, PDDF_UCHAR, sizeof(u8), NULL, NULL); + +static struct attribute *sysstatus_data_attributes[] = { + &attr_board_sku_id.dev_attr.attr, + &attr_board_hw_id.dev_attr.attr, + &attr_board_deph_id.dev_attr.attr, + &attr_board_build_id.dev_attr.attr, + &attr_cpld1_major_ver.dev_attr.attr, + &attr_cpld1_minor_ver.dev_attr.attr, + &attr_cpld1_build.dev_attr.attr, + &attr_cpld2_major_ver.dev_attr.attr, + &attr_cpld2_minor_ver.dev_attr.attr, + &attr_cpld2_build.dev_attr.attr, + &attr_psu_status.dev_attr.attr, + &attr_system_led_psu.dev_attr.attr, + &attr_system_led_sys.dev_attr.attr, + &attr_system_led_sync.dev_attr.attr, + &attr_system_led_fan.dev_attr.attr, + &attr_system_led_id.dev_attr.attr, + NULL +}; + + +static const struct attribute_group pddf_sysstatus_addr_group = { + .attrs = sysstatus_addr_attributes, +}; + + +static const struct attribute_group pddf_sysstatus_data_group = { + .attrs = sysstatus_data_attributes, +}; + + +static struct kobject *sysstatus_addr_kobj; +static struct kobject *sysstatus_data_kobj; + + + +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf) +{ + + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + SYSSTATUS_DATA *data = &sysstatus_data; + struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; + int i, status ; + + + for (i=0;isysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) + { + sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; + + } + } + + if (sysstatus_addr_attrs==NULL ) + { + printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); + status = 0; + } + else + { + status = board_i2c_cpld_read( sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset); + } + + return sprintf(buf, "0x%x\n", (status&sysstatus_addr_attrs->mask)); + +} + +ssize_t store_sysstatus_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + SYSSTATUS_DATA *data = &sysstatus_data; + struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; + int i, status ; + u8 reg_val; + + for (i=0;isysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) + { + sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; + } + } + + if (sysstatus_addr_attrs==NULL) + { + printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); + return -EINVAL; + } + else + { + if (kstrtou8(buf, 0, ®_val) < 0) + return -EINVAL; + + status = board_i2c_cpld_write(sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset, reg_val); + + if (status!=0) + { + printk(KERN_DEBUG "store_sysstatus_data() %s failed, status=%d\n",data->sysstatus_addr_attrs[i].aname, status); + return status; + } + } + + return count; +} + + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + SYSSTATUS_DATA *pdata = (SYSSTATUS_DATA *)(ptr->addr); + + pdata->sysstatus_addr_attrs[pdata->len] = pdata->sysstatus_addr_attr; + pdata->len++; + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Populating the data for %s\n", __FUNCTION__, pdata->sysstatus_addr_attr.aname); + +#ifdef __STDC_LIB_EXT1__ + memset_s(&pdata->sysstatus_addr_attr, sizeof(pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); +#else + memset(&pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); +#endif + + return count; +} + + + + +int __init sysstatus_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + sysstatus_addr_kobj = kobject_create_and_add("sysstatus", device_kobj); + if(!sysstatus_addr_kobj) + return -ENOMEM; + + sysstatus_data_kobj = kobject_create_and_add("sysstatus_data", sysstatus_addr_kobj); + if(!sysstatus_data_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + if (ret) + { + kobject_put(sysstatus_addr_kobj); + return ret; + } + + ret = sysfs_create_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + if (ret) + { + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + return ret; + } + + + return ret; +} + +void __exit sysstatus_data_exit(void) +{ + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. exit\n"); + sysfs_remove_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Removed the kobjects for 'SYSSTATUS'\n",__FUNCTION__); + return; +} + +module_init(sysstatus_data_init); +module_exit(sysstatus_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("SYSSTATUS platform data"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.c b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.c new file mode 100644 index 000000000000..0cefcb8aac5f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.c @@ -0,0 +1,1512 @@ +/* + * A i2c cpld driver for the ufispace_s7801_54xs + * + * Copyright (C) 2017-2022 UfiSpace Technology Corporation. + * Jason Tsai + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "x86-64-ufispace-s7801-54xs-cpld.h" + +#ifdef DEBUG +#define DEBUG_PRINT(fmt, args...) \ + printk(KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#else +#define DEBUG_PRINT(fmt, args...) +#endif + +#define BSP_LOG_R(fmt, args...) \ + _bsp_log (LOG_READ, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_LOG_W(fmt, args...) \ + _bsp_log (LOG_WRITE, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) + +#define I2C_READ_BYTE_DATA(ret, lock, i2c_client, reg) \ +{ \ + mutex_lock(lock); \ + ret = i2c_smbus_read_byte_data(i2c_client, reg); \ + mutex_unlock(lock); \ + BSP_LOG_R("cpld[%d], reg=0x%03x, reg_val=0x%02x", data->index, reg, ret); \ +} + +#define I2C_WRITE_BYTE_DATA(ret, lock, i2c_client, reg, val) \ +{ \ + mutex_lock(lock); \ + ret = i2c_smbus_write_byte_data(i2c_client, reg, val); \ + mutex_unlock(lock); \ + BSP_LOG_W("cpld[%d], reg=0x%03x, reg_val=0x%02x", data->index, reg, val); \ +} + +#define _SENSOR_DEVICE_ATTR_RO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO, read_##_func, NULL, _index) + +#define _SENSOR_DEVICE_ATTR_WO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IWUSR, NULL, write_##_func, _index) + +#define _SENSOR_DEVICE_ATTR_RW(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR, read_##_func, write_##_func, _index) + +#define _DEVICE_ATTR(_name) \ + &sensor_dev_attr_##_name.dev_attr.attr + +#define I2C_RW_RETRY_COUNT 3 +#define I2C_RW_RETRY_INTERVAL 60 + +/* CPLD sysfs attributes index */ +enum cpld_sysfs_attributes { + //CPLD 1 + + CPLD_BOARD_ID_0, + CPLD_BOARD_ID_1, + CPLD_ID, + CPLD_CHIP, + CPLD_SKU_EXT, + + CPLD_MAJOR_VER, + CPLD_MINOR_VER, + CPLD_BUILD_VER, + CPLD_VERSION_H, + + CPLD_MAC_INTR, + CPLD_HWM_INTR, + CPLD_CPLD2_INTR, + CPLD_NTM_INTR, + CPLD_FAN_PSU_INTR, + CPLD_SFP_IOEXP_INTR, + CPLD_CPU_NMI_INTR, + CPLD_PTP_INTR, + CPLD_SYSTEM_INTR, + + CPLD_MAC_MASK, + CPLD_HWM_MASK, + CPLD_CPLD2_MASK, + CPLD_NTM_MASK, + CPLD_FAN_PSU_MASK, + CPLD_SFP_IOEXP_MASK, + CPLD_CPU_NMI_MASK, + CPLD_PTP_MASK, + CPLD_SYSTEM_MASK, + + CPLD_MAC_EVT, + CPLD_HWM_EVT, + CPLD_CPLD2_EVT, + CPLD_NTM_EVT, + CPLD_FAN_PSU_EVT, + CPLD_SFP_IOEXP_EVT, + CPLD_CPU_NMI_EVT, + CPLD_PTP_EVT, + + CPLD_EVT_CTRL, + + CPLD_MAC_RESET, + CPLD_SYSTEM_RESET, + CPLD_BMC_NTM_RESET, + CPLD_USB_RESET, + CPLD_I2C_MUX_RESET, + CPLD_I2C_MUX_RESET_2, + CPLD_MISC_RESET, + + CPLD_BRD_PRESENT, + CPLD_PSU_STATUS, + CPLD_SYSTEM_PWR, + CPLD_MAC_SYNCE, + CPLD_MAC_AVS, + CPLD_SYSTEM_STATUS, + CPLD_FAN_PRESENT, + CPLD_WATCHDOG, + CPLD_BOOT_SELECT, + CPLD_MUX_CTRL, + CPLD_MISC_CTRL_1, + CPLD_MISC_CTRL_2, + CPLD_TIMING_CTRL, + + CPLD_MAC_TEMP, + + CPLD_SYSTEM_LED_SYNC, + CPLD_SYSTEM_LED_SYS, + CPLD_SYSTEM_LED_FAN, + CPLD_SYSTEM_LED_PSU_0, + CPLD_SYSTEM_LED_PSU_1, + CPLD_SYSTEM_LED_ID, + + DBG_CPLD_MAC_INTR, + DBG_CPLD_HWM_INTR, + DBG_CPLD_CPLD2_INTR, + DBG_CPLD_NTM_INTR, + DBG_CPLD_FAN_PSU_INTR, + DBG_CPLD_SFP_IOEXP_INTR, + DBG_CPLD_PTP_INTR, + + //CPLD 2 + + //interrupt status + CPLD_SFP_INTR_PRESENT_0_7, + CPLD_SFP_INTR_PRESENT_8_15, + CPLD_SFP_INTR_PRESENT_16_23, + CPLD_SFP_INTR_PRESENT_24_31, + CPLD_SFP_INTR_PRESENT_32_39, + CPLD_SFP_INTR_PRESENT_40_47, + CPLD_QSFP_INTR_PRESENT_48_53, + CPLD_QSFP_INTR_PORT_48_53, + + //interrupt mask + CPLD_SFP_MASK_PRESENT_0_7, + CPLD_SFP_MASK_PRESENT_8_15, + CPLD_SFP_MASK_PRESENT_16_23, + CPLD_SFP_MASK_PRESENT_24_31, + CPLD_SFP_MASK_PRESENT_32_39, + CPLD_SFP_MASK_PRESENT_40_47, + CPLD_QSFP_MASK_PRESENT_48_53, + CPLD_QSFP_MASK_PORT_48_53, + + //interrupt event + CPLD_SFP_EVT_PRESENT_0_7, + CPLD_SFP_EVT_PRESENT_8_15, + CPLD_SFP_EVT_PRESENT_16_23, + CPLD_SFP_EVT_PRESENT_24_31, + CPLD_SFP_EVT_PRESENT_32_39, + CPLD_SFP_EVT_PRESENT_40_47, + CPLD_QSFP_EVT_PRESENT_48_53, + CPLD_QSFP_EVT_PORT_48_53, + + CPLD_SFP_INTR_RX_LOS_0_7, + CPLD_SFP_INTR_RX_LOS_8_15, + CPLD_SFP_INTR_RX_LOS_16_23, + CPLD_SFP_INTR_RX_LOS_24_31, + CPLD_SFP_INTR_RX_LOS_32_39, + CPLD_SFP_INTR_RX_LOS_40_47, + + CPLD_SFP_INTR_TX_FAULT_0_7, + CPLD_SFP_INTR_TX_FAULT_8_15, + CPLD_SFP_INTR_TX_FAULT_16_23, + CPLD_SFP_INTR_TX_FAULT_24_31, + CPLD_SFP_INTR_TX_FAULT_32_39, + CPLD_SFP_INTR_TX_FAULT_40_47, + + CPLD_SFP_MASK_RX_LOS_0_7, + CPLD_SFP_MASK_RX_LOS_8_15, + CPLD_SFP_MASK_RX_LOS_16_23, + CPLD_SFP_MASK_RX_LOS_24_31, + CPLD_SFP_MASK_RX_LOS_32_39, + CPLD_SFP_MASK_RX_LOS_40_47, + + CPLD_SFP_MASK_TX_FAULT_0_7, + CPLD_SFP_MASK_TX_FAULT_8_15, + CPLD_SFP_MASK_TX_FAULT_16_23, + CPLD_SFP_MASK_TX_FAULT_24_31, + CPLD_SFP_MASK_TX_FAULT_32_39, + CPLD_SFP_MASK_TX_FAULT_40_47, + + CPLD_SFP_EVT_RX_LOS_0_7, + CPLD_SFP_EVT_RX_LOS_8_15, + CPLD_SFP_EVT_RX_LOS_16_23, + CPLD_SFP_EVT_RX_LOS_24_31, + CPLD_SFP_EVT_RX_LOS_32_39, + CPLD_SFP_EVT_RX_LOS_40_47, + + CPLD_SFP_EVT_TX_FAULT_0_7, + CPLD_SFP_EVT_TX_FAULT_8_15, + CPLD_SFP_EVT_TX_FAULT_16_23, + CPLD_SFP_EVT_TX_FAULT_24_31, + CPLD_SFP_EVT_TX_FAULT_32_39, + CPLD_SFP_EVT_TX_FAULT_40_47, + + CPLD_SFP_TX_DISABLE_0_7, + CPLD_SFP_TX_DISABLE_8_15, + CPLD_SFP_TX_DISABLE_16_23, + CPLD_SFP_TX_DISABLE_24_31, + CPLD_SFP_TX_DISABLE_32_39, + CPLD_SFP_TX_DISABLE_40_47, + + CPLD_QSFP_RESET_48_53, + CPLD_QSFP_LPMODE_48_53, + + //debug interrupt status + DBG_CPLD_SFP_INTR_PRESENT_0_7, + DBG_CPLD_SFP_INTR_PRESENT_8_15, + DBG_CPLD_SFP_INTR_PRESENT_16_23, + DBG_CPLD_SFP_INTR_PRESENT_24_31, + DBG_CPLD_SFP_INTR_PRESENT_32_39, + DBG_CPLD_SFP_INTR_PRESENT_40_47, + DBG_CPLD_QSFP_INTR_PRESENT_48_53, + DBG_CPLD_QSFP_INTR_PORT_48_53, + + //debug interrupt mask + DBG_CPLD_SFP_INTR_RX_LOS_0_7, + DBG_CPLD_SFP_INTR_RX_LOS_8_15, + DBG_CPLD_SFP_INTR_RX_LOS_16_23, + DBG_CPLD_SFP_INTR_RX_LOS_24_31, + DBG_CPLD_SFP_INTR_RX_LOS_32_39, + DBG_CPLD_SFP_INTR_RX_LOS_40_47, + + DBG_CPLD_SFP_INTR_TX_FAULT_0_7, + DBG_CPLD_SFP_INTR_TX_FAULT_8_15, + DBG_CPLD_SFP_INTR_TX_FAULT_16_23, + DBG_CPLD_SFP_INTR_TX_FAULT_24_31, + DBG_CPLD_SFP_INTR_TX_FAULT_32_39, + DBG_CPLD_SFP_INTR_TX_FAULT_40_47, + + //BSP DEBUG + BSP_DEBUG +}; + +enum bsp_log_types { + LOG_NONE, + LOG_RW, + LOG_READ, + LOG_WRITE +}; + +enum bsp_log_ctrl { + LOG_DISABLE, + LOG_ENABLE +}; + +/* CPLD sysfs attributes hook functions */ +static ssize_t read_cpld_callback(struct device *dev, + struct device_attribute *da, char *buf); +static ssize_t write_cpld_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count); +static u8 _read_cpld_reg(struct device *dev, u8 reg, u8 mask); +static ssize_t read_cpld_reg(struct device *dev, char *buf, u8 reg, u8 mask); +static ssize_t write_cpld_reg(struct device *dev, const char *buf, size_t count, u8 reg, u8 mask); +static ssize_t read_bsp(char *buf, char *str); +static ssize_t write_bsp(const char *buf, char *str, size_t str_len, size_t count); +static ssize_t read_bsp_callback(struct device *dev, + struct device_attribute *da, char *buf); +static ssize_t write_bsp_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count); +static ssize_t read_cpld_version_h(struct device *dev, + struct device_attribute *da, + char *buf); + +static LIST_HEAD(cpld_client_list); /* client list for cpld */ +static struct mutex list_lock; /* mutex for client list */ + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +struct cpld_data { + int index; /* CPLD index */ + struct mutex access_lock; /* mutex for cpld access */ + u8 access_reg; /* register to access */ +}; + +typedef struct sysfs_info_s +{ + u8 reg; + u8 mask; + u8 permission; +} sysfs_info_t; + +static sysfs_info_t sysfs_info[] = { + //CPLD 1 + + [CPLD_BOARD_ID_0] = {CPLD_BOARD_ID_0_REG, MASK_ALL, PERM_R}, + [CPLD_BOARD_ID_1] = {CPLD_BOARD_ID_1_REG, MASK_ALL, PERM_R}, + [CPLD_ID] = {CPLD_ID_REG, MASK_ALL, PERM_R}, + [CPLD_CHIP] = {CPLD_CHIP_REG, MASK_ALL, PERM_R}, + [CPLD_SKU_EXT] = {CPLD_SKU_EXT_REG, MASK_ALL, PERM_R}, + + [CPLD_MAJOR_VER] = {CPLD_VERSION_REG, MASK_CPLD_MAJOR_VER, PERM_R}, + [CPLD_MINOR_VER] = {CPLD_VERSION_REG, MASK_CPLD_MINOR_VER, PERM_R}, + [CPLD_BUILD_VER] = {CPLD_BUILD_REG, MASK_ALL, PERM_R}, + [CPLD_VERSION_H] = {CPLD_VERSION_REG, MASK_ALL, PERM_R}, + + [CPLD_MAC_INTR] = {CPLD_MAC_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_HWM_INTR] = {CPLD_HWM_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_CPLD2_INTR] = {CPLD_CPLD2_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_NTM_INTR] = {CPLD_NTM_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_FAN_PSU_INTR] = {CPLD_FAN_PSU_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_IOEXP_INTR] = {CPLD_SFP_IOEXP_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_CPU_NMI_INTR] = {CPLD_CPU_NMI_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_PTP_INTR] = {CPLD_PTP_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_SYSTEM_INTR] = {CPLD_SYSTEM_INTR_REG, MASK_ALL, PERM_R}, + + [CPLD_MAC_MASK] = {CPLD_MAC_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_HWM_MASK] = {CPLD_HWM_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_CPLD2_MASK] = {CPLD_CPLD2_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_NTM_MASK] = {CPLD_NTM_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_FAN_PSU_MASK] = {CPLD_FAN_PSU_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_IOEXP_MASK] = {CPLD_SFP_IOEXP_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_CPU_NMI_MASK] = {CPLD_CPU_NMI_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_PTP_MASK] = {CPLD_PTP_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_SYSTEM_MASK] = {CPLD_SYSTEM_MASK_REG, MASK_ALL, PERM_RW}, + + [CPLD_MAC_EVT] = {CPLD_MAC_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_HWM_EVT] = {CPLD_HWM_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_CPLD2_EVT] = {CPLD_CPLD2_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_NTM_EVT] = {CPLD_NTM_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_FAN_PSU_EVT] = {CPLD_FAN_PSU_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_IOEXP_EVT] = {CPLD_SFP_IOEXP_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_CPU_NMI_EVT] = {CPLD_CPU_NMI_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_PTP_EVT] = {CPLD_PTP_EVT_REG, MASK_ALL, PERM_R}, + + [CPLD_EVT_CTRL] = {CPLD_EVT_CTRL_REG, MASK_ALL, PERM_RW}, + + [CPLD_MAC_RESET] = {CPLD_MAC_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_SYSTEM_RESET] = {CPLD_SYSTEM_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_BMC_NTM_RESET] = {CPLD_BMC_NTM_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_USB_RESET] = {CPLD_USB_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_I2C_MUX_RESET] = {CPLD_I2C_MUX_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_I2C_MUX_RESET_2] = {CPLD_I2C_MUX_RESET_2_REG, MASK_ALL, PERM_RW}, + [CPLD_MISC_RESET] = {CPLD_MISC_RESET_REG, MASK_ALL, PERM_RW}, + + [CPLD_BRD_PRESENT] = {CPLD_BRD_PRESENT_REG, MASK_ALL, PERM_R}, + [CPLD_PSU_STATUS] = {CPLD_PSU_STATUS_REG, MASK_ALL, PERM_R}, + [CPLD_SYSTEM_PWR] = {CPLD_SYSTEM_PWR_REG, MASK_ALL, PERM_R}, + [CPLD_MAC_SYNCE] = {CPLD_MAC_SYNCE_REG, MASK_ALL, PERM_R}, + [CPLD_MAC_AVS] = {CPLD_MAC_AVS_REG, MASK_ALL, PERM_R}, + [CPLD_SYSTEM_STATUS] = {CPLD_SYSTEM_STATUS_REG, MASK_ALL, PERM_R}, + [CPLD_FAN_PRESENT] = {CPLD_FAN_PRESENT_REG, MASK_ALL, PERM_R}, + [CPLD_WATCHDOG] = {CPLD_WATCHDOG_REG, MASK_ALL, PERM_RW}, + [CPLD_BOOT_SELECT] = {CPLD_BOOT_SELECT_REG, MASK_ALL, PERM_RW}, + [CPLD_MUX_CTRL] = {CPLD_MUX_CTRL_REG, MASK_ALL, PERM_RW}, + [CPLD_MISC_CTRL_1] = {CPLD_MISC_CTRL_1_REG, MASK_ALL, PERM_RW}, + [CPLD_MISC_CTRL_2] = {CPLD_MISC_CTRL_2_REG, MASK_ALL, PERM_RW}, + [CPLD_TIMING_CTRL] = {CPLD_TIMING_CTRL_REG, MASK_ALL, PERM_RW}, + + [CPLD_MAC_TEMP] = {CPLD_MAC_TEMP_REG, MASK_ALL, PERM_R}, + + [CPLD_SYSTEM_LED_SYNC] = {CPLD_SYSTEM_LED_SYNC_REG, CPLD_SYSTEM_LED_SYNC_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_SYS] = {CPLD_SYSTEM_LED_SYS_REG, CPLD_SYSTEM_LED_SYS_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_FAN] = {CPLD_SYSTEM_LED_FAN_REG, CPLD_SYSTEM_LED_FAN_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_PSU_0] = {CPLD_SYSTEM_LED_PSU_REG, CPLD_SYSTEM_LED_PSU_0_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_PSU_1] = {CPLD_SYSTEM_LED_PSU_REG, CPLD_SYSTEM_LED_PSU_1_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_ID] = {CPLD_SYSTEM_LED_ID_REG, CPLD_SYSTEM_LED_ID_MASK, PERM_RW}, + + [DBG_CPLD_MAC_INTR] = {DBG_CPLD_MAC_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_HWM_INTR] = {DBG_CPLD_HWM_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_CPLD2_INTR] = {DBG_CPLD_CPLD2_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_NTM_INTR] = {DBG_CPLD_NTM_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_FAN_PSU_INTR] = {DBG_CPLD_FAN_PSU_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_SFP_IOEXP_INTR] = {DBG_CPLD_SFP_IOEXP_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_PTP_INTR] = {DBG_CPLD_PTP_INTR_REG, MASK_ALL, PERM_RW}, + + //CPLD 2 + + //interrupt status + [CPLD_SFP_INTR_PRESENT_0_7] = {CPLD_SFP_INTR_PRESENT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_8_15] = {CPLD_SFP_INTR_PRESENT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_16_23] = {CPLD_SFP_INTR_PRESENT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_24_31] = {CPLD_SFP_INTR_PRESENT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_32_39] = {CPLD_SFP_INTR_PRESENT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_40_47] = {CPLD_SFP_INTR_PRESENT_40_47_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_INTR_PRESENT_48_53] = {CPLD_QSFP_INTR_PRESENT_48_53_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_INTR_PORT_48_53] = {CPLD_QSFP_INTR_PORT_48_53_REG, MASK_ALL, PERM_R}, + + //interrupt mask + [CPLD_SFP_MASK_PRESENT_0_7] = {CPLD_SFP_MASK_PRESENT_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_8_15] = {CPLD_SFP_MASK_PRESENT_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_16_23] = {CPLD_SFP_MASK_PRESENT_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_24_31] = {CPLD_SFP_MASK_PRESENT_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_32_39] = {CPLD_SFP_MASK_PRESENT_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_40_47] = {CPLD_SFP_MASK_PRESENT_40_47_REG, MASK_ALL, PERM_RW}, + [CPLD_QSFP_MASK_PRESENT_48_53] = {CPLD_QSFP_MASK_PRESENT_48_53_REG, MASK_ALL, PERM_RW}, + [CPLD_QSFP_MASK_PORT_48_53] = {CPLD_QSFP_MASK_PORT_48_53_REG, MASK_ALL, PERM_RW}, + + //interrupt event + [CPLD_SFP_EVT_PRESENT_0_7] = {CPLD_SFP_EVT_PRESENT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_8_15] = {CPLD_SFP_EVT_PRESENT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_16_23] = {CPLD_SFP_EVT_PRESENT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_24_31] = {CPLD_SFP_EVT_PRESENT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_32_39] = {CPLD_SFP_EVT_PRESENT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_40_47] = {CPLD_SFP_EVT_PRESENT_40_47_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_EVT_PRESENT_48_53] = {CPLD_QSFP_EVT_PRESENT_48_53_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_EVT_PORT_48_53] = {CPLD_QSFP_EVT_PORT_48_53_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_INTR_RX_LOS_0_7] = {CPLD_SFP_INTR_RX_LOS_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_8_15] = {CPLD_SFP_INTR_RX_LOS_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_16_23] = {CPLD_SFP_INTR_RX_LOS_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_24_31] = {CPLD_SFP_INTR_RX_LOS_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_32_39] = {CPLD_SFP_INTR_RX_LOS_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_40_47] = {CPLD_SFP_INTR_RX_LOS_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_INTR_TX_FAULT_0_7] = {CPLD_SFP_INTR_TX_FAULT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_8_15] = {CPLD_SFP_INTR_TX_FAULT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_16_23] = {CPLD_SFP_INTR_TX_FAULT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_24_31] = {CPLD_SFP_INTR_TX_FAULT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_32_39] = {CPLD_SFP_INTR_TX_FAULT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_40_47] = {CPLD_SFP_INTR_TX_FAULT_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_MASK_RX_LOS_0_7] = {CPLD_SFP_MASK_RX_LOS_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_8_15] = {CPLD_SFP_MASK_RX_LOS_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_16_23] = {CPLD_SFP_MASK_RX_LOS_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_24_31] = {CPLD_SFP_MASK_RX_LOS_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_32_39] = {CPLD_SFP_MASK_RX_LOS_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_40_47] = {CPLD_SFP_MASK_RX_LOS_40_47_REG, MASK_ALL, PERM_RW}, + + [CPLD_SFP_MASK_TX_FAULT_0_7] = {CPLD_SFP_MASK_TX_FAULT_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_8_15] = {CPLD_SFP_MASK_TX_FAULT_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_16_23] = {CPLD_SFP_MASK_TX_FAULT_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_24_31] = {CPLD_SFP_MASK_TX_FAULT_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_32_39] = {CPLD_SFP_MASK_TX_FAULT_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_40_47] = {CPLD_SFP_MASK_TX_FAULT_40_47_REG, MASK_ALL, PERM_RW}, + + [CPLD_SFP_EVT_RX_LOS_0_7] = {CPLD_SFP_EVT_RX_LOS_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_8_15] = {CPLD_SFP_EVT_RX_LOS_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_16_23] = {CPLD_SFP_EVT_RX_LOS_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_24_31] = {CPLD_SFP_EVT_RX_LOS_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_32_39] = {CPLD_SFP_EVT_RX_LOS_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_40_47] = {CPLD_SFP_EVT_RX_LOS_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_EVT_TX_FAULT_0_7] = {CPLD_SFP_EVT_TX_FAULT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_8_15] = {CPLD_SFP_EVT_TX_FAULT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_16_23] = {CPLD_SFP_EVT_TX_FAULT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_24_31] = {CPLD_SFP_EVT_TX_FAULT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_32_39] = {CPLD_SFP_EVT_TX_FAULT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_40_47] = {CPLD_SFP_EVT_TX_FAULT_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_TX_DISABLE_0_7] = {CPLD_SFP_TX_DISABLE_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_8_15] = {CPLD_SFP_TX_DISABLE_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_16_23] = {CPLD_SFP_TX_DISABLE_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_24_31] = {CPLD_SFP_TX_DISABLE_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_32_39] = {CPLD_SFP_TX_DISABLE_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_40_47] = {CPLD_SFP_TX_DISABLE_40_47_REG, MASK_ALL, PERM_RW}, + + [CPLD_QSFP_RESET_48_53] = {CPLD_QSFP_RESET_48_53_REG, MASK_ALL, PERM_RW}, + [CPLD_QSFP_LPMODE_48_53] = {CPLD_QSFP_LPMODE_48_53_REG, MASK_ALL, PERM_RW}, + + //debug interrupt status + [DBG_CPLD_SFP_INTR_PRESENT_0_7] = {DBG_CPLD_SFP_INTR_PRESENT_0_7_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_8_15] = {DBG_CPLD_SFP_INTR_PRESENT_8_15_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_16_23] = {DBG_CPLD_SFP_INTR_PRESENT_16_23_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_24_31] = {DBG_CPLD_SFP_INTR_PRESENT_24_31_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_32_39] = {DBG_CPLD_SFP_INTR_PRESENT_32_39_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_40_47] = {DBG_CPLD_SFP_INTR_PRESENT_40_47_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_QSFP_INTR_PRESENT_48_53] = {DBG_CPLD_QSFP_INTR_PRESENT_48_53_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_QSFP_INTR_PORT_48_53] = {DBG_CPLD_QSFP_INTR_PORT_48_53_REG, MASK_ALL, PERM_R}, + + //debug interrupt mask + [DBG_CPLD_SFP_INTR_RX_LOS_0_7] = {DBG_CPLD_SFP_INTR_RX_LOS_0_7_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_8_15] = {DBG_CPLD_SFP_INTR_RX_LOS_8_15_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_16_23] = {DBG_CPLD_SFP_INTR_RX_LOS_16_23_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_24_31] = {DBG_CPLD_SFP_INTR_RX_LOS_24_31_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_32_39] = {DBG_CPLD_SFP_INTR_RX_LOS_32_39_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_40_47] = {DBG_CPLD_SFP_INTR_RX_LOS_40_47_REG, MASK_ALL, PERM_R}, + + [DBG_CPLD_SFP_INTR_TX_FAULT_0_7] = {DBG_CPLD_SFP_INTR_TX_FAULT_0_7_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_8_15] = {DBG_CPLD_SFP_INTR_TX_FAULT_8_15_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_16_23] = {DBG_CPLD_SFP_INTR_TX_FAULT_16_23_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_24_31] = {DBG_CPLD_SFP_INTR_TX_FAULT_24_31_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_32_39] = {DBG_CPLD_SFP_INTR_TX_FAULT_32_39_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_40_47] = {DBG_CPLD_SFP_INTR_TX_FAULT_40_47_REG, MASK_ALL, PERM_R}, +}; + +/* CPLD device id and data */ +static const struct i2c_device_id cpld_id[] = { + { "s7801_54xs_cpld1", cpld1 }, + { "s7801_54xs_cpld2", cpld2 }, + {} +}; + +char bsp_debug[2]="0"; +u8 enable_log_read=LOG_DISABLE; +u8 enable_log_write=LOG_DISABLE; + +/* Addresses scanned for cpld */ +static const unsigned short cpld_i2c_addr[] = { 0x30, 0x31, I2C_CLIENT_END }; + +/* define all support register access of cpld in attribute */ + +// CPLD common +static _SENSOR_DEVICE_ATTR_RO(cpld_board_id_0, cpld_callback, CPLD_BOARD_ID_0); +static _SENSOR_DEVICE_ATTR_RO(cpld_board_id_1, cpld_callback, CPLD_BOARD_ID_1); +static _SENSOR_DEVICE_ATTR_RO(cpld_id, cpld_callback, CPLD_ID); +static _SENSOR_DEVICE_ATTR_RO(cpld_chip, cpld_callback, CPLD_CHIP); +static _SENSOR_DEVICE_ATTR_RO(cpld_sku_ext, cpld_callback, CPLD_SKU_EXT); + +static _SENSOR_DEVICE_ATTR_RO(cpld_major_ver, cpld_callback, CPLD_MAJOR_VER); +static _SENSOR_DEVICE_ATTR_RO(cpld_minor_ver, cpld_callback, CPLD_MINOR_VER); +static _SENSOR_DEVICE_ATTR_RO(cpld_build_ver, cpld_callback, CPLD_BUILD_VER); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_h, cpld_version_h, CPLD_VERSION_H); + +static _SENSOR_DEVICE_ATTR_RW(cpld_evt_ctrl, cpld_callback, CPLD_EVT_CTRL); + +//CPLD 1 +static _SENSOR_DEVICE_ATTR_RO(cpld_mac_intr, cpld_callback, CPLD_MAC_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_hwm_intr, cpld_callback, CPLD_HWM_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpld2_intr, cpld_callback, CPLD_CPLD2_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_ntm_intr, cpld_callback, CPLD_NTM_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_fan_psu_intr, cpld_callback, CPLD_FAN_PSU_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_ioexp_intr, cpld_callback, CPLD_SFP_IOEXP_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpu_nmi_intr, cpld_callback, CPLD_CPU_NMI_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_ptp_intr, cpld_callback, CPLD_PTP_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_system_intr, cpld_callback, CPLD_SYSTEM_INTR); + +static _SENSOR_DEVICE_ATTR_RW(cpld_mac_mask, cpld_callback, CPLD_MAC_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_hwm_mask, cpld_callback, CPLD_HWM_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_cpld2_mask, cpld_callback, CPLD_CPLD2_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_ntm_mask, cpld_callback, CPLD_NTM_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_fan_psu_mask, cpld_callback, CPLD_FAN_PSU_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_ioexp_mask, cpld_callback, CPLD_SFP_IOEXP_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_cpu_nmi_mask, cpld_callback, CPLD_CPU_NMI_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_ptp_mask, cpld_callback, CPLD_PTP_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_mask, cpld_callback, CPLD_SYSTEM_MASK); + +static _SENSOR_DEVICE_ATTR_RO(cpld_mac_evt, cpld_callback, CPLD_MAC_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_hwm_evt, cpld_callback, CPLD_HWM_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpld2_evt, cpld_callback, CPLD_CPLD2_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_ntm_evt, cpld_callback, CPLD_NTM_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_fan_psu_evt, cpld_callback, CPLD_FAN_PSU_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_ioexp_evt, cpld_callback, CPLD_SFP_IOEXP_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpu_nmi_evt, cpld_callback, CPLD_CPU_NMI_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_ptp_evt, cpld_callback, CPLD_PTP_EVT); + +static _SENSOR_DEVICE_ATTR_RW(cpld_mac_reset, cpld_callback, CPLD_MAC_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_reset, cpld_callback, CPLD_SYSTEM_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_bmc_ntm_reset, cpld_callback, CPLD_BMC_NTM_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_usb_reset, cpld_callback, CPLD_USB_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_i2c_mux_reset, cpld_callback, CPLD_I2C_MUX_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_i2c_mux_reset_2, cpld_callback, CPLD_I2C_MUX_RESET_2); +static _SENSOR_DEVICE_ATTR_RW(cpld_misc_reset, cpld_callback, CPLD_MISC_RESET); + +static _SENSOR_DEVICE_ATTR_RO(cpld_psu_status, cpld_callback, CPLD_PSU_STATUS); +static _SENSOR_DEVICE_ATTR_RO(cpld_mac_synce, cpld_callback, CPLD_MAC_SYNCE); +static _SENSOR_DEVICE_ATTR_RO(cpld_fan_present, cpld_callback, CPLD_FAN_PRESENT); +static _SENSOR_DEVICE_ATTR_RW(cpld_mux_ctrl, cpld_callback, CPLD_MUX_CTRL); + +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_sync, cpld_callback, CPLD_SYSTEM_LED_SYNC); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_sys, cpld_callback, CPLD_SYSTEM_LED_SYS); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_fan, cpld_callback, CPLD_SYSTEM_LED_FAN); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_psu_0, cpld_callback, CPLD_SYSTEM_LED_PSU_0); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_psu_1, cpld_callback, CPLD_SYSTEM_LED_PSU_1); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_id, cpld_callback, CPLD_SYSTEM_LED_ID); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_mac_intr, cpld_callback, DBG_CPLD_MAC_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_hwm_intr, cpld_callback, DBG_CPLD_HWM_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_cpld2_intr, cpld_callback, DBG_CPLD_CPLD2_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_ntm_intr, cpld_callback, DBG_CPLD_NTM_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_fan_psu_intr, cpld_callback, DBG_CPLD_FAN_PSU_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_ioexp_intr, cpld_callback, DBG_CPLD_SFP_IOEXP_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_ptp_intr, cpld_callback, DBG_CPLD_PTP_INTR); + +//CPLD 2 +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_0_7, cpld_callback, CPLD_SFP_INTR_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_8_15, cpld_callback, CPLD_SFP_INTR_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_16_23, cpld_callback, CPLD_SFP_INTR_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_24_31, cpld_callback, CPLD_SFP_INTR_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_32_39, cpld_callback, CPLD_SFP_INTR_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_40_47, cpld_callback, CPLD_SFP_INTR_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_present_48_53, cpld_callback, CPLD_QSFP_INTR_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_port_48_53, cpld_callback, CPLD_QSFP_INTR_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_0_7, cpld_callback, CPLD_SFP_MASK_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_8_15, cpld_callback, CPLD_SFP_MASK_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_16_23, cpld_callback, CPLD_SFP_MASK_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_24_31, cpld_callback, CPLD_SFP_MASK_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_32_39, cpld_callback, CPLD_SFP_MASK_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_40_47, cpld_callback, CPLD_SFP_MASK_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_present_48_53, cpld_callback, CPLD_QSFP_MASK_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_port_48_53, cpld_callback, CPLD_QSFP_MASK_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_0_7, cpld_callback, CPLD_SFP_EVT_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_8_15, cpld_callback, CPLD_SFP_EVT_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_16_23, cpld_callback, CPLD_SFP_EVT_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_24_31, cpld_callback, CPLD_SFP_EVT_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_32_39, cpld_callback, CPLD_SFP_EVT_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_40_47, cpld_callback, CPLD_SFP_EVT_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_present_48_53, cpld_callback, CPLD_QSFP_EVT_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_port_48_53, cpld_callback, CPLD_QSFP_EVT_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_0_7, cpld_callback, CPLD_SFP_INTR_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_8_15, cpld_callback, CPLD_SFP_INTR_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_16_23, cpld_callback, CPLD_SFP_INTR_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_24_31, cpld_callback, CPLD_SFP_INTR_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_32_39, cpld_callback, CPLD_SFP_INTR_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_40_47, cpld_callback, CPLD_SFP_INTR_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_0_7, cpld_callback, CPLD_SFP_INTR_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_8_15, cpld_callback, CPLD_SFP_INTR_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_16_23, cpld_callback, CPLD_SFP_INTR_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_24_31, cpld_callback, CPLD_SFP_INTR_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_32_39, cpld_callback, CPLD_SFP_INTR_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_40_47, cpld_callback, CPLD_SFP_INTR_TX_FAULT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_0_7, cpld_callback, CPLD_SFP_MASK_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_8_15, cpld_callback, CPLD_SFP_MASK_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_16_23, cpld_callback, CPLD_SFP_MASK_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_24_31, cpld_callback, CPLD_SFP_MASK_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_32_39, cpld_callback, CPLD_SFP_MASK_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_40_47, cpld_callback, CPLD_SFP_MASK_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_0_7, cpld_callback, CPLD_SFP_MASK_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_8_15, cpld_callback, CPLD_SFP_MASK_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_16_23, cpld_callback, CPLD_SFP_MASK_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_24_31, cpld_callback, CPLD_SFP_MASK_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_32_39, cpld_callback, CPLD_SFP_MASK_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_40_47, cpld_callback, CPLD_SFP_MASK_TX_FAULT_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_0_7, cpld_callback, CPLD_SFP_EVT_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_8_15, cpld_callback, CPLD_SFP_EVT_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_16_23, cpld_callback, CPLD_SFP_EVT_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_24_31, cpld_callback, CPLD_SFP_EVT_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_32_39, cpld_callback, CPLD_SFP_EVT_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_40_47, cpld_callback, CPLD_SFP_EVT_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_0_7, cpld_callback, CPLD_SFP_EVT_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_8_15, cpld_callback, CPLD_SFP_EVT_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_16_23, cpld_callback, CPLD_SFP_EVT_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_24_31, cpld_callback, CPLD_SFP_EVT_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_32_39, cpld_callback, CPLD_SFP_EVT_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_40_47, cpld_callback, CPLD_SFP_EVT_TX_FAULT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_0_7, cpld_callback, CPLD_SFP_TX_DISABLE_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_8_15, cpld_callback, CPLD_SFP_TX_DISABLE_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_16_23, cpld_callback, CPLD_SFP_TX_DISABLE_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_24_31, cpld_callback, CPLD_SFP_TX_DISABLE_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_32_39, cpld_callback, CPLD_SFP_TX_DISABLE_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_40_47, cpld_callback, CPLD_SFP_TX_DISABLE_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_reset_48_53, cpld_callback, CPLD_QSFP_RESET_48_53); +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_lpmode_48_53, cpld_callback, CPLD_QSFP_LPMODE_48_53); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_0_7, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_8_15, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_16_23, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_24_31, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_32_39, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_40_47, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_qsfp_intr_present_48_53, cpld_callback, DBG_CPLD_QSFP_INTR_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_qsfp_intr_port_48_53, cpld_callback, DBG_CPLD_QSFP_INTR_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_0_7, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_8_15, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_16_23, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_24_31, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_32_39, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_40_47, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_0_7, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_8_15, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_16_23, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_24_31, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_32_39, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_40_47, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_40_47); + +//BSP DEBUG +static _SENSOR_DEVICE_ATTR_RW(bsp_debug, bsp_callback, BSP_DEBUG); + +/* define support attributes of cpldx */ + +/* cpld 1 */ +static struct attribute *cpld1_attributes[] = { + _DEVICE_ATTR(cpld_board_id_0), + _DEVICE_ATTR(cpld_board_id_1), + + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(cpld_chip), + _DEVICE_ATTR(cpld_sku_ext), + + _DEVICE_ATTR(cpld_major_ver), + _DEVICE_ATTR(cpld_minor_ver), + _DEVICE_ATTR(cpld_build_ver), + _DEVICE_ATTR(cpld_version_h), + + _DEVICE_ATTR(cpld_mac_intr), + _DEVICE_ATTR(cpld_hwm_intr), + _DEVICE_ATTR(cpld_cpld2_intr), + _DEVICE_ATTR(cpld_ntm_intr), + _DEVICE_ATTR(cpld_fan_psu_intr), + _DEVICE_ATTR(cpld_sfp_ioexp_intr), + _DEVICE_ATTR(cpld_cpu_nmi_intr), + _DEVICE_ATTR(cpld_ptp_intr), + _DEVICE_ATTR(cpld_system_intr), + + _DEVICE_ATTR(cpld_mac_mask), + _DEVICE_ATTR(cpld_hwm_mask), + _DEVICE_ATTR(cpld_cpld2_mask), + _DEVICE_ATTR(cpld_ntm_mask), + _DEVICE_ATTR(cpld_fan_psu_mask), + _DEVICE_ATTR(cpld_sfp_ioexp_mask), + _DEVICE_ATTR(cpld_cpu_nmi_mask), + _DEVICE_ATTR(cpld_ptp_mask), + _DEVICE_ATTR(cpld_system_mask), + + _DEVICE_ATTR(cpld_mac_evt), + _DEVICE_ATTR(cpld_hwm_evt), + _DEVICE_ATTR(cpld_cpld2_evt), + _DEVICE_ATTR(cpld_ntm_evt), + _DEVICE_ATTR(cpld_fan_psu_evt), + _DEVICE_ATTR(cpld_sfp_ioexp_evt), + _DEVICE_ATTR(cpld_cpu_nmi_evt), + _DEVICE_ATTR(cpld_ptp_evt), + + _DEVICE_ATTR(cpld_evt_ctrl), + + _DEVICE_ATTR(cpld_mac_reset), + _DEVICE_ATTR(cpld_system_reset), + _DEVICE_ATTR(cpld_bmc_ntm_reset), + _DEVICE_ATTR(cpld_usb_reset), + _DEVICE_ATTR(cpld_i2c_mux_reset), + _DEVICE_ATTR(cpld_i2c_mux_reset_2), + _DEVICE_ATTR(cpld_misc_reset), + + _DEVICE_ATTR(cpld_psu_status), + _DEVICE_ATTR(cpld_mac_synce), + _DEVICE_ATTR(cpld_fan_present), + _DEVICE_ATTR(cpld_mux_ctrl), + + _DEVICE_ATTR(cpld_system_led_sync), + _DEVICE_ATTR(cpld_system_led_sys), + _DEVICE_ATTR(cpld_system_led_fan), + _DEVICE_ATTR(cpld_system_led_psu_0), + _DEVICE_ATTR(cpld_system_led_psu_1), + _DEVICE_ATTR(cpld_system_led_id), + + _DEVICE_ATTR(dbg_cpld_mac_intr), + _DEVICE_ATTR(dbg_cpld_hwm_intr), + _DEVICE_ATTR(dbg_cpld_cpld2_intr), + _DEVICE_ATTR(dbg_cpld_ntm_intr), + _DEVICE_ATTR(dbg_cpld_fan_psu_intr), + _DEVICE_ATTR(dbg_cpld_sfp_ioexp_intr), + _DEVICE_ATTR(dbg_cpld_ptp_intr), + + _DEVICE_ATTR(bsp_debug), + + NULL +}; + +/* cpld 2 */ +static struct attribute *cpld2_attributes[] = { + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(cpld_chip), + + _DEVICE_ATTR(cpld_major_ver), + _DEVICE_ATTR(cpld_minor_ver), + _DEVICE_ATTR(cpld_build_ver), + _DEVICE_ATTR(cpld_version_h), + + _DEVICE_ATTR(cpld_sfp_intr_present_0_7), + _DEVICE_ATTR(cpld_sfp_intr_present_8_15), + _DEVICE_ATTR(cpld_sfp_intr_present_16_23), + _DEVICE_ATTR(cpld_sfp_intr_present_24_31), + _DEVICE_ATTR(cpld_sfp_intr_present_32_39), + _DEVICE_ATTR(cpld_sfp_intr_present_40_47), + + _DEVICE_ATTR(cpld_qsfp_intr_present_48_53), + _DEVICE_ATTR(cpld_qsfp_intr_port_48_53), + + _DEVICE_ATTR(cpld_sfp_mask_present_0_7), + _DEVICE_ATTR(cpld_sfp_mask_present_8_15), + _DEVICE_ATTR(cpld_sfp_mask_present_16_23), + _DEVICE_ATTR(cpld_sfp_mask_present_24_31), + _DEVICE_ATTR(cpld_sfp_mask_present_32_39), + _DEVICE_ATTR(cpld_sfp_mask_present_40_47), + + _DEVICE_ATTR(cpld_qsfp_mask_present_48_53), + _DEVICE_ATTR(cpld_qsfp_mask_port_48_53), + + _DEVICE_ATTR(cpld_sfp_evt_present_0_7), + _DEVICE_ATTR(cpld_sfp_evt_present_8_15), + _DEVICE_ATTR(cpld_sfp_evt_present_16_23), + _DEVICE_ATTR(cpld_sfp_evt_present_24_31), + _DEVICE_ATTR(cpld_sfp_evt_present_32_39), + _DEVICE_ATTR(cpld_sfp_evt_present_40_47), + + _DEVICE_ATTR(cpld_qsfp_evt_present_48_53), + _DEVICE_ATTR(cpld_qsfp_evt_port_48_53), + + _DEVICE_ATTR(cpld_evt_ctrl), + + _DEVICE_ATTR(cpld_sfp_intr_rx_los_0_7), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_8_15), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_16_23), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_24_31), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_32_39), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_40_47), + + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_0_7), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_8_15), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_16_23), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_24_31), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_32_39), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_40_47), + + _DEVICE_ATTR(cpld_sfp_mask_rx_los_0_7), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_8_15), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_16_23), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_24_31), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_32_39), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_40_47), + + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_0_7), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_8_15), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_16_23), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_24_31), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_32_39), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_40_47), + + _DEVICE_ATTR(cpld_sfp_evt_rx_los_0_7), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_8_15), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_16_23), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_24_31), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_32_39), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_40_47), + + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_0_7), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_8_15), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_16_23), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_24_31), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_32_39), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_40_47), + + _DEVICE_ATTR(cpld_sfp_tx_disable_0_7), + _DEVICE_ATTR(cpld_sfp_tx_disable_8_15), + _DEVICE_ATTR(cpld_sfp_tx_disable_16_23), + _DEVICE_ATTR(cpld_sfp_tx_disable_24_31), + _DEVICE_ATTR(cpld_sfp_tx_disable_32_39), + _DEVICE_ATTR(cpld_sfp_tx_disable_40_47), + + _DEVICE_ATTR(cpld_qsfp_reset_48_53), + _DEVICE_ATTR(cpld_qsfp_lpmode_48_53), + + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_0_7), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_8_15), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_16_23), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_24_31), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_32_39), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_40_47), + + _DEVICE_ATTR(dbg_cpld_qsfp_intr_present_48_53), + _DEVICE_ATTR(dbg_cpld_qsfp_intr_port_48_53), + + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_0_7), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_8_15), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_16_23), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_24_31), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_32_39), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_40_47), + + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_0_7), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_8_15), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_16_23), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_24_31), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_32_39), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_40_47), + + NULL +}; + +/* cpld 1 attributes group */ +static const struct attribute_group cpld1_group = { + .attrs = cpld1_attributes, +}; + +/* cpld 2 attributes group */ +static const struct attribute_group cpld2_group = { + .attrs = cpld2_attributes, +}; + +/* reg shift */ +static u8 _shift(u8 mask) +{ + int i=0, mask_one=1; + + for(i=0; i<8; ++i) { + if ((mask & mask_one) == 1) + return i; + else + mask >>= 1; + } + + return -1; +} + +/* reg mask and shift */ +static u8 _mask_shift(u8 val, u8 mask) +{ + int shift=0; + + shift = _shift(mask); + + return (val & mask) >> shift; +} + +static int _bsp_log(u8 log_type, char *fmt, ...) +{ + if ((log_type==LOG_READ && enable_log_read) || + (log_type==LOG_WRITE && enable_log_write)) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk(fmt, args); + va_end(args); + + return r; + } else { + return 0; + } +} + +static int _config_bsp_log(u8 log_type) +{ + switch(log_type) { + case LOG_NONE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_RW: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_ENABLE; + break; + case LOG_READ: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_WRITE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_ENABLE; + break; + default: + return -EINVAL; + } + return 0; +} + +/* get bsp value */ +static ssize_t read_bsp(char *buf, char *str) +{ + ssize_t len=0; + + len=sprintf(buf, "%s", str); + BSP_LOG_R("reg_val=%s", str); + + return len; +} + +/* set bsp value */ +static ssize_t write_bsp(const char *buf, char *str, size_t str_len, size_t count) +{ + snprintf(str, str_len, "%s", buf); + BSP_LOG_W("reg_val=%s", str); + + return count; +} + +/* get bsp parameter value */ +static ssize_t read_bsp_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + + switch (attr->index) { + case BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(bsp_debug); + break; + default: + return -EINVAL; + } + return read_bsp(buf, str); +} + +/* set bsp parameter value */ +static ssize_t write_bsp_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + ssize_t ret = 0; + u8 bsp_debug_u8 = 0; + + switch (attr->index) { + case BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(str); + ret = write_bsp(buf, str, str_len, count); + + if (kstrtou8(buf, 0, &bsp_debug_u8) < 0) { + return -EINVAL; + } else if (_config_bsp_log(bsp_debug_u8) < 0) { + return -EINVAL; + } + return ret; + default: + return -EINVAL; + } + return 0; +} + +/* get cpld register value */ +static ssize_t read_cpld_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 reg = 0; + u8 mask = MASK_ALL; + + if (IS_PERM_R(sysfs_info[attr->index].permission)) { + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + } else { + dev_err(dev, "%s() error, attr->index=%d\n", __func__, attr->index); + return -EINVAL; + } + + return read_cpld_reg(dev, buf, reg, mask); +} + +/* set cpld register value */ +static ssize_t write_cpld_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 reg = 0; + u8 mask = MASK_ALL; + + if (IS_PERM_W(sysfs_info[attr->index].permission)) { + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + } else { + dev_err(dev, "%s() error, attr->index=%d\n", __func__, attr->index); + return -EINVAL; + } + + return write_cpld_reg(dev, buf, count, reg, mask); +} + +/* get cpld register value */ +static u8 _read_cpld_reg(struct device *dev, + u8 reg, + u8 mask) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + int reg_val; + + I2C_READ_BYTE_DATA(reg_val, &data->access_lock, client, reg); + + if (unlikely(reg_val < 0)) { + return reg_val; + } else { + reg_val=_mask_shift(reg_val, mask); + return reg_val; + } +} + +/* get cpld register value */ +static ssize_t read_cpld_reg(struct device *dev, + char *buf, + u8 reg, + u8 mask) +{ + int reg_val; + + reg_val = _read_cpld_reg(dev, reg, mask); + if (unlikely(reg_val < 0)) { + dev_err(dev, "read_cpld_reg() error, reg_val=%d\n", reg_val); + return reg_val; + } else { + return sprintf(buf, "0x%02x\n", reg_val); + } +} + +/* set cpld register value */ +static ssize_t write_cpld_reg(struct device *dev, + const char *buf, + size_t count, + u8 reg, + u8 mask) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 reg_val, reg_val_now, shift; + int ret = 0; + + if (kstrtou8(buf, 0, ®_val) < 0) + return -EINVAL; + + //apply continuous bits operation if mask is specified, discontinuous bits are not supported + if (mask != MASK_ALL) { + reg_val_now = _read_cpld_reg(dev, reg, MASK_ALL); + if (unlikely(reg_val_now < 0)) { + dev_err(dev, "write_cpld_reg() error, reg_val_now=%d\n", reg_val_now); + return reg_val_now; + } else { + //clear bits in reg_val_now by the mask + reg_val_now &= ~mask; + //get bit shift by the mask + shift = _shift(mask); + //calculate new reg_val + reg_val = reg_val_now | (reg_val << shift); + } + } + + I2C_WRITE_BYTE_DATA(ret, &data->access_lock, + client, reg, reg_val); + + if (unlikely(ret < 0)) { + dev_err(dev, "write_cpld_reg() error, return=%d\n", ret); + return ret; + } + + return count; +} + +/* get qsfp port config register value */ +static ssize_t read_cpld_version_h(struct device *dev, + struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + if (attr->index >= CPLD_VERSION_H) { + return sprintf(buf, "%d.%02d.%03d", + _read_cpld_reg(dev, CPLD_VERSION_REG, MASK_CPLD_MAJOR_VER), + _read_cpld_reg(dev, CPLD_VERSION_REG, MASK_CPLD_MINOR_VER), + _read_cpld_reg(dev, CPLD_BUILD_REG, MASK_ALL)); + } + return -1; +} + +/* add valid cpld client to list */ +static void cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = NULL; + + node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + if (!node) { + dev_info(&client->dev, + "Can't allocate cpld_client_node for index %d\n", + client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +/* remove exist cpld client in list */ +static void cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, + struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + mutex_unlock(&list_lock); +} + +/* cpld drvier probe */ +static int cpld_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + int status; + struct cpld_data *data = NULL; + int ret = -EPERM; + + data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* init cpld data for client */ + i2c_set_clientdata(client, data); + mutex_init(&data->access_lock); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_info(&client->dev, + "i2c_check_functionality failed (0x%x)\n", + client->addr); + status = -EIO; + goto exit; + } + + /* get cpld id from device */ + ret = i2c_smbus_read_byte_data(client, CPLD_ID_REG); + + if (ret < 0) { + dev_info(&client->dev, + "fail to get cpld id (0x%x) at addr (0x%x)\n", + CPLD_ID_REG, client->addr); + status = -EIO; + goto exit; + } + + if (INVALID(ret, cpld1, cpld2)) { + dev_info(&client->dev, + "cpld id %d(device) not valid\n", ret); + //status = -EPERM; + //goto exit; + } + +#if 0 + /* change client name for each cpld with index */ + snprintf(client->name, sizeof(client->name), "%s_%d", client->name, + data->index); +#endif + + data->index = dev_id->driver_data; + + /* register sysfs hooks for different cpld group */ + dev_info(&client->dev, "probe cpld with index %d\n", data->index); + switch (data->index) { + case cpld1: + status = sysfs_create_group(&client->dev.kobj, + &cpld1_group); + break; + case cpld2: + status = sysfs_create_group(&client->dev.kobj, + &cpld2_group); + break; + default: + status = -EINVAL; + } + + if (status) + goto exit; + + dev_info(&client->dev, "chip found\n"); + + /* add probe chip to client list */ + cpld_add_client(client); + + return 0; +exit: + switch (data->index) { + case cpld1: + sysfs_remove_group(&client->dev.kobj, &cpld1_group); + break; + case cpld2: + sysfs_remove_group(&client->dev.kobj, &cpld2_group); + break; + default: + break; + } + return status; +} + +/* cpld drvier remove */ +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + + switch (data->index) { + case cpld1: + sysfs_remove_group(&client->dev.kobj, &cpld1_group); + break; + case cpld2: + sysfs_remove_group(&client->dev.kobj, &cpld2_group); + break; + } + + cpld_remove_client(client); + return 0; +} + +static int s7801_54xs_cpld_read_internal(struct i2c_client *client, u8 reg) +{ + int retry = I2C_RW_RETRY_COUNT; + int reg_val = 0; + struct cpld_data *data = i2c_get_clientdata(client); + + while (retry) { + I2C_READ_BYTE_DATA(reg_val, &data->access_lock, client, reg); + if (unlikely(reg_val < 0)) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + + if (retry == 0) { + dev_err(&client->dev, "%s() retry %d times but still failed, reg=%x\n", __func__, I2C_RW_RETRY_COUNT, reg); + } + + continue; + } + + break; + } + + return reg_val; +} + +static int s7801_54xs_cpld_write_internal(struct i2c_client *client, u8 reg, u8 value) +{ + int ret = 0, retry = I2C_RW_RETRY_COUNT; + struct cpld_data *data = i2c_get_clientdata(client); + + while (retry) { + I2C_WRITE_BYTE_DATA(ret, &data->access_lock, client, reg, value); + if (unlikely(ret < 0)) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + + if (retry == 0) { + dev_err(&client->dev, "%s() retry %d times but still failed, reg=%x\n", __func__, I2C_RW_RETRY_COUNT, reg); + } + + continue; + } + break; + } + + return ret; +} + +/* +int s7801_54xs_cpld_write(unsigned short cpld_addr, u8 reg, u8 value) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = s7801_54xs_cpld_write_internal(cpld_node->client, reg, value); + break; + } else { + pr_err("cpld_node->client->addr=%x, cpld_addr=%x\n", cpld_node->client->addr, cpld_addr); + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(s7801_54xs_cpld_write); +*/ + +int s7801_54xs_cpld_psu_mux_sel(u8 mux_sel) +{ + unsigned short cpld_addr = cpld_i2c_addr[0]; + u8 reg = CPLD_MUX_CTRL_REG; + u8 reg_val = 0; + u8 psu_mux_mask = 0x06; + u8 mux_sel_val = 0; + + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + switch(mux_sel) { + case 0: + //psu 0 + mux_sel_val = 0x04; + break; + case 1: + //psu 1 + mux_sel_val = 0x02; + break; + default: + //bmc + mux_sel_val = psu_mux_mask; + break; + } + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + //read current reg value + reg_val = s7801_54xs_cpld_read_internal(cpld_node->client, reg); + //clear psu_mux_sel bits (bit 1 and 2) + reg_val &= ~psu_mux_mask; + //modify psu_mux_sel bits (bit 1 and 2) + reg_val |= mux_sel_val; + //write reg value + s7801_54xs_cpld_write_internal(cpld_node->client, reg, reg_val); + + break; + } else { + pr_err("cpld_node->client->addr=%x, cpld_addr=%x\n", cpld_node->client->addr, cpld_addr); + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(s7801_54xs_cpld_psu_mux_sel); + +MODULE_DEVICE_TABLE(i2c, cpld_id); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "x86_64_ufispace_s7801_54xs_cpld", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_id, + .address_list = cpld_i2c_addr, +}; + +static int __init cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&cpld_driver); +} + +static void __exit cpld_exit(void) +{ + i2c_del_driver(&cpld_driver); +} + +MODULE_AUTHOR("Jason Tsai "); +MODULE_DESCRIPTION("x86_64_ufispace_s7801_54xs_cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(cpld_init); +module_exit(cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.h b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.h new file mode 100644 index 000000000000..3e9c457095cc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-cpld.h @@ -0,0 +1,269 @@ +/* header file for i2c cpld driver of ufispace_s7801_54xs + * + * Copyright (C) 2022 UfiSpace Technology Corporation. + * Jason Tsai + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef UFISPACE_s7801_54xs_CPLD_H +#define UFISPACE_s7801_54xs_CPLD_H + +/* CPLD device index value */ +enum cpld_id { + cpld1, + cpld2 +}; + +/* CPLD common registers */ +#define CPLD_VERSION_REG 0x02 +#define CPLD_ID_REG 0x03 +#define CPLD_BUILD_REG 0x04 +#define CPLD_CHIP_REG 0x05 + +#define CPLD_EVT_CTRL_REG 0x3F + +/* CPLD 1 registers */ +#define CPLD_BOARD_ID_0_REG 0x00 +#define CPLD_BOARD_ID_1_REG 0x01 +#define CPLD_SKU_EXT_REG 0x06 + +#define CPLD_MAC_INTR_REG 0x10 +#define CPLD_HWM_INTR_REG 0x13 +#define CPLD_CPLD2_INTR_REG 0x14 +#define CPLD_NTM_INTR_REG 0x15 +#define CPLD_FAN_PSU_INTR_REG 0x16 +#define CPLD_SFP_IOEXP_INTR_REG 0x18 +#define CPLD_CPU_NMI_INTR_REG 0x19 +#define CPLD_PTP_INTR_REG 0x1B +#define CPLD_SYSTEM_INTR_REG 0x1C + +#define CPLD_MAC_MASK_REG 0x20 +#define CPLD_HWM_MASK_REG 0x23 +#define CPLD_CPLD2_MASK_REG 0x24 +#define CPLD_NTM_MASK_REG 0x25 +#define CPLD_FAN_PSU_MASK_REG 0x26 +#define CPLD_SFP_IOEXP_MASK_REG 0x28 +#define CPLD_CPU_NMI_MASK_REG 0x29 +#define CPLD_PTP_MASK_REG 0x2B +#define CPLD_SYSTEM_MASK_REG 0x2C + +#define CPLD_MAC_EVT_REG 0x30 +#define CPLD_HWM_EVT_REG 0x33 +#define CPLD_CPLD2_EVT_REG 0x34 +#define CPLD_NTM_EVT_REG 0x35 +#define CPLD_FAN_PSU_EVT_REG 0x36 +#define CPLD_SFP_IOEXP_EVT_REG 0x38 +#define CPLD_CPU_NMI_EVT_REG 0x39 +#define CPLD_PTP_EVT_REG 0x3B + +#define CPLD_MAC_RESET_REG 0x40 +#define CPLD_SYSTEM_RESET_REG 0x41 +#define CPLD_BMC_NTM_RESET_REG 0x43 +#define CPLD_USB_RESET_REG 0x44 +#define CPLD_I2C_MUX_RESET_REG 0x46 +#define CPLD_I2C_MUX_RESET_2_REG 0x47 +#define CPLD_MISC_RESET_REG 0x48 + +#define CPLD_BRD_PRESENT_REG 0x50 +#define CPLD_PSU_STATUS_REG 0x51 +#define CPLD_SYSTEM_PWR_REG 0x52 +#define CPLD_MAC_SYNCE_REG 0x53 +#define CPLD_MAC_AVS_REG 0x54 +#define CPLD_SYSTEM_STATUS_REG 0x55 +#define CPLD_FAN_PRESENT_REG 0x56 +#define CPLD_WATCHDOG_REG 0x5A +#define CPLD_BOOT_SELECT_REG 0x5B +#define CPLD_MUX_CTRL_REG 0x5C +#define CPLD_MISC_CTRL_1_REG 0x5D +#define CPLD_MISC_CTRL_2_REG 0x5E +#define CPLD_TIMING_CTRL_REG 0x5F + +#define CPLD_MAC_TEMP_REG 0x61 + +/* +#define CPLD_SYSTEM_LED_SYS_FAN_REG 0x80 +#define CPLD_SYSTEM_LED_PSU_REG 0x81 +#define CPLD_SYSTEM_LED_SYNC_REG 0x82 +#define CPLD_SYSTEM_LED_ID_REG 0x84 +*/ +#define CPLD_SYSTEM_LED_PSU_REG 0x80 +#define CPLD_SYSTEM_LED_SYS_REG 0x81 +#define CPLD_SYSTEM_LED_SYNC_REG 0x82 +#define CPLD_SYSTEM_LED_FAN_REG 0x83 +#define CPLD_SYSTEM_LED_ID_REG 0x84 + +#define CPLD_MAC_PG_REG 0x90 +#define CPLD_MISC_PG_REG 0x92 +#define CPLD_MAC_PG_EN_REG 0x93 +#define CPLD_MISC_PG_EN_REG 0x95 + +#define DBG_CPLD_MAC_INTR_REG 0xE0 +#define DBG_CPLD_HWM_INTR_REG 0xE3 +#define DBG_CPLD_CPLD2_INTR_REG 0xE4 +#define DBG_CPLD_NTM_INTR_REG 0xE5 +#define DBG_CPLD_FAN_PSU_INTR_REG 0xE6 +#define DBG_CPLD_SFP_IOEXP_INTR_REG 0xE8 +#define DBG_CPLD_PTP_INTR_REG 0xEB + +#define CPLD_UPG_RESET_REG 0xF0 + +/* CPLD 2*/ + +//interrupt status +#define CPLD_SFP_INTR_PRESENT_0_7_REG 0x10 +#define CPLD_SFP_INTR_PRESENT_8_15_REG 0x11 +#define CPLD_SFP_INTR_PRESENT_16_23_REG 0x12 +#define CPLD_SFP_INTR_PRESENT_24_31_REG 0x13 +#define CPLD_SFP_INTR_PRESENT_32_39_REG 0x14 +#define CPLD_SFP_INTR_PRESENT_40_47_REG 0x15 +#define CPLD_QSFP_INTR_PRESENT_48_53_REG 0x16 +#define CPLD_QSFP_INTR_PORT_48_53_REG 0x17 + +//interrupt mask +#define CPLD_SFP_MASK_PRESENT_0_7_REG 0x20 +#define CPLD_SFP_MASK_PRESENT_8_15_REG 0x21 +#define CPLD_SFP_MASK_PRESENT_16_23_REG 0x22 +#define CPLD_SFP_MASK_PRESENT_24_31_REG 0x23 +#define CPLD_SFP_MASK_PRESENT_32_39_REG 0x24 +#define CPLD_SFP_MASK_PRESENT_40_47_REG 0x25 +#define CPLD_QSFP_MASK_PRESENT_48_53_REG 0x26 +#define CPLD_QSFP_MASK_PORT_48_53_REG 0x27 + +//interrupt event +#define CPLD_SFP_EVT_PRESENT_0_7_REG 0x30 +#define CPLD_SFP_EVT_PRESENT_8_15_REG 0x31 +#define CPLD_SFP_EVT_PRESENT_16_23_REG 0x32 +#define CPLD_SFP_EVT_PRESENT_24_31_REG 0x33 +#define CPLD_SFP_EVT_PRESENT_32_39_REG 0x34 +#define CPLD_SFP_EVT_PRESENT_40_47_REG 0x35 +#define CPLD_QSFP_EVT_PRESENT_48_53_REG 0x36 +#define CPLD_QSFP_EVT_PORT_48_53_REG 0x37 + +#define CPLD_SFP_INTR_RX_LOS_0_7_REG 0x40 +#define CPLD_SFP_INTR_RX_LOS_8_15_REG 0x41 +#define CPLD_SFP_INTR_RX_LOS_16_23_REG 0x42 +#define CPLD_SFP_INTR_RX_LOS_24_31_REG 0x43 +#define CPLD_SFP_INTR_RX_LOS_32_39_REG 0x44 +#define CPLD_SFP_INTR_RX_LOS_40_47_REG 0x45 + +#define CPLD_SFP_INTR_TX_FAULT_0_7_REG 0x46 +#define CPLD_SFP_INTR_TX_FAULT_8_15_REG 0x47 +#define CPLD_SFP_INTR_TX_FAULT_16_23_REG 0x48 +#define CPLD_SFP_INTR_TX_FAULT_24_31_REG 0x49 +#define CPLD_SFP_INTR_TX_FAULT_32_39_REG 0x4A +#define CPLD_SFP_INTR_TX_FAULT_40_47_REG 0x4B + +//#define CPLD_SFP_RX_LOS_BASE_REG 0x40 +//#define CPLD_SFP_TX_FAULT_BASE_REG 0x46 + +#define CPLD_SFP_MASK_RX_LOS_0_7_REG 0x50 +#define CPLD_SFP_MASK_RX_LOS_8_15_REG 0x51 +#define CPLD_SFP_MASK_RX_LOS_16_23_REG 0x52 +#define CPLD_SFP_MASK_RX_LOS_24_31_REG 0x53 +#define CPLD_SFP_MASK_RX_LOS_32_39_REG 0x54 +#define CPLD_SFP_MASK_RX_LOS_40_47_REG 0x55 + +#define CPLD_SFP_MASK_TX_FAULT_0_7_REG 0x56 +#define CPLD_SFP_MASK_TX_FAULT_8_15_REG 0x57 +#define CPLD_SFP_MASK_TX_FAULT_16_23_REG 0x58 +#define CPLD_SFP_MASK_TX_FAULT_24_31_REG 0x59 +#define CPLD_SFP_MASK_TX_FAULT_32_39_REG 0x5A +#define CPLD_SFP_MASK_TX_FAULT_40_47_REG 0x5B + +//#define CPLD_SFP_RX_LOS_MASK_BASE_REG 0x50 +//#define CPLD_SFP_TX_FAULT_MASK_BASE_REG 0x56 + +#define CPLD_SFP_EVT_RX_LOS_0_7_REG 0x60 +#define CPLD_SFP_EVT_RX_LOS_8_15_REG 0x61 +#define CPLD_SFP_EVT_RX_LOS_16_23_REG 0x62 +#define CPLD_SFP_EVT_RX_LOS_24_31_REG 0x63 +#define CPLD_SFP_EVT_RX_LOS_32_39_REG 0x64 +#define CPLD_SFP_EVT_RX_LOS_40_47_REG 0x65 + +#define CPLD_SFP_EVT_TX_FAULT_0_7_REG 0x66 +#define CPLD_SFP_EVT_TX_FAULT_8_15_REG 0x67 +#define CPLD_SFP_EVT_TX_FAULT_16_23_REG 0x68 +#define CPLD_SFP_EVT_TX_FAULT_24_31_REG 0x69 +#define CPLD_SFP_EVT_TX_FAULT_32_39_REG 0x6A +#define CPLD_SFP_EVT_TX_FAULT_40_47_REG 0x6B + +//#define CPLD_SFP_RX_LOS_EVT_BASE_REG 0x60 +//#define CPLD_SFP_TX_FAULT_EVT_BASE_REG 0x66 + +#define CPLD_SFP_TX_DISABLE_0_7_REG 0x70 +#define CPLD_SFP_TX_DISABLE_8_15_REG 0x71 +#define CPLD_SFP_TX_DISABLE_16_23_REG 0x72 +#define CPLD_SFP_TX_DISABLE_24_31_REG 0x73 +#define CPLD_SFP_TX_DISABLE_32_39_REG 0x74 +#define CPLD_SFP_TX_DISABLE_40_47_REG 0x75 + +//#define CPLD_SFP_TX_DISABLE_BASE_REG 0x70 +#define CPLD_QSFP_RESET_48_53_REG 0x76 +#define CPLD_QSFP_LPMODE_48_53_REG 0x77 + +//debug interrupt status +#define DBG_CPLD_SFP_INTR_PRESENT_BASE_REG 0xD0 +#define DBG_CPLD_SFP_INTR_PRESENT_0_7_REG 0xD0 +#define DBG_CPLD_SFP_INTR_PRESENT_8_15_REG 0xD1 +#define DBG_CPLD_SFP_INTR_PRESENT_16_23_REG 0xD2 +#define DBG_CPLD_SFP_INTR_PRESENT_24_31_REG 0xD3 +#define DBG_CPLD_SFP_INTR_PRESENT_32_39_REG 0xD4 +#define DBG_CPLD_SFP_INTR_PRESENT_40_47_REG 0xD5 +#define DBG_CPLD_QSFP_INTR_PRESENT_48_53_REG 0xD6 +#define DBG_CPLD_QSFP_INTR_PORT_48_53_REG 0xD7 + +//debug interrupt mask +#define DBG_CPLD_SFP_INTR_RX_LOS_0_7_REG 0xE0 +#define DBG_CPLD_SFP_INTR_RX_LOS_8_15_REG 0xE1 +#define DBG_CPLD_SFP_INTR_RX_LOS_16_23_REG 0xE2 +#define DBG_CPLD_SFP_INTR_RX_LOS_24_31_REG 0xE3 +#define DBG_CPLD_SFP_INTR_RX_LOS_32_39_REG 0xE4 +#define DBG_CPLD_SFP_INTR_RX_LOS_40_47_REG 0xE5 + +#define DBG_CPLD_SFP_INTR_TX_FAULT_0_7_REG 0xE6 +#define DBG_CPLD_SFP_INTR_TX_FAULT_8_15_REG 0xE7 +#define DBG_CPLD_SFP_INTR_TX_FAULT_16_23_REG 0xE8 +#define DBG_CPLD_SFP_INTR_TX_FAULT_24_31_REG 0xE9 +#define DBG_CPLD_SFP_INTR_TX_FAULT_32_39_REG 0xEA +#define DBG_CPLD_SFP_INTR_TX_FAULT_40_47_REG 0xEB + +//#define DBG_CPLD_SFP_RX_LOS_BASE_REG 0xE0 +//#define DBG_CPLD_SFP_TX_FAULT_BASE_REG 0xE6 + +//MASK +#define MASK_ALL (0xFF) +#define MASK_HB (0b11110000) +#define MASK_LB (0b00001111) +#define MASK_CPLD_MAJOR_VER (0b11000000) +#define MASK_CPLD_MINOR_VER (0b00111111) +#define CPLD_SYSTEM_LED_SYS_MASK MASK_HB +#define CPLD_SYSTEM_LED_FAN_MASK MASK_LB +#define CPLD_SYSTEM_LED_PSU_0_MASK MASK_LB +#define CPLD_SYSTEM_LED_PSU_1_MASK MASK_HB +#define CPLD_SYSTEM_LED_SYNC_MASK MASK_LB +#define CPLD_SYSTEM_LED_ID_MASK MASK_LB +#define CPLD_SFP_LED_MASK_0 (0b00000011) +#define CPLD_SFP_LED_MASK_1 (0b00001100) +#define PERM_R (0b00000001) +#define PERM_W (0b00000010) +#define PERM_RW (PERM_R | PERM_W) +#define IS_PERM_R(perm) (perm & PERM_R ? 1u : 0u) +#define IS_PERM_W(perm) (perm & PERM_W ? 1u : 0u) + +/* common manipulation */ +#define INVALID(i, min, max) ((i < min) || (i > max) ? 1u : 0u) + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-lpc.c b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-lpc.c new file mode 100644 index 000000000000..397604f6deb4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-lpc.c @@ -0,0 +1,883 @@ +/* + * A lpc driver for the ufispace_s7801_54xs + * + * Copyright (C) 2017-2022 UfiSpace Technology Corporation. + * Jason Tsai + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include + +#define BSP_LOG_R(fmt, args...) \ + _bsp_log (LOG_READ, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_LOG_W(fmt, args...) \ + _bsp_log (LOG_WRITE, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_PR(level, fmt, args...) _bsp_log (LOG_SYS, level "[BSP]" fmt "\r\n", ##args) + +#define _SENSOR_DEVICE_ATTR_RO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO, read_##_func, NULL, _index) + +#define _SENSOR_DEVICE_ATTR_WO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IWUSR, NULL, write_##_func, _index) + +#define _SENSOR_DEVICE_ATTR_RW(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR, read_##_func, write_##_func, _index) + +#define _DEVICE_ATTR(_name) \ + &sensor_dev_attr_##_name.dev_attr.attr + +#define BSP_PR(level, fmt, args...) _bsp_log (LOG_SYS, level "[BSP]" fmt "\r\n", ##args) + +#define DRIVER_NAME "x86_64_ufispace_s7801_54xs_lpc" + +/* LPC registers */ + +#define REG_BASE_MB 0x700 +#define REG_BASE_EC 0xE300 + +#define REG_NONE 0x00 +//MB CPLD +#define REG_BRD_ID_0 (REG_BASE_MB + 0x00) +#define REG_BRD_ID_1 (REG_BASE_MB + 0x01) +#define REG_CPLD_VERSION (REG_BASE_MB + 0x02) +#define REG_CPLD_ID (REG_BASE_MB + 0x03) +#define REG_CPLD_BUILD (REG_BASE_MB + 0x04) +#define REG_CPLD_CHIP (REG_BASE_MB + 0x05) +#define REG_BRD_EXT_ID (REG_BASE_MB + 0x06) +#define REG_I2C_MUX_RESET (REG_BASE_MB + 0x46) +#define REG_I2C_MUX_RESET_2 (REG_BASE_MB + 0x47) +#define REG_MUX_CTRL (REG_BASE_MB + 0x5C) +#define REG_MISC_CTRL (REG_BASE_MB + 0x5D) +#define REG_MISC_CTRL_2 (REG_BASE_MB + 0x5E) + +//EC +#define REG_BIOS_BOOT (REG_BASE_EC + 0x0C) +#define REG_CPU_REV (REG_BASE_EC + 0x17) + +// BMC mailbox +#define REG_TEMP_MAC_HWM (REG_BASE_MB + 0xC0) + +//MASK +#define MASK_ALL (0xFF) +#define MASK_CPLD_MAJOR_VER (0b11000000) +#define MASK_CPLD_MINOR_VER (0b00111111) +#define MASK_HW_ID (0b00000011) +#define MASK_DEPH_ID (0b00000100) +#define MASK_BUILD_ID (0b00011000) +#define MASK_EXT_ID (0b00000111) +#define MASK_MUX_RESET_ALL (0x37) // 2#00110111 +#define MASK_MUX_RESET (MASK_ALL) +#define MASK_BIOS_BOOT_ROM (0b01000000) + +#define LPC_MDELAY (5) +#define MDELAY_RESET_INTERVAL (100) +#define MDELAY_RESET_FINISH (500) + +/* LPC sysfs attributes index */ +enum lpc_sysfs_attributes { + //MB CPLD + ATT_BRD_ID_0, + ATT_BRD_ID_1, + ATT_BRD_SKU_ID, + ATT_BRD_HW_ID, + ATT_BRD_DEPH_ID, + ATT_BRD_BUILD_ID, + ATT_BRD_EXT_ID, + + ATT_CPLD_ID, + ATT_CPLD_BUILD, + ATT_CPLD_CHIP, + + ATT_CPLD_VERSION_MAJOR, + ATT_CPLD_VERSION_MINOR, + ATT_CPLD_VERSION_BUILD, + ATT_CPLD_VERSION_H, + + ATT_MUX_RESET, + ATT_MUX_CTRL, + + //EC + ATT_CPU_HW_ID, + ATT_CPU_DEPH_ID, + ATT_CPU_BUILD_ID, + ATT_BIOS_BOOT_ROM, + //BMC mailbox + ATT_TEMP_MAC_HWM, + + //BSP + ATT_BSP_VERSION, + ATT_BSP_DEBUG, + ATT_BSP_PR_INFO, + ATT_BSP_PR_ERR, + ATT_BSP_REG, + ATT_BSP_GPIO_MAX, + ATT_MAX +}; + +enum data_type { + DATA_HEX, + DATA_DEC, + DATA_S_DEC, + DATA_UNK, +}; + +enum bsp_log_types { + LOG_NONE, + LOG_RW, + LOG_READ, + LOG_WRITE, + LOG_SYS +}; + +enum bsp_log_ctrl { + LOG_DISABLE, + LOG_ENABLE +}; + +struct lpc_data_s { + struct mutex access_lock; +}; + +typedef struct sysfs_info_s +{ + u16 reg; + u8 mask; + u8 data_type; +} sysfs_info_t; + +static sysfs_info_t sysfs_info[] = { + [ATT_BRD_ID_0] = {REG_BRD_ID_0, MASK_ALL, DATA_HEX}, + [ATT_BRD_ID_1] = {REG_BRD_ID_1, MASK_ALL, DATA_HEX}, + [ATT_BRD_SKU_ID] = {REG_BRD_ID_0, MASK_ALL, DATA_DEC}, + [ATT_BRD_HW_ID] = {REG_BRD_ID_1, MASK_HW_ID, DATA_DEC}, + [ATT_BRD_DEPH_ID] = {REG_BRD_ID_1, MASK_DEPH_ID, DATA_DEC}, + [ATT_BRD_BUILD_ID] = {REG_BRD_ID_1, MASK_BUILD_ID, DATA_DEC}, + [ATT_BRD_EXT_ID] = {REG_BRD_EXT_ID, MASK_EXT_ID, DATA_DEC}, + + [ATT_CPLD_ID] = {REG_CPLD_ID, MASK_ALL, DATA_DEC}, + [ATT_CPLD_BUILD] = {REG_CPLD_BUILD, MASK_ALL, DATA_DEC}, + [ATT_CPLD_CHIP] = {REG_CPLD_CHIP, MASK_ALL, DATA_DEC}, + + [ATT_CPLD_VERSION_MAJOR] = {REG_CPLD_VERSION, MASK_CPLD_MAJOR_VER, DATA_DEC}, + [ATT_CPLD_VERSION_MINOR] = {REG_CPLD_VERSION, MASK_CPLD_MINOR_VER, DATA_DEC}, + [ATT_CPLD_VERSION_BUILD] = {REG_CPLD_BUILD, MASK_ALL, DATA_DEC}, + [ATT_CPLD_VERSION_H] = {REG_CPLD_VERSION, MASK_ALL, DATA_UNK}, + + [ATT_MUX_RESET] = {REG_NONE, MASK_ALL, DATA_DEC}, + [ATT_MUX_CTRL] = {REG_MUX_CTRL, MASK_ALL, DATA_HEX}, + + //EC + [ATT_CPU_HW_ID] = {REG_CPU_REV, MASK_HW_ID, DATA_DEC}, + [ATT_CPU_DEPH_ID] = {REG_CPU_REV, MASK_DEPH_ID, DATA_DEC}, + [ATT_CPU_BUILD_ID] = {REG_CPU_REV, MASK_BUILD_ID, DATA_DEC}, + [ATT_BIOS_BOOT_ROM] = {REG_BIOS_BOOT, MASK_BIOS_BOOT_ROM, DATA_DEC}, + + //BMC mailbox + [ATT_TEMP_MAC_HWM] = {REG_TEMP_MAC_HWM , MASK_ALL, DATA_S_DEC}, + + //BSP + [ATT_BSP_VERSION] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_DEBUG] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_PR_INFO] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_PR_ERR] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_REG] = {REG_NONE, MASK_ALL, DATA_HEX}, +}; + +struct lpc_data_s *lpc_data; +char bsp_version[16]=""; +char bsp_debug[2]="0"; +char bsp_reg[8]="0x0"; +u8 enable_log_read = LOG_DISABLE; +u8 enable_log_write = LOG_DISABLE; +u8 enable_log_sys = LOG_ENABLE; +u8 mailbox_inited=0; + +/* reg shift */ +static u8 _shift(u8 mask) +{ + int i=0, mask_one=1; + + for(i=0; i<8; ++i) { + if ((mask & mask_one) == 1) + return i; + else + mask >>= 1; + } + + return -1; +} + +/* reg mask and shift */ +static u8 _mask_shift(u8 val, u8 mask) +{ + int shift=0; + + shift = _shift(mask); + + return (val & mask) >> shift; +} + +static u8 _parse_data(char *buf, unsigned int data, u8 data_type) +{ + if(buf == NULL) { + return -1; + } + + if(data_type == DATA_HEX) { + return sprintf(buf, "0x%02x", data); + } else if(data_type == DATA_DEC) { + return sprintf(buf, "%u", data); + } else { + return -1; + } + return 0; +} + +static int _bsp_log(u8 log_type, char *fmt, ...) +{ + if ((log_type==LOG_READ && enable_log_read) || + (log_type==LOG_WRITE && enable_log_write) || + (log_type==LOG_SYS && enable_log_sys) ) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk(fmt, args); + va_end(args); + + return r; + } else { + return 0; + } +} + +static int _config_bsp_log(u8 log_type) +{ + switch(log_type) { + case LOG_NONE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_RW: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_ENABLE; + break; + case LOG_READ: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_WRITE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_ENABLE; + break; + default: + return -EINVAL; + } + return 0; +} + +static void _outb(u8 data, u16 port) +{ + outb(data, port); + mdelay(LPC_MDELAY); +} + +/* init bmc mailbox, get from BMC team */ +static int bmc_mailbox_init(void) +{ + if (mailbox_inited) { + return mailbox_inited; + } + + //Enable super io writing + _outb(0xa5, 0x2e); + _outb(0xa5, 0x2e); + + //Logic device number + _outb(0x07, 0x2e); + _outb(0x0e, 0x2f); + + //Disable mailbox + _outb(0x30, 0x2e); + _outb(0x00, 0x2f); + + //Set base address bit + _outb(0x60, 0x2e); + _outb(0x07, 0x2f); + _outb(0x61, 0x2e); + _outb(0xc0, 0x2f); + + //Select bit[3:0] of SIRQ + _outb(0x70, 0x2e); + _outb(0x07, 0x2f); + + //Low level trigger + _outb(0x71, 0x2e); + _outb(0x01, 0x2f); + + //Enable mailbox + _outb(0x30, 0x2e); + _outb(0x01, 0x2f); + + //Disable super io writing + _outb(0xaa, 0x2e); + + //Mailbox initial + _outb(0x00, 0x786); + _outb(0x00, 0x787); + + //set mailbox_inited + mailbox_inited = 1; + + return mailbox_inited; +} + +/* get lpc register value */ +static u8 _read_lpc_reg(u16 reg, u8 mask) +{ + u8 reg_val=0x0, reg_mk_shf_val = 0x0; + + mutex_lock(&lpc_data->access_lock); + reg_val = inb(reg); + mutex_unlock(&lpc_data->access_lock); + + reg_mk_shf_val = _mask_shift(reg_val, mask); + + BSP_LOG_R("reg=0x%03x, reg_val=0x%02x, mask=0x%02x, reg_mk_shf_val=0x%02x", reg, reg_val, mask, reg_mk_shf_val); + + return reg_mk_shf_val; +} + +/* get lpc register value */ +static ssize_t read_lpc_reg(u16 reg, u8 mask, char *buf, u8 data_type) +{ + u8 reg_val; + int len=0; + + reg_val = _read_lpc_reg(reg, mask); + + // may need to change to hex value ? + len=_parse_data(buf, reg_val, data_type); + + return len; +} + +/* set lpc register value */ +static ssize_t write_lpc_reg(u16 reg, u8 mask, const char *buf, size_t count, u8 data_type) +{ + u8 reg_val, reg_val_now, shift; + + if (kstrtou8(buf, 0, ®_val) < 0) { + if(data_type == DATA_S_DEC) { + if (kstrtos8(buf, 0, ®_val) < 0) { + return -EINVAL; + } + } else { + return -EINVAL; + } + } + + //apply continuous bits operation if mask is specified, discontinuous bits are not supported + if (mask != MASK_ALL) { + reg_val_now = _read_lpc_reg(reg, MASK_ALL); + //clear bits in reg_val_now by the mask + reg_val_now &= ~mask; + //get bit shift by the mask + shift = _shift(mask); + //calculate new reg_val + reg_val = reg_val_now | (reg_val << shift); + } + + mutex_lock(&lpc_data->access_lock); + + _outb(reg_val, reg); + + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x, mask=0x%02x", reg, reg_val, mask); + + return count; +} + +/* get bsp value */ +static ssize_t read_bsp(char *buf, char *str) +{ + ssize_t len=0; + + mutex_lock(&lpc_data->access_lock); + len=sprintf(buf, "%s", str); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_R("reg_val=%s", str); + + return len; +} + +/* set bsp value */ +static ssize_t write_bsp(const char *buf, char *str, size_t str_len, size_t count) +{ + mutex_lock(&lpc_data->access_lock); + snprintf(str, str_len, "%s", buf); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg_val=%s", str); + + return count; +} + +/* get gpio max value */ +static ssize_t read_gpio_max(struct device *dev, + struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + if (attr->index == ATT_BSP_GPIO_MAX) { + return sprintf(buf, "%d\n", ARCH_NR_GPIOS-1); + } + return -1; +} + +/* get mb cpld version in human readable format */ +static ssize_t read_mb_cpld_version_h(struct device *dev, + struct device_attribute *da, char *buf) +{ + ssize_t len=0; + u8 major = 0, minor = 0, build = 0; + major = _read_lpc_reg(REG_CPLD_VERSION, MASK_CPLD_MAJOR_VER); + minor = _read_lpc_reg(REG_CPLD_VERSION, MASK_CPLD_MINOR_VER); + build = _read_lpc_reg(REG_CPLD_BUILD, MASK_ALL); + len=sprintf(buf, "%u.%02u.%03u", major, minor, build); + + return len; +} + +/* get lpc register value */ +static ssize_t read_lpc_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_ALL; + u8 data_type = DATA_UNK; + + if (attr->index == ATT_BSP_REG) { + //copy value from bsp_reg + if (kstrtou16(bsp_reg, 0, ®) < 0) + return -EINVAL; + + data_type = sysfs_info[attr->index].data_type; + } else { + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + data_type = sysfs_info[attr->index].data_type; + } + + return read_lpc_reg(reg, mask, buf, data_type); +} + +/* set lpc register value */ +static ssize_t write_lpc_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_ALL; + u8 data_type = DATA_UNK; + + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + data_type = sysfs_info[attr->index].data_type; + + if(attr->index == ATT_TEMP_MAC_HWM) { + bmc_mailbox_init(); + } + + return write_lpc_reg(reg, mask, buf, count, data_type); +} + +/* get bsp parameter value */ +static ssize_t read_bsp_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + char *str=NULL; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + break; + case ATT_BSP_DEBUG: + str = bsp_debug; + break; + case ATT_BSP_REG: + str = bsp_reg; + break; + default: + return -EINVAL; + } + return read_bsp(buf, str); +} + +/* set bsp parameter value */ +static ssize_t write_bsp_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + u16 reg = 0; + u8 bsp_debug_u8 = 0; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + str_len = sizeof(bsp_version); + break; + case ATT_BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(bsp_debug); + break; + case ATT_BSP_REG: + if (kstrtou16(buf, 0, ®) < 0) + return -EINVAL; + + str = bsp_reg; + str_len = sizeof(bsp_reg); + break; + default: + return -EINVAL; + } + + if (attr->index == ATT_BSP_DEBUG) { + if (kstrtou8(buf, 0, &bsp_debug_u8) < 0) { + return -EINVAL; + } else if (_config_bsp_log(bsp_debug_u8) < 0) { + return -EINVAL; + } + } + + return write_bsp(buf, str, str_len, count); +} + +static ssize_t write_bsp_pr_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len = strlen(buf); + + if(str_len <= 0) + return str_len; + + switch (attr->index) { + case ATT_BSP_PR_INFO: + BSP_PR(KERN_INFO, "%s", buf); + break; + case ATT_BSP_PR_ERR: + BSP_PR(KERN_ERR, "%s", buf); + break; + default: + return -EINVAL; + } + + return str_len; +} + +/* set mux_reset register value */ +static ssize_t write_mux_reset(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + u16 reg = REG_I2C_MUX_RESET; + u8 val = 0; + u8 mux_reset_reg_val = 0; + static int mux_reset_flag = 0; + + if (kstrtou8(buf, 0, &val) < 0) + return -EINVAL; + + if (mux_reset_flag == 0) { + if (val == 0) { + mutex_lock(&lpc_data->access_lock); + mux_reset_flag = 1; + BSP_LOG_W("i2c mux reset is triggered..."); + + //reset mux on SFP/QSFP ports + mux_reset_reg_val = inb(reg); + _outb((mux_reset_reg_val & (u8) (~MASK_MUX_RESET)), reg); + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x", reg, mux_reset_reg_val & 0x0); + + //unset mux on SFP/QSFP ports + outb((mux_reset_reg_val | MASK_MUX_RESET), reg); + mdelay(500); + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x", reg, mux_reset_reg_val | 0xFF); + + mux_reset_flag = 0; + mutex_unlock(&lpc_data->access_lock); + } else { + return -EINVAL; + } + } else { + BSP_LOG_W("i2c mux is resetting... (ignore)"); + mutex_lock(&lpc_data->access_lock); + mutex_unlock(&lpc_data->access_lock); + } + + return count; +} + +//SENSOR_DEVICE_ATTR - MB +static _SENSOR_DEVICE_ATTR_RO(board_id_0, lpc_callback, ATT_BRD_ID_0); +static _SENSOR_DEVICE_ATTR_RO(board_id_1, lpc_callback, ATT_BRD_ID_1); +static _SENSOR_DEVICE_ATTR_RO(board_sku_id, lpc_callback, ATT_BRD_SKU_ID); +static _SENSOR_DEVICE_ATTR_RO(board_hw_id, lpc_callback, ATT_BRD_HW_ID); +static _SENSOR_DEVICE_ATTR_RO(board_deph_id, lpc_callback, ATT_BRD_DEPH_ID); +static _SENSOR_DEVICE_ATTR_RO(board_build_id, lpc_callback, ATT_BRD_BUILD_ID); +static _SENSOR_DEVICE_ATTR_RO(board_ext_id, lpc_callback, ATT_BRD_EXT_ID); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_major, lpc_callback, ATT_CPLD_VERSION_MAJOR); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_minor, lpc_callback, ATT_CPLD_VERSION_MINOR); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_build, lpc_callback, ATT_CPLD_VERSION_BUILD); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_h, mb_cpld_version_h, ATT_CPLD_VERSION_H); +static _SENSOR_DEVICE_ATTR_RO(cpld_id, lpc_callback, ATT_CPLD_ID); + +static _SENSOR_DEVICE_ATTR_WO(mux_reset, mux_reset, ATT_MUX_RESET); +static _SENSOR_DEVICE_ATTR_RW(mux_ctrl, lpc_callback, ATT_MUX_CTRL); + +//SENSOR_DEVICE_ATTR - BMC mailbox +static _SENSOR_DEVICE_ATTR_WO(temp_mac_hwm , lpc_callback , ATT_TEMP_MAC_HWM); + +//SENSOR_DEVICE_ATTR - EC +static _SENSOR_DEVICE_ATTR_RO(cpu_hw_id, lpc_callback, ATT_CPU_HW_ID); +static _SENSOR_DEVICE_ATTR_RO(cpu_deph_id, lpc_callback, ATT_CPU_DEPH_ID); +static _SENSOR_DEVICE_ATTR_RO(cpu_build_id, lpc_callback, ATT_CPU_BUILD_ID); +static _SENSOR_DEVICE_ATTR_RO(bios_boot_rom, lpc_callback, ATT_BIOS_BOOT_ROM); + +//SENSOR_DEVICE_ATTR - BSP +static _SENSOR_DEVICE_ATTR_RW(bsp_version, bsp_callback, ATT_BSP_VERSION); +static _SENSOR_DEVICE_ATTR_RW(bsp_debug, bsp_callback, ATT_BSP_DEBUG); +static _SENSOR_DEVICE_ATTR_WO(bsp_pr_info, bsp_pr_callback, ATT_BSP_PR_INFO); +static _SENSOR_DEVICE_ATTR_WO(bsp_pr_err, bsp_pr_callback, ATT_BSP_PR_ERR); +static SENSOR_DEVICE_ATTR(bsp_reg, S_IRUGO | S_IWUSR, read_lpc_callback, write_bsp_callback, ATT_BSP_REG); +static SENSOR_DEVICE_ATTR(bsp_gpio_max, S_IRUGO, read_gpio_max, NULL, ATT_BSP_GPIO_MAX); + +static struct attribute *mb_cpld_attrs[] = { + _DEVICE_ATTR(board_id_0), + _DEVICE_ATTR(board_id_1), + _DEVICE_ATTR(board_sku_id), + _DEVICE_ATTR(board_hw_id), + _DEVICE_ATTR(board_deph_id), + _DEVICE_ATTR(board_build_id), + _DEVICE_ATTR(board_ext_id), + _DEVICE_ATTR(cpld_version_major), + _DEVICE_ATTR(cpld_version_minor), + _DEVICE_ATTR(cpld_version_build), + _DEVICE_ATTR(cpld_version_h), + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(mux_reset), + _DEVICE_ATTR(mux_ctrl), + NULL, +}; + +static struct attribute *bsp_attrs[] = { + _DEVICE_ATTR(bsp_version), + _DEVICE_ATTR(bsp_debug), + _DEVICE_ATTR(bsp_pr_info), + _DEVICE_ATTR(bsp_pr_err), + _DEVICE_ATTR(bsp_reg), + _DEVICE_ATTR(bsp_gpio_max), + NULL, +}; + +static struct attribute *ec_attrs[] = { + _DEVICE_ATTR(cpu_hw_id), + _DEVICE_ATTR(cpu_deph_id), + _DEVICE_ATTR(cpu_build_id), + _DEVICE_ATTR(bios_boot_rom), + NULL, +}; + +static struct attribute *bmc_mailbox_attrs[] = { + _DEVICE_ATTR(temp_mac_hwm), + NULL, +}; + +static struct attribute_group mb_cpld_attr_grp = { + .name = "mb_cpld", + .attrs = mb_cpld_attrs, +}; + +static struct attribute_group bsp_attr_grp = { + .name = "bsp", + .attrs = bsp_attrs, +}; + +static struct attribute_group ec_attr_grp = { + .name = "ec", + .attrs = ec_attrs, +}; + +static struct attribute_group bmc_mailbox_attr_grp = { + .name = "bmc_mailbox", + .attrs = bmc_mailbox_attrs, +}; + +static void lpc_dev_release( struct device * dev) +{ + return; +} + +static struct platform_device lpc_dev = { + .name = DRIVER_NAME, + .id = -1, + .dev = { + .release = lpc_dev_release, + } +}; + +static int lpc_drv_probe(struct platform_device *pdev) +{ + int i = 0, grp_num = 4; + int err[4] = {0}; + struct attribute_group *grp; + + lpc_data = devm_kzalloc(&pdev->dev, sizeof(struct lpc_data_s), + GFP_KERNEL); + if (!lpc_data) + return -ENOMEM; + + mutex_init(&lpc_data->access_lock); + + for (i=0; idev.kobj, grp); + if (err[i]) { + printk(KERN_ERR "Cannot create sysfs for group %s\n", grp->name); + goto exit; + } else { + continue; + } + } + + return 0; + +exit: + for (i=0; idev.kobj, grp); + if (!err[i]) { + //remove previous successful cases + continue; + } else { + //remove first failed case, then return + return err[i]; + } + } + return 0; +} + +static int lpc_drv_remove(struct platform_device *pdev) +{ + sysfs_remove_group(&pdev->dev.kobj, &mb_cpld_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &bmc_mailbox_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &bsp_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &ec_attr_grp); + + return 0; +} + +static struct platform_driver lpc_drv = { + .probe = lpc_drv_probe, + .remove = __exit_p(lpc_drv_remove), + .driver = { + .name = DRIVER_NAME, + }, +}; + +int lpc_init(void) +{ + int err = 0; + + err = platform_driver_register(&lpc_drv); + if (err) { + printk(KERN_ERR "%s(#%d): platform_driver_register failed(%d)\n", + __func__, __LINE__, err); + + return err; + } + + err = platform_device_register(&lpc_dev); + if (err) { + printk(KERN_ERR "%s(#%d): platform_device_register failed(%d)\n", + __func__, __LINE__, err); + platform_driver_unregister(&lpc_drv); + return err; + } + + return err; +} + +void lpc_exit(void) +{ + platform_driver_unregister(&lpc_drv); + platform_device_unregister(&lpc_dev); +} + +MODULE_AUTHOR("Jason Tsai "); +MODULE_DESCRIPTION("x86_64_ufispace_s7801_54xs_lpc driver"); +MODULE_LICENSE("GPL"); + +module_init(lpc_init); +module_exit(lpc_exit); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-sys-eeprom.c b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-sys-eeprom.c new file mode 100644 index 000000000000..f9f7728deb3d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/modules/x86-64-ufispace-s7801-54xs-sys-eeprom.c @@ -0,0 +1,272 @@ +/* + * Copyright (C) 1998, 1999 Frodo Looijaard and + * Philip Edelbrock + * Copyright (C) 2003 Greg Kroah-Hartman + * Copyright (C) 2003 IBM Corp. + * Copyright (C) 2004 Jean Delvare + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* enable dev_dbg print out */ +//#define DEBUG + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { /*0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57,*/ I2C_CLIENT_END }; + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 512 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void sys_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, (u8)((addr >> 8) & 0xFF), (u8)(addr & 0xFF)); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t sys_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + sys_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static ssize_t sys_eeprom_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + int ret; + int i; + u8 cmd; + u16 value16; + + dev_dbg(&client->dev, "sys_eeprom_write off=%d, count=%d\n", (int)off, (int)count); + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + mutex_lock(&data->update_lock); + + for(i=0; i < count; i++) { + /* write command */ + cmd = (off >> 8) & 0xff; + value16 = off & 0xff; + value16 |= buf[i] << 8; + ret = i2c_smbus_write_word_data(client, cmd, value16); + + if (ret < 0) { + dev_err(&client->dev, "write address failed at %d \n", (int)off); + goto exit; + } + + off++; + + /* need to wait for write complete */ + udelay(10000); + } +exit: + mutex_unlock(&data->update_lock); + /* force to update client when reading */ + for(i=0; i < SLICE_NUM; i++) { + data->last_updated[i] = 0; + } + + return count; +} + +static struct bin_attribute sys_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO | S_IWUSR, + }, + .size = EEPROM_SIZE, + .read = sys_eeprom_read, + .write = sys_eeprom_write, +}; + +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int sys_eeprom_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = client->adapter; + + /* EDID EEPROMs are often 24C00 EEPROMs, which answer to all + addresses 0x50-0x57, but we only care about 0x51 and 0x55. So decline + attaching to addresses >= 0x56 on DDC buses */ + if (!(adapter->class & I2C_CLASS_SPD) && client->addr >= 0x56) { + return -ENODEV; + } + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE) + && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { + return -ENODEV; + } + + strlcpy(info->type, "eeprom", I2C_NAME_SIZE); + + return 0; +} + +static int sys_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + +#ifdef __STDC_LIB_EXT1__ + memset_s(data->data, EEPROM_SIZE, 0xff, EEPROM_SIZE); +#else + memset(data->data, 0xff, EEPROM_SIZE); +#endif + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &sys_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int sys_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &sys_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id sys_eeprom_id[] = { + { "sys_eeprom", 0 }, + { } +}; + +static struct i2c_driver sys_eeprom_driver = { + .driver = { + .name = "sys_eeprom", + }, + .probe = sys_eeprom_probe, + .remove = sys_eeprom_remove, + .id_table = sys_eeprom_id, + + .class = I2C_CLASS_DDC | I2C_CLASS_SPD, + .detect = sys_eeprom_detect, + .address_list = normal_i2c, +}; + +module_i2c_driver(sys_eeprom_driver); + +MODULE_AUTHOR("Jason "); +MODULE_DESCRIPTION("UfiSpace System EEPROM driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/__init__.py new file mode 100644 index 000000000000..593867d31c9d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/__init__.py @@ -0,0 +1,4 @@ +# All the derived classes for PDDF +__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] +from . import platform + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/chassis.py new file mode 100644 index 000000000000..085f2af2ff85 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/chassis.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Chassis API +# +############################################################################# + +try: + import time + from sonic_platform_pddf_base.pddf_chassis import PddfChassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_COMPONENT = 4 + +class Chassis(PddfChassis): + """ + PDDF Platform-specific Chassis class + """ + + SYSLED_DEV_NAME = "SYS_LED" + port_dict = {} + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfChassis.__init__(self, pddf_data, pddf_plugin_data) + self._initialize_components() + + def _initialize_components(self): + from sonic_platform.component import Component + for index in range(NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + # return device_info.get_hwsku() + return self._eeprom.platform_name_str() + + def initizalize_system_led(self): + return True + + def get_status_led(self): + return self.get_system_led(self.SYSLED_DEV_NAME) + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + Returns: + (bool, dict): + - bool: True if call successful, False if not; + - dict: A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, where device_id is the device ID + for this device and device_event. + The known devices's device_id and device_event was defined as table below. + ----------------------------------------------------------------- + device | device_id | device_event | annotate + ----------------------------------------------------------------- + 'fan' '' '0' Fan removed + '1' Fan inserted + 'sfp' '' '0' Sfp removed + '1' Sfp inserted + '2' I2C bus stuck + '3' Bad eeprom + '4' Unsupported cable + '5' High Temperature + '6' Bad cable + 'voltage' '' '0' Vout normal + '1' Vout abnormal + -------------------------------------------------------------------- + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'}, + 'voltage':{'U20':'0', 'U21':'1'}} + Indicates that: + fan 0 has been removed, fan 2 has been inserted. + sfp 11 has been removed, sfp 12 has been inserted. + monitored voltage U20 became normal, voltage U21 became abnormal. + Note: For sfp, when event 3-6 happened, the module will not be avalaible, + XCVRD shall stop to read eeprom before SFP recovered from error status. + """ + + change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}} + + start_time = time.time() + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_change_event:Invalid timeout value", timeout) + return False, change_event_dict + + end_time = start_time + timeout + if start_time > end_time: + print( + "get_change_event:" "time wrap / invalid timeout value", + timeout, + ) + return False, change_event_dict # Time wrap or possibly incorrect timeout + try: + while timeout >= 0: + # check for sfp + sfp_change_dict = self.get_transceiver_change_event() + # check for fan + # fan_change_dict = self.get_fan_change_event() + # check for voltage + # voltage_change_dict = self.get_voltage_change_event() + + if sfp_change_dict: + change_event_dict["sfp"] = sfp_change_dict + # change_event_dict["fan"] = fan_change_dict + # change_event_dict["voltage"] = voltage_change_dict + return True, change_event_dict + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_event_dict + except Exception as e: + print(e) + print("get_change_event: Should not reach here.") + return False, change_event_dict + + def get_transceiver_change_event(self): + current_port_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index in range(self.platform_inventory['num_ports']): + if self._sfp_list[index].get_presence(): + #current_port_dict[index] = self.STATUS_INSERTED + current_port_dict[index] = self.plugin_data['XCVR']['plug_status']['inserted'] + else: + #current_port_dict[index] = self.STATUS_REMOVED + current_port_dict[index] = self.plugin_data['XCVR']['plug_status']['removed'] + + if len(self.port_dict) == 0: # first time + self.port_dict = current_port_dict + return {} + + if current_port_dict == self.port_dict: + return {} + + # Update reg value + for index, status in current_port_dict.items(): + if self.port_dict[index] != status: + ret_dict[index] = status + #ret_dict[str(index)] = status + self.port_dict = current_port_dict + for index, status in ret_dict.items(): + if int(status) == 1: + pass + #self._sfp_list[int(index)].check_sfp_optoe_type() + return ret_dict + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = self.plugin_data['REBOOT_CAUSE']['reboot_cause_file'] + + try: + with open(reboot_cause_path, 'r', errors='replace') as fd: + data = fd.read() + sw_reboot_cause = data.strip() + except IOError: + sw_reboot_cause = "Unknown" + + return ('REBOOT_CAUSE_NON_HARDWARE', sw_reboot_cause) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/component.py new file mode 100644 index 000000000000..1c583079f8c2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/component.py @@ -0,0 +1,125 @@ +############################################################################# +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from sonic_platform_pddf_base import pddfapi +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_SYSFS = { + "CPLD1": {"major": "cpld1_major_ver", "minor": "cpld1_minor_ver", "build": "cpld1_build"}, + "CPLD2": {"major": "cpld2_major_ver", "minor": "cpld2_minor_ver", "build": "cpld2_build"}, +} + +BMC_CMDS = { + "VER1": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f1", + "VER2": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f2", + "VER3": "echo $((`ipmitool mc info | grep 'Aux Firmware Rev Info' -A 2 | sed -n '2p'` + 0))", +} + +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("CPLD1", "CPLD 1"), + ("CPLD2", "CPLD 2"), + ("BIOS", "Basic Input/Output System"), + ("BMC", "BMC"), +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + self.pddf_obj = pddfapi.PddfApi() + self.index = component_index + self.name = self.get_name() + + def _get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def _get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name, elem in CPLD_SYSFS.items(): + device = "SYSSTATUS" + major = self.pddf_obj.get_attr_name_output(device, elem["major"]) + minor = self.pddf_obj.get_attr_name_output(device, elem["minor"]) + build = self.pddf_obj.get_attr_name_output(device, elem["build"]) + if major and minor and build: + major = int(major['status'].rstrip(),0) + minor = int(minor['status'].rstrip(),0) + build = int(build['status'].rstrip(),0) + cpld_version[cpld_name] = "{}.{:02d}.{:03d}".format(major, minor, build) + else: + cpld_version[cpld_name] = "N/A" + return cpld_version + + def _get_bmc_version(self): + # Retrieves the BMC firmware version + bmc_ver = dict() + for ver in BMC_CMDS: + status, value = subprocess.getstatusoutput(BMC_CMDS[ver]) + if not status: + bmc_ver[ver] = int(value.rstrip()) + else: + return None + + bmc_version = "{}.{}.{}".format(bmc_ver["VER1"], bmc_ver["VER2"], bmc_ver["VER3"]) + + return bmc_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self._get_bios_version() + elif "CPLD" in self.name: + cpld_version = self._get_cpld_version() + fw_version = cpld_version.get(self.name) + elif self.name == "BMC": + fw_version = self._get_bmc_version() + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/eeprom.py new file mode 100644 index 000000000000..90ab1c779a48 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(PddfEeprom): + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + + def platform_name_str(self): + (is_valid, results) = self.get_tlv_field(self.eeprom_data, self._TLV_CODE_PLATFORM_NAME) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan.py new file mode 100644 index 000000000000..c3cb875646b0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan import PddfFan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Fan(PddfFan): + """PDDF Platform-Specific Fan class""" + + def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): + # idx is 0-based + PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten + # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' + + def get_mfr_id(self): + """ + Retrieves the manufacturer id of the device + + Returns: + string: Manufacturer Id of device + """ + if self.is_psu_fan: + device = "PSU{}".format(self.fans_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_mfr_id") + else: + raise NotImplementedError + + if not output: + return None + + mfr = output['status'] + + # strip_non_ascii + stripped = (c for c in mfr if 0 < ord(c) < 127) + mfr = ''.join(stripped) + + return mfr.rstrip('\n') + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + if self.is_psu_fan: + device = "PSU{}".format(self.fans_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_model_name") + else: + raise NotImplementedError + + if not output: + return None + + model = output['status'] + + # strip_non_ascii + stripped = (c for c in model if 0 < ord(c) < 127) + model = ''.join(stripped) + + return model.rstrip('\n') + + def get_max_speed(self): + """ + Retrieves the max speed + + Returns: + An Integer, the max speed + """ + if self.is_psu_fan: + mfr = self.get_mfr_id() + model = self.get_model() + + max_speed = int(self.plugin_data['PSU']['valmap']['PSU_FAN_MAX_SPEED_AC']) + if mfr and model : + for dev in self.plugin_data['PSU']['psu_support_list']: + if dev['Manufacturer'] == mfr and dev['Name'] == model: + max_speed = int(self.plugin_data['PSU']['valmap'][dev['MaxSpd']]) + break + else: + max_speed = int(self.plugin_data['FAN']['FAN_MAX_SPEED']) + + return max_speed + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed_percentage = 0 + + max_speed = self.get_max_speed() + rpm_speed = self.get_speed_rpm() + + speed_percentage = round((rpm_speed*100)/max_speed) + + return min(speed_percentage, 100) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + if self.is_psu_fan: + attr_name = "psu_present" + device = "PSU{}".format(self.fans_psu_index) + else: + idx = (self.fantray_index-1)*self.platform['num_fans_pertray'] + self.fan_index + attr_name = "fan" + str(idx) + "_present" + device = "FAN-CTRL" + + output = self.pddf_obj.get_attr_name_output(device, attr_name) + if not output: + return False + + mode = output['mode'] + presence = output['status'].rstrip() + vmap = self.plugin_data['FAN']['present'][mode]['valmap'] + + if presence in vmap: + status = vmap[presence] + else: + status = False + + return status + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + return self.get_speed() + + def set_speed(self, speed): + """ + Sets the fan speed + + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + + Returns: + A boolean, True if speed is set successfully, False if not + """ + + print("Setting Fan speed is not allowed") + return False diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/platform.py new file mode 100644 index 000000000000..406b1179ae1b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/platform.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + + +try: + from sonic_platform_pddf_base.pddf_platform import PddfPlatform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PddfPlatform): + """ + PDDF Platform-Specific Platform Class + """ + + def __init__(self): + PddfPlatform.__init__(self) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/psu.py new file mode 100644 index 000000000000..38b32412d024 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/psu.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_psu import PddfPsu +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Psu(PddfPsu): + """PDDF Platform-Specific PSU class""" + + PLATFORM_PSU_CAPACITY = 450 + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU (or PSU capacity) + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(self.PLATFORM_PSU_CAPACITY) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + + # power is returned in micro watts + return round(float(self.get_voltage()*self.get_current()), 2) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/sfp.py new file mode 100644 index 000000000000..8ab43117d54c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/sfp.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_sfp import PddfSfp +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Sfp(PddfSfp): + """ + PDDF Platform-Specific Sfp class + """ + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data) + self.index = index + + # Provide the functions/variables below for which implementation is to be overwritten + + def get_lpmode(self): + if self.sfp_type == "QSFP28": + return super().get_lpmode() + else: + return False + + def set_lpmode(self, lpmode): + if self.sfp_type == "QSFP28": + return super().set_lpmode(lpmode) + else: + return False + + def reset(self): + if self.sfp_type == "QSFP28": + return super().reset() + else: + return False + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + + return self.SFP_STATUS_OK diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/thermal.py new file mode 100644 index 000000000000..77d6ec7ae886 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform/thermal.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_thermal import PddfThermal +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + + +class Thermal(PddfThermal): + """PDDF Platform-Specific Thermal class""" + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform_setup.py new file mode 100644 index 000000000000..c0a485320cb7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/sonic_platform_setup.py @@ -0,0 +1,27 @@ +from setuptools import setup + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on ufispace platform', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='Jason Tsai', + maintainer_email='jason.cy.tsai@ufispace.com', + packages=['sonic_platform'], + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_device_create.sh b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_device_create.sh new file mode 100755 index 000000000000..4a55252ea936 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_device_create.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +#disable bmc watchdog +echo "Disable BMC watchdog" +timeout 3 ipmitool mc watchdog off + +pddf_ledutil setstatusled SYNC_LED off +pddf_ledutil setstatusled SYS_LED off +pddf_ledutil setstatusled ID_LED off + +#set status led to green to indicate platform init done +curr_led=$(pddf_ledutil getstatusled SYS_LED) +pddf_ledutil setstatusled SYS_LED green +echo "Set SYS_LED from $curr_led to green" + +echo "PDDF device post-create completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_driver_install.sh new file mode 100755 index 000000000000..ed2559977e42 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_post_driver_install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "PDDF driver post-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_pre_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_pre_driver_install.sh new file mode 100755 index 000000000000..9ada6c235c48 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_pre_driver_install.sh @@ -0,0 +1,8 @@ +#!/bin/bash +#rmmod gpio_ich +if [ ! -f /tmp/._pddf_pre_driver_init_completion ]; then + rmmod i2c_i801 + rmmod i2c_ismt + date > /tmp/._pddf_pre_driver_init_completion +fi +echo "PDDF driver pre-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_switch_svc.py b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_switch_svc.py new file mode 100755 index 000000000000..ca34fe9442c9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pddf_switch_svc.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# Script to stop and start the respective platforms default services. +# This will be used while switching the pddf->non-pddf mode and vice versa +import commands + +def check_pddf_support(): + return True + +def stop_platform_svc(): + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py deinit") + if status: + print "platform_utility.py deinit command failed %d"%status + return False + + # HACK , stop the pddf-platform-init service if it is active + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service along with other platform serives failed %d"%status + return False + + return True + +def start_platform_svc(): + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py init") + if status: + print "platform_utility.py init command failed %d"%status + return False + + return True + +def start_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") + if status: + print "Start pddf-platform-init.service failed %d"%status + return False + + return True + +def stop_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service failed %d"%status + return False + + return True + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pre_pddf_init.sh b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pre_pddf_init.sh new file mode 100755 index 000000000000..63a2e205808e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s7801-54xs/utils/pre_pddf_init.sh @@ -0,0 +1,5 @@ +#!/bin/bash +#rmmod gpio_ich +modprobe -rq i2c_i801 +modprobe -rq i2c_smbus +echo "Pre PDDF init steps completed successully" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/Makefile b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/Makefile new file mode 100644 index 000000000000..e441986ded77 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/Makefile @@ -0,0 +1,6 @@ + +MODULE_NAME = x86-64-ufispace-s8901-54xc-cpld.o x86-64-ufispace-s8901-54xc-sys-eeprom.o x86-64-ufispace-s8901-54xc-lpc.o pddf_custom_sysstatus_module.o +obj-m := $(MODULE_NAME) + +CFLAGS_pddf_custom_sysstatus_module.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/pddf_custom_sysstatus_module.c b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/pddf_custom_sysstatus_module.c new file mode 100644 index 000000000000..b50bb428000a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/pddf_custom_sysstatus_module.c @@ -0,0 +1,276 @@ +/* + * Copyright 2019 Broadcom. + * The term ��Broadcom�� refers to Broadcom Inc. and/or its subsidiaries. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * A pddf kernel module for system status registers + */ + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../../pddf/i2c/modules/include/pddf_client_defs.h" +#include "../../../../pddf/i2c/modules/include/pddf_sysstatus_defs.h" + + +SYSSTATUS_DATA sysstatus_data = {0}; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf); +ssize_t store_sysstatus_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + + +PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, + (void*)&sysstatus_data.sysstatus_addr_attr.aname, NULL); +PDDF_DATA_ATTR(attr_devaddr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.devaddr , NULL); +PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.offset, NULL); +PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.mask , NULL); +PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.len , NULL); +PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&sysstatus_data, NULL); + + + +static struct attribute *sysstatus_addr_attributes[] = { + &attr_attr_name.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + NULL +}; + +PDDF_DATA_ATTR(board_sku_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_hw_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_deph_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_build_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_major_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_minor_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_build , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_major_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_minor_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_build , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(psu_status , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_psu , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_sys , S_IWUSR|S_IRUGO, show_sysstatus_data, store_sysstatus_data, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_sync, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_fan , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_id , S_IWUSR|S_IRUGO, show_sysstatus_data, store_sysstatus_data, PDDF_UCHAR, sizeof(u8), NULL, NULL); + +static struct attribute *sysstatus_data_attributes[] = { + &attr_board_sku_id.dev_attr.attr, + &attr_board_hw_id.dev_attr.attr, + &attr_board_deph_id.dev_attr.attr, + &attr_board_build_id.dev_attr.attr, + &attr_cpld1_major_ver.dev_attr.attr, + &attr_cpld1_minor_ver.dev_attr.attr, + &attr_cpld1_build.dev_attr.attr, + &attr_cpld2_major_ver.dev_attr.attr, + &attr_cpld2_minor_ver.dev_attr.attr, + &attr_cpld2_build.dev_attr.attr, + &attr_psu_status.dev_attr.attr, + &attr_system_led_psu.dev_attr.attr, + &attr_system_led_sys.dev_attr.attr, + &attr_system_led_sync.dev_attr.attr, + &attr_system_led_fan.dev_attr.attr, + &attr_system_led_id.dev_attr.attr, + NULL +}; + + +static const struct attribute_group pddf_sysstatus_addr_group = { + .attrs = sysstatus_addr_attributes, +}; + + +static const struct attribute_group pddf_sysstatus_data_group = { + .attrs = sysstatus_data_attributes, +}; + + +static struct kobject *sysstatus_addr_kobj; +static struct kobject *sysstatus_data_kobj; + + + +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf) +{ + + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + SYSSTATUS_DATA *data = &sysstatus_data; + struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; + int i, status ; + + + for (i=0;isysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) + { + sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; + + } + } + + if (sysstatus_addr_attrs==NULL ) + { + printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); + status = 0; + } + else + { + status = board_i2c_cpld_read( sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset); + } + + return sprintf(buf, "0x%x\n", (status&sysstatus_addr_attrs->mask)); + +} + +ssize_t store_sysstatus_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + SYSSTATUS_DATA *data = &sysstatus_data; + struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; + int i, status ; + u8 reg_val; + + for (i=0;isysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) + { + sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; + } + } + + if (sysstatus_addr_attrs==NULL) + { + printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); + return -EINVAL; + } + else + { + if (kstrtou8(buf, 0, ®_val) < 0) + return -EINVAL; + + status = board_i2c_cpld_write(sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset, reg_val); + + if (status!=0) + { + printk(KERN_DEBUG "store_sysstatus_data() %s failed, status=%d\n",data->sysstatus_addr_attrs[i].aname, status); + return status; + } + } + + return count; +} + + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + SYSSTATUS_DATA *pdata = (SYSSTATUS_DATA *)(ptr->addr); + + pdata->sysstatus_addr_attrs[pdata->len] = pdata->sysstatus_addr_attr; + pdata->len++; + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Populating the data for %s\n", __FUNCTION__, pdata->sysstatus_addr_attr.aname); + +#ifdef __STDC_LIB_EXT1__ + memset_s(&pdata->sysstatus_addr_attr, sizeof(pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); +#else + memset(&pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); +#endif + + return count; +} + + + + +int __init sysstatus_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + sysstatus_addr_kobj = kobject_create_and_add("sysstatus", device_kobj); + if(!sysstatus_addr_kobj) + return -ENOMEM; + + sysstatus_data_kobj = kobject_create_and_add("sysstatus_data", sysstatus_addr_kobj); + if(!sysstatus_data_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + if (ret) + { + kobject_put(sysstatus_addr_kobj); + return ret; + } + + ret = sysfs_create_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + if (ret) + { + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + return ret; + } + + + return ret; +} + +void __exit sysstatus_data_exit(void) +{ + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. exit\n"); + sysfs_remove_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Removed the kobjects for 'SYSSTATUS'\n",__FUNCTION__); + return; +} + +module_init(sysstatus_data_init); +module_exit(sysstatus_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("SYSSTATUS platform data"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.c b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.c new file mode 100644 index 000000000000..63eec91d4819 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.c @@ -0,0 +1,1512 @@ +/* + * A i2c cpld driver for the ufispace_s8901_54xc + * + * Copyright (C) 2017-2022 UfiSpace Technology Corporation. + * Jason Tsai + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "x86-64-ufispace-s8901-54xc-cpld.h" + +#ifdef DEBUG +#define DEBUG_PRINT(fmt, args...) \ + printk(KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#else +#define DEBUG_PRINT(fmt, args...) +#endif + +#define BSP_LOG_R(fmt, args...) \ + _bsp_log (LOG_READ, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_LOG_W(fmt, args...) \ + _bsp_log (LOG_WRITE, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) + +#define I2C_READ_BYTE_DATA(ret, lock, i2c_client, reg) \ +{ \ + mutex_lock(lock); \ + ret = i2c_smbus_read_byte_data(i2c_client, reg); \ + mutex_unlock(lock); \ + BSP_LOG_R("cpld[%d], reg=0x%03x, reg_val=0x%02x", data->index, reg, ret); \ +} + +#define I2C_WRITE_BYTE_DATA(ret, lock, i2c_client, reg, val) \ +{ \ + mutex_lock(lock); \ + ret = i2c_smbus_write_byte_data(i2c_client, reg, val); \ + mutex_unlock(lock); \ + BSP_LOG_W("cpld[%d], reg=0x%03x, reg_val=0x%02x", data->index, reg, val); \ +} + +#define _SENSOR_DEVICE_ATTR_RO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO, read_##_func, NULL, _index) + +#define _SENSOR_DEVICE_ATTR_WO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IWUSR, NULL, write_##_func, _index) + +#define _SENSOR_DEVICE_ATTR_RW(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR, read_##_func, write_##_func, _index) + +#define _DEVICE_ATTR(_name) \ + &sensor_dev_attr_##_name.dev_attr.attr + +#define I2C_RW_RETRY_COUNT 3 +#define I2C_RW_RETRY_INTERVAL 60 + +/* CPLD sysfs attributes index */ +enum cpld_sysfs_attributes { + //CPLD 1 + + CPLD_BOARD_ID_0, + CPLD_BOARD_ID_1, + CPLD_ID, + CPLD_CHIP, + CPLD_SKU_EXT, + + CPLD_MAJOR_VER, + CPLD_MINOR_VER, + CPLD_BUILD_VER, + CPLD_VERSION_H, + + CPLD_MAC_INTR, + CPLD_HWM_INTR, + CPLD_CPLD2_INTR, + CPLD_NTM_INTR, + CPLD_FAN_PSU_INTR, + CPLD_SFP_IOEXP_INTR, + CPLD_CPU_NMI_INTR, + CPLD_PTP_INTR, + CPLD_SYSTEM_INTR, + + CPLD_MAC_MASK, + CPLD_HWM_MASK, + CPLD_CPLD2_MASK, + CPLD_NTM_MASK, + CPLD_FAN_PSU_MASK, + CPLD_SFP_IOEXP_MASK, + CPLD_CPU_NMI_MASK, + CPLD_PTP_MASK, + CPLD_SYSTEM_MASK, + + CPLD_MAC_EVT, + CPLD_HWM_EVT, + CPLD_CPLD2_EVT, + CPLD_NTM_EVT, + CPLD_FAN_PSU_EVT, + CPLD_SFP_IOEXP_EVT, + CPLD_CPU_NMI_EVT, + CPLD_PTP_EVT, + + CPLD_EVT_CTRL, + + CPLD_MAC_RESET, + CPLD_SYSTEM_RESET, + CPLD_BMC_NTM_RESET, + CPLD_USB_RESET, + CPLD_I2C_MUX_RESET, + CPLD_I2C_MUX_RESET_2, + CPLD_MISC_RESET, + + CPLD_BRD_PRESENT, + CPLD_PSU_STATUS, + CPLD_SYSTEM_PWR, + CPLD_MAC_SYNCE, + CPLD_MAC_AVS, + CPLD_SYSTEM_STATUS, + CPLD_FAN_PRESENT, + CPLD_WATCHDOG, + CPLD_BOOT_SELECT, + CPLD_MUX_CTRL, + CPLD_MISC_CTRL_1, + CPLD_MISC_CTRL_2, + CPLD_TIMING_CTRL, + + CPLD_MAC_TEMP, + + CPLD_SYSTEM_LED_SYNC, + CPLD_SYSTEM_LED_SYS, + CPLD_SYSTEM_LED_FAN, + CPLD_SYSTEM_LED_PSU_0, + CPLD_SYSTEM_LED_PSU_1, + CPLD_SYSTEM_LED_ID, + + DBG_CPLD_MAC_INTR, + DBG_CPLD_HWM_INTR, + DBG_CPLD_CPLD2_INTR, + DBG_CPLD_NTM_INTR, + DBG_CPLD_FAN_PSU_INTR, + DBG_CPLD_SFP_IOEXP_INTR, + DBG_CPLD_PTP_INTR, + + //CPLD 2 + + //interrupt status + CPLD_SFP_INTR_PRESENT_0_7, + CPLD_SFP_INTR_PRESENT_8_15, + CPLD_SFP_INTR_PRESENT_16_23, + CPLD_SFP_INTR_PRESENT_24_31, + CPLD_SFP_INTR_PRESENT_32_39, + CPLD_SFP_INTR_PRESENT_40_47, + CPLD_QSFP_INTR_PRESENT_48_53, + CPLD_QSFP_INTR_PORT_48_53, + + //interrupt mask + CPLD_SFP_MASK_PRESENT_0_7, + CPLD_SFP_MASK_PRESENT_8_15, + CPLD_SFP_MASK_PRESENT_16_23, + CPLD_SFP_MASK_PRESENT_24_31, + CPLD_SFP_MASK_PRESENT_32_39, + CPLD_SFP_MASK_PRESENT_40_47, + CPLD_QSFP_MASK_PRESENT_48_53, + CPLD_QSFP_MASK_PORT_48_53, + + //interrupt event + CPLD_SFP_EVT_PRESENT_0_7, + CPLD_SFP_EVT_PRESENT_8_15, + CPLD_SFP_EVT_PRESENT_16_23, + CPLD_SFP_EVT_PRESENT_24_31, + CPLD_SFP_EVT_PRESENT_32_39, + CPLD_SFP_EVT_PRESENT_40_47, + CPLD_QSFP_EVT_PRESENT_48_53, + CPLD_QSFP_EVT_PORT_48_53, + + CPLD_SFP_INTR_RX_LOS_0_7, + CPLD_SFP_INTR_RX_LOS_8_15, + CPLD_SFP_INTR_RX_LOS_16_23, + CPLD_SFP_INTR_RX_LOS_24_31, + CPLD_SFP_INTR_RX_LOS_32_39, + CPLD_SFP_INTR_RX_LOS_40_47, + + CPLD_SFP_INTR_TX_FAULT_0_7, + CPLD_SFP_INTR_TX_FAULT_8_15, + CPLD_SFP_INTR_TX_FAULT_16_23, + CPLD_SFP_INTR_TX_FAULT_24_31, + CPLD_SFP_INTR_TX_FAULT_32_39, + CPLD_SFP_INTR_TX_FAULT_40_47, + + CPLD_SFP_MASK_RX_LOS_0_7, + CPLD_SFP_MASK_RX_LOS_8_15, + CPLD_SFP_MASK_RX_LOS_16_23, + CPLD_SFP_MASK_RX_LOS_24_31, + CPLD_SFP_MASK_RX_LOS_32_39, + CPLD_SFP_MASK_RX_LOS_40_47, + + CPLD_SFP_MASK_TX_FAULT_0_7, + CPLD_SFP_MASK_TX_FAULT_8_15, + CPLD_SFP_MASK_TX_FAULT_16_23, + CPLD_SFP_MASK_TX_FAULT_24_31, + CPLD_SFP_MASK_TX_FAULT_32_39, + CPLD_SFP_MASK_TX_FAULT_40_47, + + CPLD_SFP_EVT_RX_LOS_0_7, + CPLD_SFP_EVT_RX_LOS_8_15, + CPLD_SFP_EVT_RX_LOS_16_23, + CPLD_SFP_EVT_RX_LOS_24_31, + CPLD_SFP_EVT_RX_LOS_32_39, + CPLD_SFP_EVT_RX_LOS_40_47, + + CPLD_SFP_EVT_TX_FAULT_0_7, + CPLD_SFP_EVT_TX_FAULT_8_15, + CPLD_SFP_EVT_TX_FAULT_16_23, + CPLD_SFP_EVT_TX_FAULT_24_31, + CPLD_SFP_EVT_TX_FAULT_32_39, + CPLD_SFP_EVT_TX_FAULT_40_47, + + CPLD_SFP_TX_DISABLE_0_7, + CPLD_SFP_TX_DISABLE_8_15, + CPLD_SFP_TX_DISABLE_16_23, + CPLD_SFP_TX_DISABLE_24_31, + CPLD_SFP_TX_DISABLE_32_39, + CPLD_SFP_TX_DISABLE_40_47, + + CPLD_QSFP_RESET_48_53, + CPLD_QSFP_LPMODE_48_53, + + //debug interrupt status + DBG_CPLD_SFP_INTR_PRESENT_0_7, + DBG_CPLD_SFP_INTR_PRESENT_8_15, + DBG_CPLD_SFP_INTR_PRESENT_16_23, + DBG_CPLD_SFP_INTR_PRESENT_24_31, + DBG_CPLD_SFP_INTR_PRESENT_32_39, + DBG_CPLD_SFP_INTR_PRESENT_40_47, + DBG_CPLD_QSFP_INTR_PRESENT_48_53, + DBG_CPLD_QSFP_INTR_PORT_48_53, + + //debug interrupt mask + DBG_CPLD_SFP_INTR_RX_LOS_0_7, + DBG_CPLD_SFP_INTR_RX_LOS_8_15, + DBG_CPLD_SFP_INTR_RX_LOS_16_23, + DBG_CPLD_SFP_INTR_RX_LOS_24_31, + DBG_CPLD_SFP_INTR_RX_LOS_32_39, + DBG_CPLD_SFP_INTR_RX_LOS_40_47, + + DBG_CPLD_SFP_INTR_TX_FAULT_0_7, + DBG_CPLD_SFP_INTR_TX_FAULT_8_15, + DBG_CPLD_SFP_INTR_TX_FAULT_16_23, + DBG_CPLD_SFP_INTR_TX_FAULT_24_31, + DBG_CPLD_SFP_INTR_TX_FAULT_32_39, + DBG_CPLD_SFP_INTR_TX_FAULT_40_47, + + //BSP DEBUG + BSP_DEBUG +}; + +enum bsp_log_types { + LOG_NONE, + LOG_RW, + LOG_READ, + LOG_WRITE +}; + +enum bsp_log_ctrl { + LOG_DISABLE, + LOG_ENABLE +}; + +/* CPLD sysfs attributes hook functions */ +static ssize_t read_cpld_callback(struct device *dev, + struct device_attribute *da, char *buf); +static ssize_t write_cpld_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count); +static u8 _read_cpld_reg(struct device *dev, u8 reg, u8 mask); +static ssize_t read_cpld_reg(struct device *dev, char *buf, u8 reg, u8 mask); +static ssize_t write_cpld_reg(struct device *dev, const char *buf, size_t count, u8 reg, u8 mask); +static ssize_t read_bsp(char *buf, char *str); +static ssize_t write_bsp(const char *buf, char *str, size_t str_len, size_t count); +static ssize_t read_bsp_callback(struct device *dev, + struct device_attribute *da, char *buf); +static ssize_t write_bsp_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count); +static ssize_t read_cpld_version_h(struct device *dev, + struct device_attribute *da, + char *buf); + +static LIST_HEAD(cpld_client_list); /* client list for cpld */ +static struct mutex list_lock; /* mutex for client list */ + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +struct cpld_data { + int index; /* CPLD index */ + struct mutex access_lock; /* mutex for cpld access */ + u8 access_reg; /* register to access */ +}; + +typedef struct sysfs_info_s +{ + u8 reg; + u8 mask; + u8 permission; +} sysfs_info_t; + +static sysfs_info_t sysfs_info[] = { + //CPLD 1 + + [CPLD_BOARD_ID_0] = {CPLD_BOARD_ID_0_REG, MASK_ALL, PERM_R}, + [CPLD_BOARD_ID_1] = {CPLD_BOARD_ID_1_REG, MASK_ALL, PERM_R}, + [CPLD_ID] = {CPLD_ID_REG, MASK_ALL, PERM_R}, + [CPLD_CHIP] = {CPLD_CHIP_REG, MASK_ALL, PERM_R}, + [CPLD_SKU_EXT] = {CPLD_SKU_EXT_REG, MASK_ALL, PERM_R}, + + [CPLD_MAJOR_VER] = {CPLD_VERSION_REG, MASK_CPLD_MAJOR_VER, PERM_R}, + [CPLD_MINOR_VER] = {CPLD_VERSION_REG, MASK_CPLD_MINOR_VER, PERM_R}, + [CPLD_BUILD_VER] = {CPLD_BUILD_REG, MASK_ALL, PERM_R}, + [CPLD_VERSION_H] = {CPLD_VERSION_REG, MASK_ALL, PERM_R}, + + [CPLD_MAC_INTR] = {CPLD_MAC_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_HWM_INTR] = {CPLD_HWM_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_CPLD2_INTR] = {CPLD_CPLD2_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_NTM_INTR] = {CPLD_NTM_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_FAN_PSU_INTR] = {CPLD_FAN_PSU_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_IOEXP_INTR] = {CPLD_SFP_IOEXP_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_CPU_NMI_INTR] = {CPLD_CPU_NMI_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_PTP_INTR] = {CPLD_PTP_INTR_REG, MASK_ALL, PERM_R}, + [CPLD_SYSTEM_INTR] = {CPLD_SYSTEM_INTR_REG, MASK_ALL, PERM_R}, + + [CPLD_MAC_MASK] = {CPLD_MAC_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_HWM_MASK] = {CPLD_HWM_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_CPLD2_MASK] = {CPLD_CPLD2_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_NTM_MASK] = {CPLD_NTM_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_FAN_PSU_MASK] = {CPLD_FAN_PSU_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_IOEXP_MASK] = {CPLD_SFP_IOEXP_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_CPU_NMI_MASK] = {CPLD_CPU_NMI_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_PTP_MASK] = {CPLD_PTP_MASK_REG, MASK_ALL, PERM_RW}, + [CPLD_SYSTEM_MASK] = {CPLD_SYSTEM_MASK_REG, MASK_ALL, PERM_RW}, + + [CPLD_MAC_EVT] = {CPLD_MAC_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_HWM_EVT] = {CPLD_HWM_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_CPLD2_EVT] = {CPLD_CPLD2_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_NTM_EVT] = {CPLD_NTM_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_FAN_PSU_EVT] = {CPLD_FAN_PSU_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_IOEXP_EVT] = {CPLD_SFP_IOEXP_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_CPU_NMI_EVT] = {CPLD_CPU_NMI_EVT_REG, MASK_ALL, PERM_R}, + [CPLD_PTP_EVT] = {CPLD_PTP_EVT_REG, MASK_ALL, PERM_R}, + + [CPLD_EVT_CTRL] = {CPLD_EVT_CTRL_REG, MASK_ALL, PERM_RW}, + + [CPLD_MAC_RESET] = {CPLD_MAC_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_SYSTEM_RESET] = {CPLD_SYSTEM_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_BMC_NTM_RESET] = {CPLD_BMC_NTM_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_USB_RESET] = {CPLD_USB_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_I2C_MUX_RESET] = {CPLD_I2C_MUX_RESET_REG, MASK_ALL, PERM_RW}, + [CPLD_I2C_MUX_RESET_2] = {CPLD_I2C_MUX_RESET_2_REG, MASK_ALL, PERM_RW}, + [CPLD_MISC_RESET] = {CPLD_MISC_RESET_REG, MASK_ALL, PERM_RW}, + + [CPLD_BRD_PRESENT] = {CPLD_BRD_PRESENT_REG, MASK_ALL, PERM_R}, + [CPLD_PSU_STATUS] = {CPLD_PSU_STATUS_REG, MASK_ALL, PERM_R}, + [CPLD_SYSTEM_PWR] = {CPLD_SYSTEM_PWR_REG, MASK_ALL, PERM_R}, + [CPLD_MAC_SYNCE] = {CPLD_MAC_SYNCE_REG, MASK_ALL, PERM_R}, + [CPLD_MAC_AVS] = {CPLD_MAC_AVS_REG, MASK_ALL, PERM_R}, + [CPLD_SYSTEM_STATUS] = {CPLD_SYSTEM_STATUS_REG, MASK_ALL, PERM_R}, + [CPLD_FAN_PRESENT] = {CPLD_FAN_PRESENT_REG, MASK_ALL, PERM_R}, + [CPLD_WATCHDOG] = {CPLD_WATCHDOG_REG, MASK_ALL, PERM_RW}, + [CPLD_BOOT_SELECT] = {CPLD_BOOT_SELECT_REG, MASK_ALL, PERM_RW}, + [CPLD_MUX_CTRL] = {CPLD_MUX_CTRL_REG, MASK_ALL, PERM_RW}, + [CPLD_MISC_CTRL_1] = {CPLD_MISC_CTRL_1_REG, MASK_ALL, PERM_RW}, + [CPLD_MISC_CTRL_2] = {CPLD_MISC_CTRL_2_REG, MASK_ALL, PERM_RW}, + [CPLD_TIMING_CTRL] = {CPLD_TIMING_CTRL_REG, MASK_ALL, PERM_RW}, + + [CPLD_MAC_TEMP] = {CPLD_MAC_TEMP_REG, MASK_ALL, PERM_R}, + + [CPLD_SYSTEM_LED_SYNC] = {CPLD_SYSTEM_LED_SYNC_REG, CPLD_SYSTEM_LED_SYNC_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_SYS] = {CPLD_SYSTEM_LED_SYS_REG, CPLD_SYSTEM_LED_SYS_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_FAN] = {CPLD_SYSTEM_LED_FAN_REG, CPLD_SYSTEM_LED_FAN_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_PSU_0] = {CPLD_SYSTEM_LED_PSU_REG, CPLD_SYSTEM_LED_PSU_0_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_PSU_1] = {CPLD_SYSTEM_LED_PSU_REG, CPLD_SYSTEM_LED_PSU_1_MASK, PERM_RW}, + [CPLD_SYSTEM_LED_ID] = {CPLD_SYSTEM_LED_ID_REG, CPLD_SYSTEM_LED_ID_MASK, PERM_RW}, + + [DBG_CPLD_MAC_INTR] = {DBG_CPLD_MAC_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_HWM_INTR] = {DBG_CPLD_HWM_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_CPLD2_INTR] = {DBG_CPLD_CPLD2_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_NTM_INTR] = {DBG_CPLD_NTM_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_FAN_PSU_INTR] = {DBG_CPLD_FAN_PSU_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_SFP_IOEXP_INTR] = {DBG_CPLD_SFP_IOEXP_INTR_REG, MASK_ALL, PERM_RW}, + [DBG_CPLD_PTP_INTR] = {DBG_CPLD_PTP_INTR_REG, MASK_ALL, PERM_RW}, + + //CPLD 2 + + //interrupt status + [CPLD_SFP_INTR_PRESENT_0_7] = {CPLD_SFP_INTR_PRESENT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_8_15] = {CPLD_SFP_INTR_PRESENT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_16_23] = {CPLD_SFP_INTR_PRESENT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_24_31] = {CPLD_SFP_INTR_PRESENT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_32_39] = {CPLD_SFP_INTR_PRESENT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_PRESENT_40_47] = {CPLD_SFP_INTR_PRESENT_40_47_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_INTR_PRESENT_48_53] = {CPLD_QSFP_INTR_PRESENT_48_53_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_INTR_PORT_48_53] = {CPLD_QSFP_INTR_PORT_48_53_REG, MASK_ALL, PERM_R}, + + //interrupt mask + [CPLD_SFP_MASK_PRESENT_0_7] = {CPLD_SFP_MASK_PRESENT_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_8_15] = {CPLD_SFP_MASK_PRESENT_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_16_23] = {CPLD_SFP_MASK_PRESENT_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_24_31] = {CPLD_SFP_MASK_PRESENT_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_32_39] = {CPLD_SFP_MASK_PRESENT_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_PRESENT_40_47] = {CPLD_SFP_MASK_PRESENT_40_47_REG, MASK_ALL, PERM_RW}, + [CPLD_QSFP_MASK_PRESENT_48_53] = {CPLD_QSFP_MASK_PRESENT_48_53_REG, MASK_ALL, PERM_RW}, + [CPLD_QSFP_MASK_PORT_48_53] = {CPLD_QSFP_MASK_PORT_48_53_REG, MASK_ALL, PERM_RW}, + + //interrupt event + [CPLD_SFP_EVT_PRESENT_0_7] = {CPLD_SFP_EVT_PRESENT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_8_15] = {CPLD_SFP_EVT_PRESENT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_16_23] = {CPLD_SFP_EVT_PRESENT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_24_31] = {CPLD_SFP_EVT_PRESENT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_32_39] = {CPLD_SFP_EVT_PRESENT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_PRESENT_40_47] = {CPLD_SFP_EVT_PRESENT_40_47_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_EVT_PRESENT_48_53] = {CPLD_QSFP_EVT_PRESENT_48_53_REG, MASK_ALL, PERM_R}, + [CPLD_QSFP_EVT_PORT_48_53] = {CPLD_QSFP_EVT_PORT_48_53_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_INTR_RX_LOS_0_7] = {CPLD_SFP_INTR_RX_LOS_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_8_15] = {CPLD_SFP_INTR_RX_LOS_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_16_23] = {CPLD_SFP_INTR_RX_LOS_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_24_31] = {CPLD_SFP_INTR_RX_LOS_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_32_39] = {CPLD_SFP_INTR_RX_LOS_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_RX_LOS_40_47] = {CPLD_SFP_INTR_RX_LOS_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_INTR_TX_FAULT_0_7] = {CPLD_SFP_INTR_TX_FAULT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_8_15] = {CPLD_SFP_INTR_TX_FAULT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_16_23] = {CPLD_SFP_INTR_TX_FAULT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_24_31] = {CPLD_SFP_INTR_TX_FAULT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_32_39] = {CPLD_SFP_INTR_TX_FAULT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_INTR_TX_FAULT_40_47] = {CPLD_SFP_INTR_TX_FAULT_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_MASK_RX_LOS_0_7] = {CPLD_SFP_MASK_RX_LOS_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_8_15] = {CPLD_SFP_MASK_RX_LOS_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_16_23] = {CPLD_SFP_MASK_RX_LOS_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_24_31] = {CPLD_SFP_MASK_RX_LOS_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_32_39] = {CPLD_SFP_MASK_RX_LOS_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_RX_LOS_40_47] = {CPLD_SFP_MASK_RX_LOS_40_47_REG, MASK_ALL, PERM_RW}, + + [CPLD_SFP_MASK_TX_FAULT_0_7] = {CPLD_SFP_MASK_TX_FAULT_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_8_15] = {CPLD_SFP_MASK_TX_FAULT_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_16_23] = {CPLD_SFP_MASK_TX_FAULT_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_24_31] = {CPLD_SFP_MASK_TX_FAULT_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_32_39] = {CPLD_SFP_MASK_TX_FAULT_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_MASK_TX_FAULT_40_47] = {CPLD_SFP_MASK_TX_FAULT_40_47_REG, MASK_ALL, PERM_RW}, + + [CPLD_SFP_EVT_RX_LOS_0_7] = {CPLD_SFP_EVT_RX_LOS_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_8_15] = {CPLD_SFP_EVT_RX_LOS_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_16_23] = {CPLD_SFP_EVT_RX_LOS_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_24_31] = {CPLD_SFP_EVT_RX_LOS_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_32_39] = {CPLD_SFP_EVT_RX_LOS_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_RX_LOS_40_47] = {CPLD_SFP_EVT_RX_LOS_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_EVT_TX_FAULT_0_7] = {CPLD_SFP_EVT_TX_FAULT_0_7_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_8_15] = {CPLD_SFP_EVT_TX_FAULT_8_15_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_16_23] = {CPLD_SFP_EVT_TX_FAULT_16_23_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_24_31] = {CPLD_SFP_EVT_TX_FAULT_24_31_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_32_39] = {CPLD_SFP_EVT_TX_FAULT_32_39_REG, MASK_ALL, PERM_R}, + [CPLD_SFP_EVT_TX_FAULT_40_47] = {CPLD_SFP_EVT_TX_FAULT_40_47_REG, MASK_ALL, PERM_R}, + + [CPLD_SFP_TX_DISABLE_0_7] = {CPLD_SFP_TX_DISABLE_0_7_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_8_15] = {CPLD_SFP_TX_DISABLE_8_15_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_16_23] = {CPLD_SFP_TX_DISABLE_16_23_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_24_31] = {CPLD_SFP_TX_DISABLE_24_31_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_32_39] = {CPLD_SFP_TX_DISABLE_32_39_REG, MASK_ALL, PERM_RW}, + [CPLD_SFP_TX_DISABLE_40_47] = {CPLD_SFP_TX_DISABLE_40_47_REG, MASK_ALL, PERM_RW}, + + [CPLD_QSFP_RESET_48_53] = {CPLD_QSFP_RESET_48_53_REG, MASK_ALL, PERM_RW}, + [CPLD_QSFP_LPMODE_48_53] = {CPLD_QSFP_LPMODE_48_53_REG, MASK_ALL, PERM_RW}, + + //debug interrupt status + [DBG_CPLD_SFP_INTR_PRESENT_0_7] = {DBG_CPLD_SFP_INTR_PRESENT_0_7_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_8_15] = {DBG_CPLD_SFP_INTR_PRESENT_8_15_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_16_23] = {DBG_CPLD_SFP_INTR_PRESENT_16_23_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_24_31] = {DBG_CPLD_SFP_INTR_PRESENT_24_31_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_32_39] = {DBG_CPLD_SFP_INTR_PRESENT_32_39_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_PRESENT_40_47] = {DBG_CPLD_SFP_INTR_PRESENT_40_47_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_QSFP_INTR_PRESENT_48_53] = {DBG_CPLD_QSFP_INTR_PRESENT_48_53_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_QSFP_INTR_PORT_48_53] = {DBG_CPLD_QSFP_INTR_PORT_48_53_REG, MASK_ALL, PERM_R}, + + //debug interrupt mask + [DBG_CPLD_SFP_INTR_RX_LOS_0_7] = {DBG_CPLD_SFP_INTR_RX_LOS_0_7_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_8_15] = {DBG_CPLD_SFP_INTR_RX_LOS_8_15_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_16_23] = {DBG_CPLD_SFP_INTR_RX_LOS_16_23_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_24_31] = {DBG_CPLD_SFP_INTR_RX_LOS_24_31_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_32_39] = {DBG_CPLD_SFP_INTR_RX_LOS_32_39_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_RX_LOS_40_47] = {DBG_CPLD_SFP_INTR_RX_LOS_40_47_REG, MASK_ALL, PERM_R}, + + [DBG_CPLD_SFP_INTR_TX_FAULT_0_7] = {DBG_CPLD_SFP_INTR_TX_FAULT_0_7_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_8_15] = {DBG_CPLD_SFP_INTR_TX_FAULT_8_15_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_16_23] = {DBG_CPLD_SFP_INTR_TX_FAULT_16_23_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_24_31] = {DBG_CPLD_SFP_INTR_TX_FAULT_24_31_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_32_39] = {DBG_CPLD_SFP_INTR_TX_FAULT_32_39_REG, MASK_ALL, PERM_R}, + [DBG_CPLD_SFP_INTR_TX_FAULT_40_47] = {DBG_CPLD_SFP_INTR_TX_FAULT_40_47_REG, MASK_ALL, PERM_R}, +}; + +/* CPLD device id and data */ +static const struct i2c_device_id cpld_id[] = { + { "s8901_54xc_cpld1", cpld1 }, + { "s8901_54xc_cpld2", cpld2 }, + {} +}; + +char bsp_debug[2]="0"; +u8 enable_log_read=LOG_DISABLE; +u8 enable_log_write=LOG_DISABLE; + +/* Addresses scanned for cpld */ +static const unsigned short cpld_i2c_addr[] = { 0x30, 0x31, I2C_CLIENT_END }; + +/* define all support register access of cpld in attribute */ + +// CPLD common +static _SENSOR_DEVICE_ATTR_RO(cpld_board_id_0, cpld_callback, CPLD_BOARD_ID_0); +static _SENSOR_DEVICE_ATTR_RO(cpld_board_id_1, cpld_callback, CPLD_BOARD_ID_1); +static _SENSOR_DEVICE_ATTR_RO(cpld_id, cpld_callback, CPLD_ID); +static _SENSOR_DEVICE_ATTR_RO(cpld_chip, cpld_callback, CPLD_CHIP); +static _SENSOR_DEVICE_ATTR_RO(cpld_sku_ext, cpld_callback, CPLD_SKU_EXT); + +static _SENSOR_DEVICE_ATTR_RO(cpld_major_ver, cpld_callback, CPLD_MAJOR_VER); +static _SENSOR_DEVICE_ATTR_RO(cpld_minor_ver, cpld_callback, CPLD_MINOR_VER); +static _SENSOR_DEVICE_ATTR_RO(cpld_build_ver, cpld_callback, CPLD_BUILD_VER); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_h, cpld_version_h, CPLD_VERSION_H); + +static _SENSOR_DEVICE_ATTR_RW(cpld_evt_ctrl, cpld_callback, CPLD_EVT_CTRL); + +//CPLD 1 +static _SENSOR_DEVICE_ATTR_RO(cpld_mac_intr, cpld_callback, CPLD_MAC_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_hwm_intr, cpld_callback, CPLD_HWM_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpld2_intr, cpld_callback, CPLD_CPLD2_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_ntm_intr, cpld_callback, CPLD_NTM_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_fan_psu_intr, cpld_callback, CPLD_FAN_PSU_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_ioexp_intr, cpld_callback, CPLD_SFP_IOEXP_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpu_nmi_intr, cpld_callback, CPLD_CPU_NMI_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_ptp_intr, cpld_callback, CPLD_PTP_INTR); +static _SENSOR_DEVICE_ATTR_RO(cpld_system_intr, cpld_callback, CPLD_SYSTEM_INTR); + +static _SENSOR_DEVICE_ATTR_RW(cpld_mac_mask, cpld_callback, CPLD_MAC_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_hwm_mask, cpld_callback, CPLD_HWM_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_cpld2_mask, cpld_callback, CPLD_CPLD2_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_ntm_mask, cpld_callback, CPLD_NTM_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_fan_psu_mask, cpld_callback, CPLD_FAN_PSU_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_ioexp_mask, cpld_callback, CPLD_SFP_IOEXP_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_cpu_nmi_mask, cpld_callback, CPLD_CPU_NMI_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_ptp_mask, cpld_callback, CPLD_PTP_MASK); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_mask, cpld_callback, CPLD_SYSTEM_MASK); + +static _SENSOR_DEVICE_ATTR_RO(cpld_mac_evt, cpld_callback, CPLD_MAC_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_hwm_evt, cpld_callback, CPLD_HWM_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpld2_evt, cpld_callback, CPLD_CPLD2_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_ntm_evt, cpld_callback, CPLD_NTM_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_fan_psu_evt, cpld_callback, CPLD_FAN_PSU_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_ioexp_evt, cpld_callback, CPLD_SFP_IOEXP_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_cpu_nmi_evt, cpld_callback, CPLD_CPU_NMI_EVT); +static _SENSOR_DEVICE_ATTR_RO(cpld_ptp_evt, cpld_callback, CPLD_PTP_EVT); + +static _SENSOR_DEVICE_ATTR_RW(cpld_mac_reset, cpld_callback, CPLD_MAC_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_reset, cpld_callback, CPLD_SYSTEM_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_bmc_ntm_reset, cpld_callback, CPLD_BMC_NTM_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_usb_reset, cpld_callback, CPLD_USB_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_i2c_mux_reset, cpld_callback, CPLD_I2C_MUX_RESET); +static _SENSOR_DEVICE_ATTR_RW(cpld_i2c_mux_reset_2, cpld_callback, CPLD_I2C_MUX_RESET_2); +static _SENSOR_DEVICE_ATTR_RW(cpld_misc_reset, cpld_callback, CPLD_MISC_RESET); + +static _SENSOR_DEVICE_ATTR_RO(cpld_psu_status, cpld_callback, CPLD_PSU_STATUS); +static _SENSOR_DEVICE_ATTR_RO(cpld_mac_synce, cpld_callback, CPLD_MAC_SYNCE); +static _SENSOR_DEVICE_ATTR_RO(cpld_fan_present, cpld_callback, CPLD_FAN_PRESENT); +static _SENSOR_DEVICE_ATTR_RW(cpld_mux_ctrl, cpld_callback, CPLD_MUX_CTRL); + +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_sync, cpld_callback, CPLD_SYSTEM_LED_SYNC); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_sys, cpld_callback, CPLD_SYSTEM_LED_SYS); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_fan, cpld_callback, CPLD_SYSTEM_LED_FAN); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_psu_0, cpld_callback, CPLD_SYSTEM_LED_PSU_0); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_psu_1, cpld_callback, CPLD_SYSTEM_LED_PSU_1); +static _SENSOR_DEVICE_ATTR_RW(cpld_system_led_id, cpld_callback, CPLD_SYSTEM_LED_ID); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_mac_intr, cpld_callback, DBG_CPLD_MAC_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_hwm_intr, cpld_callback, DBG_CPLD_HWM_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_cpld2_intr, cpld_callback, DBG_CPLD_CPLD2_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_ntm_intr, cpld_callback, DBG_CPLD_NTM_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_fan_psu_intr, cpld_callback, DBG_CPLD_FAN_PSU_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_ioexp_intr, cpld_callback, DBG_CPLD_SFP_IOEXP_INTR); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_ptp_intr, cpld_callback, DBG_CPLD_PTP_INTR); + +//CPLD 2 +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_0_7, cpld_callback, CPLD_SFP_INTR_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_8_15, cpld_callback, CPLD_SFP_INTR_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_16_23, cpld_callback, CPLD_SFP_INTR_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_24_31, cpld_callback, CPLD_SFP_INTR_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_32_39, cpld_callback, CPLD_SFP_INTR_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_present_40_47, cpld_callback, CPLD_SFP_INTR_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_present_48_53, cpld_callback, CPLD_QSFP_INTR_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_port_48_53, cpld_callback, CPLD_QSFP_INTR_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_0_7, cpld_callback, CPLD_SFP_MASK_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_8_15, cpld_callback, CPLD_SFP_MASK_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_16_23, cpld_callback, CPLD_SFP_MASK_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_24_31, cpld_callback, CPLD_SFP_MASK_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_32_39, cpld_callback, CPLD_SFP_MASK_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_present_40_47, cpld_callback, CPLD_SFP_MASK_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_present_48_53, cpld_callback, CPLD_QSFP_MASK_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_port_48_53, cpld_callback, CPLD_QSFP_MASK_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_0_7, cpld_callback, CPLD_SFP_EVT_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_8_15, cpld_callback, CPLD_SFP_EVT_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_16_23, cpld_callback, CPLD_SFP_EVT_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_24_31, cpld_callback, CPLD_SFP_EVT_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_32_39, cpld_callback, CPLD_SFP_EVT_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_present_40_47, cpld_callback, CPLD_SFP_EVT_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_present_48_53, cpld_callback, CPLD_QSFP_EVT_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_port_48_53, cpld_callback, CPLD_QSFP_EVT_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_0_7, cpld_callback, CPLD_SFP_INTR_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_8_15, cpld_callback, CPLD_SFP_INTR_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_16_23, cpld_callback, CPLD_SFP_INTR_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_24_31, cpld_callback, CPLD_SFP_INTR_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_32_39, cpld_callback, CPLD_SFP_INTR_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_rx_los_40_47, cpld_callback, CPLD_SFP_INTR_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_0_7, cpld_callback, CPLD_SFP_INTR_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_8_15, cpld_callback, CPLD_SFP_INTR_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_16_23, cpld_callback, CPLD_SFP_INTR_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_24_31, cpld_callback, CPLD_SFP_INTR_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_32_39, cpld_callback, CPLD_SFP_INTR_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_intr_tx_fault_40_47, cpld_callback, CPLD_SFP_INTR_TX_FAULT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_0_7, cpld_callback, CPLD_SFP_MASK_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_8_15, cpld_callback, CPLD_SFP_MASK_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_16_23, cpld_callback, CPLD_SFP_MASK_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_24_31, cpld_callback, CPLD_SFP_MASK_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_32_39, cpld_callback, CPLD_SFP_MASK_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rx_los_40_47, cpld_callback, CPLD_SFP_MASK_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_0_7, cpld_callback, CPLD_SFP_MASK_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_8_15, cpld_callback, CPLD_SFP_MASK_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_16_23, cpld_callback, CPLD_SFP_MASK_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_24_31, cpld_callback, CPLD_SFP_MASK_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_32_39, cpld_callback, CPLD_SFP_MASK_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_tx_fault_40_47, cpld_callback, CPLD_SFP_MASK_TX_FAULT_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_0_7, cpld_callback, CPLD_SFP_EVT_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_8_15, cpld_callback, CPLD_SFP_EVT_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_16_23, cpld_callback, CPLD_SFP_EVT_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_24_31, cpld_callback, CPLD_SFP_EVT_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_32_39, cpld_callback, CPLD_SFP_EVT_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rx_los_40_47, cpld_callback, CPLD_SFP_EVT_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_0_7, cpld_callback, CPLD_SFP_EVT_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_8_15, cpld_callback, CPLD_SFP_EVT_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_16_23, cpld_callback, CPLD_SFP_EVT_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_24_31, cpld_callback, CPLD_SFP_EVT_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_32_39, cpld_callback, CPLD_SFP_EVT_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_tx_fault_40_47, cpld_callback, CPLD_SFP_EVT_TX_FAULT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_0_7, cpld_callback, CPLD_SFP_TX_DISABLE_0_7); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_8_15, cpld_callback, CPLD_SFP_TX_DISABLE_8_15); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_16_23, cpld_callback, CPLD_SFP_TX_DISABLE_16_23); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_24_31, cpld_callback, CPLD_SFP_TX_DISABLE_24_31); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_32_39, cpld_callback, CPLD_SFP_TX_DISABLE_32_39); +static _SENSOR_DEVICE_ATTR_RW(cpld_sfp_tx_disable_40_47, cpld_callback, CPLD_SFP_TX_DISABLE_40_47); + +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_reset_48_53, cpld_callback, CPLD_QSFP_RESET_48_53); +static _SENSOR_DEVICE_ATTR_RW(cpld_qsfp_lpmode_48_53, cpld_callback, CPLD_QSFP_LPMODE_48_53); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_0_7, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_0_7); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_8_15, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_8_15); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_16_23, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_16_23); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_24_31, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_24_31); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_32_39, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_32_39); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_present_40_47, cpld_callback, DBG_CPLD_SFP_INTR_PRESENT_40_47); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_qsfp_intr_present_48_53, cpld_callback, DBG_CPLD_QSFP_INTR_PRESENT_48_53); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_qsfp_intr_port_48_53, cpld_callback, DBG_CPLD_QSFP_INTR_PORT_48_53); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_0_7, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_0_7); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_8_15, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_8_15); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_16_23, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_16_23); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_24_31, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_24_31); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_32_39, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_32_39); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_rx_los_40_47, cpld_callback, DBG_CPLD_SFP_INTR_RX_LOS_40_47); + +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_0_7, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_0_7); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_8_15, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_8_15); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_16_23, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_16_23); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_24_31, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_24_31); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_32_39, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_32_39); +static _SENSOR_DEVICE_ATTR_RW(dbg_cpld_sfp_intr_tx_fault_40_47, cpld_callback, DBG_CPLD_SFP_INTR_TX_FAULT_40_47); + +//BSP DEBUG +static _SENSOR_DEVICE_ATTR_RW(bsp_debug, bsp_callback, BSP_DEBUG); + +/* define support attributes of cpldx */ + +/* cpld 1 */ +static struct attribute *cpld1_attributes[] = { + _DEVICE_ATTR(cpld_board_id_0), + _DEVICE_ATTR(cpld_board_id_1), + + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(cpld_chip), + _DEVICE_ATTR(cpld_sku_ext), + + _DEVICE_ATTR(cpld_major_ver), + _DEVICE_ATTR(cpld_minor_ver), + _DEVICE_ATTR(cpld_build_ver), + _DEVICE_ATTR(cpld_version_h), + + _DEVICE_ATTR(cpld_mac_intr), + _DEVICE_ATTR(cpld_hwm_intr), + _DEVICE_ATTR(cpld_cpld2_intr), + _DEVICE_ATTR(cpld_ntm_intr), + _DEVICE_ATTR(cpld_fan_psu_intr), + _DEVICE_ATTR(cpld_sfp_ioexp_intr), + _DEVICE_ATTR(cpld_cpu_nmi_intr), + _DEVICE_ATTR(cpld_ptp_intr), + _DEVICE_ATTR(cpld_system_intr), + + _DEVICE_ATTR(cpld_mac_mask), + _DEVICE_ATTR(cpld_hwm_mask), + _DEVICE_ATTR(cpld_cpld2_mask), + _DEVICE_ATTR(cpld_ntm_mask), + _DEVICE_ATTR(cpld_fan_psu_mask), + _DEVICE_ATTR(cpld_sfp_ioexp_mask), + _DEVICE_ATTR(cpld_cpu_nmi_mask), + _DEVICE_ATTR(cpld_ptp_mask), + _DEVICE_ATTR(cpld_system_mask), + + _DEVICE_ATTR(cpld_mac_evt), + _DEVICE_ATTR(cpld_hwm_evt), + _DEVICE_ATTR(cpld_cpld2_evt), + _DEVICE_ATTR(cpld_ntm_evt), + _DEVICE_ATTR(cpld_fan_psu_evt), + _DEVICE_ATTR(cpld_sfp_ioexp_evt), + _DEVICE_ATTR(cpld_cpu_nmi_evt), + _DEVICE_ATTR(cpld_ptp_evt), + + _DEVICE_ATTR(cpld_evt_ctrl), + + _DEVICE_ATTR(cpld_mac_reset), + _DEVICE_ATTR(cpld_system_reset), + _DEVICE_ATTR(cpld_bmc_ntm_reset), + _DEVICE_ATTR(cpld_usb_reset), + _DEVICE_ATTR(cpld_i2c_mux_reset), + _DEVICE_ATTR(cpld_i2c_mux_reset_2), + _DEVICE_ATTR(cpld_misc_reset), + + _DEVICE_ATTR(cpld_psu_status), + _DEVICE_ATTR(cpld_mac_synce), + _DEVICE_ATTR(cpld_fan_present), + _DEVICE_ATTR(cpld_mux_ctrl), + + _DEVICE_ATTR(cpld_system_led_sync), + _DEVICE_ATTR(cpld_system_led_sys), + _DEVICE_ATTR(cpld_system_led_fan), + _DEVICE_ATTR(cpld_system_led_psu_0), + _DEVICE_ATTR(cpld_system_led_psu_1), + _DEVICE_ATTR(cpld_system_led_id), + + _DEVICE_ATTR(dbg_cpld_mac_intr), + _DEVICE_ATTR(dbg_cpld_hwm_intr), + _DEVICE_ATTR(dbg_cpld_cpld2_intr), + _DEVICE_ATTR(dbg_cpld_ntm_intr), + _DEVICE_ATTR(dbg_cpld_fan_psu_intr), + _DEVICE_ATTR(dbg_cpld_sfp_ioexp_intr), + _DEVICE_ATTR(dbg_cpld_ptp_intr), + + _DEVICE_ATTR(bsp_debug), + + NULL +}; + +/* cpld 2 */ +static struct attribute *cpld2_attributes[] = { + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(cpld_chip), + + _DEVICE_ATTR(cpld_major_ver), + _DEVICE_ATTR(cpld_minor_ver), + _DEVICE_ATTR(cpld_build_ver), + _DEVICE_ATTR(cpld_version_h), + + _DEVICE_ATTR(cpld_sfp_intr_present_0_7), + _DEVICE_ATTR(cpld_sfp_intr_present_8_15), + _DEVICE_ATTR(cpld_sfp_intr_present_16_23), + _DEVICE_ATTR(cpld_sfp_intr_present_24_31), + _DEVICE_ATTR(cpld_sfp_intr_present_32_39), + _DEVICE_ATTR(cpld_sfp_intr_present_40_47), + + _DEVICE_ATTR(cpld_qsfp_intr_present_48_53), + _DEVICE_ATTR(cpld_qsfp_intr_port_48_53), + + _DEVICE_ATTR(cpld_sfp_mask_present_0_7), + _DEVICE_ATTR(cpld_sfp_mask_present_8_15), + _DEVICE_ATTR(cpld_sfp_mask_present_16_23), + _DEVICE_ATTR(cpld_sfp_mask_present_24_31), + _DEVICE_ATTR(cpld_sfp_mask_present_32_39), + _DEVICE_ATTR(cpld_sfp_mask_present_40_47), + + _DEVICE_ATTR(cpld_qsfp_mask_present_48_53), + _DEVICE_ATTR(cpld_qsfp_mask_port_48_53), + + _DEVICE_ATTR(cpld_sfp_evt_present_0_7), + _DEVICE_ATTR(cpld_sfp_evt_present_8_15), + _DEVICE_ATTR(cpld_sfp_evt_present_16_23), + _DEVICE_ATTR(cpld_sfp_evt_present_24_31), + _DEVICE_ATTR(cpld_sfp_evt_present_32_39), + _DEVICE_ATTR(cpld_sfp_evt_present_40_47), + + _DEVICE_ATTR(cpld_qsfp_evt_present_48_53), + _DEVICE_ATTR(cpld_qsfp_evt_port_48_53), + + _DEVICE_ATTR(cpld_evt_ctrl), + + _DEVICE_ATTR(cpld_sfp_intr_rx_los_0_7), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_8_15), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_16_23), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_24_31), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_32_39), + _DEVICE_ATTR(cpld_sfp_intr_rx_los_40_47), + + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_0_7), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_8_15), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_16_23), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_24_31), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_32_39), + _DEVICE_ATTR(cpld_sfp_intr_tx_fault_40_47), + + _DEVICE_ATTR(cpld_sfp_mask_rx_los_0_7), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_8_15), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_16_23), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_24_31), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_32_39), + _DEVICE_ATTR(cpld_sfp_mask_rx_los_40_47), + + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_0_7), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_8_15), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_16_23), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_24_31), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_32_39), + _DEVICE_ATTR(cpld_sfp_mask_tx_fault_40_47), + + _DEVICE_ATTR(cpld_sfp_evt_rx_los_0_7), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_8_15), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_16_23), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_24_31), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_32_39), + _DEVICE_ATTR(cpld_sfp_evt_rx_los_40_47), + + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_0_7), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_8_15), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_16_23), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_24_31), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_32_39), + _DEVICE_ATTR(cpld_sfp_evt_tx_fault_40_47), + + _DEVICE_ATTR(cpld_sfp_tx_disable_0_7), + _DEVICE_ATTR(cpld_sfp_tx_disable_8_15), + _DEVICE_ATTR(cpld_sfp_tx_disable_16_23), + _DEVICE_ATTR(cpld_sfp_tx_disable_24_31), + _DEVICE_ATTR(cpld_sfp_tx_disable_32_39), + _DEVICE_ATTR(cpld_sfp_tx_disable_40_47), + + _DEVICE_ATTR(cpld_qsfp_reset_48_53), + _DEVICE_ATTR(cpld_qsfp_lpmode_48_53), + + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_0_7), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_8_15), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_16_23), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_24_31), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_32_39), + _DEVICE_ATTR(dbg_cpld_sfp_intr_present_40_47), + + _DEVICE_ATTR(dbg_cpld_qsfp_intr_present_48_53), + _DEVICE_ATTR(dbg_cpld_qsfp_intr_port_48_53), + + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_0_7), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_8_15), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_16_23), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_24_31), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_32_39), + _DEVICE_ATTR(dbg_cpld_sfp_intr_rx_los_40_47), + + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_0_7), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_8_15), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_16_23), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_24_31), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_32_39), + _DEVICE_ATTR(dbg_cpld_sfp_intr_tx_fault_40_47), + + NULL +}; + +/* cpld 1 attributes group */ +static const struct attribute_group cpld1_group = { + .attrs = cpld1_attributes, +}; + +/* cpld 2 attributes group */ +static const struct attribute_group cpld2_group = { + .attrs = cpld2_attributes, +}; + +/* reg shift */ +static u8 _shift(u8 mask) +{ + int i=0, mask_one=1; + + for(i=0; i<8; ++i) { + if ((mask & mask_one) == 1) + return i; + else + mask >>= 1; + } + + return -1; +} + +/* reg mask and shift */ +static u8 _mask_shift(u8 val, u8 mask) +{ + int shift=0; + + shift = _shift(mask); + + return (val & mask) >> shift; +} + +static int _bsp_log(u8 log_type, char *fmt, ...) +{ + if ((log_type==LOG_READ && enable_log_read) || + (log_type==LOG_WRITE && enable_log_write)) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk(fmt, args); + va_end(args); + + return r; + } else { + return 0; + } +} + +static int _config_bsp_log(u8 log_type) +{ + switch(log_type) { + case LOG_NONE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_RW: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_ENABLE; + break; + case LOG_READ: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_WRITE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_ENABLE; + break; + default: + return -EINVAL; + } + return 0; +} + +/* get bsp value */ +static ssize_t read_bsp(char *buf, char *str) +{ + ssize_t len=0; + + len=sprintf(buf, "%s", str); + BSP_LOG_R("reg_val=%s", str); + + return len; +} + +/* set bsp value */ +static ssize_t write_bsp(const char *buf, char *str, size_t str_len, size_t count) +{ + snprintf(str, str_len, "%s", buf); + BSP_LOG_W("reg_val=%s", str); + + return count; +} + +/* get bsp parameter value */ +static ssize_t read_bsp_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + + switch (attr->index) { + case BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(bsp_debug); + break; + default: + return -EINVAL; + } + return read_bsp(buf, str); +} + +/* set bsp parameter value */ +static ssize_t write_bsp_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + ssize_t ret = 0; + u8 bsp_debug_u8 = 0; + + switch (attr->index) { + case BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(str); + ret = write_bsp(buf, str, str_len, count); + + if (kstrtou8(buf, 0, &bsp_debug_u8) < 0) { + return -EINVAL; + } else if (_config_bsp_log(bsp_debug_u8) < 0) { + return -EINVAL; + } + return ret; + default: + return -EINVAL; + } + return 0; +} + +/* get cpld register value */ +static ssize_t read_cpld_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 reg = 0; + u8 mask = MASK_ALL; + + if (IS_PERM_R(sysfs_info[attr->index].permission)) { + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + } else { + dev_err(dev, "%s() error, attr->index=%d\n", __func__, attr->index); + return -EINVAL; + } + + return read_cpld_reg(dev, buf, reg, mask); +} + +/* set cpld register value */ +static ssize_t write_cpld_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 reg = 0; + u8 mask = MASK_ALL; + + if (IS_PERM_W(sysfs_info[attr->index].permission)) { + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + } else { + dev_err(dev, "%s() error, attr->index=%d\n", __func__, attr->index); + return -EINVAL; + } + + return write_cpld_reg(dev, buf, count, reg, mask); +} + +/* get cpld register value */ +static u8 _read_cpld_reg(struct device *dev, + u8 reg, + u8 mask) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + int reg_val; + + I2C_READ_BYTE_DATA(reg_val, &data->access_lock, client, reg); + + if (unlikely(reg_val < 0)) { + return reg_val; + } else { + reg_val=_mask_shift(reg_val, mask); + return reg_val; + } +} + +/* get cpld register value */ +static ssize_t read_cpld_reg(struct device *dev, + char *buf, + u8 reg, + u8 mask) +{ + int reg_val; + + reg_val = _read_cpld_reg(dev, reg, mask); + if (unlikely(reg_val < 0)) { + dev_err(dev, "read_cpld_reg() error, reg_val=%d\n", reg_val); + return reg_val; + } else { + return sprintf(buf, "0x%02x\n", reg_val); + } +} + +/* set cpld register value */ +static ssize_t write_cpld_reg(struct device *dev, + const char *buf, + size_t count, + u8 reg, + u8 mask) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 reg_val, reg_val_now, shift; + int ret = 0; + + if (kstrtou8(buf, 0, ®_val) < 0) + return -EINVAL; + + //apply continuous bits operation if mask is specified, discontinuous bits are not supported + if (mask != MASK_ALL) { + reg_val_now = _read_cpld_reg(dev, reg, MASK_ALL); + if (unlikely(reg_val_now < 0)) { + dev_err(dev, "write_cpld_reg() error, reg_val_now=%d\n", reg_val_now); + return reg_val_now; + } else { + //clear bits in reg_val_now by the mask + reg_val_now &= ~mask; + //get bit shift by the mask + shift = _shift(mask); + //calculate new reg_val + reg_val = reg_val_now | (reg_val << shift); + } + } + + I2C_WRITE_BYTE_DATA(ret, &data->access_lock, + client, reg, reg_val); + + if (unlikely(ret < 0)) { + dev_err(dev, "write_cpld_reg() error, return=%d\n", ret); + return ret; + } + + return count; +} + +/* get qsfp port config register value */ +static ssize_t read_cpld_version_h(struct device *dev, + struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + if (attr->index >= CPLD_VERSION_H) { + return sprintf(buf, "%d.%02d.%03d", + _read_cpld_reg(dev, CPLD_VERSION_REG, MASK_CPLD_MAJOR_VER), + _read_cpld_reg(dev, CPLD_VERSION_REG, MASK_CPLD_MINOR_VER), + _read_cpld_reg(dev, CPLD_BUILD_REG, MASK_ALL)); + } + return -1; +} + +/* add valid cpld client to list */ +static void cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = NULL; + + node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + if (!node) { + dev_info(&client->dev, + "Can't allocate cpld_client_node for index %d\n", + client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +/* remove exist cpld client in list */ +static void cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, + struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + mutex_unlock(&list_lock); +} + +/* cpld drvier probe */ +static int cpld_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + int status; + struct cpld_data *data = NULL; + int ret = -EPERM; + + data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* init cpld data for client */ + i2c_set_clientdata(client, data); + mutex_init(&data->access_lock); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_info(&client->dev, + "i2c_check_functionality failed (0x%x)\n", + client->addr); + status = -EIO; + goto exit; + } + + /* get cpld id from device */ + ret = i2c_smbus_read_byte_data(client, CPLD_ID_REG); + + if (ret < 0) { + dev_info(&client->dev, + "fail to get cpld id (0x%x) at addr (0x%x)\n", + CPLD_ID_REG, client->addr); + status = -EIO; + goto exit; + } + + if (INVALID(ret, cpld1, cpld2)) { + dev_info(&client->dev, + "cpld id %d(device) not valid\n", ret); + //status = -EPERM; + //goto exit; + } + +#if 0 + /* change client name for each cpld with index */ + snprintf(client->name, sizeof(client->name), "%s_%d", client->name, + data->index); +#endif + + data->index = dev_id->driver_data; + + /* register sysfs hooks for different cpld group */ + dev_info(&client->dev, "probe cpld with index %d\n", data->index); + switch (data->index) { + case cpld1: + status = sysfs_create_group(&client->dev.kobj, + &cpld1_group); + break; + case cpld2: + status = sysfs_create_group(&client->dev.kobj, + &cpld2_group); + break; + default: + status = -EINVAL; + } + + if (status) + goto exit; + + dev_info(&client->dev, "chip found\n"); + + /* add probe chip to client list */ + cpld_add_client(client); + + return 0; +exit: + switch (data->index) { + case cpld1: + sysfs_remove_group(&client->dev.kobj, &cpld1_group); + break; + case cpld2: + sysfs_remove_group(&client->dev.kobj, &cpld2_group); + break; + default: + break; + } + return status; +} + +/* cpld drvier remove */ +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + + switch (data->index) { + case cpld1: + sysfs_remove_group(&client->dev.kobj, &cpld1_group); + break; + case cpld2: + sysfs_remove_group(&client->dev.kobj, &cpld2_group); + break; + } + + cpld_remove_client(client); + return 0; +} + +static int s8901_54xc_cpld_read_internal(struct i2c_client *client, u8 reg) +{ + int retry = I2C_RW_RETRY_COUNT; + int reg_val = 0; + struct cpld_data *data = i2c_get_clientdata(client); + + while (retry) { + I2C_READ_BYTE_DATA(reg_val, &data->access_lock, client, reg); + if (unlikely(reg_val < 0)) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + + if (retry == 0) { + dev_err(&client->dev, "%s() retry %d times but still failed, reg=%x\n", __func__, I2C_RW_RETRY_COUNT, reg); + } + + continue; + } + + break; + } + + return reg_val; +} + +static int s8901_54xc_cpld_write_internal(struct i2c_client *client, u8 reg, u8 value) +{ + int ret = 0, retry = I2C_RW_RETRY_COUNT; + struct cpld_data *data = i2c_get_clientdata(client); + + while (retry) { + I2C_WRITE_BYTE_DATA(ret, &data->access_lock, client, reg, value); + if (unlikely(ret < 0)) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + + if (retry == 0) { + dev_err(&client->dev, "%s() retry %d times but still failed, reg=%x\n", __func__, I2C_RW_RETRY_COUNT, reg); + } + + continue; + } + break; + } + + return ret; +} + +/* +int s8901_54xc_cpld_write(unsigned short cpld_addr, u8 reg, u8 value) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = s8901_54xc_cpld_write_internal(cpld_node->client, reg, value); + break; + } else { + pr_err("cpld_node->client->addr=%x, cpld_addr=%x\n", cpld_node->client->addr, cpld_addr); + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(s8901_54xc_cpld_write); +*/ + +int s8901_54xc_cpld_psu_mux_sel(u8 mux_sel) +{ + unsigned short cpld_addr = cpld_i2c_addr[0]; + u8 reg = CPLD_MUX_CTRL_REG; + u8 reg_val = 0; + u8 psu_mux_mask = 0x06; + u8 mux_sel_val = 0; + + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + switch(mux_sel) { + case 0: + //psu 0 + mux_sel_val = 0x04; + break; + case 1: + //psu 1 + mux_sel_val = 0x02; + break; + default: + //bmc + mux_sel_val = psu_mux_mask; + break; + } + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + //read current reg value + reg_val = s8901_54xc_cpld_read_internal(cpld_node->client, reg); + //clear psu_mux_sel bits (bit 1 and 2) + reg_val &= ~psu_mux_mask; + //modify psu_mux_sel bits (bit 1 and 2) + reg_val |= mux_sel_val; + //write reg value + s8901_54xc_cpld_write_internal(cpld_node->client, reg, reg_val); + + break; + } else { + pr_err("cpld_node->client->addr=%x, cpld_addr=%x\n", cpld_node->client->addr, cpld_addr); + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(s8901_54xc_cpld_psu_mux_sel); + +MODULE_DEVICE_TABLE(i2c, cpld_id); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "x86_64_ufispace_s8901_54xc_cpld", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_id, + .address_list = cpld_i2c_addr, +}; + +static int __init cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&cpld_driver); +} + +static void __exit cpld_exit(void) +{ + i2c_del_driver(&cpld_driver); +} + +MODULE_AUTHOR("Jason Tsai "); +MODULE_DESCRIPTION("x86_64_ufispace_s8901_54xc_cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(cpld_init); +module_exit(cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.h b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.h new file mode 100644 index 000000000000..36521635fdc6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-cpld.h @@ -0,0 +1,269 @@ +/* header file for i2c cpld driver of ufispace_s8901_54xc + * + * Copyright (C) 2022 UfiSpace Technology Corporation. + * Jason Tsai + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef UFISPACE_S8901_54XC_CPLD_H +#define UFISPACE_S8901_54XC_CPLD_H + +/* CPLD device index value */ +enum cpld_id { + cpld1, + cpld2 +}; + +/* CPLD common registers */ +#define CPLD_VERSION_REG 0x02 +#define CPLD_ID_REG 0x03 +#define CPLD_BUILD_REG 0x04 +#define CPLD_CHIP_REG 0x05 + +#define CPLD_EVT_CTRL_REG 0x3F + +/* CPLD 1 registers */ +#define CPLD_BOARD_ID_0_REG 0x00 +#define CPLD_BOARD_ID_1_REG 0x01 +#define CPLD_SKU_EXT_REG 0x06 + +#define CPLD_MAC_INTR_REG 0x10 +#define CPLD_HWM_INTR_REG 0x13 +#define CPLD_CPLD2_INTR_REG 0x14 +#define CPLD_NTM_INTR_REG 0x15 +#define CPLD_FAN_PSU_INTR_REG 0x16 +#define CPLD_SFP_IOEXP_INTR_REG 0x18 +#define CPLD_CPU_NMI_INTR_REG 0x19 +#define CPLD_PTP_INTR_REG 0x1B +#define CPLD_SYSTEM_INTR_REG 0x1C + +#define CPLD_MAC_MASK_REG 0x20 +#define CPLD_HWM_MASK_REG 0x23 +#define CPLD_CPLD2_MASK_REG 0x24 +#define CPLD_NTM_MASK_REG 0x25 +#define CPLD_FAN_PSU_MASK_REG 0x26 +#define CPLD_SFP_IOEXP_MASK_REG 0x28 +#define CPLD_CPU_NMI_MASK_REG 0x29 +#define CPLD_PTP_MASK_REG 0x2B +#define CPLD_SYSTEM_MASK_REG 0x2C + +#define CPLD_MAC_EVT_REG 0x30 +#define CPLD_HWM_EVT_REG 0x33 +#define CPLD_CPLD2_EVT_REG 0x34 +#define CPLD_NTM_EVT_REG 0x35 +#define CPLD_FAN_PSU_EVT_REG 0x36 +#define CPLD_SFP_IOEXP_EVT_REG 0x38 +#define CPLD_CPU_NMI_EVT_REG 0x39 +#define CPLD_PTP_EVT_REG 0x3B + +#define CPLD_MAC_RESET_REG 0x40 +#define CPLD_SYSTEM_RESET_REG 0x41 +#define CPLD_BMC_NTM_RESET_REG 0x43 +#define CPLD_USB_RESET_REG 0x44 +#define CPLD_I2C_MUX_RESET_REG 0x46 +#define CPLD_I2C_MUX_RESET_2_REG 0x47 +#define CPLD_MISC_RESET_REG 0x48 + +#define CPLD_BRD_PRESENT_REG 0x50 +#define CPLD_PSU_STATUS_REG 0x51 +#define CPLD_SYSTEM_PWR_REG 0x52 +#define CPLD_MAC_SYNCE_REG 0x53 +#define CPLD_MAC_AVS_REG 0x54 +#define CPLD_SYSTEM_STATUS_REG 0x55 +#define CPLD_FAN_PRESENT_REG 0x56 +#define CPLD_WATCHDOG_REG 0x5A +#define CPLD_BOOT_SELECT_REG 0x5B +#define CPLD_MUX_CTRL_REG 0x5C +#define CPLD_MISC_CTRL_1_REG 0x5D +#define CPLD_MISC_CTRL_2_REG 0x5E +#define CPLD_TIMING_CTRL_REG 0x5F + +#define CPLD_MAC_TEMP_REG 0x61 + +/* +#define CPLD_SYSTEM_LED_SYS_FAN_REG 0x80 +#define CPLD_SYSTEM_LED_PSU_REG 0x81 +#define CPLD_SYSTEM_LED_SYNC_REG 0x82 +#define CPLD_SYSTEM_LED_ID_REG 0x84 +*/ +#define CPLD_SYSTEM_LED_PSU_REG 0x80 +#define CPLD_SYSTEM_LED_SYS_REG 0x81 +#define CPLD_SYSTEM_LED_SYNC_REG 0x82 +#define CPLD_SYSTEM_LED_FAN_REG 0x83 +#define CPLD_SYSTEM_LED_ID_REG 0x84 + +#define CPLD_MAC_PG_REG 0x90 +#define CPLD_MISC_PG_REG 0x92 +#define CPLD_MAC_PG_EN_REG 0x93 +#define CPLD_MISC_PG_EN_REG 0x95 + +#define DBG_CPLD_MAC_INTR_REG 0xE0 +#define DBG_CPLD_HWM_INTR_REG 0xE3 +#define DBG_CPLD_CPLD2_INTR_REG 0xE4 +#define DBG_CPLD_NTM_INTR_REG 0xE5 +#define DBG_CPLD_FAN_PSU_INTR_REG 0xE6 +#define DBG_CPLD_SFP_IOEXP_INTR_REG 0xE8 +#define DBG_CPLD_PTP_INTR_REG 0xEB + +#define CPLD_UPG_RESET_REG 0xF0 + +/* CPLD 2*/ + +//interrupt status +#define CPLD_SFP_INTR_PRESENT_0_7_REG 0x10 +#define CPLD_SFP_INTR_PRESENT_8_15_REG 0x11 +#define CPLD_SFP_INTR_PRESENT_16_23_REG 0x12 +#define CPLD_SFP_INTR_PRESENT_24_31_REG 0x13 +#define CPLD_SFP_INTR_PRESENT_32_39_REG 0x14 +#define CPLD_SFP_INTR_PRESENT_40_47_REG 0x15 +#define CPLD_QSFP_INTR_PRESENT_48_53_REG 0x16 +#define CPLD_QSFP_INTR_PORT_48_53_REG 0x17 + +//interrupt mask +#define CPLD_SFP_MASK_PRESENT_0_7_REG 0x20 +#define CPLD_SFP_MASK_PRESENT_8_15_REG 0x21 +#define CPLD_SFP_MASK_PRESENT_16_23_REG 0x22 +#define CPLD_SFP_MASK_PRESENT_24_31_REG 0x23 +#define CPLD_SFP_MASK_PRESENT_32_39_REG 0x24 +#define CPLD_SFP_MASK_PRESENT_40_47_REG 0x25 +#define CPLD_QSFP_MASK_PRESENT_48_53_REG 0x26 +#define CPLD_QSFP_MASK_PORT_48_53_REG 0x27 + +//interrupt event +#define CPLD_SFP_EVT_PRESENT_0_7_REG 0x30 +#define CPLD_SFP_EVT_PRESENT_8_15_REG 0x31 +#define CPLD_SFP_EVT_PRESENT_16_23_REG 0x32 +#define CPLD_SFP_EVT_PRESENT_24_31_REG 0x33 +#define CPLD_SFP_EVT_PRESENT_32_39_REG 0x34 +#define CPLD_SFP_EVT_PRESENT_40_47_REG 0x35 +#define CPLD_QSFP_EVT_PRESENT_48_53_REG 0x36 +#define CPLD_QSFP_EVT_PORT_48_53_REG 0x37 + +#define CPLD_SFP_INTR_RX_LOS_0_7_REG 0x40 +#define CPLD_SFP_INTR_RX_LOS_8_15_REG 0x41 +#define CPLD_SFP_INTR_RX_LOS_16_23_REG 0x42 +#define CPLD_SFP_INTR_RX_LOS_24_31_REG 0x43 +#define CPLD_SFP_INTR_RX_LOS_32_39_REG 0x44 +#define CPLD_SFP_INTR_RX_LOS_40_47_REG 0x45 + +#define CPLD_SFP_INTR_TX_FAULT_0_7_REG 0x46 +#define CPLD_SFP_INTR_TX_FAULT_8_15_REG 0x47 +#define CPLD_SFP_INTR_TX_FAULT_16_23_REG 0x48 +#define CPLD_SFP_INTR_TX_FAULT_24_31_REG 0x49 +#define CPLD_SFP_INTR_TX_FAULT_32_39_REG 0x4A +#define CPLD_SFP_INTR_TX_FAULT_40_47_REG 0x4B + +//#define CPLD_SFP_RX_LOS_BASE_REG 0x40 +//#define CPLD_SFP_TX_FAULT_BASE_REG 0x46 + +#define CPLD_SFP_MASK_RX_LOS_0_7_REG 0x50 +#define CPLD_SFP_MASK_RX_LOS_8_15_REG 0x51 +#define CPLD_SFP_MASK_RX_LOS_16_23_REG 0x52 +#define CPLD_SFP_MASK_RX_LOS_24_31_REG 0x53 +#define CPLD_SFP_MASK_RX_LOS_32_39_REG 0x54 +#define CPLD_SFP_MASK_RX_LOS_40_47_REG 0x55 + +#define CPLD_SFP_MASK_TX_FAULT_0_7_REG 0x56 +#define CPLD_SFP_MASK_TX_FAULT_8_15_REG 0x57 +#define CPLD_SFP_MASK_TX_FAULT_16_23_REG 0x58 +#define CPLD_SFP_MASK_TX_FAULT_24_31_REG 0x59 +#define CPLD_SFP_MASK_TX_FAULT_32_39_REG 0x5A +#define CPLD_SFP_MASK_TX_FAULT_40_47_REG 0x5B + +//#define CPLD_SFP_RX_LOS_MASK_BASE_REG 0x50 +//#define CPLD_SFP_TX_FAULT_MASK_BASE_REG 0x56 + +#define CPLD_SFP_EVT_RX_LOS_0_7_REG 0x60 +#define CPLD_SFP_EVT_RX_LOS_8_15_REG 0x61 +#define CPLD_SFP_EVT_RX_LOS_16_23_REG 0x62 +#define CPLD_SFP_EVT_RX_LOS_24_31_REG 0x63 +#define CPLD_SFP_EVT_RX_LOS_32_39_REG 0x64 +#define CPLD_SFP_EVT_RX_LOS_40_47_REG 0x65 + +#define CPLD_SFP_EVT_TX_FAULT_0_7_REG 0x66 +#define CPLD_SFP_EVT_TX_FAULT_8_15_REG 0x67 +#define CPLD_SFP_EVT_TX_FAULT_16_23_REG 0x68 +#define CPLD_SFP_EVT_TX_FAULT_24_31_REG 0x69 +#define CPLD_SFP_EVT_TX_FAULT_32_39_REG 0x6A +#define CPLD_SFP_EVT_TX_FAULT_40_47_REG 0x6B + +//#define CPLD_SFP_RX_LOS_EVT_BASE_REG 0x60 +//#define CPLD_SFP_TX_FAULT_EVT_BASE_REG 0x66 + +#define CPLD_SFP_TX_DISABLE_0_7_REG 0x70 +#define CPLD_SFP_TX_DISABLE_8_15_REG 0x71 +#define CPLD_SFP_TX_DISABLE_16_23_REG 0x72 +#define CPLD_SFP_TX_DISABLE_24_31_REG 0x73 +#define CPLD_SFP_TX_DISABLE_32_39_REG 0x74 +#define CPLD_SFP_TX_DISABLE_40_47_REG 0x75 + +//#define CPLD_SFP_TX_DISABLE_BASE_REG 0x70 +#define CPLD_QSFP_RESET_48_53_REG 0x76 +#define CPLD_QSFP_LPMODE_48_53_REG 0x77 + +//debug interrupt status +#define DBG_CPLD_SFP_INTR_PRESENT_BASE_REG 0xD0 +#define DBG_CPLD_SFP_INTR_PRESENT_0_7_REG 0xD0 +#define DBG_CPLD_SFP_INTR_PRESENT_8_15_REG 0xD1 +#define DBG_CPLD_SFP_INTR_PRESENT_16_23_REG 0xD2 +#define DBG_CPLD_SFP_INTR_PRESENT_24_31_REG 0xD3 +#define DBG_CPLD_SFP_INTR_PRESENT_32_39_REG 0xD4 +#define DBG_CPLD_SFP_INTR_PRESENT_40_47_REG 0xD5 +#define DBG_CPLD_QSFP_INTR_PRESENT_48_53_REG 0xD6 +#define DBG_CPLD_QSFP_INTR_PORT_48_53_REG 0xD7 + +//debug interrupt mask +#define DBG_CPLD_SFP_INTR_RX_LOS_0_7_REG 0xE0 +#define DBG_CPLD_SFP_INTR_RX_LOS_8_15_REG 0xE1 +#define DBG_CPLD_SFP_INTR_RX_LOS_16_23_REG 0xE2 +#define DBG_CPLD_SFP_INTR_RX_LOS_24_31_REG 0xE3 +#define DBG_CPLD_SFP_INTR_RX_LOS_32_39_REG 0xE4 +#define DBG_CPLD_SFP_INTR_RX_LOS_40_47_REG 0xE5 + +#define DBG_CPLD_SFP_INTR_TX_FAULT_0_7_REG 0xE6 +#define DBG_CPLD_SFP_INTR_TX_FAULT_8_15_REG 0xE7 +#define DBG_CPLD_SFP_INTR_TX_FAULT_16_23_REG 0xE8 +#define DBG_CPLD_SFP_INTR_TX_FAULT_24_31_REG 0xE9 +#define DBG_CPLD_SFP_INTR_TX_FAULT_32_39_REG 0xEA +#define DBG_CPLD_SFP_INTR_TX_FAULT_40_47_REG 0xEB + +//#define DBG_CPLD_SFP_RX_LOS_BASE_REG 0xE0 +//#define DBG_CPLD_SFP_TX_FAULT_BASE_REG 0xE6 + +//MASK +#define MASK_ALL (0xFF) +#define MASK_HB (0b11110000) +#define MASK_LB (0b00001111) +#define MASK_CPLD_MAJOR_VER (0b11000000) +#define MASK_CPLD_MINOR_VER (0b00111111) +#define CPLD_SYSTEM_LED_SYS_MASK MASK_HB +#define CPLD_SYSTEM_LED_FAN_MASK MASK_LB +#define CPLD_SYSTEM_LED_PSU_0_MASK MASK_LB +#define CPLD_SYSTEM_LED_PSU_1_MASK MASK_HB +#define CPLD_SYSTEM_LED_SYNC_MASK MASK_LB +#define CPLD_SYSTEM_LED_ID_MASK MASK_LB +#define CPLD_SFP_LED_MASK_0 (0b00000011) +#define CPLD_SFP_LED_MASK_1 (0b00001100) +#define PERM_R (0b00000001) +#define PERM_W (0b00000010) +#define PERM_RW (PERM_R | PERM_W) +#define IS_PERM_R(perm) (perm & PERM_R ? 1u : 0u) +#define IS_PERM_W(perm) (perm & PERM_W ? 1u : 0u) + +/* common manipulation */ +#define INVALID(i, min, max) ((i < min) || (i > max) ? 1u : 0u) + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-lpc.c b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-lpc.c new file mode 100644 index 000000000000..72de01c48c4a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-lpc.c @@ -0,0 +1,883 @@ +/* + * A lpc driver for the ufispace_s8901_54xc + * + * Copyright (C) 2017-2022 UfiSpace Technology Corporation. + * Jason Tsai + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include + +#define BSP_LOG_R(fmt, args...) \ + _bsp_log (LOG_READ, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_LOG_W(fmt, args...) \ + _bsp_log (LOG_WRITE, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_PR(level, fmt, args...) _bsp_log (LOG_SYS, level "[BSP]" fmt "\r\n", ##args) + +#define _SENSOR_DEVICE_ATTR_RO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO, read_##_func, NULL, _index) + +#define _SENSOR_DEVICE_ATTR_WO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IWUSR, NULL, write_##_func, _index) + +#define _SENSOR_DEVICE_ATTR_RW(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR, read_##_func, write_##_func, _index) + +#define _DEVICE_ATTR(_name) \ + &sensor_dev_attr_##_name.dev_attr.attr + +#define BSP_PR(level, fmt, args...) _bsp_log (LOG_SYS, level "[BSP]" fmt "\r\n", ##args) + +#define DRIVER_NAME "x86_64_ufispace_s8901_54xc_lpc" + +/* LPC registers */ + +#define REG_BASE_MB 0x700 +#define REG_BASE_EC 0xE300 + +#define REG_NONE 0x00 +//MB CPLD +#define REG_BRD_ID_0 (REG_BASE_MB + 0x00) +#define REG_BRD_ID_1 (REG_BASE_MB + 0x01) +#define REG_CPLD_VERSION (REG_BASE_MB + 0x02) +#define REG_CPLD_ID (REG_BASE_MB + 0x03) +#define REG_CPLD_BUILD (REG_BASE_MB + 0x04) +#define REG_CPLD_CHIP (REG_BASE_MB + 0x05) +#define REG_BRD_EXT_ID (REG_BASE_MB + 0x06) +#define REG_I2C_MUX_RESET (REG_BASE_MB + 0x46) +#define REG_I2C_MUX_RESET_2 (REG_BASE_MB + 0x47) +#define REG_MUX_CTRL (REG_BASE_MB + 0x5C) +#define REG_MISC_CTRL (REG_BASE_MB + 0x5D) +#define REG_MISC_CTRL_2 (REG_BASE_MB + 0x5E) + +//EC +#define REG_BIOS_BOOT (REG_BASE_EC + 0x0C) +#define REG_CPU_REV (REG_BASE_EC + 0x17) + +// BMC mailbox +#define REG_TEMP_MAC_HWM (REG_BASE_MB + 0xC0) + +//MASK +#define MASK_ALL (0xFF) +#define MASK_CPLD_MAJOR_VER (0b11000000) +#define MASK_CPLD_MINOR_VER (0b00111111) +#define MASK_HW_ID (0b00000011) +#define MASK_DEPH_ID (0b00000100) +#define MASK_BUILD_ID (0b00011000) +#define MASK_EXT_ID (0b00000111) +#define MASK_MUX_RESET_ALL (0x37) // 2#00110111 +#define MASK_MUX_RESET (MASK_ALL) +#define MASK_BIOS_BOOT_ROM (0b01000000) + +#define LPC_MDELAY (5) +#define MDELAY_RESET_INTERVAL (100) +#define MDELAY_RESET_FINISH (500) + +/* LPC sysfs attributes index */ +enum lpc_sysfs_attributes { + //MB CPLD + ATT_BRD_ID_0, + ATT_BRD_ID_1, + ATT_BRD_SKU_ID, + ATT_BRD_HW_ID, + ATT_BRD_DEPH_ID, + ATT_BRD_BUILD_ID, + ATT_BRD_EXT_ID, + + ATT_CPLD_ID, + ATT_CPLD_BUILD, + ATT_CPLD_CHIP, + + ATT_CPLD_VERSION_MAJOR, + ATT_CPLD_VERSION_MINOR, + ATT_CPLD_VERSION_BUILD, + ATT_CPLD_VERSION_H, + + ATT_MUX_RESET, + ATT_MUX_CTRL, + + //EC + ATT_CPU_HW_ID, + ATT_CPU_DEPH_ID, + ATT_CPU_BUILD_ID, + ATT_BIOS_BOOT_ROM, + //BMC mailbox + ATT_TEMP_MAC_HWM, + + //BSP + ATT_BSP_VERSION, + ATT_BSP_DEBUG, + ATT_BSP_PR_INFO, + ATT_BSP_PR_ERR, + ATT_BSP_REG, + ATT_BSP_GPIO_MAX, + ATT_MAX +}; + +enum data_type { + DATA_HEX, + DATA_DEC, + DATA_S_DEC, + DATA_UNK, +}; + +enum bsp_log_types { + LOG_NONE, + LOG_RW, + LOG_READ, + LOG_WRITE, + LOG_SYS +}; + +enum bsp_log_ctrl { + LOG_DISABLE, + LOG_ENABLE +}; + +struct lpc_data_s { + struct mutex access_lock; +}; + +typedef struct sysfs_info_s +{ + u16 reg; + u8 mask; + u8 data_type; +} sysfs_info_t; + +static sysfs_info_t sysfs_info[] = { + [ATT_BRD_ID_0] = {REG_BRD_ID_0, MASK_ALL, DATA_HEX}, + [ATT_BRD_ID_1] = {REG_BRD_ID_1, MASK_ALL, DATA_HEX}, + [ATT_BRD_SKU_ID] = {REG_BRD_ID_0, MASK_ALL, DATA_DEC}, + [ATT_BRD_HW_ID] = {REG_BRD_ID_1, MASK_HW_ID, DATA_DEC}, + [ATT_BRD_DEPH_ID] = {REG_BRD_ID_1, MASK_DEPH_ID, DATA_DEC}, + [ATT_BRD_BUILD_ID] = {REG_BRD_ID_1, MASK_BUILD_ID, DATA_DEC}, + [ATT_BRD_EXT_ID] = {REG_BRD_EXT_ID, MASK_EXT_ID, DATA_DEC}, + + [ATT_CPLD_ID] = {REG_CPLD_ID, MASK_ALL, DATA_DEC}, + [ATT_CPLD_BUILD] = {REG_CPLD_BUILD, MASK_ALL, DATA_DEC}, + [ATT_CPLD_CHIP] = {REG_CPLD_CHIP, MASK_ALL, DATA_DEC}, + + [ATT_CPLD_VERSION_MAJOR] = {REG_CPLD_VERSION, MASK_CPLD_MAJOR_VER, DATA_DEC}, + [ATT_CPLD_VERSION_MINOR] = {REG_CPLD_VERSION, MASK_CPLD_MINOR_VER, DATA_DEC}, + [ATT_CPLD_VERSION_BUILD] = {REG_CPLD_BUILD, MASK_ALL, DATA_DEC}, + [ATT_CPLD_VERSION_H] = {REG_CPLD_VERSION, MASK_ALL, DATA_UNK}, + + [ATT_MUX_RESET] = {REG_NONE, MASK_ALL, DATA_DEC}, + [ATT_MUX_CTRL] = {REG_MUX_CTRL, MASK_ALL, DATA_HEX}, + + //EC + [ATT_CPU_HW_ID] = {REG_CPU_REV, MASK_HW_ID, DATA_DEC}, + [ATT_CPU_DEPH_ID] = {REG_CPU_REV, MASK_DEPH_ID, DATA_DEC}, + [ATT_CPU_BUILD_ID] = {REG_CPU_REV, MASK_BUILD_ID, DATA_DEC}, + [ATT_BIOS_BOOT_ROM] = {REG_BIOS_BOOT, MASK_BIOS_BOOT_ROM, DATA_DEC}, + + //BMC mailbox + [ATT_TEMP_MAC_HWM] = {REG_TEMP_MAC_HWM , MASK_ALL, DATA_S_DEC}, + + //BSP + [ATT_BSP_VERSION] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_DEBUG] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_PR_INFO] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_PR_ERR] = {REG_NONE, MASK_ALL, DATA_UNK}, + [ATT_BSP_REG] = {REG_NONE, MASK_ALL, DATA_HEX}, +}; + +struct lpc_data_s *lpc_data; +char bsp_version[16]=""; +char bsp_debug[2]="0"; +char bsp_reg[8]="0x0"; +u8 enable_log_read = LOG_DISABLE; +u8 enable_log_write = LOG_DISABLE; +u8 enable_log_sys = LOG_ENABLE; +u8 mailbox_inited=0; + +/* reg shift */ +static u8 _shift(u8 mask) +{ + int i=0, mask_one=1; + + for(i=0; i<8; ++i) { + if ((mask & mask_one) == 1) + return i; + else + mask >>= 1; + } + + return -1; +} + +/* reg mask and shift */ +static u8 _mask_shift(u8 val, u8 mask) +{ + int shift=0; + + shift = _shift(mask); + + return (val & mask) >> shift; +} + +static u8 _parse_data(char *buf, unsigned int data, u8 data_type) +{ + if(buf == NULL) { + return -1; + } + + if(data_type == DATA_HEX) { + return sprintf(buf, "0x%02x", data); + } else if(data_type == DATA_DEC) { + return sprintf(buf, "%u", data); + } else { + return -1; + } + return 0; +} + +static int _bsp_log(u8 log_type, char *fmt, ...) +{ + if ((log_type==LOG_READ && enable_log_read) || + (log_type==LOG_WRITE && enable_log_write) || + (log_type==LOG_SYS && enable_log_sys) ) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk(fmt, args); + va_end(args); + + return r; + } else { + return 0; + } +} + +static int _config_bsp_log(u8 log_type) +{ + switch(log_type) { + case LOG_NONE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_RW: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_ENABLE; + break; + case LOG_READ: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_WRITE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_ENABLE; + break; + default: + return -EINVAL; + } + return 0; +} + +static void _outb(u8 data, u16 port) +{ + outb(data, port); + mdelay(LPC_MDELAY); +} + +/* init bmc mailbox, get from BMC team */ +static int bmc_mailbox_init(void) +{ + if (mailbox_inited) { + return mailbox_inited; + } + + //Enable super io writing + _outb(0xa5, 0x2e); + _outb(0xa5, 0x2e); + + //Logic device number + _outb(0x07, 0x2e); + _outb(0x0e, 0x2f); + + //Disable mailbox + _outb(0x30, 0x2e); + _outb(0x00, 0x2f); + + //Set base address bit + _outb(0x60, 0x2e); + _outb(0x07, 0x2f); + _outb(0x61, 0x2e); + _outb(0xc0, 0x2f); + + //Select bit[3:0] of SIRQ + _outb(0x70, 0x2e); + _outb(0x07, 0x2f); + + //Low level trigger + _outb(0x71, 0x2e); + _outb(0x01, 0x2f); + + //Enable mailbox + _outb(0x30, 0x2e); + _outb(0x01, 0x2f); + + //Disable super io writing + _outb(0xaa, 0x2e); + + //Mailbox initial + _outb(0x00, 0x786); + _outb(0x00, 0x787); + + //set mailbox_inited + mailbox_inited = 1; + + return mailbox_inited; +} + +/* get lpc register value */ +static u8 _read_lpc_reg(u16 reg, u8 mask) +{ + u8 reg_val=0x0, reg_mk_shf_val = 0x0; + + mutex_lock(&lpc_data->access_lock); + reg_val = inb(reg); + mutex_unlock(&lpc_data->access_lock); + + reg_mk_shf_val = _mask_shift(reg_val, mask); + + BSP_LOG_R("reg=0x%03x, reg_val=0x%02x, mask=0x%02x, reg_mk_shf_val=0x%02x", reg, reg_val, mask, reg_mk_shf_val); + + return reg_mk_shf_val; +} + +/* get lpc register value */ +static ssize_t read_lpc_reg(u16 reg, u8 mask, char *buf, u8 data_type) +{ + u8 reg_val; + int len=0; + + reg_val = _read_lpc_reg(reg, mask); + + // may need to change to hex value ? + len=_parse_data(buf, reg_val, data_type); + + return len; +} + +/* set lpc register value */ +static ssize_t write_lpc_reg(u16 reg, u8 mask, const char *buf, size_t count, u8 data_type) +{ + u8 reg_val, reg_val_now, shift; + + if (kstrtou8(buf, 0, ®_val) < 0) { + if(data_type == DATA_S_DEC) { + if (kstrtos8(buf, 0, ®_val) < 0) { + return -EINVAL; + } + } else { + return -EINVAL; + } + } + + //apply continuous bits operation if mask is specified, discontinuous bits are not supported + if (mask != MASK_ALL) { + reg_val_now = _read_lpc_reg(reg, MASK_ALL); + //clear bits in reg_val_now by the mask + reg_val_now &= ~mask; + //get bit shift by the mask + shift = _shift(mask); + //calculate new reg_val + reg_val = reg_val_now | (reg_val << shift); + } + + mutex_lock(&lpc_data->access_lock); + + _outb(reg_val, reg); + + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x, mask=0x%02x", reg, reg_val, mask); + + return count; +} + +/* get bsp value */ +static ssize_t read_bsp(char *buf, char *str) +{ + ssize_t len=0; + + mutex_lock(&lpc_data->access_lock); + len=sprintf(buf, "%s", str); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_R("reg_val=%s", str); + + return len; +} + +/* set bsp value */ +static ssize_t write_bsp(const char *buf, char *str, size_t str_len, size_t count) +{ + mutex_lock(&lpc_data->access_lock); + snprintf(str, str_len, "%s", buf); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg_val=%s", str); + + return count; +} + +/* get gpio max value */ +static ssize_t read_gpio_max(struct device *dev, + struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + if (attr->index == ATT_BSP_GPIO_MAX) { + return sprintf(buf, "%d\n", ARCH_NR_GPIOS-1); + } + return -1; +} + +/* get mb cpld version in human readable format */ +static ssize_t read_mb_cpld_version_h(struct device *dev, + struct device_attribute *da, char *buf) +{ + ssize_t len=0; + u8 major = 0, minor = 0, build = 0; + major = _read_lpc_reg(REG_CPLD_VERSION, MASK_CPLD_MAJOR_VER); + minor = _read_lpc_reg(REG_CPLD_VERSION, MASK_CPLD_MINOR_VER); + build = _read_lpc_reg(REG_CPLD_BUILD, MASK_ALL); + len=sprintf(buf, "%u.%02u.%03u", major, minor, build); + + return len; +} + +/* get lpc register value */ +static ssize_t read_lpc_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_ALL; + u8 data_type = DATA_UNK; + + if (attr->index == ATT_BSP_REG) { + //copy value from bsp_reg + if (kstrtou16(bsp_reg, 0, ®) < 0) + return -EINVAL; + + data_type = sysfs_info[attr->index].data_type; + } else { + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + data_type = sysfs_info[attr->index].data_type; + } + + return read_lpc_reg(reg, mask, buf, data_type); +} + +/* set lpc register value */ +static ssize_t write_lpc_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_ALL; + u8 data_type = DATA_UNK; + + reg = sysfs_info[attr->index].reg; + mask = sysfs_info[attr->index].mask; + data_type = sysfs_info[attr->index].data_type; + + if(attr->index == ATT_TEMP_MAC_HWM) { + bmc_mailbox_init(); + } + + return write_lpc_reg(reg, mask, buf, count, data_type); +} + +/* get bsp parameter value */ +static ssize_t read_bsp_callback(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + char *str=NULL; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + break; + case ATT_BSP_DEBUG: + str = bsp_debug; + break; + case ATT_BSP_REG: + str = bsp_reg; + break; + default: + return -EINVAL; + } + return read_bsp(buf, str); +} + +/* set bsp parameter value */ +static ssize_t write_bsp_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + u16 reg = 0; + u8 bsp_debug_u8 = 0; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + str_len = sizeof(bsp_version); + break; + case ATT_BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(bsp_debug); + break; + case ATT_BSP_REG: + if (kstrtou16(buf, 0, ®) < 0) + return -EINVAL; + + str = bsp_reg; + str_len = sizeof(bsp_reg); + break; + default: + return -EINVAL; + } + + if (attr->index == ATT_BSP_DEBUG) { + if (kstrtou8(buf, 0, &bsp_debug_u8) < 0) { + return -EINVAL; + } else if (_config_bsp_log(bsp_debug_u8) < 0) { + return -EINVAL; + } + } + + return write_bsp(buf, str, str_len, count); +} + +static ssize_t write_bsp_pr_callback(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len = strlen(buf); + + if(str_len <= 0) + return str_len; + + switch (attr->index) { + case ATT_BSP_PR_INFO: + BSP_PR(KERN_INFO, "%s", buf); + break; + case ATT_BSP_PR_ERR: + BSP_PR(KERN_ERR, "%s", buf); + break; + default: + return -EINVAL; + } + + return str_len; +} + +/* set mux_reset register value */ +static ssize_t write_mux_reset(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + u16 reg = REG_I2C_MUX_RESET; + u8 val = 0; + u8 mux_reset_reg_val = 0; + static int mux_reset_flag = 0; + + if (kstrtou8(buf, 0, &val) < 0) + return -EINVAL; + + if (mux_reset_flag == 0) { + if (val == 0) { + mutex_lock(&lpc_data->access_lock); + mux_reset_flag = 1; + BSP_LOG_W("i2c mux reset is triggered..."); + + //reset mux on SFP/QSFP ports + mux_reset_reg_val = inb(reg); + _outb((mux_reset_reg_val & (u8) (~MASK_MUX_RESET)), reg); + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x", reg, mux_reset_reg_val & 0x0); + + //unset mux on SFP/QSFP ports + outb((mux_reset_reg_val | MASK_MUX_RESET), reg); + mdelay(500); + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x", reg, mux_reset_reg_val | 0xFF); + + mux_reset_flag = 0; + mutex_unlock(&lpc_data->access_lock); + } else { + return -EINVAL; + } + } else { + BSP_LOG_W("i2c mux is resetting... (ignore)"); + mutex_lock(&lpc_data->access_lock); + mutex_unlock(&lpc_data->access_lock); + } + + return count; +} + +//SENSOR_DEVICE_ATTR - MB +static _SENSOR_DEVICE_ATTR_RO(board_id_0, lpc_callback, ATT_BRD_ID_0); +static _SENSOR_DEVICE_ATTR_RO(board_id_1, lpc_callback, ATT_BRD_ID_1); +static _SENSOR_DEVICE_ATTR_RO(board_sku_id, lpc_callback, ATT_BRD_SKU_ID); +static _SENSOR_DEVICE_ATTR_RO(board_hw_id, lpc_callback, ATT_BRD_HW_ID); +static _SENSOR_DEVICE_ATTR_RO(board_deph_id, lpc_callback, ATT_BRD_DEPH_ID); +static _SENSOR_DEVICE_ATTR_RO(board_build_id, lpc_callback, ATT_BRD_BUILD_ID); +static _SENSOR_DEVICE_ATTR_RO(board_ext_id, lpc_callback, ATT_BRD_EXT_ID); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_major, lpc_callback, ATT_CPLD_VERSION_MAJOR); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_minor, lpc_callback, ATT_CPLD_VERSION_MINOR); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_build, lpc_callback, ATT_CPLD_VERSION_BUILD); +static _SENSOR_DEVICE_ATTR_RO(cpld_version_h, mb_cpld_version_h, ATT_CPLD_VERSION_H); +static _SENSOR_DEVICE_ATTR_RO(cpld_id, lpc_callback, ATT_CPLD_ID); + +static _SENSOR_DEVICE_ATTR_WO(mux_reset, mux_reset, ATT_MUX_RESET); +static _SENSOR_DEVICE_ATTR_RW(mux_ctrl, lpc_callback, ATT_MUX_CTRL); + +//SENSOR_DEVICE_ATTR - BMC mailbox +static _SENSOR_DEVICE_ATTR_WO(temp_mac_hwm , lpc_callback , ATT_TEMP_MAC_HWM); + +//SENSOR_DEVICE_ATTR - EC +static _SENSOR_DEVICE_ATTR_RO(cpu_hw_id, lpc_callback, ATT_CPU_HW_ID); +static _SENSOR_DEVICE_ATTR_RO(cpu_deph_id, lpc_callback, ATT_CPU_DEPH_ID); +static _SENSOR_DEVICE_ATTR_RO(cpu_build_id, lpc_callback, ATT_CPU_BUILD_ID); +static _SENSOR_DEVICE_ATTR_RO(bios_boot_rom, lpc_callback, ATT_BIOS_BOOT_ROM); + +//SENSOR_DEVICE_ATTR - BSP +static _SENSOR_DEVICE_ATTR_RW(bsp_version, bsp_callback, ATT_BSP_VERSION); +static _SENSOR_DEVICE_ATTR_RW(bsp_debug, bsp_callback, ATT_BSP_DEBUG); +static _SENSOR_DEVICE_ATTR_WO(bsp_pr_info, bsp_pr_callback, ATT_BSP_PR_INFO); +static _SENSOR_DEVICE_ATTR_WO(bsp_pr_err, bsp_pr_callback, ATT_BSP_PR_ERR); +static SENSOR_DEVICE_ATTR(bsp_reg, S_IRUGO | S_IWUSR, read_lpc_callback, write_bsp_callback, ATT_BSP_REG); +static SENSOR_DEVICE_ATTR(bsp_gpio_max, S_IRUGO, read_gpio_max, NULL, ATT_BSP_GPIO_MAX); + +static struct attribute *mb_cpld_attrs[] = { + _DEVICE_ATTR(board_id_0), + _DEVICE_ATTR(board_id_1), + _DEVICE_ATTR(board_sku_id), + _DEVICE_ATTR(board_hw_id), + _DEVICE_ATTR(board_deph_id), + _DEVICE_ATTR(board_build_id), + _DEVICE_ATTR(board_ext_id), + _DEVICE_ATTR(cpld_version_major), + _DEVICE_ATTR(cpld_version_minor), + _DEVICE_ATTR(cpld_version_build), + _DEVICE_ATTR(cpld_version_h), + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(mux_reset), + _DEVICE_ATTR(mux_ctrl), + NULL, +}; + +static struct attribute *bsp_attrs[] = { + _DEVICE_ATTR(bsp_version), + _DEVICE_ATTR(bsp_debug), + _DEVICE_ATTR(bsp_pr_info), + _DEVICE_ATTR(bsp_pr_err), + _DEVICE_ATTR(bsp_reg), + _DEVICE_ATTR(bsp_gpio_max), + NULL, +}; + +static struct attribute *ec_attrs[] = { + _DEVICE_ATTR(cpu_hw_id), + _DEVICE_ATTR(cpu_deph_id), + _DEVICE_ATTR(cpu_build_id), + _DEVICE_ATTR(bios_boot_rom), + NULL, +}; + +static struct attribute *bmc_mailbox_attrs[] = { + _DEVICE_ATTR(temp_mac_hwm), + NULL, +}; + +static struct attribute_group mb_cpld_attr_grp = { + .name = "mb_cpld", + .attrs = mb_cpld_attrs, +}; + +static struct attribute_group bsp_attr_grp = { + .name = "bsp", + .attrs = bsp_attrs, +}; + +static struct attribute_group ec_attr_grp = { + .name = "ec", + .attrs = ec_attrs, +}; + +static struct attribute_group bmc_mailbox_attr_grp = { + .name = "bmc_mailbox", + .attrs = bmc_mailbox_attrs, +}; + +static void lpc_dev_release( struct device * dev) +{ + return; +} + +static struct platform_device lpc_dev = { + .name = DRIVER_NAME, + .id = -1, + .dev = { + .release = lpc_dev_release, + } +}; + +static int lpc_drv_probe(struct platform_device *pdev) +{ + int i = 0, grp_num = 4; + int err[4] = {0}; + struct attribute_group *grp; + + lpc_data = devm_kzalloc(&pdev->dev, sizeof(struct lpc_data_s), + GFP_KERNEL); + if (!lpc_data) + return -ENOMEM; + + mutex_init(&lpc_data->access_lock); + + for (i=0; idev.kobj, grp); + if (err[i]) { + printk(KERN_ERR "Cannot create sysfs for group %s\n", grp->name); + goto exit; + } else { + continue; + } + } + + return 0; + +exit: + for (i=0; idev.kobj, grp); + if (!err[i]) { + //remove previous successful cases + continue; + } else { + //remove first failed case, then return + return err[i]; + } + } + return 0; +} + +static int lpc_drv_remove(struct platform_device *pdev) +{ + sysfs_remove_group(&pdev->dev.kobj, &mb_cpld_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &bmc_mailbox_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &bsp_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &ec_attr_grp); + + return 0; +} + +static struct platform_driver lpc_drv = { + .probe = lpc_drv_probe, + .remove = __exit_p(lpc_drv_remove), + .driver = { + .name = DRIVER_NAME, + }, +}; + +int lpc_init(void) +{ + int err = 0; + + err = platform_driver_register(&lpc_drv); + if (err) { + printk(KERN_ERR "%s(#%d): platform_driver_register failed(%d)\n", + __func__, __LINE__, err); + + return err; + } + + err = platform_device_register(&lpc_dev); + if (err) { + printk(KERN_ERR "%s(#%d): platform_device_register failed(%d)\n", + __func__, __LINE__, err); + platform_driver_unregister(&lpc_drv); + return err; + } + + return err; +} + +void lpc_exit(void) +{ + platform_driver_unregister(&lpc_drv); + platform_device_unregister(&lpc_dev); +} + +MODULE_AUTHOR("Jason Tsai "); +MODULE_DESCRIPTION("x86_64_ufispace_s8901_54xc_lpc driver"); +MODULE_LICENSE("GPL"); + +module_init(lpc_init); +module_exit(lpc_exit); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-sys-eeprom.c b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-sys-eeprom.c new file mode 100644 index 000000000000..f9f7728deb3d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/modules/x86-64-ufispace-s8901-54xc-sys-eeprom.c @@ -0,0 +1,272 @@ +/* + * Copyright (C) 1998, 1999 Frodo Looijaard and + * Philip Edelbrock + * Copyright (C) 2003 Greg Kroah-Hartman + * Copyright (C) 2003 IBM Corp. + * Copyright (C) 2004 Jean Delvare + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* enable dev_dbg print out */ +//#define DEBUG + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { /*0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57,*/ I2C_CLIENT_END }; + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 512 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void sys_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, (u8)((addr >> 8) & 0xFF), (u8)(addr & 0xFF)); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t sys_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + sys_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static ssize_t sys_eeprom_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + int ret; + int i; + u8 cmd; + u16 value16; + + dev_dbg(&client->dev, "sys_eeprom_write off=%d, count=%d\n", (int)off, (int)count); + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + mutex_lock(&data->update_lock); + + for(i=0; i < count; i++) { + /* write command */ + cmd = (off >> 8) & 0xff; + value16 = off & 0xff; + value16 |= buf[i] << 8; + ret = i2c_smbus_write_word_data(client, cmd, value16); + + if (ret < 0) { + dev_err(&client->dev, "write address failed at %d \n", (int)off); + goto exit; + } + + off++; + + /* need to wait for write complete */ + udelay(10000); + } +exit: + mutex_unlock(&data->update_lock); + /* force to update client when reading */ + for(i=0; i < SLICE_NUM; i++) { + data->last_updated[i] = 0; + } + + return count; +} + +static struct bin_attribute sys_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO | S_IWUSR, + }, + .size = EEPROM_SIZE, + .read = sys_eeprom_read, + .write = sys_eeprom_write, +}; + +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int sys_eeprom_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = client->adapter; + + /* EDID EEPROMs are often 24C00 EEPROMs, which answer to all + addresses 0x50-0x57, but we only care about 0x51 and 0x55. So decline + attaching to addresses >= 0x56 on DDC buses */ + if (!(adapter->class & I2C_CLASS_SPD) && client->addr >= 0x56) { + return -ENODEV; + } + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE) + && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { + return -ENODEV; + } + + strlcpy(info->type, "eeprom", I2C_NAME_SIZE); + + return 0; +} + +static int sys_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + +#ifdef __STDC_LIB_EXT1__ + memset_s(data->data, EEPROM_SIZE, 0xff, EEPROM_SIZE); +#else + memset(data->data, 0xff, EEPROM_SIZE); +#endif + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &sys_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int sys_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &sys_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id sys_eeprom_id[] = { + { "sys_eeprom", 0 }, + { } +}; + +static struct i2c_driver sys_eeprom_driver = { + .driver = { + .name = "sys_eeprom", + }, + .probe = sys_eeprom_probe, + .remove = sys_eeprom_remove, + .id_table = sys_eeprom_id, + + .class = I2C_CLASS_DDC | I2C_CLASS_SPD, + .detect = sys_eeprom_detect, + .address_list = normal_i2c, +}; + +module_i2c_driver(sys_eeprom_driver); + +MODULE_AUTHOR("Jason "); +MODULE_DESCRIPTION("UfiSpace System EEPROM driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/__init__.py new file mode 100644 index 000000000000..593867d31c9d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/__init__.py @@ -0,0 +1,4 @@ +# All the derived classes for PDDF +__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] +from . import platform + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/chassis.py new file mode 100644 index 000000000000..085f2af2ff85 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/chassis.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Chassis API +# +############################################################################# + +try: + import time + from sonic_platform_pddf_base.pddf_chassis import PddfChassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_COMPONENT = 4 + +class Chassis(PddfChassis): + """ + PDDF Platform-specific Chassis class + """ + + SYSLED_DEV_NAME = "SYS_LED" + port_dict = {} + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfChassis.__init__(self, pddf_data, pddf_plugin_data) + self._initialize_components() + + def _initialize_components(self): + from sonic_platform.component import Component + for index in range(NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + # return device_info.get_hwsku() + return self._eeprom.platform_name_str() + + def initizalize_system_led(self): + return True + + def get_status_led(self): + return self.get_system_led(self.SYSLED_DEV_NAME) + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + Returns: + (bool, dict): + - bool: True if call successful, False if not; + - dict: A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, where device_id is the device ID + for this device and device_event. + The known devices's device_id and device_event was defined as table below. + ----------------------------------------------------------------- + device | device_id | device_event | annotate + ----------------------------------------------------------------- + 'fan' '' '0' Fan removed + '1' Fan inserted + 'sfp' '' '0' Sfp removed + '1' Sfp inserted + '2' I2C bus stuck + '3' Bad eeprom + '4' Unsupported cable + '5' High Temperature + '6' Bad cable + 'voltage' '' '0' Vout normal + '1' Vout abnormal + -------------------------------------------------------------------- + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'}, + 'voltage':{'U20':'0', 'U21':'1'}} + Indicates that: + fan 0 has been removed, fan 2 has been inserted. + sfp 11 has been removed, sfp 12 has been inserted. + monitored voltage U20 became normal, voltage U21 became abnormal. + Note: For sfp, when event 3-6 happened, the module will not be avalaible, + XCVRD shall stop to read eeprom before SFP recovered from error status. + """ + + change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}} + + start_time = time.time() + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_change_event:Invalid timeout value", timeout) + return False, change_event_dict + + end_time = start_time + timeout + if start_time > end_time: + print( + "get_change_event:" "time wrap / invalid timeout value", + timeout, + ) + return False, change_event_dict # Time wrap or possibly incorrect timeout + try: + while timeout >= 0: + # check for sfp + sfp_change_dict = self.get_transceiver_change_event() + # check for fan + # fan_change_dict = self.get_fan_change_event() + # check for voltage + # voltage_change_dict = self.get_voltage_change_event() + + if sfp_change_dict: + change_event_dict["sfp"] = sfp_change_dict + # change_event_dict["fan"] = fan_change_dict + # change_event_dict["voltage"] = voltage_change_dict + return True, change_event_dict + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_event_dict + except Exception as e: + print(e) + print("get_change_event: Should not reach here.") + return False, change_event_dict + + def get_transceiver_change_event(self): + current_port_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index in range(self.platform_inventory['num_ports']): + if self._sfp_list[index].get_presence(): + #current_port_dict[index] = self.STATUS_INSERTED + current_port_dict[index] = self.plugin_data['XCVR']['plug_status']['inserted'] + else: + #current_port_dict[index] = self.STATUS_REMOVED + current_port_dict[index] = self.plugin_data['XCVR']['plug_status']['removed'] + + if len(self.port_dict) == 0: # first time + self.port_dict = current_port_dict + return {} + + if current_port_dict == self.port_dict: + return {} + + # Update reg value + for index, status in current_port_dict.items(): + if self.port_dict[index] != status: + ret_dict[index] = status + #ret_dict[str(index)] = status + self.port_dict = current_port_dict + for index, status in ret_dict.items(): + if int(status) == 1: + pass + #self._sfp_list[int(index)].check_sfp_optoe_type() + return ret_dict + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = self.plugin_data['REBOOT_CAUSE']['reboot_cause_file'] + + try: + with open(reboot_cause_path, 'r', errors='replace') as fd: + data = fd.read() + sw_reboot_cause = data.strip() + except IOError: + sw_reboot_cause = "Unknown" + + return ('REBOOT_CAUSE_NON_HARDWARE', sw_reboot_cause) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/component.py new file mode 100644 index 000000000000..1c583079f8c2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/component.py @@ -0,0 +1,125 @@ +############################################################################# +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from sonic_platform_pddf_base import pddfapi +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_SYSFS = { + "CPLD1": {"major": "cpld1_major_ver", "minor": "cpld1_minor_ver", "build": "cpld1_build"}, + "CPLD2": {"major": "cpld2_major_ver", "minor": "cpld2_minor_ver", "build": "cpld2_build"}, +} + +BMC_CMDS = { + "VER1": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f1", + "VER2": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f2", + "VER3": "echo $((`ipmitool mc info | grep 'Aux Firmware Rev Info' -A 2 | sed -n '2p'` + 0))", +} + +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("CPLD1", "CPLD 1"), + ("CPLD2", "CPLD 2"), + ("BIOS", "Basic Input/Output System"), + ("BMC", "BMC"), +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + self.pddf_obj = pddfapi.PddfApi() + self.index = component_index + self.name = self.get_name() + + def _get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def _get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name, elem in CPLD_SYSFS.items(): + device = "SYSSTATUS" + major = self.pddf_obj.get_attr_name_output(device, elem["major"]) + minor = self.pddf_obj.get_attr_name_output(device, elem["minor"]) + build = self.pddf_obj.get_attr_name_output(device, elem["build"]) + if major and minor and build: + major = int(major['status'].rstrip(),0) + minor = int(minor['status'].rstrip(),0) + build = int(build['status'].rstrip(),0) + cpld_version[cpld_name] = "{}.{:02d}.{:03d}".format(major, minor, build) + else: + cpld_version[cpld_name] = "N/A" + return cpld_version + + def _get_bmc_version(self): + # Retrieves the BMC firmware version + bmc_ver = dict() + for ver in BMC_CMDS: + status, value = subprocess.getstatusoutput(BMC_CMDS[ver]) + if not status: + bmc_ver[ver] = int(value.rstrip()) + else: + return None + + bmc_version = "{}.{}.{}".format(bmc_ver["VER1"], bmc_ver["VER2"], bmc_ver["VER3"]) + + return bmc_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self._get_bios_version() + elif "CPLD" in self.name: + cpld_version = self._get_cpld_version() + fw_version = cpld_version.get(self.name) + elif self.name == "BMC": + fw_version = self._get_bmc_version() + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/eeprom.py new file mode 100644 index 000000000000..90ab1c779a48 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(PddfEeprom): + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + + def platform_name_str(self): + (is_valid, results) = self.get_tlv_field(self.eeprom_data, self._TLV_CODE_PLATFORM_NAME) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan.py new file mode 100644 index 000000000000..c3cb875646b0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan import PddfFan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Fan(PddfFan): + """PDDF Platform-Specific Fan class""" + + def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): + # idx is 0-based + PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten + # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' + + def get_mfr_id(self): + """ + Retrieves the manufacturer id of the device + + Returns: + string: Manufacturer Id of device + """ + if self.is_psu_fan: + device = "PSU{}".format(self.fans_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_mfr_id") + else: + raise NotImplementedError + + if not output: + return None + + mfr = output['status'] + + # strip_non_ascii + stripped = (c for c in mfr if 0 < ord(c) < 127) + mfr = ''.join(stripped) + + return mfr.rstrip('\n') + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + if self.is_psu_fan: + device = "PSU{}".format(self.fans_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_model_name") + else: + raise NotImplementedError + + if not output: + return None + + model = output['status'] + + # strip_non_ascii + stripped = (c for c in model if 0 < ord(c) < 127) + model = ''.join(stripped) + + return model.rstrip('\n') + + def get_max_speed(self): + """ + Retrieves the max speed + + Returns: + An Integer, the max speed + """ + if self.is_psu_fan: + mfr = self.get_mfr_id() + model = self.get_model() + + max_speed = int(self.plugin_data['PSU']['valmap']['PSU_FAN_MAX_SPEED_AC']) + if mfr and model : + for dev in self.plugin_data['PSU']['psu_support_list']: + if dev['Manufacturer'] == mfr and dev['Name'] == model: + max_speed = int(self.plugin_data['PSU']['valmap'][dev['MaxSpd']]) + break + else: + max_speed = int(self.plugin_data['FAN']['FAN_MAX_SPEED']) + + return max_speed + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed_percentage = 0 + + max_speed = self.get_max_speed() + rpm_speed = self.get_speed_rpm() + + speed_percentage = round((rpm_speed*100)/max_speed) + + return min(speed_percentage, 100) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + if self.is_psu_fan: + attr_name = "psu_present" + device = "PSU{}".format(self.fans_psu_index) + else: + idx = (self.fantray_index-1)*self.platform['num_fans_pertray'] + self.fan_index + attr_name = "fan" + str(idx) + "_present" + device = "FAN-CTRL" + + output = self.pddf_obj.get_attr_name_output(device, attr_name) + if not output: + return False + + mode = output['mode'] + presence = output['status'].rstrip() + vmap = self.plugin_data['FAN']['present'][mode]['valmap'] + + if presence in vmap: + status = vmap[presence] + else: + status = False + + return status + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + return self.get_speed() + + def set_speed(self, speed): + """ + Sets the fan speed + + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + + Returns: + A boolean, True if speed is set successfully, False if not + """ + + print("Setting Fan speed is not allowed") + return False diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/platform.py new file mode 100644 index 000000000000..406b1179ae1b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/platform.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + + +try: + from sonic_platform_pddf_base.pddf_platform import PddfPlatform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PddfPlatform): + """ + PDDF Platform-Specific Platform Class + """ + + def __init__(self): + PddfPlatform.__init__(self) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/psu.py new file mode 100644 index 000000000000..38b32412d024 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/psu.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_psu import PddfPsu +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Psu(PddfPsu): + """PDDF Platform-Specific PSU class""" + + PLATFORM_PSU_CAPACITY = 450 + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU (or PSU capacity) + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(self.PLATFORM_PSU_CAPACITY) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + + # power is returned in micro watts + return round(float(self.get_voltage()*self.get_current()), 2) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/sfp.py new file mode 100644 index 000000000000..8ab43117d54c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/sfp.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_sfp import PddfSfp +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Sfp(PddfSfp): + """ + PDDF Platform-Specific Sfp class + """ + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data) + self.index = index + + # Provide the functions/variables below for which implementation is to be overwritten + + def get_lpmode(self): + if self.sfp_type == "QSFP28": + return super().get_lpmode() + else: + return False + + def set_lpmode(self, lpmode): + if self.sfp_type == "QSFP28": + return super().set_lpmode(lpmode) + else: + return False + + def reset(self): + if self.sfp_type == "QSFP28": + return super().reset() + else: + return False + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + + return self.SFP_STATUS_OK diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/thermal.py new file mode 100644 index 000000000000..77d6ec7ae886 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform/thermal.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_thermal import PddfThermal +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + + +class Thermal(PddfThermal): + """PDDF Platform-Specific Thermal class""" + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform_setup.py new file mode 100644 index 000000000000..c0a485320cb7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/sonic_platform_setup.py @@ -0,0 +1,27 @@ +from setuptools import setup + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on ufispace platform', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='Jason Tsai', + maintainer_email='jason.cy.tsai@ufispace.com', + packages=['sonic_platform'], + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_device_create.sh b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_device_create.sh new file mode 100755 index 000000000000..4a55252ea936 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_device_create.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +#disable bmc watchdog +echo "Disable BMC watchdog" +timeout 3 ipmitool mc watchdog off + +pddf_ledutil setstatusled SYNC_LED off +pddf_ledutil setstatusled SYS_LED off +pddf_ledutil setstatusled ID_LED off + +#set status led to green to indicate platform init done +curr_led=$(pddf_ledutil getstatusled SYS_LED) +pddf_ledutil setstatusled SYS_LED green +echo "Set SYS_LED from $curr_led to green" + +echo "PDDF device post-create completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_driver_install.sh new file mode 100755 index 000000000000..ed2559977e42 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_post_driver_install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "PDDF driver post-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_pre_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_pre_driver_install.sh new file mode 100755 index 000000000000..9ada6c235c48 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_pre_driver_install.sh @@ -0,0 +1,8 @@ +#!/bin/bash +#rmmod gpio_ich +if [ ! -f /tmp/._pddf_pre_driver_init_completion ]; then + rmmod i2c_i801 + rmmod i2c_ismt + date > /tmp/._pddf_pre_driver_init_completion +fi +echo "PDDF driver pre-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_switch_svc.py b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_switch_svc.py new file mode 100755 index 000000000000..ca34fe9442c9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pddf_switch_svc.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# Script to stop and start the respective platforms default services. +# This will be used while switching the pddf->non-pddf mode and vice versa +import commands + +def check_pddf_support(): + return True + +def stop_platform_svc(): + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py deinit") + if status: + print "platform_utility.py deinit command failed %d"%status + return False + + # HACK , stop the pddf-platform-init service if it is active + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service along with other platform serives failed %d"%status + return False + + return True + +def start_platform_svc(): + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py init") + if status: + print "platform_utility.py init command failed %d"%status + return False + + return True + +def start_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") + if status: + print "Start pddf-platform-init.service failed %d"%status + return False + + return True + +def stop_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service failed %d"%status + return False + + return True + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pre_pddf_init.sh b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pre_pddf_init.sh new file mode 100755 index 000000000000..63a2e205808e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s8901-54xc/utils/pre_pddf_init.sh @@ -0,0 +1,5 @@ +#!/bin/bash +#rmmod gpio_ich +modprobe -rq i2c_i801 +modprobe -rq i2c_smbus +echo "Pre PDDF init steps completed successully" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/Makefile b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/Makefile new file mode 100644 index 000000000000..93d0f3e46fdb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/Makefile @@ -0,0 +1,6 @@ + +MODULE_NAME = x86-64-ufispace-s9110-32x-cpld.o x86-64-ufispace-s9110-32x-sys-eeprom.o x86-64-ufispace-s9110-32x-lpc.o pddf_custom_sysstatus_module.o +obj-m := $(MODULE_NAME) + +CFLAGS_pddf_custom_sysstatus_module.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/pddf_custom_sysstatus_module.c b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/pddf_custom_sysstatus_module.c new file mode 100644 index 000000000000..35a032f4277e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/pddf_custom_sysstatus_module.c @@ -0,0 +1,274 @@ +/* + * Copyright 2019 Broadcom. + * The term ��Broadcom�� refers to Broadcom Inc. and/or its subsidiaries. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * A pddf kernel module for system status registers + */ + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../../pddf/i2c/modules/include/pddf_client_defs.h" +#include "../../../../pddf/i2c/modules/include/pddf_sysstatus_defs.h" + + +SYSSTATUS_DATA sysstatus_data = {0}; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf); +ssize_t store_sysstatus_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + + +PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, + (void*)&sysstatus_data.sysstatus_addr_attr.aname, NULL); +PDDF_DATA_ATTR(attr_devaddr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.devaddr , NULL); +PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.offset, NULL); +PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.mask , NULL); +PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.len , NULL); +PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&sysstatus_data, NULL); + + + +static struct attribute *sysstatus_addr_attributes[] = { + &attr_attr_name.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + NULL +}; + +PDDF_DATA_ATTR(board_sku_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_hw_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_deph_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(board_build_id , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_major_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_minor_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld1_build , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_major_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_minor_ver, S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(cpld2_build , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(psu_status , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_psu , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_sys , S_IWUSR|S_IRUGO, show_sysstatus_data, store_sysstatus_data, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_fan , S_IRUGO, show_sysstatus_data, NULL, PDDF_UCHAR, sizeof(u8), NULL, NULL); +PDDF_DATA_ATTR(system_led_id , S_IWUSR|S_IRUGO, show_sysstatus_data, store_sysstatus_data, PDDF_UCHAR, sizeof(u8), NULL, NULL); + +static struct attribute *sysstatus_data_attributes[] = { + &attr_board_sku_id.dev_attr.attr, + &attr_board_hw_id.dev_attr.attr, + &attr_board_deph_id.dev_attr.attr, + &attr_board_build_id.dev_attr.attr, + &attr_cpld1_major_ver.dev_attr.attr, + &attr_cpld1_minor_ver.dev_attr.attr, + &attr_cpld1_build.dev_attr.attr, + &attr_cpld2_major_ver.dev_attr.attr, + &attr_cpld2_minor_ver.dev_attr.attr, + &attr_cpld2_build.dev_attr.attr, + &attr_psu_status.dev_attr.attr, + &attr_system_led_psu.dev_attr.attr, + &attr_system_led_sys.dev_attr.attr, + &attr_system_led_fan.dev_attr.attr, + &attr_system_led_id.dev_attr.attr, + NULL +}; + + +static const struct attribute_group pddf_sysstatus_addr_group = { + .attrs = sysstatus_addr_attributes, +}; + + +static const struct attribute_group pddf_sysstatus_data_group = { + .attrs = sysstatus_data_attributes, +}; + + +static struct kobject *sysstatus_addr_kobj; +static struct kobject *sysstatus_data_kobj; + + + +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf) +{ + + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + SYSSTATUS_DATA *data = &sysstatus_data; + struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; + int i, status ; + + + for (i=0;isysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) + { + sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; + + } + } + + if (sysstatus_addr_attrs==NULL ) + { + printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); + status = 0; + } + else + { + status = board_i2c_cpld_read( sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset); + } + + return sprintf(buf, "0x%x\n", (status&sysstatus_addr_attrs->mask)); + +} + +ssize_t store_sysstatus_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + SYSSTATUS_DATA *data = &sysstatus_data; + struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; + int i, status ; + u8 reg_val; + + for (i=0;isysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) + { + sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; + } + } + + if (sysstatus_addr_attrs==NULL) + { + printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); + return -EINVAL; + } + else + { + if (kstrtou8(buf, 0, ®_val) < 0) + return -EINVAL; + + status = board_i2c_cpld_write(sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset, reg_val); + + if (status!=0) + { + printk(KERN_DEBUG "store_sysstatus_data() %s failed, status=%d\n",data->sysstatus_addr_attrs[i].aname, status); + return status; + } + } + + return count; +} + + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + SYSSTATUS_DATA *pdata = (SYSSTATUS_DATA *)(ptr->addr); + + pdata->sysstatus_addr_attrs[pdata->len] = pdata->sysstatus_addr_attr; + pdata->len++; + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Populating the data for %s\n", __FUNCTION__, pdata->sysstatus_addr_attr.aname); + +#ifdef __STDC_LIB_EXT1__ + memset_s(&pdata->sysstatus_addr_attr, sizeof(pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); +#else + memset(&pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); +#endif + + return count; +} + + + + +int __init sysstatus_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + sysstatus_addr_kobj = kobject_create_and_add("sysstatus", device_kobj); + if(!sysstatus_addr_kobj) + return -ENOMEM; + + sysstatus_data_kobj = kobject_create_and_add("sysstatus_data", sysstatus_addr_kobj); + if(!sysstatus_data_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + if (ret) + { + kobject_put(sysstatus_addr_kobj); + return ret; + } + + ret = sysfs_create_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + if (ret) + { + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + return ret; + } + + + return ret; +} + +void __exit sysstatus_data_exit(void) +{ + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. exit\n"); + sysfs_remove_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Removed the kobjects for 'SYSSTATUS'\n",__FUNCTION__); + return; +} + +module_init(sysstatus_data_init); +module_exit(sysstatus_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("SYSSTATUS platform data"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.c b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.c new file mode 100644 index 000000000000..af54108ee1b3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.c @@ -0,0 +1,1475 @@ +/* + * A i2c cpld driver for the ufispace_s9110_32x + * + * Copyright (C) 2022 UfiSpace Technology Corporation. + * Nonodark Huang + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "x86-64-ufispace-s9110-32x-cpld.h" + +#if !defined(SENSOR_DEVICE_ATTR_RO) +#define SENSOR_DEVICE_ATTR_RO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, 0444, _func##_show, NULL, _index) +#endif + +#if !defined(SENSOR_DEVICE_ATTR_RW) +#define SENSOR_DEVICE_ATTR_RW(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, 0644, _func##_show, _func##_store, _index) + +#endif + +#if !defined(SENSOR_DEVICE_ATTR_WO) +#define SENSOR_DEVICE_ATTR_WO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, 0200, NULL, _func##_store, _index) +#endif + + +#ifdef DEBUG +#define DEBUG_PRINT(fmt, args...) \ + printk(KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#else +#define DEBUG_PRINT(fmt, args...) +#endif + +#define BSP_LOG_R(fmt, args...) \ + _bsp_log (LOG_READ, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_LOG_W(fmt, args...) \ + _bsp_log (LOG_WRITE, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) + +#define I2C_READ_BYTE_DATA(ret, lock, i2c_client, reg) \ +{ \ + mutex_lock(lock); \ + ret = i2c_smbus_read_byte_data(i2c_client, reg); \ + mutex_unlock(lock); \ + BSP_LOG_R("cpld[%d], reg=0x%03x, reg_val=0x%02x", data->index, reg, ret); \ +} + +#define I2C_WRITE_BYTE_DATA(ret, lock, i2c_client, reg, val) \ +{ \ + mutex_lock(lock); \ + ret = i2c_smbus_write_byte_data(i2c_client, reg, val); \ + mutex_unlock(lock); \ + BSP_LOG_W("cpld[%d], reg=0x%03x, reg_val=0x%02x", data->index, reg, val); \ +} + +#define _DEVICE_ATTR(_name) \ + &sensor_dev_attr_##_name.dev_attr.attr + + +/* CPLD sysfs attributes index */ +enum cpld_sysfs_attributes { + //CPLD 1 & CPLD 2 + CPLD_MAJOR_VER, + CPLD_MINOR_VER, + CPLD_ID, + CPLD_BUILD, + CPLD_VERSION_H, + CPLD_CHIP, + CPLD_EVT_CTRL, + + //CPLD 1 + CPLD_BOARD_ID_0, + CPLD_BOARD_ID_1, + CPLD_SKU_EXT, + + CPLD_MAC_INTR, + CPLD_HWM_INTR, + CPLD_CPLD2_INTR, + CPLD_PTP_INTR, + CPLD_SYSTEM_INTR, + + CPLD_MAC_MASK, + CPLD_HWM_MASK, + CPLD_CPLD2_MASK, + CPLD_PTP_MASK, + CPLD_SYSTEM_MASK, + + CPLD_MAC_EVT, + CPLD_HWM_EVT, + CPLD_CPLD2_EVT, + + CPLD_MAC_RESET, + CPLD_SYSTEM_RESET, + CPLD_BMC_NTM_RESET, + CPLD_USB_RESET, + CPLD_I2C_MUX_RESET, + CPLD_MISC_RESET, + + CPLD_BRD_PRESENT, + CPLD_PSU_STATUS, + CPLD_SYSTEM_PWR, + CPLD_MAC_SYNCE, + CPLD_MAC_AVS, + CPLD_SYSTEM_STATUS, + CPLD_WATCHDOG, + CPLD_BOOT_SELECT, + CPLD_MUX_CTRL, + CPLD_MISC_CTRL_1, + CPLD_MISC_CTRL_2, + CPLD_MAC_TEMP, + + CPLD_SYSTEM_LED_PSU, + CPLD_SYSTEM_LED_SYS, + CPLD_SYSTEM_LED_FAN, + CPLD_SYSTEM_LED_ID, + + DBG_CPLD_MAC_INTR, + DBG_CPLD_HWM_INTR, + DBG_CPLD_CPLD2_INTR, + DBG_CPLD_PTP_INTR, + + //CPLD 2 + CPLD_QSFP_ABS_0_7, + CPLD_QSFP_ABS_8_15, + CPLD_QSFP_ABS_16_23, + CPLD_QSFP_ABS_24_31, + + CPLD_QSFP_INTR_0_7, + CPLD_QSFP_INTR_8_15, + CPLD_QSFP_INTR_16_23, + CPLD_QSFP_INTR_24_31, + + CPLD_SFP_ABS_0_1, + CPLD_SFP_RXLOS_0_1, + CPLD_SFP_TXFLT_0_1, + + CPLD_QSFP_MASK_ABS_0_7, + CPLD_QSFP_MASK_ABS_8_15, + CPLD_QSFP_MASK_ABS_16_23, + CPLD_QSFP_MASK_ABS_24_31, + + CPLD_QSFP_MASK_INTR_0_7, + CPLD_QSFP_MASK_INTR_8_15, + CPLD_QSFP_MASK_INTR_16_23, + CPLD_QSFP_MASK_INTR_24_31, + + CPLD_SFP_MASK_ABS_0_1, + CPLD_SFP_MASK_RXLOS_0_1, + CPLD_SFP_MASK_TXFLT_0_1, + + CPLD_QSFP_EVT_ABS_0_7, + CPLD_QSFP_EVT_ABS_8_15, + CPLD_QSFP_EVT_ABS_16_23, + CPLD_QSFP_EVT_ABS_24_31, + + CPLD_QSFP_EVT_INTR_0_7, + CPLD_QSFP_EVT_INTR_8_15, + CPLD_QSFP_EVT_INTR_16_23, + CPLD_QSFP_EVT_INTR_24_31, + + CPLD_SFP_EVT_ABS_0_1, + CPLD_SFP_EVT_RXLOS_0_1, + CPLD_SFP_EVT_TXFLT_0_1, + + CPLD_QSFP_RESET_0_7, + CPLD_QSFP_RESET_8_15, + CPLD_QSFP_RESET_16_23, + CPLD_QSFP_RESET_24_31, + + CPLD_QSFP_LPMODE_0_7, + CPLD_QSFP_LPMODE_8_15, + CPLD_QSFP_LPMODE_16_23, + CPLD_QSFP_LPMODE_24_31, + + CPLD_SFP_TXDIS_0_1, + CPLD_SFP_TS_0_1, + CPLD_SFP_RS_0_1, + + DBG_CPLD_QSFP_ABS_0_7, + DBG_CPLD_QSFP_ABS_8_15, + DBG_CPLD_QSFP_ABS_16_23, + DBG_CPLD_QSFP_ABS_24_31, + + DBG_CPLD_QSFP_INTR_0_7, + DBG_CPLD_QSFP_INTR_8_15, + DBG_CPLD_QSFP_INTR_16_23, + DBG_CPLD_QSFP_INTR_24_31, + + DBG_CPLD_SFP_ABS_0_1, + DBG_CPLD_SFP_RXLOS_0_1, + DBG_CPLD_SFP_TXFLT_0_1, + + //BSP DEBUG + BSP_DEBUG +}; + +enum data_type { + DATA_HEX, + DATA_DEC, + DATA_UNK, +}; + +typedef struct { + u8 reg; + u8 mask; + u8 data_type; +} attr_reg_map_t; + +static attr_reg_map_t attr_reg[]= { + + //CPLD 1 & CPLD 2 + [CPLD_MAJOR_VER] = {CPLD_VERSION_REG , MASK_1100_0000, DATA_DEC}, + [CPLD_MINOR_VER] = {CPLD_VERSION_REG , MASK_0011_1111, DATA_DEC}, + [CPLD_ID] = {CPLD_ID_REG , MASK_0000_0111, DATA_DEC}, + [CPLD_BUILD] = {CPLD_BUILD_REG , MASK_ALL , DATA_DEC}, + [CPLD_VERSION_H] = {CPLD_NONE_REG , MASK_NONE , DATA_UNK}, + [CPLD_CHIP] = {CPLD_CHIP_REG , MASK_ALL , DATA_HEX}, + [CPLD_EVT_CTRL] = {CPLD_EVT_CTRL_REG , MASK_ALL , DATA_HEX}, + + //CPLD 1 + [CPLD_BOARD_ID_0] = {CPLD_BOARD_ID_0_REG , MASK_ALL , DATA_HEX}, + [CPLD_BOARD_ID_1] = {CPLD_BOARD_ID_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SKU_EXT] = {CPLD_SKU_EXT_REG , MASK_ALL , DATA_DEC}, + + [CPLD_MAC_INTR] = {CPLD_MAC_INTR_REG , MASK_ALL , DATA_HEX}, + [CPLD_HWM_INTR] = {CPLD_HWM_INTR_REG , MASK_ALL , DATA_HEX}, + [CPLD_CPLD2_INTR] = {CPLD_CPLD2_INTR_REG , MASK_ALL , DATA_HEX}, + [CPLD_PTP_INTR] = {CPLD_PTP_INTR_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_INTR] = {CPLD_SYSTEM_INTR_REG , MASK_ALL , DATA_HEX}, + + [CPLD_MAC_MASK] = {CPLD_MAC_MASK_REG , MASK_ALL , DATA_HEX}, + [CPLD_HWM_MASK] = {CPLD_HWM_MASK_REG , MASK_ALL , DATA_HEX}, + [CPLD_CPLD2_MASK] = {CPLD_CPLD2_MASK_REG , MASK_ALL , DATA_HEX}, + [CPLD_PTP_MASK] = {CPLD_PTP_MASK_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_MASK] = {CPLD_SYSTEM_MASK_REG , MASK_ALL , DATA_HEX}, + + [CPLD_MAC_EVT] = {CPLD_MAC_EVT_REG , MASK_ALL , DATA_HEX}, + [CPLD_HWM_EVT] = {CPLD_HWM_EVT_REG , MASK_ALL , DATA_HEX}, + [CPLD_CPLD2_EVT] = {CPLD_CPLD2_EVT_REG , MASK_ALL , DATA_HEX}, + + [CPLD_MAC_RESET] = {CPLD_MAC_RESET_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_RESET] = {CPLD_SYSTEM_RESET_REG , MASK_ALL , DATA_HEX}, + [CPLD_BMC_NTM_RESET] = {CPLD_BMC_NTM_RESET_REG , MASK_ALL , DATA_HEX}, + [CPLD_USB_RESET] = {CPLD_USB_RESET_REG , MASK_ALL , DATA_HEX}, + [CPLD_I2C_MUX_RESET] = {CPLD_I2C_MUX_RESET_REG , MASK_ALL , DATA_HEX}, + [CPLD_MISC_RESET] = {CPLD_MISC_RESET_REG , MASK_ALL , DATA_HEX}, + + [CPLD_BRD_PRESENT] = {CPLD_BRD_PRESENT_REG , MASK_ALL , DATA_HEX}, + [CPLD_PSU_STATUS] = {CPLD_PSU_STATUS_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_PWR] = {CPLD_SYSTEM_PWR_REG , MASK_ALL , DATA_HEX}, + [CPLD_MAC_SYNCE] = {CPLD_MAC_SYNCE_REG , MASK_ALL , DATA_HEX}, + [CPLD_MAC_AVS] = {CPLD_MAC_AVS_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_STATUS] = {CPLD_SYSTEM_STATUS_REG , MASK_ALL , DATA_HEX}, + [CPLD_WATCHDOG] = {CPLD_WATCHDOG_REG , MASK_ALL , DATA_HEX}, + [CPLD_BOOT_SELECT] = {CPLD_BOOT_SELECT_REG , MASK_ALL , DATA_HEX}, + [CPLD_MUX_CTRL] = {CPLD_MUX_CTRL_REG , MASK_ALL , DATA_HEX}, + [CPLD_MISC_CTRL_1] = {CPLD_MISC_CTRL_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_MISC_CTRL_2] = {CPLD_MISC_CTRL_2_REG , MASK_ALL , DATA_HEX}, + [CPLD_MAC_TEMP] = {CPLD_MAC_TEMP_REG , MASK_ALL , DATA_HEX}, + + [CPLD_SYSTEM_LED_PSU] = {CPLD_SYSTEM_LED_PSU_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_LED_SYS] = {CPLD_SYSTEM_LED_SYS_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_LED_FAN] = {CPLD_SYSTEM_LED_FAN_REG , MASK_ALL , DATA_HEX}, + [CPLD_SYSTEM_LED_ID] = {CPLD_SYSTEM_LED_ID_REG , MASK_ALL , DATA_HEX}, + + [DBG_CPLD_MAC_INTR] = {DBG_CPLD_MAC_INTR_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_HWM_INTR] = {DBG_CPLD_HWM_INTR_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_CPLD2_INTR] = {DBG_CPLD_CPLD2_INTR_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_PTP_INTR] = {DBG_CPLD_PTP_INTR_REG , MASK_ALL , DATA_HEX}, + + //CPLD 2 + [CPLD_QSFP_ABS_0_7] = {CPLD_QSFP_ABS_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_ABS_8_15] = {CPLD_QSFP_ABS_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_ABS_16_23] = {CPLD_QSFP_ABS_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_ABS_24_31] = {CPLD_QSFP_ABS_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_QSFP_INTR_0_7] = {CPLD_QSFP_INTR_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_INTR_8_15] = {CPLD_QSFP_INTR_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_INTR_16_23] = {CPLD_QSFP_INTR_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_INTR_24_31] = {CPLD_QSFP_INTR_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_SFP_ABS_0_1] = {CPLD_SFP_ABS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_RXLOS_0_1] = {CPLD_SFP_RXLOS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_TXFLT_0_1] = {CPLD_SFP_TXFLT_0_1_REG , MASK_ALL , DATA_HEX}, + + [CPLD_QSFP_MASK_ABS_0_7] = {CPLD_QSFP_MASK_ABS_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_MASK_ABS_8_15] = {CPLD_QSFP_MASK_ABS_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_MASK_ABS_16_23] = {CPLD_QSFP_MASK_ABS_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_MASK_ABS_24_31] = {CPLD_QSFP_MASK_ABS_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_QSFP_MASK_INTR_0_7] = {CPLD_QSFP_MASK_INTR_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_MASK_INTR_8_15] = {CPLD_QSFP_MASK_INTR_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_MASK_INTR_16_23]= {CPLD_QSFP_MASK_INTR_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_MASK_INTR_24_31]= {CPLD_QSFP_MASK_INTR_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_SFP_MASK_ABS_0_1] = {CPLD_SFP_MASK_ABS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_MASK_RXLOS_0_1] = {CPLD_SFP_MASK_RXLOS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_MASK_TXFLT_0_1] = {CPLD_SFP_MASK_TXFLT_0_1_REG , MASK_ALL , DATA_HEX}, + + [CPLD_QSFP_EVT_ABS_0_7] = {CPLD_QSFP_EVT_ABS_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_EVT_ABS_8_15] = {CPLD_QSFP_EVT_ABS_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_EVT_ABS_16_23] = {CPLD_QSFP_EVT_ABS_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_EVT_ABS_24_31] = {CPLD_QSFP_EVT_ABS_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_QSFP_EVT_INTR_0_7] = {CPLD_QSFP_EVT_INTR_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_EVT_INTR_8_15] = {CPLD_QSFP_EVT_INTR_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_EVT_INTR_16_23] = {CPLD_QSFP_EVT_INTR_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_EVT_INTR_24_31] = {CPLD_QSFP_EVT_INTR_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_SFP_EVT_ABS_0_1] = {CPLD_SFP_EVT_ABS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_EVT_RXLOS_0_1] = {CPLD_SFP_EVT_RXLOS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_EVT_TXFLT_0_1] = {CPLD_SFP_EVT_TXFLT_0_1_REG , MASK_ALL , DATA_HEX}, + + [CPLD_QSFP_RESET_0_7] = {CPLD_QSFP_RESET_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_RESET_8_15] = {CPLD_QSFP_RESET_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_RESET_16_23] = {CPLD_QSFP_RESET_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_RESET_24_31] = {CPLD_QSFP_RESET_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_QSFP_LPMODE_0_7] = {CPLD_QSFP_LPMODE_0_7_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_LPMODE_8_15] = {CPLD_QSFP_LPMODE_8_15_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_LPMODE_16_23] = {CPLD_QSFP_LPMODE_16_23_REG , MASK_ALL , DATA_HEX}, + [CPLD_QSFP_LPMODE_24_31] = {CPLD_QSFP_LPMODE_24_31_REG , MASK_ALL , DATA_HEX}, + + [CPLD_SFP_TXDIS_0_1] = {CPLD_SFP_TXDIS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_TS_0_1] = {CPLD_SFP_TS_0_1_REG , MASK_ALL , DATA_HEX}, + [CPLD_SFP_RS_0_1] = {CPLD_SFP_RS_0_1_REG , MASK_ALL , DATA_HEX}, + + [DBG_CPLD_QSFP_ABS_0_7] = {DBG_CPLD_QSFP_ABS_0_7_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_QSFP_ABS_8_15] = {DBG_CPLD_QSFP_ABS_8_15_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_QSFP_ABS_16_23] = {DBG_CPLD_QSFP_ABS_16_23_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_QSFP_ABS_24_31] = {DBG_CPLD_QSFP_ABS_24_31_REG , MASK_ALL , DATA_HEX}, + + [DBG_CPLD_QSFP_INTR_0_7] = {DBG_CPLD_QSFP_INTR_0_7_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_QSFP_INTR_8_15] = {DBG_CPLD_QSFP_INTR_8_15_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_QSFP_INTR_16_23] = {DBG_CPLD_QSFP_INTR_16_23_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_QSFP_INTR_24_31] = {DBG_CPLD_QSFP_INTR_24_31_REG , MASK_ALL , DATA_HEX}, + + [DBG_CPLD_SFP_ABS_0_1] = {DBG_CPLD_SFP_ABS_0_1_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_SFP_RXLOS_0_1] = {DBG_CPLD_SFP_RXLOS_0_1_REG , MASK_ALL , DATA_HEX}, + [DBG_CPLD_SFP_TXFLT_0_1] = {DBG_CPLD_SFP_TXFLT_0_1_REG , MASK_ALL , DATA_HEX}, + + //BSP DEBUG + [BSP_DEBUG] = {CPLD_NONE_REG , MASK_NONE , DATA_UNK}, +}; + +enum bsp_log_types { + LOG_NONE, + LOG_RW, + LOG_READ, + LOG_WRITE +}; + +enum bsp_log_ctrl { + LOG_DISABLE, + LOG_ENABLE +}; + +/* CPLD sysfs attributes hook functions */ +static ssize_t cpld_show(struct device *dev, + struct device_attribute *da, char *buf); +static ssize_t cpld_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count); +static u8 _cpld_reg_read(struct device *dev, u8 reg, u8 mask); +static ssize_t cpld_reg_read(struct device *dev, char *buf, u8 reg, u8 mask, u8 data_type); +static ssize_t cpld_reg_write(struct device *dev, const char *buf, size_t count, u8 reg, u8 mask); +static ssize_t bsp_read(char *buf, char *str); +static ssize_t bsp_write(const char *buf, char *str, size_t str_len, size_t count); +static ssize_t bsp_callback_show(struct device *dev, + struct device_attribute *da, char *buf); +static ssize_t bsp_callback_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count); +static ssize_t cpld_version_h_show(struct device *dev, + struct device_attribute *da, + char *buf); + +static LIST_HEAD(cpld_client_list); /* client list for cpld */ +static struct mutex list_lock; /* mutex for client list */ + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +struct cpld_data { + int index; /* CPLD index */ + struct mutex access_lock; /* mutex for cpld access */ + u8 access_reg; /* register to access */ +}; + +/* CPLD device id and data */ +static const struct i2c_device_id cpld_id[] = { + { "s9110_32x_cpld1", cpld1 }, + { "s9110_32x_cpld2", cpld2 }, + {} +}; + +char bsp_debug[2]="0"; +u8 enable_log_read=LOG_DISABLE; +u8 enable_log_write=LOG_DISABLE; + +/* Addresses scanned for cpld */ +static const unsigned short cpld_i2c_addr[] = { 0x30, 0x31, I2C_CLIENT_END }; + +/* define all support register access of cpld in attribute */ + +// CPLD 1 & CPLD2 +static SENSOR_DEVICE_ATTR_RO(cpld_major_ver , cpld, CPLD_MAJOR_VER); +static SENSOR_DEVICE_ATTR_RO(cpld_minor_ver , cpld, CPLD_MINOR_VER); +static SENSOR_DEVICE_ATTR_RO(cpld_id , cpld, CPLD_ID); +static SENSOR_DEVICE_ATTR_RO(cpld_build , cpld, CPLD_BUILD); +static SENSOR_DEVICE_ATTR_RO(cpld_version_h , cpld_version_h, CPLD_VERSION_H); +static SENSOR_DEVICE_ATTR_RO(cpld_chip , cpld, CPLD_CHIP); +static SENSOR_DEVICE_ATTR_RW(cpld_evt_ctrl , cpld, CPLD_EVT_CTRL); + +//CPLD 1 +static SENSOR_DEVICE_ATTR_RO(cpld_board_id_0 , cpld, CPLD_BOARD_ID_0); +static SENSOR_DEVICE_ATTR_RO(cpld_board_id_1 , cpld, CPLD_BOARD_ID_1); +static SENSOR_DEVICE_ATTR_RO(cpld_sku_ext , cpld, CPLD_SKU_EXT); + +static SENSOR_DEVICE_ATTR_RO(cpld_mac_intr , cpld, CPLD_MAC_INTR); +static SENSOR_DEVICE_ATTR_RO(cpld_hwm_intr , cpld, CPLD_HWM_INTR); +static SENSOR_DEVICE_ATTR_RO(cpld_cpld2_intr , cpld, CPLD_CPLD2_INTR); +static SENSOR_DEVICE_ATTR_RO(cpld_ptp_intr , cpld, CPLD_PTP_INTR); +static SENSOR_DEVICE_ATTR_RO(cpld_system_intr , cpld, CPLD_SYSTEM_INTR); + +static SENSOR_DEVICE_ATTR_RW(cpld_mac_mask , cpld, CPLD_MAC_MASK); +static SENSOR_DEVICE_ATTR_RW(cpld_hwm_mask , cpld, CPLD_HWM_MASK); +static SENSOR_DEVICE_ATTR_RW(cpld_cpld2_mask , cpld, CPLD_CPLD2_MASK); +static SENSOR_DEVICE_ATTR_RW(cpld_ptp_mask , cpld, CPLD_PTP_MASK); +static SENSOR_DEVICE_ATTR_RW(cpld_system_mask , cpld, CPLD_SYSTEM_MASK); + +static SENSOR_DEVICE_ATTR_RO(cpld_mac_evt , cpld, CPLD_MAC_EVT); +static SENSOR_DEVICE_ATTR_RO(cpld_hwm_evt , cpld, CPLD_HWM_EVT); +static SENSOR_DEVICE_ATTR_RO(cpld_cpld2_evt , cpld, CPLD_CPLD2_EVT); + +static SENSOR_DEVICE_ATTR_RW(cpld_mac_reset , cpld, CPLD_MAC_RESET); +static SENSOR_DEVICE_ATTR_RW(cpld_system_reset , cpld, CPLD_SYSTEM_RESET); +static SENSOR_DEVICE_ATTR_RW(cpld_bmc_ntm_reset , cpld, CPLD_BMC_NTM_RESET); +static SENSOR_DEVICE_ATTR_RW(cpld_usb_reset , cpld, CPLD_USB_RESET); +static SENSOR_DEVICE_ATTR_RW(cpld_i2c_mux_reset , cpld, CPLD_I2C_MUX_RESET); +static SENSOR_DEVICE_ATTR_RW(cpld_misc_reset , cpld, CPLD_MISC_RESET); + +static SENSOR_DEVICE_ATTR_RO(cpld_brd_present , cpld, CPLD_BRD_PRESENT); +static SENSOR_DEVICE_ATTR_RO(cpld_psu_status , cpld, CPLD_PSU_STATUS); +static SENSOR_DEVICE_ATTR_RO(cpld_system_pwr , cpld, CPLD_SYSTEM_PWR); +static SENSOR_DEVICE_ATTR_RO(cpld_mac_synce , cpld, CPLD_MAC_SYNCE); +static SENSOR_DEVICE_ATTR_RO(cpld_mac_avs , cpld, CPLD_MAC_AVS); +static SENSOR_DEVICE_ATTR_RO(cpld_system_status , cpld, CPLD_SYSTEM_STATUS); +static SENSOR_DEVICE_ATTR_RO(cpld_watchdog , cpld, CPLD_WATCHDOG); +static SENSOR_DEVICE_ATTR_RW(cpld_boot_select , cpld, CPLD_BOOT_SELECT); +static SENSOR_DEVICE_ATTR_RW(cpld_mux_ctrl , cpld, CPLD_MUX_CTRL); +static SENSOR_DEVICE_ATTR_RW(cpld_misc_ctrl_1 , cpld, CPLD_MISC_CTRL_1); +static SENSOR_DEVICE_ATTR_RW(cpld_misc_ctrl_2 , cpld, CPLD_MISC_CTRL_2); +static SENSOR_DEVICE_ATTR_RO(cpld_mac_temp , cpld, CPLD_MAC_TEMP); + +static SENSOR_DEVICE_ATTR_RO(cpld_system_led_psu , cpld, CPLD_SYSTEM_LED_PSU); +static SENSOR_DEVICE_ATTR_RW(cpld_system_led_sys , cpld, CPLD_SYSTEM_LED_SYS); +static SENSOR_DEVICE_ATTR_RO(cpld_system_led_fan , cpld, CPLD_SYSTEM_LED_FAN); +static SENSOR_DEVICE_ATTR_RW(cpld_system_led_id , cpld, CPLD_SYSTEM_LED_ID); + +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_mac_intr , cpld, DBG_CPLD_MAC_INTR); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_hwm_intr , cpld, DBG_CPLD_HWM_INTR); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_cpld2_intr , cpld, DBG_CPLD_CPLD2_INTR); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_ptp_intr , cpld, DBG_CPLD_PTP_INTR); + +//CPLD 2 +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_abs_0_7 , cpld, CPLD_QSFP_ABS_0_7); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_abs_8_15 , cpld, CPLD_QSFP_ABS_8_15); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_abs_16_23 , cpld, CPLD_QSFP_ABS_16_23); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_abs_24_31 , cpld, CPLD_QSFP_ABS_24_31); + +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_0_7 , cpld, CPLD_QSFP_INTR_0_7); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_8_15 , cpld, CPLD_QSFP_INTR_8_15); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_16_23 , cpld, CPLD_QSFP_INTR_16_23); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_intr_24_31 , cpld, CPLD_QSFP_INTR_24_31); + +static SENSOR_DEVICE_ATTR_RO(cpld_sfp_abs_0_1 , cpld, CPLD_SFP_ABS_0_1); +static SENSOR_DEVICE_ATTR_RO(cpld_sfp_rxlos_0_1 , cpld, CPLD_SFP_RXLOS_0_1); +static SENSOR_DEVICE_ATTR_RO(cpld_sfp_txflt_0_1 , cpld, CPLD_SFP_TXFLT_0_1); + +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_abs_0_7 , cpld, CPLD_QSFP_MASK_ABS_0_7); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_abs_8_15 , cpld, CPLD_QSFP_MASK_ABS_8_15); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_abs_16_23 , cpld, CPLD_QSFP_MASK_ABS_16_23); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_abs_24_31 , cpld, CPLD_QSFP_MASK_ABS_24_31); + +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_intr_0_7 , cpld, CPLD_QSFP_MASK_INTR_0_7); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_intr_8_15 , cpld, CPLD_QSFP_MASK_INTR_8_15); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_intr_16_23, cpld, CPLD_QSFP_MASK_INTR_16_23); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_mask_intr_24_31, cpld, CPLD_QSFP_MASK_INTR_24_31); + +static SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_abs_0_1 , cpld, CPLD_SFP_MASK_ABS_0_1); +static SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_rxlos_0_1 , cpld, CPLD_SFP_MASK_RXLOS_0_1); +static SENSOR_DEVICE_ATTR_RW(cpld_sfp_mask_txflt_0_1 , cpld, CPLD_SFP_MASK_TXFLT_0_1); + +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_abs_0_7 , cpld, CPLD_QSFP_EVT_ABS_0_7); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_abs_8_15 , cpld, CPLD_QSFP_EVT_ABS_8_15); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_abs_16_23 , cpld, CPLD_QSFP_EVT_ABS_16_23); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_abs_24_31 , cpld, CPLD_QSFP_EVT_ABS_24_31); + +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_intr_0_7 , cpld, CPLD_QSFP_EVT_INTR_0_7); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_intr_8_15 , cpld, CPLD_QSFP_EVT_INTR_8_15); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_intr_16_23 , cpld, CPLD_QSFP_EVT_INTR_16_23); +static SENSOR_DEVICE_ATTR_RO(cpld_qsfp_evt_intr_24_31 , cpld, CPLD_QSFP_EVT_INTR_24_31); + +static SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_abs_0_1 , cpld, CPLD_SFP_EVT_ABS_0_1); +static SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_rxlos_0_1 , cpld, CPLD_SFP_EVT_RXLOS_0_1); +static SENSOR_DEVICE_ATTR_RO(cpld_sfp_evt_txflt_0_1 , cpld, CPLD_SFP_EVT_TXFLT_0_1); + +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_reset_0_7 , cpld, CPLD_QSFP_RESET_0_7); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_reset_8_15 , cpld, CPLD_QSFP_RESET_8_15); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_reset_16_23 , cpld, CPLD_QSFP_RESET_16_23); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_reset_24_31 , cpld, CPLD_QSFP_RESET_24_31); + +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_lpmode_0_7 , cpld, CPLD_QSFP_LPMODE_0_7); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_lpmode_8_15 , cpld, CPLD_QSFP_LPMODE_8_15); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_lpmode_16_23 , cpld, CPLD_QSFP_LPMODE_16_23); +static SENSOR_DEVICE_ATTR_RW(cpld_qsfp_lpmode_24_31 , cpld, CPLD_QSFP_LPMODE_24_31); + +static SENSOR_DEVICE_ATTR_RW(cpld_sfp_txdis_0_1 , cpld, CPLD_SFP_TXDIS_0_1); +static SENSOR_DEVICE_ATTR_RW(cpld_sfp_ts_0_1 , cpld, CPLD_SFP_TS_0_1); +static SENSOR_DEVICE_ATTR_RW(cpld_sfp_rs_0_1 , cpld, CPLD_SFP_RS_0_1); + +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_abs_0_7 , cpld, DBG_CPLD_QSFP_ABS_0_7); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_abs_8_15 , cpld, DBG_CPLD_QSFP_ABS_8_15); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_abs_16_23 , cpld, DBG_CPLD_QSFP_ABS_16_23); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_abs_24_31 , cpld, DBG_CPLD_QSFP_ABS_24_31); + +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_intr_0_7 , cpld, DBG_CPLD_QSFP_INTR_0_7); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_intr_8_15 , cpld, DBG_CPLD_QSFP_INTR_8_15); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_intr_16_23 , cpld, DBG_CPLD_QSFP_INTR_16_23); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_qsfp_intr_24_31 , cpld, DBG_CPLD_QSFP_INTR_24_31); + +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_sfp_abs_0_1 , cpld, DBG_CPLD_SFP_ABS_0_1); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_sfp_rxlos_0_1 , cpld, DBG_CPLD_SFP_RXLOS_0_1); +static SENSOR_DEVICE_ATTR_RO(dbg_cpld_sfp_txflt_0_1 , cpld, DBG_CPLD_SFP_TXFLT_0_1); + +//BSP DEBUG +static SENSOR_DEVICE_ATTR_RW(bsp_debug , bsp_callback, BSP_DEBUG); + +/* define support attributes of cpldx */ + +/* cpld 1 */ +static struct attribute *cpld1_attributes[] = { + _DEVICE_ATTR(cpld_board_id_0), + _DEVICE_ATTR(cpld_board_id_1), + _DEVICE_ATTR(cpld_sku_ext), + + _DEVICE_ATTR(cpld_major_ver), + _DEVICE_ATTR(cpld_minor_ver), + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(cpld_build), + _DEVICE_ATTR(cpld_version_h), + _DEVICE_ATTR(cpld_chip), + + _DEVICE_ATTR(cpld_mac_intr), + _DEVICE_ATTR(cpld_hwm_intr), + _DEVICE_ATTR(cpld_cpld2_intr), + _DEVICE_ATTR(cpld_ptp_intr), + _DEVICE_ATTR(cpld_system_intr), + + _DEVICE_ATTR(cpld_mac_mask), + _DEVICE_ATTR(cpld_hwm_mask), + _DEVICE_ATTR(cpld_cpld2_mask), + _DEVICE_ATTR(cpld_ptp_mask), + _DEVICE_ATTR(cpld_system_mask), + + _DEVICE_ATTR(cpld_mac_evt), + _DEVICE_ATTR(cpld_hwm_evt), + _DEVICE_ATTR(cpld_cpld2_evt), + + _DEVICE_ATTR(cpld_evt_ctrl), + + _DEVICE_ATTR(cpld_mac_reset), + _DEVICE_ATTR(cpld_system_reset), + _DEVICE_ATTR(cpld_bmc_ntm_reset), + _DEVICE_ATTR(cpld_usb_reset), + _DEVICE_ATTR(cpld_i2c_mux_reset), + _DEVICE_ATTR(cpld_misc_reset), + + _DEVICE_ATTR(cpld_brd_present), + _DEVICE_ATTR(cpld_psu_status), + _DEVICE_ATTR(cpld_system_pwr), + _DEVICE_ATTR(cpld_mac_synce), + _DEVICE_ATTR(cpld_mac_avs), + _DEVICE_ATTR(cpld_system_status), + _DEVICE_ATTR(cpld_watchdog), + _DEVICE_ATTR(cpld_boot_select), + _DEVICE_ATTR(cpld_mux_ctrl), + _DEVICE_ATTR(cpld_misc_ctrl_1), + _DEVICE_ATTR(cpld_misc_ctrl_2), + _DEVICE_ATTR(cpld_mac_temp), + + _DEVICE_ATTR(cpld_system_led_psu), + _DEVICE_ATTR(cpld_system_led_sys), + _DEVICE_ATTR(cpld_system_led_fan), + _DEVICE_ATTR(cpld_system_led_id), + + _DEVICE_ATTR(dbg_cpld_mac_intr), + _DEVICE_ATTR(dbg_cpld_hwm_intr), + _DEVICE_ATTR(dbg_cpld_cpld2_intr), + _DEVICE_ATTR(dbg_cpld_ptp_intr), + + _DEVICE_ATTR(bsp_debug), + + NULL +}; + +/* cpld 2 */ +static struct attribute *cpld2_attributes[] = { + + _DEVICE_ATTR(cpld_major_ver), + _DEVICE_ATTR(cpld_minor_ver), + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(cpld_build), + _DEVICE_ATTR(cpld_version_h), + _DEVICE_ATTR(cpld_chip), + + _DEVICE_ATTR(cpld_qsfp_abs_0_7), + _DEVICE_ATTR(cpld_qsfp_abs_8_15), + _DEVICE_ATTR(cpld_qsfp_abs_16_23), + _DEVICE_ATTR(cpld_qsfp_abs_24_31), + + _DEVICE_ATTR(cpld_qsfp_intr_0_7), + _DEVICE_ATTR(cpld_qsfp_intr_8_15), + _DEVICE_ATTR(cpld_qsfp_intr_16_23), + _DEVICE_ATTR(cpld_qsfp_intr_24_31), + + _DEVICE_ATTR(cpld_sfp_abs_0_1), + _DEVICE_ATTR(cpld_sfp_rxlos_0_1), + _DEVICE_ATTR(cpld_sfp_txflt_0_1), + + _DEVICE_ATTR(cpld_qsfp_mask_abs_0_7), + _DEVICE_ATTR(cpld_qsfp_mask_abs_8_15), + _DEVICE_ATTR(cpld_qsfp_mask_abs_16_23), + _DEVICE_ATTR(cpld_qsfp_mask_abs_24_31), + + _DEVICE_ATTR(cpld_qsfp_mask_intr_0_7), + _DEVICE_ATTR(cpld_qsfp_mask_intr_8_15), + _DEVICE_ATTR(cpld_qsfp_mask_intr_16_23), + _DEVICE_ATTR(cpld_qsfp_mask_intr_24_31), + + _DEVICE_ATTR(cpld_sfp_mask_abs_0_1), + _DEVICE_ATTR(cpld_sfp_mask_rxlos_0_1), + _DEVICE_ATTR(cpld_sfp_mask_txflt_0_1), + + _DEVICE_ATTR(cpld_qsfp_evt_abs_0_7), + _DEVICE_ATTR(cpld_qsfp_evt_abs_8_15), + _DEVICE_ATTR(cpld_qsfp_evt_abs_16_23), + _DEVICE_ATTR(cpld_qsfp_evt_abs_24_31), + + _DEVICE_ATTR(cpld_qsfp_evt_intr_0_7), + _DEVICE_ATTR(cpld_qsfp_evt_intr_8_15), + _DEVICE_ATTR(cpld_qsfp_evt_intr_16_23), + _DEVICE_ATTR(cpld_qsfp_evt_intr_24_31), + + _DEVICE_ATTR(cpld_sfp_evt_abs_0_1), + _DEVICE_ATTR(cpld_sfp_evt_rxlos_0_1), + _DEVICE_ATTR(cpld_sfp_evt_txflt_0_1), + + _DEVICE_ATTR(cpld_evt_ctrl), + + _DEVICE_ATTR(cpld_qsfp_reset_0_7), + _DEVICE_ATTR(cpld_qsfp_reset_8_15), + _DEVICE_ATTR(cpld_qsfp_reset_16_23), + _DEVICE_ATTR(cpld_qsfp_reset_24_31), + + _DEVICE_ATTR(cpld_qsfp_lpmode_0_7), + _DEVICE_ATTR(cpld_qsfp_lpmode_8_15), + _DEVICE_ATTR(cpld_qsfp_lpmode_16_23), + _DEVICE_ATTR(cpld_qsfp_lpmode_24_31), + + _DEVICE_ATTR(cpld_sfp_txdis_0_1), + _DEVICE_ATTR(cpld_sfp_ts_0_1), + _DEVICE_ATTR(cpld_sfp_rs_0_1), + + _DEVICE_ATTR(dbg_cpld_qsfp_abs_0_7), + _DEVICE_ATTR(dbg_cpld_qsfp_abs_8_15), + _DEVICE_ATTR(dbg_cpld_qsfp_abs_16_23), + _DEVICE_ATTR(dbg_cpld_qsfp_abs_24_31), + + _DEVICE_ATTR(dbg_cpld_qsfp_intr_0_7), + _DEVICE_ATTR(dbg_cpld_qsfp_intr_8_15), + _DEVICE_ATTR(dbg_cpld_qsfp_intr_16_23), + _DEVICE_ATTR(dbg_cpld_qsfp_intr_24_31), + + _DEVICE_ATTR(dbg_cpld_sfp_abs_0_1), + _DEVICE_ATTR(dbg_cpld_sfp_rxlos_0_1), + _DEVICE_ATTR(dbg_cpld_sfp_txflt_0_1), + + NULL +}; + +/* cpld 1 attributes group */ +static const struct attribute_group cpld1_group = { + .attrs = cpld1_attributes, +}; + +/* cpld 2 attributes group */ +static const struct attribute_group cpld2_group = { + .attrs = cpld2_attributes, +}; + +/* reg shift */ +static u8 _shift(u8 mask) +{ + int i=0, mask_one=1; + + for(i=0; i<8; ++i) { + if ((mask & mask_one) == 1) + return i; + else + mask >>= 1; + } + + return -1; +} + +/* reg mask and shift */ +static u8 _mask_shift(u8 val, u8 mask) +{ + int shift=0; + + shift = _shift(mask); + + return (val & mask) >> shift; +} + +static u8 _parse_data(char *buf, unsigned int data, u8 data_type) +{ + if(buf == NULL) { + return -1; + } + + if(data_type == DATA_HEX) { + return sprintf(buf, "0x%02x", data); + } else if(data_type == DATA_DEC) { + return sprintf(buf, "%u", data); + } else { + return -1; + } + return 0; +} + +static int _bsp_log(u8 log_type, char *fmt, ...) +{ + if ((log_type==LOG_READ && enable_log_read) || + (log_type==LOG_WRITE && enable_log_write)) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk(fmt, args); + va_end(args); + + return r; + } else { + return 0; + } +} + +static int _config_bsp_log(u8 log_type) +{ + switch(log_type) { + case LOG_NONE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_RW: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_ENABLE; + break; + case LOG_READ: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_WRITE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_ENABLE; + break; + default: + return -EINVAL; + } + return 0; +} + +/* get bsp value */ +static ssize_t bsp_read(char *buf, char *str) +{ + ssize_t len=0; + + len=sprintf(buf, "%s", str); + BSP_LOG_R("reg_val=%s", str); + + return len; +} + +/* set bsp value */ +static ssize_t bsp_write(const char *buf, char *str, size_t str_len, size_t count) +{ + snprintf(str, str_len, "%s", buf); + BSP_LOG_W("reg_val=%s", str); + + return count; +} + +/* get bsp parameter value */ +static ssize_t bsp_callback_show(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + + switch (attr->index) { + case BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(bsp_debug); + break; + default: + return -EINVAL; + } + return bsp_read(buf, str); +} + +/* set bsp parameter value */ +static ssize_t bsp_callback_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + ssize_t ret = 0; + u8 bsp_debug_u8 = 0; + + switch (attr->index) { + case BSP_DEBUG: + str = bsp_debug; + str_len = sizeof(str); + ret = bsp_write(buf, str, str_len, count); + + if (kstrtou8(buf, 0, &bsp_debug_u8) < 0) { + return -EINVAL; + } else if (_config_bsp_log(bsp_debug_u8) < 0) { + return -EINVAL; + } + return ret; + default: + return -EINVAL; + } + return 0; +} + +/* get cpld register value */ +static ssize_t cpld_show(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 reg = 0; + u8 mask = MASK_NONE; + u8 data_type=DATA_UNK; + + switch (attr->index) { + //CPLD 1 & CPLD 2 + case CPLD_MAJOR_VER: + case CPLD_MINOR_VER: + case CPLD_ID: + case CPLD_BUILD: + case CPLD_CHIP: + case CPLD_EVT_CTRL: + + //CPLD 1 + case CPLD_BOARD_ID_0: + case CPLD_BOARD_ID_1: + case CPLD_SKU_EXT: + + case CPLD_MAC_INTR: + case CPLD_HWM_INTR: + case CPLD_CPLD2_INTR: + case CPLD_PTP_INTR: + case CPLD_SYSTEM_INTR: + + case CPLD_MAC_MASK: + case CPLD_HWM_MASK: + case CPLD_CPLD2_MASK: + case CPLD_PTP_MASK: + case CPLD_SYSTEM_MASK: + + case CPLD_MAC_EVT: + case CPLD_HWM_EVT: + case CPLD_CPLD2_EVT: + + case CPLD_MAC_RESET: + case CPLD_SYSTEM_RESET: + case CPLD_BMC_NTM_RESET: + case CPLD_USB_RESET: + case CPLD_I2C_MUX_RESET: + case CPLD_MISC_RESET: + + case CPLD_BRD_PRESENT: + case CPLD_PSU_STATUS: + case CPLD_SYSTEM_PWR: + case CPLD_MAC_SYNCE: + case CPLD_MAC_AVS: + case CPLD_SYSTEM_STATUS: + case CPLD_WATCHDOG: + case CPLD_BOOT_SELECT: + case CPLD_MUX_CTRL: + case CPLD_MISC_CTRL_1: + case CPLD_MISC_CTRL_2: + case CPLD_MAC_TEMP: + + case CPLD_SYSTEM_LED_PSU: + case CPLD_SYSTEM_LED_SYS: + case CPLD_SYSTEM_LED_FAN: + case CPLD_SYSTEM_LED_ID: + + case DBG_CPLD_MAC_INTR: + case DBG_CPLD_HWM_INTR: + case DBG_CPLD_CPLD2_INTR: + case DBG_CPLD_PTP_INTR: + + //CPLD 2 + case CPLD_QSFP_ABS_0_7: + case CPLD_QSFP_ABS_8_15: + case CPLD_QSFP_ABS_16_23: + case CPLD_QSFP_ABS_24_31: + + case CPLD_QSFP_INTR_0_7: + case CPLD_QSFP_INTR_8_15: + case CPLD_QSFP_INTR_16_23: + case CPLD_QSFP_INTR_24_31: + + case CPLD_SFP_ABS_0_1: + case CPLD_SFP_RXLOS_0_1: + case CPLD_SFP_TXFLT_0_1: + + case CPLD_QSFP_MASK_ABS_0_7: + case CPLD_QSFP_MASK_ABS_8_15: + case CPLD_QSFP_MASK_ABS_16_23: + case CPLD_QSFP_MASK_ABS_24_31: + + case CPLD_QSFP_MASK_INTR_0_7: + case CPLD_QSFP_MASK_INTR_8_15: + case CPLD_QSFP_MASK_INTR_16_23: + case CPLD_QSFP_MASK_INTR_24_31: + + case CPLD_SFP_MASK_ABS_0_1: + case CPLD_SFP_MASK_RXLOS_0_1: + case CPLD_SFP_MASK_TXFLT_0_1: + + case CPLD_QSFP_EVT_ABS_0_7: + case CPLD_QSFP_EVT_ABS_8_15: + case CPLD_QSFP_EVT_ABS_16_23: + case CPLD_QSFP_EVT_ABS_24_31: + + case CPLD_QSFP_EVT_INTR_0_7: + case CPLD_QSFP_EVT_INTR_8_15: + case CPLD_QSFP_EVT_INTR_16_23: + case CPLD_QSFP_EVT_INTR_24_31: + + case CPLD_SFP_EVT_ABS_0_1: + case CPLD_SFP_EVT_RXLOS_0_1: + case CPLD_SFP_EVT_TXFLT_0_1: + + case CPLD_QSFP_RESET_0_7: + case CPLD_QSFP_RESET_8_15: + case CPLD_QSFP_RESET_16_23: + case CPLD_QSFP_RESET_24_31: + + case CPLD_QSFP_LPMODE_0_7: + case CPLD_QSFP_LPMODE_8_15: + case CPLD_QSFP_LPMODE_16_23: + case CPLD_QSFP_LPMODE_24_31: + + case CPLD_SFP_TXDIS_0_1: + case CPLD_SFP_TS_0_1: + case CPLD_SFP_RS_0_1: + + case DBG_CPLD_QSFP_ABS_0_7: + case DBG_CPLD_QSFP_ABS_8_15: + case DBG_CPLD_QSFP_ABS_16_23: + case DBG_CPLD_QSFP_ABS_24_31: + + case DBG_CPLD_QSFP_INTR_0_7: + case DBG_CPLD_QSFP_INTR_8_15: + case DBG_CPLD_QSFP_INTR_16_23: + case DBG_CPLD_QSFP_INTR_24_31: + + case DBG_CPLD_SFP_ABS_0_1: + case DBG_CPLD_SFP_RXLOS_0_1: + case DBG_CPLD_SFP_TXFLT_0_1: + reg = attr_reg[attr->index].reg; + mask= attr_reg[attr->index].mask; + data_type = attr_reg[attr->index].data_type; + break; + default: + return -EINVAL; + } + return cpld_reg_read(dev, buf, reg, mask, data_type); +} + +/* set cpld register value */ +static ssize_t cpld_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 reg = 0; + u8 mask = MASK_NONE; + + switch (attr->index) { + + // CPLD 1 & CPLD2 + case CPLD_EVT_CTRL: + + //CPLD 1 + case CPLD_MAC_MASK: + case CPLD_HWM_MASK: + case CPLD_CPLD2_MASK: + case CPLD_PTP_MASK: + case CPLD_SYSTEM_MASK: + case CPLD_MAC_RESET: + case CPLD_SYSTEM_RESET: + case CPLD_BMC_NTM_RESET: + case CPLD_USB_RESET: + case CPLD_I2C_MUX_RESET: + case CPLD_MISC_RESET: + case CPLD_BOOT_SELECT: + case CPLD_MUX_CTRL: + case CPLD_MISC_CTRL_1: + case CPLD_MISC_CTRL_2: + case CPLD_SYSTEM_LED_PSU: + case CPLD_SYSTEM_LED_SYS: + case CPLD_SYSTEM_LED_FAN: + case CPLD_SYSTEM_LED_ID: + + //CPLD 2 + case CPLD_QSFP_MASK_ABS_0_7: + case CPLD_QSFP_MASK_ABS_8_15: + case CPLD_QSFP_MASK_ABS_16_23: + case CPLD_QSFP_MASK_ABS_24_31: + case CPLD_QSFP_MASK_INTR_0_7: + case CPLD_QSFP_MASK_INTR_8_15: + case CPLD_QSFP_MASK_INTR_16_23: + case CPLD_QSFP_MASK_INTR_24_31: + case CPLD_SFP_MASK_ABS_0_1: + case CPLD_SFP_MASK_RXLOS_0_1: + case CPLD_SFP_MASK_TXFLT_0_1: + case CPLD_QSFP_RESET_0_7: + case CPLD_QSFP_RESET_8_15: + case CPLD_QSFP_RESET_16_23: + case CPLD_QSFP_RESET_24_31: + case CPLD_QSFP_LPMODE_0_7: + case CPLD_QSFP_LPMODE_8_15: + case CPLD_QSFP_LPMODE_16_23: + case CPLD_QSFP_LPMODE_24_31: + case CPLD_SFP_TXDIS_0_1: + case CPLD_SFP_TS_0_1: + case CPLD_SFP_RS_0_1: + reg = attr_reg[attr->index].reg; + mask= attr_reg[attr->index].mask; + break; + default: + return -EINVAL; + } + return cpld_reg_write(dev, buf, count, reg, mask); +} + +/* get cpld register value */ +static u8 _cpld_reg_read(struct device *dev, + u8 reg, + u8 mask) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + int reg_val; + + I2C_READ_BYTE_DATA(reg_val, &data->access_lock, client, reg); + + if (unlikely(reg_val < 0)) { + return reg_val; + } else { + reg_val=_mask_shift(reg_val, mask); + return reg_val; + } +} + +/* get cpld register value */ +static ssize_t cpld_reg_read(struct device *dev, + char *buf, + u8 reg, + u8 mask, + u8 data_type) +{ + int reg_val; + + reg_val = _cpld_reg_read(dev, reg, mask); + if (unlikely(reg_val < 0)) { + dev_err(dev, "cpld_reg_read() error, reg_val=%d\n", reg_val); + return reg_val; + } else { + return _parse_data(buf, reg_val, data_type); + } +} + +/* set cpld register value */ +static ssize_t cpld_reg_write(struct device *dev, + const char *buf, + size_t count, + u8 reg, + u8 mask) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 reg_val, reg_val_now, shift; + int ret = 0; + + if (kstrtou8(buf, 0, ®_val) < 0) + return -EINVAL; + + //apply continuous bits operation if mask is specified, discontinuous bits are not supported + if (mask != MASK_ALL) { + reg_val_now = _cpld_reg_read(dev, reg, MASK_ALL); + if (unlikely(reg_val_now < 0)) { + dev_err(dev, "cpld_reg_write() error, reg_val_now=%d\n", reg_val_now); + return reg_val_now; + } else { + //clear bits in reg_val_now by the mask + reg_val_now &= ~mask; + //get bit shift by the mask + shift = _shift(mask); + //calculate new reg_val + reg_val = reg_val_now | (reg_val << shift); + } + } + + I2C_WRITE_BYTE_DATA(ret, &data->access_lock, + client, reg, reg_val); + + if (unlikely(ret < 0)) { + dev_err(dev, "cpld_reg_write() error, return=%d\n", ret); + return ret; + } + + return count; +} + +/* get qsfp port config register value */ +static ssize_t cpld_version_h_show(struct device *dev, + struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + if (attr->index == CPLD_VERSION_H) { + return sprintf(buf, "%d.%02d.%03d", + _cpld_reg_read(dev, attr_reg[CPLD_MAJOR_VER].reg, attr_reg[CPLD_MAJOR_VER].mask), + _cpld_reg_read(dev, attr_reg[CPLD_MINOR_VER].reg, attr_reg[CPLD_MINOR_VER].mask), + _cpld_reg_read(dev, attr_reg[CPLD_BUILD].reg, attr_reg[CPLD_BUILD].mask)); + } + return -1; +} + +/* add valid cpld client to list */ +static void cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = NULL; + + node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + if (!node) { + dev_info(&client->dev, + "Can't allocate cpld_client_node for index %d\n", + client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +/* remove exist cpld client in list */ +static void cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, + struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + mutex_unlock(&list_lock); +} + +/* cpld drvier probe */ +static int cpld_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + int status; + struct cpld_data *data = NULL; + int ret = -EPERM; + + data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* init cpld data for client */ + i2c_set_clientdata(client, data); + mutex_init(&data->access_lock); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_info(&client->dev, + "i2c_check_functionality failed (0x%x)\n", + client->addr); + status = -EIO; + goto exit; + } + + /* get cpld id from device */ + ret = i2c_smbus_read_byte_data(client, CPLD_ID_REG); + + if (ret < 0) { + dev_info(&client->dev, + "fail to get cpld id (0x%x) at addr (0x%x)\n", + CPLD_ID_REG, client->addr); + status = -EIO; + goto exit; + } + + if (INVALID(ret, cpld1, cpld2)) { + dev_info(&client->dev, + "cpld id %d(device) not valid\n", ret); + //status = -EPERM; + //goto exit; + } + + data->index = dev_id->driver_data; + + /* register sysfs hooks for different cpld group */ + dev_info(&client->dev, "probe cpld with index %d\n", data->index); + switch (data->index) { + case cpld1: + status = sysfs_create_group(&client->dev.kobj, + &cpld1_group); + break; + case cpld2: + status = sysfs_create_group(&client->dev.kobj, + &cpld2_group); + break; + default: + status = -EINVAL; + } + + if (status) + goto exit; + + dev_info(&client->dev, "chip found\n"); + + /* add probe chip to client list */ + cpld_add_client(client); + + return 0; +exit: + switch (data->index) { + case cpld1: + sysfs_remove_group(&client->dev.kobj, &cpld1_group); + break; + case cpld2: + sysfs_remove_group(&client->dev.kobj, &cpld2_group); + break; + default: + break; + } + return status; +} + +/* cpld drvier remove */ +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + + switch (data->index) { + case cpld1: + sysfs_remove_group(&client->dev.kobj, &cpld1_group); + break; + case cpld2: + sysfs_remove_group(&client->dev.kobj, &cpld2_group); + break; + } + + cpld_remove_client(client); + return 0; +} + +#if 0 /* FIXME */ +#define I2C_RW_RETRY_COUNT 3 +#define I2C_RW_RETRY_INTERVAL 60 + +static int s9110_32x_cpld_read_internal(struct i2c_client *client, u8 reg) +{ + int retry = I2C_RW_RETRY_COUNT; + int reg_val = 0; + struct cpld_data *data = i2c_get_clientdata(client); + + while (retry) { + I2C_READ_BYTE_DATA(reg_val, &data->access_lock, client, reg); + if (unlikely(reg_val < 0)) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + + if (retry == 0) { + dev_err(&client->dev, "%s() retry %d times but still failed, reg=%x\n", __func__, I2C_RW_RETRY_COUNT, reg); + } + + continue; + } + + break; + } + + return reg_val; +} + +static int s9110_32x_cpld_write_internal(struct i2c_client *client, u8 reg, u8 value) +{ + int ret = 0, retry = I2C_RW_RETRY_COUNT; + struct cpld_data *data = i2c_get_clientdata(client); + + while (retry) { + I2C_WRITE_BYTE_DATA(ret, &data->access_lock, client, reg, value); + if (unlikely(ret < 0)) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + + if (retry == 0) { + dev_err(&client->dev, "%s() retry %d times but still failed, reg=%x\n", __func__, I2C_RW_RETRY_COUNT, reg); + } + + continue; + } + break; + } + + return ret; +} + + +int s9110_32x_cpld_psu_mux_sel(u8 mux_sel) +{ + unsigned short cpld_addr = cpld_i2c_addr[0]; + u8 reg = CPLD_MUX_CTRL_REG; + u8 reg_val = 0; + u8 psu_mux_mask = 0x06; + u8 mux_sel_val = 0; + + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + switch(mux_sel) { + case 0: + //psu 0 + mux_sel_val = 0x04; + break; + case 1: + //psu 1 + mux_sel_val = 0x02; + break; + default: + //bmc + mux_sel_val = psu_mux_mask; + break; + } + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + //read current reg value + reg_val = s9110_32x_cpld_read_internal(cpld_node->client, reg); + //clear psu_mux_sel bits (bit 1 and 2) + reg_val &= ~psu_mux_mask; + //modify psu_mux_sel bits (bit 1 and 2) + reg_val |= mux_sel_val; + //write reg value + s9110_32x_cpld_write_internal(cpld_node->client, reg, reg_val); + + break; + } else { + pr_err("cpld_node->client->addr=%x, cpld_addr=%x\n", cpld_node->client->addr, cpld_addr); + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(s9110_32x_cpld_psu_mux_sel); +#endif + +MODULE_DEVICE_TABLE(i2c, cpld_id); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "x86_64_ufispace_s9110_32x_cpld", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_id, + .address_list = cpld_i2c_addr, +}; + +static int __init cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&cpld_driver); +} + +static void __exit cpld_exit(void) +{ + i2c_del_driver(&cpld_driver); +} + +MODULE_AUTHOR("Nonodark Huang "); +MODULE_DESCRIPTION("x86_64_ufispace_s9110_32x_cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(cpld_init); +module_exit(cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.h b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.h new file mode 100644 index 000000000000..74db9cab4a69 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-cpld.h @@ -0,0 +1,149 @@ +/* header file for i2c cpld driver of ufispace_s9110_32x + * + * Copyright (C) 2022 UfiSpace Technology Corporation. + * Jason Tsai + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef UFISPACE_S9110_32X_CPLD_H +#define UFISPACE_S9110_32X_CPLD_H + +/* CPLD device index value */ +enum cpld_id { + cpld1, + cpld2 +}; + +/* CPLD 1 & CPLD 2 registers */ +#define CPLD_NONE_REG 0x00 +#define CPLD_VERSION_REG 0x02 +#define CPLD_ID_REG 0x03 +#define CPLD_BUILD_REG 0x04 +#define CPLD_CHIP_REG 0x05 +#define CPLD_EVT_CTRL_REG 0x3F + +/* CPLD 1 registers */ +#define CPLD_BOARD_ID_0_REG 0x00 +#define CPLD_BOARD_ID_1_REG 0x01 +#define CPLD_SKU_EXT_REG 0x06 +#define CPLD_MAC_INTR_REG 0x10 +#define CPLD_HWM_INTR_REG 0x13 +#define CPLD_CPLD2_INTR_REG 0x14 +#define CPLD_PTP_INTR_REG 0x1B +#define CPLD_SYSTEM_INTR_REG 0x1C +#define CPLD_MAC_MASK_REG 0x20 +#define CPLD_HWM_MASK_REG 0x23 +#define CPLD_CPLD2_MASK_REG 0x24 +#define CPLD_PTP_MASK_REG 0x2B +#define CPLD_SYSTEM_MASK_REG 0x2C +#define CPLD_MAC_EVT_REG 0x30 +#define CPLD_HWM_EVT_REG 0x33 +#define CPLD_CPLD2_EVT_REG 0x34 +#define CPLD_MAC_RESET_REG 0x40 +#define CPLD_SYSTEM_RESET_REG 0x41 +#define CPLD_BMC_NTM_RESET_REG 0x43 +#define CPLD_USB_RESET_REG 0x44 +#define CPLD_I2C_MUX_RESET_REG 0x46 +#define CPLD_MISC_RESET_REG 0x48 +#define CPLD_BRD_PRESENT_REG 0x50 +#define CPLD_PSU_STATUS_REG 0x51 +#define CPLD_SYSTEM_PWR_REG 0x52 +#define CPLD_MAC_SYNCE_REG 0x53 +#define CPLD_MAC_AVS_REG 0x54 +#define CPLD_SYSTEM_STATUS_REG 0x55 +#define CPLD_WATCHDOG_REG 0x5A +#define CPLD_BOOT_SELECT_REG 0x5B +#define CPLD_MUX_CTRL_REG 0x5C +#define CPLD_MISC_CTRL_1_REG 0x5D +#define CPLD_MISC_CTRL_2_REG 0x5E +#define CPLD_MAC_TEMP_REG 0x61 +#define CPLD_SYSTEM_LED_PSU_REG 0x80 +#define CPLD_SYSTEM_LED_SYS_REG 0x81 +#define CPLD_SYSTEM_LED_FAN_REG 0x83 +#define CPLD_SYSTEM_LED_ID_REG 0x84 +#define DBG_CPLD_MAC_INTR_REG 0xE0 +#define DBG_CPLD_HWM_INTR_REG 0xE3 +#define DBG_CPLD_CPLD2_INTR_REG 0xE4 +#define DBG_CPLD_PTP_INTR_REG 0xEB + +/* CPLD 2*/ +#define CPLD_QSFP_ABS_0_7_REG 0x10 +#define CPLD_QSFP_ABS_8_15_REG 0x11 +#define CPLD_QSFP_ABS_16_23_REG 0x12 +#define CPLD_QSFP_ABS_24_31_REG 0x13 +#define CPLD_QSFP_INTR_0_7_REG 0x14 +#define CPLD_QSFP_INTR_8_15_REG 0x15 +#define CPLD_QSFP_INTR_16_23_REG 0x16 +#define CPLD_QSFP_INTR_24_31_REG 0x17 +#define CPLD_SFP_ABS_0_1_REG 0x18 +#define CPLD_SFP_RXLOS_0_1_REG 0x19 +#define CPLD_SFP_TXFLT_0_1_REG 0x1a +#define CPLD_QSFP_MASK_ABS_0_7_REG 0x20 +#define CPLD_QSFP_MASK_ABS_8_15_REG 0x21 +#define CPLD_QSFP_MASK_ABS_16_23_REG 0x22 +#define CPLD_QSFP_MASK_ABS_24_31_REG 0x23 +#define CPLD_QSFP_MASK_INTR_0_7_REG 0x24 +#define CPLD_QSFP_MASK_INTR_8_15_REG 0x25 +#define CPLD_QSFP_MASK_INTR_16_23_REG 0x26 +#define CPLD_QSFP_MASK_INTR_24_31_REG 0x27 +#define CPLD_SFP_MASK_ABS_0_1_REG 0x28 +#define CPLD_SFP_MASK_RXLOS_0_1_REG 0x29 +#define CPLD_SFP_MASK_TXFLT_0_1_REG 0x2A +#define CPLD_QSFP_EVT_ABS_0_7_REG 0x30 +#define CPLD_QSFP_EVT_ABS_8_15_REG 0x31 +#define CPLD_QSFP_EVT_ABS_16_23_REG 0x32 +#define CPLD_QSFP_EVT_ABS_24_31_REG 0x33 +#define CPLD_QSFP_EVT_INTR_0_7_REG 0x34 +#define CPLD_QSFP_EVT_INTR_8_15_REG 0x35 +#define CPLD_QSFP_EVT_INTR_16_23_REG 0x36 +#define CPLD_QSFP_EVT_INTR_24_31_REG 0x37 +#define CPLD_SFP_EVT_ABS_0_1_REG 0x38 +#define CPLD_SFP_EVT_RXLOS_0_1_REG 0x39 +#define CPLD_SFP_EVT_TXFLT_0_1_REG 0x3A +#define CPLD_QSFP_RESET_0_7_REG 0x40 +#define CPLD_QSFP_RESET_8_15_REG 0x41 +#define CPLD_QSFP_RESET_16_23_REG 0x42 +#define CPLD_QSFP_RESET_24_31_REG 0x43 +#define CPLD_QSFP_LPMODE_0_7_REG 0x44 +#define CPLD_QSFP_LPMODE_8_15_REG 0x45 +#define CPLD_QSFP_LPMODE_16_23_REG 0x46 +#define CPLD_QSFP_LPMODE_24_31_REG 0x47 +#define CPLD_SFP_TXDIS_0_1_REG 0x48 +#define CPLD_SFP_TS_0_1_REG 0x49 +#define CPLD_SFP_RS_0_1_REG 0x4A +#define DBG_CPLD_QSFP_ABS_0_7_REG 0xD0 +#define DBG_CPLD_QSFP_ABS_8_15_REG 0xD1 +#define DBG_CPLD_QSFP_ABS_16_23_REG 0xD2 +#define DBG_CPLD_QSFP_ABS_24_31_REG 0xD3 +#define DBG_CPLD_QSFP_INTR_0_7_REG 0xD4 +#define DBG_CPLD_QSFP_INTR_8_15_REG 0xD5 +#define DBG_CPLD_QSFP_INTR_16_23_REG 0xD6 +#define DBG_CPLD_QSFP_INTR_24_31_REG 0xD7 +#define DBG_CPLD_SFP_ABS_0_1_REG 0xD8 +#define DBG_CPLD_SFP_RXLOS_0_1_REG 0xD9 +#define DBG_CPLD_SFP_TXFLT_0_1_REG 0xDA + +//MASK +#define MASK_ALL (0xFF) +#define MASK_NONE (0x00) +#define MASK_0000_0111 (0x07) +#define MASK_0011_1111 (0x3F) +#define MASK_1100_0000 (0xC0) + +/* common manipulation */ +#define INVALID(i, min, max) ((i < min) || (i > max) ? 1u : 0u) + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-lpc.c b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-lpc.c new file mode 100644 index 000000000000..14d7c7ec6e4a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-lpc.c @@ -0,0 +1,981 @@ +/* + * A lpc driver for the ufispace_s9110_32x + * + * Copyright (C) 2022 UfiSpace Technology Corporation. + * Nonodark Huang + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include + +#if !defined(SENSOR_DEVICE_ATTR_RO) +#define SENSOR_DEVICE_ATTR_RO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, 0444, _func##_show, NULL, _index) +#endif + +#if !defined(SENSOR_DEVICE_ATTR_RW) +#define SENSOR_DEVICE_ATTR_RW(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, 0644, _func##_show, _func##_store, _index) + +#endif + +#if !defined(SENSOR_DEVICE_ATTR_WO) +#define SENSOR_DEVICE_ATTR_WO(_name, _func, _index) \ + SENSOR_DEVICE_ATTR(_name, 0200, NULL, _func##_store, _index) +#endif + +#define BSP_LOG_R(fmt, args...) \ + _bsp_log (LOG_READ, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) +#define BSP_LOG_W(fmt, args...) \ + _bsp_log (LOG_WRITE, KERN_INFO "%s:%s[%d]: " fmt "\r\n", \ + __FILE__, __func__, __LINE__, ##args) + +#define _DEVICE_ATTR(_name) \ + &sensor_dev_attr_##_name.dev_attr.attr + +#define BSP_PR(level, fmt, args...) _bsp_log (LOG_SYS, level "[BSP]" fmt "\r\n", ##args) + +#define DRIVER_NAME "x86_64_ufispace_s9110_32x_lpc" + +/* LPC registers */ + +#define REG_BASE_MB 0x700 +#define REG_BASE_EC 0xE300 + +#define REG_NONE 0x00 +//MB CPLD +#define REG_BRD_ID_0 (REG_BASE_MB + 0x00) +#define REG_BRD_ID_1 (REG_BASE_MB + 0x01) +#define REG_CPLD_VERSION (REG_BASE_MB + 0x02) +#define REG_CPLD_ID (REG_BASE_MB + 0x03) +#define REG_CPLD_BUILD (REG_BASE_MB + 0x04) +#define REG_CPLD_CHIP (REG_BASE_MB + 0x05) +#define REG_BRD_EXT_ID (REG_BASE_MB + 0x06) +#define REG_I2C_MUX_RESET (REG_BASE_MB + 0x46) +#define REG_MUX_CTRL (REG_BASE_MB + 0x5C) +#define REG_CPLD1_MISC_CTRL (REG_BASE_MB + 0x5D) +#define REG_CPLD1_MISC_CTRL_2 (REG_BASE_MB + 0x5E) + +//EC +#define REG_MISC_CTRL (REG_BASE_EC + 0x0C) +#define REG_CPU_REV (REG_BASE_EC + 0x17) + +// BMC mailbox +#define REG_TEMP_MAC_HWM (REG_BASE_MB + 0xC0) + +#define MASK_ALL (0xFF) +#define MASK_NONE (0x00) +#define MASK_0000_0011 (0x03) +#define MASK_0000_0100 (0x04) +#define MASK_0000_0111 (0x07) +#define MASK_0001_1000 (0x18) +#define MASK_0010_0000 (0x20) +#define MASK_0011_0111 (0x37) +#define MASK_0011_1111 (0x3F) +#define MASK_0100_0000 (0x40) +#define MASK_1000_0000 (0x80) +#define MASK_1100_0000 (0xC0) + +#define LPC_MDELAY (5) +#define MDELAY_RESET_INTERVAL (100) +#define MDELAY_RESET_FINISH (500) + +/* LPC sysfs attributes index */ +enum lpc_sysfs_attributes { + //MB CPLD + ATT_BRD_ID_0, + ATT_BRD_SKU_ID, + ATT_BRD_ID_1, + ATT_BRD_HW_ID, + ATT_BRD_DEPH_ID, + ATT_BRD_BUILD_ID, + ATT_BRD_BIT_SEL, + ATT_BRD_CPLD_ID_TYPE, + ATT_CPLD_VERSION_MAJOR, + ATT_CPLD_VERSION_MINOR, + ATT_CPLD_ID, + ATT_CPLD_BUILD, + ATT_CPLD_VERSION_H, + ATT_CPLD_CHIP, + ATT_BRD_EXT_ID, + ATT_MUX_RESET_ALL, + ATT_MUX_CTRL, + ATT_UART_CTRL, + ATT_USB_CTRL, + + //EC + ATT_BIOS_BOOT_SEL, + ATT_CPU_REV_HW_REV, + ATT_CPU_REV_DEV_PHASE, + ATT_CPU_REV_BUILD_ID, + + //BMC mailbox + ATT_TEMP_MAC_HWM, + + //BSP + ATT_BSP_VERSION, + ATT_BSP_DEBUG, + ATT_BSP_PR_INFO, + ATT_BSP_PR_ERR, + ATT_BSP_REG, + ATT_BSP_REG_VALUE, + ATT_BSP_GPIO_MAX, + ATT_MAX +}; + +enum data_type { + DATA_HEX, + DATA_DEC, + DATA_S_DEC, + DATA_UNK, +}; + +typedef struct { + u16 reg; + u8 mask; + u8 data_type; +} attr_reg_map_t; + +attr_reg_map_t attr_reg[]= { + + //MB CPLD + [ATT_BRD_ID_0] = {REG_BRD_ID_0 , MASK_ALL , DATA_HEX}, + [ATT_BRD_SKU_ID] = {REG_BRD_ID_0 , MASK_ALL , DATA_DEC}, + [ATT_BRD_ID_1] = {REG_BRD_ID_1 , MASK_ALL , DATA_HEX}, + [ATT_BRD_HW_ID] = {REG_BRD_ID_1 , MASK_0000_0011, DATA_DEC}, + [ATT_BRD_DEPH_ID] = {REG_BRD_ID_1 , MASK_0000_0100, DATA_DEC}, + [ATT_BRD_BUILD_ID] = {REG_BRD_ID_1 , MASK_0001_1000, DATA_DEC}, + [ATT_BRD_BIT_SEL] = {REG_BRD_ID_1 , MASK_0010_0000, DATA_DEC}, + [ATT_BRD_CPLD_ID_TYPE] = {REG_BRD_ID_1 , MASK_1000_0000, DATA_DEC}, + [ATT_CPLD_VERSION_MAJOR] = {REG_CPLD_VERSION , MASK_1100_0000, DATA_DEC}, + [ATT_CPLD_VERSION_MINOR] = {REG_CPLD_VERSION , MASK_0011_1111, DATA_DEC}, + [ATT_CPLD_ID] = {REG_CPLD_ID , MASK_0000_0111, DATA_DEC}, + [ATT_CPLD_BUILD] = {REG_CPLD_BUILD , MASK_ALL , DATA_DEC}, + [ATT_CPLD_VERSION_H] = {REG_NONE , MASK_NONE , DATA_UNK}, + [ATT_CPLD_CHIP] = {REG_CPLD_CHIP , MASK_0000_0011, DATA_DEC}, + [ATT_BRD_EXT_ID] = {REG_BRD_EXT_ID , MASK_0000_0111, DATA_DEC}, + [ATT_MUX_RESET_ALL] = {REG_I2C_MUX_RESET, MASK_0011_1111, DATA_DEC}, + [ATT_MUX_CTRL] = {REG_MUX_CTRL , MASK_ALL , DATA_HEX}, + [ATT_UART_CTRL] = {REG_MUX_CTRL , MASK_0010_0000, DATA_DEC}, + [ATT_USB_CTRL] = {REG_MUX_CTRL , MASK_1000_0000, DATA_DEC}, + + //EC + [ATT_BIOS_BOOT_SEL] = {REG_MISC_CTRL , MASK_0100_0000, DATA_DEC}, + [ATT_CPU_REV_HW_REV] = {REG_CPU_REV , MASK_0000_0011, DATA_DEC}, + [ATT_CPU_REV_DEV_PHASE] = {REG_CPU_REV , MASK_0000_0100, DATA_DEC}, + [ATT_CPU_REV_BUILD_ID] = {REG_CPU_REV , MASK_0001_1000, DATA_DEC}, + + //BMC mailbox + [ATT_TEMP_MAC_HWM] = {REG_TEMP_MAC_HWM , MASK_ALL , DATA_S_DEC}, + + //BSP + [ATT_BSP_VERSION] = {REG_NONE , MASK_NONE , DATA_UNK}, + [ATT_BSP_DEBUG] = {REG_NONE , MASK_NONE , DATA_UNK}, + [ATT_BSP_PR_INFO] = {REG_NONE , MASK_NONE , DATA_UNK}, + [ATT_BSP_PR_ERR] = {REG_NONE , MASK_NONE , DATA_UNK}, + [ATT_BSP_REG] = {REG_NONE , MASK_NONE , DATA_UNK}, + [ATT_BSP_REG_VALUE] = {REG_NONE , MASK_NONE , DATA_HEX}, + [ATT_BSP_GPIO_MAX] = {REG_NONE , MASK_NONE , DATA_DEC}, +}; + +enum bsp_log_types { + LOG_NONE, + LOG_RW, + LOG_READ, + LOG_WRITE, + LOG_SYS +}; + +enum bsp_log_ctrl { + LOG_DISABLE, + LOG_ENABLE +}; + +struct lpc_data_s { + struct mutex access_lock; +}; + +struct lpc_data_s *lpc_data; +char bsp_version[16]=""; +char bsp_debug[2]="0"; +char bsp_reg[8]="0x0"; +u8 enable_log_read = LOG_DISABLE; +u8 enable_log_write = LOG_DISABLE; +u8 enable_log_sys = LOG_ENABLE; +u8 mailbox_inited=0; + +/* reg shift */ +static u8 _shift(u8 mask) +{ + int i=0, mask_one=1; + + for(i=0; i<8; ++i) { + if ((mask & mask_one) == 1) + return i; + else + mask >>= 1; + } + + return -1; +} + +/* reg mask and shift */ +static u8 _mask_shift(u8 val, u8 mask) +{ + int shift=0; + + shift = _shift(mask); + + return (val & mask) >> shift; +} + +static u8 _bit_operation(u8 reg_val, u8 bit, u8 bit_val) +{ + if (bit_val == 0) + reg_val = reg_val & ~(1 << bit); + else + reg_val = reg_val | (1 << bit); + return reg_val; +} + +static u8 _parse_data(char *buf, unsigned int data, u8 data_type) +{ + if(buf == NULL) { + return -1; + } + + if(data_type == DATA_HEX) { + return sprintf(buf, "0x%02x", data); + } else if(data_type == DATA_DEC) { + return sprintf(buf, "%u", data); + } else { + return -1; + } + return 0; +} + +static int _bsp_log(u8 log_type, char *fmt, ...) +{ + if ((log_type==LOG_READ && enable_log_read) || + (log_type==LOG_WRITE && enable_log_write) || + (log_type==LOG_SYS && enable_log_sys) ) { + va_list args; + int r; + + va_start(args, fmt); + r = vprintk(fmt, args); + va_end(args); + + return r; + } else { + return 0; + } +} + +static int _bsp_log_config(u8 log_type) +{ + switch(log_type) { + case LOG_NONE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_RW: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_ENABLE; + break; + case LOG_READ: + enable_log_read = LOG_ENABLE; + enable_log_write = LOG_DISABLE; + break; + case LOG_WRITE: + enable_log_read = LOG_DISABLE; + enable_log_write = LOG_ENABLE; + break; + default: + return -EINVAL; + } + return 0; +} + +static void _outb(u8 data, u16 port) +{ + outb(data, port); + mdelay(LPC_MDELAY); +} + +/* init bmc mailbox, get from BMC team */ +static int bmc_mailbox_init(void) +{ + if (mailbox_inited) { + return mailbox_inited; + } + + //Enable super io writing + _outb(0xa5, 0x2e); + _outb(0xa5, 0x2e); + + //Logic device number + _outb(0x07, 0x2e); + _outb(0x0e, 0x2f); + + //Disable mailbox + _outb(0x30, 0x2e); + _outb(0x00, 0x2f); + + //Set base address bit + _outb(0x60, 0x2e); + _outb(0x07, 0x2f); + _outb(0x61, 0x2e); + _outb(0xc0, 0x2f); + + //Select bit[3:0] of SIRQ + _outb(0x70, 0x2e); + _outb(0x07, 0x2f); + + //Low level trigger + _outb(0x71, 0x2e); + _outb(0x01, 0x2f); + + //Enable mailbox + _outb(0x30, 0x2e); + _outb(0x01, 0x2f); + + //Disable super io writing + _outb(0xaa, 0x2e); + + //Mailbox initial + _outb(0x00, 0x786); + _outb(0x00, 0x787); + + //set mailbox_inited + mailbox_inited = 1; + + return mailbox_inited; +} + +/* get lpc register value */ +static u8 _lpc_reg_read(u16 reg, u8 mask) +{ + u8 reg_val=0x0, reg_mk_shf_val = 0x0; + + mutex_lock(&lpc_data->access_lock); + reg_val = inb(reg); + mutex_unlock(&lpc_data->access_lock); + + reg_mk_shf_val = _mask_shift(reg_val, mask); + + BSP_LOG_R("reg=0x%03x, reg_val=0x%02x, mask=0x%02x, reg_mk_shf_val=0x%02x", reg, reg_val, mask, reg_mk_shf_val); + + return reg_mk_shf_val; +} + +/* get lpc register value */ +static ssize_t lpc_reg_read(u16 reg, u8 mask, char *buf, u8 data_type) +{ + u8 reg_val; + int len=0; + + reg_val = _lpc_reg_read(reg, mask); + + // may need to change to hex value ? + len=_parse_data(buf, reg_val, data_type); + + return len; +} + +/* set lpc register value */ +static ssize_t lpc_reg_write(u16 reg, u8 mask, const char *buf, size_t count, u8 data_type) +{ + u8 reg_val, reg_val_now, shift; + + if (kstrtou8(buf, 0, ®_val) < 0) { + if(data_type == DATA_S_DEC) { + if (kstrtos8(buf, 0, ®_val) < 0) { + return -EINVAL; + } + } else { + return -EINVAL; + } + } + + //apply continuous bits operation if mask is specified, discontinuous bits are not supported + if (mask != MASK_ALL) { + reg_val_now = _lpc_reg_read(reg, MASK_ALL); + //clear bits in reg_val_now by the mask + reg_val_now &= ~mask; + //get bit shift by the mask + shift = _shift(mask); + //calculate new reg_val + reg_val = _bit_operation(reg_val_now, shift, reg_val); + } + + mutex_lock(&lpc_data->access_lock); + + _outb(reg_val, reg); + + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x, mask=0x%02x", reg, reg_val, mask); + + return count; +} + +/* get bsp value */ +static ssize_t bsp_read(char *buf, char *str) +{ + ssize_t len=0; + + mutex_lock(&lpc_data->access_lock); + len=sprintf(buf, "%s", str); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_R("reg_val=%s", str); + + return len; +} + +/* set bsp value */ +static ssize_t bsp_write(const char *buf, char *str, size_t str_len, size_t count) +{ + mutex_lock(&lpc_data->access_lock); + snprintf(str, str_len, "%s", buf); + mutex_unlock(&lpc_data->access_lock); + + BSP_LOG_W("reg_val=%s", str); + + return count; +} + +/* get gpio max value */ +static ssize_t gpio_max_show(struct device *dev, + struct device_attribute *da, + char *buf) +{ + u8 data_type=DATA_UNK; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + if (attr->index == ATT_BSP_GPIO_MAX) { + data_type = attr_reg[attr->index].data_type; + return _parse_data(buf, ARCH_NR_GPIOS-1, data_type); + } + return -1; +} + +/* get mb cpld version in human readable format */ +static ssize_t mb_cpld_version_h_show(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + unsigned int attr_major = 0; + unsigned int attr_minor = 0; + unsigned int attr_build = 0; + + switch (attr->index) { + case ATT_CPLD_VERSION_H: + attr_major = ATT_CPLD_VERSION_MAJOR; + attr_minor = ATT_CPLD_VERSION_MINOR; + attr_build = ATT_CPLD_BUILD; + break; + default: + return -1; + } + + return sprintf(buf, "%d.%02d.%03d", _lpc_reg_read(attr_reg[attr_major].reg, attr_reg[attr_major].mask), + _lpc_reg_read(attr_reg[attr_minor].reg, attr_reg[attr_minor].mask), + _lpc_reg_read(attr_reg[attr_build].reg, attr_reg[attr_build].mask)); + +} + +/* get lpc register value */ +static ssize_t lpc_callback_show(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_NONE; + u8 data_type=DATA_UNK; + + switch (attr->index) { + // MB CPLD + case ATT_BRD_ID_0: + case ATT_BRD_SKU_ID: + case ATT_BRD_ID_1: + case ATT_BRD_HW_ID: + case ATT_BRD_DEPH_ID: + case ATT_BRD_BUILD_ID: + case ATT_BRD_BIT_SEL: + case ATT_BRD_CPLD_ID_TYPE: + case ATT_CPLD_VERSION_MAJOR: + case ATT_CPLD_VERSION_MINOR: + case ATT_CPLD_ID: + case ATT_CPLD_BUILD: + case ATT_CPLD_VERSION_H: + case ATT_CPLD_CHIP: + case ATT_BRD_EXT_ID: + case ATT_MUX_RESET_ALL: + case ATT_MUX_CTRL: + case ATT_UART_CTRL: + case ATT_USB_CTRL: + + // EC + case ATT_BIOS_BOOT_SEL: + case ATT_CPU_REV_HW_REV: + case ATT_CPU_REV_DEV_PHASE: + case ATT_CPU_REV_BUILD_ID: + + //BSP + case ATT_BSP_GPIO_MAX: + reg = attr_reg[attr->index].reg; + mask= attr_reg[attr->index].mask; + data_type = attr_reg[attr->index].data_type; + break; + case ATT_BSP_REG_VALUE: + if (kstrtou16(bsp_reg, 0, ®) < 0) + return -EINVAL; + + mask = MASK_ALL; + break; + default: + return -EINVAL; + } + return lpc_reg_read(reg, mask, buf, data_type); +} + +/* set lpc register value */ +static ssize_t lpc_callback_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_NONE; + u8 data_type=DATA_UNK; + + switch (attr->index) { + //MB CPLD + case ATT_MUX_CTRL: + case ATT_UART_CTRL: + case ATT_USB_CTRL: + + //BMC mailbox + case ATT_TEMP_MAC_HWM: + reg = attr_reg[attr->index].reg; + mask= attr_reg[attr->index].mask; + data_type = attr_reg[attr->index].data_type; + break; + default: + return -EINVAL; + } + + if(attr->index == ATT_TEMP_MAC_HWM) { + bmc_mailbox_init(); + } + + return lpc_reg_write(reg, mask, buf, count, data_type); + +} + +/* get bsp parameter value */ +static ssize_t bsp_callback_show(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + char *str=NULL; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + break; + case ATT_BSP_DEBUG: + str = bsp_debug; + break; + case ATT_BSP_REG: + str = bsp_reg; + break; + default: + return -EINVAL; + } + return bsp_read(buf, str); +} + +/* set bsp parameter value */ +static ssize_t bsp_callback_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len=0; + char *str=NULL; + u16 reg = 0; + u8 bsp_debug_u8 = 0; + + switch (attr->index) { + case ATT_BSP_VERSION: + str = bsp_version; + str_len = sizeof(bsp_version); + break; + case ATT_BSP_DEBUG: + if (kstrtou8(buf, 0, &bsp_debug_u8) < 0) { + return -EINVAL; + } else if (_bsp_log_config(bsp_debug_u8) < 0) { + return -EINVAL; + } + + str = bsp_debug; + str_len = sizeof(bsp_debug); + break; + case ATT_BSP_REG: + if (kstrtou16(buf, 0, ®) < 0) + return -EINVAL; + + str = bsp_reg; + str_len = sizeof(bsp_reg); + break; + default: + return -EINVAL; + } + + return bsp_write(buf, str, str_len, count); +} + +static ssize_t bsp_pr_callback_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int str_len = strlen(buf); + + if(str_len <= 0) + return str_len; + + switch (attr->index) { + case ATT_BSP_PR_INFO: + BSP_PR(KERN_INFO, "%s", buf); + break; + case ATT_BSP_PR_ERR: + BSP_PR(KERN_ERR, "%s", buf); + break; + default: + return -EINVAL; + } + + return str_len; +} + +/* set mux_reset register value */ +static ssize_t mux_reset_all_store(struct device *dev, + struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u16 reg = 0; + u8 mask = MASK_NONE; + u8 val = 0; + u8 mux_reset_reg_val = 0; + static int mux_reset_flag = 0; + + switch (attr->index) { + case ATT_MUX_RESET_ALL: + reg = attr_reg[attr->index].reg; + mask= attr_reg[attr->index].mask; + break; + default: + return -EINVAL; + } + + if (kstrtou8(buf, 0, &val) < 0) + return -EINVAL; + + if (mux_reset_flag == 0) { + if (val == 0) { + mutex_lock(&lpc_data->access_lock); + mux_reset_flag = 1; + BSP_LOG_W("i2c mux reset is triggered..."); + + //reset mux on ports + mux_reset_reg_val = inb(reg); + outb((mux_reset_reg_val & (u8)(~mask)), reg); + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x", reg, mux_reset_reg_val & (u8)(~mask)); + + mdelay(MDELAY_RESET_INTERVAL); + + //unset mux on ports + outb((mux_reset_reg_val | mask), reg); + BSP_LOG_W("reg=0x%03x, reg_val=0x%02x", reg, mux_reset_reg_val | mask); + mdelay(MDELAY_RESET_FINISH); + mux_reset_flag = 0; + mutex_unlock(&lpc_data->access_lock); + } else { + return -EINVAL; + } + } else { + BSP_LOG_W("i2c mux is resetting... (ignore)"); + mutex_lock(&lpc_data->access_lock); + mutex_unlock(&lpc_data->access_lock); + } + return count; +} + +//SENSOR_DEVICE_ATTR - MB +static SENSOR_DEVICE_ATTR_RO(board_id_0 , lpc_callback , ATT_BRD_ID_0); +static SENSOR_DEVICE_ATTR_RO(board_sku_id , lpc_callback , ATT_BRD_SKU_ID); +static SENSOR_DEVICE_ATTR_RO(board_id_1 , lpc_callback , ATT_BRD_ID_1); +static SENSOR_DEVICE_ATTR_RO(board_hw_id , lpc_callback , ATT_BRD_HW_ID); +static SENSOR_DEVICE_ATTR_RO(board_deph_id , lpc_callback , ATT_BRD_DEPH_ID); +static SENSOR_DEVICE_ATTR_RO(board_build_id , lpc_callback , ATT_BRD_BUILD_ID); +static SENSOR_DEVICE_ATTR_RO(board_bit_sel , lpc_callback , ATT_BRD_BIT_SEL); +static SENSOR_DEVICE_ATTR_RO(board_cpld_id_type , lpc_callback , ATT_BRD_CPLD_ID_TYPE); +static SENSOR_DEVICE_ATTR_RO(cpld_version_major , lpc_callback , ATT_CPLD_VERSION_MAJOR); +static SENSOR_DEVICE_ATTR_RO(cpld_version_minor , lpc_callback , ATT_CPLD_VERSION_MINOR); +static SENSOR_DEVICE_ATTR_RO(cpld_id , lpc_callback , ATT_CPLD_ID); +static SENSOR_DEVICE_ATTR_RO(cpld_build , lpc_callback , ATT_CPLD_BUILD); +static SENSOR_DEVICE_ATTR_RO(cpld_version_h , mb_cpld_version_h, ATT_CPLD_VERSION_H); +static SENSOR_DEVICE_ATTR_RO(cpld_chip , lpc_callback , ATT_CPLD_CHIP); +static SENSOR_DEVICE_ATTR_RO(board_ext_id , lpc_callback , ATT_BRD_EXT_ID); +static SENSOR_DEVICE_ATTR_WO(mux_reset_all , mux_reset_all , ATT_MUX_RESET_ALL); +static SENSOR_DEVICE_ATTR_RW(mux_ctrl , lpc_callback , ATT_MUX_CTRL); +static SENSOR_DEVICE_ATTR_RW(uart_ctrl , lpc_callback , ATT_UART_CTRL); +static SENSOR_DEVICE_ATTR_RW(usb_ctrl , lpc_callback , ATT_USB_CTRL); + +//SENSOR_DEVICE_ATTR - EC +static SENSOR_DEVICE_ATTR_RO(bios_boot_sel , lpc_callback , ATT_BIOS_BOOT_SEL); +static SENSOR_DEVICE_ATTR_RO(cpu_rev_hw_rev , lpc_callback , ATT_CPU_REV_HW_REV); +static SENSOR_DEVICE_ATTR_RO(cpu_rev_dev_phase , lpc_callback , ATT_CPU_REV_DEV_PHASE); +static SENSOR_DEVICE_ATTR_RO(cpu_rev_build_id , lpc_callback , ATT_CPU_REV_BUILD_ID); + +//SENSOR_DEVICE_ATTR - BMC mailbox +static SENSOR_DEVICE_ATTR_WO(temp_mac_hwm , lpc_callback , ATT_TEMP_MAC_HWM); + +//SENSOR_DEVICE_ATTR - BSP +static SENSOR_DEVICE_ATTR_RW(bsp_version , bsp_callback , ATT_BSP_VERSION); +static SENSOR_DEVICE_ATTR_RW(bsp_debug , bsp_callback , ATT_BSP_DEBUG); +static SENSOR_DEVICE_ATTR_WO(bsp_pr_info , bsp_pr_callback , ATT_BSP_PR_INFO); +static SENSOR_DEVICE_ATTR_WO(bsp_pr_err , bsp_pr_callback , ATT_BSP_PR_ERR); +static SENSOR_DEVICE_ATTR_RW(bsp_reg , bsp_callback , ATT_BSP_REG); +static SENSOR_DEVICE_ATTR_RO(bsp_reg_value , lpc_callback , ATT_BSP_REG_VALUE); +static SENSOR_DEVICE_ATTR_RO(bsp_gpio_max , gpio_max , ATT_BSP_GPIO_MAX); + +static struct attribute *mb_cpld_attrs[] = { + _DEVICE_ATTR(board_id_0), + _DEVICE_ATTR(board_sku_id), + _DEVICE_ATTR(board_id_1), + _DEVICE_ATTR(board_hw_id), + _DEVICE_ATTR(board_deph_id), + _DEVICE_ATTR(board_build_id), + _DEVICE_ATTR(board_bit_sel), + _DEVICE_ATTR(board_cpld_id_type), + _DEVICE_ATTR(cpld_version_major), + _DEVICE_ATTR(cpld_version_minor), + _DEVICE_ATTR(cpld_id), + _DEVICE_ATTR(cpld_build), + _DEVICE_ATTR(cpld_version_h), + _DEVICE_ATTR(cpld_chip), + _DEVICE_ATTR(board_ext_id), + _DEVICE_ATTR(mux_reset_all), + _DEVICE_ATTR(mux_ctrl), + _DEVICE_ATTR(uart_ctrl), + _DEVICE_ATTR(usb_ctrl), + NULL, +}; + +static struct attribute *ec_attrs[] = { + _DEVICE_ATTR(bios_boot_sel), + _DEVICE_ATTR(cpu_rev_hw_rev), + _DEVICE_ATTR(cpu_rev_dev_phase), + _DEVICE_ATTR(cpu_rev_build_id), + NULL, +}; + + +static struct attribute *bmc_mailbox_attrs[] = { + _DEVICE_ATTR(temp_mac_hwm), + NULL, +}; + +static struct attribute *bsp_attrs[] = { + _DEVICE_ATTR(bsp_version), + _DEVICE_ATTR(bsp_debug), + _DEVICE_ATTR(bsp_pr_info), + _DEVICE_ATTR(bsp_pr_err), + _DEVICE_ATTR(bsp_reg), + _DEVICE_ATTR(bsp_reg_value), + _DEVICE_ATTR(bsp_gpio_max), + NULL, +}; + +static struct attribute_group mb_cpld_attr_grp = { + .name = "mb_cpld", + .attrs = mb_cpld_attrs, +}; + +static struct attribute_group bsp_attr_grp = { + .name = "bsp", + .attrs = bsp_attrs, +}; + +static struct attribute_group ec_attr_grp = { + .name = "ec", + .attrs = ec_attrs, +}; + +static struct attribute_group bmc_mailbox_attr_grp = { + .name = "bmc_mailbox", + .attrs = bmc_mailbox_attrs, +}; + +static void lpc_dev_release( struct device * dev) +{ + return; +} + +static struct platform_device lpc_dev = { + .name = DRIVER_NAME, + .id = -1, + .dev = { + .release = lpc_dev_release, + } +}; + +static int lpc_drv_probe(struct platform_device *pdev) +{ + int i = 0, grp_num = 4; + int err[4] = {0}; + struct attribute_group *grp; + + lpc_data = devm_kzalloc(&pdev->dev, sizeof(struct lpc_data_s), + GFP_KERNEL); + if (!lpc_data) + return -ENOMEM; + + mutex_init(&lpc_data->access_lock); + + for (i=0; idev.kobj, grp); + if (err[i]) { + printk(KERN_ERR "Cannot create sysfs for group %s\n", grp->name); + goto exit; + } else { + continue; + } + } + + return 0; + +exit: + for (i=0; idev.kobj, grp); + if (!err[i]) { + //remove previous successful cases + continue; + } else { + //remove first failed case, then return + return err[i]; + } + } + return 0; +} + +static int lpc_drv_remove(struct platform_device *pdev) +{ + sysfs_remove_group(&pdev->dev.kobj, &mb_cpld_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &bsp_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &ec_attr_grp); + sysfs_remove_group(&pdev->dev.kobj, &bmc_mailbox_attr_grp); + return 0; +} + +static struct platform_driver lpc_drv = { + .probe = lpc_drv_probe, + .remove = __exit_p(lpc_drv_remove), + .driver = { + .name = DRIVER_NAME, + }, +}; + +int lpc_init(void) +{ + int err = 0; + + err = platform_driver_register(&lpc_drv); + if (err) { + printk(KERN_ERR "%s(#%d): platform_driver_register failed(%d)\n", + __func__, __LINE__, err); + + return err; + } + + err = platform_device_register(&lpc_dev); + if (err) { + printk(KERN_ERR "%s(#%d): platform_device_register failed(%d)\n", + __func__, __LINE__, err); + platform_driver_unregister(&lpc_drv); + return err; + } + + return err; +} + +void lpc_exit(void) +{ + platform_driver_unregister(&lpc_drv); + platform_device_unregister(&lpc_dev); +} + +MODULE_AUTHOR("Nonodark Huang "); +MODULE_DESCRIPTION("x86_64_ufispace_s9110_32x_lpc driver"); +MODULE_LICENSE("GPL"); + +module_init(lpc_init); +module_exit(lpc_exit); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-sys-eeprom.c b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-sys-eeprom.c new file mode 100644 index 000000000000..976ba05052e7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/modules/x86-64-ufispace-s9110-32x-sys-eeprom.c @@ -0,0 +1,272 @@ +/* + * Copyright (C) 1998, 1999 Frodo Looijaard and + * Philip Edelbrock + * Copyright (C) 2003 Greg Kroah-Hartman + * Copyright (C) 2003 IBM Corp. + * Copyright (C) 2004 Jean Delvare + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* enable dev_dbg print out */ +//#define DEBUG + +#define __STDC_WANT_LIB_EXT1__ 1 +#include +#include +#include +#include +#include +#include +#include + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { /*0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57,*/ I2C_CLIENT_END }; + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 512 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void sys_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, (u8)((addr >> 8) & 0xFF), (u8)(addr & 0xFF)); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t sys_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + sys_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static ssize_t sys_eeprom_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + int ret; + int i; + u8 cmd; + u16 value16; + + dev_dbg(&client->dev, "sys_eeprom_write off=%d, count=%d\n", (int)off, (int)count); + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + mutex_lock(&data->update_lock); + + for(i=0; i < count; i++) { + /* write command */ + cmd = (off >> 8) & 0xff; + value16 = off & 0xff; + value16 |= buf[i] << 8; + ret = i2c_smbus_write_word_data(client, cmd, value16); + + if (ret < 0) { + dev_err(&client->dev, "write address failed at %d \n", (int)off); + goto exit; + } + + off++; + + /* need to wait for write complete */ + udelay(10000); + } +exit: + mutex_unlock(&data->update_lock); + /* force to update client when reading */ + for(i=0; i < SLICE_NUM; i++) { + data->last_updated[i] = 0; + } + + return count; +} + +static struct bin_attribute sys_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO | S_IWUSR, + }, + .size = EEPROM_SIZE, + .read = sys_eeprom_read, + .write = sys_eeprom_write, +}; + +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int sys_eeprom_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = client->adapter; + + /* EDID EEPROMs are often 24C00 EEPROMs, which answer to all + addresses 0x50-0x57, but we only care about 0x51 and 0x55. So decline + attaching to addresses >= 0x56 on DDC buses */ + if (!(adapter->class & I2C_CLASS_SPD) && client->addr >= 0x56) { + return -ENODEV; + } + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE) + && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { + return -ENODEV; + } + + strlcpy(info->type, "eeprom", I2C_NAME_SIZE); + + return 0; +} + +static int sys_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + +#ifdef __STDC_LIB_EXT1__ + memset_s(data->data, EEPROM_SIZE, 0xff, EEPROM_SIZE); +#else + memset(data->data, 0xff, EEPROM_SIZE); +#endif + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &sys_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int sys_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &sys_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id sys_eeprom_id[] = { + { "sys_eeprom", 0 }, + { } +}; + +static struct i2c_driver sys_eeprom_driver = { + .driver = { + .name = "sys_eeprom", + }, + .probe = sys_eeprom_probe, + .remove = sys_eeprom_remove, + .id_table = sys_eeprom_id, + + .class = I2C_CLASS_DDC | I2C_CLASS_SPD, + .detect = sys_eeprom_detect, + .address_list = normal_i2c, +}; + +module_i2c_driver(sys_eeprom_driver); + +MODULE_AUTHOR("Nonodark Huang "); +MODULE_DESCRIPTION("UfiSpace System EEPROM driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/__init__.py new file mode 100644 index 000000000000..593867d31c9d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/__init__.py @@ -0,0 +1,4 @@ +# All the derived classes for PDDF +__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] +from . import platform + diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/chassis.py new file mode 100644 index 000000000000..530332cf1506 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/chassis.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Chassis API +# +############################################################################# + +try: + import time + from sonic_platform_pddf_base.pddf_chassis import PddfChassis + # from sonic_py_common import device_info +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_COMPONENT = 4 + +class Chassis(PddfChassis): + """ + PDDF Platform-specific Chassis class + """ + + port_dict = {} + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfChassis.__init__(self, pddf_data, pddf_plugin_data) + self._initialize_components() + + def _initialize_components(self): + from sonic_platform.component import Component + for index in range(NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + # return device_info.get_hwsku() + return self._eeprom.platform_name_str() + + def initizalize_system_led(self): + return True + + def get_status_led(self): + return self.get_system_led("SYS_LED") + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + Returns: + (bool, dict): + - bool: True if call successful, False if not; + - dict: A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, where device_id is the device ID + for this device and device_event. + The known devices's device_id and device_event was defined as table below. + ----------------------------------------------------------------- + device | device_id | device_event | annotate + ----------------------------------------------------------------- + 'fan' '' '0' Fan removed + '1' Fan inserted + 'sfp' '' '0' Sfp removed + '1' Sfp inserted + '2' I2C bus stuck + '3' Bad eeprom + '4' Unsupported cable + '5' High Temperature + '6' Bad cable + 'voltage' '' '0' Vout normal + '1' Vout abnormal + -------------------------------------------------------------------- + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'}, + 'voltage':{'U20':'0', 'U21':'1'}} + Indicates that: + fan 0 has been removed, fan 2 has been inserted. + sfp 11 has been removed, sfp 12 has been inserted. + monitored voltage U20 became normal, voltage U21 became abnormal. + Note: For sfp, when event 3-6 happened, the module will not be avalaible, + XCVRD shall stop to read eeprom before SFP recovered from error status. + """ + + change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}} + + start_time = time.time() + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_change_event:Invalid timeout value", timeout) + return False, change_event_dict + + end_time = start_time + timeout + if start_time > end_time: + print( + "get_change_event:" "time wrap / invalid timeout value", + timeout, + ) + return False, change_event_dict # Time wrap or possibly incorrect timeout + try: + while timeout >= 0: + # check for sfp + sfp_change_dict = self.get_transceiver_change_event() + # check for fan + # fan_change_dict = self.get_fan_change_event() + # check for voltage + # voltage_change_dict = self.get_voltage_change_event() + + if sfp_change_dict: + change_event_dict["sfp"] = sfp_change_dict + # change_event_dict["fan"] = fan_change_dict + # change_event_dict["voltage"] = voltage_change_dict + return True, change_event_dict + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_event_dict + except Exception as e: + print(e) + print("get_change_event: Should not reach here.") + return False, change_event_dict + + def get_transceiver_change_event(self): + current_port_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index in range(0, self.platform_inventory['num_ports']): + if self._sfp_list[index].get_presence(): + current_port_dict[index] = self.plugin_data["XCVR"]["status"]["inserted"] + else: + current_port_dict[index] = self.plugin_data["XCVR"]["status"]["removed"] + + if len(self.port_dict) == 0: # first time + self.port_dict = current_port_dict + return {} + + if current_port_dict == self.port_dict: + return {} + + # Update reg value + for index, status in current_port_dict.items(): + if self.port_dict[index] != status: + ret_dict[index] = status + #ret_dict[str(index)] = status + self.port_dict = current_port_dict + for index, status in ret_dict.items(): + if int(status) == 1: + pass + #self._sfp_list[int(index)].check_sfp_optoe_type() + return ret_dict + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = self.plugin_data['REBOOT_CAUSE']['reboot_cause_file'] + + try: + with open(reboot_cause_path, 'r', errors='replace') as fd: + data = fd.read() + sw_reboot_cause = data.strip() + except IOError: + sw_reboot_cause = "Unknown" + + return ('REBOOT_CAUSE_NON_HARDWARE', sw_reboot_cause) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/component.py new file mode 100644 index 000000000000..1c583079f8c2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/component.py @@ -0,0 +1,125 @@ +############################################################################# +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from sonic_platform_pddf_base import pddfapi +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_SYSFS = { + "CPLD1": {"major": "cpld1_major_ver", "minor": "cpld1_minor_ver", "build": "cpld1_build"}, + "CPLD2": {"major": "cpld2_major_ver", "minor": "cpld2_minor_ver", "build": "cpld2_build"}, +} + +BMC_CMDS = { + "VER1": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f1", + "VER2": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f2", + "VER3": "echo $((`ipmitool mc info | grep 'Aux Firmware Rev Info' -A 2 | sed -n '2p'` + 0))", +} + +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("CPLD1", "CPLD 1"), + ("CPLD2", "CPLD 2"), + ("BIOS", "Basic Input/Output System"), + ("BMC", "BMC"), +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + self.pddf_obj = pddfapi.PddfApi() + self.index = component_index + self.name = self.get_name() + + def _get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def _get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name, elem in CPLD_SYSFS.items(): + device = "SYSSTATUS" + major = self.pddf_obj.get_attr_name_output(device, elem["major"]) + minor = self.pddf_obj.get_attr_name_output(device, elem["minor"]) + build = self.pddf_obj.get_attr_name_output(device, elem["build"]) + if major and minor and build: + major = int(major['status'].rstrip(),0) + minor = int(minor['status'].rstrip(),0) + build = int(build['status'].rstrip(),0) + cpld_version[cpld_name] = "{}.{:02d}.{:03d}".format(major, minor, build) + else: + cpld_version[cpld_name] = "N/A" + return cpld_version + + def _get_bmc_version(self): + # Retrieves the BMC firmware version + bmc_ver = dict() + for ver in BMC_CMDS: + status, value = subprocess.getstatusoutput(BMC_CMDS[ver]) + if not status: + bmc_ver[ver] = int(value.rstrip()) + else: + return None + + bmc_version = "{}.{}.{}".format(bmc_ver["VER1"], bmc_ver["VER2"], bmc_ver["VER3"]) + + return bmc_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self._get_bios_version() + elif "CPLD" in self.name: + cpld_version = self._get_cpld_version() + fw_version = cpld_version.get(self.name) + elif self.name == "BMC": + fw_version = self._get_bmc_version() + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/eeprom.py new file mode 100644 index 000000000000..90ab1c779a48 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(PddfEeprom): + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + + def platform_name_str(self): + (is_valid, results) = self.get_tlv_field(self.eeprom_data, self._TLV_CODE_PLATFORM_NAME) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan.py new file mode 100644 index 000000000000..c38ebdedea5b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan import PddfFan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Fan(PddfFan): + """PDDF Platform-Specific Fan class""" + + def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): + # idx is 0-based + PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten + # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' + + def get_mfr_id(self): + """ + Retrieves the manufacturer id of the device + + Returns: + string: Manufacturer Id of device + """ + if self.is_psu_fan: + device = "PSU{}".format(self.fans_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_mfr_id") + else: + raise NotImplementedError + + if not output: + return None + + mfr = output['status'] + + # strip_non_ascii + stripped = (c for c in mfr if 0 < ord(c) < 127) + mfr = ''.join(stripped) + + return mfr.rstrip('\n') + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + if self.is_psu_fan: + device = "PSU{}".format(self.fans_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_model_name") + else: + raise NotImplementedError + + if not output: + return None + + model = output['status'] + + # strip_non_ascii + stripped = (c for c in model if 0 < ord(c) < 127) + model = ''.join(stripped) + + return model.rstrip('\n') + + def get_max_speed(self): + """ + Retrieves the model name + + Returns: + An string, the model name + """ + if self.is_psu_fan: + mfr = self.get_mfr_id() + model = self.get_model() + + max_speed = int(self.plugin_data['PSU']['valmap']['PSU_AC_FAN_MAX_SPEED']) + if mfr and model : + for dev in self.plugin_data['PSU']['psu_support_list']: + if dev['Manufacturer'] == mfr and dev['Name'] == model: + max_speed = int(self.plugin_data['PSU']['valmap'][dev['MaxSpd']]) + break + else: + if self.fan_index == 1: + max_speed = int(self.plugin_data['FAN']['FAN_F_MAX_SPEED']) + else: + max_speed = int(self.plugin_data['FAN']['FAN_R_MAX_SPEED']) + + return max_speed + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + if self.is_psu_fan: + attr_name = "psu_present" + device = "PSU{}".format(self.fans_psu_index) + else: + idx = (self.fantray_index-1)*self.platform['num_fans_pertray'] + self.fan_index + attr_name = "fan" + str(idx) + "_present" + device = "FAN-CTRL" + + output = self.pddf_obj.get_attr_name_output(device, attr_name) + if not output: + return False + + + mode = output['mode'] + presence = output['status'].rstrip() + vmap = self.plugin_data['FAN']['present'][mode]['valmap'] + + if presence in vmap: + status = vmap[presence] + else: + status = False + + return status + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed_percentage = 0 + + max_speed = self.get_max_speed() + rpm_speed = self.get_speed_rpm() + + speed_percentage = round((rpm_speed*100)/max_speed) + + return min(speed_percentage, 100) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + return self.get_speed() \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/platform.py new file mode 100644 index 000000000000..406b1179ae1b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/platform.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +############################################################################# +# PDDF +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + + +try: + from sonic_platform_pddf_base.pddf_platform import PddfPlatform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PddfPlatform): + """ + PDDF Platform-Specific Platform Class + """ + + def __init__(self): + PddfPlatform.__init__(self) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/psu.py new file mode 100644 index 000000000000..4f7e843361d4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/psu.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_psu import PddfPsu +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Psu(PddfPsu): + """PDDF Platform-Specific PSU class""" + + PLATFORM_PSU_CAPACITY = 750 + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + + # power is returned in micro watts + return round(float(self.get_voltage()*self.get_current()), 2) + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU (or PSU capacity) + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(self.PLATFORM_PSU_CAPACITY) \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/sfp.py new file mode 100644 index 000000000000..c7919482f69c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/sfp.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +try: + from sonic_platform_pddf_base.pddf_sfp import PddfSfp +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Sfp(PddfSfp): + """ + PDDF Platform-Specific Sfp class + """ + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data) + self.index = index + + # Provide the functions/variables below for which implementation is to be overwritten + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + + return self.SFP_STATUS_OK diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/thermal.py new file mode 100644 index 000000000000..77d6ec7ae886 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform/thermal.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_thermal import PddfThermal +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + + +class Thermal(PddfThermal): + """PDDF Platform-Specific Thermal class""" + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform_setup.py new file mode 100644 index 000000000000..2152c64d420a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/sonic_platform_setup.py @@ -0,0 +1,27 @@ +from setuptools import setup + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on ufispace platform', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='Nonodark Huangn', + maintainer_email='nonodark.huang@ufispace.com', + packages=['sonic_platform'], + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_device_create.sh b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_device_create.sh new file mode 100755 index 000000000000..47076d99c4ca --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_device_create.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +#disable bmc watchdog +echo "Disable BMC watchdog" +timeout 3 ipmitool mc watchdog off + +pddf_ledutil setstatusled SYS_LED off +pddf_ledutil setstatusled ID_LED off + +curr_led=$(pddf_ledutil getstatusled SYS_LED) +pddf_ledutil setstatusled SYS_LED green +echo "Set System $curr_led to green" + +echo "PDDF device post-create completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_driver_install.sh new file mode 100755 index 000000000000..ed2559977e42 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_post_driver_install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "PDDF driver post-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_device_create.sh b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_device_create.sh new file mode 100755 index 000000000000..df19dd9338a0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_device_create.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# import sonic env +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + +TRUE=0 +FALSE=1 + +PROTO=0 +ALPHA=1 +BETA=2 +PVT=3 + +PLATFORM=${PLATFORM:-x86_64-ufispace_s9110_32x-r0} +PLAT_CONF_PATH="/usr/share/sonic/device/$PLATFORM" +PLAT_CONF_FILE="/usr/share/sonic/device/$PLATFORM/platform.json" +PDDF_DEV_PATH="/usr/share/sonic/device/$PLATFORM/pddf" +PDDF_DEV_FILE="/usr/share/sonic/device/$PLATFORM/pddf/pddf-device.json" +IO_PORT_FILE="/dev/port" + +function _check_filepath { + filepath=$1 + if [ -z "${filepath}" ]; then + echo "[ERR] the ipnut string is empty!!!" + return ${FALSE} + elif [ ! -f "$filepath" ] && [ ! -c "$filepath" ]; then + echo "[ERR] No such file: ${filepath}" + return ${FALSE} + else + return ${TRUE} + fi +} + +if _check_filepath "$IO_PORT_FILE" ; then + MASK=2#00000011 + REG="0x$(xxd -s 0x701 -p -l 1 -c 1 /dev/port)" + HW_REV_ID=$(( $REG & $MASK )) +else + HW_REV_ID=$PVT +fi + +if [ "$HW_REV_ID" = "$BETA" ]; then + + src="$PDDF_DEV_PATH/pddf-device-beta.json" + if _check_filepath $src; then + ln -rsf "$src" "$PDDF_DEV_FILE" + fi + + src="$PLAT_CONF_PATH/platform-beta.json" + if _check_filepath $src; then + ln -rsf $src "$PLAT_CONF_FILE" + fi + +elif [ "$HW_REV_ID" -ge "$PVT" ]; then + src="$PDDF_DEV_PATH/pddf-device-pvt.json" + if _check_filepath $src; then + ln -rsf "$src" "$PDDF_DEV_FILE" + fi + + src="$PLAT_CONF_PATH/platform-pvt.json" + if _check_filepath $src; then + ln -rsf $src "$PLAT_CONF_FILE" + fi +else + src="$PDDF_DEV_PATH/pddf-device-pvt.json" + if _check_filepath $src; then + ln -rsf "$src" "$PDDF_DEV_FILE" + fi + + src="$PLAT_CONF_PATH/platform-pvt.json" + if _check_filepath $src; then + ln -rsf $src "$PLAT_CONF_FILE" + fi +fi diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_driver_install.sh b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_driver_install.sh new file mode 100755 index 000000000000..187943061e6c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_pre_driver_install.sh @@ -0,0 +1,11 @@ +#!/bin/bash +#rmmod gpio_ich +if [ ! -f /tmp/._pddf_pre_driver_init_completion ]; then + # make sure igb/i40e init in correct order + rmmod i2c-i801 + rmmod i2c_ismt + modprobe -r i2c-i801 + modprobe -r i2c_ismt + date > /tmp/._pddf_pre_driver_init_completion +fi +echo "PDDF driver pre-install completed" diff --git a/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_switch_svc.py b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_switch_svc.py new file mode 100755 index 000000000000..c556d77f1c66 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ufispace/s9110-32x/utils/pddf_switch_svc.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# Script to stop and start the respective platforms default services. +# This will be used while switching the pddf->non-pddf mode and vice versa +import commands + +def check_pddf_support(): + return True + +def stop_platform_svc(): + + ''' + status, output = commands.getstatusoutput("systemctl stop s9110-32x-platform-monitor-fan.service") + if status: + print "Stop s9110-32x-platform-fan.service failed %d"%status + return False + + status, output = commands.getstatusoutput("systemctl stop s9110-32x-platform-monitor-psu.service") + if status: + print "Stop s9110-32x-platform-psu.service failed %d"%status + return False + + status, output = commands.getstatusoutput("systemctl stop s9110-32x-platform-monitor.service") + if status: + print "Stop s9110-32x-platform-init.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl disable s9110-32x-platform-monitor.service") + if status: + print "Disable s9110-32x-platform-monitor.service failed %d"%status + return False + ''' + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py deinit") + if status: + print "platform_utility.py deinit command failed %d"%status + return False + + # HACK , stop the pddf-platform-init service if it is active + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service along with other platform serives failed %d"%status + return False + + return True + +def start_platform_svc(): + + status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py init") + if status: + print "platform_utility.py init command failed %d"%status + return False + + ''' + status, output = commands.getstatusoutput("systemctl enable s9110-32x-platform-monitor.service") + if status: + print "Enable s9110-32x-platform-monitor.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl start s9110-32x-platform-monitor-fan.service") + if status: + print "Start s9110-32x-platform-monitor-fan.service failed %d"%status + return False + + status, output = commands.getstatusoutput("systemctl start s9110-32x-platform-monitor-psu.service") + if status: + print "Start s9110-32x-platform-monitor-psu.service failed %d"%status + return False + ''' + return True + +def start_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") + if status: + print "Start pddf-platform-init.service failed %d"%status + return False + + return True + +def stop_platform_pddf(): + + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service failed %d"%status + return False + + return True + From 286ec3edbf91ec1bd09b6eae3a4d69801bdd94a9 Mon Sep 17 00:00:00 2001 From: Zhaohui Sun <94606222+ZhaohuiS@users.noreply.github.com> Date: Tue, 15 Aug 2023 08:49:49 +0800 Subject: [PATCH 133/145] Change orchagent pop batch size from 8192 to 1024 (#16125) ### Why I did it Background running lua script may cause redis-server quite busy if batch size is 8192. If handling time exceeded default 5s, the redis-server will not response to other process and will cause syncd crash. ``` Aug 9 07:46:29.512326 str-s6100-acs-5 INFO database#supervisord: redis 68:M 09 Aug 2023 07:46:29.511 # Lua slow script detected: still in execution after 5186 milliseconds. You can try killing the script using the SCRIPT KILL command. Script SHA1 is: 88270a7c5c90583e56425aca8af8a4b8c39fe757 Aug 9 07:46:29.523716 str-s6100-acs-5 ERR syncd#syncd: :- checkReplyType: Expected to get redis type 5 got type 6, err: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE. Aug 9 07:46:29.524818 str-s6100-acs-5 INFO syncd#supervisord: syncd terminate called after throwing an instance of ' Aug 9 07:46:29.525268 str-s6100-acs-5 ERR pmon#CCmisApi: :- checkReplyType: Expected to get redis type 5 got type 6, err: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE. Aug 9 07:46:29.526148 str-s6100-acs-5 INFO syncd#supervisord: syncd std::system_error' Aug 9 07:46:29.528308 str-s6100-acs-5 ERR pmon#psud[32]: :- checkReplyType: Expected to get redis type 5 got type 6, err: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE. Aug 9 07:46:29.529048 str-s6100-acs-5 ERR lldp#python3: :- guard: RedisReply catches system_error: command: *2#015#012$3#015#012DEL#015#012$27#015#012LLDP_ENTRY_TABLE:Ethernet37#015#012, reason: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.: Input/output error Aug 9 07:46:29.529720 str-s6100-acs-5 ERR snmp#python3: :- guard: RedisReply catches system_error: command: *2#015#012$7#015#012HGETALL#015#012$28#015#012COUNTERS:oid:0x100000000000a#015#012, reason: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.: Input/output error ``` 88270a7c5c90583e56425aca8af8a4b8c39fe757 is /usr/share/swss/consumer_state_table_pops.lua ##### Work item tracking - Microsoft ADO **24741990**: #### How I did it Change batch size from 8192 to1024. #### How to verify it Run all test cases in sonic-mgmt to verify the system stability. ### Tested branch (Please provide the tested image version) - [x] 20220531.36 --- dockers/docker-orchagent/orchagent.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 7585e4896cf4..45571944db30 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -17,8 +17,8 @@ fi mkdir -p /var/log/swss ORCHAGENT_ARGS="-d /var/log/swss " -# Set orchagent pop batch size to 8192 -ORCHAGENT_ARGS+="-b 8192 " +# Set orchagent pop batch size to 1024 +ORCHAGENT_ARGS+="-b 1024 " # Set synchronous mode if it is enabled in CONFIG_DB SYNC_MODE=$(echo $SWSS_VARS | jq -r '.synchronous_mode') From 5aa2417c71f2af8ba5c7a60c089e9f2bab4ee2f0 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Tue, 15 Aug 2023 14:49:19 +0800 Subject: [PATCH 134/145] [Mellanox] Update MFT to newer version 4.25.0-62 (#16149) - Why I did it Update Mellanox MFT tool to version 4.25.0-62 - How I did it Update the MFT tool make file - How to verify it Run full sonic-mgmt regression. Signed-off-by: Kebo Liu --- platform/mellanox/mft.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 1c0efa6a3df3..5ef30af77c55 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,8 +16,8 @@ # # Mellanox SAI -MFT_VERSION = 4.22.1 -MFT_REVISION = 15 +MFT_VERSION = 4.25.0 +MFT_REVISION = 62 MLNX_MFT_INTERNAL_SOURCE_BASE_URL = From 4acaaf8179f4f8505c9d70e8b49a7553afd88bbf Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Tue, 15 Aug 2023 15:07:17 +0800 Subject: [PATCH 135/145] [submodule] Update submodule sonic-swss to the latest HEAD automatically (#16157) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 72516235b180..aabe7411c113 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 72516235b180728389ed3b9bb9e18e9c67c5a283 +Subproject commit aabe7411c1132fe7559536da3d3cc3ea11798586 From 1626e198a8728643efe3701caedc3b28d00601f8 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Tue, 15 Aug 2023 20:32:52 +0800 Subject: [PATCH 136/145] [Mellanox] Update SDK/FW/SAI to 4.6.1020/2012.1020/SAIBuild2305.25.0.3 (#16096) SONiC changes: 1. Support Spectrum4 ASIC FW binary building. 2. Support new SDK sx-obj-desc lib building since new SAI need it. 3. Remove SX_SCEW debian package from Mellanox SDK build since we are no longer using it (we use libxml2 instead). 4. Update SAI, SDK, FW to version 4.6.1020/2012.1020/SAIBuild2305.25.0.3 SDK/FW bug fixes 1. In SPC-1 platforms: Fastboot mode is not operational for Split port with Force mode in 50G speed SFP modules are kept in disabled state after set LPM (low power mode) on/off for at least 3 minutes. 2. When preforming fast boot from an old SDK version (currently installed) to a newer one (target version), and the system was initially loaded with a new SDK version (past version), and the system has not been wiped, under specific conditions, the fast boot would use the past version's data and may fail. SDK/FW Features 1. On SN2700 all ports can support y cable by credo SAI bug Fixes 1. When creating an ACL rule with SAI_ACL_ENTRY_ATTR_FIELD_SRC_IP/SAI_ACL_ENTRY_ATTR_FIELD_DST_IP enabled, and then disabling the field by setting enable=false, a match on L3_type=IPv4 will remain programmed for the rule Issue resolved after the fix 2. Allow the max scale of virtual routers to be configure for SPC-1, SPC-2, SPC-3 when fastboot enable 3. Remove default hash key of SRC_MAC, DST_MAC and ETH_TYPE SAI features 1. Port init profile - How I did it Update SDK/FW/SAI make files - How to verify it Run full sonic-mgmt regression on Mellanox platform Signed-off-by: Kebo Liu --- .../build_templates/sonic_debian_extension.j2 | 1 + platform/mellanox/fw.dep | 4 ++ platform/mellanox/fw.mk | 20 +++++---- platform/mellanox/mlnx-fw-upgrade.j2 | 19 +++++++++ platform/mellanox/mlnx-sai.mk | 2 +- .../mellanox/sdk-src/sx-obj-desc-lib/Makefile | 29 +++++++++++++ platform/mellanox/sdk.dep | 38 ++++++++--------- platform/mellanox/sdk.mk | 42 ++++++++++--------- 8 files changed, 106 insertions(+), 49 deletions(-) create mode 100644 platform/mellanox/sdk-src/sx-obj-desc-lib/Makefile diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 09a5fe870a16..43a723824c0f 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -938,6 +938,7 @@ declare -rA FW_FILE_MAP=( \ [$MLNX_SPC_FW_FILE]="fw-SPC.mfa" \ [$MLNX_SPC2_FW_FILE]="fw-SPC2.mfa" \ [$MLNX_SPC3_FW_FILE]="fw-SPC3.mfa" \ + [$MLNX_SPC4_FW_FILE]="fw-SPC4.mfa" \ ) sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/fw/asic/ sudo mkdir -p $FILESYSTEM_ROOT_ETC/mlnx/ diff --git a/platform/mellanox/fw.dep b/platform/mellanox/fw.dep index 228f6dc87e36..f57bad8eb9b0 100644 --- a/platform/mellanox/fw.dep +++ b/platform/mellanox/fw.dep @@ -14,3 +14,7 @@ $(MLNX_SPC2_FW_FILE)_DEP_FILES := $(DEP_FILES) $(MLNX_SPC3_FW_FILE)_CACHE_MODE := GIT_CONTENT_SHA $(MLNX_SPC3_FW_FILE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(MLNX_SPC3_FW_FILE)_DEP_FILES := $(DEP_FILES) + +$(MLNX_SPC4_FW_FILE)_CACHE_MODE := GIT_CONTENT_SHA +$(MLNX_SPC4_FW_FILE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(MLNX_SPC4_FW_FILE)_DEP_FILES := $(DEP_FILES) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 9cde768bd1b8..e449c56e952a 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,33 +21,38 @@ MLNX_FW_BASE_PATH = $(MLNX_SDK_BASE_PATH) # Place an URL here to FW if you want to download FW instead MLNX_FW_BASE_URL = -SIMX_VERSION = 23.4-1072 +SIMX_VERSION = 23.7-1086 FW_FROM_URL = y -MLNX_FW_ASSETS_RELEASE_TAG = fw-2010.5144 +MLNX_FW_ASSETS_RELEASE_TAG = fw-2012.1020 MLNX_FW_ASSETS_URL = $(MLNX_ASSETS_GITHUB_URL)/releases/download/$(MLNX_FW_ASSETS_RELEASE_TAG) ifeq ($(MLNX_FW_BASE_URL), ) MLNX_FW_BASE_URL = $(MLNX_FW_ASSETS_URL) endif -MLNX_SPC_FW_VERSION = 13.2010.5144 +MLNX_SPC_FW_VERSION = 13.2012.1020 MLNX_SPC_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_SPC_FW_VERSION))-EVB.mfa $(MLNX_SPC_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC_FW_FILE) -MLNX_SPC2_FW_VERSION = 29.2010.5144 +MLNX_SPC2_FW_VERSION = 29.2012.1020 MLNX_SPC2_FW_FILE = fw-SPC2-rel-$(subst .,_,$(MLNX_SPC2_FW_VERSION))-EVB.mfa $(MLNX_SPC2_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC2_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC2_FW_FILE) -MLNX_SPC3_FW_VERSION = 30.2010.5144 +MLNX_SPC3_FW_VERSION = 30.2012.1020 MLNX_SPC3_FW_FILE = fw-SPC3-rel-$(subst .,_,$(MLNX_SPC3_FW_VERSION))-EVB.mfa $(MLNX_SPC3_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC3_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC3_FW_FILE) -MLNX_FW_FILES = $(MLNX_SPC_FW_FILE) $(MLNX_SPC2_FW_FILE) $(MLNX_SPC3_FW_FILE) +MLNX_SPC4_FW_VERSION = 34.2012.1020 +MLNX_SPC4_FW_FILE = fw-SPC4-rel-$(subst .,_,$(MLNX_SPC4_FW_VERSION))-EVB.mfa +$(MLNX_SPC4_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) +$(MLNX_SPC4_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC4_FW_FILE) + +MLNX_FW_FILES = $(MLNX_SPC_FW_FILE) $(MLNX_SPC2_FW_FILE) $(MLNX_SPC3_FW_FILE) $(MLNX_SPC4_FW_FILE) ifeq ($(FW_FROM_URL),n) SONIC_COPY_FILES += $(MLNX_FW_FILES) @@ -60,3 +65,4 @@ MLNX_FILES += $(MLNX_FW_FILES) export MLNX_SPC_FW_FILE export MLNX_SPC2_FW_FILE export MLNX_SPC3_FW_FILE +export MLNX_SPC4_FW_FILE diff --git a/platform/mellanox/mlnx-fw-upgrade.j2 b/platform/mellanox/mlnx-fw-upgrade.j2 index 676d07cf3e49..188aa0bfa58f 100755 --- a/platform/mellanox/mlnx-fw-upgrade.j2 +++ b/platform/mellanox/mlnx-fw-upgrade.j2 @@ -1,3 +1,16 @@ +{# + Copyright (c) 2020-2023 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + 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. +#} #!/bin/bash declare -r SCRIPT_NAME="$(basename "$0")" @@ -28,6 +41,7 @@ declare -r LIST_CONTENT_FILE="/tmp/mlxfwmanager-list-content.log" declare -r SPC1_ASIC="spc1" declare -r SPC2_ASIC="spc2" declare -r SPC3_ASIC="spc3" +declare -r SPC4_ASIC="spc4" declare -r UNKN_ASIC="unknown" declare -r UNKN_MST="unknown" @@ -35,6 +49,7 @@ declare -rA FW_FILE_MAP=( \ [$SPC1_ASIC]="fw-SPC.mfa" \ [$SPC2_ASIC]="fw-SPC2.mfa" \ [$SPC3_ASIC]="fw-SPC3.mfa" \ + [$SPC4_ASIC]="fw-SPC4.mfa" \ ) IMAGE_UPGRADE="${NO_PARAM}" @@ -160,6 +175,7 @@ function GetAsicType() { local -r SPC1_PRODUCT_ID="cb84" local -r SPC2_PRODUCT_ID="cf6c" local -r SPC3_PRODUCT_ID="cf70" + local -r SPC4_PRODUCT_ID="cf80" if lspci -n | grep "${VENDOR_ID}:${SPC1_PRODUCT_ID}" &>/dev/null; then echo "${SPC1_ASIC}" @@ -170,6 +186,9 @@ function GetAsicType() { elif lspci -n | grep "${VENDOR_ID}:${SPC3_PRODUCT_ID}" &>/dev/null; then echo "${SPC3_ASIC}" exit "${EXIT_SUCCESS}" + elif lspci -n | grep "${VENDOR_ID}:${SPC4_PRODUCT_ID}" &>/dev/null; then + echo "${SPC4_ASIC}" + exit "${EXIT_SUCCESS}" fi echo "${UNKN_ASIC}" diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 1c07186161d4..39015f758f03 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,6 +1,6 @@ # Mellanox SAI -MLNX_SAI_VERSION = SAIBuild2305.24.0.1 +MLNX_SAI_VERSION = SAIBuild2305.25.0.3 MLNX_SAI_ASSETS_GITHUB_URL = https://github.com/Mellanox/Spectrum-SDK-Drivers-SONiC-Bins MLNX_SAI_ASSETS_RELEASE_TAG = sai-$(MLNX_SAI_VERSION)-$(BLDENV)-$(CONFIGURED_ARCH) MLNX_SAI_ASSETS_URL = $(MLNX_ASSETS_GITHUB_URL)/releases/download/$(MLNX_SAI_ASSETS_RELEASE_TAG) diff --git a/platform/mellanox/sdk-src/sx-obj-desc-lib/Makefile b/platform/mellanox/sdk-src/sx-obj-desc-lib/Makefile new file mode 100644 index 000000000000..26d1f65ca720 --- /dev/null +++ b/platform/mellanox/sdk-src/sx-obj-desc-lib/Makefile @@ -0,0 +1,29 @@ +.ONESHELL: +SHELL = /bin/bash + +MAIN_TARGET = sx-obj-desc-lib_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sx-obj-desc-lib-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-obj-desc-lib-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-obj-desc-lib-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +PACKAGE_NAME = sx_obj_desc_lib + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # get sources + rm -rf $(PACKAGE_NAME)-$(MLNX_SDK_VERSION)-$(MLNX_SDK_ISSU_VERSION) + + wget -c $(MLNX_SDK_SOURCE_BASE_URL)/$(PACKAGE_NAME)-$(MLNX_SDK_VERSION)-$(MLNX_SDK_ISSU_VERSION).tar.gz -O - | tar -xz + + # build + pushd $(PACKAGE_NAME)-$(MLNX_SDK_VERSION)-$(MLNX_SDK_ISSU_VERSION) + + if [ -f autogen.sh ]; then + ./autogen.sh + fi + + debuild -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) + + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/platform/mellanox/sdk.dep b/platform/mellanox/sdk.dep index e5be175286c4..122548192c6c 100644 --- a/platform/mellanox/sdk.dep +++ b/platform/mellanox/sdk.dep @@ -94,27 +94,6 @@ $(SX_GEN_UTILS_DBGSYM)_DEP_FLAGS := $(MLNX_SDK_COMMON_FLAGS_LIST) $(SX_GEN_UTILS_DBGSYM)_DEP_FILES := $(DEP_FILES) endif -# SX_SCEW - -SPATH := $($(SX_SCEW)_SRC_PATH) -DEP_FILES := $(SONIC_COMMON_FILES_LIST) $(PLATFORM_PATH)/sdk.mk $(PLATFORM_PATH)/sdk.dep -DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) -DEP_FILES += $(shell git ls-files -- $(SPATH)) - -$(SX_SCEW)_CACHE_MODE := GIT_CONTENT_SHA -$(SX_SCEW)_DEP_FLAGS := $(MLNX_SDK_COMMON_FLAGS_LIST) -$(SX_SCEW)_DEP_FILES := $(DEP_FILES) - -$(SX_SCEW_DEV)_CACHE_MODE := GIT_CONTENT_SHA -$(SX_SCEW_DEV)_DEP_FLAGS := $(MLNX_SDK_COMMON_FLAGS_LIST) -$(SX_SCEW_DEV)_DEP_FILES := $(DEP_FILES) - -ifeq ($(SDK_FROM_SRC),y) -$(SX_SCEW_DBGSYM)_CACHE_MODE := GIT_CONTENT_SHA -$(SX_SCEW_DBGSYM)_DEP_FLAGS := $(MLNX_SDK_COMMON_FLAGS_LIST) -$(SX_SCEW_DBGSYM)_DEP_FILES := $(DEP_FILES) -endif - # SXD_LIBS SPATH := $($(SXD_LIBS)_SRC_PATH) @@ -212,6 +191,23 @@ $(SX_HASH_CALC_DBGSYM)_DEP_FLAGS := $(MLNX_SDK_COMMON_FLAGS_LIST) $(SX_HASH_CALC_DBGSYM)_DEP_FILES := $(DEP_FILES) endif +# SX_OBJ_DESC_LIB + +SPATH := $($(SX_OBJ_DESC_LIB)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) $(PLATFORM_PATH)/sdk.mk $(PLATFORM_PATH)/sdk.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files -- $(SPATH)) + +$(SX_OBJ_DESC_LIB)_CACHE_MODE := GIT_CONTENT_SHA +$(SX_OBJ_DESC_LIB)_DEP_FLAGS := $(MLNX_SDK_COMMON_FLAGS_LIST) +$(SX_OBJ_DESC_LIB)_DEP_FILES := $(DEP_FILES) + +ifeq ($(SDK_FROM_SRC),y) +$(SX_OBJ_DESC_LIB_DBGSYM)_CACHE_MODE := GIT_CONTENT_SHA +$(SX_OBJ_DESC_LIB_DBGSYM)_DEP_FLAGS := $(MLNX_SDK_COMMON_FLAGS_LIST) +$(SX_OBJ_DESC_LIB_DBGSYM)_DEP_FILES := $(DEP_FILES) +endif + # SX_KERNEL SPATH := $($(SX_KERNEL)_SRC_PATH) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 8a22444e4489..69a28c247778 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2023 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -MLNX_SDK_VERSION = 4.5.5142 +MLNX_SDK_VERSION = 4.6.1020 MLNX_SDK_ISSU_VERSION = 101 MLNX_SDK_DRIVERS_GITHUB_URL = https://github.com/Mellanox/Spectrum-SDK-Drivers @@ -35,18 +35,18 @@ endif export MLNX_SDK_SOURCE_BASE_URL MLNX_SDK_VERSION MLNX_SDK_ISSU_VERSION MLNX_SDK_DEB_VERSION MLNX_ASSETS_GITHUB_URL MLNX_SDK_DRIVERS_GITHUB_URL MLNX_SDK_RDEBS += $(APPLIBS) $(SX_COMPLIB) $(SX_EXAMPLES) \ - $(SX_GEN_UTILS) $(SX_SCEW) $(SXD_LIBS) $(WJH_LIBS) $(SX_ACL_HELPER) \ - $(SX_HASH_CALC) + $(SX_GEN_UTILS) $(SXD_LIBS) $(WJH_LIBS) $(SX_ACL_HELPER) \ + $(SX_HASH_CALC) $(SX_OBJ_DESC_LIB) MLNX_SDK_DEBS += $(APPLIBS_DEV) $(SX_COMPLIB_DEV) \ $(SX_COMPLIB_DEV_STATIC) $(SX_EXAMPLES_DEV) $(SX_GEN_UTILS_DEV) \ - $(SX_SCEW_DEV) $(SX_SCEW_DEV_STATIC) $(SXD_LIBS_DEV)\ - $(SXD_LIBS_DEV_STATIC) $(WJH_LIBS_DEV) $(SX_ACL_HELPER_DEV) $(SX_HASH_CALC) + $(SXD_LIBS_DEV) $(SXD_LIBS_DEV_STATIC) $(WJH_LIBS_DEV) $(SX_ACL_HELPER_DEV) \ + $(SX_HASH_CALC) $(SX_OBJ_DESC_LIB_DEV) MLNX_SDK_DBG_DEBS += $(APPLIBS_DBGSYM) $(SX_COMPLIB_DBGSYM) \ - $(SX_EXAMPLES_DBGSYM) $(SX_GEN_UTILS_DBGSYM) $(SX_SCEW_DBGSYM) \ + $(SX_EXAMPLES_DBGSYM) $(SX_GEN_UTILS_DBGSYM) \ $(SXD_LIBS_DBGSYM) $(WJH_LIBS_DBGSYM) $(SX_ACL_HELPER_DBGSYM) \ - $(SX_HASH_CALC_DBGSYM) + $(SX_HASH_CALC_DBGSYM) $(SX_OBJ_DESC_LIB_DBGSYM) APPLIBS = applibs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(APPLIBS)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/applibs @@ -70,8 +70,8 @@ endif SX_EXAMPLES = sx-examples_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SX_EXAMPLES)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-examples -$(SX_EXAMPLES)_DEPENDS += $(APPLIBS_DEV) $(SX_SCEW_DEV) $(SXD_LIBS_DEV) -$(SX_EXAMPLES)_RDEPENDS += $(APPLIBS) $(SX_SCEW) $(SXD_LIBS) +$(SX_EXAMPLES)_DEPENDS += $(APPLIBS_DEV) $(SXD_LIBS_DEV) +$(SX_EXAMPLES)_RDEPENDS += $(APPLIBS) $(SXD_LIBS) SX_EXAMPLES_DEV = sx-examples-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SX_EXAMPLES),$(SX_EXAMPLES_DEV))) SX_EXAMPLES_DBGSYM = sx-examples-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb @@ -90,15 +90,6 @@ ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SX_GEN_UTILS),$(SX_GEN_UTILS_DBGSYM))) endif -SX_SCEW = sx-scew_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb -$(SX_SCEW)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-scew -SX_SCEW_DEV = sx-scew-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb -$(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DEV))) -SX_SCEW_DBGSYM = sx-scew-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb -ifeq ($(SDK_FROM_SRC),y) -$(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DBGSYM))) -endif - SXD_LIBS = sxd-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SXD_LIBS)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sxd-libs $(SXD_LIBS)_DEPENDS += $(SX_COMPLIB_DEV) $(SX_GEN_UTILS_DEV) @@ -130,9 +121,20 @@ ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SX_ACL_HELPER),$(SX_ACL_HELPER_DBGSYM))) endif +SX_OBJ_DESC_LIB = sx-obj-desc-lib_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +$(SX_OBJ_DESC_LIB)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-obj-desc-lib +$(SX_OBJ_DESC_LIB)_DEPENDS += $(APPLIBS_DEV) $(SX_COMPLIB_DEV) $(SXD_LIBS_DEV) +$(SX_OBJ_DESC_LIB)_RDEPENDS += $(APPLIBS) $(SX_COMPLIB) $(PYTHON_SDK_API) +SX_OBJ_DESC_LIB_DEV = sx-obj-desc-lib-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(SX_OBJ_DESC_LIB),$(SX_OBJ_DESC_LIB_DEV))) +SX_OBJ_DESC_LIB_DBGSYM = sx-obj-desc-lib-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +ifeq ($(SDK_FROM_SRC),y) +$(eval $(call add_derived_package,$(SX_OBJ_DESC_LIB),$(SX_OBJ_DESC_LIB_DBGSYM))) +endif + WJH_LIBS = wjh-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(WJH_LIBS)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/wjh-libs -$(WJH_LIBS)_DEPENDS += $(SX_COMPLIB_DEV) $(SXD_LIBS_DEV) $(APPLIBS_DEV) $(SX_ACL_HELPER_DEV) $(SX_SCEW_DEV) +$(WJH_LIBS)_DEPENDS += $(SX_COMPLIB_DEV) $(SXD_LIBS_DEV) $(APPLIBS_DEV) $(SX_ACL_HELPER_DEV) $(WJH_LIBS)_RDEPENDS += $(SX_COMPLIB) $(PYTHON_SDK_API) $(SX_ACL_HELPER) WJH_LIBS_DEV = wjh-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(WJH_LIBS),$(WJH_LIBS_DEV))) From cf72683f12da2cf8705d3873d12c8447bdec3699 Mon Sep 17 00:00:00 2001 From: Andriy Dobush <78359998+andriydnvd@users.noreply.github.com> Date: Tue, 15 Aug 2023 21:18:50 +0300 Subject: [PATCH 137/145] Remove privileged flag for database and snmp docker (#13783) #### Why I did it Reduce docker privilege This is part of HLD https://github.com/sonic-net/SONiC/pull/1364 #### How I did it Remove flag --privileged #### How to verify it docker exec -it database bash root@0048b82b460b:/# ip link add dummy0 type dummy RTNETLINK answers: Operation not permitted --- rules/docker-database.mk | 2 +- rules/docker-snmp.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/docker-database.mk b/rules/docker-database.mk index a10609933c35..48f3b88a0294 100644 --- a/rules/docker-database.mk +++ b/rules/docker-database.mk @@ -25,7 +25,7 @@ SONIC_DOCKER_DBG_IMAGES += $(DOCKER_DATABASE_DBG) SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_DATABASE_DBG) $(DOCKER_DATABASE)_CONTAINER_NAME = database -$(DOCKER_DATABASE)_RUN_OPT += --privileged -t +$(DOCKER_DATABASE)_RUN_OPT += -t $(DOCKER_DATABASE)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_DATABASE)_RUN_OPT += -v /etc/timezone:/etc/timezone:ro diff --git a/rules/docker-snmp.mk b/rules/docker-snmp.mk index d350540dbe2f..00c20ab6cf72 100644 --- a/rules/docker-snmp.mk +++ b/rules/docker-snmp.mk @@ -28,7 +28,7 @@ SONIC_DOCKER_DBG_IMAGES += $(DOCKER_SNMP_DBG) SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_SNMP_DBG) $(DOCKER_SNMP)_CONTAINER_NAME = snmp -$(DOCKER_SNMP)_RUN_OPT += --privileged -t +$(DOCKER_SNMP)_RUN_OPT += -t $(DOCKER_SNMP)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_SNMP)_RUN_OPT += -v /etc/timezone:/etc/timezone:ro $(DOCKER_SNMP)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) From 030c57200da5a827319f5eacdfa6deac02c5b7f5 Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Tue, 15 Aug 2023 14:27:12 -0400 Subject: [PATCH 138/145] [docker-lldp] limit privileged flag for lldp container (#15830) #### Why I did it HLD implementation: Container Hardening (https://github.com/sonic-net/SONiC/pull/1364) ##### Work item tracking - Microsoft ADO **(number only)**: 14807420 #### How I did it Reduce linux capabilities in privileged flag, retain NET_ADMIN capability --- rules/docker-lldp.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/docker-lldp.mk b/rules/docker-lldp.mk index 95172d6cf368..ddd079c4d3e2 100644 --- a/rules/docker-lldp.mk +++ b/rules/docker-lldp.mk @@ -28,7 +28,7 @@ SONIC_DOCKER_DBG_IMAGES += $(DOCKER_LLDP_DBG) SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_LLDP_DBG) $(DOCKER_LLDP)_CONTAINER_NAME = lldp -$(DOCKER_LLDP)_RUN_OPT += --privileged -t +$(DOCKER_LLDP)_RUN_OPT += -t --cap-add=NET_ADMIN $(DOCKER_LLDP)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_LLDP)_RUN_OPT += -v /etc/timezone:/etc/timezone:ro From d4923615d60ba4bb3a380aab597ddd5eca817620 Mon Sep 17 00:00:00 2001 From: Vivek Date: Tue, 15 Aug 2023 22:30:33 -0700 Subject: [PATCH 139/145] [Mellanox] [SN4410] Support new breakout modes for PAM4 (#15668) - Why I did it Add new breakout modes to be used in PAM4 supported cables - How I did it - How to verify it Verified the 50G per lane breakout modes are applied properly on the switch Signed-off-by: Vivek Reddy Karri --- .../ACS-MSN4410/hwsku.json | 48 ++--- .../x86_64-mlnx_msn4410-r0/platform.json | 168 +++++++++++++----- 2 files changed, 144 insertions(+), 72 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/hwsku.json b/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/hwsku.json index 13eceb4baba5..6e1c31705bd4 100644 --- a/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/hwsku.json +++ b/device/mellanox/x86_64-mlnx_msn4410-r0/ACS-MSN4410/hwsku.json @@ -1,76 +1,76 @@ { "interfaces": { "Ethernet0": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet8": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet16": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet24": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet32": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet40": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet48": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet56": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet64": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet72": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet80": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet88": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet96": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet104": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet112": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet120": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet128": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet136": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet144": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet152": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet160": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet168": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet176": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet184": { - "default_brkout_mode": "2x100G[50G,40G,25G,10G,1G]" + "default_brkout_mode": "2x100G[200G,50G,40G,25G,10G,1G]" }, "Ethernet192": { "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G,1G]" diff --git a/device/mellanox/x86_64-mlnx_msn4410-r0/platform.json b/device/mellanox/x86_64-mlnx_msn4410-r0/platform.json index bf9b9ea30247..f357ea2a48b3 100644 --- a/device/mellanox/x86_64-mlnx_msn4410-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn4410-r0/platform.json @@ -411,216 +411,288 @@ "index": "1,1,1,1,1,1,1,1", "lanes": "0,1,2,3,4,5,6,7", "breakout_modes": { + "1x50G(1)": ["etp1"], + "1x100G(2)": ["etp1"], + "1x200G(4)": ["etp1"], "1x100G[50G,40G,25G,10G,1G]": ["etp1"], - "2x100G[50G,40G,25G,10G,1G]": ["etp1a", "etp1b"], - "4x50G[25G,10G,1G]": ["etp1a", "etp1b", "etp1c", "etp1d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp1a", "etp1b"], + "4x100G[50G,25G,10G,1G]": ["etp1a", "etp1b", "etp1c", "etp1d"] } }, "Ethernet8": { "index": "2,2,2,2,2,2,2,2", "lanes": "8,9,10,11,12,13,14,15", "breakout_modes": { + "1x50G(1)": ["etp2"], + "1x100G(2)": ["etp2"], + "1x200G(4)": ["etp2"], "1x100G[50G,40G,25G,10G,1G]": ["etp2"], - "2x100G[50G,40G,25G,10G,1G]": ["etp2a", "etp2b"], - "4x50G[25G,10G,1G]": ["etp2a", "etp2b", "etp2c", "etp2d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp2a", "etp2b"], + "4x100G[50G,25G,10G,1G]": ["etp2a", "etp2b", "etp2c", "etp2d"] } }, "Ethernet16": { "index": "3,3,3,3,3,3,3,3", "lanes": "16,17,18,19,20,21,22,23", "breakout_modes": { + "1x50G(1)": ["etp3"], + "1x100G(2)": ["etp3"], + "1x200G(4)": ["etp3"], "1x100G[50G,40G,25G,10G,1G]": ["etp3"], - "2x100G[50G,40G,25G,10G,1G]": ["etp3a", "etp3b"], - "4x50G[25G,10G,1G]": ["etp3a", "etp3b", "etp3c", "etp3d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp3a", "etp3b"], + "4x100G[50G,25G,10G,1G]": ["etp3a", "etp3b", "etp3c", "etp3d"] } }, "Ethernet24": { "index": "4,4,4,4,4,4,4,4", "lanes": "24,25,26,27,28,29,30,31", "breakout_modes": { + "1x50G(1)": ["etp4"], + "1x100G(2)": ["etp4"], + "1x200G(4)": ["etp4"], "1x100G[50G,40G,25G,10G,1G]": ["etp4"], - "2x100G[50G,40G,25G,10G,1G]": ["etp4a", "etp4b"], - "4x50G[25G,10G,1G]": ["etp4a", "etp4b", "etp4c", "etp4d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp4a", "etp4b"], + "4x100G[50G,25G,10G,1G]": ["etp4a", "etp4b", "etp4c", "etp4d"] } }, "Ethernet32": { "index": "5,5,5,5,5,5,5,5,5", "lanes": "32,33,34,35,36,37,38,39", "breakout_modes": { + "1x50G(1)": ["etp5"], + "1x100G(2)": ["etp5"], + "1x200G(4)": ["etp5"], "1x100G[50G,40G,25G,10G,1G]": ["etp5"], - "2x100G[50G,40G,25G,10G,1G]": ["etp5a", "etp5b"], - "4x50G[25G,10G,1G]": ["etp5a", "etp5b", "etp5c", "etp5d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp5a", "etp5b"], + "4x100G[50G,25G,10G,1G]": ["etp5a", "etp5b", "etp5c", "etp5d"] } }, "Ethernet40": { "index": "6,6,6,6,6,6,6,6", "lanes": "40,41,42,43,44,45,46,47", "breakout_modes": { + "1x50G(1)": ["etp6"], + "1x100G(2)": ["etp6"], + "1x200G(4)": ["etp6"], "1x100G[50G,40G,25G,10G,1G]": ["etp6"], - "2x100G[50G,40G,25G,10G,1G]": ["etp6a", "etp6b"], - "4x50G[25G,10G,1G]": ["etp6a", "etp6b", "etp6c", "etp6d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp6a", "etp6b"], + "4x100G[50G,25G,10G,1G]": ["etp6a", "etp6b", "etp6c", "etp6d"] } }, "Ethernet48": { "index": "7,7,7,7,7,7,7,7", "lanes": "48,49,50,51,52,53,54,55", "breakout_modes": { + "1x50G(1)": ["etp7"], + "1x100G(2)": ["etp7"], + "1x200G(4)": ["etp7"], "1x100G[50G,40G,25G,10G,1G]": ["etp7"], - "2x100G[50G,40G,25G,10G,1G]": ["etp7a", "etp7b"], - "4x50G[25G,10G,1G]": ["etp7a", "etp7b", "etp7c", "etp7d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp7a", "etp7b"], + "4x100G[50G,25G,10G,1G]": ["etp7a", "etp7b", "etp7c", "etp7d"] } }, "Ethernet56": { "index": "8,8,8,8,8,8,8,8", "lanes": "56,57,58,59,60,61,62,63", "breakout_modes": { + "1x50G(1)": ["etp8"], + "1x100G(2)": ["etp8"], + "1x200G(4)": ["etp8"], "1x100G[50G,40G,25G,10G,1G]": ["etp8"], - "2x100G[50G,40G,25G,10G,1G]": ["etp8a", "etp8b"], - "4x50G[25G,10G,1G]": ["etp8a", "etp8b", "etp8c", "etp8d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp8a", "etp8b"], + "4x100G[50G,25G,10G,1G]": ["etp8a", "etp8b", "etp8c", "etp8d"] } }, "Ethernet64": { "index": "9,9,9,9,9,9,9,9", "lanes": "64,65,66,67,68,69,70,71", "breakout_modes": { + "1x50G(1)": ["etp9"], + "1x100G(2)": ["etp9"], + "1x200G(4)": ["etp9"], "1x100G[50G,40G,25G,10G,1G]": ["etp9"], - "2x100G[50G,40G,25G,10G,1G]": ["etp9a", "etp9b"], - "4x50G[25G,10G,1G]": ["etp9a", "etp9b", "etp9c", "etp9d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp9a", "etp9b"], + "4x100G[50G,25G,10G,1G]": ["etp9a", "etp9b", "etp9c", "etp9d"] } }, "Ethernet72": { "index": "10,10,10,10,10,10,10,10", "lanes": "72,73,74,75,76,77,78,79", "breakout_modes": { + "1x50G(1)": ["etp10"], + "1x100G(2)": ["etp10"], + "1x200G(4)": ["etp10"], "1x100G[50G,40G,25G,10G,1G]": ["etp10"], - "2x100G[50G,40G,25G,10G,1G]": ["etp10a", "etp10b"], - "4x50G[25G,10G,1G]": ["etp10a", "etp10b", "etp10c", "etp10d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp10a", "etp10b"], + "4x100G[50G,25G,10G,1G]": ["etp10a", "etp10b", "etp10c", "etp10d"] } }, "Ethernet80": { "index": "11,11,11,11,11,11,11,11", "lanes": "80,81,82,83,84,85,86,87", "breakout_modes": { + "1x50G(1)": ["etp11"], + "1x100G(2)": ["etp11"], + "1x200G(4)": ["etp11"], "1x100G[50G,40G,25G,10G,1G]": ["etp11"], - "2x100G[50G,40G,25G,10G,1G]": ["etp11a", "etp11b"], - "4x50G[25G,10G,1G]": ["etp11a", "etp11b", "etp11c", "etp11d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp11a", "etp11b"], + "4x100G[50G,25G,10G,1G]": ["etp11a", "etp11b", "etp11c", "etp11d"] } }, "Ethernet88": { "index": "12,12,12,12,12,12,12,12", "lanes": "88,89,90,91,92,93,94,95", "breakout_modes": { + "1x50G(1)": ["etp12"], + "1x100G(2)": ["etp12"], + "1x200G(4)": ["etp12"], "1x100G[50G,40G,25G,10G,1G]": ["etp12"], - "2x100G[50G,40G,25G,10G,1G]": ["etp12a", "etp12b"], - "4x50G[25G,10G,1G]": ["etp12a", "etp12b", "etp12c", "etp12d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp12a", "etp12b"], + "4x100G[50G,25G,10G,1G]": ["etp12a", "etp12b", "etp12c", "etp12d"] } }, "Ethernet96": { "index": "13,13,13,13,13,13,13,13", "lanes": "96,97,98,99,100,101,102,103", "breakout_modes": { + "1x50G(1)": ["etp13"], + "1x100G(2)": ["etp13"], + "1x200G(4)": ["etp13"], "1x100G[50G,40G,25G,10G,1G]": ["etp13"], - "2x100G[50G,40G,25G,10G,1G]": ["etp13a", "etp13b"], - "4x50G[25G,10G,1G]": ["etp13a", "etp13b", "etp13c", "etp13d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp13a", "etp13b"], + "4x100G[50G,25G,10G,1G]": ["etp13a", "etp13b", "etp13c", "etp13d"] } }, "Ethernet104": { "index": "14,14,14,14,14,14,14,14", "lanes": "104,105,106,107,108,109,110,111", "breakout_modes": { + "1x50G(1)": ["etp14"], + "1x100G(2)": ["etp14"], + "1x200G(4)": ["etp14"], "1x100G[50G,40G,25G,10G,1G]": ["etp14"], - "2x100G[50G,40G,25G,10G,1G]": ["etp14a", "etp14b"], - "4x50G[25G,10G,1G]": ["etp14a", "etp14b", "etp14c", "etp14d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp14a", "etp14b"], + "4x100G[50G,25G,10G,1G]": ["etp14a", "etp14b", "etp14c", "etp14d"] } }, "Ethernet112": { "index": "15,15,15,15,15,15,15,15", "lanes": "112,113,114,115,116,117,118,119", "breakout_modes": { + "1x50G(1)": ["etp15"], + "1x100G(2)": ["etp15"], + "1x200G(4)": ["etp15"], "1x100G[50G,40G,25G,10G,1G]": ["etp15"], - "2x100G[50G,40G,25G,10G,1G]": ["etp15a", "etp15b"], - "4x50G[25G,10G,1G]": ["etp15a", "etp15b", "etp15c", "etp15d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp15a", "etp15b"], + "4x100G[50G,25G,10G,1G]": ["etp15a", "etp15b", "etp15c", "etp15d"] } }, "Ethernet120": { "index": "16,16,16,16,16,16,16,16", "lanes": "120,121,122,123,124,125,126,127", "breakout_modes": { + "1x50G(1)": ["etp16"], + "1x100G(2)": ["etp16"], + "1x200G(4)": ["etp16"], "1x100G[50G,40G,25G,10G,1G]": ["etp16"], - "2x100G[50G,40G,25G,10G,1G]": ["etp16a", "etp16b"], - "4x50G[25G,10G,1G]": ["etp16a", "etp16b", "etp16c", "etp16d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp16a", "etp16b"], + "4x100G[50G,25G,10G,1G]": ["etp16a", "etp16b", "etp16c", "etp16d"] } }, "Ethernet128": { "index": "17,17,17,17,17,17,17,17", "lanes": "128,129,130,131,132,133,134,135", "breakout_modes": { + "1x50G(1)": ["etp17"], + "1x100G(2)": ["etp17"], + "1x200G(4)": ["etp17"], "1x100G[50G,40G,25G,10G,1G]": ["etp17"], - "2x100G[50G,40G,25G,10G,1G]": ["etp17a", "etp17b"], - "4x50G[25G,10G,1G]": ["etp17a", "etp17b", "etp17c", "etp17d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp17a", "etp17b"], + "4x100G[50G,25G,10G,1G]": ["etp17a", "etp17b", "etp17c", "etp17d"] } }, "Ethernet136": { "index": "18,18,18,18,18,18,18,18", "lanes": "136,137,138,139,140,141,142,143", "breakout_modes": { + "1x50G(1)": ["etp18"], + "1x100G(2)": ["etp18"], + "1x200G(4)": ["etp18"], "1x100G[50G,40G,25G,10G,1G]": ["etp18"], - "2x100G[50G,40G,25G,10G,1G]": ["etp18a", "etp18b"], - "4x50G[25G,10G,1G]": ["etp18a", "etp18b", "etp18c", "etp18d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp18a", "etp18b"], + "4x100G[50G,25G,10G,1G]": ["etp18a", "etp18b", "etp18c", "etp18d"] } }, "Ethernet144": { "index": "19,19,19,19,19,19,19,19", "lanes": "144,145,146,147,148,149,150,151", "breakout_modes": { + "1x50G(1)": ["etp19"], + "1x100G(2)": ["etp19"], + "1x200G(4)": ["etp19"], "1x100G[50G,40G,25G,10G,1G]": ["etp19"], - "2x100G[50G,40G,25G,10G,1G]": ["etp19a", "etp19b"], - "4x50G[25G,10G,1G]": ["etp19a", "etp19b", "etp19c", "etp19d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp19a", "etp19b"], + "4x100G[50G,25G,10G,1G]": ["etp19a", "etp19b", "etp19c", "etp19d"] } }, "Ethernet152": { "index": "20,20,20,20,20,20,20,20", "lanes": "152,153,154,155,156,157,158,159", "breakout_modes": { + "1x50G(1)": ["etp20"], + "1x100G(2)": ["etp20"], + "1x200G(4)": ["etp20"], "1x100G[50G,40G,25G,10G,1G]": ["etp20"], - "2x100G[50G,40G,25G,10G,1G]": ["etp20a", "etp20b"], - "4x50G[25G,10G,1G]": ["etp20a", "etp20b", "etp20c", "etp20d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp20a", "etp20b"], + "4x100G[50G,25G,10G,1G]": ["etp20a", "etp20b", "etp20c", "etp20d"] } }, "Ethernet160": { "index": "21,21,21,21,21,21,21,21", "lanes": "160,161,162,163,164,165,166,167", "breakout_modes": { + "1x50G(1)": ["etp21"], + "1x100G(2)": ["etp21"], + "1x200G(4)": ["etp21"], "1x100G[50G,40G,25G,10G,1G]": ["etp21"], - "2x100G[50G,40G,25G,10G,1G]": ["etp21a", "etp21b"], - "4x50G[25G,10G,1G]": ["etp21a", "etp21b", "etp21c", "etp21d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp21a", "etp21b"], + "4x100G[50G,25G,10G,1G]": ["etp21a", "etp21b", "etp21c", "etp21d"] } }, "Ethernet168": { "index": "22,22,22,22,22,22,22,22", "lanes": "168,169,170,171,172,173,174,175", "breakout_modes": { + "1x50G(1)": ["etp22"], + "1x100G(2)": ["etp22"], + "1x200G(4)": ["etp22"], "1x100G[50G,40G,25G,10G,1G]": ["etp22"], - "2x100G[50G,40G,25G,10G,1G]": ["etp22a", "etp22b"], - "4x50G[25G,10G,1G]": ["etp22a", "etp22b", "etp22c", "etp22d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp22a", "etp22b"], + "4x100G[50G,25G,10G,1G]": ["etp22a", "etp22b", "etp22c", "etp22d"] } }, "Ethernet176": { "index": "23,23,23,23,23,23,23,23", "lanes": "176,177,178,179,180,181,182,183", "breakout_modes": { + "1x50G(1)": ["etp23"], + "1x100G(2)": ["etp23"], + "1x200G(4)": ["etp23"], "1x100G[50G,40G,25G,10G,1G]": ["etp23"], - "2x100G[50G,40G,25G,10G,1G]": ["etp23a", "etp23b"], - "4x50G[25G,10G,1G]": ["etp23a", "etp23b", "etp23c", "etp23d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp23a", "etp23b"], + "4x100G[50G,25G,10G,1G]": ["etp23a", "etp23b", "etp23c", "etp23d"] } }, "Ethernet184": { "index": "24,24,24,24,24,24,24,24", "lanes": "184,185,186,187,188,189,190,191", "breakout_modes": { + "1x50G(1)": ["etp24"], + "1x100G(2)": ["etp24"], + "1x200G(4)": ["etp24"], "1x100G[50G,40G,25G,10G,1G]": ["etp24"], - "2x100G[50G,40G,25G,10G,1G]": ["etp24a", "etp24b"], - "4x50G[25G,10G,1G]": ["etp24a", "etp24b", "etp24c", "etp24d"] + "2x200G[100G,50G,40G,25G,10G,1G]": ["etp24a", "etp24b"], + "4x100G[50G,25G,10G,1G]": ["etp24a", "etp24b", "etp24c", "etp24d"] } }, "Ethernet192": { From 5723ba29e423dc12934ae0a84aafed198f291613 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Wed, 16 Aug 2023 14:18:50 -0700 Subject: [PATCH 140/145] Remove depot_tools repo (#16114) It appears that this was initially added to provide the git-retry command (which doesn't appear to be used today). However, this repo is now also providing bazel (which is actually used in our build today), and this command (along with git-retry) expects some vpython3 binary to be set up/installed. Rather than going through that, just get rid of this repo. --- sonic-slave-bullseye/Dockerfile.j2 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 72783f3e6da6..21e49c898130 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -573,10 +573,6 @@ RUN cd /usr/src/gtest && cmake . && make -C /usr/src/gtest RUN mkdir /var/run/sshd EXPOSE 22 -# Install depot-tools (for git-retry) -RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools -ENV PATH /usr/share/depot_tools:$PATH - # Install dependencies for dhcp relay test RUN pip3 install parameterized==0.8.1 RUN pip3 install pyfakefs From 6c96b294846a279972525c605b983c1f6d263c4b Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Thu, 17 Aug 2023 12:48:57 -0400 Subject: [PATCH 141/145] [docker-teamd] limit privileged flag for teamd container (#15829) Signed-off-by: Mai Bui --- rules/docker-teamd.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index ae5cc838450d..275fe1c06310 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -33,7 +33,7 @@ SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_TEAMD_DBG) endif $(DOCKER_TEAMD)_CONTAINER_NAME = teamd -$(DOCKER_TEAMD)_RUN_OPT += --privileged -t +$(DOCKER_TEAMD)_RUN_OPT += -t --cap-add=NET_ADMIN $(DOCKER_TEAMD)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_TEAMD)_RUN_OPT += -v /etc/timezone:/etc/timezone:ro $(DOCKER_TEAMD)_RUN_OPT += -v /host/warmboot:/var/warmboot From a28352e7819b4cecf03559d53e38ec5aefebbfe7 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Thu, 17 Aug 2023 19:35:21 -0400 Subject: [PATCH 142/145] [Nokia][DeviceData] Update the Nokia platform IXR-7250E device data (#16028) Why I did it Update the platform_reboot of Nokia Platform IXR-7250E-36x400G to displays the correct reboot-cause history when reboot from supervisor card. Work item tracking Microsoft ADO (number only): How I did it Modify the platform_reboot script to copy the correct reboo-cause.txt file from NDK to the /host/reboot-cause directory at the down cycle when the reboot is issued from Supervisor (for both reboot right after install a new image and normal reboot) Signed-off-by: mlok --- .../platform_reboot | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot index 180db164df69..43aace70f7ee 100755 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot @@ -1,23 +1,24 @@ #!/bin/bash -update_reboot_cause_for_supervisor_reboot() +update_reboot_cause() { DEVICE_MGR_REBOOT_FILE=/tmp/device_mgr_reboot REBOOT_CAUSE_FILE=/host/reboot-cause/reboot-cause.txt - TMP_REBOOT_CAUSE_FILE=/tmp/tmp-reboot-cause.txt - if [ -f $DEVICE_MGR_REBOOT_FILE ]; then - if [ -f $REBOOT_CAUSE_FILE ]; then - t1=`sudo grep "User: ," $REBOOT_CAUSE_FILE` - if [ ! -z "$t1" ]; then - echo $t1 | sed 's/reboot/reboot from Supervisor/g' | sed 's/User: /User: admin/g' > $TMP_REBOOT_CAUSE_FILE - cp $TMP_REBOOT_CAUSE_FILE $REBOOT_CAUSE_FILE - fi + DEVICE_REBOOT_CAUSE_FILE=/etc/opt/srlinux/reboot-cause.txt + if [ -e $DEVICE_MGR_REBOOT_FILE ]; then + if [ -e $DEVICE_REBOOT_CAUSE_FILE ]; then + cp -f $DEVICE_REBOOT_CAUSE_FILE $REBOOT_CAUSE_FILE fi + rm -f $DEVICE_MGR_REBOOT_FILE + else + touch /etc/opt/srlinux/devmgr_reboot_cause.done + rm -f $DEVICE_REBOOT_CAUSE_FILE &> /dev/null fi + sync } # update the reboot_cuase file when reboot is trigger by device-mgr -update_reboot_cause_for_supervisor_reboot +update_reboot_cause systemctl stop nokia-watchdog.service sleep 2 @@ -25,7 +26,5 @@ echo "w" > /dev/watchdog kick_date=`date -u` echo "last watchdog kick $kick_date" > /var/log/nokia-watchdog-last.log rm -f /sys/firmware/efi/efivars/dump-* -touch /etc/opt/srlinux/devmgr_reboot_cause.done -rm -f /etc/opt/srlinux/reboot-cause.txt sync exec /sbin/reboot $@ From a4098de52956b78daaf5730b855e3fdffd0502f9 Mon Sep 17 00:00:00 2001 From: Aaron Payment Date: Fri, 18 Aug 2023 13:05:05 -0700 Subject: [PATCH 143/145] Misc platform improvements for DCS-7060DX5-64S (#13875) * sonic-buildimage: Add 7060DX5-64S brcm tunnel config Add bcm_tunnel_term_compatible_mode: 1 support, which allows Loopback configuration to no longer result in SAI failure "tunnel terminator add failed with error Feature unavailable" that caused Orchagent SIGABRT Signed-off-by: Aaron Payment * sonic-buildimage: Set port config ENABLE:0 in 7060DX5-64S brcm config Set ENABLE:0 for the front panel ports in the brcm config so that the ports are default admin down. This change prevents the issue that ports are able to link up and pass traffic resulting in mac learn events after SAI create switch and before SAI admin state up. The unexpected mac learn events resulted in Orch agent crash in PortsOrch init, which occurs after SAI create switch and before SAI admin state up. * fix sensors.conf on CatalinaDD * Add support for two sfp ports * Add copper 50g tuning to babbagelp on catalina --------- Signed-off-by: Aaron Payment Co-authored-by: enes.oncu Co-authored-by: Boyang Yu --- .../Arista-7060DX5-64S/hwsku.json | 8 +++ .../Arista-7060DX5-64S/port_config.ini | 2 + .../th4-a7060dx5-64s.config.bcm | 19 +++++- .../x86_64-arista_7060dx5_64s/platform.json | 66 ++++++++++++------- .../Arista-7060PX5-64S/blackhawk.xml | 25 +++++-- .../x86_64-arista_7060px5_64s/sensors.conf | 11 +--- 6 files changed, 91 insertions(+), 40 deletions(-) diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json index 7862b2cd4667..56c0816289b2 100644 --- a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json @@ -255,6 +255,14 @@ "Ethernet504": { "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", "fec": "rs" + }, + "Ethernet512": { + "default_brkout_mode": "1x10G", + "fec": "none" + }, + "Ethernet513": { + "default_brkout_mode": "1x10G", + "fec": "none" } } } diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini index 1aaf907498e2..c7bdcf79be6a 100644 --- a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini @@ -63,3 +63,5 @@ Ethernet480 237,238,239,240,241,242,243,244 Ethernet61/1 61 400000 rs Ethernet488 229,230,231,232,233,234,235,236 Ethernet62/1 62 400000 rs Ethernet496 249,250,251,252,253,254,255,256 Ethernet63/1 63 400000 rs Ethernet504 245,246,247,248,249,250,251,252 Ethernet64/1 64 400000 rs +Ethernet512 258 Ethernet65 65 10000 none +Ethernet513 257 Ethernet66 66 10000 none diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm index 12225a79ce74..1d5894498362 100644 --- a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm @@ -34,7 +34,7 @@ bcm_device: sai_field_group_auto_prioritize: 1 #l3_intf_vlan_split_egress for MTU at L3IF l3_intf_vlan_split_egress : 1 - + bcm_tunnel_term_compatible_mode: 1 --- device: 0: @@ -1073,6 +1073,14 @@ device: PORT_ID: 258 : PC_PHYS_PORT_ID: 253 + ? + PORT_ID: 152 + : + PC_PHYS_PORT_ID: 257 + ? + PORT_ID: 50 + : + PC_PHYS_PORT_ID: 258 ... --- device: @@ -1085,6 +1093,13 @@ device: ENABLE: 1 SPEED: 10000 NUM_LANES: 1 + ? + PORT_ID: [[50, 50], [152, 152]] + : + ENABLE: 1 + MAX_FRAME_SIZE: 9416 + SPEED: 10000 + NUM_LANES: 1 ? PORT_ID: [[1, 4], [17, 20], @@ -1103,7 +1118,7 @@ device: [238, 241], [255, 258]] : - ENABLE: 1 + ENABLE: 0 SPEED: 400000 NUM_LANES: 8 FEC_MODE: PC_FEC_RS544_2XN diff --git a/device/arista/x86_64-arista_7060dx5_64s/platform.json b/device/arista/x86_64-arista_7060dx5_64s/platform.json index 6442500a35d2..fa89a17687b5 100644 --- a/device/arista/x86_64-arista_7060dx5_64s/platform.json +++ b/device/arista/x86_64-arista_7060dx5_64s/platform.json @@ -49,52 +49,52 @@ ], "thermals": [ { - "name": "Cpu temp sensor" + "name": "Board sensor", + "controllable": false }, { - "name": "CPU board temp sensor" + "name": "TH4 exhaust temp sensor", + "controllable": false }, { - "name": "Back-panel temp sensor" + "name": "Inlet temp sensor", + "controllable": false }, { - "name": "Board sensor" + "name": "CPU board temp sensor", + "controllable": false }, { - "name": "Switch board middle sensor" + "name": "Back panel temp sensor", + "controllable": false }, { - "name": "Switch board left sensor" + "name": "Front panel temp sensor", + "controllable": false }, { - "name": "Front-panel temp sensor" + "name": "Power supply 1 hotspot sensor", + "controllable": false }, { - "name": "Switch chip diode 1 sensor" + "name": "Power supply 1 inlet temp sensor", + "controllable": false }, { - "name": "Switch chip diode 2 sensor" + "name": "Power supply 1 exhaust temp sensor", + "controllable": false }, { - "name": "Front-panel temp sensor" + "name": "Power supply 2 hotspot sensor", + "controllable": false }, { - "name": "Power supply 1 inlet temp sensor" + "name": "Power supply 2 inlet temp sensor", + "controllable": false }, { - "name": "Power supply 1 secondary hotspot sensor" - }, - { - "name": "Power supply 1 primary hotspot sensor" - }, - { - "name": "Power supply 2 inlet temp sensor" - }, - { - "name": "Power supply 2 secondary hotspot sensor" - }, - { - "name": "Power supply 2 primary hotspot sensor" + "name": "Power supply 2 exhaust temp sensor", + "controllable": false } ], "sfps": [ @@ -2154,6 +2154,24 @@ "Ethernet64/8" ] } + }, + "Ethernet512": { + "index": "65", + "lanes": "258", + "breakout_modes": { + "1x10G": [ + "Ethernet65" + ] + } + }, + "Ethernet513": { + "index": "66", + "lanes": "257", + "breakout_modes": { + "1x10G": [ + "Ethernet66" + ] + } } } } diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml index 5db2840cef95..b9fe12f1e471 100644 --- a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml @@ -4,12 +4,6 @@ 0 retimer 1 - - 2,-8,17,0,0 - 0,-8,17,0,0 - - 0,0,1,0,0 - @@ -26,4 +20,23 @@ + + + + + + + + + + + + + + + + + + + diff --git a/device/arista/x86_64-arista_7060px5_64s/sensors.conf b/device/arista/x86_64-arista_7060px5_64s/sensors.conf index e9f43494d6a9..835a10c3cc51 100644 --- a/device/arista/x86_64-arista_7060px5_64s/sensors.conf +++ b/device/arista/x86_64-arista_7060px5_64s/sensors.conf @@ -7,20 +7,15 @@ bus "i2c-23" "SCD 0000:01:00.0 SMBus master 1 bus 4" bus "i2c-24" "SCD 0000:01:00.0 SMBus master 1 bus 5" bus "i2c-107" "SCD 0000:00:18.7 SMBus master 0 bus 0" -chip "max6581-i2c-19-4d" +chip "tmp464-i2c-19-48" label temp1 "Board sensor" label temp2 "TH4 exhaust temp sensor" - label temp3 "Left edge PCB rear temp sensor" - label temp4 "Inlet temp sensor" - ignore temp5 - ignore temp6 - label temp7 "Diode temp sensor 1" - label temp8 "Diode temp sensor 2" + label temp3 "Inlet temp sensor" chip "dps800-i2c-22-58" label temp1 "Power supply 1 hotspot sensor" label temp2 "Power supply 1 inlet temp sensor" - label temp3 "Power supply 1 exhaust temp sensor" + ignore temp3 "Power supply 1 exhaust temp sensor" chip "dps800-i2c-23-58" label temp1 "Power supply 2 hotspot sensor" From 0bd8c3bf1161ba1f2299eae74c347ec1b68c432e Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:25:41 -0700 Subject: [PATCH 144/145] sudo not required explicitly as /bin/ip netns identify is part of READ_ONLY_CMDS in sudoers file (#16115) Why I did it Few commands in multiasic platforms when run with the "sudo ip netns exec asic0 " option was taking like 15 mins to get the o/p. This behavior of sudo getting hung was seen by just doing this jujoseph@svcstr-server-2:~ sudo ip netns exec asic0 bash jujoseph@svcstr-server-2:~ sudo ls deally sudo is not needed as we have /bin/ip netns identify present in /etc/sudoers file. Hence removing it --- src/sonic-py-common/sonic_py_common/multi_asic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-common/sonic_py_common/multi_asic.py b/src/sonic-py-common/sonic_py_common/multi_asic.py index 792f1557ce86..ead29ef9b91d 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -157,7 +157,7 @@ def get_current_namespace(pid=None): """ net_namespace = None - command = ["sudo", '/bin/ip', 'netns', 'identify', "{}".format(os.getpid() if not pid else pid)] + command = ['/bin/ip', 'netns', 'identify', "{}".format(os.getpid() if not pid else pid)] proc = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True, From a206f4361e8bc39adae8c16fc51ae8b3d480903d Mon Sep 17 00:00:00 2001 From: Renuka Manavalan Date: Sun, 20 Aug 2023 20:08:46 +0000 Subject: [PATCH 145/145] submod update --- src/sonic-device-health | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-device-health b/src/sonic-device-health index 222fd8ebd670..cf9423251b96 160000 --- a/src/sonic-device-health +++ b/src/sonic-device-health @@ -1 +1 @@ -Subproject commit 222fd8ebd6707e8cf0d9296fbcbc43590c8f0176 +Subproject commit cf9423251b96520494ae21e6935909af166ca856

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 z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ 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 A 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

9M1 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 z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1pbF2F#pGg9!gr;;ihK>cyBJMxN5f~=|xSar(~o`W=Tqw-u(t1`WW)H(U1BU;6Fxy z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u 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®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